미발행 본문
', 'en' => 'Unpublished body
'], + 'published' => false, + 'published_at' => null, + 'created_by' => $author->id, + 'updated_by' => $author->id, + ]); + + $published = Page::factory()->published()->create([ + 'slug' => self::PUBLISHED_SLUG, + 'title' => ['ko' => '발행 대조군', 'en' => 'Published Control'], + 'content' => ['ko' => '발행 본문
', 'en' => 'Published body
'], + 'created_by' => $author->id, + 'updated_by' => $author->id, + ]); + + $attachmentIds = []; + foreach ([$unpublished, $published] as $page) { + for ($i = 1; $i <= $attachmentsPerPage; $i++) { + // 첫 첨부는 이미지(미리보기 URL 생성 대상), 나머지는 일반 파일 + $factory = PageAttachment::factory(); + $factory = $i === 1 ? $factory->image() : $factory; + + $attachment = $factory->create([ + 'page_id' => $page->id, + 'order' => $i, + 'created_by' => $author->id, + ]); + $attachmentIds[] = $attachment->id; + } + } + + return [ + 'unpublished_slug' => self::UNPUBLISHED_SLUG, + 'published_slug' => self::PUBLISHED_SLUG, + 'unpublished_id' => $unpublished->id, + 'published_id' => $published->id, + 'attachment_ids' => $attachmentIds, + ]; + }); + + if ($this->option('json')) { + $this->line(json_encode($result, JSON_UNESCAPED_UNICODE)); + } else { + $this->info('페이지 시드 완료: 미발행='.self::UNPUBLISHED_SLUG.' / 발행='.self::PUBLISHED_SLUG); + } + + return self::SUCCESS; + } +} diff --git a/modules/_bundled/sirsoft-page/src/Http/Controllers/Admin/PageAttachmentController.php b/modules/_bundled/sirsoft-page/src/Http/Controllers/Admin/PageAttachmentController.php index ec7602d4..472a177d 100644 --- a/modules/_bundled/sirsoft-page/src/Http/Controllers/Admin/PageAttachmentController.php +++ b/modules/_bundled/sirsoft-page/src/Http/Controllers/Admin/PageAttachmentController.php @@ -3,17 +3,18 @@ namespace Modules\Sirsoft\Page\Http\Controllers\Admin; use App\Http\Controllers\Api\Base\AdminBaseController; +use Illuminate\Database\Eloquent\ModelNotFoundException; use Illuminate\Http\JsonResponse; use Modules\Sirsoft\Page\Http\Requests\ReorderPageAttachmentsRequest; use Modules\Sirsoft\Page\Http\Requests\UploadPageAttachmentRequest; use Modules\Sirsoft\Page\Http\Resources\PageAttachmentResource; use Modules\Sirsoft\Page\Services\PageAttachmentService; -use Symfony\Component\HttpFoundation\StreamedResponse; /** * 관리자 페이지 첨부파일 컨트롤러 * - * 페이지 첨부파일 업로드/삭제/다운로드/순서변경을 처리합니다. + * 페이지 첨부파일 업로드/삭제/순서변경을 처리합니다. + * 파일 서빙(다운로드/미리보기)은 공개 hash 라우트(PublicPageAttachmentController)로 단일화됨. */ class PageAttachmentController extends AdminBaseController { @@ -71,7 +72,7 @@ class PageAttachmentController extends AdminBaseController } return $this->success('sirsoft-page::messages.attachment.delete_success'); - } catch (\Illuminate\Database\Eloquent\ModelNotFoundException $e) { + } catch (ModelNotFoundException $e) { return $this->notFound('sirsoft-page::messages.attachment.not_found'); } catch (\Exception $e) { return $this->error('sirsoft-page::messages.attachment.delete_failed', 500, $e->getMessage()); @@ -99,40 +100,4 @@ class PageAttachmentController extends AdminBaseController return $this->error('sirsoft-page::messages.attachment.reorder_failed', 500, $e->getMessage()); } } - - /** - * 첨부파일을 다운로드합니다 (해시 기반). - * - * @param string $hash 첨부파일 해시 (12자) - * @return StreamedResponse|JsonResponse 파일 스트리밍 응답 또는 오류 - */ - public function download(string $hash): StreamedResponse|JsonResponse - { - $attachment = $this->attachmentService->getByHash($hash); - if (! $attachment) { - return $this->notFound('sirsoft-page::messages.attachment.not_found'); - } - - $response = $this->attachmentService->download($attachment); - - return $response ?: $this->error('sirsoft-page::messages.attachment.file_not_found', 404); - } - - /** - * 이미지 첨부파일을 미리봅니다 (해시 기반, inline). - * - * @param string $hash 첨부파일 해시 (12자) - * @return StreamedResponse|JsonResponse 파일 스트리밍 응답 또는 오류 - */ - public function preview(string $hash): StreamedResponse|JsonResponse - { - $attachment = $this->attachmentService->getByHash($hash); - if (! $attachment) { - return $this->notFound('sirsoft-page::messages.attachment.not_found'); - } - - $response = $this->attachmentService->preview($attachment); - - return $response ?: $this->error('sirsoft-page::messages.attachment.file_not_found', 404); - } } diff --git a/modules/_bundled/sirsoft-page/src/Http/Controllers/Admin/PageController.php b/modules/_bundled/sirsoft-page/src/Http/Controllers/Admin/PageController.php index ead898eb..27cfbb68 100644 --- a/modules/_bundled/sirsoft-page/src/Http/Controllers/Admin/PageController.php +++ b/modules/_bundled/sirsoft-page/src/Http/Controllers/Admin/PageController.php @@ -44,7 +44,7 @@ class PageController extends AdminBaseController { try { $validated = $request->validated(); - $perPage = $validated['per_page'] ?? 15; + $perPage = $validated['per_page'] ?? 20; $pages = $this->pageService->getPages( array_filter($validated, fn ($v) => $v !== null), $perPage @@ -212,9 +212,12 @@ class PageController extends AdminBaseController $validated = $request->validated(); $count = $this->pageService->bulkChangePublishStatus($validated['ids'], $validated['published']); - return $this->success('sirsoft-page::messages.page.bulk_publish_success', [ - 'count' => $count, - ]); + return $this->success( + 'sirsoft-page::messages.page.bulk_publish_success', + ['count' => $count], + 200, + ['count' => $count], + ); } catch (\Exception $e) { return $this->error('sirsoft-page::messages.page.bulk_publish_failed', 500, $e->getMessage()); } diff --git a/modules/_bundled/sirsoft-page/src/Http/Controllers/User/PublicPageAttachmentController.php b/modules/_bundled/sirsoft-page/src/Http/Controllers/User/PublicPageAttachmentController.php index 86bd6c47..15970557 100644 --- a/modules/_bundled/sirsoft-page/src/Http/Controllers/User/PublicPageAttachmentController.php +++ b/modules/_bundled/sirsoft-page/src/Http/Controllers/User/PublicPageAttachmentController.php @@ -2,15 +2,20 @@ namespace Modules\Sirsoft\Page\Http\Controllers\User; +use App\Enums\PermissionType; use App\Http\Controllers\Api\Base\PublicBaseController; use Illuminate\Http\JsonResponse; +use Illuminate\Http\Request; use Modules\Sirsoft\Page\Services\PageAttachmentService; use Symfony\Component\HttpFoundation\StreamedResponse; /** * 공개 페이지 첨부파일 컨트롤러 * - * 발행된 페이지의 첨부파일 다운로드를 처리합니다. + * 첨부파일 서빙(다운로드/미리보기)을 처리합니다. 썸네일>>4;if(!(b>>>8))a[y++]=b;else{if(b==256)break;var U=y+b-254;if(b>264){var F=p.ldef[b-257];U=y+(F>>>3)+h(o,N,7&F),N+=7&F}var G=x[f(o,N)&C];N+=15&G;var Y=G>>>4,B=p.ddef[Y],V=(B>>>4)+g(o,N,15&B);for(N+=15&B,m&&(a=n.F._check(a,y+131072));y>>3),H=o[j-4]|o[j-3]<<8;m&&(a=n.F._check(a,y+H)),a.set(new s(o.buffer,o.byteOffset+j,H),y),N=j+H<<3,y+=H}return a.length==y?a:a.slice(0,y)},n.F._check=function(o,a){var s=o.length;if(a<=s)return o;var l=new Uint8Array(Math.max(s<<1,a));return l.set(o,0),l},n.F._decodeTiny=function(o,a,s,l,g,h){for(var c=n.F._bitsE,i=n.F._get17,u=0;u >>1);for(;E >2);let U;if(N.length<2e7)for(var F=0;F >>4;if(!(b>>>8))a[y++]=b;else{if(b==256)break;var z=y+b-254;if(b>264){var U=p.ldef[b-257];z=y+(U>>>3)+h(o,N,7&U),N+=7&U}var G=x[g(o,N)&k];N+=15&G;var Y=G>>>4,B=p.ddef[Y],V=(B>>>4)+f(o,N,15&B);for(N+=15&B,m&&(a=n.F._check(a,y+131072));y >>1);for(;T >2);let z;if(N.length<2e7)for(var U=0;U>>4;if(p<=15)h[u]=p,u++;else{var m=0,w=0;p==16?(w=3+c(l,g,2),g+=2,m=h[u-1]):p==17?(w=3+c(l,g,3),g+=3):p==18&&(w=11+c(l,g,7),g+=7);for(var x=u+w;ug&&(g=i),h++}for(;h>>3]|o[1+(a>>>3)]<<8|o[2+(a>>>3)]<<16)>>>(7&a)&(1<>>3]|o[1+(a>>>3)]<<8|o[2+(a>>>3)]<<16)>>>(7&a)},n.F._get25=function(o,a){return(o[a>>>3]|o[1+(a>>>3)]<<8|o[2+(a>>>3)]<<16|o[3+(a>>>3)]<<24)>>>(7&a)},n.F.U=(t=Uint16Array,r=Uint32Array,{next_code:new t(16),bl_count:new t(16),ordr:[16,17,18,0,8,7,9,6,10,5,11,4,12,3,13,2,14,1,15],of0:[3,4,5,6,7,8,9,10,11,13,15,17,19,23,27,31,35,43,51,59,67,83,99,115,131,163,195,227,258,999,999,999],exb:[0,0,0,0,0,0,0,0,1,1,1,1,2,2,2,2,3,3,3,3,4,4,4,4,5,5,5,5,0,0,0,0],ldef:new t(32),df0:[1,2,3,4,5,7,9,13,17,25,33,49,65,97,129,193,257,385,513,769,1025,1537,2049,3073,4097,6145,8193,12289,16385,24577,65535,65535],dxb:[0,0,0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7,8,8,9,9,10,10,11,11,12,12,13,13,0,0],ddef:new r(32),flmap:new t(512),fltree:[],fdmap:new t(32),fdtree:[],lmap:new t(32768),ltree:[],ttree:[],dmap:new t(32768),dtree:[],imap:new t(512),itree:[],rev15:new t(32768),lhst:new r(286),dhst:new r(30),ihst:new r(19),lits:new r(15e3),strt:new t(65536),prev:new t(32768)}),(function(){for(var o=n.F.U,a=0;a<32768;a++){var s=a;s=(4278255360&(s=(4042322160&(s=(3435973836&(s=(2863311530&s)>>>1|(1431655765&s)<<1))>>>2|(858993459&s)<<2))>>>4|(252645135&s)<<4))>>>8|(16711935&s)<<8,o.rev15[a]=(s>>>16|s<<16)>>>17}function l(g,h,c){for(;h--!=0;)g.push(0,c)}for(a=0;a<32;a++)o.ldef[a]=o.of0[a]<<3|o.exb[a],o.ddef[a]=o.df0[a]<<4|o.dxb[a];l(o.fltree,144,8),l(o.fltree,112,9),l(o.fltree,24,7),l(o.fltree,8,8),n.F.makeCodes(o.fltree,9),n.F.codes2map(o.fltree,9,o.flmap),n.F.revCodes(o.fltree,9),l(o.fdtree,32,5),n.F.makeCodes(o.fdtree,5),n.F.codes2map(o.fdtree,5,o.fdmap),n.F.revCodes(o.fdtree,5),l(o.itree,19,0),l(o.ltree,286,0),l(o.dtree,30,0),l(o.ttree,320,0)})()})();var eg=Qf({__proto__:null,default:On},[On]);const Ht=(function(){var e={nextZero(c,i){for(;c[i]!=0;)i++;return i},readUshort:(c,i)=>c[i]<<8|c[i+1],writeUshort(c,i,u){c[i]=u>>8&255,c[i+1]=255&u},readUint:(c,i)=>16777216*c[i]+(c[i+1]<<16|c[i+2]<<8|c[i+3]),writeUint(c,i,u){c[i]=u>>24&255,c[i+1]=u>>16&255,c[i+2]=u>>8&255,c[i+3]=255&u},readASCII(c,i,u){let f="";for(let p=0;pc.length<2?`0${c}`:c,readUTF8(c,i,u){let f,p="";for(let m=0;m>3)]>>7-((7&_)<<0)&1);x[y]=F[D],x[y+1]=F[D+1],x[y+2]=F[D+2],x[y+3]=L>2]=U.ind,P[F>>2]=U.est.rgba;else for(F=0;F>2]=U.ind,P[F>>2]=U.est.rgba}return{abuf:M.buffer,inds:b,plte:$}}function w(C,y,N){N==null&&(N=1e-4);const M=new Uint32Array(C.buffer),P={i0:0,i1:C.length,bst:null,est:null,tdst:0,left:null,right:null};P.bst=O(C,P.i0,P.i1),P.est=_(P.bst);const D=[P];for(;D.lengthr(o),n.readAsArrayBuffer(e)}))}function Vl(e,t){const{width:r}=e,{height:n}=e,{maxWidthOrHeight:o}=t;let a,s=e;return isFinite(o)&&(r>o||n>o)&&([s,a]=Dn(r,n),r>n?(s.width=o,s.height=n/r*o):(s.width=r/n*o,s.height=o),a.drawImage(e,0,0,s.width,s.height),Vt(e)),s}function Yl(e,t){const{width:r}=e,{height:n}=e,[o,a]=Dn(r,n);switch(t>4&&t<9?(o.width=n,o.height=r):(o.width=r,o.height=n),t){case 2:a.transform(-1,0,0,1,r,0);break;case 3:a.transform(-1,0,0,-1,r,n);break;case 4:a.transform(1,0,0,-1,0,n);break;case 5:a.transform(0,1,1,0,0,0);break;case 6:a.transform(0,1,-1,0,n,0);break;case 7:a.transform(0,-1,-1,0,n,r);break;case 8:a.transform(0,-1,1,0,0,r)}return a.drawImage(e,0,0,r,n),Vt(e),o}function Xl(e,t,r=0){return new Promise((function(n,o){let a,s,l,g,h,c,i,u,f,p,m,w,x,A,v,E,O,_,I,C;function y(M=5){if(t.signal&&t.signal.aborted)throw t.signal.reason;a+=M,t.onProgress(Math.min(a,100))}function N(M){if(t.signal&&t.signal.aborted)throw t.signal.reason;a=Math.min(Math.max(M,a),100),t.onProgress(a)}return a=r,s=t.maxIteration||10,l=1024*t.maxSizeMB*1024,y(),Pn(e,t).then(function(M){try{return[,g]=M,y(),h=Vl(g,t),y(),new Promise((function(P,D){var L;if(!(L=t.exifOrientation))return Kl(e).then(function(S){try{return L=S,$.call(this)}catch(b){return D(b)}}.bind(this),D);function $(){return P(L)}return $.call(this)})).then(function(P){try{return c=P,y(),Nr().then(function(D){try{return i=D?h:Yl(h,c),y(),u=t.initialQuality||1,f=t.fileType||e.type,Fn(i,f,e.name,e.lastModified,u).then(function(L){try{{let S=function(){if(s--&&(v>l||v>x)){let U,F;return U=C?.95*I.width:I.width,F=C?.95*I.height:I.height,[O,_]=Dn(U,F),_.drawImage(I,0,0,U,F),u*=f==="image/png"?.85:.95,Fn(O,f,e.name,e.lastModified,u).then((function(G){try{return E=G,Vt(I),I=O,v=E.size,N(Math.min(99,Math.floor((A-v)/(A-l)*100))),S}catch(Y){return o(Y)}}),o)}return[1]},b=function(){return Vt(I),Vt(O),Vt(h),Vt(i),Vt(g),N(100),n(E)};if(p=L,y(),m=p.size>l,w=p.size>e.size,!m&&!w)return N(100),n(p);var $;return x=e.size,A=p.size,v=A,I=i,C=!t.alwaysKeepResolution&&m,($=function(U){for(;U;){if(U.then)return void U.then($,o);try{if(U.pop){if(U.length)return U.pop()?b.call(this):U;U=S}else U=U.call(this)}catch(F){return o(F)}}}.bind(this))(S)}}catch(S){return o(S)}}.bind(this),o)}catch(L){return o(L)}}.bind(this),o)}catch(D){return o(D)}}.bind(this),o)}catch(P){return o(P)}}.bind(this),o)}))}const ng=`
+ `.trim().replace(/\s+/g," ");return d.jsx(W,{id:a,className:c,dangerouslySetInnerHTML:{__html:h},...s})},fg=Object.freeze(Object.defineProperty({__proto__:null,HtmlContent:Zo},Symbol.toStringTag,{value:"Module"})),qo=()=>window.G7Core,Qo=(e,t)=>qo()?.t?.(e,t)??e,Wl=({content:e="",onChange:t,isHtml:r=!1,onIsHtmlChange:n,rows:o=15,placeholder:a="",label:s,showHtmlModeToggle:l=!0,contentClassName:f="",purifyConfig:h,className:c="",name:i="content",htmlFieldName:u="content_mode",readOnly:g=!1,id:p,editorAttrs:m})=>{const[v,x]=C.useState(r),[M,w]=C.useState(e),[T,A]=C.useState(!1);C.useEffect(()=>{x(r)},[r]),C.useEffect(()=>{w(e)},[e]);const _=C.useCallback(y=>{const N=y.target.value;if(w(N),t){const D=qo()?.createChangeEvent?.({value:N,name:i,type:"textarea"})??{target:{name:i,value:N}};t(D)}},[t,i]),I=C.useCallback(y=>{const N=y.target.checked;if(x(N),N||A(!1),n){const D=qo()?.createChangeEvent?.({checked:N,name:u,type:"checkbox"})??{target:{name:u,checked:N}};n(D)}},[n,u]),k=C.useCallback(()=>{A(y=>!y)},[]);return d.jsxs(W,{className:`space-y-2 ${c}`,id:p,...m,children:[d.jsxs(W,{className:"flex items-center justify-between",children:[s&&d.jsx(vr,{className:"block text-sm font-medium text-gray-500 dark:text-gray-400",children:s}),d.jsxs(W,{className:"flex items-center gap-3",children:[v&&!g&&d.jsx(Q,{type:"button",onClick:k,className:`px-3 py-1.5 text-xs font-bold rounded-lg focus:outline-none focus:ring-2 ${T?"text-gray-700 dark:text-gray-200 bg-gray-200 dark:bg-gray-600 border border-gray-300 dark:border-gray-500 hover:bg-gray-300 dark:hover:bg-gray-500 focus:ring-gray-400 dark:focus:ring-gray-500":"text-blue-600 dark:text-blue-400 bg-white dark:bg-gray-700 border border-blue-300 dark:border-blue-600 hover:bg-blue-50 dark:hover:bg-gray-600 focus:ring-blue-500 dark:focus:ring-blue-600"}`,children:Qo(T?"common.preview_off":"common.preview")}),l&&d.jsxs(vr,{className:"flex items-center gap-2 p-2 cursor-pointer",children:[d.jsx(_t,{type:"checkbox",name:u,checked:v,onChange:I,disabled:g,className:"w-4 h-4 text-blue-600 bg-gray-100 border-gray-300 rounded focus:ring-blue-500 dark:focus:ring-blue-600 dark:ring-offset-gray-800 focus:ring-2 dark:bg-gray-700 dark:border-gray-600"}),d.jsx(W,{className:"text-sm font-medium text-gray-700 dark:text-gray-300",children:Qo("common.html_mode")})]})]})]}),!T&&d.jsx(lo,{name:i,value:M,onChange:_,placeholder:a,rows:o,readOnly:g,className:`block w-full rounded-lg border px-3 py-2 text-sm placeholder-gray-400 dark:placeholder-gray-500 focus:outline-none focus:ring-1 disabled:opacity-50 disabled:cursor-not-allowed ${v?"font-mono bg-white dark:bg-gray-800 border-blue-300 dark:border-blue-600 text-gray-800 dark:text-gray-200 focus:border-blue-500 focus:ring-blue-500":"bg-white dark:bg-gray-800 border-gray-300 dark:border-gray-600 text-gray-900 dark:text-white focus:border-blue-500 focus:ring-blue-500"}`}),T&&d.jsx(W,{className:"p-4 bg-gray-50 dark:bg-gray-900 rounded-lg border border-gray-200 dark:border-gray-800 min-h-[400px]",children:d.jsx(Zo,{content:M,isHtml:!0,className:f||"prose dark:prose-invert max-w-none text-gray-900 dark:text-gray-100",purifyConfig:h})})]})},gg=Object.freeze(Object.defineProperty({__proto__:null,HtmlEditor:Wl},Symbol.toStringTag,{value:"Module"})),Kl=e=>window.G7Core?.t?.(e)??e,Jo=({maxHeight:e=500,expandText:t,collapseText:r,className:n="",children:o,id:a,editorAttrs:s})=>{const[l,f]=C.useState(!1),[h,c]=C.useState(!1),i=C.useRef(null),u=C.useCallback(()=>{if(i.current){const v=i.current.scrollHeight;c(v>e)}},[e]);C.useEffect(()=>{u();const v=i.current;if(!v)return;const x=v.querySelectorAll("img");x.forEach(w=>{w.complete||w.addEventListener("load",u)});let M=null;return typeof ResizeObserver<"u"&&(M=new ResizeObserver(u),M.observe(v)),()=>{x.forEach(w=>{w.removeEventListener("load",u)}),M?.disconnect()}},[u,o]);const g=()=>{f(v=>!v)},p=t||Kl("sirsoft-ecommerce.shop.product.expand_detail"),m=r||Kl("sirsoft-ecommerce.shop.product.collapse_detail");return d.jsxs(W,{className:n,id:a,...s,children:[d.jsxs(W,{className:"relative",children:[d.jsx(W,{ref:i,className:!l&&h?"overflow-hidden transition-[max-height] duration-300 ease-in-out":"transition-[max-height] duration-300 ease-in-out",style:!l&&h?{maxHeight:`${e}px`}:void 0,children:o}),!l&&h&&d.jsx(W,{className:"absolute bottom-0 left-0 right-0 h-24 bg-gradient-to-t from-white dark:from-gray-900 to-transparent pointer-events-none"})]}),h&&d.jsxs(Q,{type:"button",onClick:g,className:"flex items-center justify-center w-full py-3.5 bg-white dark:bg-gray-900 border border-gray-200 dark:border-gray-700 hover:bg-gray-50 dark:hover:bg-gray-800 transition-colors cursor-pointer gap-1.5",children:[d.jsx(re,{className:"text-sm font-semibold text-gray-600 dark:text-gray-400",children:l?m:p}),d.jsx(fe,{name:l?"chevron-up":"chevron-down",size:"sm"})]})]})},hg=Object.freeze(Object.defineProperty({__proto__:null,ExpandableContent:Jo,default:Jo},Symbol.toStringTag,{value:"Module"})),pg=(e,t)=>window.G7Core?.t?.(e,t)??e,Ro=({isOpen:e,onClose:t,title:r,icon:n,iconClassName:o="text-gray-500 dark:text-gray-400",closeOnBackdropClick:a=!0,closeOnOverlayClick:s,showCloseButton:l=!0,closeOnEscape:f=!0,children:h,width:c="500px",className:i="",style:u})=>{const g=s!==void 0?s:a,p=C.useRef(null),m=C.useRef(null);if(C.useEffect(()=>{const x=M=>{M.key==="Escape"&&e&&f&&t()};if(e&&f)return document.addEventListener("keydown",x),()=>document.removeEventListener("keydown",x)},[e,t,f]),C.useEffect(()=>{if(e&&p.current){m.current=document.activeElement;const x=p.current.querySelectorAll('button, [href], input, select, textarea, [tabindex]:not([tabindex="-1"])'),M=x[0],w=x[x.length-1];M?.focus();const T=A=>{A.key==="Tab"&&(A.shiftKey?document.activeElement===M&&(A.preventDefault(),w?.focus()):document.activeElement===w&&(A.preventDefault(),M?.focus()))};return document.addEventListener("keydown",T),()=>{document.removeEventListener("keydown",T),m.current?.focus()}}},[e]),C.useEffect(()=>{if(e)return document.body.style.overflow="hidden",()=>{document.body.style.overflow=""}},[e]),!e)return null;const v=u?.zIndex??50;return d.jsxs(W,{className:"fixed inset-0 flex items-center justify-center",style:{zIndex:v},onClick:g?t:void 0,children:[d.jsx(W,{className:"absolute inset-0 bg-black/50","aria-hidden":"true"}),d.jsxs(W,{ref:p,className:`relative bg-white dark:bg-gray-800 rounded-lg shadow-xl max-h-[90vh] overflow-hidden ${i}`,style:{width:c,...u?{...u,zIndex:void 0}:{}},onClick:x=>x.stopPropagation(),role:"dialog","aria-modal":"true","aria-labelledby":r?"modal-title":void 0,children:[(r||n||l)&&d.jsxs(W,{className:"flex items-center justify-between p-4",children:[(r||n)&&d.jsxs(W,{id:"modal-title",className:"flex items-center gap-3 text-lg font-semibold text-gray-900 dark:text-white",children:[n&&d.jsx(fe,{name:n,size:"md",className:o}),r]}),l&&d.jsx(Q,{onClick:t,className:"ml-auto text-gray-400 dark:text-gray-500 hover:text-gray-600 dark:hover:text-gray-300 focus:outline-none","aria-label":pg("common.close_modal"),children:d.jsx("svg",{className:"w-6 h-6",fill:"none",stroke:"currentColor",viewBox:"0 0 24 24",children:d.jsx("path",{strokeLinecap:"round",strokeLinejoin:"round",strokeWidth:2,d:"M6 18L18 6M6 6l12 12"})})})]}),d.jsx(W,{className:"px-6 py-4 overflow-y-auto max-h-[calc(90vh-140px)]",children:h})]})]})},mg=Object.freeze(Object.defineProperty({__proto__:null,Modal:Ro},Symbol.toStringTag,{value:"Module"})),ea=(e,t)=>window.G7Core?.t?.(e,t)??e,ta=({isOpen:e,onClose:t,title:r,message:n,confirmText:o,cancelText:a,onConfirm:s,onCancel:l,confirmButtonVariant:f="primary",cancelButtonVariant:h="secondary",width:c="500px",closeOnOverlay:i=!0,isLoading:u=!1,loadingText:g})=>{const p=o??ea("common.confirm"),m=a??ea("common.cancel"),v=g??ea("common.loading"),x=()=>{s()},M=()=>{u||(l?.(),t())},w=()=>{u||t()},T={primary:"bg-blue-600 text-white hover:bg-blue-700",secondary:"bg-gray-200 dark:bg-gray-700 text-gray-800 dark:text-gray-200 hover:bg-gray-300 dark:hover:bg-gray-600",danger:"bg-red-600 text-white hover:bg-red-700",ghost:"bg-transparent text-gray-700 dark:text-gray-300 hover:bg-gray-100 dark:hover:bg-gray-700"};return d.jsxs(Ro,{isOpen:e,onClose:w,title:r,width:c,children:[d.jsx(W,{className:"py-2",children:typeof n=="string"?d.jsx(zt,{className:"text-gray-700 dark:text-gray-300",children:n}):n}),d.jsxs(W,{className:"flex justify-end gap-3 mt-6",children:[d.jsx(Q,{onClick:M,disabled:u,className:"px-4 py-2 bg-white dark:bg-gray-800 text-gray-700 dark:text-gray-300 border border-gray-300 dark:border-gray-600 rounded-lg hover:bg-gray-50 dark:hover:bg-gray-700 disabled:opacity-50 disabled:cursor-not-allowed",children:d.jsx(re,{children:m})}),d.jsxs(Q,{onClick:x,disabled:u,className:`flex items-center gap-2 px-4 py-2 rounded-lg disabled:opacity-50 disabled:cursor-not-allowed ${T[f]}`,children:[u&&d.jsx(Nt,{className:"fa-solid fa-spinner w-4 h-4 animate-spin"}),d.jsx(re,{children:u?v:p})]})]})]})},bg=Object.freeze(Object.defineProperty({__proto__:null,ConfirmDialog:ta},Symbol.toStringTag,{value:"Module"})),Vl=C.createContext(null),Yl=({value:e,children:t})=>d.jsx(Vl.Provider,{value:e,children:t}),yg=()=>{const e=C.useContext(Vl);if(!e)throw new Error("useFileUploaderContext must be used within FileUploaderProvider");return e};function vg(e,t){return t.forEach((function(r){r&&typeof r!="string"&&!Array.isArray(r)&&Object.keys(r).forEach((function(n){if(n!=="default"&&!(n in e)){var o=Object.getOwnPropertyDescriptor(r,n);Object.defineProperty(e,n,o.get?o:{enumerable:!0,get:function(){return r[n]}})}}))})),Object.freeze(e)}function Xl(e,t){return new Promise((function(r,n){let o;return wg(e).then((function(a){try{return o=a,r(new Blob([t.slice(0,2),o,t.slice(2)],{type:"image/jpeg"}))}catch(s){return n(s)}}),n)}))}const wg=e=>new Promise(((t,r)=>{const n=new FileReader;n.addEventListener("load",(({target:{result:o}})=>{const a=new DataView(o);let s=0;if(a.getUint16(s)!==65496)return r("not a valid JPEG");for(s+=2;;){const l=a.getUint16(s);if(l===65498)break;const f=a.getUint16(s+2);if(l===65505&&a.getUint32(s+4)===1165519206){const h=s+10;let c;switch(a.getUint16(h)){case 18761:c=!0;break;case 19789:c=!1;break;default:return r("TIFF header contains invalid endian")}if(a.getUint16(h+2,c)!==42)return r("TIFF header contains invalid version");const i=a.getUint32(h+4,c),u=h+i+2+12*a.getUint16(h+i,c);for(let g=h+i+2;g>>24&255,l[s+1]=f>>>16&255,l[s+2]=f>>>8&255,l[s+3]=f>>>0&255,new Uint8Array(l.buffer,0,s+4)},n.deflateRaw=function(o,a){a==null&&(a={level:6});var s=new Uint8Array(50+Math.floor(1.1*o.length)),l=n.F.deflateRaw(o,s,l,a.level);return new Uint8Array(s.buffer,0,l)},n.encode=function(o,a){a==null&&(a=!1);var s=0,l=n.bin.writeUint,f=n.bin.writeUshort,h={};for(var c in o){var i=!n._noNeed(c)&&!a,u=o[c],g=n.crc.crc(u,0,u.length);h[c]={cpr:i,usize:u.length,crc:g,file:i?n.deflateRaw(u):u}}for(var c in h)s+=h[c].file.length+30+46+2*n.bin.sizeUTF8(c);s+=22;var p=new Uint8Array(s),m=0,v=[];for(var c in h){var x=h[c];v.push(m),m=n._writeHeader(p,m,c,x,0)}var M=0,w=m;for(var c in h)x=h[c],v.push(m),m=n._writeHeader(p,m,c,x,1,v[M++]);var T=m-w;return l(p,m,101010256),m+=4,f(p,m+=4,M),f(p,m+=2,M),l(p,m+=2,T),l(p,m+=4,w),m+=4,m+=2,p.buffer},n._noNeed=function(o){var a=o.split(".").pop().toLowerCase();return"png,jpg,jpeg,zip".indexOf(a)!=-1},n._writeHeader=function(o,a,s,l,f,h){var c=n.bin.writeUint,i=n.bin.writeUshort,u=l.file;return c(o,a,f==0?67324752:33639248),a+=4,f==1&&(a+=2),i(o,a,20),i(o,a+=2,0),i(o,a+=2,l.cpr?8:0),c(o,a+=2,0),c(o,a+=4,l.crc),c(o,a+=4,u.length),c(o,a+=4,l.usize),i(o,a+=4,n.bin.sizeUTF8(s)),i(o,a+=2,0),a+=2,f==1&&(a+=2,a+=2,c(o,a+=6,h),a+=4),a+=n.bin.writeUTF8(o,a,s),f==0&&(o.set(u,a),a+=u.length),a},n.crc={table:(function(){for(var o=new Uint32Array(256),a=0;a<256;a++){for(var s=a,l=0;l<8;l++)1&s?s=3988292384^s>>>1:s>>>=1;o[a]=s}return o})(),update:function(o,a,s,l){for(var f=0;f>6,o[a+f+1]=128|c>>0&63,f+=2;else if((4294901760&c)==0)o[a+f]=224|c>>12,o[a+f+1]=128|c>>6&63,o[a+f+2]=128|c>>0&63,f+=3;else{if((4292870144&c)!=0)throw"e";o[a+f]=240|c>>18,o[a+f+1]=128|c>>12&63,o[a+f+2]=128|c>>6&63,o[a+f+3]=128|c>>0&63,f+=4}}return f},sizeUTF8:function(o){for(var a=o.length,s=0,l=0;l>>3}var v=h.lits,x=h.strt,M=h.prev,w=0,T=0,A=0,_=0,I=0,k=0;for(m>2&&(x[k=n.F._hash(o,0)]=0),u=0;u>>1,138))<11?a.push(17,g-3):a.push(18,g-11),l+=2*g-2}else if(f==i&&h==f&&c==f){for(u=l+5;u+2>>1,6);a.push(16,g-3),l+=2*g-2}else a.push(f,0)}return s>>>1},n.F._hufTree=function(o,a,s){var l=[],f=o.length,h=a.length,c=0;for(c=0;c>>4;if(p<=15)h[u]=p,u++;else{var m=0,v=0;p==16?(v=3+c(l,f,2),f+=2,m=h[u-1]):p==17?(v=3+c(l,f,3),f+=3):p==18&&(v=11+c(l,f,7),f+=7);for(var x=u+v;uf&&(f=i),h++}for(;h>>3]|o[1+(a>>>3)]<<8|o[2+(a>>>3)]<<16)>>>(7&a)&(1<>>3]|o[1+(a>>>3)]<<8|o[2+(a>>>3)]<<16)>>>(7&a)},n.F._get25=function(o,a){return(o[a>>>3]|o[1+(a>>>3)]<<8|o[2+(a>>>3)]<<16|o[3+(a>>>3)]<<24)>>>(7&a)},n.F.U=(t=Uint16Array,r=Uint32Array,{next_code:new t(16),bl_count:new t(16),ordr:[16,17,18,0,8,7,9,6,10,5,11,4,12,3,13,2,14,1,15],of0:[3,4,5,6,7,8,9,10,11,13,15,17,19,23,27,31,35,43,51,59,67,83,99,115,131,163,195,227,258,999,999,999],exb:[0,0,0,0,0,0,0,0,1,1,1,1,2,2,2,2,3,3,3,3,4,4,4,4,5,5,5,5,0,0,0,0],ldef:new t(32),df0:[1,2,3,4,5,7,9,13,17,25,33,49,65,97,129,193,257,385,513,769,1025,1537,2049,3073,4097,6145,8193,12289,16385,24577,65535,65535],dxb:[0,0,0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7,8,8,9,9,10,10,11,11,12,12,13,13,0,0],ddef:new r(32),flmap:new t(512),fltree:[],fdmap:new t(32),fdtree:[],lmap:new t(32768),ltree:[],ttree:[],dmap:new t(32768),dtree:[],imap:new t(512),itree:[],rev15:new t(32768),lhst:new r(286),dhst:new r(30),ihst:new r(19),lits:new r(15e3),strt:new t(65536),prev:new t(32768)}),(function(){for(var o=n.F.U,a=0;a<32768;a++){var s=a;s=(4278255360&(s=(4042322160&(s=(3435973836&(s=(2863311530&s)>>>1|(1431655765&s)<<1))>>>2|(858993459&s)<<2))>>>4|(252645135&s)<<4))>>>8|(16711935&s)<<8,o.rev15[a]=(s>>>16|s<<16)>>>17}function l(f,h,c){for(;h--!=0;)f.push(0,c)}for(a=0;a<32;a++)o.ldef[a]=o.of0[a]<<3|o.exb[a],o.ddef[a]=o.df0[a]<<4|o.dxb[a];l(o.fltree,144,8),l(o.fltree,112,9),l(o.fltree,24,7),l(o.fltree,8,8),n.F.makeCodes(o.fltree,9),n.F.codes2map(o.fltree,9,o.flmap),n.F.revCodes(o.fltree,9),l(o.fdtree,32,5),n.F.makeCodes(o.fdtree,5),n.F.codes2map(o.fdtree,5,o.fdmap),n.F.revCodes(o.fdtree,5),l(o.itree,19,0),l(o.ltree,286,0),l(o.dtree,30,0),l(o.ttree,320,0)})()})();var kg=vg({__proto__:null,default:Ln},[Ln]);const Kt=(function(){var e={nextZero(c,i){for(;c[i]!=0;)i++;return i},readUshort:(c,i)=>c[i]<<8|c[i+1],writeUshort(c,i,u){c[i]=u>>8&255,c[i+1]=255&u},readUint:(c,i)=>16777216*c[i]+(c[i+1]<<16|c[i+2]<<8|c[i+3]),writeUint(c,i,u){c[i]=u>>24&255,c[i+1]=u>>16&255,c[i+2]=u>>8&255,c[i+3]=255&u},readASCII(c,i,u){let g="";for(let p=0;pc.length<2?`0${c}`:c,readUTF8(c,i,u){let g,p="";for(let m=0;m>3)]>>7-((7&_)<<0)&1);x[y]=U[O],x[y+1]=U[O+1],x[y+2]=U[O+2],x[y+3]=L>2]=z.ind,P[U>>2]=z.est.rgba;else for(U=0;U>2]=z.ind,P[U>>2]=z.est.rgba}return{abuf:D.buffer,inds:b,plte:$}}function v(k,y,N){N==null&&(N=1e-4);const D=new Uint32Array(k.buffer),P={i0:0,i1:k.length,bst:null,est:null,tdst:0,left:null,right:null};P.bst=A(k,P.i0,P.i1),P.est=_(P.bst);const O=[P];for(;O.length