@templatical/editor 0.27.6 → 0.28.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/{AiChatSidebar-jbpwD_4k.js → AiChatSidebar-mZyf81xG.js} +14 -14
- package/dist/{AiFeatureMenu-BeZR46ZG.js → AiFeatureMenu-wpL2vbbd.js} +7 -7
- package/dist/{BlockIssueBadge-B8wQY1tM.js → BlockIssueBadge-CavnyR3o.js} +5 -5
- package/dist/{BlockPreviewCanvas-CIjts7SP.js → BlockPreviewCanvas-CeNJqtJ6.js} +3 -3
- package/dist/{CloudHeaderExtras-mMqnnTi1.js → CloudHeaderExtras-fH0cB-Ru.js} +5 -5
- package/dist/{CloudPanels-fiTneIeJ.js → CloudPanels-Davlnzfd.js} +7 -7
- package/dist/{CollaboratorBar-C48K85la.js → CollaboratorBar-BvQZriPA.js} +4 -4
- package/dist/{ColorPicker-Bc1lGovM.js → ColorPicker-OLSFZBBZ.js} +7 -7
- package/dist/{CommentsPanel-D5Ljv1oj.js → CommentsPanel-B4_63eIS.js} +2 -2
- package/dist/{CommentsSidebar-C5mDJVjC.js → CommentsSidebar-BkBHMXez.js} +14 -14
- package/dist/{CountdownBlock-qKtJVRIV.js → CountdownBlock-Drr1WErd.js} +3 -3
- package/dist/{CountdownToolbar-B-9EdQvm.js → CountdownToolbar-D8FsDIfa.js} +4 -4
- package/dist/{DesignReferenceSidebar-DOy4ENYv.js → DesignReferenceSidebar-Dp44REBY.js} +11 -11
- package/dist/{IssuesPanel-DZUehVZS.js → IssuesPanel-C1v3dmoB.js} +8 -8
- package/dist/{LoadingTrack-C2T8ixEL.js → LoadingTrack-Db9j_aBr.js} +1 -1
- package/dist/{MergeTagModeToggle-Fn9Q1SrJ.js → MergeTagModeToggle-CZN0Pr1o.js} +5 -5
- package/dist/{MergeTagSuggestion-DflUPfkT.js → MergeTagSuggestion-a7Tk8tBB.js} +2 -2
- package/dist/{NumberWithSuffix-DZAktKby.js → NumberWithSuffix-C1D0WFrN.js} +1 -1
- package/dist/{ParagraphEditor-BwTQoxxF.js → ParagraphEditor-CGxsm0Mx.js} +15 -15
- package/dist/{RestoreVersionDialog-CVuUY3CK.js → RestoreVersionDialog-BLW8wC1J.js} +5 -5
- package/dist/{RichTextEditorContent-CoXoAfZ1.js → RichTextEditorContent-COBy_Q9j.js} +8 -8
- package/dist/{SaveBlockDialog-Bn5JtRSE.js → SaveBlockDialog-DPDQTGTB.js} +10 -10
- package/dist/{SavedBlocksBrowserModal-WWGhUC8R.js → SavedBlocksBrowserModal-D8a-wIRe.js} +11 -11
- package/dist/{SavedBlocksPanels-R_4C58EN.js → SavedBlocksPanels-CmnGyJHO.js} +2 -2
- package/dist/{SavedBlocksPickBar-D5KZVvvu.js → SavedBlocksPickBar-Z-YRd488.js} +4 -4
- package/dist/{TemplateScoringPanel-Cz25F9Cf.js → TemplateScoringPanel-5zp1qOSl.js} +15 -15
- package/dist/{TestEmailModal-C_C228mX.js → TestEmailModal-C69UbsNy.js} +10 -10
- package/dist/{TestEmailPanel-D7YOLrOb.js → TestEmailPanel-CH2dG-8A.js} +2 -2
- package/dist/{TitleEditor-XOQQlb1V.js → TitleEditor-BfWPus_C.js} +10 -10
- package/dist/{TplModal-DLXIufsn.js → TplModal-DBlMd7h9.js} +5 -5
- package/dist/{VersionHistoryMenu-Bk5zEClP.js → VersionHistoryMenu-Cg4UKxKc.js} +8 -8
- package/dist/{VersionHistoryPanels-D-km60IA.js → VersionHistoryPanels-BKjbNEOM.js} +2 -2
- package/dist/{VersionPreviewBanner-PMaxy3tA.js → VersionPreviewBanner-B0thyJ8F.js} +3 -3
- package/dist/{blockTypeIcons-BG5c5gc8.js → blockTypeIcons-CQMkcHo9.js} +2 -2
- package/dist/bundle-stats.json +6 -6
- package/dist/{ca-CEuJ6IRr.js → ca-DY0AYOLG.js} +6 -0
- package/dist/cdn/chunks/{AiChatSidebar-hq9GgASn.js → AiChatSidebar-BQATQ3Tr.js} +8 -8
- package/dist/cdn/chunks/{AiChatSidebar-hq9GgASn.js.map → AiChatSidebar-BQATQ3Tr.js.map} +1 -1
- package/dist/cdn/chunks/{AiFeatureMenu-B8B-XgQB.js → AiFeatureMenu-cNoZ0xl_.js} +6 -6
- package/dist/cdn/chunks/{AiFeatureMenu-B8B-XgQB.js.map → AiFeatureMenu-cNoZ0xl_.js.map} +1 -1
- package/dist/cdn/chunks/{BlockIssueBadge-DOvq0xJb.js → BlockIssueBadge-CH_3vFw4.js} +5 -5
- package/dist/cdn/chunks/{BlockIssueBadge-DOvq0xJb.js.map → BlockIssueBadge-CH_3vFw4.js.map} +1 -1
- package/dist/cdn/chunks/{BlockPreviewCanvas-ZN-5MezA.js → BlockPreviewCanvas-9tFXPVgi.js} +4 -4
- package/dist/cdn/chunks/{BlockPreviewCanvas-ZN-5MezA.js.map → BlockPreviewCanvas-9tFXPVgi.js.map} +1 -1
- package/dist/cdn/chunks/{CloudHeaderExtras-Dbd6brlz.js → CloudHeaderExtras-CUAM2ADe.js} +5 -5
- package/dist/cdn/chunks/{CloudHeaderExtras-Dbd6brlz.js.map → CloudHeaderExtras-CUAM2ADe.js.map} +1 -1
- package/dist/cdn/chunks/{CloudPanels-CxkGH1dy.js → CloudPanels-DMnnSIkX.js} +7 -7
- package/dist/cdn/chunks/{CloudPanels-CxkGH1dy.js.map → CloudPanels-DMnnSIkX.js.map} +1 -1
- package/dist/cdn/chunks/{CollaboratorBar-DpP8oKTU.js → CollaboratorBar-C6sorNRi.js} +5 -5
- package/dist/cdn/chunks/{CollaboratorBar-DpP8oKTU.js.map → CollaboratorBar-C6sorNRi.js.map} +1 -1
- package/dist/cdn/chunks/{ColorPicker-BsYEtL7B.js → ColorPicker-q1V7ggWI.js} +7 -7
- package/dist/cdn/chunks/{ColorPicker-BsYEtL7B.js.map → ColorPicker-q1V7ggWI.js.map} +1 -1
- package/dist/cdn/chunks/{CommentsPanel-B1B_UQ2z.js → CommentsPanel-ExfxJZM3.js} +3 -3
- package/dist/cdn/chunks/{CommentsPanel-B1B_UQ2z.js.map → CommentsPanel-ExfxJZM3.js.map} +1 -1
- package/dist/cdn/chunks/{CommentsSidebar-B4waNT5L.js → CommentsSidebar-CzALURMJ.js} +5 -5
- package/dist/cdn/chunks/{CommentsSidebar-B4waNT5L.js.map → CommentsSidebar-CzALURMJ.js.map} +1 -1
- package/dist/cdn/chunks/{CountdownBlock-BKrYGRiT.js → CountdownBlock-_7TUBqJS.js} +4 -4
- package/dist/cdn/chunks/{CountdownBlock-BKrYGRiT.js.map → CountdownBlock-_7TUBqJS.js.map} +1 -1
- package/dist/cdn/chunks/{CountdownToolbar-DhJg2sQa.js → CountdownToolbar-CkbWSrAH.js} +5 -5
- package/dist/cdn/chunks/{CountdownToolbar-DhJg2sQa.js.map → CountdownToolbar-CkbWSrAH.js.map} +1 -1
- package/dist/cdn/chunks/{DesignReferenceSidebar-4Ds4D0M0.js → DesignReferenceSidebar-COh0Rx_A.js} +7 -7
- package/dist/cdn/chunks/{DesignReferenceSidebar-4Ds4D0M0.js.map → DesignReferenceSidebar-COh0Rx_A.js.map} +1 -1
- package/dist/cdn/chunks/{IssuesPanel-CyGgRHuI.js → IssuesPanel-C1NG0xRI.js} +6 -6
- package/dist/cdn/chunks/{IssuesPanel-CyGgRHuI.js.map → IssuesPanel-C1NG0xRI.js.map} +1 -1
- package/dist/cdn/chunks/{LoadingTrack-Dp_QZvAK.js → LoadingTrack-D_wweXVz.js} +2 -2
- package/dist/cdn/chunks/{LoadingTrack-Dp_QZvAK.js.map → LoadingTrack-D_wweXVz.js.map} +1 -1
- package/dist/cdn/chunks/{MergeTagModeToggle-B_oHsH0i.js → MergeTagModeToggle-B1yXCp3D.js} +5 -5
- package/dist/cdn/chunks/{MergeTagModeToggle-B_oHsH0i.js.map → MergeTagModeToggle-B1yXCp3D.js.map} +1 -1
- package/dist/cdn/chunks/{MergeTagSuggestion-Df7jcLpS.js → MergeTagSuggestion-DqYR3jPA.js} +3 -3
- package/dist/cdn/chunks/{MergeTagSuggestion-Df7jcLpS.js.map → MergeTagSuggestion-DqYR3jPA.js.map} +1 -1
- package/dist/cdn/chunks/{NumberWithSuffix-DNBrbl4H.js → NumberWithSuffix-CWvM_I3T.js} +2 -2
- package/dist/cdn/chunks/{NumberWithSuffix-DNBrbl4H.js.map → NumberWithSuffix-CWvM_I3T.js.map} +1 -1
- package/dist/cdn/chunks/{ParagraphEditor-9GPXDRns.js → ParagraphEditor-DPM1hUKo.js} +22 -22
- package/dist/cdn/chunks/{ParagraphEditor-9GPXDRns.js.map → ParagraphEditor-DPM1hUKo.js.map} +1 -1
- package/dist/cdn/chunks/{RestoreVersionDialog-BWewwJIZ.js → RestoreVersionDialog-Dz0bX5ZZ.js} +5 -5
- package/dist/cdn/chunks/{RestoreVersionDialog-BWewwJIZ.js.map → RestoreVersionDialog-Dz0bX5ZZ.js.map} +1 -1
- package/dist/cdn/chunks/{RichTextEditorContent-DWD1--Yi.js → RichTextEditorContent-nkyIRAyN.js} +7 -7
- package/dist/cdn/chunks/{RichTextEditorContent-DWD1--Yi.js.map → RichTextEditorContent-nkyIRAyN.js.map} +1 -1
- package/dist/cdn/chunks/{SaveBlockDialog-DUyrK4nE.js → SaveBlockDialog-DVMxZbmf.js} +8 -8
- package/dist/cdn/chunks/{SaveBlockDialog-DUyrK4nE.js.map → SaveBlockDialog-DVMxZbmf.js.map} +1 -1
- package/dist/cdn/chunks/{SavedBlocksBrowserModal-DZrk2Fxx.js → SavedBlocksBrowserModal-C3nfKRQg.js} +9 -9
- package/dist/cdn/chunks/{SavedBlocksBrowserModal-DZrk2Fxx.js.map → SavedBlocksBrowserModal-C3nfKRQg.js.map} +1 -1
- package/dist/cdn/chunks/{SavedBlocksPanels-iSAXI4IM.js → SavedBlocksPanels-DVat5S7j.js} +3 -3
- package/dist/cdn/chunks/{SavedBlocksPanels-iSAXI4IM.js.map → SavedBlocksPanels-DVat5S7j.js.map} +1 -1
- package/dist/cdn/chunks/{SavedBlocksPickBar-CFeccSg9.js → SavedBlocksPickBar-Brg8US_n.js} +5 -5
- package/dist/cdn/chunks/{SavedBlocksPickBar-CFeccSg9.js.map → SavedBlocksPickBar-Brg8US_n.js.map} +1 -1
- package/dist/cdn/chunks/{TemplateScoringPanel-Ct5p7X_i.js → TemplateScoringPanel-DO86BvdQ.js} +6 -6
- package/dist/cdn/chunks/{TemplateScoringPanel-Ct5p7X_i.js.map → TemplateScoringPanel-DO86BvdQ.js.map} +1 -1
- package/dist/cdn/chunks/{TestEmailModal-BJo6q_Dm.js → TestEmailModal-CDx1Pqtx.js} +9 -9
- package/dist/cdn/chunks/{TestEmailModal-BJo6q_Dm.js.map → TestEmailModal-CDx1Pqtx.js.map} +1 -1
- package/dist/cdn/chunks/{TestEmailPanel-LuLd-ErE.js → TestEmailPanel--PpajGV7.js} +3 -3
- package/dist/cdn/chunks/{TestEmailPanel-LuLd-ErE.js.map → TestEmailPanel--PpajGV7.js.map} +1 -1
- package/dist/cdn/chunks/{TitleEditor-BsGfiDXQ.js → TitleEditor-CLkXt5RZ.js} +12 -12
- package/dist/cdn/chunks/{TitleEditor-BsGfiDXQ.js.map → TitleEditor-CLkXt5RZ.js.map} +1 -1
- package/dist/cdn/chunks/{TplModal-lUdHsbjL.js → TplModal-BhfPoZ_W.js} +5 -5
- package/dist/cdn/chunks/{TplModal-lUdHsbjL.js.map → TplModal-BhfPoZ_W.js.map} +1 -1
- package/dist/cdn/chunks/{VersionHistoryMenu-CXMPsVMR.js → VersionHistoryMenu-_DyRYBRP.js} +5 -5
- package/dist/cdn/chunks/{VersionHistoryMenu-CXMPsVMR.js.map → VersionHistoryMenu-_DyRYBRP.js.map} +1 -1
- package/dist/cdn/chunks/{VersionHistoryPanels-oTKA6TUS.js → VersionHistoryPanels-DGfOOcKV.js} +3 -3
- package/dist/cdn/chunks/{VersionHistoryPanels-oTKA6TUS.js.map → VersionHistoryPanels-DGfOOcKV.js.map} +1 -1
- package/dist/cdn/chunks/{VersionPreviewBanner-7DZLUVaE.js → VersionPreviewBanner-FbBmgknN.js} +4 -4
- package/dist/cdn/chunks/{VersionPreviewBanner-7DZLUVaE.js.map → VersionPreviewBanner-FbBmgknN.js.map} +1 -1
- package/dist/cdn/chunks/{blockTypeIcons-D8dtoELC.js → blockTypeIcons-o4ammRlm.js} +2 -2
- package/dist/cdn/chunks/{blockTypeIcons-D8dtoELC.js.map → blockTypeIcons-o4ammRlm.js.map} +1 -1
- package/dist/cdn/chunks/{ca-CEuJ6IRr.js → ca-DY0AYOLG.js} +7 -1
- package/dist/cdn/chunks/ca-DY0AYOLG.js.map +1 -0
- package/dist/cdn/chunks/{cloud-BA0OpRh-.js → cloud-CRCcXTc5.js} +2 -2
- package/dist/cdn/chunks/{cloud-BA0OpRh-.js.map → cloud-CRCcXTc5.js.map} +1 -1
- package/dist/cdn/chunks/{createCloudRuntime-CedWXagq.js → createCloudRuntime-C-u7oIGa.js} +7 -7
- package/dist/cdn/chunks/{createCloudRuntime-CedWXagq.js.map → createCloudRuntime-C-u7oIGa.js.map} +1 -1
- package/dist/{de-aRxhZF_K.js → cdn/chunks/de-CYLWugqb.js} +8 -0
- package/dist/cdn/chunks/de-CYLWugqb.js.map +1 -0
- package/dist/cdn/chunks/{dist-CM8TB0VD.js → dist-2fOlspdg.js} +3 -3
- package/dist/cdn/chunks/{dist-CM8TB0VD.js.map → dist-2fOlspdg.js.map} +1 -1
- package/dist/cdn/chunks/{dist-CYLJiSiH.js → dist-eKG4m5Wx.js} +2 -2
- package/dist/cdn/chunks/{dist-CYLJiSiH.js.map → dist-eKG4m5Wx.js.map} +1 -1
- package/dist/cdn/chunks/{draggable-BfpsXFg7.js → draggable-BLMjz0GK.js} +565 -579
- package/dist/cdn/chunks/{draggable-BfpsXFg7.js.map → draggable-BLMjz0GK.js.map} +1 -1
- package/dist/cdn/chunks/{en-BX4V_7YO.js → en-C3TM249M.js} +7 -1
- package/dist/cdn/chunks/en-C3TM249M.js.map +1 -0
- package/dist/cdn/chunks/en-C6FKrw69.js +2 -0
- package/dist/cdn/chunks/{es-CA9uQ-5x.js → es-D1SF4nCR.js} +7 -1
- package/dist/cdn/chunks/es-D1SF4nCR.js.map +1 -0
- package/dist/cdn/chunks/{extensions-P0lpi6k8.js → extensions-qSqWdFko.js} +6 -6
- package/dist/cdn/chunks/{extensions-P0lpi6k8.js.map → extensions-qSqWdFko.js.map} +1 -1
- package/dist/{fr-iBuE60Ap.js → cdn/chunks/fr-CdLhJ7kw.js} +8 -0
- package/dist/cdn/chunks/fr-CdLhJ7kw.js.map +1 -0
- package/dist/cdn/chunks/{icons-BrdgOeXm.js → icons-MeYdeH4P.js} +2 -2
- package/dist/cdn/chunks/{icons-BrdgOeXm.js.map → icons-MeYdeH4P.js.map} +1 -1
- package/dist/cdn/chunks/{keys-oJdkdtPn.js → keys-D7OpfE2s.js} +2 -2
- package/dist/cdn/chunks/{keys-oJdkdtPn.js.map → keys-D7OpfE2s.js.map} +1 -1
- package/dist/cdn/chunks/{nl-Btw4ojNo.js → nl-BvsLoyKp.js} +7 -1
- package/dist/cdn/chunks/nl-BvsLoyKp.js.map +1 -0
- package/dist/cdn/chunks/{pt-BR-GjVsCqbN.js → pt-BR-CAGS5YXp.js} +7 -1
- package/dist/cdn/chunks/pt-BR-CAGS5YXp.js.map +1 -0
- package/dist/cdn/chunks/{src-BS2ClsbB.js → src-2QDLdUyx.js} +93 -11
- package/dist/cdn/chunks/src-2QDLdUyx.js.map +1 -0
- package/dist/cdn/chunks/src-B_QJduQD.js.map +1 -1
- package/dist/cdn/chunks/{src-rhf0R6xZ.js → src-DgxiymKd.js} +62 -59
- package/dist/cdn/chunks/src-DgxiymKd.js.map +1 -0
- package/dist/cdn/chunks/{tiptap-DWeSx_P8.js → tiptap-DgH_wKK_.js} +2 -2
- package/dist/cdn/chunks/{tiptap-DWeSx_P8.js.map → tiptap-DgH_wKK_.js.map} +1 -1
- package/dist/cdn/chunks/{useAliveFlag-Dtm174fG.js → useAliveFlag-C1pwLtPO.js} +2 -2
- package/dist/cdn/chunks/{useAliveFlag-Dtm174fG.js.map → useAliveFlag-C1pwLtPO.js.map} +1 -1
- package/dist/cdn/chunks/{useCloudI18n-Ch-SiRjU.js → useCloudI18n-D4gzxtqF.js} +3 -3
- package/dist/cdn/chunks/{useCloudI18n-Ch-SiRjU.js.map → useCloudI18n-D4gzxtqF.js.map} +1 -1
- package/dist/cdn/chunks/{useEditorCore-CwJIw1Uy.js → useEditorCore-2ZVOY0Rh.js} +30 -25
- package/dist/cdn/chunks/{useEditorCore-CwJIw1Uy.js.map → useEditorCore-2ZVOY0Rh.js.map} +1 -1
- package/dist/cdn/chunks/useEditorRoot-BY-amddA.js +10 -0
- package/dist/cdn/chunks/{useEditorRoot-Cxnmf5hM.js.map → useEditorRoot-BY-amddA.js.map} +1 -1
- package/dist/cdn/chunks/{useI18n-4sUbTM3Y.js → useI18n-DYb1SgLB.js} +3 -3
- package/dist/cdn/chunks/{useI18n-4sUbTM3Y.js.map → useI18n-DYb1SgLB.js.map} +1 -1
- package/dist/cdn/chunks/{useMergeTag-DxjTEyin.js → useMergeTag-D-SE_XN8.js} +3 -3
- package/dist/cdn/chunks/{useMergeTag-DxjTEyin.js.map → useMergeTag-D-SE_XN8.js.map} +1 -1
- package/dist/cdn/chunks/{usePopoverPosition-C1N2kaiZ.js → usePopoverPosition-CJZ6EkS4.js} +3 -3
- package/dist/cdn/chunks/{usePopoverPosition-C1N2kaiZ.js.map → usePopoverPosition-CJZ6EkS4.js.map} +1 -1
- package/dist/cdn/chunks/{useScrollToBlock-BvWAfWd8.js → useScrollToBlock-D6gyIzT1.js} +3 -3
- package/dist/cdn/chunks/{useScrollToBlock-BvWAfWd8.js.map → useScrollToBlock-D6gyIzT1.js.map} +1 -1
- package/dist/cdn/editor.js +1010 -956
- package/dist/cdn/editor.js.map +1 -1
- package/dist/{check-C2h94k_8.js → check-CLfibuQc.js} +1 -1
- package/dist/{chevron-down-ulZzvfvk.js → chevron-down-DamTR8ta.js} +1 -1
- package/dist/{chevron-up-8g-VtBW4.js → chevron-up-CrV_Ksg-.js} +1 -1
- package/dist/{circle-alert-BJFqBtRt.js → circle-alert-BLy-e34e.js} +1 -1
- package/dist/{clock-C-1JiH38.js → clock-DQI6aaFT.js} +1 -1
- package/dist/{cloud-BAefVBb_.js → cloud-DXFUA8H_.js} +1 -1
- package/dist/{createCloudRuntime-FEZG-Gve.js → createCloudRuntime-BrgMP9gS.js} +5 -5
- package/dist/{createLucideIcon-DJb_1j1D.js → createLucideIcon-Cbl3Ma_H.js} +1 -1
- package/dist/{cdn/chunks/de-aRxhZF_K.js → de-CYLWugqb.js} +6 -2
- package/dist/{dist-BLVvhIFj.js → dist-7Lr_A7Va.js} +2 -2
- package/dist/{dist-B5iReTtK.js → dist-CkSgS-K9.js} +2 -2
- package/dist/{dist-CqcGTIiX.js → dist-WE11SQGe.js} +1 -1
- package/dist/{en-BX4V_7YO.js → en-C3TM249M.js} +6 -0
- package/dist/{es-CA9uQ-5x.js → es-D1SF4nCR.js} +6 -0
- package/dist/{extensions-DWp4eXoE.js → extensions-PJK0gLCL.js} +6 -6
- package/dist/{cdn/chunks/fr-iBuE60Ap.js → fr-CdLhJ7kw.js} +6 -2
- package/dist/{image-up-0rvCz8rh.js → image-up-BVOMy_Fs.js} +1 -1
- package/dist/{info-CXvc-MZk.js → info-BKMKasyT.js} +1 -1
- package/dist/{keys-CVpi8xCT.js → keys-CAor2T5q.js} +1 -1
- package/dist/{loader-circle-DQIuGTFk.js → loader-circle-CSGh8n8A.js} +1 -1
- package/dist/{message-circle-BqX2Y80d.js → message-circle-C6q2Fm_W.js} +1 -1
- package/dist/{nl-Btw4ojNo.js → nl-BvsLoyKp.js} +6 -0
- package/dist/{pencil-DpGX5hCB.js → pencil-DaTN0HKw.js} +1 -1
- package/dist/{pt-BR-GjVsCqbN.js → pt-BR-CAGS5YXp.js} +6 -0
- package/dist/{refresh-cw-B13pUg95.js → refresh-cw-Cu4wRQwT.js} +1 -1
- package/dist/{runtime-dom.esm-bundler-BgKXIPLV.js → runtime-dom.esm-bundler-CHEsXNQz.js} +1 -1
- package/dist/{scan-line-BDZEtA92.js → scan-line-O_o657Gv.js} +1 -1
- package/dist/{send-DQ52s_T6.js → send-GS3soauT.js} +1 -1
- package/dist/{shield-check-C4uQTy20.js → shield-check-B2TzT3Wp.js} +1 -1
- package/dist/{sparkles-CphMFXxu.js → sparkles-CNENcXZl.js} +1 -1
- package/dist/templatical-editor.js +464 -410
- package/dist/{text-align-start-Cem3VGu8.js → text-align-start-D0-k8RUf.js} +1 -1
- package/dist/{trash-2-ijNDbe1n.js → trash-2-BE-qGIpG.js} +1 -1
- package/dist/{triangle-alert-C1e0A199.js → triangle-alert-DNM2_dyh.js} +1 -1
- package/dist/{upload-CXwGBFi0.js → upload-Cv2Jx-yM.js} +1 -1
- package/dist/{useAliveFlag-BGIAZii_.js → useAliveFlag-1yBub211.js} +1 -1
- package/dist/{useCloudI18n-DmWo4nzs.js → useCloudI18n-Dwo7usTl.js} +2 -2
- package/dist/{useEditorCore-BfPXdBsv.js → useEditorCore-DM8vzMZQ.js} +35 -30
- package/dist/{useEditorRoot-DKyG95pb.js → useEditorRoot-CUIzpMYc.js} +2 -2
- package/dist/{useI18n-CvYvat9_.js → useI18n-DT_DKupw.js} +2 -2
- package/dist/{useMergeTag-D6Z6cyDa.js → useMergeTag-CcHQCcPN.js} +2 -2
- package/dist/{usePopoverPosition-WslxM_PU.js → usePopoverPosition-DaHz1kqb.js} +2 -2
- package/dist/{useScrollToBlock-B3H6frtG.js → useScrollToBlock-C2LYXENK.js} +3 -3
- package/dist/{vue.runtime.esm-bundler-DzEsDRtY.js → vue.runtime.esm-bundler-CdH_W9qX.js} +158 -172
- package/dist/{x-eZrtE6uf.js → x-DUPrT6Aa.js} +1 -1
- package/package.json +9 -9
- package/dist/cdn/chunks/ca-CEuJ6IRr.js.map +0 -1
- package/dist/cdn/chunks/de-aRxhZF_K.js.map +0 -1
- package/dist/cdn/chunks/en-BCgVx9zM.js +0 -90
- package/dist/cdn/chunks/en-BCgVx9zM.js.map +0 -1
- package/dist/cdn/chunks/en-BX4V_7YO.js.map +0 -1
- package/dist/cdn/chunks/es-CA9uQ-5x.js.map +0 -1
- package/dist/cdn/chunks/fr-iBuE60Ap.js.map +0 -1
- package/dist/cdn/chunks/nl-Btw4ojNo.js.map +0 -1
- package/dist/cdn/chunks/pt-BR-GjVsCqbN.js.map +0 -1
- package/dist/cdn/chunks/src-BS2ClsbB.js.map +0 -1
- package/dist/cdn/chunks/src-rhf0R6xZ.js.map +0 -1
- package/dist/cdn/chunks/useEditorRoot-Cxnmf5hM.js +0 -10
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"src-BS2ClsbB.js","names":["t","e","i","n","s","o","r","a","h","c","l","u","d","m"],"sources":["../../../../media-library/src/api-client.ts","../../../../media-library/src/composable.ts","../../../../media-library/src/keys.ts","../../../../media-library/src/composables/useI18n.ts","../../../../media-library/src/components/media/MediaBreadcrumb.vue","../../../../media-library/src/components/media/MediaBreadcrumb.vue","../../../../media-library/src/composables/useMediaCategories.ts","../../../../media-library/src/composables/useImageCrop.ts","../../../../../node_modules/.pnpm/vue-advanced-cropper@2.8.9_vue@3.5.41_typescript@6.0.3_/node_modules/vue-advanced-cropper/dist/index.esm-bundler.js","../../../../media-library/src/components/media/MediaEditModal.vue","../../../../media-library/src/components/media/MediaEditModal.vue","../../../../media-library/src/components/media/MediaFolderTreeNode.vue","../../../../media-library/src/components/media/MediaFolderTreeNode.vue","../../../../media-library/src/components/media/MediaFolderTree.vue","../../../../media-library/src/components/media/MediaFolderTree.vue","../../../../media-library/src/components/media/MediaFileIcon.vue","../../../../media-library/src/components/media/MediaFileIcon.vue","../../../../media-library/src/components/media/MediaGrid.vue","../../../../media-library/src/components/media/MediaGrid.vue","../../../../media-library/src/components/media/MediaImportUrlModal.vue","../../../../media-library/src/components/media/MediaImportUrlModal.vue","../../../../media-library/src/components/media/MediaMovePicker.vue","../../../../media-library/src/components/media/MediaMovePicker.vue","../../../../media-library/src/components/media/MediaPreviewPanel.vue","../../../../media-library/src/components/media/MediaPreviewPanel.vue","../../../../media-library/src/components/media/MediaReplaceModal.vue","../../../../media-library/src/components/media/MediaReplaceModal.vue","../../../../media-library/src/components/media/MediaUploadZone.vue","../../../../media-library/src/components/media/MediaUploadZone.vue","../../../../media-library/src/components/media/StorageProgressRing.vue","../../../../media-library/src/components/media/StorageProgressRing.vue","../../../../media-library/src/composables/useMediaLibraryUI.ts","../../../../media-library/src/i18n/index.ts","../../../../media-library/src/components/MediaLibraryModal.vue","../../../../media-library/src/components/MediaLibraryModal.vue","../../../../media-library/src/standalone/MediaLibrary.vue","../../../../media-library/src/standalone/MediaLibrary.vue","../../../../media-library/src/standalone/visual.ts"],"sourcesContent":["import type { ApiError, ApiResponse } from \"@templatical/types\";\nimport type { AuthManager } from \"@templatical/core/cloud\";\nimport { API_ROUTES, buildUrl } from \"@templatical/core/cloud\";\nimport type {\n MediaBrowseParams,\n MediaBrowseResponse,\n MediaFolder,\n MediaItem,\n MediaUsageResponse,\n} from \"./types\";\n\nexport class MediaApiClient {\n constructor(private readonly authManager: AuthManager) {}\n\n private get projectId(): string {\n return this.authManager.projectId;\n }\n\n private get tenantSlug(): string {\n return this.authManager.tenantSlug;\n }\n\n private get baseParams(): Record<string, string> {\n return { project: this.projectId, tenant: this.tenantSlug };\n }\n\n private async request<T>(\n path: string,\n options: RequestInit = {},\n ): Promise<T> {\n const response = await this.authManager.authenticatedFetch(path, {\n ...options,\n headers: {\n \"Content-Type\": \"application/json\",\n Accept: \"application/json\",\n ...options.headers,\n },\n });\n\n if (!response.ok) {\n const error: ApiError = await response.json().catch(() => ({\n message: `HTTP error ${response.status}`,\n }));\n throw new Error(error.message, { cause: error });\n }\n\n if (response.status === 204) {\n return undefined as T;\n }\n\n const json: ApiResponse<T> = await response.json();\n return json.data;\n }\n\n async browseMedia(\n params: Omit<MediaBrowseParams, \"project_id\">,\n ): Promise<MediaBrowseResponse> {\n const query = new URLSearchParams();\n if (params.folder_id) query.set(\"folder_id\", params.folder_id);\n if (params.search) query.set(\"search\", params.search);\n if (params.category) query.set(\"category\", params.category);\n if (params.sort) query.set(\"sort\", params.sort);\n if (params.cursor) query.set(\"cursor\", params.cursor);\n\n const queryString = query.toString();\n const url = `${buildUrl(API_ROUTES[\"media.browse\"], this.baseParams)}${queryString ? `?${queryString}` : \"\"}`;\n const response = await this.authManager.authenticatedFetch(url, {\n headers: { Accept: \"application/json\" },\n });\n\n if (!response.ok) {\n const error: ApiError = await response.json().catch(() => ({\n message: `HTTP error ${response.status}`,\n }));\n throw new Error(error.message, { cause: error });\n }\n\n return response.json();\n }\n\n async uploadMedia(file: File, folderId?: string | null): Promise<MediaItem> {\n const formData = new FormData();\n formData.append(\"file\", file);\n if (folderId) formData.append(\"folder_id\", folderId);\n\n const url = buildUrl(API_ROUTES[\"media.upload\"], this.baseParams);\n const response = await this.authManager.authenticatedFetch(url, {\n method: \"POST\",\n headers: { Accept: \"application/json\" },\n body: formData,\n });\n\n if (!response.ok) {\n const error: ApiError = await response.json().catch(() => ({\n message: `HTTP error ${response.status}`,\n }));\n throw new Error(error.message, { cause: error });\n }\n\n const json: ApiResponse<MediaItem> = await response.json();\n return json.data;\n }\n\n async updateMedia(\n mediaId: string,\n filename: string,\n altText?: string,\n ): Promise<MediaItem> {\n return this.request<MediaItem>(\n buildUrl(API_ROUTES[\"media.update\"], {\n ...this.baseParams,\n media: mediaId,\n }),\n {\n method: \"PUT\",\n body: JSON.stringify({\n filename,\n alt_text: altText,\n }),\n },\n );\n }\n\n async deleteMedia(ids: string[]): Promise<void> {\n return this.request<void>(\n buildUrl(API_ROUTES[\"media.delete\"], this.baseParams),\n {\n method: \"POST\",\n body: JSON.stringify({ ids }),\n },\n );\n }\n\n async moveMedia(\n ids: string[],\n folderId: string | null,\n ): Promise<MediaItem[]> {\n return this.request<MediaItem[]>(\n buildUrl(API_ROUTES[\"media.move\"], this.baseParams),\n {\n method: \"POST\",\n body: JSON.stringify({ ids, folder_id: folderId }),\n },\n );\n }\n\n async getMediaFolders(): Promise<MediaFolder[]> {\n return this.request<MediaFolder[]>(\n buildUrl(API_ROUTES[\"folders.index\"], this.baseParams),\n );\n }\n\n async createMediaFolder(\n name: string,\n parentId?: string | null,\n ): Promise<MediaFolder> {\n return this.request<MediaFolder>(\n buildUrl(API_ROUTES[\"folders.store\"], this.baseParams),\n {\n method: \"POST\",\n body: JSON.stringify({\n name,\n parent_id: parentId ?? null,\n }),\n },\n );\n }\n\n async renameMediaFolder(\n folderId: string,\n name: string,\n ): Promise<MediaFolder> {\n return this.request<MediaFolder>(\n buildUrl(API_ROUTES[\"folders.update\"], {\n ...this.baseParams,\n mediaFolder: folderId,\n }),\n {\n method: \"PUT\",\n body: JSON.stringify({ name }),\n },\n );\n }\n\n async deleteMediaFolder(folderId: string): Promise<void> {\n return this.request<void>(\n buildUrl(API_ROUTES[\"folders.destroy\"], {\n ...this.baseParams,\n mediaFolder: folderId,\n }),\n {\n method: \"DELETE\",\n },\n );\n }\n\n async checkMediaUsage(ids: string[]): Promise<MediaUsageResponse> {\n const response = await this.authManager.authenticatedFetch(\n buildUrl(API_ROUTES[\"media.checkUsage\"], this.baseParams),\n {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\",\n Accept: \"application/json\",\n },\n body: JSON.stringify({ ids }),\n },\n );\n\n if (!response.ok) {\n const error: ApiError = await response.json().catch(() => ({\n message: `HTTP error ${response.status}`,\n }));\n throw new Error(error.message, { cause: error });\n }\n\n return response.json();\n }\n\n async getFrequentlyUsed(): Promise<MediaItem[]> {\n return this.request<MediaItem[]>(\n buildUrl(API_ROUTES[\"media.frequentlyUsed\"], this.baseParams),\n );\n }\n\n async importFromUrl(\n url: string,\n folderId?: string | null,\n ): Promise<MediaItem> {\n return this.request<MediaItem>(\n buildUrl(API_ROUTES[\"media.importFromUrl\"], this.baseParams),\n {\n method: \"POST\",\n body: JSON.stringify({\n url,\n folder_id: folderId ?? null,\n }),\n },\n );\n }\n\n async replaceMedia(mediaId: string, file: File): Promise<MediaItem> {\n const formData = new FormData();\n formData.append(\"file\", file);\n\n const url = buildUrl(API_ROUTES[\"media.replace\"], {\n ...this.baseParams,\n media: mediaId,\n });\n const response = await this.authManager.authenticatedFetch(url, {\n method: \"POST\",\n headers: { Accept: \"application/json\" },\n body: formData,\n });\n\n if (!response.ok) {\n const error: ApiError = await response.json().catch(() => ({\n message: `HTTP error ${response.status}`,\n }));\n throw new Error(error.message, { cause: error });\n }\n\n const json: ApiResponse<MediaItem> = await response.json();\n return json.data;\n }\n}\n","import type { AuthManager } from \"@templatical/core/cloud\";\nimport { MediaApiClient } from \"./api-client\";\nimport { ref, type Ref } from \"vue\";\nimport type { MediaFolder, MediaItem, MediaUsageInfo } from \"./types\";\n\nexport type MediaViewMode = \"files\" | \"frequently-used\";\n\nexport interface UseMediaLibraryOptions {\n projectId: string;\n authManager: AuthManager;\n onError?: (error: Error) => void;\n}\n\nexport function useMediaLibrary(options: UseMediaLibraryOptions) {\n if (!options.projectId) {\n throw new Error(\"projectId is required for useMediaLibrary\");\n }\n\n const api = new MediaApiClient(options.authManager);\n\n const items: Ref<MediaItem[]> = ref([]);\n const folders: Ref<MediaFolder[]> = ref([]);\n const currentFolderId: Ref<string | null> = ref(null);\n const viewMode: Ref<MediaViewMode> = ref(\"files\");\n const searchQuery: Ref<string> = ref(\"\");\n const categoryFilter: Ref<string | null> = ref(null);\n const sortOption: Ref<string> = ref(\"newest\");\n const isLoading = ref(false);\n const isUploading = ref(false);\n const hasMore = ref(false);\n const nextCursor: Ref<string | null> = ref(null);\n const uploadProgress: Ref<{ current: number; total: number } | null> =\n ref(null);\n const selectedItems: Ref<Set<string>> = ref(new Set());\n const previewItem: Ref<MediaItem | null> = ref(null);\n const frequentlyUsedItems: Ref<MediaItem[]> = ref([]);\n const deleteUsageInfo: Ref<Record<string, MediaUsageInfo>> = ref({});\n const showDeleteWarning = ref(false);\n const pendingDeleteIds: Ref<string[]> = ref([]);\n const isImportingFromUrl = ref(false);\n const importFromUrlError: Ref<string | null> = ref(null);\n const isReplacing = ref(false);\n const replaceError: Ref<string | null> = ref(null);\n const showReplaceWarning = ref(false);\n const pendingReplaceItem: Ref<MediaItem | null> = ref(null);\n const replaceUsageInfo: Ref<MediaUsageInfo | null> = ref(null);\n\n // Monotonic token so out-of-order browseMedia responses (folder switch /\n // search change before the previous request settled) don't overwrite the\n // current view with stale data.\n let browseRequestId = 0;\n\n async function loadItems(): Promise<void> {\n const requestId = ++browseRequestId;\n isLoading.value = true;\n try {\n const response = await api.browseMedia({\n folder_id: searchQuery.value ? undefined : currentFolderId.value,\n search: searchQuery.value || undefined,\n category: categoryFilter.value || undefined,\n sort: sortOption.value !== \"newest\" ? sortOption.value : undefined,\n });\n if (requestId !== browseRequestId) return;\n items.value = response.data;\n nextCursor.value = response.meta.next_cursor;\n hasMore.value = !!response.meta.next_cursor;\n } catch (error) {\n if (requestId !== browseRequestId) return;\n options.onError?.(error as Error);\n } finally {\n if (requestId === browseRequestId) {\n isLoading.value = false;\n }\n }\n }\n\n async function loadMore(): Promise<void> {\n if (!hasMore.value || !nextCursor.value || isLoading.value) return;\n\n const requestId = ++browseRequestId;\n isLoading.value = true;\n try {\n const response = await api.browseMedia({\n folder_id: searchQuery.value ? undefined : currentFolderId.value,\n search: searchQuery.value || undefined,\n category: categoryFilter.value || undefined,\n sort: sortOption.value !== \"newest\" ? sortOption.value : undefined,\n cursor: nextCursor.value,\n });\n if (requestId !== browseRequestId) return;\n items.value = [...items.value, ...response.data];\n nextCursor.value = response.meta.next_cursor;\n hasMore.value = !!response.meta.next_cursor;\n } catch (error) {\n if (requestId !== browseRequestId) return;\n options.onError?.(error as Error);\n } finally {\n if (requestId === browseRequestId) {\n isLoading.value = false;\n }\n }\n }\n\n async function search(query: string): Promise<void> {\n searchQuery.value = query;\n await loadItems();\n }\n\n async function filterByCategory(category: string | null): Promise<void> {\n categoryFilter.value = category;\n await loadItems();\n }\n\n async function sortBy(option: string): Promise<void> {\n sortOption.value = option;\n await loadItems();\n }\n\n async function navigateToFolder(folderId: string | null): Promise<void> {\n viewMode.value = \"files\";\n currentFolderId.value = folderId;\n searchQuery.value = \"\";\n selectedItems.value = new Set();\n previewItem.value = null;\n await loadItems();\n }\n\n async function showFrequentlyUsed(): Promise<void> {\n viewMode.value = \"frequently-used\";\n currentFolderId.value = null;\n searchQuery.value = \"\";\n selectedItems.value = new Set();\n previewItem.value = null;\n await loadFrequentlyUsed();\n }\n\n async function uploadFile(file: File): Promise<MediaItem | null> {\n isUploading.value = true;\n try {\n const media = await api.uploadMedia(file, currentFolderId.value);\n items.value = [media, ...items.value];\n return media;\n } catch (error) {\n options.onError?.(error as Error);\n return null;\n } finally {\n isUploading.value = false;\n }\n }\n\n async function uploadFiles(files: File[]): Promise<void> {\n isUploading.value = true;\n uploadProgress.value = { current: 0, total: files.length };\n try {\n for (let i = 0; i < files.length; i++) {\n uploadProgress.value = { current: i + 1, total: files.length };\n try {\n const media = await api.uploadMedia(files[i], currentFolderId.value);\n items.value = [media, ...items.value];\n } catch (error) {\n options.onError?.(error as Error);\n }\n }\n } finally {\n isUploading.value = false;\n uploadProgress.value = null;\n }\n }\n\n async function moveSelected(targetFolderId: string | null): Promise<void> {\n if (selectedItems.value.size === 0) {\n return;\n }\n\n try {\n const movedItems = await api.moveMedia(\n [...selectedItems.value],\n targetFolderId,\n );\n if (currentFolderId.value === null) {\n const movedMap = new Map(movedItems.map((item) => [item.id, item]));\n items.value = items.value.map((item) => movedMap.get(item.id) ?? item);\n } else {\n items.value = items.value.filter(\n (item) => !selectedItems.value.has(item.id),\n );\n }\n selectedItems.value = new Set();\n previewItem.value = null;\n } catch (error) {\n options.onError?.(error as Error);\n }\n }\n\n async function updateFile(\n mediaId: string,\n filename: string,\n altText?: string,\n ): Promise<void> {\n try {\n const updated = await api.updateMedia(mediaId, filename, altText);\n items.value = items.value.map((item) =>\n item.id === mediaId ? updated : item,\n );\n if (previewItem.value?.id === mediaId) {\n previewItem.value = updated;\n }\n } catch (error) {\n options.onError?.(error as Error);\n }\n }\n\n async function deleteSelected(): Promise<void> {\n if (selectedItems.value.size === 0) return;\n\n try {\n await api.deleteMedia([...selectedItems.value]);\n items.value = items.value.filter(\n (item) => !selectedItems.value.has(item.id),\n );\n frequentlyUsedItems.value = frequentlyUsedItems.value.filter(\n (item) => !selectedItems.value.has(item.id),\n );\n selectedItems.value = new Set();\n previewItem.value = null;\n } catch (error) {\n options.onError?.(error as Error);\n }\n }\n\n async function loadFrequentlyUsed(): Promise<void> {\n try {\n frequentlyUsedItems.value = await api.getFrequentlyUsed();\n } catch (error) {\n options.onError?.(error as Error);\n }\n }\n\n async function checkUsageBeforeDelete(): Promise<boolean> {\n if (selectedItems.value.size === 0) {\n return false;\n }\n\n pendingDeleteIds.value = [...selectedItems.value];\n\n try {\n const response = await api.checkMediaUsage(pendingDeleteIds.value);\n deleteUsageInfo.value = response.data;\n\n const hasUsage = Object.values(response.data).some(\n (info) => info.template_count > 0,\n );\n\n showDeleteWarning.value = true;\n return hasUsage;\n } catch (error) {\n options.onError?.(error as Error);\n return false;\n }\n }\n\n async function confirmDelete(): Promise<void> {\n showDeleteWarning.value = false;\n\n if (pendingDeleteIds.value.length === 0) {\n return;\n }\n\n try {\n await api.deleteMedia(pendingDeleteIds.value);\n items.value = items.value.filter(\n (item) => !pendingDeleteIds.value.includes(item.id),\n );\n frequentlyUsedItems.value = frequentlyUsedItems.value.filter(\n (item) => !pendingDeleteIds.value.includes(item.id),\n );\n selectedItems.value = new Set();\n previewItem.value = null;\n pendingDeleteIds.value = [];\n deleteUsageInfo.value = {};\n } catch (error) {\n options.onError?.(error as Error);\n }\n }\n\n function cancelDelete(): void {\n showDeleteWarning.value = false;\n pendingDeleteIds.value = [];\n deleteUsageInfo.value = {};\n }\n\n async function importFromUrl(url: string): Promise<MediaItem | null> {\n isImportingFromUrl.value = true;\n importFromUrlError.value = null;\n try {\n const media = await api.importFromUrl(url, currentFolderId.value);\n items.value = [media, ...items.value];\n return media;\n } catch (error) {\n importFromUrlError.value =\n error instanceof Error ? error.message : \"Import failed\";\n options.onError?.(error as Error);\n return null;\n } finally {\n isImportingFromUrl.value = false;\n }\n }\n\n function toggleSelection(id: string): void {\n const next = new Set(selectedItems.value);\n if (next.has(id)) {\n next.delete(id);\n } else {\n next.add(id);\n }\n selectedItems.value = next;\n }\n\n function clearSelection(): void {\n selectedItems.value = new Set();\n previewItem.value = null;\n }\n\n function selectItem(item: MediaItem): void {\n previewItem.value = item;\n selectedItems.value = new Set([item.id]);\n }\n\n async function loadFolders(): Promise<void> {\n try {\n folders.value = await api.getMediaFolders();\n } catch (error) {\n options.onError?.(error as Error);\n }\n }\n\n async function createFolder(\n name: string,\n parentId?: string | null,\n ): Promise<MediaFolder | null> {\n try {\n const folder = await api.createMediaFolder(name, parentId);\n await loadFolders();\n return folder;\n } catch (error) {\n options.onError?.(error as Error);\n return null;\n }\n }\n\n function findFolderInTree(\n folderList: MediaFolder[],\n id: string,\n ): MediaFolder | null {\n for (const folder of folderList) {\n if (folder.id === id) return folder;\n if (folder.children) {\n const found = findFolderInTree(folder.children, id);\n if (found) return found;\n }\n }\n return null;\n }\n\n async function renameFolder(folderId: string, name: string): Promise<void> {\n try {\n await api.renameMediaFolder(folderId, name);\n await loadFolders();\n } catch (error) {\n options.onError?.(error as Error);\n }\n }\n\n async function deleteFolder(folderId: string): Promise<void> {\n try {\n const folder = findFolderInTree(folders.value, folderId);\n const parentId = folder?.parent_id ?? null;\n\n await api.deleteMediaFolder(folderId);\n\n if (currentFolderId.value === folderId) {\n currentFolderId.value = parentId;\n }\n\n await loadFolders();\n await loadItems();\n } catch (error) {\n options.onError?.(error as Error);\n }\n }\n\n async function checkUsageBeforeReplace(item: MediaItem): Promise<void> {\n pendingReplaceItem.value = item;\n replaceError.value = null;\n\n try {\n const response = await api.checkMediaUsage([item.id]);\n replaceUsageInfo.value = response.data[item.id] ?? null;\n showReplaceWarning.value = true;\n } catch (error) {\n options.onError?.(error as Error);\n }\n }\n\n function cancelReplace(): void {\n showReplaceWarning.value = false;\n pendingReplaceItem.value = null;\n replaceUsageInfo.value = null;\n replaceError.value = null;\n }\n\n async function replaceFile(file: File): Promise<MediaItem | null> {\n if (!pendingReplaceItem.value) {\n return null;\n }\n\n isReplacing.value = true;\n replaceError.value = null;\n\n try {\n const updated = await api.replaceMedia(pendingReplaceItem.value.id, file);\n\n items.value = items.value.map((item) =>\n item.id === updated.id ? updated : item,\n );\n\n frequentlyUsedItems.value = frequentlyUsedItems.value.map((item) =>\n item.id === updated.id ? updated : item,\n );\n\n if (previewItem.value?.id === updated.id) {\n previewItem.value = updated;\n }\n\n showReplaceWarning.value = false;\n pendingReplaceItem.value = null;\n replaceUsageInfo.value = null;\n\n return updated;\n } catch (error) {\n replaceError.value =\n error instanceof Error ? error.message : \"Replace failed\";\n options.onError?.(error as Error);\n return null;\n } finally {\n isReplacing.value = false;\n }\n }\n\n async function replaceMediaDirectly(\n mediaId: string,\n file: File,\n ): Promise<MediaItem | null> {\n try {\n const updated = await api.replaceMedia(mediaId, file);\n\n items.value = items.value.map((item) =>\n item.id === updated.id ? updated : item,\n );\n\n frequentlyUsedItems.value = frequentlyUsedItems.value.map((item) =>\n item.id === updated.id ? updated : item,\n );\n\n if (previewItem.value?.id === updated.id) {\n previewItem.value = updated;\n }\n\n return updated;\n } catch (error) {\n options.onError?.(error as Error);\n return null;\n }\n }\n\n return {\n items,\n folders,\n currentFolderId,\n viewMode,\n searchQuery,\n categoryFilter,\n sortOption,\n isLoading,\n isUploading,\n uploadProgress,\n hasMore,\n selectedItems,\n previewItem,\n frequentlyUsedItems,\n deleteUsageInfo,\n showDeleteWarning,\n loadItems,\n loadMore,\n search,\n filterByCategory,\n sortBy,\n navigateToFolder,\n showFrequentlyUsed,\n uploadFile,\n uploadFiles,\n moveSelected,\n updateFile,\n deleteSelected,\n isImportingFromUrl,\n importFromUrlError,\n importFromUrl,\n toggleSelection,\n clearSelection,\n selectItem,\n loadFolders,\n createFolder,\n renameFolder,\n deleteFolder,\n findFolderInTree,\n loadFrequentlyUsed,\n checkUsageBeforeDelete,\n confirmDelete,\n cancelDelete,\n isReplacing,\n replaceError,\n showReplaceWarning,\n pendingReplaceItem,\n replaceUsageInfo,\n checkUsageBeforeReplace,\n cancelReplace,\n replaceFile,\n replaceMediaDirectly,\n };\n}\n","import type { InjectionKey, Ref } from \"vue\";\nimport type { UsePlanConfigReturn } from \"@templatical/core/cloud\";\nimport type { MediaTranslations } from \"./i18n\";\n\n/**\n * The active plan's config, for the media limits every surface in this package\n * reads: accepted MIME types, `max_file_size`, the storage gauge.\n *\n * **Provided by whichever component roots the tree** — `MediaLibraryModal` from\n * its `planConfig` prop, `standalone/MediaLibrary.vue` from its own — and\n * consumed by `useMediaCategories`, which five descendants call. It is a\n * provide rather than prop-drilling *only* because of that depth; the values\n * themselves cross the package boundary as props.\n *\n * That distinction is the whole point of this key existing. Vue matches injection\n * keys by identity, so a bare-string `inject(\"planConfig\")` never resolves the\n * `Symbol` a host provided — it yields `undefined` silently, and the browser is\n * inert with nothing to debug. Props make the cross-package boundary typed; a\n * single exported key makes the intra-package hop impossible to spell two\n * different ways.\n */\nexport const PLAN_CONFIG_KEY: InjectionKey<UsePlanConfigReturn> = Symbol(\n \"templaticalMediaPlanConfig\",\n);\n\n/**\n * Mount target for modal/overlay teleports inside `MediaLibraryModal` and\n * its nested sub-modals (replace, edit, import URL). Set via the\n * `popoverTarget` prop on `MediaLibraryModal` and provided here so the\n * sub-modals can teleport to the same element.\n *\n * When the ref resolves to `null` (or no provider is in scope, e.g. the\n * standalone visual SDK from `./standalone/visual.ts`), modals fall back\n * to `document.body` — preserving the original teleport behavior.\n *\n * Host integration: editors that mount `MediaLibraryModal` inside a\n * shadow-aware tree should pass their popover root element (e.g.\n * `core.popoverRoot.value`) through the prop so media-library modals land\n * inside the editor's shadow boundary rather than escaping to body.\n */\nexport const POPOVER_TARGET_KEY: InjectionKey<Ref<HTMLElement | null>> = Symbol(\n \"templaticalMediaPopoverTarget\",\n);\n\n/**\n * The active locale's strings, for the twelve components in this package that\n * call `useI18n()`.\n *\n * **Provided by whichever component roots the tree** — `MediaLibraryModal` from\n * the translations it loads for its `locale` prop, `standalone/MediaLibrary.vue`\n * from its own `translations` prop.\n *\n * A `Symbol` for the same reason {@link PLAN_CONFIG_KEY} is one, and this key\n * exists because that reason was learned the hard way: translations used to be\n * injected under the bare string `\"translations\"`, which never resolves the\n * `Symbol` `@templatical/editor` provides under the same name. A modal mounted\n * inside the editor got `undefined` and every `t.mediaLibrary.*` read threw.\n * Strings cross the package boundary as a `locale` prop; this key carries them\n * the rest of the way.\n */\nexport const TRANSLATIONS_KEY: InjectionKey<Ref<MediaTranslations | null>> =\n Symbol(\"templaticalMediaTranslations\");\n\n/**\n * Resolved UI theme (`\"light\"` / `\"dark\"`) for the overlay chrome, stamped onto\n * `data-tpl-theme` by this package's modals.\n *\n * Set from `MediaLibraryModal`'s `uiTheme` prop. The three sub-modals need it\n * too and teleport away from the modal's own DOM, so it travels by provide\n * rather than by prop-drilling through the markup.\n *\n * A `Symbol` for the reason `PLAN_CONFIG_KEY` is one, and the third key added\n * after learning it: these modals injected the bare string `\"tplUiTheme\"`, which\n * never resolves the identically-named `Symbol` `@templatical/editor` provides.\n * `data-tpl-theme` was therefore always `undefined` and the media library stayed\n * light inside a dark editor.\n *\n * Absent in the standalone SDK, which has no light/dark concept — the modals\n * inject with a `null` default and simply stamp nothing.\n */\nexport const UI_THEME_KEY: InjectionKey<Readonly<Ref<string | undefined>>> =\n Symbol(\"templaticalMediaUiTheme\");\n","import type { MediaTranslations } from \"../i18n\";\nimport { type Ref, inject, isRef } from \"vue\";\nimport { TRANSLATIONS_KEY } from \"../keys\";\nimport en from \"../i18n/locales/en\";\n\nexport interface UseI18nReturn {\n /** Current translations object */\n t: MediaTranslations;\n /** Format a string with placeholders */\n format: (template: string, values: Record<string, string | number>) => string;\n}\n\n/**\n * Composable for internationalization.\n * Provides access to the current locale's translations.\n *\n * Resolution order: an explicit override, then `TRANSLATIONS_KEY` from the host\n * component, then bundled English.\n *\n * **English is a floor, not a feature.** `t` is read as `t.mediaLibrary.x` in 28\n * template positions in `MediaLibraryModal` alone and across eleven sibling\n * components, so an unresolved injection is not a missing label — it is a\n * `TypeError` on first render. The fallback keeps a wiring mistake to the wrong\n * *language* rather than a blank library, which is why the previous non-null\n * assertion is gone: it claimed something the type system could not back.\n *\n * The value is unwrapped **once, at setup** — deliberately, since every consumer\n * reads `t.mediaLibrary.x` directly rather than through a ref. A host whose\n * translations arrive asynchronously must therefore withhold its subtree until\n * they land (`MediaLibraryModal` gates on exactly that) rather than expecting a\n * later value to propagate.\n *\n * @param translationsOverride - Optional translations to use instead of the injected value\n */\nexport function useI18n(\n translationsOverride?: MediaTranslations,\n): UseI18nReturn {\n const injected =\n translationsOverride ??\n inject<Ref<MediaTranslations | null> | null>(TRANSLATIONS_KEY, null);\n const resolved = isRef(injected) ? injected.value : injected;\n const t = resolved ?? en;\n\n /**\n * Format a string with placeholders.\n * e.g., format('{minutes}m ago', { minutes: 5 }) -> '5m ago'\n */\n function format(\n template: string,\n values: Record<string, string | number>,\n ): string {\n return template.replace(/\\{(\\w+)\\}/g, (_, key) => {\n return key in values ? String(values[key]) : `{${key}}`;\n });\n }\n\n return {\n t,\n format,\n };\n}\n","<script setup lang=\"ts\">\nimport { useI18n } from \"../../composables/useI18n\";\nimport type { MediaFolder } from \"../../types\";\nimport { ChevronRight } from \"@lucide/vue\";\nimport { computed } from \"vue\";\n\nconst props = defineProps<{\n folders: MediaFolder[];\n currentFolderId: string | null;\n}>();\n\nconst emit = defineEmits<{\n (e: \"navigate\", folderId: string | null): void;\n}>();\n\nconst { t } = useI18n();\n\nconst breadcrumbPath = computed(() => {\n if (!props.currentFolderId) return [];\n const path: MediaFolder[] = [];\n buildPath(props.folders, props.currentFolderId, path);\n return path;\n});\n\nfunction buildPath(\n folderList: MediaFolder[],\n targetId: string,\n path: MediaFolder[],\n): boolean {\n for (const folder of folderList) {\n if (folder.id === targetId) {\n path.push(folder);\n return true;\n }\n if (folder.children && buildPath(folder.children, targetId, path)) {\n path.unshift(folder);\n return true;\n }\n }\n return false;\n}\n</script>\n\n<template>\n <div\n v-if=\"breadcrumbPath.length > 0\"\n class=\"tpl:flex tpl:items-center tpl:gap-1 tpl:text-xs\"\n style=\"color: var(--tpl-text-muted)\"\n >\n <button\n class=\"tpl:transition-colors tpl:duration-150 tpl:hover:underline\"\n style=\"color: var(--tpl-primary)\"\n @click=\"emit('navigate', null)\"\n >\n {{ t.mediaLibrary.allFiles }}\n </button>\n <template v-for=\"(folder, index) in breadcrumbPath\" :key=\"folder.id\">\n <ChevronRight :size=\"12\" :stroke-width=\"2\" />\n <button\n v-if=\"index < breadcrumbPath.length - 1\"\n class=\"tpl:transition-colors tpl:duration-150 tpl:hover:underline\"\n style=\"color: var(--tpl-primary)\"\n @click=\"emit('navigate', folder.id)\"\n >\n {{ folder.name }}\n </button>\n <span v-else style=\"color: var(--tpl-text)\">{{ folder.name }}</span>\n </template>\n </div>\n</template>\n","<script setup lang=\"ts\">\nimport { useI18n } from \"../../composables/useI18n\";\nimport type { MediaFolder } from \"../../types\";\nimport { ChevronRight } from \"@lucide/vue\";\nimport { computed } from \"vue\";\n\nconst props = defineProps<{\n folders: MediaFolder[];\n currentFolderId: string | null;\n}>();\n\nconst emit = defineEmits<{\n (e: \"navigate\", folderId: string | null): void;\n}>();\n\nconst { t } = useI18n();\n\nconst breadcrumbPath = computed(() => {\n if (!props.currentFolderId) return [];\n const path: MediaFolder[] = [];\n buildPath(props.folders, props.currentFolderId, path);\n return path;\n});\n\nfunction buildPath(\n folderList: MediaFolder[],\n targetId: string,\n path: MediaFolder[],\n): boolean {\n for (const folder of folderList) {\n if (folder.id === targetId) {\n path.push(folder);\n return true;\n }\n if (folder.children && buildPath(folder.children, targetId, path)) {\n path.unshift(folder);\n return true;\n }\n }\n return false;\n}\n</script>\n\n<template>\n <div\n v-if=\"breadcrumbPath.length > 0\"\n class=\"tpl:flex tpl:items-center tpl:gap-1 tpl:text-xs\"\n style=\"color: var(--tpl-text-muted)\"\n >\n <button\n class=\"tpl:transition-colors tpl:duration-150 tpl:hover:underline\"\n style=\"color: var(--tpl-primary)\"\n @click=\"emit('navigate', null)\"\n >\n {{ t.mediaLibrary.allFiles }}\n </button>\n <template v-for=\"(folder, index) in breadcrumbPath\" :key=\"folder.id\">\n <ChevronRight :size=\"12\" :stroke-width=\"2\" />\n <button\n v-if=\"index < breadcrumbPath.length - 1\"\n class=\"tpl:transition-colors tpl:duration-150 tpl:hover:underline\"\n style=\"color: var(--tpl-primary)\"\n @click=\"emit('navigate', folder.id)\"\n >\n {{ folder.name }}\n </button>\n <span v-else style=\"color: var(--tpl-text)\">{{ folder.name }}</span>\n </template>\n </div>\n</template>\n","import type { MediaCategory, MediaCategoryData } from \"../types\";\nimport { computed, inject, type ComputedRef } from \"vue\";\nimport { PLAN_CONFIG_KEY } from \"../keys\";\nimport type { UsePlanConfigReturn } from \"@templatical/core/cloud\";\n\nexport type { MediaCategory };\n\nexport interface UseMediaCategoriesReturn {\n isMediaLibraryEnabled: ComputedRef<boolean>;\n allAcceptedMimeTypes: ComputedRef<string[]>;\n allAcceptedInputString: ComputedRef<string>;\n maxFileSize: ComputedRef<number>;\n availableCategories: ComputedRef<MediaCategory[]>;\n isAcceptedMimeType: (\n mimeType: string,\n filterCategories?: MediaCategory[],\n ) => boolean;\n isImageMimeType: (mimeType: string) => boolean;\n getCategoryForMimeType: (mimeType: string) => MediaCategory | null;\n}\n\nexport function useMediaCategories(\n /**\n * The plan config to read, for callers that cannot inject one.\n *\n * A component never sees its own `provide` — Vue resolves `inject` against\n * the *parent* chain — so the two hosts that provide `PLAN_CONFIG_KEY`\n * cannot also inject it, and must pass their value here instead. Descendants\n * (`MediaGrid`, `MediaEditModal`, `MediaUploadZone`, `MediaPreviewPanel`)\n * omit the argument and inject as before. Mirrors `useI18n(override?)`.\n */\n planConfigOverride?: UsePlanConfigReturn,\n): UseMediaCategoriesReturn {\n // Explicit null default + throw rather than a `!` assertion: without a\n // provider every read below became `undefined.config`, which is a TypeError\n // several frames away from the missing wiring. Reaching this message means a\n // descendant was rendered outside both hosts, or a host forgot the argument\n // above.\n const planConfig = planConfigOverride ?? inject(PLAN_CONFIG_KEY, null);\n if (!planConfig) {\n throw new Error(\n \"[Templatical] useMediaCategories() needs a plan config in scope. Render it under <MediaLibraryModal> (pass its `planConfig` prop) or provide PLAN_CONFIG_KEY yourself.\",\n );\n }\n\n const mediaConfig = computed(() => planConfig.config.value?.media ?? null);\n\n const isMediaLibraryEnabled = computed(\n () => mediaConfig.value?.use_media_library ?? true,\n );\n\n const categories = computed(\n () =>\n (mediaConfig.value?.categories as Record<\n MediaCategory,\n MediaCategoryData\n > | null) ?? null,\n );\n\n const allAcceptedMimeTypes = computed(() => {\n if (!categories.value) {\n return [];\n }\n\n return Object.values(categories.value).flatMap((c) => c.mime_types);\n });\n\n const allAcceptedInputString = computed(() =>\n allAcceptedMimeTypes.value.join(\",\"),\n );\n\n const maxFileSize = computed(() => mediaConfig.value?.max_file_size ?? 0);\n\n function isAcceptedMimeType(\n mimeType: string,\n filterCategories?: MediaCategory[],\n ): boolean {\n if (!categories.value) {\n return false;\n }\n\n if (!filterCategories || filterCategories.length === 0) {\n return allAcceptedMimeTypes.value.includes(mimeType);\n }\n\n return filterCategories.some((category) =>\n categories.value![category]?.mime_types.includes(mimeType),\n );\n }\n\n function isImageMimeType(mimeType: string): boolean {\n if (!categories.value) {\n return false;\n }\n\n return categories.value.images?.mime_types.includes(mimeType) ?? false;\n }\n\n function getCategoryForMimeType(mimeType: string): MediaCategory | null {\n if (!categories.value) {\n return null;\n }\n\n for (const [category, data] of Object.entries(categories.value)) {\n if (data.mime_types.includes(mimeType)) {\n return category as MediaCategory;\n }\n }\n\n return null;\n }\n\n const availableCategories = computed((): MediaCategory[] => {\n if (!categories.value) {\n return [];\n }\n\n return Object.keys(categories.value) as MediaCategory[];\n });\n\n return {\n isMediaLibraryEnabled,\n allAcceptedMimeTypes,\n allAcceptedInputString,\n maxFileSize,\n availableCategories,\n isAcceptedMimeType,\n isImageMimeType,\n getCategoryForMimeType,\n };\n}\n","export type AspectRatioPreset =\n \"free\" | \"square\" | \"landscape43\" | \"landscape169\" | \"original\";\n\nexport interface AspectRatioOption {\n key: AspectRatioPreset;\n value: number | undefined;\n}\n\nexport const ASPECT_RATIO_VALUES: Record<\n AspectRatioPreset,\n number | undefined\n> = {\n free: undefined,\n square: 1,\n landscape43: 4 / 3,\n landscape169: 16 / 9,\n original: undefined,\n};\n\nexport interface ExportSettings {\n mimeType: string;\n quality: number;\n}\n\nexport function getExportSettings(originalMimeType: string): ExportSettings {\n if (originalMimeType === \"image/png\") {\n return { mimeType: \"image/png\", quality: 1 };\n }\n if (originalMimeType === \"image/gif\") {\n return { mimeType: \"image/png\", quality: 1 };\n }\n if (originalMimeType === \"image/webp\") {\n return { mimeType: \"image/webp\", quality: 0.92 };\n }\n\n return { mimeType: \"image/jpeg\", quality: 0.92 };\n}\n\nexport function resizeCanvas(\n sourceCanvas: HTMLCanvasElement,\n maxWidth?: number,\n maxHeight?: number,\n): HTMLCanvasElement {\n const sourceWidth = sourceCanvas.width;\n const sourceHeight = sourceCanvas.height;\n\n if (!maxWidth && !maxHeight) {\n return sourceCanvas;\n }\n\n let targetWidth = sourceWidth;\n let targetHeight = sourceHeight;\n\n if (maxWidth && sourceWidth > maxWidth) {\n targetWidth = maxWidth;\n targetHeight = Math.round(sourceHeight * (maxWidth / sourceWidth));\n }\n\n if (maxHeight && targetHeight > maxHeight) {\n // Scale width by the ratio against the CURRENT target height (which may\n // already have been reduced by the width branch). The previous formula\n // injected a spurious maxWidth/sourceWidth factor whenever maxWidth was\n // defined but never actually clamped, distorting the aspect ratio.\n const ratio = maxHeight / targetHeight;\n targetWidth = Math.round(targetWidth * ratio);\n targetHeight = maxHeight;\n }\n\n if (targetWidth === sourceWidth && targetHeight === sourceHeight) {\n return sourceCanvas;\n }\n\n const resizedCanvas = document.createElement(\"canvas\");\n resizedCanvas.width = targetWidth;\n resizedCanvas.height = targetHeight;\n\n const ctx = resizedCanvas.getContext(\"2d\");\n if (ctx) {\n ctx.imageSmoothingEnabled = true;\n ctx.imageSmoothingQuality = \"high\";\n ctx.drawImage(sourceCanvas, 0, 0, targetWidth, targetHeight);\n }\n\n return resizedCanvas;\n}\n\nexport function canvasToFile(\n canvas: HTMLCanvasElement,\n filename: string,\n settings: ExportSettings,\n): Promise<File> {\n return new Promise((resolve, reject) => {\n canvas.toBlob(\n (blob) => {\n if (!blob) {\n reject(new Error(\"Failed to create blob from canvas\"));\n return;\n }\n\n const extension = settings.mimeType.split(\"/\")[1];\n const baseFilename = filename.replace(/\\.[^.]+$/, \"\");\n const finalFilename = `${baseFilename}.${extension}`;\n\n const file = new File([blob], finalFilename, {\n type: settings.mimeType,\n });\n resolve(file);\n },\n settings.mimeType,\n settings.quality,\n );\n });\n}\n\nexport function calculateOutputDimensions(\n cropWidth: number,\n cropHeight: number,\n maxWidth?: number,\n maxHeight?: number,\n): { width: number; height: number } {\n let width = cropWidth;\n let height = cropHeight;\n\n if (maxWidth && width > maxWidth) {\n const ratio = maxWidth / width;\n width = maxWidth;\n height = Math.round(height * ratio);\n }\n\n if (maxHeight && height > maxHeight) {\n const ratio = maxHeight / height;\n height = maxHeight;\n width = Math.round(width * ratio);\n }\n\n return { width, height };\n}\n","import{openBlock as t,createBlock as e,renderSlot as i,resolveComponent as n,createVNode as s,withCtx as o,Fragment as r,renderList as a,resolveDynamicComponent as h,withDirectives as c,vShow as l,mergeProps as u,withModifiers as d,createCommentVNode as m}from\"vue\";function p(t,e){var i=Object.keys(t);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(t);e&&(n=n.filter((function(e){return Object.getOwnPropertyDescriptor(t,e).enumerable}))),i.push.apply(i,n)}return i}function g(t){for(var e=1;e<arguments.length;e++){var i=null!=arguments[e]?arguments[e]:{};e%2?p(Object(i),!0).forEach((function(e){f(t,e,i[e])})):Object.getOwnPropertyDescriptors?Object.defineProperties(t,Object.getOwnPropertyDescriptors(i)):p(Object(i)).forEach((function(e){Object.defineProperty(t,e,Object.getOwnPropertyDescriptor(i,e))}))}return t}function f(t,e,i){return e in t?Object.defineProperty(t,e,{value:i,enumerable:!0,configurable:!0,writable:!0}):t[e]=i,t}function v(t,e){if(null==t)return{};var i,n,s=function(t,e){if(null==t)return{};var i,n,s={},o=Object.keys(t);for(n=0;n<o.length;n++)i=o[n],e.indexOf(i)>=0||(s[i]=t[i]);return s}(t,e);if(Object.getOwnPropertySymbols){var o=Object.getOwnPropertySymbols(t);for(n=0;n<o.length;n++)i=o[n],e.indexOf(i)>=0||Object.prototype.propertyIsEnumerable.call(t,i)&&(s[i]=t[i])}return s}function b(t){return function(t){if(Array.isArray(t))return w(t)}(t)||function(t){if(\"undefined\"!=typeof Symbol&&null!=t[Symbol.iterator]||null!=t[\"@@iterator\"])return Array.from(t)}(t)||function(t,e){if(!t)return;if(\"string\"==typeof t)return w(t,e);var i=Object.prototype.toString.call(t).slice(8,-1);\"Object\"===i&&t.constructor&&(i=t.constructor.name);if(\"Map\"===i||\"Set\"===i)return Array.from(t);if(\"Arguments\"===i||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(i))return w(t,e)}(t)||function(){throw new TypeError(\"Invalid attempt to spread non-iterable instance.\\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.\")}()}function w(t,e){(null==e||e>t.length)&&(e=t.length);for(var i=0,n=new Array(e);i<e;i++)n[i]=t[i];return n}var y,z,R,A=(y=function(t){\n/*!\n Copyright (c) 2018 Jed Watson.\n Licensed under the MIT License (MIT), see\n http://jedwatson.github.io/classnames\n*/\n!function(){var e={}.hasOwnProperty;function i(){for(var t=[],n=0;n<arguments.length;n++){var s=arguments[n];if(s){var o=typeof s;if(\"string\"===o||\"number\"===o)t.push(s);else if(Array.isArray(s)){if(s.length){var r=i.apply(null,s);r&&t.push(r)}}else if(\"object\"===o)if(s.toString===Object.prototype.toString)for(var a in s)e.call(s,a)&&s[a]&&t.push(a);else t.push(s.toString())}}return t.join(\" \")}t.exports?(i.default=i,t.exports=i):window.classNames=i}()},y(R={path:z,exports:{},require:function(t,e){return function(){throw new Error(\"Dynamic requires are not currently supported by @rollup/plugin-commonjs\")}(null==e&&R.path)}},R.exports),R.exports),M=function(t){return function(e,i){if(!e)return t;var n;\"string\"==typeof e?n=e:i=e;var s=t;return n&&(s+=\"__\"+n),s+(i?Object.keys(i).reduce((function(t,e){var n=i[e];return n&&(t+=\" \"+(\"boolean\"==typeof n?s+\"--\"+e:s+\"--\"+e+\"_\"+n)),t}),\"\"):\"\")}};function S(t,e,i){var n,s,o,r,a;function h(){var c=Date.now()-r;c<e&&c>=0?n=setTimeout(h,e-c):(n=null,i||(a=t.apply(o,s),o=s=null))}null==e&&(e=100);var c=function(){o=this,s=arguments,r=Date.now();var c=i&&!n;return n||(n=setTimeout(h,e)),c&&(a=t.apply(o,s),o=s=null),a};return c.clear=function(){n&&(clearTimeout(n),n=null)},c.flush=function(){n&&(a=t.apply(o,s),o=s=null,clearTimeout(n),n=null)},c}S.debounce=S;var x=S,C=function(){return C=Object.assign||function(t){for(var e,i=1,n=arguments.length;i<n;i++)for(var s in e=arguments[i])Object.prototype.hasOwnProperty.call(e,s)&&(t[s]=e[s]);return t},C.apply(this,arguments)};\n/*! *****************************************************************************\nCopyright (c) Microsoft Corporation.\n\nPermission to use, copy, modify, and/or distribute this software for any\npurpose with or without fee is hereby granted.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH\nREGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY\nAND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT,\nINDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM\nLOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR\nOTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR\nPERFORMANCE OF THIS SOFTWARE.\n***************************************************************************** */function E(t,e){var i,n;return t&&e?(i=\"\"+t+e[0].toUpperCase()+e.slice(1),n=t+\"-\"+e):(i=t||e,n=t||e),{name:i,classname:n}}function W(t){return/^blob:/.test(t)}function T(t){return W(t)||function(t){return/^data:/.test(t)}(t)}function O(t){return!!(t&&t.constructor&&t.call&&t.apply)}function D(t){return void 0===t}function H(t){return\"object\"==typeof t&&null!==t}function j(t,e,i){var n={};return H(t)?(Object.keys(e).forEach((function(s){D(t[s])?n[s]=e[s]:H(e[s])?H(t[s])?n[s]=j(t[s],e[s],i[s]):n[s]=t[s]?e[s]:i[s]:!0===e[s]||!1===e[s]?n[s]=Boolean(t[s]):n[s]=t[s]})),n):t?e:i}function L(t){var e=Number(t);return Number.isNaN(e)?t:e}function P(t){return typeof(\"number\"==t||function(t){return\"object\"==typeof t&&null!==t}(t)&&\"[object Number]\"==toString.call(t))&&!$(t)}function $(t){return t!=t}function I(t,e){return Math.sqrt(Math.pow(t.x-e.x,2)+Math.pow(t.y-e.y,2))}var B=function(t,e){void 0===t&&(t={}),void 0===e&&(e={}),this.type=\"manipulateImage\",this.move=t,this.scale=e},X=function(t,e){void 0===e&&(e={}),this.type=\"resize\",this.directions=t,this.params=e},Y=function(t){this.type=\"move\",this.directions=t},k=function(){function t(t,e,i,n,s){this.type=\"drag\",this.nativeEvent=t,this.position=i,this.previousPosition=n,this.element=e,this.anchor=s}return t.prototype.shift=function(){var t=this,e=t.element,i=t.anchor,n=t.position;if(e){var s=e.getBoundingClientRect(),o=s.left,r=s.top;return{left:n.left-o-i.left,top:n.top-r-i.top}}return{left:0,top:0}},t}(),F={name:\"DraggableElement\",props:{classname:{type:String}},beforeMount:function(){window.addEventListener(\"mouseup\",this.onMouseUp,{passive:!1}),window.addEventListener(\"mousemove\",this.onMouseMove,{passive:!1}),window.addEventListener(\"touchmove\",this.onTouchMove,{passive:!1}),window.addEventListener(\"touchend\",this.onTouchEnd,{passive:!1})},beforeUnmount:function(){window.removeEventListener(\"mouseup\",this.onMouseUp),window.removeEventListener(\"mousemove\",this.onMouseMove),window.removeEventListener(\"touchmove\",this.onTouchMove),window.removeEventListener(\"touchend\",this.onTouchEnd)},mounted:function(){if(!this.$refs.draggable)throw new Error('You should add ref \"draggable\" to your root element to use draggable mixin');this.touches=[],this.hovered=!1},methods:{onMouseOver:function(){this.hovered||(this.hovered=!0,this.$emit(\"enter\"))},onMouseLeave:function(){this.hovered&&!this.touches.length&&(this.hovered=!1,this.$emit(\"leave\"))},onTouchStart:function(t){t.cancelable&&!this.disabled&&1===t.touches.length&&(this.touches=b(t.touches),this.hovered||(this.$emit(\"enter\"),this.hovered=!0),t.touches.length&&this.initAnchor(this.touches.reduce((function(e,i){return{clientX:e.clientX+i.clientX/t.touches.length,clientY:e.clientY+i.clientY/t.touches.length}}),{clientX:0,clientY:0})),t.preventDefault&&t.preventDefault(),t.stopPropagation())},onTouchEnd:function(){this.processEnd()},onTouchMove:function(t){this.touches.length&&(this.processMove(t,t.touches),t.preventDefault&&t.preventDefault(),t.stopPropagation&&t.stopPropagation())},onMouseDown:function(t){if(!this.disabled){var e={fake:!0,clientX:t.clientX,clientY:t.clientY};this.touches=[e],this.initAnchor(e),t.stopPropagation()}},onMouseMove:function(t){this.touches.length&&(this.processMove(t,[{fake:!0,clientX:t.clientX,clientY:t.clientY}]),t.preventDefault&&t.preventDefault())},onMouseUp:function(){this.processEnd()},initAnchor:function(t){var e=this.$refs.draggable.getBoundingClientRect(),i=e.left,n=e.right,s=e.bottom,o=e.top;this.anchor={left:t.clientX-i,top:t.clientY-o,bottom:s-t.clientY,right:n-t.clientX}},processMove:function(t,e){var i=b(e);if(this.touches.length){if(1===this.touches.length&&1===i.length){var n=this.$refs.draggable;this.$emit(\"drag\",new k(t,n,{left:i[0].clientX,top:i[0].clientY},{left:this.touches[0].clientX,top:this.touches[0].clientY},this.anchor))}this.touches=i}},processEnd:function(){this.touches.length&&this.$emit(\"drag-end\"),this.hovered&&(this.$emit(\"leave\"),this.hovered=!1),this.touches=[]}},emits:[\"drag\",\"drag-end\",\"leave\",\"enter\"]};F.render=function(n,s,o,r,a,h){return t(),e(\"div\",{ref:\"draggable\",class:o.classname,onTouchstart:s[1]||(s[1]=function(){return h.onTouchStart&&h.onTouchStart.apply(h,arguments)}),onMousedown:s[2]||(s[2]=function(){return h.onMouseDown&&h.onMouseDown.apply(h,arguments)}),onMouseover:s[3]||(s[3]=function(){return h.onMouseOver&&h.onMouseOver.apply(h,arguments)}),onMouseleave:s[4]||(s[4]=function(){return h.onMouseLeave&&h.onMouseLeave.apply(h,arguments)})},[i(n.$slots,\"default\")],34)};var U=M(\"vue-handler-wrapper\"),N={name:\"HandlerWrapper\",components:{DraggableElement:F},props:{horizontalPosition:{type:String},verticalPosition:{type:String},disabled:{type:Boolean,default:!1}},computed:{classes:function(){var t;if(this.horizontalPosition||this.verticalPosition){var e,i=E(this.horizontalPosition,this.verticalPosition);t=U((f(e={},i.classname,!0),f(e,\"disabled\",this.disabled),e))}else t=U({disabled:this.disabled});return{root:t,draggable:U(\"draggable\")}}},emits:[\"leave\",\"enter\",\"drag\",\"drag-end\"]};N.render=function(r,a,h,c,l,u){var d=n(\"DraggableElement\");return t(),e(\"div\",{class:u.classes.root},[s(d,{class:u.classes.draggable,onDrag:a[1]||(a[1]=function(t){return r.$emit(\"drag\",t)}),onDragEnd:a[2]||(a[2]=function(t){return r.$emit(\"drag-end\")}),onLeave:a[3]||(a[3]=function(t){return r.$emit(\"leave\")}),onEnter:a[4]||(a[4]=function(t){return r.$emit(\"enter\")})},{default:o((function(){return[i(r.$slots,\"default\")]})),_:3},8,[\"class\"])],2)};var Z=M(\"vue-line-wrapper\"),q={name:\"LineWrapper\",components:{DraggableElement:F},props:{position:{type:String,required:!0},disabled:{type:Boolean,default:!1}},computed:{classname:function(){var t;return Z((f(t={},this.position,!0),f(t,\"disabled\",this.disabled),t))}},emits:[\"leave\",\"enter\",\"drag\",\"drag-end\"]};q.render=function(s,r,a,h,c,l){var u=n(\"DraggableElement\");return t(),e(u,{class:l.classname,onDrag:r[1]||(r[1]=function(t){return s.$emit(\"drag\",t)}),onDragEnd:r[2]||(r[2]=function(t){return s.$emit(\"drag-end\")}),onLeave:r[3]||(r[3]=function(t){return s.$emit(\"leave\")}),onEnter:r[4]||(r[4]=function(t){return s.$emit(\"enter\")})},{default:o((function(){return[i(s.$slots,\"default\")]})),_:3},8,[\"class\"])};var V=[\"left\",\"right\",\"top\",\"bottom\"],_=[\"left\",\"right\"],G=[\"top\",\"bottom\"],Q=[\"left\",\"top\"],K=[\"fill-area\",\"fit-area\",\"stencil\",\"none\"],J={left:0,top:0,width:0,height:0};function tt(t,e,i){return!(i=i||[\"width\",\"height\",\"left\",\"top\"]).some((function(i){return t[i]!==e[i]}))}function et(t){return{left:t.left,top:t.top,right:t.left+t.width,bottom:t.top+t.height}}function it(t,e){return{left:t.left-e.left,top:t.top-e.top}}function nt(t){return{left:t.left+t.width/2,top:t.top+t.height/2}}function st(t,e){var i={left:0,top:0,right:0,bottom:0};return V.forEach((function(n){var s=e[n],o=et(t)[n];i[n]=void 0!==s&&void 0!==o?\"left\"===n||\"top\"===n?Math.max(0,s-o):Math.max(0,o-s):0})),i}function ot(t,e){return{left:t.left-e.left,top:t.top-e.top,width:t.width+e.left+e.right,height:t.height+e.top+e.bottom}}function rt(t){return{left:-t.left,top:-t.top}}function at(t,e){return C(C({},t),{left:t.left+e.left,top:t.top+e.top})}function ht(t,e,i,n){if(1!==e){if(i){var s=nt(t);return{width:t.width*e,height:t.height*e,left:t.left+t.width*(1-e)/2+(i.left-s.left)*(n||1-e),top:t.top+t.height*(1-e)/2+(i.top-s.top)*(n||1-e)}}return{width:t.width*e,height:t.height*e,left:t.left+t.width*(1-e)/2,top:t.top+t.height*(1-e)/2}}return t}function ct(t){return t.width/t.height}function lt(t,e){return Math.min(void 0!==e.right&&void 0!==e.left?(e.right-e.left)/t.width:1/0,void 0!==e.bottom&&void 0!==e.top?(e.bottom-e.top)/t.height:1/0)}function ut(t,e){var i={left:0,top:0},n=st(t,e);return n.left&&n.left>0?i.left=n.left:n.right&&n.right>0&&(i.left=-n.right),n.top&&n.top>0?i.top=n.top:n.bottom&&n.bottom>0&&(i.top=-n.bottom),i}function dt(t,e){var i;return e.minimum&&t<e.minimum?i=e.minimum:e.maximum&&t>e.maximum&&(i=e.maximum),i}function mt(t,e){var i=ct(t),n=ct(e);return e.width<1/0&&e.height<1/0?i>n?{width:e.width,height:e.width/i}:{width:e.height*i,height:e.height}:e.width<1/0?{width:e.width,height:e.width/i}:e.height<1/0?{width:e.height*i,height:e.height}:t}function pt(t,e){var i=e*Math.PI/180;return{width:Math.abs(t.width*Math.cos(i))+Math.abs(t.height*Math.sin(i)),height:Math.abs(t.width*Math.sin(i))+Math.abs(t.height*Math.cos(i))}}function gt(t,e){var i=e*Math.PI/180;return{left:t.left*Math.cos(i)-t.top*Math.sin(i),top:t.left*Math.sin(i)+t.top*Math.cos(i)}}function ft(t,e){var i=st(vt(t,e),e);return i.left+i.right+i.top+i.bottom?i.left+i.right>i.top+i.bottom?Math.min((t.width+i.left+i.right)/t.width,lt(t,e)):Math.min((t.height+i.top+i.bottom)/t.height,lt(t,e)):1}function vt(t,e,i){void 0===i&&(i=!1);var n=ut(t,e);return at(t,i?rt(n):n)}function bt(t){return{width:void 0!==t.right&&void 0!==t.left?t.right-t.left:1/0,height:void 0!==t.bottom&&void 0!==t.top?t.bottom-t.top:1/0}}function wt(t,e){return C(C({},t),{minWidth:Math.min(e.width,t.minWidth),minHeight:Math.min(e.height,t.minHeight),maxWidth:Math.min(e.width,t.maxWidth),maxHeight:Math.min(e.height,t.maxHeight)})}function yt(t,e,i){void 0===i&&(i=!0);var n={};return V.forEach((function(s){var o=t[s],r=e[s];void 0!==o&&void 0!==r?n[s]=\"left\"===s||\"top\"===s?i?Math.max(o,r):Math.min(o,r):i?Math.min(o,r):Math.max(o,r):void 0!==r?n[s]=r:void 0!==o&&(n[s]=o)})),n}function zt(t,e){return yt(t,e,!0)}function Rt(t){var e=t.size,i=t.aspectRatio,n=t.ignoreMinimum,s=t.sizeRestrictions;return Boolean((e.correctRatio||ct(e)>=i.minimum&&ct(e)<=i.maximum)&&e.height<=s.maxHeight&&e.width<=s.maxWidth&&e.width&&e.height&&(n||e.height>=s.minHeight&&e.width>=s.minWidth))}function At(t,e){return Math.pow(t.width-e.width,2)+Math.pow(t.height-e.height,2)}function Mt(t){var e=t.width,i=t.height,n=t.sizeRestrictions,s={minimum:t.aspectRatio&&t.aspectRatio.minimum||0,maximum:t.aspectRatio&&t.aspectRatio.maximum||1/0},o={width:Math.max(n.minWidth,Math.min(n.maxWidth,e)),height:Math.max(n.minHeight,Math.min(n.maxHeight,i))};function r(t,o){return void 0===o&&(o=!1),t.reduce((function(t,r){return Rt({size:r,aspectRatio:s,sizeRestrictions:n,ignoreMinimum:o})&&(!t||At(r,{width:e,height:i})<At(t,{width:e,height:i}))?r:t}),null)}var a=[];s&&[s.minimum,s.maximum].forEach((function(t){t&&a.push({width:o.width,height:o.width/t,correctRatio:!0},{width:o.height*t,height:o.height,correctRatio:!0})})),Rt({size:o,aspectRatio:s,sizeRestrictions:n})&&a.push(o);var h=r(a)||r(a,!0);return h&&{width:h.width,height:h.height}}function St(t){var e=t.event,i=t.coordinates,n=t.positionRestrictions,s=void 0===n?{}:n,o=at(i,e.directions);return at(o,ut(o,s))}function xt(t){var e=t.coordinates,i=t.transform,n=t.imageSize,s=t.sizeRestrictions,o=t.positionRestrictions,r=t.aspectRatio,a=t.visibleArea,h=function(t,e){return St({coordinates:t,positionRestrictions:o,event:new Y({left:e.left-t.left,top:e.top-t.top})})},c=C({},e);return(Array.isArray(i)?i:[i]).forEach((function(t){var e={};D((e=\"function\"==typeof t?t({coordinates:c,imageSize:n,visibleArea:a}):t).width)&&D(e.height)||(c=function(t,e){var i=C(C(C({},t),Mt({width:e.width,height:e.height,sizeRestrictions:s,aspectRatio:r})),{left:0,top:0});return h(i,{left:t.left,top:t.top})}(c,C(C({},c),e))),D(e.left)&&D(e.top)||(c=h(c,C(C({},c),e)))})),c}function Ct(t){t.event;var e=t.getAreaRestrictions,i=t.boundaries,n=t.coordinates,s=t.visibleArea;t.aspectRatio;var o=t.stencilSize,r=t.sizeRestrictions,a=t.positionRestrictions;t.stencilReference;var h,c,l,u=C({},n),d=C({},s),m=C({},o);h=ct(m),c=ct(u),void 0===l&&(l=.001),(0===h||0===c?Math.abs(c-h)<l:Math.abs(c/h)<1+l&&Math.abs(c/h)>1-l)||(u=C(C({},u),Mt({sizeRestrictions:r,width:u.width,height:u.height,aspectRatio:{minimum:ct(m),maximum:ct(m)}})));var p=ft(d=ht(d,u.width*i.width/(d.width*m.width)),e({visibleArea:d,type:\"resize\"}));return 1!==p&&(d=ht(d,p),u=ht(u,p)),d=vt(d=at(d,it(nt(u),nt(d))),e({visibleArea:d,type:\"move\"})),{coordinates:u=vt(u,zt(et(d),a)),visibleArea:d}}function Et(t){var e=t.event,i=t.getAreaRestrictions,n=t.boundaries,s=t.coordinates,o=t.visibleArea;t.aspectRatio,t.stencilSize,t.sizeRestrictions;var r=t.positionRestrictions;t.stencilReference;var a=C({},s),h=C({},o);if(s&&o&&\"manipulateImage\"!==e.type){var c={width:0,height:0};h.width,n.width,ct(n)>ct(a)?(c.height=.8*n.height,c.width=c.height*ct(a)):(c.width=.8*n.width,c.height=c.width*ct(a));var l=ft(h=ht(h,a.width*n.width/(h.width*c.width)),i({visibleArea:h,type:\"resize\"}));h=ht(h,l),1!==l&&(c.height/=l,c.width/=l),h=vt(h=at(h,it(nt(a),nt(h))),i({visibleArea:h,type:\"move\"})),a=vt(a,zt(et(h),r))}return{coordinates:a,visibleArea:h}}function Wt(t){var e=t.event,i=t.coordinates,n=t.visibleArea,s=t.getAreaRestrictions,o=C({},n),r=C({},i);if(\"setCoordinates\"===e.type){var a=Math.max(0,r.width-o.width),h=Math.max(0,r.height-o.height);a>h?o=ht(o,Math.min(r.width/o.width,lt(o,s({visibleArea:o,type:\"resize\"})))):h>a&&(o=ht(o,Math.min(r.height/o.height,lt(o,s({visibleArea:o,type:\"resize\"}))))),o=vt(o=at(o,rt(ut(r,et(o)))),s({visibleArea:o,type:\"move\"}))}return{visibleArea:o,coordinates:r}}function Tt(t){var e=t.imageSize,i=t.visibleArea,n=t.coordinates,s=i||e;return{left:(i?i.left:0)+s.width/2-n.width/2,top:(i?i.top:0)+s.height/2-n.height/2}}function Ot(t){var e=t.imageSize,i=t.visibleArea,n=t.aspectRatio,s=t.sizeRestrictions,o=i||e,r=Math.min(n.maximum||1/0,Math.max(n.minimum||0,ct(o))),a=o.width<o.height?{width:.8*o.width,height:.8*o.width/r}:{height:.8*o.height,width:.8*o.height*r};return Mt(C(C({},a),{aspectRatio:n,sizeRestrictions:s}))}function Dt(t){var e,i,n=t.imageSize,s=t.visibleArea,o=t.boundaries,r=t.aspectRatio,a=t.sizeRestrictions,h=t.stencilSize,c=s||n;return ct(c)>ct(o)?i=(e=h.height*c.height/o.height)*ct(h):e=(i=h.width*c.width/o.width)/ct(h),Mt({width:i,height:e,aspectRatio:r,sizeRestrictions:a})}function Ht(t){var e=t.getAreaRestrictions,i=t.coordinates,n=t.imageSize,s=ct(t.boundaries);if(i){var o={height:Math.max(i.height,n.height),width:Math.max(i.width,n.width)},r=mt({width:ct(o)>s?o.width:o.height*s,height:ct(o)>s?o.width/s:o.height},bt(e())),a={left:i.left+i.width/2-r.width/2,top:i.top+i.height/2-r.height/2,width:r.width,height:r.height},h=st(i,et(C({left:0,top:0},n))),c={};return!h.left&&!h.right&&a.width<=n.width&&(c.left=0,c.right=n.width),!h.top&&!h.bottom&&a.height<=n.height&&(c.top=0,c.bottom=n.height),vt(a,c)}var l=ct(n);r={height:l>s?n.height:n.width/s,width:l>s?n.height*s:n.width};return{left:n.width/2-r.width/2,top:n.height/2-r.height/2,width:r.width,height:r.height}}function jt(t,e){return yt(t,et(e))}function Lt(t){var e=t.event,i=t.coordinates,n=t.visibleArea,s=t.sizeRestrictions,o=t.getAreaRestrictions,r=t.positionRestrictions,a=t.adjustStencil,h=e.scale,c=e.move,l=C({},n),u=C({},i),d=1,m=1,p=h.factor&&Math.abs(h.factor-1)>.001;l=at(l,{left:c.left||0,top:c.top||0});var g={stencil:{minimum:Math.max(s.minWidth?s.minWidth/u.width:0,s.minHeight?s.minHeight/u.height:0),maximum:Math.min(s.maxWidth?s.maxWidth/u.width:1/0,s.maxHeight?s.maxHeight/u.height:1/0,lt(u,r))},area:{maximum:lt(l,o({visibleArea:l,type:\"resize\"}))}};h.factor&&p&&(h.factor<1?(m=Math.max(h.factor,g.stencil.minimum))>1&&(m=1):h.factor>1&&(m=Math.min(h.factor,Math.min(g.area.maximum,g.stencil.maximum)))<1&&(m=1)),m&&(l=ht(l,m,h.center));var f=i.left-n.left,v=n.width+n.left-(i.width+i.left),b=i.top-n.top,w=n.height+n.top-(i.height+i.top);return l=vt(l=at(l,ut(l,{left:void 0!==r.left?r.left-f*m:void 0,top:void 0!==r.top?r.top-b*m:void 0,bottom:void 0!==r.bottom?r.bottom+w*m:void 0,right:void 0!==r.right?r.right+v*m:void 0})),o({visibleArea:l,type:\"move\"})),u.width=u.width*m,u.height=u.height*m,u.left=l.left+f*m,u.top=l.top+b*m,u=vt(u,zt(et(l),r)),h.factor&&p&&a&&(h.factor>1?d=Math.min(g.area.maximum,h.factor)/m:h.factor<1&&(d=Math.max(u.height/l.height,u.width/l.width,h.factor/m)),1!==d&&(l=at(l=vt(l=ht(l,d,h.factor>1?h.center:nt(u)),o({visibleArea:l,type:\"move\"})),rt(ut(u,et(l)))))),{coordinates:u,visibleArea:l}}function Pt(t){var e=t.aspectRatio,i=t.getAreaRestrictions,n=t.coordinates,s=t.visibleArea,o=t.sizeRestrictions,r=t.positionRestrictions,a=t.imageSize,h=t.previousImageSize,c=t.angle,l=C({},n),u=C({},s),d=gt(nt(C({left:0,top:0},h)),c);return(l=C(C({},Mt({sizeRestrictions:o,aspectRatio:e,width:l.width,height:l.height})),gt(nt(l),c))).left-=d.left-a.width/2+l.width/2,l.top-=d.top-a.height/2+l.height/2,u=ht(u,ft(u,i({visibleArea:u,type:\"resize\"}))),{coordinates:l=vt(l,r),visibleArea:u=vt(u=at(u,it(nt(l),nt(n))),i({visibleArea:u,type:\"move\"}))}}function $t(t){var e=t.flip,i=t.previousFlip,n=t.rotate;t.aspectRatio;var s=t.getAreaRestrictions,o=t.coordinates,r=t.visibleArea,a=t.imageSize,h=C({},o),c=C({},r),l=i.horizontal!==e.horizontal,u=i.vertical!==e.vertical;if(l||u){var d=gt({left:a.width/2,top:a.height/2},-n),m=gt(nt(h),-n),p=gt({left:l?d.left-(m.left-d.left):m.left,top:u?d.top-(m.top-d.top):m.top},n);h=at(h,it(p,nt(h))),m=gt(nt(c),-n),c=vt(c=at(c,it(p=gt({left:l?d.left-(m.left-d.left):m.left,top:u?d.top-(m.top-d.top):m.top},n),nt(c))),s({visibleArea:c,type:\"move\"}))}return{coordinates:h,visibleArea:c}}function It(t){var e=t.directions,i=t.coordinates,n=t.positionRestrictions,s=void 0===n?{}:n,o=t.sizeRestrictions,r=t.preserveRatio,a=t.compensate,h=C({},e),c=ot(i,h).width,l=ot(i,h).height;c<0&&(h.left<0&&h.right<0?(h.left=-(i.width-o.minWidth)/(h.left/h.right),h.right=-(i.width-o.minWidth)/(h.right/h.left)):h.left<0?h.left=-(i.width-o.minWidth):h.right<0&&(h.right=-(i.width-o.minWidth))),l<0&&(h.top<0&&h.bottom<0?(h.top=-(i.height-o.minHeight)/(h.top/h.bottom),h.bottom=-(i.height-o.minHeight)/(h.bottom/h.top)):h.top<0?h.top=-(i.height-o.minHeight):h.bottom<0&&(h.bottom=-(i.height-o.minHeight)));var u=st(ot(i,h),s);a&&(u.left&&u.left>0&&0===u.right?(h.right+=u.left,h.left-=u.left):u.right&&u.right>0&&0===u.left&&(h.left+=u.right,h.right-=u.right),u.top&&u.top>0&&0===u.bottom?(h.bottom+=u.top,h.top-=u.top):u.bottom&&u.bottom>0&&0===u.top&&(h.top+=u.bottom,h.bottom-=u.bottom),u=st(ot(i,h),s));var d={width:1/0,height:1/0,left:1/0,right:1/0,top:1/0,bottom:1/0};if(V.forEach((function(t){var e=u[t];e&&h[t]&&(d[t]=Math.max(0,1-e/h[t]))})),r){var m=Math.min.apply(null,V.map((function(t){return d[t]})));m!==1/0&&V.forEach((function(t){h[t]*=m}))}else V.forEach((function(t){d[t]!==1/0&&(h[t]*=d[t])}));if(c=ot(i,h).width,l=ot(i,h).height,h.right+h.left&&(c>o.maxWidth?d.width=(o.maxWidth-i.width)/(h.right+h.left):c<o.minWidth&&(d.width=(o.minWidth-i.width)/(h.right+h.left))),h.bottom+h.top&&(l>o.maxHeight?d.height=(o.maxHeight-i.height)/(h.bottom+h.top):l<o.minHeight&&(d.height=(o.minHeight-i.height)/(h.bottom+h.top))),r){var p=Math.min(d.width,d.height);p!==1/0&&V.forEach((function(t){h[t]*=p}))}else d.width!==1/0&&_.forEach((function(t){h[t]*=d.width})),d.height!==1/0&&G.forEach((function(t){h[t]*=d.height}));return h}function Bt(t,e,i){return 0==e&&0==i?t/2:0==e?0:0==i?t:t*Math.abs(e/(e+i))}var Xt=M(\"vue-simple-handler\"),Yt=M(\"vue-simple-handler-wrapper\"),kt={name:\"SimpleHandler\",components:{HandlerWrapper:N},props:{defaultClass:{type:String},hoverClass:{type:String},wrapperClass:{type:String},horizontalPosition:{type:String},verticalPosition:{type:String},disabled:{type:Boolean,default:!1}},data:function(){return{hover:!1}},computed:{classes:function(){var t,e=(f(t={},this.horizontalPosition,Boolean(this.horizontalPosition)),f(t,this.verticalPosition,Boolean(this.verticalPosition)),f(t,\"\".concat(this.horizontalPosition,\"-\").concat(this.verticalPosition),Boolean(this.verticalPosition&&this.horizontalPosition)),f(t,\"hover\",this.hover),t);return{default:A(Xt(e),this.defaultClass,this.hover&&this.hoverClass),wrapper:A(Yt(e),this.wrapperClass)}}},methods:{onDrag:function(t){this.$emit(\"drag\",t)},onEnter:function(){this.hover=!0},onLeave:function(){this.hover=!1},onDragEnd:function(){this.$emit(\"drag-end\")}},emits:[\"drag\",\"drag-end\"]};kt.render=function(i,r,a,h,c,l){var u=n(\"HandlerWrapper\");return t(),e(u,{class:l.classes.wrapper,\"vertical-position\":a.verticalPosition,\"horizontal-position\":a.horizontalPosition,disabled:a.disabled,onDrag:l.onDrag,onDragEnd:l.onDragEnd,onEnter:l.onEnter,onLeave:l.onLeave},{default:o((function(){return[s(\"div\",{class:l.classes.default},null,2)]})),_:1},8,[\"class\",\"vertical-position\",\"horizontal-position\",\"disabled\",\"onDrag\",\"onDragEnd\",\"onEnter\",\"onLeave\"])};var Ft=M(\"vue-simple-line\"),Ut=M(\"vue-simple-line-wrapper\"),Nt={name:\"SimpleLine\",components:{LineWrapper:q},props:{defaultClass:{type:String},hoverClass:{type:String},wrapperClass:{type:String},position:{type:String},disabled:{type:Boolean,default:!1}},data:function(){return{hover:!1}},computed:{classes:function(){return{root:A(Ft(f({},this.position,!0)),this.defaultClass,this.hover&&this.hoverClass),wrapper:A(Ut(f({},this.position,!0)),this.wrapperClass)}}},methods:{onDrag:function(t){this.$emit(\"drag\",t)},onEnter:function(){this.hover=!0},onLeave:function(){this.hover=!1},onDragEnd:function(){this.$emit(\"drag-end\")}},emits:[\"drag\",\"drag-end\"]};Nt.render=function(i,r,a,h,c,l){var u=n(\"LineWrapper\");return t(),e(u,{class:l.classes.wrapper,position:a.position,disabled:a.disabled,onDrag:l.onDrag,onDragEnd:l.onDragEnd,onEnter:l.onEnter,onLeave:l.onLeave},{default:o((function(){return[s(\"div\",{class:l.classes.root},null,2)]})),_:1},8,[\"class\",\"position\",\"disabled\",\"onDrag\",\"onDragEnd\",\"onEnter\",\"onLeave\"])};var Zt=M(\"vue-bounding-box\"),qt=[\"east\",\"west\",null],Vt=[\"south\",\"north\",null],_t={name:\"BoundingBox\",props:{width:{type:Number},height:{type:Number},transitions:{type:Object},handlers:{type:Object,default:function(){return{eastNorth:!0,north:!0,westNorth:!0,west:!0,westSouth:!0,south:!0,eastSouth:!0,east:!0}}},handlersComponent:{type:[Object,String],default:function(){return kt}},handlersClasses:{type:Object,default:function(){return{}}},handlersWrappersClasses:{type:Object,default:function(){return{}}},lines:{type:Object,default:function(){return{west:!0,north:!0,east:!0,south:!0}}},linesComponent:{type:[Object,String],default:function(){return Nt}},linesClasses:{type:Object,default:function(){return{}}},linesWrappersClasses:{type:Object,default:function(){return{}}},resizable:{type:Boolean,default:!0}},data:function(){var t=[];return qt.forEach((function(e){Vt.forEach((function(i){if(e!==i){var n=E(e,i),s=n.name,o=n.classname;t.push({name:s,classname:o,verticalDirection:i,horizontalDirection:e})}}))})),{points:t}},computed:{style:function(){var t={};return this.width&&this.height&&(t.width=\"\".concat(this.width,\"px\"),t.height=\"\".concat(this.height,\"px\"),this.transitions&&this.transitions.enabled&&(t.transition=\"\".concat(this.transitions.time,\"ms \").concat(this.transitions.timingFunction))),t},classes:function(){var t=this.handlersClasses,e=this.handlersWrappersClasses,i=this.linesClasses,n=this.linesWrappersClasses;return{root:Zt(),handlers:t,handlersWrappers:e,lines:i,linesWrappers:n}},lineNodes:function(){var t=this,e=[];return this.points.forEach((function(i){i.horizontalDirection&&i.verticalDirection||!t.lines[i.name]||e.push({name:i.name,component:t.linesComponent,class:A(t.classes.lines.default,t.classes.lines[i.name],!t.resizable&&t.classes.lines.disabled),wrapperClass:A(t.classes.linesWrappers.default,t.classes.linesWrappers[i.name],!t.resizable&&t.classes.linesWrappers.disabled),hoverClass:t.classes.lines.hover,verticalDirection:i.verticalDirection,horizontalDirection:i.horizontalDirection,disabled:!t.resizable})})),e},handlerNodes:function(){var t=this,e=[],i=this.width,n=this.height;return this.points.forEach((function(s){if(t.handlers[s.name]){var o={name:s.name,component:t.handlersComponent,class:A(t.classes.handlers.default,t.classes.handlers[s.name]),wrapperClass:A(t.classes.handlersWrappers.default,t.classes.handlersWrappers[s.name]),hoverClass:t.classes.handlers.hover,verticalDirection:s.verticalDirection,horizontalDirection:s.horizontalDirection,disabled:!t.resizable};if(i&&n){var r=s.horizontalDirection,a=s.verticalDirection,h=\"east\"===r?i:\"west\"===r?0:i/2,c=\"south\"===a?n:\"north\"===a?0:n/2;o.wrapperClass=Zt(\"handler\"),o.wrapperStyle={transform:\"translate(\".concat(h,\"px, \").concat(c,\"px)\")},t.transitions&&t.transitions.enabled&&(o.wrapperStyle.transition=\"\".concat(t.transitions.time,\"ms \").concat(t.transitions.timingFunction))}else o.wrapperClass=Zt(\"handler\",f({},s.classname,!0));e.push(o)}})),e}},beforeMount:function(){window.addEventListener(\"mouseup\",this.onMouseUp,{passive:!1}),window.addEventListener(\"mousemove\",this.onMouseMove,{passive:!1}),window.addEventListener(\"touchmove\",this.onTouchMove,{passive:!1}),window.addEventListener(\"touchend\",this.onTouchEnd,{passive:!1})},beforeUnmount:function(){window.removeEventListener(\"mouseup\",this.onMouseUp),window.removeEventListener(\"mousemove\",this.onMouseMove),window.removeEventListener(\"touchmove\",this.onTouchMove),window.removeEventListener(\"touchend\",this.onTouchEnd)},mounted:function(){this.touches=[]},methods:{onEnd:function(){this.$emit(\"resize-end\")},onHandlerDrag:function(t,e,i){var n,s=t.shift(),o=s.left,r=s.top,a={left:0,right:0,top:0,bottom:0};\"west\"===e?a.left-=o:\"east\"===e&&(a.right+=o),\"north\"===i?a.top-=r:\"south\"===i&&(a.bottom+=r),!i&&e?n=\"width\":i&&!e&&(n=\"height\"),this.resizable&&this.$emit(\"resize\",new X(a,{allowedDirections:{left:\"west\"===e||!e,right:\"east\"===e||!e,bottom:\"south\"===i||!i,top:\"north\"===i||!i},preserveAspectRatio:t.nativeEvent&&t.nativeEvent.shiftKey,respectDirection:n}))}},emits:[\"resize\",\"resize-end\"]};_t.render=function(n,o,c,l,u,d){return t(),e(\"div\",{ref:\"box\",class:d.classes.root,style:d.style},[i(n.$slots,\"default\"),s(\"div\",null,[(t(!0),e(r,null,a(d.lineNodes,(function(i){return t(),e(h(i.component),{key:i.name,\"default-class\":i.class,\"hover-class\":i.hoverClass,\"wrapper-class\":i.wrapperClass,position:i.name,disabled:i.disabled,onDrag:function(t){return d.onHandlerDrag(t,i.horizontalDirection,i.verticalDirection)},onDragEnd:o[1]||(o[1]=function(t){return d.onEnd()})},null,8,[\"default-class\",\"hover-class\",\"wrapper-class\",\"position\",\"disabled\",\"onDrag\"])})),128))]),(t(!0),e(r,null,a(d.handlerNodes,(function(i){return t(),e(\"div\",{key:i.name,style:i.wrapperStyle,class:i.wrapperClass},[(t(),e(h(i.component),{\"default-class\":i.class,\"hover-class\":i.hoverClass,\"wrapper-class\":i.wrapperClass,\"horizontal-position\":i.horizontalDirection,\"vertical-position\":i.verticalDirection,disabled:i.disabled,onDrag:function(t){return d.onHandlerDrag(t,i.horizontalDirection,i.verticalDirection)},onDragEnd:o[2]||(o[2]=function(t){return d.onEnd()})},null,8,[\"default-class\",\"hover-class\",\"wrapper-class\",\"horizontal-position\",\"vertical-position\",\"disabled\",\"onDrag\"]))],6)})),128))],6)};var Gt=M(\"vue-draggable-area\"),Qt={name:\"DraggableArea\",props:{movable:{type:Boolean,default:!0},activationDistance:{type:Number,default:20}},computed:{classnames:function(){return{default:Gt()}}},beforeMount:function(){window.addEventListener(\"mouseup\",this.onMouseUp,{passive:!1}),window.addEventListener(\"mousemove\",this.onMouseMove,{passive:!1}),window.addEventListener(\"touchmove\",this.onTouchMove,{passive:!1}),window.addEventListener(\"touchend\",this.onTouchEnd,{passive:!1})},beforeUnmount:function(){window.removeEventListener(\"mouseup\",this.onMouseUp),window.removeEventListener(\"mousemove\",this.onMouseMove),window.removeEventListener(\"touchmove\",this.onTouchMove),window.removeEventListener(\"touchend\",this.onTouchEnd)},mounted:function(){this.touches=[],this.touchStarted=!1},methods:{onTouchStart:function(t){if(t.cancelable){var e=this.movable&&1===t.touches.length;e&&(this.touches=b(t.touches)),(this.touchStarted||e)&&(t.preventDefault(),t.stopPropagation())}},onTouchEnd:function(){this.touchStarted=!1,this.processEnd()},onTouchMove:function(t){this.touches.length>=1&&(this.touchStarted?(this.processMove(t,t.touches),t.preventDefault(),t.stopPropagation()):I({x:this.touches[0].clientX,y:this.touches[0].clientY},{x:t.touches[0].clientX,y:t.touches[0].clientY})>this.activationDistance&&(this.initAnchor({clientX:t.touches[0].clientX,clientY:t.touches[0].clientY}),this.touchStarted=!0))},onMouseDown:function(t){if(this.movable&&0===t.button){var e={fake:!0,clientX:t.clientX,clientY:t.clientY};this.touches=[e],this.initAnchor(e),t.stopPropagation()}},onMouseMove:function(t){this.touches.length&&(this.processMove(t,[{fake:!0,clientX:t.clientX,clientY:t.clientY}]),t.preventDefault&&t.cancelable&&t.preventDefault(),t.stopPropagation())},onMouseUp:function(){this.processEnd()},initAnchor:function(t){var e=this.$refs.container.getBoundingClientRect(),i=e.left,n=e.top;this.anchor={x:t.clientX-i,y:t.clientY-n}},processMove:function(t,e){var i=b(e);if(this.touches.length){var n=this.$refs.container.getBoundingClientRect(),s=n.left,o=n.top;1===this.touches.length&&1===i.length&&this.$emit(\"move\",new Y({left:i[0].clientX-(s+this.anchor.x),top:i[0].clientY-(o+this.anchor.y)}))}},processEnd:function(){this.touches.length&&this.$emit(\"move-end\"),this.touches=[]}},emits:[\"move\",\"move-end\"]};Qt.render=function(n,s,o,r,a,h){return t(),e(\"div\",{ref:\"container\",onTouchstart:s[1]||(s[1]=function(){return h.onTouchStart&&h.onTouchStart.apply(h,arguments)}),onMousedown:s[2]||(s[2]=function(){return h.onMouseDown&&h.onMouseDown.apply(h,arguments)})},[i(n.$slots,\"default\")],544)};function Kt(t){var e,i;return{rotate:t.rotate||0,flip:{horizontal:(null===(e=null==t?void 0:t.flip)||void 0===e?void 0:e.horizontal)||!1,vertical:(null===(i=null==t?void 0:t.flip)||void 0===i?void 0:i.vertical)||!1}}}function Jt(t){return new Promise((function(e,i){try{if(t)if(/^data:/i.test(t))e(function(t){t=t.replace(/^data:([^;]+);base64,/gim,\"\");for(var e=atob(t),i=e.length,n=new ArrayBuffer(i),s=new Uint8Array(n),o=0;o<i;o++)s[o]=e.charCodeAt(o);return n}(t));else if(/^blob:/i.test(t)){var n=new FileReader;n.onload=function(t){e(t.target.result)},o=t,r=function(t){n.readAsArrayBuffer(t)},(a=new XMLHttpRequest).open(\"GET\",o,!0),a.responseType=\"blob\",a.onload=function(){200!=this.status&&0!==this.status||r(this.response)},a.send()}else{var s=new XMLHttpRequest;s.onreadystatechange=function(){4===s.readyState&&(200===s.status||0===s.status?e(s.response):i(\"Warning: could not load an image to parse its orientation\"),s=null)},s.onprogress=function(){\"image/jpeg\"!==s.getResponseHeader(\"content-type\")&&s.abort()},s.withCredentials=!1,s.open(\"GET\",t,!0),s.responseType=\"arraybuffer\",s.send(null)}else i(\"Error: the image is empty\")}catch(t){i(t)}var o,r,a}))}function te(t){var e=t.rotate,i=t.flip,n=t.scaleX,s=t.scaleY,o=\"\";return o+=\" rotate(\"+e+\"deg) \",o+=\" scaleX(\"+n*(i.horizontal?-1:1)+\") \",o+=\" scaleY(\"+s*(i.vertical?-1:1)+\") \"}function ee(t){try{var e,i=new DataView(t),n=void 0,s=void 0,o=void 0,r=void 0;if(255===i.getUint8(0)&&216===i.getUint8(1))for(var a=i.byteLength,h=2;h+1<a;){if(255===i.getUint8(h)&&225===i.getUint8(h+1)){o=h;break}h++}if(o&&(n=o+10,\"Exif\"===function(t,e,i){var n,s=\"\";for(n=e,i+=e;n<i;n++)s+=String.fromCharCode(t.getUint8(n));return s}(i,o+4,4))){var c=i.getUint16(n);if(((s=18761===c)||19789===c)&&42===i.getUint16(n+2,s)){var l=i.getUint32(n+4,s);l>=8&&(r=n+l)}}if(r)for(var u=i.getUint16(r,s),d=0;d<u;d++){h=r+12*d+2;if(274===i.getUint16(h,s)){h+=8,e=i.getUint16(h,s),i.setUint16(h,1,s);break}}return e}catch(t){return null}}var ie=M(\"vue-preview-result\"),ne={name:\"PreviewResult\",props:{image:{type:Object},transitions:{type:Object},stencilCoordinates:{type:Object,default:function(){return{width:0,height:0,left:0,top:0}}},imageClass:{type:String}},computed:{classes:function(){return{root:ie(),wrapper:ie(\"wrapper\"),imageWrapper:ie(\"image-wrapper\"),image:A(ie(\"image\"),this.imageClass)}},wrapperStyle:function(){var t={width:\"\".concat(this.stencilCoordinates.width,\"px\"),height:\"\".concat(this.stencilCoordinates.height,\"px\"),left:\"calc(50% - \".concat(this.stencilCoordinates.width/2,\"px)\"),top:\"calc(50% - \".concat(this.stencilCoordinates.height/2,\"px)\")};return this.transitions&&this.transitions.enabled&&(t.transition=\"\".concat(this.transitions.time,\"ms \").concat(this.transitions.timingFunction)),t},imageStyle:function(){var t=this.image.transforms,e=pt({width:this.image.width,height:this.image.height},t.rotate),i={width:\"\".concat(this.image.width,\"px\"),height:\"\".concat(this.image.height,\"px\"),left:\"0px\",top:\"0px\"},n={left:(this.image.width-e.width)*t.scaleX/2,top:(this.image.height-e.height)*t.scaleY/2},s={left:(1-t.scaleX)*this.image.width/2,top:(1-t.scaleY)*this.image.height/2};return i.transform=\"translate(\\n\\t\\t\\t\\t\".concat(-this.stencilCoordinates.left-t.translateX-n.left-s.left,\"px,\").concat(-this.stencilCoordinates.top-t.translateY-n.top-s.top,\"px) \")+te(t),this.transitions&&this.transitions.enabled&&(i.transition=\"\".concat(this.transitions.time,\"ms \").concat(this.transitions.timingFunction)),i}}};function se(t,e){var i=e.getBoundingClientRect(),n=i.left,s=i.top,o={left:0,top:0},r=0;return t.forEach((function(e){o.left+=(e.clientX-n)/t.length,o.top+=(e.clientY-s)/t.length})),t.forEach((function(t){r+=I({x:o.left,y:o.top},{x:t.clientX-n,y:t.clientY-s})})),{centerMass:o,spread:r,count:t.length}}ne.render=function(i,n,o,r,a,h){return t(),e(\"div\",{class:h.classes.root},[s(\"div\",{ref:\"wrapper\",class:h.classes.wrapper,style:h.wrapperStyle},[s(\"img\",{ref:\"image\",src:o.image.src,class:h.classes.image,style:h.imageStyle},null,14,[\"src\"])],6)],2)};var oe={props:{touchMove:{type:Boolean,required:!0},mouseMove:{type:Boolean,required:!0},touchResize:{type:Boolean,required:!0},wheelResize:{type:[Boolean,Object],required:!0},eventsFilter:{type:Function,required:!1}},beforeMount:function(){window.addEventListener(\"mouseup\",this.onMouseUp,{passive:!1}),window.addEventListener(\"mousemove\",this.onMouseMove,{passive:!1}),window.addEventListener(\"touchmove\",this.onTouchMove,{passive:!1}),window.addEventListener(\"touchend\",this.onTouchEnd,{passive:!1})},beforeUnmount:function(){window.removeEventListener(\"mouseup\",this.onMouseUp),window.removeEventListener(\"mousemove\",this.onMouseMove),window.removeEventListener(\"touchmove\",this.onTouchMove),window.removeEventListener(\"touchend\",this.onTouchEnd)},created:function(){this.transforming=!1,this.debouncedProcessEnd=x(this.processEnd),this.touches=[]},methods:{processMove:function(t,e){if(this.touches.length){if(1===this.touches.length&&1===e.length)this.$emit(\"move\",new B({left:this.touches[0].clientX-e[0].clientX,top:this.touches[0].clientY-e[0].clientY}));else if(this.touches.length>1&&this.touchResize){var i=se(e,this.$refs.container),n=this.oldGeometricProperties;n.count===i.count&&n.count>1&&this.$emit(\"resize\",new B({left:n.centerMass.left-i.centerMass.left,top:n.centerMass.top-i.centerMass.top},{factor:n.spread/i.spread,center:i.centerMass})),this.oldGeometricProperties=i}this.touches=e}},processEnd:function(){this.transforming&&(this.transforming=!1,this.$emit(\"transform-end\"))},processStart:function(){this.transforming=!0,this.debouncedProcessEnd.clear()},processEvent:function(t){return this.eventsFilter?!1!==this.eventsFilter(t,this.transforming):(t.preventDefault(),t.stopPropagation(),!0)},onTouchStart:function(t){if(t.cancelable&&(this.touchMove||this.touchResize&&t.touches.length>1)&&this.processEvent(t)){var e=this.$refs.container,i=e.getBoundingClientRect(),n=i.left,s=i.top,o=i.bottom,r=i.right;this.touches=b(t.touches).filter((function(t){return t.clientX>n&&t.clientX<r&&t.clientY>s&&t.clientY<o})),this.oldGeometricProperties=se(this.touches,e)}},onTouchEnd:function(t){0===t.touches.length&&(this.touches=[],this.processEnd())},onTouchMove:function(t){var e=this;if(this.touches.length){var i=b(t.touches).filter((function(t){return!t.identifier||e.touches.find((function(e){return e.identifier===t.identifier}))}));this.processEvent(t)&&(this.processMove(t,i),this.processStart())}},onMouseDown:function(t){if(this.mouseMove&&\"buttons\"in t&&1===t.buttons&&this.processEvent(t)){var e={fake:!0,clientX:t.clientX,clientY:t.clientY};this.touches=[e],this.processStart()}},onMouseMove:function(t){this.touches.length&&this.processEvent(t)&&this.processMove(t,[{clientX:t.clientX,clientY:t.clientY}])},onMouseUp:function(){this.touches=[],this.processEnd()},onWheel:function(t){if(this.wheelResize&&this.processEvent(t)){var e=this.$refs.container.getBoundingClientRect(),i=e.left,n=e.top,s=1+this.wheelResize.ratio*(r=t.deltaY||t.detail||t.wheelDelta,0===(a=+r)||$(a)?a:a>0?1:-1),o={left:t.clientX-i,top:t.clientY-n};this.$emit(\"resize\",new B({},{factor:s,center:o})),this.touches.length||this.debouncedProcessEnd()}var r,a}},emits:[\"resize\",\"move\",\"transform-end\"]};oe.render=function(n,s,o,r,a,h){return t(),e(\"div\",{ref:\"container\",onTouchstart:s[1]||(s[1]=function(){return h.onTouchStart&&h.onTouchStart.apply(h,arguments)}),onMousedown:s[2]||(s[2]=function(){return h.onMouseDown&&h.onMouseDown.apply(h,arguments)}),onWheel:s[3]||(s[3]=function(){return h.onWheel&&h.onWheel.apply(h,arguments)})},[i(n.$slots,\"default\")],544)};var re={components:{TransformableImage:oe},props:{touchMove:{type:Boolean,required:!0},mouseMove:{type:Boolean,required:!0},touchResize:{type:Boolean,required:!0},wheelResize:{type:[Boolean,Object],required:!0}},emits:[\"resize\",\"move\"]};re.render=function(s,r,a,h,c,l){var u=n(\"transformable-image\");return t(),e(u,{\"touch-move\":a.touchMove,\"touch-resize\":a.touchResize,\"mouse-move\":a.mouseMove,\"wheel-resize\":a.wheelResize,onMove:r[1]||(r[1]=function(t){return s.$emit(\"move\",t)}),onResize:r[2]||(r[2]=function(t){return s.$emit(\"resize\",t)})},{default:o((function(){return[i(s.$slots,\"default\")]})),_:3},8,[\"touch-move\",\"touch-resize\",\"mouse-move\",\"wheel-resize\"])};var ae=M(\"vue-preview\"),he={props:{coordinates:{type:Object},transitions:{type:Object},image:{type:Object,default:function(){return{}}},imageClass:{type:String},width:{type:Number},height:{type:Number},fill:{type:Boolean}},data:function(){return{calculatedImageSize:{width:0,height:0},calculatedSize:{width:0,height:0}}},computed:{classes:function(){return{root:ae({fill:this.fill}),wrapper:ae(\"wrapper\"),imageWrapper:ae(\"image-wrapper\"),image:A(ae(\"image\"),this.imageClass)}},style:function(){if(this.fill)return{};var t={};return this.width&&(t.width=\"\".concat(this.size.width,\"px\")),this.height&&(t.height=\"\".concat(this.size.height,\"px\")),this.transitions&&this.transitions.enabled&&(t.transition=\"\".concat(this.transitions.time,\"ms \").concat(this.transitions.timingFunction)),t},wrapperStyle:function(){var t={width:\"\".concat(this.size.width,\"px\"),height:\"\".concat(this.size.height,\"px\"),left:\"calc(50% - \".concat(this.size.width/2,\"px)\"),top:\"calc(50% - \".concat(this.size.height/2,\"px)\")};return this.transitions&&this.transitions.enabled&&(t.transition=\"\".concat(this.transitions.time,\"ms \").concat(this.transitions.timingFunction)),t},imageStyle:function(){if(this.coordinates&&this.image){var t=this.coordinates.width/this.size.width,e=g(g({rotate:0,flip:{horizontal:!1,vertical:!1}},this.image.transforms),{},{scaleX:1/t,scaleY:1/t}),i=this.imageSize.width,n=this.imageSize.height,s=pt({width:i,height:n},e.rotate),o={width:\"\".concat(i,\"px\"),height:\"\".concat(n,\"px\"),left:\"0px\",top:\"0px\"},r={rotate:{left:(i-s.width)*e.scaleX/2,top:(n-s.height)*e.scaleY/2},scale:{left:(1-e.scaleX)*i/2,top:(1-e.scaleY)*n/2}};return o.transform=\"translate(\\n\\t\\t\\t\\t\".concat(-this.coordinates.left/t-r.rotate.left-r.scale.left,\"px,\").concat(-this.coordinates.top/t-r.rotate.top-r.scale.top,\"px) \")+te(e),this.transitions&&this.transitions.enabled&&(o.transition=\"\".concat(this.transitions.time,\"ms \").concat(this.transitions.timingFunction)),o}return{}},size:function(){return{width:this.width||this.calculatedSize.width,height:this.height||this.calculatedSize.height}},imageSize:function(){return{width:this.image.width||this.calculatedImageSize.width,height:this.image.height||this.calculatedImageSize.height}}},watch:{image:function(t){(t.width||t.height)&&this.onChangeImage()}},mounted:function(){var t=this;this.onChangeImage(),this.$refs.image.addEventListener(\"load\",(function(){t.refreshImage()})),window.addEventListener(\"resize\",this.refresh),window.addEventListener(\"orientationchange\",this.refresh)},unmounted:function(){window.removeEventListener(\"resize\",this.refresh),window.removeEventListener(\"orientationchange\",this.refresh)},methods:{refreshImage:function(){var t=this.$refs.image;this.calculatedImageSize.height=t.naturalHeight,this.calculatedImageSize.width=t.naturalWidth},refresh:function(){var t=this.$refs.root;this.width||(this.calculatedSize.width=t.clientWidth),this.height||(this.calculatedSize.height=t.clientHeight)},onChangeImage:function(){var t=this.$refs.image;t&&t.complete&&this.refreshImage(),this.refresh()}}};he.render=function(i,n,o,r,a,h){return t(),e(\"div\",{ref:\"root\",class:h.classes.root,style:h.style},[s(\"div\",{ref:\"wrapper\",class:h.classes.wrapper,style:h.wrapperStyle},[c(s(\"img\",{ref:\"image\",src:o.image&&o.image.src,class:h.classes.image,style:h.imageStyle},null,14,[\"src\"]),[[l,o.image&&o.image.src]])],6)],6)};var ce={components:{Preview:he},inheritAttrs:!1};ce.render=function(i,s,o,r,a,h){var c=n(\"preview\");return t(),e(c,u(i.$attrs,{fill:!0}),null,16)};var le=M(\"vue-rectangle-stencil\"),ue={name:\"RectangleStencil\",components:{StencilPreview:ce,BoundingBox:_t,DraggableArea:Qt},props:{image:{type:Object},coordinates:{type:Object},stencilCoordinates:{type:Object},handlers:{type:Object},handlersComponent:{type:[Object,String],default:function(){return kt}},lines:{type:Object},linesComponent:{type:[Object,String],default:function(){return Nt}},aspectRatio:{type:[Number,String]},minAspectRatio:{type:[Number,String]},maxAspectRatio:{type:[Number,String]},movable:{type:Boolean,default:!0},resizable:{type:Boolean,default:!0},transitions:{type:Object},movingClass:{type:String},resizingClass:{type:String},previewClass:{type:String},boundingBoxClass:{type:String},linesClasses:{type:Object,default:function(){return{}}},linesWrappersClasses:{type:Object,default:function(){return{}}},handlersClasses:{type:Object,default:function(){return{}}},handlersWrappersClasses:{type:Object,default:function(){return{}}}},data:function(){return{moving:!1,resizing:!1}},computed:{classes:function(){return{stencil:A(le({movable:this.movable,moving:this.moving,resizing:this.resizing}),this.moving&&this.movingClass,this.resizing&&this.resizingClass),preview:A(le(\"preview\"),this.previewClass),boundingBox:A(le(\"bounding-box\"),this.boundingBoxClass)}},style:function(){var t=this.stencilCoordinates,e=t.height,i=t.width,n=t.left,s=t.top,o={width:\"\".concat(i,\"px\"),height:\"\".concat(e,\"px\"),transform:\"translate(\".concat(n,\"px, \").concat(s,\"px)\")};return this.transitions&&this.transitions.enabled&&(o.transition=\"\".concat(this.transitions.time,\"ms \").concat(this.transitions.timingFunction)),o}},methods:{onMove:function(t){this.$emit(\"move\",t),this.moving=!0},onMoveEnd:function(){this.$emit(\"move-end\"),this.moving=!1},onResize:function(t){this.$emit(\"resize\",t),this.resizing=!0},onResizeEnd:function(){this.$emit(\"resize-end\"),this.resizing=!1},aspectRatios:function(){return{minimum:this.aspectRatio||this.minAspectRatio,maximum:this.aspectRatio||this.maxAspectRatio}}},emits:[\"resize\",\"resize-end\",\"move\",\"move-end\"]};ue.render=function(i,r,a,h,c,l){var u=n(\"stencil-preview\"),d=n(\"draggable-area\"),m=n(\"bounding-box\");return t(),e(\"div\",{class:l.classes.stencil,style:l.style},[s(m,{width:a.stencilCoordinates.width,height:a.stencilCoordinates.height,transitions:a.transitions,class:l.classes.boundingBox,handlers:a.handlers,\"handlers-component\":a.handlersComponent,\"handlers-classes\":a.handlersClasses,\"handlers-wrappers-classes\":a.handlersWrappersClasses,lines:a.lines,\"lines-component\":a.linesComponent,\"lines-classes\":a.linesClasses,\"lines-wrappers-classes\":a.linesWrappersClasses,resizable:a.resizable,onResize:l.onResize,onResizeEnd:l.onResizeEnd},{default:o((function(){return[s(d,{movable:a.movable,onMove:l.onMove,onMoveEnd:l.onMoveEnd},{default:o((function(){return[s(u,{image:a.image,coordinates:a.coordinates,width:a.stencilCoordinates.width,height:a.stencilCoordinates.height,class:l.classes.preview,transitions:a.transitions},null,8,[\"image\",\"coordinates\",\"width\",\"height\",\"class\",\"transitions\"])]})),_:1},8,[\"movable\",\"onMove\",\"onMoveEnd\"])]})),_:1},8,[\"width\",\"height\",\"transitions\",\"class\",\"handlers\",\"handlers-component\",\"handlers-classes\",\"handlers-wrappers-classes\",\"lines\",\"lines-component\",\"lines-classes\",\"lines-wrappers-classes\",\"resizable\",\"onResize\",\"onResizeEnd\"])],6)};var de=M(\"vue-circle-stencil\"),me={components:{StencilPreview:ce,BoundingBox:_t,DraggableArea:Qt},props:{image:{type:Object},coordinates:{type:Object},stencilCoordinates:{type:Object},handlers:{type:Object,default:function(){return{eastNorth:!0,westNorth:!0,westSouth:!0,eastSouth:!0}}},handlersComponent:{type:[Object,String],default:function(){return kt}},handlersClasses:{type:Object,default:function(){return{}}},handlersWrappersClasses:{type:Object,default:function(){return{}}},lines:{type:Object},linesComponent:{type:[Object,String],default:function(){return Nt}},linesClasses:{type:Object,default:function(){return{}}},linesWrappersClasses:{type:Object,default:function(){return{}}},movable:{type:Boolean,default:!0},resizable:{type:Boolean,default:!0},transitions:{type:Object},movingClass:{type:String},resizingClass:{type:String},previewClass:{type:String},boundingBoxClass:{type:String}},data:function(){return{moving:!1,resizing:!1}},computed:{classes:function(){return{stencil:A(de({movable:this.movable,moving:this.moving,resizing:this.resizing}),this.moving&&this.movingClass,this.resizing&&this.resizingClass),preview:A(de(\"preview\"),this.previewClass),boundingBox:A(de(\"bounding-box\"),this.boundingBoxClass)}},style:function(){var t=this.stencilCoordinates,e=t.height,i=t.width,n=t.left,s=t.top,o={width:\"\".concat(i,\"px\"),height:\"\".concat(e,\"px\"),transform:\"translate(\".concat(n,\"px, \").concat(s,\"px)\")};return this.transitions&&this.transitions.enabled&&(o.transition=\"\".concat(this.transitions.time,\"ms \").concat(this.transitions.timingFunction)),o}},methods:{onMove:function(t){this.$emit(\"move\",t),this.moving=!0},onMoveEnd:function(){this.$emit(\"move-end\"),this.moving=!1},onResize:function(t){this.$emit(\"resize\",t),this.resizing=!0},onResizeEnd:function(){this.$emit(\"resize-end\"),this.resizing=!1},aspectRatios:function(){return{minimum:1,maximum:1}}},emits:[\"resize\",\"resize-end\",\"move\",\"move-end\"]};me.render=function(i,r,a,h,c,l){var u=n(\"stencil-preview\"),d=n(\"draggable-area\"),m=n(\"bounding-box\");return t(),e(\"div\",{class:l.classes.stencil,style:l.style},[s(m,{width:a.stencilCoordinates.width,height:a.stencilCoordinates.height,transitions:a.transitions,class:l.classes.boundingBox,handlers:a.handlers,\"handlers-component\":a.handlersComponent,\"handlers-classes\":a.handlersClasses,\"handlers-wrappers-classes\":a.handlersWrappersClasses,lines:a.lines,\"lines-component\":a.linesComponent,\"lines-classes\":a.linesClasses,\"lines-wrappers-classes\":a.linesWrappersClasses,resizable:a.resizable,onResize:l.onResize,onResizeEnd:l.onResizeEnd},{default:o((function(){return[s(d,{movable:a.movable,onMove:l.onMove,onMoveEnd:l.onMoveEnd},{default:o((function(){return[s(u,{image:a.image,coordinates:a.coordinates,width:a.stencilCoordinates.width,height:a.stencilCoordinates.height,class:l.classes.preview,transitions:a.transitions},null,8,[\"image\",\"coordinates\",\"width\",\"height\",\"class\",\"transitions\"])]})),_:1},8,[\"movable\",\"onMove\",\"onMoveEnd\"])]})),_:1},8,[\"width\",\"height\",\"transitions\",\"class\",\"handlers\",\"handlers-component\",\"handlers-classes\",\"handlers-wrappers-classes\",\"lines\",\"lines-component\",\"lines-classes\",\"lines-wrappers-classes\",\"resizable\",\"onResize\",\"onResizeEnd\"])],6)};var pe=[\"transitions\"],ge=M(\"vue-advanced-cropper\"),fe={name:\"Cropper\",components:{BackgroundWrapper:re},props:{src:{type:String,default:null},stencilComponent:{type:[Object,String],default:function(){return ue}},backgroundWrapperComponent:{type:[Object,String],default:function(){return re}},stencilProps:{type:Object,default:function(){return{}}},autoZoom:{type:Boolean,default:!1},imageClass:{type:String},boundariesClass:{type:String},backgroundClass:{type:String},foregroundClass:{type:String},minWidth:{type:[Number,String]},minHeight:{type:[Number,String]},maxWidth:{type:[Number,String]},maxHeight:{type:[Number,String]},debounce:{type:[Boolean,Number],default:500},transitions:{type:Boolean,default:!0},checkOrientation:{type:Boolean,default:!0},canvas:{type:[Object,Boolean],default:!0},crossOrigin:{type:[Boolean,String],default:void 0},transitionTime:{type:Number,default:300},imageRestriction:{type:String,default:\"fit-area\",validator:function(t){return-1!==K.indexOf(t)}},roundResult:{type:Boolean,default:!0},defaultSize:{type:[Function,Object]},defaultPosition:{type:[Function,Object]},defaultVisibleArea:{type:[Function,Object]},defaultTransforms:{type:[Function,Object]},defaultBoundaries:{type:[Function,String],validator:function(t){return!(\"string\"==typeof t&&\"fill\"!==t&&\"fit\"!==t)}},priority:{type:String,default:\"coordinates\"},stencilSize:{type:[Object,Function]},resizeImage:{type:[Boolean,Object],default:!0},moveImage:{type:[Boolean,Object],default:!0},autoZoomAlgorithm:{type:Function},resizeAlgorithm:{type:Function,default:function(t){var e=t.event,i=t.coordinates,n=t.aspectRatio,s=t.positionRestrictions,o=t.sizeRestrictions,r=C(C({},i),{right:i.left+i.width,bottom:i.top+i.height}),a=e.params||{},h=C({},e.directions),c=a.allowedDirections||{left:!0,right:!0,bottom:!0,top:!0};o.widthFrozen&&(h.left=0,h.right=0),o.heightFrozen&&(h.top=0,h.bottom=0),V.forEach((function(t){c[t]||(h[t]=0)}));var l=ot(r,h=It({coordinates:r,directions:h,sizeRestrictions:o,positionRestrictions:s})).width,u=ot(r,h).height,d=a.preserveRatio?ct(r):dt(l/u,n);if(d){var m=a.respectDirection;if(m||(m=r.width>=r.height||1===d?\"width\":\"height\"),\"width\"===m){var p=l/d-r.height;if(c.top&&c.bottom){var g=h.top,f=h.bottom;h.bottom=Bt(p,f,g),h.top=Bt(p,g,f)}else c.bottom?h.bottom=p:c.top?h.top=p:c.right?h.right=0:c.left&&(h.left=0)}else if(\"height\"===m){var v=r.width-u*d;if(c.left&&c.right){var b=h.left,w=h.right;h.left=-Bt(v,b,w),h.right=-Bt(v,w,b)}else c.left?h.left=-v:c.right?h.right=-v:c.top?h.top=0:c.bottom&&(h.bottom=0)}h=It({directions:h,coordinates:r,sizeRestrictions:o,positionRestrictions:s,preserveRatio:!0,compensate:a.compensate})}return l=ot(r,h).width,u=ot(r,h).height,(d=a.preserveRatio?ct(r):dt(l/u,n))&&Math.abs(d-l/u)>.001&&V.forEach((function(t){c[t]||(h[t]=0)})),St({event:new Y({left:-h.left,top:-h.top}),coordinates:{width:i.width+h.right+h.left,height:i.height+h.top+h.bottom,left:i.left,top:i.top},positionRestrictions:s})}},moveAlgorithm:{type:Function,default:St},initStretcher:{type:Function,default:function(t){var e=t.stretcher,i=t.imageSize,n=ct(i);e.style.width=i.width+\"px\",e.style.height=e.clientWidth/n+\"px\",e.style.width=e.clientWidth+\"px\"}},fitCoordinates:{type:Function,default:function(t){var e=t.visibleArea,i=t.coordinates,n=t.aspectRatio,s=t.sizeRestrictions,o=t.positionRestrictions,r=C(C({},i),Mt({width:i.width,height:i.height,aspectRatio:n,sizeRestrictions:{maxWidth:e.width,maxHeight:e.height,minHeight:Math.min(e.height,s.minHeight),minWidth:Math.min(e.width,s.minWidth)}}));return r=vt(r=at(r,it(nt(i),nt(r))),zt(et(e),o))}},fitVisibleArea:{type:Function,default:function(t){var e=t.visibleArea,i=t.boundaries,n=t.getAreaRestrictions,s=t.coordinates,o=C({},e);o.height=o.width/ct(i),o.top+=(e.height-o.height)/2,(s.height-o.height>0||s.width-o.width>0)&&(o=ht(o,Math.max(s.height/o.height,s.width/o.width)));var r=rt(ut(s,et(o=ht(o,ft(o,n({visibleArea:o,type:\"resize\"}))))));return o.width<s.width&&(r.left=0),o.height<s.height&&(r.top=0),o=vt(o=at(o,r),n({visibleArea:o,type:\"move\"}))}},areaRestrictionsAlgorithm:{type:Function,default:function(t){var e=t.visibleArea,i=t.boundaries,n=t.imageSize,s=t.imageRestriction,o=t.type,r={};return\"fill-area\"===s?r={left:0,top:0,right:n.width,bottom:n.height}:\"fit-area\"===s&&(ct(i)>ct(n)?(r={top:0,bottom:n.height},e&&\"move\"===o&&(e.width>n.width?(r.left=-(e.width-n.width)/2,r.right=n.width-r.left):(r.left=0,r.right=n.width))):(r={left:0,right:n.width},e&&\"move\"===o&&(e.height>n.height?(r.top=-(e.height-n.height)/2,r.bottom=n.height-r.top):(r.top=0,r.bottom=n.height)))),r}},sizeRestrictionsAlgorithm:{type:Function,default:function(t){return{minWidth:t.minWidth,minHeight:t.minHeight,maxWidth:t.maxWidth,maxHeight:t.maxHeight}}},positionRestrictionsAlgorithm:{type:Function,default:function(t){var e=t.imageSize,i={};return\"none\"!==t.imageRestriction&&(i={left:0,top:0,right:e.width,bottom:e.height}),i}}},data:function(){return{transitionsActive:!1,imageLoaded:!1,imageAttributes:{width:null,height:null,crossOrigin:null,src:null},defaultImageTransforms:{rotate:0,flip:{horizontal:!1,vertical:!1}},appliedImageTransforms:{rotate:0,flip:{horizontal:!1,vertical:!1}},boundaries:{width:0,height:0},visibleArea:null,coordinates:g({},J)}},computed:{image:function(){return{src:this.imageAttributes.src,width:this.imageAttributes.width,height:this.imageAttributes.height,transforms:this.imageTransforms}},imageTransforms:function(){return{rotate:this.appliedImageTransforms.rotate,flip:{horizontal:this.appliedImageTransforms.flip.horizontal,vertical:this.appliedImageTransforms.flip.vertical},translateX:this.visibleArea?this.visibleArea.left/this.coefficient:0,translateY:this.visibleArea?this.visibleArea.top/this.coefficient:0,scaleX:1/this.coefficient,scaleY:1/this.coefficient}},imageSize:function(){var t=function(t){return t*Math.PI/180}(this.imageTransforms.rotate);return{width:Math.abs(this.imageAttributes.width*Math.cos(t))+Math.abs(this.imageAttributes.height*Math.sin(t)),height:Math.abs(this.imageAttributes.width*Math.sin(t))+Math.abs(this.imageAttributes.height*Math.cos(t))}},initialized:function(){return Boolean(this.visibleArea&&this.imageLoaded)},settings:function(){var t=j(this.resizeImage,{touch:!0,wheel:{ratio:.1},adjustStencil:!0},{touch:!1,wheel:!1,adjustStencil:!1});return{moveImage:j(this.moveImage,{touch:!0,mouse:!0},{touch:!1,mouse:!1}),resizeImage:t}},coefficient:function(){return this.visibleArea?this.visibleArea.width/this.boundaries.width:0},areaRestrictions:function(){return this.imageLoaded?this.areaRestrictionsAlgorithm({imageSize:this.imageSize,imageRestriction:this.imageRestriction,boundaries:this.boundaries}):{}},transitionsOptions:function(){return{enabled:this.transitionsActive,timingFunction:\"ease-in-out\",time:350}},sizeRestrictions:function(){if(this.boundaries.width&&this.boundaries.height&&this.imageSize.width&&this.imageSize.height){var t=this.sizeRestrictionsAlgorithm({imageSize:this.imageSize,minWidth:D(this.minWidth)?0:L(this.minWidth),minHeight:D(this.minHeight)?0:L(this.minHeight),maxWidth:D(this.maxWidth)?1/0:L(this.maxWidth),maxHeight:D(this.maxHeight)?1/0:L(this.maxHeight)});if(t=function(t){var e=t.areaRestrictions,i=t.sizeRestrictions;t.imageSize;var n=t.boundaries,s=t.positionRestrictions;t.imageRestriction;var o=C(C({},i),{minWidth:void 0!==i.minWidth?i.minWidth:0,minHeight:void 0!==i.minHeight?i.minHeight:0,maxWidth:void 0!==i.maxWidth?i.maxWidth:1/0,maxHeight:void 0!==i.maxHeight?i.maxHeight:1/0});void 0!==s.left&&void 0!==s.right&&(o.maxWidth=Math.min(o.maxWidth,s.right-s.left)),void 0!==s.bottom&&void 0!==s.top&&(o.maxHeight=Math.min(o.maxHeight,s.bottom-s.top));var r=bt(e),a=mt(n,r);return r.width<1/0&&(!o.maxWidth||o.maxWidth>a.width)&&(o.maxWidth=Math.min(o.maxWidth,a.width)),r.height<1/0&&(!o.maxHeight||o.maxHeight>a.height)&&(o.maxHeight=Math.min(o.maxHeight,a.height)),o.minWidth>o.maxWidth&&(o.minWidth=o.maxWidth,o.widthFrozen=!0),o.minHeight>o.maxHeight&&(o.minHeight=o.maxHeight,o.heightFrozen=!0),o}({sizeRestrictions:t,areaRestrictions:this.getAreaRestrictions({visibleArea:this.visibleArea,type:\"resize\"}),imageSize:this.imageSize,boundaries:this.boundaries,positionRestrictions:this.positionRestrictions,imageRestriction:this.imageRestriction,visibleArea:this.visibleArea,stencilSize:this.getStencilSize()}),this.visibleArea&&this.stencilSize){var e=this.getStencilSize(),i=bt(this.getAreaRestrictions({visibleArea:this.visibleArea,type:\"resize\"}));t.maxWidth=Math.min(t.maxWidth,i.width*e.width/this.boundaries.width),t.maxHeight=Math.min(t.maxHeight,i.height*e.height/this.boundaries.height),t.maxWidth<t.minWidth&&(t.minWidth=t.maxWidth),t.maxHeight<t.minHeight&&(t.minHeight=t.maxHeight)}return t}return{minWidth:0,minHeight:0,maxWidth:0,maxHeight:0}},positionRestrictions:function(){return this.positionRestrictionsAlgorithm({imageSize:this.imageSize,imageRestriction:this.imageRestriction})},classes:function(){return{cropper:ge(),image:A(ge(\"image\"),this.imageClass),stencil:ge(\"stencil\"),boundaries:A(ge(\"boundaries\"),this.boundariesClass),stretcher:A(ge(\"stretcher\")),background:A(ge(\"background\"),this.backgroundClass),foreground:A(ge(\"foreground\"),this.foregroundClass),imageWrapper:A(ge(\"image-wrapper\")),cropperWrapper:A(ge(\"cropper-wrapper\"))}},stencilCoordinates:function(){if(this.initialized){var t=this.coordinates,e=t.width,i=t.height,n=t.left,s=t.top;return{width:e/this.coefficient,height:i/this.coefficient,left:(n-this.visibleArea.left)/this.coefficient,top:(s-this.visibleArea.top)/this.coefficient}}return this.defaultCoordinates()},boundariesStyle:function(){var t={width:this.boundaries.width?\"\".concat(Math.round(this.boundaries.width),\"px\"):\"auto\",height:this.boundaries.height?\"\".concat(Math.round(this.boundaries.height),\"px\"):\"auto\",transition:\"opacity \".concat(this.transitionTime,\"ms\"),pointerEvents:this.imageLoaded?\"all\":\"none\"};return this.imageLoaded||(t.opacity=\"0\"),t},imageStyle:function(){var t=this.imageAttributes.width>this.imageAttributes.height?{width:Math.min(1024,this.imageAttributes.width),height:Math.min(1024,this.imageAttributes.width)/(this.imageAttributes.width/this.imageAttributes.height)}:{height:Math.min(1024,this.imageAttributes.height),width:Math.min(1024,this.imageAttributes.height)*(this.imageAttributes.width/this.imageAttributes.height)},e={left:(t.width-this.imageSize.width)/(2*this.coefficient),top:(t.height-this.imageSize.height)/(2*this.coefficient)},i={left:(1-1/this.coefficient)*t.width/2,top:(1-1/this.coefficient)*t.height/2},n=g(g({},this.imageTransforms),{},{scaleX:this.imageTransforms.scaleX*(this.imageAttributes.width/t.width),scaleY:this.imageTransforms.scaleY*(this.imageAttributes.height/t.height)}),s={width:\"\".concat(t.width,\"px\"),height:\"\".concat(t.height,\"px\"),left:\"0px\",top:\"0px\",transform:\"translate(\".concat(-e.left-i.left-this.imageTransforms.translateX,\"px, \").concat(-e.top-i.top-this.imageTransforms.translateY,\"px)\")+te(n)};return this.transitionsOptions.enabled&&(s.transition=\"\".concat(this.transitionsOptions.time,\"ms \").concat(this.transitionsOptions.timingFunction)),s}},watch:{src:function(){this.onChangeImage()},stencilComponent:function(){var t=this;this.$nextTick((function(){t.resetCoordinates(),t.runAutoZoom(\"setCoordinates\"),t.onChange()}))},minWidth:function(){this.onPropsChange()},maxWidth:function(){this.onPropsChange()},minHeight:function(){this.onPropsChange()},maxHeight:function(){this.onPropsChange()},imageRestriction:function(){this.reset()},stencilProps:function(t,e){[\"aspectRatio\",\"minAspectRatio\",\"maxAspectRatio\"].find((function(i){return t[i]!==e[i]}))&&this.$nextTick(this.onPropsChange)}},created:function(){this.debouncedUpdate=x(this.update,this.debounce),this.debouncedDisableTransitions=x(this.disableTransitions,this.transitionsOptions.time),this.awaiting=!1},mounted:function(){this.$refs.image.addEventListener(\"load\",this.onSuccessLoadImage),this.$refs.image.addEventListener(\"error\",this.onFailLoadImage),this.onChangeImage(),window.addEventListener(\"resize\",this.refresh),window.addEventListener(\"orientationchange\",this.refresh)},unmounted:function(){window.removeEventListener(\"resize\",this.refresh),window.removeEventListener(\"orientationchange\",this.refresh),this.imageAttributes.revoke&&this.imageAttributes.src&&URL.revokeObjectURL(this.imageAttributes.src),this.debouncedUpdate.clear(),this.debouncedDisableTransitions.clear()},methods:{getResult:function(){var t=this.initialized?this.prepareResult(g({},this.coordinates)):this.defaultCoordinates(),e={rotate:this.imageTransforms.rotate%360,flip:g({},this.imageTransforms.flip)};if(this.src&&this.imageLoaded){var i=this;return{image:this.image,coordinates:t,visibleArea:this.visibleArea?g({},this.visibleArea):null,imageTransforms:e,get canvas(){return i.canvas?i.getCanvas():void 0}}}return{image:this.image,coordinates:t,visibleArea:this.visibleArea?g({},this.visibleArea):null,canvas:void 0,imageTransforms:e}},zoom:function(t,e){var i=arguments.length>2&&void 0!==arguments[2]?arguments[2]:{},n=i.transitions,s=void 0===n||n;this.onManipulateImage(new B({},{factor:1/t,center:e}),{normalize:!1,transitions:s})},move:function(t,e){var i=arguments.length>2&&void 0!==arguments[2]?arguments[2]:{},n=i.transitions,s=void 0===n||n;this.onManipulateImage(new B({left:t||0,top:e||0}),{normalize:!1,transitions:s})},setCoordinates:function(t){var e=this,i=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{},n=i.autoZoom,s=void 0===n||n,o=i.transitions,r=void 0===o||o;this.$nextTick((function(){e.imageLoaded?(e.transitionsActive||(r&&e.enableTransitions(),e.coordinates=e.applyTransform(t),s&&e.runAutoZoom(\"setCoordinates\"),r&&e.debouncedDisableTransitions()),e.onChange()):e.delayedTransforms=t}))},refresh:function(){var t=this,e=this.$refs.image;if(this.src&&e)return this.initialized?this.updateVisibleArea().then((function(){t.onChange()})):this.resetVisibleArea().then((function(){t.onChange()}))},reset:function(){var t=this;return this.resetVisibleArea().then((function(){t.onChange(!1)}))},awaitRender:function(t){var e=this;this.awaiting||(this.awaiting=!0,this.$nextTick((function(){t(),e.awaiting=!1})))},prepareResult:function(t){return this.roundResult?function(t){var e=t.coordinates,i=t.sizeRestrictions,n=t.positionRestrictions,s={width:Math.round(e.width),height:Math.round(e.height),left:Math.round(e.left),top:Math.round(e.top)};return s.width>i.maxWidth?s.width=Math.floor(e.width):s.width<i.minWidth&&(s.width=Math.ceil(e.width)),s.height>i.maxHeight?s.height=Math.floor(e.height):s.height<i.minHeight&&(s.height=Math.ceil(e.height)),vt(s,n)}(g(g({},this.getPublicProperties()),{},{positionRestrictions:jt(this.positionRestrictions,this.visibleArea),coordinates:t})):t},processAutoZoom:function(t,e,i,n){var s=this.autoZoomAlgorithm;s||(s=this.stencilSize?Ct:this.autoZoom?Et:Wt);var o=s({event:{type:t,params:n},visibleArea:e,coordinates:i,boundaries:this.boundaries,aspectRatio:this.getAspectRatio(),positionRestrictions:this.positionRestrictions,getAreaRestrictions:this.getAreaRestrictions,sizeRestrictions:this.sizeRestrictions,stencilSize:this.getStencilSize()});return g(g({},o),{},{changed:!tt(o.visibleArea,e)||!tt(o.coordinates,i)})},runAutoZoom:function(t){var e=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{},i=e.transitions,n=void 0!==i&&i,s=v(e,pe),o=this.processAutoZoom(t,this.visibleArea,this.coordinates,s),r=o.visibleArea,a=o.coordinates,h=o.changed;n&&h&&this.enableTransitions(),this.visibleArea=r,this.coordinates=a,n&&h&&this.debouncedDisableTransitions()},normalizeEvent:function(t){return function(t){var e=t.event,i=t.visibleArea,n=t.coefficient;if(\"manipulateImage\"===e.type)return C(C({},e),{move:{left:e.move&&e.move.left?n*e.move.left:0,top:e.move&&e.move.top?n*e.move.top:0},scale:{factor:e.scale&&e.scale.factor?e.scale.factor:1,center:e.scale&&e.scale.center?{left:e.scale.center.left*n+i.left,top:e.scale.center.top*n+i.top}:null}});if(\"resize\"===e.type){var s=C(C({},e),{directions:C({},e.directions)});return V.forEach((function(t){s.directions[t]*=n})),s}if(\"move\"===e.type){var o=C(C({},e),{directions:C({},e.directions)});return Q.forEach((function(t){o.directions[t]*=n})),o}return e}(g(g({},this.getPublicProperties()),{},{event:t}))},getCanvas:function(){if(this.$refs.canvas){var t=this.$refs.canvas,e=this.$refs.image,i=0!==this.imageTransforms.rotate||this.imageTransforms.flip.horizontal||this.imageTransforms.flip.vertical?function(t,e,i){var n=i.rotate,s=i.flip,o={width:e.naturalWidth,height:e.naturalHeight},r=pt(o,n),a=t.getContext(\"2d\");t.height=r.height,t.width=r.width,a.save();var h=gt(nt(C({left:0,top:0},o)),n);return a.translate(-(h.left-r.width/2),-(h.top-r.height/2)),a.rotate(n*Math.PI/180),a.translate(s.horizontal?o.width:0,s.vertical?o.height:0),a.scale(s.horizontal?-1:1,s.vertical?-1:1),a.drawImage(e,0,0,o.width,o.height),a.restore(),t}(this.$refs.sourceCanvas,e,this.imageTransforms):e,n=g({minWidth:0,minHeight:0,maxWidth:1/0,maxHeight:1/0,maxArea:this.maxCanvasSize,imageSmoothingEnabled:!0,imageSmoothingQuality:\"high\",fillColor:\"transparent\"},this.canvas),s=function(t){return t.find((function(t){return e=t,!Number.isNaN(parseFloat(e))&&isFinite(e);var e}))},o=Mt({sizeRestrictions:{minWidth:s([n.width,n.minWidth])||0,minHeight:s([n.height,n.minHeight])||0,maxWidth:s([n.width,n.maxWidth])||1/0,maxHeight:s([n.height,n.maxHeight])||1/0},width:this.coordinates.width,height:this.coordinates.height,aspectRatio:{minimum:this.coordinates.width/this.coordinates.height,maximum:this.coordinates.width/this.coordinates.height}});if(n.maxArea&&o.width*o.height>n.maxArea){var r=Math.sqrt(n.maxArea/(o.width*o.height));o={width:Math.round(r*o.width),height:Math.round(r*o.height)}}return function(t,e,i,n,s){t.width=n?n.width:i.width,t.height=n?n.height:i.height;var o=t.getContext(\"2d\");o.clearRect(0,0,t.width,t.height),s&&(s.imageSmoothingEnabled&&(o.imageSmoothingEnabled=s.imageSmoothingEnabled),s.imageSmoothingQuality&&(o.imageSmoothingQuality=s.imageSmoothingQuality),s.fillColor&&(o.fillStyle=s.fillColor,o.fillRect(0,0,t.width,t.height),o.save()));var r=i.left<0?-i.left:0,a=i.top<0?-i.top:0;o.drawImage(e,i.left+r,i.top+a,i.width,i.height,r*(t.width/i.width),a*(t.height/i.height),t.width,t.height)}(t,i,this.coordinates,o,n),t}},update:function(){this.$emit(\"change\",this.getResult())},applyTransform:function(t){var e=arguments.length>1&&void 0!==arguments[1]&&arguments[1],i=this.visibleArea&&e?wt(this.sizeRestrictions,this.visibleArea):this.sizeRestrictions,n=this.visibleArea&&e?jt(this.positionRestrictions,this.visibleArea):this.positionRestrictions;return xt({transform:t,coordinates:this.coordinates,imageSize:this.imageSize,sizeRestrictions:i,positionRestrictions:n,aspectRatio:this.getAspectRatio(),visibleArea:this.visibleArea})},resetCoordinates:function(){var t=this;if(this.$refs.image){this.$refs.cropper,this.$refs.image;var e=this.defaultSize;e||(e=this.stencilSize?Dt:Ot);var i=this.sizeRestrictions;i.minWidth,i.minHeight,i.maxWidth,i.maxHeight;var n=O(e)?e({boundaries:this.boundaries,imageSize:this.imageSize,aspectRatio:this.getAspectRatio(),sizeRestrictions:this.sizeRestrictions,stencilSize:this.getStencilSize(),visibleArea:this.visibleArea}):e,s=this.defaultPosition||Tt,o=[n,function(e){var i=e.coordinates;return g({},O(s)?s({coordinates:i,imageSize:t.imageSize,visibleArea:t.visibleArea}):t.defaultPosition)}];this.delayedTransforms&&o.push.apply(o,b(Array.isArray(this.delayedTransforms)?this.delayedTransforms:[this.delayedTransforms])),this.coordinates=this.applyTransform(o,!0),this.delayedTransforms=null}},clearImage:function(){var t=this;this.imageLoaded=!1,setTimeout((function(){var e=t.$refs.stretcher;e&&(e.style.height=\"auto\",e.style.width=\"auto\"),t.coordinates=t.defaultCoordinates(),t.boundaries={width:0,height:0}}),this.transitionTime)},enableTransitions:function(){this.transitions&&(this.transitionsActive=!0)},disableTransitions:function(){this.transitionsActive=!1},updateBoundaries:function(){var t=this,e=this.$refs.stretcher,i=this.$refs.cropper;return this.initStretcher({cropper:i,stretcher:e,imageSize:this.imageSize}),this.$nextTick().then((function(){var e={cropper:i,imageSize:t.imageSize};if(O(t.defaultBoundaries)?t.boundaries=t.defaultBoundaries(e):\"fit\"===t.defaultBoundaries?t.boundaries=function(t){var e=t.cropper,i=t.imageSize,n=e.clientHeight,s=e.clientWidth,o=n,r=i.width*n/i.height;return r>s&&(r=s,o=i.height*s/i.width),{width:r,height:o}}(e):t.boundaries=function(t){var e=t.cropper;return{width:e.clientWidth,height:e.clientHeight}}(e),!t.boundaries.width||!t.boundaries.height)throw new Error(\"It's impossible to fit the cropper in the current container\")}))},resetVisibleArea:function(){var t=this;return this.appliedImageTransforms=g(g({},this.defaultImageTransforms),{},{flip:g({},this.defaultImageTransforms.flip)}),this.updateBoundaries().then((function(){\"visible-area\"!==t.priority&&(t.visibleArea=null,t.resetCoordinates());var e,i,n,s,o,r,a=t.defaultVisibleArea||Ht;t.visibleArea=O(a)?a({imageSize:t.imageSize,boundaries:t.boundaries,coordinates:\"visible-area\"!==t.priority?t.coordinates:null,getAreaRestrictions:t.getAreaRestrictions,stencilSize:t.getStencilSize()}):t.defaultVisibleArea,t.visibleArea=(e={visibleArea:t.visibleArea,boundaries:t.boundaries,getAreaRestrictions:t.getAreaRestrictions},i=e.visibleArea,n=e.boundaries,s=e.getAreaRestrictions,o=C({},i),r=ct(n),o.width/o.height!==r&&(o.height=o.width/r),vt(o,s({visibleArea:o,type:\"move\"}))),\"visible-area\"===t.priority?t.resetCoordinates():t.coordinates=t.fitCoordinates({visibleArea:t.visibleArea,coordinates:t.coordinates,aspectRatio:t.getAspectRatio(),positionRestrictions:t.positionRestrictions,sizeRestrictions:t.sizeRestrictions}),t.runAutoZoom(\"resetVisibleArea\")})).catch((function(){t.visibleArea=null}))},updateVisibleArea:function(){var t=this;return this.updateBoundaries().then((function(){t.visibleArea=t.fitVisibleArea({imageSize:t.imageSize,boundaries:t.boundaries,visibleArea:t.visibleArea,coordinates:t.coordinates,getAreaRestrictions:t.getAreaRestrictions}),t.coordinates=t.fitCoordinates({visibleArea:t.visibleArea,coordinates:t.coordinates,aspectRatio:t.getAspectRatio(),positionRestrictions:t.positionRestrictions,sizeRestrictions:t.sizeRestrictions}),t.runAutoZoom(\"updateVisibleArea\")})).catch((function(){t.visibleArea=null}))},onChange:function(){var t=!(arguments.length>0&&void 0!==arguments[0])||arguments[0];t&&this.debounce?this.debouncedUpdate():this.update()},onChangeImage:function(){var t,e=this;if(this.imageLoaded=!1,this.delayedTransforms=null,this.src){if(function(t){if(T(t))return!1;var e=window.location,i=/(\\w+:)?(?:\\/\\/)([\\w.-]+)?(?::(\\d+))?\\/?/.exec(t)||[],n={protocol:i[1]||\"\",host:i[2]||\"\",port:i[3]||\"\"},s=function(t){return t.port||(\"http\"===(t.protocol||e.protocol)?80:433)};return!(!n.protocol&&!n.host&&!n.port||Boolean(n.protocol&&n.protocol==e.protocol&&n.host&&n.host==e.host&&n.host&&s(n)==s(e)))}(this.src)){var i=D(this.crossOrigin)?this.canvas:this.crossOrigin;!0===i&&(i=\"anonymous\"),this.imageAttributes.crossOrigin=i||null}if(this.checkOrientation){var n=(t=this.src,new Promise((function(e){Jt(t).then((function(i){var n=ee(i);e(i?{source:t,arrayBuffer:i,orientation:n}:{source:t,arrayBuffer:null,orientation:null})})).catch((function(i){console.warn(i),e({source:t,arrayBuffer:null,orientation:null})}))})));setTimeout((function(){n.then(e.onParseImage)}),this.transitionTime)}else setTimeout((function(){e.onParseImage({source:e.src})}),this.transitionTime)}else this.clearImage()},onFailLoadImage:function(){this.imageAttributes.src&&(this.clearImage(),this.$emit(\"error\"))},onSuccessLoadImage:function(){var t=this,e=this.$refs.image;e&&!this.imageLoaded&&(this.imageAttributes.height=e.naturalHeight,this.imageAttributes.width=e.naturalWidth,this.imageLoaded=!0,this.resetVisibleArea().then((function(){t.$emit(\"ready\"),t.onChange(!1)})))},onParseImage:function(t){var e=this,i=t.source,n=t.arrayBuffer,s=t.orientation;this.imageAttributes.revoke&&this.imageAttributes.src&&URL.revokeObjectURL(this.imageAttributes.src),this.imageAttributes.revoke=!1,n&&s&&s>1?W(i)||!T(i)?(this.imageAttributes.src=URL.createObjectURL(new Blob([n])),this.imageAttributes.revoke=!0):this.imageAttributes.src=function(t){for(var e=[],i=new Uint8Array(t);i.length>0;){var n=i.subarray(0,8192);e.push(String.fromCharCode.apply(null,Array.from?Array.from(n):n.slice())),i=i.subarray(8192)}return\"data:image/jpeg;base64,\"+btoa(e.join(\"\"))}(n):this.imageAttributes.src=i,O(this.defaultTransforms)?this.appliedImageTransforms=Kt(this.defaultTransforms()):H(this.defaultTransforms)?this.appliedImageTransforms=Kt(this.defaultTransforms):this.appliedImageTransforms=function(t){var e=Kt({});if(t)switch(t){case 2:e.flip.horizontal=!0;break;case 3:e.rotate=-180;break;case 4:e.flip.vertical=!0;break;case 5:e.rotate=90,e.flip.vertical=!0;break;case 6:e.rotate=90;break;case 7:e.rotate=90,e.flip.horizontal=!0;break;case 8:e.rotate=-90}return e}(s),this.defaultImageTransforms=g(g({},this.appliedImageTransforms),{},{flip:g({},this.appliedImageTransforms.flip)}),this.$nextTick((function(){var t=e.$refs.image;t&&t.complete&&(!function(t){return Boolean(t.naturalWidth)}(t)?e.onFailLoadImage():e.onSuccessLoadImage())}))},onResizeEnd:function(){this.runAutoZoom(\"resize\",{transitions:!0})},onMoveEnd:function(){this.runAutoZoom(\"move\",{transitions:!0})},onMove:function(t){var e=this;this.transitionsOptions.enabled||this.awaitRender((function(){e.coordinates=e.moveAlgorithm(g(g({},e.getPublicProperties()),{},{positionRestrictions:jt(e.positionRestrictions,e.visibleArea),coordinates:e.coordinates,event:e.normalizeEvent(t)})),e.onChange()}))},onResize:function(t){var e=this;this.transitionsOptions.enabled||this.stencilSize&&!this.autoZoom||this.awaitRender((function(){var i=e.sizeRestrictions,n=Math.min(e.coordinates.width,e.coordinates.height,20*e.coefficient);e.coordinates=e.resizeAlgorithm(g(g({},e.getPublicProperties()),{},{positionRestrictions:jt(e.positionRestrictions,e.visibleArea),sizeRestrictions:{maxWidth:Math.min(i.maxWidth,e.visibleArea.width),maxHeight:Math.min(i.maxHeight,e.visibleArea.height),minWidth:Math.max(i.minWidth,n),minHeight:Math.max(i.minHeight,n)},event:e.normalizeEvent(t)})),e.onChange(),e.ticking=!1}))},onManipulateImage:function(t){var e=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{};if(!this.transitionsOptions.enabled){var i=e.transitions,n=void 0!==i&&i,s=e.normalize,o=void 0===s||s;n&&this.enableTransitions();var r=Lt(g(g({},this.getPublicProperties()),{},{event:o?this.normalizeEvent(t):t,getAreaRestrictions:this.getAreaRestrictions,imageRestriction:this.imageRestriction,adjustStencil:!this.stencilSize&&this.settings.resizeImage.adjustStencil})),a=r.visibleArea,h=r.coordinates;this.visibleArea=a,this.coordinates=h,this.runAutoZoom(\"manipulateImage\"),this.onChange(),n&&this.debouncedDisableTransitions()}},onPropsChange:function(){this.coordinates=this.applyTransform(this.coordinates,!0),this.onChange(!1)},getAreaRestrictions:function(){var t=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{},e=t.visibleArea,i=t.type,n=void 0===i?\"move\":i;return this.areaRestrictionsAlgorithm({boundaries:this.boundaries,imageSize:this.imageSize,imageRestriction:this.imageRestriction,visibleArea:e,type:n})},getAspectRatio:function(t){var e,i,n=this.stencilProps,s=n.aspectRatio,o=n.minAspectRatio,r=n.maxAspectRatio;if(this.$refs.stencil&&this.$refs.stencil.aspectRatios){var a=this.$refs.stencil.aspectRatios();e=a.minimum,i=a.maximum}if(D(e)&&(e=D(s)?o:s),D(i)&&(i=D(s)?r:s),!t&&(D(e)||D(i))){var h=this.getStencilSize(),c=h?ct(h):null;D(e)&&(e=P(c)?c:void 0),D(i)&&(i=P(c)?c:void 0)}return{minimum:e,maximum:i}},getStencilSize:function(){if(this.stencilSize)return t={currentStencilSize:{width:this.stencilCoordinates.width,height:this.stencilCoordinates.height},stencilSize:this.stencilSize,boundaries:this.boundaries,coefficient:this.coefficient,coordinates:this.coordinates,aspectRatio:this.getAspectRatio(!0)},e=t.boundaries,i=t.stencilSize,n=t.aspectRatio,dt(ct(s=O(i)?i({boundaries:e,aspectRatio:n}):i),n)&&(s=Mt({sizeRestrictions:{maxWidth:e.width,maxHeight:e.height,minWidth:0,minHeight:0},width:s.width,height:s.height,aspectRatio:{minimum:n.minimum,maximum:n.maximum}})),(s.width>e.width||s.height>e.height)&&(s=Mt({sizeRestrictions:{maxWidth:e.width,maxHeight:e.height,minWidth:0,minHeight:0},width:s.width,height:s.height,aspectRatio:{minimum:ct(s),maximum:ct(s)}})),s;var t,e,i,n,s},getPublicProperties:function(){return{coefficient:this.coefficient,visibleArea:this.visibleArea,coordinates:this.coordinates,boundaries:this.boundaries,sizeRestrictions:this.sizeRestrictions,positionRestrictions:this.positionRestrictions,aspectRatio:this.getAspectRatio(),imageRestriction:this.imageRestriction}},defaultCoordinates:function(){return g({},J)},flip:function(t,e){var i=arguments.length>2&&void 0!==arguments[2]?arguments[2]:{},n=i.transitions,s=void 0===n||n;if(!this.transitionsActive){s&&this.enableTransitions();var o=g({},this.imageTransforms.flip),r=$t({flip:{horizontal:t?!o.horizontal:o.horizontal,vertical:e?!o.vertical:o.vertical},previousFlip:o,rotate:this.imageTransforms.rotate,visibleArea:this.visibleArea,coordinates:this.coordinates,imageSize:this.imageSize,positionRestrictions:this.positionRestrictions,sizeRestrictions:this.sizeRestrictions,getAreaRestrictions:this.getAreaRestrictions,aspectRatio:this.getAspectRatio()}),a=r.visibleArea,h=r.coordinates;t&&(this.appliedImageTransforms.flip.horizontal=!this.appliedImageTransforms.flip.horizontal),e&&(this.appliedImageTransforms.flip.vertical=!this.appliedImageTransforms.flip.vertical),this.visibleArea=a,this.coordinates=h,this.onChange(),s&&this.debouncedDisableTransitions()}},rotate:function(t){var e=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{},i=e.transitions,n=void 0===i||i;if(!this.transitionsActive){n&&this.enableTransitions();var s=g({},this.imageSize);this.appliedImageTransforms.rotate+=t;var o=Pt({visibleArea:this.visibleArea,coordinates:this.coordinates,previousImageSize:s,imageSize:this.imageSize,angle:t,positionRestrictions:this.positionRestrictions,sizeRestrictions:this.sizeRestrictions,getAreaRestrictions:this.getAreaRestrictions,aspectRatio:this.getAspectRatio()}),r=o.visibleArea,a=o.coordinates,h=this.processAutoZoom(\"rotateImage\",r,a);r=h.visibleArea,a=h.coordinates,this.visibleArea=r,this.coordinates=a,this.onChange(),n&&this.debouncedDisableTransitions()}}},emits:[\"change\",\"error\",\"ready\"]},ve={key:0,ref:\"canvas\",style:{display:\"none\"}},be={key:1,ref:\"sourceCanvas\",style:{display:\"none\"}};fe.render=function(i,n,r,a,p,g){return t(),e(\"div\",{ref:\"cropper\",class:g.classes.cropper},[s(\"div\",{ref:\"stretcher\",class:g.classes.stretcher},null,2),s(\"div\",{class:g.classes.boundaries,style:g.boundariesStyle},[(t(),e(h(r.backgroundWrapperComponent),{class:g.classes.cropperWrapper,\"wheel-resize\":g.settings.resizeImage.wheel,\"touch-resize\":g.settings.resizeImage.touch,\"touch-move\":g.settings.moveImage.touch,\"mouse-move\":g.settings.moveImage.mouse,onMove:g.onManipulateImage,onResize:g.onManipulateImage},{default:o((function(){return[s(\"div\",{class:g.classes.background,style:g.boundariesStyle},null,6),s(\"div\",{class:g.classes.imageWrapper},[s(\"img\",{ref:\"image\",crossorigin:p.imageAttributes.crossOrigin,src:p.imageAttributes.src,class:g.classes.image,style:g.imageStyle,onMousedown:n[1]||(n[1]=d((function(){}),[\"prevent\"]))},null,46,[\"crossorigin\",\"src\"])],2),s(\"div\",{class:g.classes.foreground,style:g.boundariesStyle},null,6),c((t(),e(h(r.stencilComponent),u({ref:\"stencil\",image:g.image,coordinates:p.coordinates,\"stencil-coordinates\":g.stencilCoordinates,transitions:g.transitionsOptions},r.stencilProps,{onResize:g.onResize,onResizeEnd:g.onResizeEnd,onMove:g.onMove,onMoveEnd:g.onMoveEnd}),null,16,[\"image\",\"coordinates\",\"stencil-coordinates\",\"transitions\",\"onResize\",\"onResizeEnd\",\"onMove\",\"onMoveEnd\"])),[[l,p.imageLoaded]]),r.canvas?(t(),e(\"canvas\",ve,null,512)):m(\"\",!0),r.canvas?(t(),e(\"canvas\",be,null,512)):m(\"\",!0)]})),_:1},8,[\"class\",\"wheel-resize\",\"touch-resize\",\"touch-move\",\"mouse-move\",\"onMove\",\"onResize\"]))],6)],2)};export{re as BackgroundWrapper,_t as BoundingBox,me as CircleStencil,fe as Cropper,k as DragEvent,Qt as DraggableArea,F as DraggableElement,N as HandlerWrapper,q as LineWrapper,Y as MoveEvent,he as Preview,ne as PreviewResult,ue as RectangleStencil,X as ResizeEvent,kt as SimpleHandler,Nt as SimpleLine,ce as StencilPreview,oe as TransformableImage};\n","<script setup lang=\"ts\">\nimport { useI18n } from \"../../composables/useI18n\";\nimport { useMediaCategories } from \"../../composables/useMediaCategories\";\nimport {\n ASPECT_RATIO_VALUES,\n calculateOutputDimensions,\n canvasToFile,\n getExportSettings,\n resizeCanvas,\n type AspectRatioPreset,\n} from \"../../composables/useImageCrop\";\nimport { POPOVER_TARGET_KEY, UI_THEME_KEY } from \"../../keys\";\nimport type { MediaItem } from \"../../types\";\nimport { computed, inject, ref, watch } from \"vue\";\nimport { Cropper, type CropperResult } from \"vue-advanced-cropper\";\nimport \"vue-advanced-cropper/dist/style.css\";\n\nexport interface CropData {\n file: File;\n}\n\nconst props = defineProps<{\n visible: boolean;\n item: MediaItem | null;\n}>();\n\nconst emit = defineEmits<{\n (\n e: \"save\",\n id: string,\n filename: string,\n altText?: string,\n cropData?: CropData,\n ): void;\n (e: \"close\"): void;\n}>();\n\nconst { t } = useI18n();\nconst tplUiTheme = inject(UI_THEME_KEY, null);\nconst popoverTarget = inject(POPOVER_TARGET_KEY, ref<HTMLElement | null>(null));\nconst mediaT = t.mediaLibrary as Record<string, string>;\n\nconst { isImageMimeType } = useMediaCategories();\n\nconst filenameValue = ref(\"\");\nconst altTextValue = ref(\"\");\n\nconst cropperRef = ref<InstanceType<typeof Cropper> | null>(null);\nconst aspectRatio = ref<AspectRatioPreset>(\"free\");\nconst maxWidth = ref<number | undefined>(undefined);\nconst maxHeight = ref<number | undefined>(undefined);\nconst maxWidthInput = ref(\"\");\nconst maxHeightInput = ref(\"\");\nconst originalAspectRatio = ref<number | undefined>(undefined);\nconst cropCoordinates = ref<{ width: number; height: number } | null>(null);\nconst imageLoaded = ref(false);\nconst isSaving = ref(false);\nconst hasModifiedCrop = ref(false);\n\nconst isCroppableImage = computed(() => {\n if (!props.item) {\n return false;\n }\n\n const croppableMimeTypes = [\n \"image/jpeg\",\n \"image/png\",\n \"image/webp\",\n \"image/gif\",\n ];\n\n return croppableMimeTypes.includes(props.item.mime_type);\n});\n\nconst aspectRatioValue = computed(() => {\n if (aspectRatio.value === \"original\") {\n return originalAspectRatio.value;\n }\n\n return ASPECT_RATIO_VALUES[aspectRatio.value];\n});\n\nconst outputDimensions = computed(() => {\n if (!cropCoordinates.value) {\n return null;\n }\n\n return calculateOutputDimensions(\n cropCoordinates.value.width,\n cropCoordinates.value.height,\n maxWidth.value,\n maxHeight.value,\n );\n});\n\nwatch(\n () => props.visible,\n (visible) => {\n if (visible && props.item) {\n filenameValue.value = props.item.filename;\n altTextValue.value = props.item.alt_text || \"\";\n aspectRatio.value = \"free\";\n maxWidth.value = undefined;\n maxHeight.value = undefined;\n maxWidthInput.value = \"\";\n maxHeightInput.value = \"\";\n originalAspectRatio.value = undefined;\n cropCoordinates.value = null;\n imageLoaded.value = false;\n hasModifiedCrop.value = false;\n\n if (props.item.width && props.item.height) {\n originalAspectRatio.value = props.item.width / props.item.height;\n }\n }\n },\n);\n\nfunction handleCropChange(result: CropperResult): void {\n if (result.coordinates) {\n cropCoordinates.value = {\n width: Math.round(result.coordinates.width),\n height: Math.round(result.coordinates.height),\n };\n hasModifiedCrop.value = true;\n }\n}\n\nfunction handleImageReady(): void {\n imageLoaded.value = true;\n\n if (!originalAspectRatio.value && props.item?.width && props.item?.height) {\n originalAspectRatio.value = props.item.width / props.item.height;\n }\n}\n\nfunction handleMaxWidthInput(event: Event): void {\n const value = (event.target as HTMLInputElement).value;\n maxWidthInput.value = value;\n maxWidth.value = value ? parseInt(value, 10) || undefined : undefined;\n}\n\nfunction handleMaxHeightInput(event: Event): void {\n const value = (event.target as HTMLInputElement).value;\n maxHeightInput.value = value;\n maxHeight.value = value ? parseInt(value, 10) || undefined : undefined;\n}\n\nasync function handleSave(): Promise<void> {\n const trimmedFilename = filenameValue.value.trim();\n if (!trimmedFilename || !props.item || isSaving.value) {\n return;\n }\n\n const isImage = isImageMimeType(props.item.mime_type);\n let cropData: CropData | undefined;\n\n if (isCroppableImage.value && cropperRef.value && hasModifiedCrop.value) {\n isSaving.value = true;\n try {\n const { canvas } = cropperRef.value.getResult();\n if (canvas) {\n const resizedCanvas = resizeCanvas(\n canvas,\n maxWidth.value,\n maxHeight.value,\n );\n const settings = getExportSettings(props.item.mime_type);\n const file = await canvasToFile(\n resizedCanvas,\n props.item.filename,\n settings,\n );\n cropData = { file };\n }\n } catch {\n isSaving.value = false;\n return;\n }\n isSaving.value = false;\n }\n\n emit(\n \"save\",\n props.item.id,\n trimmedFilename,\n isImage ? altTextValue.value : undefined,\n cropData,\n );\n emit(\"close\");\n}\n\nfunction handleKeydown(event: KeyboardEvent): void {\n if (event.key === \"Enter\" && !isSaving.value) {\n event.preventDefault();\n handleSave();\n }\n if (event.key === \"Escape\") {\n emit(\"close\");\n }\n}\n</script>\n\n<template>\n <Teleport :to=\"popoverTarget || 'body'\">\n <Transition\n enter-active-class=\"tpl:transition tpl:ease-out tpl:duration-150\"\n enter-from-class=\"tpl:opacity-0\"\n enter-to-class=\"tpl:opacity-100\"\n leave-active-class=\"tpl:transition tpl:ease-in tpl:duration-100\"\n leave-from-class=\"tpl:opacity-100\"\n leave-to-class=\"tpl:opacity-0\"\n >\n <div\n v-if=\"visible && item\"\n :data-tpl-theme=\"tplUiTheme\"\n class=\"tpl tpl:fixed tpl:inset-0 tpl:z-[10000] tpl:flex tpl:items-center tpl:justify-center tpl:p-4\"\n style=\"background-color: var(--tpl-overlay)\"\n @click.self=\"emit('close')\"\n @keydown=\"handleKeydown\"\n >\n <div\n class=\"tpl:flex tpl:max-h-[90%] tpl:w-full tpl:flex-col tpl:overflow-hidden tpl:rounded-lg tpl:shadow-xl\"\n :class=\"isCroppableImage ? 'tpl:max-w-2xl' : 'tpl:max-w-sm'\"\n style=\"background-color: var(--tpl-bg-elevated)\"\n >\n <!-- Header -->\n <div class=\"tpl:shrink-0 tpl:p-5 tpl:pb-4\">\n <h3\n class=\"tpl:text-sm tpl:font-semibold\"\n style=\"color: var(--tpl-text)\"\n >\n {{ t.mediaLibrary.editFile }}\n </h3>\n </div>\n\n <!-- Scrollable content -->\n <div class=\"tpl:min-h-0 tpl:flex-1 tpl:overflow-y-auto tpl:px-5\">\n <!-- Image Cropper (for images only) -->\n <div v-if=\"isCroppableImage\" class=\"tpl:mb-4\">\n <!-- Cropper -->\n <div\n class=\"tpl:relative tpl:mb-3 tpl:overflow-hidden tpl:rounded-md tpl:border\"\n style=\"\n border-color: var(--tpl-border);\n height: 300px;\n background-color: var(--tpl-bg);\n \"\n >\n <Cropper\n ref=\"cropperRef\"\n :src=\"item.url\"\n :stencil-props=\"{\n aspectRatio: aspectRatioValue,\n }\"\n class=\"tpl:h-full tpl:w-full\"\n background-class=\"tpl-cropper-background\"\n @change=\"handleCropChange\"\n @ready=\"handleImageReady\"\n />\n </div>\n\n <!-- Crop controls -->\n <div class=\"tpl:space-y-3\">\n <!-- Aspect ratio -->\n <div>\n <label\n class=\"tpl:mb-1.5 tpl:block tpl:text-xs tpl:font-medium\"\n style=\"color: var(--tpl-text-muted)\"\n >\n {{ t.mediaLibrary.cropAspectRatio }}\n </label>\n <div class=\"tpl:flex tpl:flex-wrap tpl:gap-1.5\">\n <button\n v-for=\"preset in [\n 'free',\n 'square',\n 'landscape43',\n 'landscape169',\n 'original',\n ] as const\"\n :key=\"preset\"\n type=\"button\"\n class=\"tpl:cursor-pointer tpl:rounded-md tpl:border tpl:px-2.5 tpl:py-1 tpl:text-xs tpl:font-medium tpl:transition-all tpl:duration-150\"\n :style=\"{\n borderColor:\n aspectRatio === preset\n ? 'var(--tpl-primary)'\n : 'var(--tpl-border)',\n backgroundColor:\n aspectRatio === preset\n ? 'var(--tpl-primary-light)'\n : 'var(--tpl-bg)',\n color:\n aspectRatio === preset\n ? 'var(--tpl-primary)'\n : 'var(--tpl-text)',\n }\"\n @click=\"aspectRatio = preset\"\n >\n {{\n mediaT[\n `crop${preset.charAt(0).toUpperCase()}${preset.slice(1)}`\n ]\n }}\n </button>\n </div>\n </div>\n\n <!-- Max dimensions -->\n <div class=\"tpl:flex tpl:gap-3\">\n <div class=\"tpl:flex-1\">\n <label\n class=\"tpl:mb-1 tpl:block tpl:text-xs tpl:font-medium\"\n style=\"color: var(--tpl-text-muted)\"\n >\n {{ t.mediaLibrary.cropMaxWidth }}\n <span\n class=\"tpl:font-normal\"\n style=\"color: var(--tpl-text-dim)\"\n >\n {{ t.mediaLibrary.cropOptional }}\n </span>\n </label>\n <div class=\"tpl:relative\">\n <input\n :value=\"maxWidthInput\"\n type=\"number\"\n min=\"1\"\n class=\"tpl:w-full tpl:rounded-md tpl:border tpl:py-1.5 tpl:pr-8 tpl:pl-3 tpl:text-xs tpl:outline-none\"\n style=\"\n border-color: var(--tpl-border);\n background-color: var(--tpl-bg);\n color: var(--tpl-text);\n \"\n :placeholder=\"cropCoordinates?.width?.toString() || ''\"\n @input=\"handleMaxWidthInput\"\n />\n <span\n class=\"tpl:absolute tpl:top-1/2 tpl:right-2.5 tpl:-translate-y-1/2 tpl:text-xs\"\n style=\"color: var(--tpl-text-dim)\"\n >\n {{ t.mediaLibrary.cropPixels }}\n </span>\n </div>\n </div>\n <div class=\"tpl:flex-1\">\n <label\n class=\"tpl:mb-1 tpl:block tpl:text-xs tpl:font-medium\"\n style=\"color: var(--tpl-text-muted)\"\n >\n {{ t.mediaLibrary.cropMaxHeight }}\n <span\n class=\"tpl:font-normal\"\n style=\"color: var(--tpl-text-dim)\"\n >\n {{ t.mediaLibrary.cropOptional }}\n </span>\n </label>\n <div class=\"tpl:relative\">\n <input\n :value=\"maxHeightInput\"\n type=\"number\"\n min=\"1\"\n class=\"tpl:w-full tpl:rounded-md tpl:border tpl:py-1.5 tpl:pr-8 tpl:pl-3 tpl:text-xs tpl:outline-none\"\n style=\"\n border-color: var(--tpl-border);\n background-color: var(--tpl-bg);\n color: var(--tpl-text);\n \"\n :placeholder=\"cropCoordinates?.height?.toString() || ''\"\n @input=\"handleMaxHeightInput\"\n />\n <span\n class=\"tpl:absolute tpl:top-1/2 tpl:right-2.5 tpl:-translate-y-1/2 tpl:text-xs\"\n style=\"color: var(--tpl-text-dim)\"\n >\n {{ t.mediaLibrary.cropPixels }}\n </span>\n </div>\n </div>\n </div>\n\n <!-- Output dimensions -->\n <div\n v-if=\"outputDimensions\"\n class=\"tpl:flex tpl:items-center tpl:gap-1 tpl:text-xs\"\n style=\"color: var(--tpl-text-muted)\"\n >\n <span> {{ t.mediaLibrary.cropOutputSize }}: </span>\n <span class=\"tpl:font-medium\" style=\"color: var(--tpl-text)\">\n {{ outputDimensions.width }} x\n {{ outputDimensions.height }}\n {{ t.mediaLibrary.cropPixels }}\n </span>\n </div>\n </div>\n </div>\n\n <!-- Filename -->\n <div class=\"tpl:mb-3\">\n <label\n class=\"tpl:mb-1 tpl:block tpl:text-xs tpl:font-medium\"\n style=\"color: var(--tpl-text-muted)\"\n >\n {{ t.mediaLibrary.fileName }}\n </label>\n <input\n v-model=\"filenameValue\"\n type=\"text\"\n class=\"tpl:w-full tpl:rounded-md tpl:border tpl:px-3 tpl:py-1.5 tpl:text-xs tpl:outline-none\"\n style=\"\n border-color: var(--tpl-border);\n background-color: var(--tpl-bg);\n color: var(--tpl-text);\n \"\n :autofocus=\"!isCroppableImage\"\n />\n </div>\n\n <!-- Alt Text (images only) -->\n <div v-if=\"isImageMimeType(item.mime_type)\" class=\"tpl:mb-4\">\n <label\n class=\"tpl:mb-1 tpl:block tpl:text-xs tpl:font-medium\"\n style=\"color: var(--tpl-text-muted)\"\n >\n {{ t.mediaLibrary.altText }}\n </label>\n <input\n v-model=\"altTextValue\"\n type=\"text\"\n class=\"tpl:w-full tpl:rounded-md tpl:border tpl:px-3 tpl:py-1.5 tpl:text-xs tpl:outline-none\"\n style=\"\n border-color: var(--tpl-border);\n background-color: var(--tpl-bg);\n color: var(--tpl-text);\n \"\n :placeholder=\"t.mediaLibrary.altTextPlaceholder\"\n />\n </div>\n </div>\n\n <!-- Actions -->\n <div\n class=\"tpl:flex tpl:shrink-0 tpl:justify-end tpl:gap-2 tpl:p-5 tpl:pt-4\"\n >\n <button\n class=\"tpl:cursor-pointer tpl:rounded-md tpl:border tpl:px-3 tpl:py-1.5 tpl:text-xs tpl:font-medium tpl:transition-all tpl:duration-150\"\n style=\"\n border-color: var(--tpl-border);\n color: var(--tpl-text);\n background-color: var(--tpl-bg);\n \"\n @click=\"emit('close')\"\n >\n {{ t.mediaLibrary.cancel }}\n </button>\n <button\n class=\"tpl:cursor-pointer tpl:rounded-md tpl:px-3 tpl:py-1.5 tpl:text-xs tpl:font-medium tpl:text-white tpl:transition-all tpl:duration-150 tpl:disabled:cursor-not-allowed tpl:disabled:opacity-50\"\n style=\"\n background: linear-gradient(\n 135deg,\n var(--tpl-primary),\n var(--tpl-primary-hover)\n );\n \"\n :disabled=\"isSaving\"\n @click=\"handleSave\"\n >\n {{\n isSaving ? t.mediaLibrary.saving : t.mediaLibrary.saveChanges\n }}\n </button>\n </div>\n </div>\n </div>\n </Transition>\n </Teleport>\n</template>\n\n<style scoped>\n:deep(.tpl-cropper-background) {\n background-color: var(--tpl-bg) !important;\n}\n\n:deep(.vue-advanced-cropper) {\n background-color: transparent !important;\n}\n\n:deep(.vue-advanced-cropper__background) {\n background-color: var(--tpl-bg) !important;\n}\n\n:deep(.vue-advanced-cropper__foreground) {\n background-color: var(--tpl-overlay) !important;\n}\n</style>\n","<script setup lang=\"ts\">\nimport { useI18n } from \"../../composables/useI18n\";\nimport { useMediaCategories } from \"../../composables/useMediaCategories\";\nimport {\n ASPECT_RATIO_VALUES,\n calculateOutputDimensions,\n canvasToFile,\n getExportSettings,\n resizeCanvas,\n type AspectRatioPreset,\n} from \"../../composables/useImageCrop\";\nimport { POPOVER_TARGET_KEY, UI_THEME_KEY } from \"../../keys\";\nimport type { MediaItem } from \"../../types\";\nimport { computed, inject, ref, watch } from \"vue\";\nimport { Cropper, type CropperResult } from \"vue-advanced-cropper\";\nimport \"vue-advanced-cropper/dist/style.css\";\n\nexport interface CropData {\n file: File;\n}\n\nconst props = defineProps<{\n visible: boolean;\n item: MediaItem | null;\n}>();\n\nconst emit = defineEmits<{\n (\n e: \"save\",\n id: string,\n filename: string,\n altText?: string,\n cropData?: CropData,\n ): void;\n (e: \"close\"): void;\n}>();\n\nconst { t } = useI18n();\nconst tplUiTheme = inject(UI_THEME_KEY, null);\nconst popoverTarget = inject(POPOVER_TARGET_KEY, ref<HTMLElement | null>(null));\nconst mediaT = t.mediaLibrary as Record<string, string>;\n\nconst { isImageMimeType } = useMediaCategories();\n\nconst filenameValue = ref(\"\");\nconst altTextValue = ref(\"\");\n\nconst cropperRef = ref<InstanceType<typeof Cropper> | null>(null);\nconst aspectRatio = ref<AspectRatioPreset>(\"free\");\nconst maxWidth = ref<number | undefined>(undefined);\nconst maxHeight = ref<number | undefined>(undefined);\nconst maxWidthInput = ref(\"\");\nconst maxHeightInput = ref(\"\");\nconst originalAspectRatio = ref<number | undefined>(undefined);\nconst cropCoordinates = ref<{ width: number; height: number } | null>(null);\nconst imageLoaded = ref(false);\nconst isSaving = ref(false);\nconst hasModifiedCrop = ref(false);\n\nconst isCroppableImage = computed(() => {\n if (!props.item) {\n return false;\n }\n\n const croppableMimeTypes = [\n \"image/jpeg\",\n \"image/png\",\n \"image/webp\",\n \"image/gif\",\n ];\n\n return croppableMimeTypes.includes(props.item.mime_type);\n});\n\nconst aspectRatioValue = computed(() => {\n if (aspectRatio.value === \"original\") {\n return originalAspectRatio.value;\n }\n\n return ASPECT_RATIO_VALUES[aspectRatio.value];\n});\n\nconst outputDimensions = computed(() => {\n if (!cropCoordinates.value) {\n return null;\n }\n\n return calculateOutputDimensions(\n cropCoordinates.value.width,\n cropCoordinates.value.height,\n maxWidth.value,\n maxHeight.value,\n );\n});\n\nwatch(\n () => props.visible,\n (visible) => {\n if (visible && props.item) {\n filenameValue.value = props.item.filename;\n altTextValue.value = props.item.alt_text || \"\";\n aspectRatio.value = \"free\";\n maxWidth.value = undefined;\n maxHeight.value = undefined;\n maxWidthInput.value = \"\";\n maxHeightInput.value = \"\";\n originalAspectRatio.value = undefined;\n cropCoordinates.value = null;\n imageLoaded.value = false;\n hasModifiedCrop.value = false;\n\n if (props.item.width && props.item.height) {\n originalAspectRatio.value = props.item.width / props.item.height;\n }\n }\n },\n);\n\nfunction handleCropChange(result: CropperResult): void {\n if (result.coordinates) {\n cropCoordinates.value = {\n width: Math.round(result.coordinates.width),\n height: Math.round(result.coordinates.height),\n };\n hasModifiedCrop.value = true;\n }\n}\n\nfunction handleImageReady(): void {\n imageLoaded.value = true;\n\n if (!originalAspectRatio.value && props.item?.width && props.item?.height) {\n originalAspectRatio.value = props.item.width / props.item.height;\n }\n}\n\nfunction handleMaxWidthInput(event: Event): void {\n const value = (event.target as HTMLInputElement).value;\n maxWidthInput.value = value;\n maxWidth.value = value ? parseInt(value, 10) || undefined : undefined;\n}\n\nfunction handleMaxHeightInput(event: Event): void {\n const value = (event.target as HTMLInputElement).value;\n maxHeightInput.value = value;\n maxHeight.value = value ? parseInt(value, 10) || undefined : undefined;\n}\n\nasync function handleSave(): Promise<void> {\n const trimmedFilename = filenameValue.value.trim();\n if (!trimmedFilename || !props.item || isSaving.value) {\n return;\n }\n\n const isImage = isImageMimeType(props.item.mime_type);\n let cropData: CropData | undefined;\n\n if (isCroppableImage.value && cropperRef.value && hasModifiedCrop.value) {\n isSaving.value = true;\n try {\n const { canvas } = cropperRef.value.getResult();\n if (canvas) {\n const resizedCanvas = resizeCanvas(\n canvas,\n maxWidth.value,\n maxHeight.value,\n );\n const settings = getExportSettings(props.item.mime_type);\n const file = await canvasToFile(\n resizedCanvas,\n props.item.filename,\n settings,\n );\n cropData = { file };\n }\n } catch {\n isSaving.value = false;\n return;\n }\n isSaving.value = false;\n }\n\n emit(\n \"save\",\n props.item.id,\n trimmedFilename,\n isImage ? altTextValue.value : undefined,\n cropData,\n );\n emit(\"close\");\n}\n\nfunction handleKeydown(event: KeyboardEvent): void {\n if (event.key === \"Enter\" && !isSaving.value) {\n event.preventDefault();\n handleSave();\n }\n if (event.key === \"Escape\") {\n emit(\"close\");\n }\n}\n</script>\n\n<template>\n <Teleport :to=\"popoverTarget || 'body'\">\n <Transition\n enter-active-class=\"tpl:transition tpl:ease-out tpl:duration-150\"\n enter-from-class=\"tpl:opacity-0\"\n enter-to-class=\"tpl:opacity-100\"\n leave-active-class=\"tpl:transition tpl:ease-in tpl:duration-100\"\n leave-from-class=\"tpl:opacity-100\"\n leave-to-class=\"tpl:opacity-0\"\n >\n <div\n v-if=\"visible && item\"\n :data-tpl-theme=\"tplUiTheme\"\n class=\"tpl tpl:fixed tpl:inset-0 tpl:z-[10000] tpl:flex tpl:items-center tpl:justify-center tpl:p-4\"\n style=\"background-color: var(--tpl-overlay)\"\n @click.self=\"emit('close')\"\n @keydown=\"handleKeydown\"\n >\n <div\n class=\"tpl:flex tpl:max-h-[90%] tpl:w-full tpl:flex-col tpl:overflow-hidden tpl:rounded-lg tpl:shadow-xl\"\n :class=\"isCroppableImage ? 'tpl:max-w-2xl' : 'tpl:max-w-sm'\"\n style=\"background-color: var(--tpl-bg-elevated)\"\n >\n <!-- Header -->\n <div class=\"tpl:shrink-0 tpl:p-5 tpl:pb-4\">\n <h3\n class=\"tpl:text-sm tpl:font-semibold\"\n style=\"color: var(--tpl-text)\"\n >\n {{ t.mediaLibrary.editFile }}\n </h3>\n </div>\n\n <!-- Scrollable content -->\n <div class=\"tpl:min-h-0 tpl:flex-1 tpl:overflow-y-auto tpl:px-5\">\n <!-- Image Cropper (for images only) -->\n <div v-if=\"isCroppableImage\" class=\"tpl:mb-4\">\n <!-- Cropper -->\n <div\n class=\"tpl:relative tpl:mb-3 tpl:overflow-hidden tpl:rounded-md tpl:border\"\n style=\"\n border-color: var(--tpl-border);\n height: 300px;\n background-color: var(--tpl-bg);\n \"\n >\n <Cropper\n ref=\"cropperRef\"\n :src=\"item.url\"\n :stencil-props=\"{\n aspectRatio: aspectRatioValue,\n }\"\n class=\"tpl:h-full tpl:w-full\"\n background-class=\"tpl-cropper-background\"\n @change=\"handleCropChange\"\n @ready=\"handleImageReady\"\n />\n </div>\n\n <!-- Crop controls -->\n <div class=\"tpl:space-y-3\">\n <!-- Aspect ratio -->\n <div>\n <label\n class=\"tpl:mb-1.5 tpl:block tpl:text-xs tpl:font-medium\"\n style=\"color: var(--tpl-text-muted)\"\n >\n {{ t.mediaLibrary.cropAspectRatio }}\n </label>\n <div class=\"tpl:flex tpl:flex-wrap tpl:gap-1.5\">\n <button\n v-for=\"preset in [\n 'free',\n 'square',\n 'landscape43',\n 'landscape169',\n 'original',\n ] as const\"\n :key=\"preset\"\n type=\"button\"\n class=\"tpl:cursor-pointer tpl:rounded-md tpl:border tpl:px-2.5 tpl:py-1 tpl:text-xs tpl:font-medium tpl:transition-all tpl:duration-150\"\n :style=\"{\n borderColor:\n aspectRatio === preset\n ? 'var(--tpl-primary)'\n : 'var(--tpl-border)',\n backgroundColor:\n aspectRatio === preset\n ? 'var(--tpl-primary-light)'\n : 'var(--tpl-bg)',\n color:\n aspectRatio === preset\n ? 'var(--tpl-primary)'\n : 'var(--tpl-text)',\n }\"\n @click=\"aspectRatio = preset\"\n >\n {{\n mediaT[\n `crop${preset.charAt(0).toUpperCase()}${preset.slice(1)}`\n ]\n }}\n </button>\n </div>\n </div>\n\n <!-- Max dimensions -->\n <div class=\"tpl:flex tpl:gap-3\">\n <div class=\"tpl:flex-1\">\n <label\n class=\"tpl:mb-1 tpl:block tpl:text-xs tpl:font-medium\"\n style=\"color: var(--tpl-text-muted)\"\n >\n {{ t.mediaLibrary.cropMaxWidth }}\n <span\n class=\"tpl:font-normal\"\n style=\"color: var(--tpl-text-dim)\"\n >\n {{ t.mediaLibrary.cropOptional }}\n </span>\n </label>\n <div class=\"tpl:relative\">\n <input\n :value=\"maxWidthInput\"\n type=\"number\"\n min=\"1\"\n class=\"tpl:w-full tpl:rounded-md tpl:border tpl:py-1.5 tpl:pr-8 tpl:pl-3 tpl:text-xs tpl:outline-none\"\n style=\"\n border-color: var(--tpl-border);\n background-color: var(--tpl-bg);\n color: var(--tpl-text);\n \"\n :placeholder=\"cropCoordinates?.width?.toString() || ''\"\n @input=\"handleMaxWidthInput\"\n />\n <span\n class=\"tpl:absolute tpl:top-1/2 tpl:right-2.5 tpl:-translate-y-1/2 tpl:text-xs\"\n style=\"color: var(--tpl-text-dim)\"\n >\n {{ t.mediaLibrary.cropPixels }}\n </span>\n </div>\n </div>\n <div class=\"tpl:flex-1\">\n <label\n class=\"tpl:mb-1 tpl:block tpl:text-xs tpl:font-medium\"\n style=\"color: var(--tpl-text-muted)\"\n >\n {{ t.mediaLibrary.cropMaxHeight }}\n <span\n class=\"tpl:font-normal\"\n style=\"color: var(--tpl-text-dim)\"\n >\n {{ t.mediaLibrary.cropOptional }}\n </span>\n </label>\n <div class=\"tpl:relative\">\n <input\n :value=\"maxHeightInput\"\n type=\"number\"\n min=\"1\"\n class=\"tpl:w-full tpl:rounded-md tpl:border tpl:py-1.5 tpl:pr-8 tpl:pl-3 tpl:text-xs tpl:outline-none\"\n style=\"\n border-color: var(--tpl-border);\n background-color: var(--tpl-bg);\n color: var(--tpl-text);\n \"\n :placeholder=\"cropCoordinates?.height?.toString() || ''\"\n @input=\"handleMaxHeightInput\"\n />\n <span\n class=\"tpl:absolute tpl:top-1/2 tpl:right-2.5 tpl:-translate-y-1/2 tpl:text-xs\"\n style=\"color: var(--tpl-text-dim)\"\n >\n {{ t.mediaLibrary.cropPixels }}\n </span>\n </div>\n </div>\n </div>\n\n <!-- Output dimensions -->\n <div\n v-if=\"outputDimensions\"\n class=\"tpl:flex tpl:items-center tpl:gap-1 tpl:text-xs\"\n style=\"color: var(--tpl-text-muted)\"\n >\n <span> {{ t.mediaLibrary.cropOutputSize }}: </span>\n <span class=\"tpl:font-medium\" style=\"color: var(--tpl-text)\">\n {{ outputDimensions.width }} x\n {{ outputDimensions.height }}\n {{ t.mediaLibrary.cropPixels }}\n </span>\n </div>\n </div>\n </div>\n\n <!-- Filename -->\n <div class=\"tpl:mb-3\">\n <label\n class=\"tpl:mb-1 tpl:block tpl:text-xs tpl:font-medium\"\n style=\"color: var(--tpl-text-muted)\"\n >\n {{ t.mediaLibrary.fileName }}\n </label>\n <input\n v-model=\"filenameValue\"\n type=\"text\"\n class=\"tpl:w-full tpl:rounded-md tpl:border tpl:px-3 tpl:py-1.5 tpl:text-xs tpl:outline-none\"\n style=\"\n border-color: var(--tpl-border);\n background-color: var(--tpl-bg);\n color: var(--tpl-text);\n \"\n :autofocus=\"!isCroppableImage\"\n />\n </div>\n\n <!-- Alt Text (images only) -->\n <div v-if=\"isImageMimeType(item.mime_type)\" class=\"tpl:mb-4\">\n <label\n class=\"tpl:mb-1 tpl:block tpl:text-xs tpl:font-medium\"\n style=\"color: var(--tpl-text-muted)\"\n >\n {{ t.mediaLibrary.altText }}\n </label>\n <input\n v-model=\"altTextValue\"\n type=\"text\"\n class=\"tpl:w-full tpl:rounded-md tpl:border tpl:px-3 tpl:py-1.5 tpl:text-xs tpl:outline-none\"\n style=\"\n border-color: var(--tpl-border);\n background-color: var(--tpl-bg);\n color: var(--tpl-text);\n \"\n :placeholder=\"t.mediaLibrary.altTextPlaceholder\"\n />\n </div>\n </div>\n\n <!-- Actions -->\n <div\n class=\"tpl:flex tpl:shrink-0 tpl:justify-end tpl:gap-2 tpl:p-5 tpl:pt-4\"\n >\n <button\n class=\"tpl:cursor-pointer tpl:rounded-md tpl:border tpl:px-3 tpl:py-1.5 tpl:text-xs tpl:font-medium tpl:transition-all tpl:duration-150\"\n style=\"\n border-color: var(--tpl-border);\n color: var(--tpl-text);\n background-color: var(--tpl-bg);\n \"\n @click=\"emit('close')\"\n >\n {{ t.mediaLibrary.cancel }}\n </button>\n <button\n class=\"tpl:cursor-pointer tpl:rounded-md tpl:px-3 tpl:py-1.5 tpl:text-xs tpl:font-medium tpl:text-white tpl:transition-all tpl:duration-150 tpl:disabled:cursor-not-allowed tpl:disabled:opacity-50\"\n style=\"\n background: linear-gradient(\n 135deg,\n var(--tpl-primary),\n var(--tpl-primary-hover)\n );\n \"\n :disabled=\"isSaving\"\n @click=\"handleSave\"\n >\n {{\n isSaving ? t.mediaLibrary.saving : t.mediaLibrary.saveChanges\n }}\n </button>\n </div>\n </div>\n </div>\n </Transition>\n </Teleport>\n</template>\n\n<style scoped>\n:deep(.tpl-cropper-background) {\n background-color: var(--tpl-bg) !important;\n}\n\n:deep(.vue-advanced-cropper) {\n background-color: transparent !important;\n}\n\n:deep(.vue-advanced-cropper__background) {\n background-color: var(--tpl-bg) !important;\n}\n\n:deep(.vue-advanced-cropper__foreground) {\n background-color: var(--tpl-overlay) !important;\n}\n</style>\n","<script setup lang=\"ts\">\nimport { useI18n } from \"../../composables/useI18n\";\nimport type { MediaFolder } from \"../../types\";\nimport { ChevronRight, Folder, Pencil, Plus, Trash2 } from \"@lucide/vue\";\nimport { computed, ref } from \"vue\";\n\nconst props = defineProps<{\n folder: MediaFolder;\n currentFolderId: string | null;\n depth: number;\n}>();\n\nconst emit = defineEmits<{\n (e: \"navigate\", folderId: string | null): void;\n (e: \"createFolder\", name: string, parentId?: string | null): void;\n (e: \"renameFolder\", folderId: string, name: string): void;\n (e: \"deleteFolder\", folderId: string): void;\n}>();\n\nconst { t } = useI18n();\n\nconst isExpanded = ref(false);\nconst isRenaming = ref(false);\nconst renameValue = ref(\"\");\nconst isCreatingSubfolder = ref(false);\nconst subfolderName = ref(\"\");\n\nconst MAX_DEPTH = 5;\n\nconst hasChildren = computed(() => (props.folder.children?.length ?? 0) > 0);\n\nconst canCreateSubfolder = computed(() => props.depth < MAX_DEPTH - 1);\n\nconst isActive = computed(() => props.currentFolderId === props.folder.id);\n\nconst isDescendantActive = computed(() => {\n if (!props.currentFolderId || !props.folder.children) return false;\n return containsFolder(props.folder.children, props.currentFolderId);\n});\n\nconst shouldExpand = computed(\n () => isExpanded.value || isDescendantActive.value,\n);\n\nfunction containsFolder(folders: MediaFolder[], id: string): boolean {\n for (const folder of folders) {\n if (folder.id === id) return true;\n if (folder.children && containsFolder(folder.children, id)) return true;\n }\n return false;\n}\n\nfunction toggleExpand(): void {\n isExpanded.value = !isExpanded.value;\n}\n\nfunction startRename(): void {\n isRenaming.value = true;\n renameValue.value = props.folder.name;\n}\n\nfunction confirmRename(): void {\n const trimmed = renameValue.value.trim();\n if (trimmed && trimmed !== props.folder.name) {\n emit(\"renameFolder\", props.folder.id, trimmed);\n }\n isRenaming.value = false;\n renameValue.value = \"\";\n}\n\nfunction cancelRename(): void {\n isRenaming.value = false;\n renameValue.value = \"\";\n}\n\nfunction startCreateSubfolder(): void {\n isCreatingSubfolder.value = true;\n subfolderName.value = \"\";\n isExpanded.value = true;\n}\n\nfunction confirmCreateSubfolder(): void {\n if (subfolderName.value.trim()) {\n emit(\"createFolder\", subfolderName.value.trim(), props.folder.id);\n }\n isCreatingSubfolder.value = false;\n subfolderName.value = \"\";\n}\n\nfunction cancelCreateSubfolder(): void {\n isCreatingSubfolder.value = false;\n subfolderName.value = \"\";\n}\n</script>\n\n<template>\n <div>\n <!-- Folder row -->\n <div\n class=\"tpl:group tpl:flex tpl:w-full tpl:items-center tpl:gap-1 tpl:py-1.5 tpl:pr-2 tpl:text-left tpl:text-xs tpl:transition-all tpl:duration-150\"\n :style=\"{\n paddingLeft: `${depth * 16 + 8}px`,\n backgroundColor: isActive ? 'var(--tpl-bg-active)' : 'transparent',\n color: isActive ? 'var(--tpl-primary)' : 'var(--tpl-text)',\n }\"\n >\n <!-- Expand/collapse chevron -->\n <button\n v-if=\"hasChildren || isCreatingSubfolder\"\n class=\"tpl:flex tpl:size-4 tpl:shrink-0 tpl:items-center tpl:justify-center tpl:rounded tpl:transition-colors\"\n @click.stop=\"toggleExpand\"\n >\n <ChevronRight\n class=\"tpl:transition-transform tpl:duration-150\"\n :class=\"{ 'tpl:rotate-90': shouldExpand }\"\n :size=\"10\"\n :stroke-width=\"2\"\n />\n </button>\n <span v-else class=\"tpl:size-4 tpl:shrink-0\" />\n\n <!-- Folder icon + name (clickable) -->\n <button\n class=\"tpl:flex tpl:min-w-0 tpl:flex-1 tpl:items-center tpl:gap-1.5\"\n @click=\"emit('navigate', folder.id)\"\n >\n <Folder class=\"tpl:shrink-0\" :size=\"14\" :stroke-width=\"1.5\" />\n <template v-if=\"!isRenaming\">\n <span class=\"tpl:truncate\">{{ folder.name }}</span>\n </template>\n </button>\n\n <!-- Inline rename input -->\n <input\n v-if=\"isRenaming\"\n v-model=\"renameValue\"\n type=\"text\"\n class=\"tpl:min-w-0 tpl:flex-1 tpl:rounded tpl:border tpl:px-1.5 tpl:py-0.5 tpl:text-xs tpl:outline-none\"\n style=\"\n border-color: var(--tpl-primary);\n background-color: var(--tpl-bg);\n color: var(--tpl-text);\n \"\n autofocus\n @keydown.enter=\"confirmRename\"\n @keydown.escape=\"cancelRename\"\n @blur=\"confirmRename\"\n @click.stop\n />\n\n <!-- Hover actions -->\n <span\n v-if=\"!isRenaming\"\n class=\"tpl:flex tpl:shrink-0 tpl:items-center tpl:gap-0.5 tpl:opacity-0 tpl:transition-opacity tpl:group-hover:opacity-100\"\n >\n <!-- Add subfolder -->\n <button\n v-if=\"canCreateSubfolder\"\n class=\"tpl:flex tpl:size-6 tpl:items-center tpl:justify-center tpl:rounded tpl:transition-colors\"\n :title=\"t.mediaLibrary.addSubfolder\"\n @click.stop=\"startCreateSubfolder\"\n >\n <Plus :size=\"12\" :stroke-width=\"2\" />\n </button>\n <!-- Rename -->\n <button\n class=\"tpl:flex tpl:size-6 tpl:items-center tpl:justify-center tpl:rounded tpl:transition-colors\"\n :title=\"t.mediaLibrary.renameFolder\"\n @click.stop=\"startRename\"\n >\n <Pencil :size=\"12\" :stroke-width=\"2\" />\n </button>\n <!-- Delete -->\n <button\n class=\"tpl:flex tpl:size-6 tpl:items-center tpl:justify-center tpl:rounded tpl:transition-colors\"\n @click.stop=\"emit('deleteFolder', folder.id)\"\n >\n <Trash2\n :size=\"12\"\n :stroke-width=\"2\"\n style=\"color: var(--tpl-danger)\"\n />\n </button>\n </span>\n </div>\n\n <!-- Children (expanded) -->\n <div v-if=\"shouldExpand\">\n <MediaFolderTreeNode\n v-for=\"child in folder.children\"\n :key=\"child.id\"\n :folder=\"child\"\n :current-folder-id=\"currentFolderId\"\n :depth=\"depth + 1\"\n @navigate=\"emit('navigate', $event)\"\n @create-folder=\"\n (name, parentId) => emit('createFolder', name, parentId)\n \"\n @rename-folder=\"(id, name) => emit('renameFolder', id, name)\"\n @delete-folder=\"emit('deleteFolder', $event)\"\n />\n\n <!-- Subfolder creation input -->\n <div\n v-if=\"isCreatingSubfolder\"\n :style=\"{ paddingLeft: `${(depth + 1) * 16 + 8}px` }\"\n class=\"tpl:py-1.5 tpl:pr-2\"\n >\n <input\n v-model=\"subfolderName\"\n type=\"text\"\n class=\"tpl:w-full tpl:rounded tpl:border tpl:px-2 tpl:py-1 tpl:text-xs tpl:outline-none\"\n style=\"\n border-color: var(--tpl-primary);\n background-color: var(--tpl-bg);\n color: var(--tpl-text);\n \"\n :placeholder=\"t.mediaLibrary.subfolderName\"\n autofocus\n @keydown.enter=\"confirmCreateSubfolder\"\n @keydown.escape=\"cancelCreateSubfolder\"\n @blur=\"confirmCreateSubfolder\"\n />\n </div>\n </div>\n </div>\n</template>\n","<script setup lang=\"ts\">\nimport { useI18n } from \"../../composables/useI18n\";\nimport type { MediaFolder } from \"../../types\";\nimport { ChevronRight, Folder, Pencil, Plus, Trash2 } from \"@lucide/vue\";\nimport { computed, ref } from \"vue\";\n\nconst props = defineProps<{\n folder: MediaFolder;\n currentFolderId: string | null;\n depth: number;\n}>();\n\nconst emit = defineEmits<{\n (e: \"navigate\", folderId: string | null): void;\n (e: \"createFolder\", name: string, parentId?: string | null): void;\n (e: \"renameFolder\", folderId: string, name: string): void;\n (e: \"deleteFolder\", folderId: string): void;\n}>();\n\nconst { t } = useI18n();\n\nconst isExpanded = ref(false);\nconst isRenaming = ref(false);\nconst renameValue = ref(\"\");\nconst isCreatingSubfolder = ref(false);\nconst subfolderName = ref(\"\");\n\nconst MAX_DEPTH = 5;\n\nconst hasChildren = computed(() => (props.folder.children?.length ?? 0) > 0);\n\nconst canCreateSubfolder = computed(() => props.depth < MAX_DEPTH - 1);\n\nconst isActive = computed(() => props.currentFolderId === props.folder.id);\n\nconst isDescendantActive = computed(() => {\n if (!props.currentFolderId || !props.folder.children) return false;\n return containsFolder(props.folder.children, props.currentFolderId);\n});\n\nconst shouldExpand = computed(\n () => isExpanded.value || isDescendantActive.value,\n);\n\nfunction containsFolder(folders: MediaFolder[], id: string): boolean {\n for (const folder of folders) {\n if (folder.id === id) return true;\n if (folder.children && containsFolder(folder.children, id)) return true;\n }\n return false;\n}\n\nfunction toggleExpand(): void {\n isExpanded.value = !isExpanded.value;\n}\n\nfunction startRename(): void {\n isRenaming.value = true;\n renameValue.value = props.folder.name;\n}\n\nfunction confirmRename(): void {\n const trimmed = renameValue.value.trim();\n if (trimmed && trimmed !== props.folder.name) {\n emit(\"renameFolder\", props.folder.id, trimmed);\n }\n isRenaming.value = false;\n renameValue.value = \"\";\n}\n\nfunction cancelRename(): void {\n isRenaming.value = false;\n renameValue.value = \"\";\n}\n\nfunction startCreateSubfolder(): void {\n isCreatingSubfolder.value = true;\n subfolderName.value = \"\";\n isExpanded.value = true;\n}\n\nfunction confirmCreateSubfolder(): void {\n if (subfolderName.value.trim()) {\n emit(\"createFolder\", subfolderName.value.trim(), props.folder.id);\n }\n isCreatingSubfolder.value = false;\n subfolderName.value = \"\";\n}\n\nfunction cancelCreateSubfolder(): void {\n isCreatingSubfolder.value = false;\n subfolderName.value = \"\";\n}\n</script>\n\n<template>\n <div>\n <!-- Folder row -->\n <div\n class=\"tpl:group tpl:flex tpl:w-full tpl:items-center tpl:gap-1 tpl:py-1.5 tpl:pr-2 tpl:text-left tpl:text-xs tpl:transition-all tpl:duration-150\"\n :style=\"{\n paddingLeft: `${depth * 16 + 8}px`,\n backgroundColor: isActive ? 'var(--tpl-bg-active)' : 'transparent',\n color: isActive ? 'var(--tpl-primary)' : 'var(--tpl-text)',\n }\"\n >\n <!-- Expand/collapse chevron -->\n <button\n v-if=\"hasChildren || isCreatingSubfolder\"\n class=\"tpl:flex tpl:size-4 tpl:shrink-0 tpl:items-center tpl:justify-center tpl:rounded tpl:transition-colors\"\n @click.stop=\"toggleExpand\"\n >\n <ChevronRight\n class=\"tpl:transition-transform tpl:duration-150\"\n :class=\"{ 'tpl:rotate-90': shouldExpand }\"\n :size=\"10\"\n :stroke-width=\"2\"\n />\n </button>\n <span v-else class=\"tpl:size-4 tpl:shrink-0\" />\n\n <!-- Folder icon + name (clickable) -->\n <button\n class=\"tpl:flex tpl:min-w-0 tpl:flex-1 tpl:items-center tpl:gap-1.5\"\n @click=\"emit('navigate', folder.id)\"\n >\n <Folder class=\"tpl:shrink-0\" :size=\"14\" :stroke-width=\"1.5\" />\n <template v-if=\"!isRenaming\">\n <span class=\"tpl:truncate\">{{ folder.name }}</span>\n </template>\n </button>\n\n <!-- Inline rename input -->\n <input\n v-if=\"isRenaming\"\n v-model=\"renameValue\"\n type=\"text\"\n class=\"tpl:min-w-0 tpl:flex-1 tpl:rounded tpl:border tpl:px-1.5 tpl:py-0.5 tpl:text-xs tpl:outline-none\"\n style=\"\n border-color: var(--tpl-primary);\n background-color: var(--tpl-bg);\n color: var(--tpl-text);\n \"\n autofocus\n @keydown.enter=\"confirmRename\"\n @keydown.escape=\"cancelRename\"\n @blur=\"confirmRename\"\n @click.stop\n />\n\n <!-- Hover actions -->\n <span\n v-if=\"!isRenaming\"\n class=\"tpl:flex tpl:shrink-0 tpl:items-center tpl:gap-0.5 tpl:opacity-0 tpl:transition-opacity tpl:group-hover:opacity-100\"\n >\n <!-- Add subfolder -->\n <button\n v-if=\"canCreateSubfolder\"\n class=\"tpl:flex tpl:size-6 tpl:items-center tpl:justify-center tpl:rounded tpl:transition-colors\"\n :title=\"t.mediaLibrary.addSubfolder\"\n @click.stop=\"startCreateSubfolder\"\n >\n <Plus :size=\"12\" :stroke-width=\"2\" />\n </button>\n <!-- Rename -->\n <button\n class=\"tpl:flex tpl:size-6 tpl:items-center tpl:justify-center tpl:rounded tpl:transition-colors\"\n :title=\"t.mediaLibrary.renameFolder\"\n @click.stop=\"startRename\"\n >\n <Pencil :size=\"12\" :stroke-width=\"2\" />\n </button>\n <!-- Delete -->\n <button\n class=\"tpl:flex tpl:size-6 tpl:items-center tpl:justify-center tpl:rounded tpl:transition-colors\"\n @click.stop=\"emit('deleteFolder', folder.id)\"\n >\n <Trash2\n :size=\"12\"\n :stroke-width=\"2\"\n style=\"color: var(--tpl-danger)\"\n />\n </button>\n </span>\n </div>\n\n <!-- Children (expanded) -->\n <div v-if=\"shouldExpand\">\n <MediaFolderTreeNode\n v-for=\"child in folder.children\"\n :key=\"child.id\"\n :folder=\"child\"\n :current-folder-id=\"currentFolderId\"\n :depth=\"depth + 1\"\n @navigate=\"emit('navigate', $event)\"\n @create-folder=\"\n (name, parentId) => emit('createFolder', name, parentId)\n \"\n @rename-folder=\"(id, name) => emit('renameFolder', id, name)\"\n @delete-folder=\"emit('deleteFolder', $event)\"\n />\n\n <!-- Subfolder creation input -->\n <div\n v-if=\"isCreatingSubfolder\"\n :style=\"{ paddingLeft: `${(depth + 1) * 16 + 8}px` }\"\n class=\"tpl:py-1.5 tpl:pr-2\"\n >\n <input\n v-model=\"subfolderName\"\n type=\"text\"\n class=\"tpl:w-full tpl:rounded tpl:border tpl:px-2 tpl:py-1 tpl:text-xs tpl:outline-none\"\n style=\"\n border-color: var(--tpl-primary);\n background-color: var(--tpl-bg);\n color: var(--tpl-text);\n \"\n :placeholder=\"t.mediaLibrary.subfolderName\"\n autofocus\n @keydown.enter=\"confirmCreateSubfolder\"\n @keydown.escape=\"cancelCreateSubfolder\"\n @blur=\"confirmCreateSubfolder\"\n />\n </div>\n </div>\n </div>\n</template>\n","<script setup lang=\"ts\">\nimport MediaFolderTreeNode from \"./MediaFolderTreeNode.vue\";\nimport { useI18n } from \"../../composables/useI18n\";\nimport type { MediaViewMode } from \"../../composable\";\nimport type { MediaFolder } from \"../../types\";\nimport { File, Plus, Star } from \"@lucide/vue\";\nimport { ref } from \"vue\";\n\ndefineProps<{\n folders: MediaFolder[];\n currentFolderId: string | null;\n viewMode: MediaViewMode;\n hasFrequentlyUsed: boolean;\n}>();\n\nconst emit = defineEmits<{\n (e: \"navigate\", folderId: string | null): void;\n (e: \"createFolder\", name: string, parentId?: string | null): void;\n (e: \"renameFolder\", folderId: string, name: string): void;\n (e: \"deleteFolder\", folderId: string): void;\n (e: \"showFrequentlyUsed\"): void;\n}>();\n\nconst { t } = useI18n();\n\nconst isCreating = ref(false);\nconst newFolderName = ref(\"\");\n\nfunction startCreateFolder(): void {\n isCreating.value = true;\n newFolderName.value = \"\";\n}\n\nfunction confirmCreateFolder(): void {\n if (newFolderName.value.trim()) {\n emit(\"createFolder\", newFolderName.value.trim());\n }\n isCreating.value = false;\n newFolderName.value = \"\";\n}\n\nfunction cancelCreate(): void {\n isCreating.value = false;\n newFolderName.value = \"\";\n}\n</script>\n\n<template>\n <div class=\"tpl:flex tpl:h-full tpl:flex-col tpl:overflow-y-auto\">\n <!-- All Images root -->\n <button\n class=\"tpl:flex tpl:w-full tpl:items-center tpl:gap-2 tpl:px-3 tpl:py-2 tpl:text-left tpl:text-xs tpl:font-medium tpl:transition-all tpl:duration-150\"\n :style=\"{\n backgroundColor:\n viewMode === 'files' && currentFolderId === null\n ? 'var(--tpl-bg-active)'\n : 'transparent',\n color:\n viewMode === 'files' && currentFolderId === null\n ? 'var(--tpl-primary)'\n : 'var(--tpl-text)',\n }\"\n @click=\"emit('navigate', null)\"\n >\n <File :size=\"14\" :stroke-width=\"1.5\" />\n {{ t.mediaLibrary.allFiles }}\n </button>\n\n <!-- Recursive folder tree -->\n <MediaFolderTreeNode\n v-for=\"folder in folders\"\n :key=\"folder.id\"\n :folder=\"folder\"\n :current-folder-id=\"currentFolderId\"\n :depth=\"0\"\n @navigate=\"emit('navigate', $event)\"\n @create-folder=\"(name, parentId) => emit('createFolder', name, parentId)\"\n @rename-folder=\"(id, name) => emit('renameFolder', id, name)\"\n @delete-folder=\"emit('deleteFolder', $event)\"\n />\n\n <!-- New folder input -->\n <div v-if=\"isCreating\" class=\"tpl:px-3 tpl:py-2\">\n <input\n v-model=\"newFolderName\"\n type=\"text\"\n class=\"tpl:w-full tpl:rounded tpl:border tpl:px-2 tpl:py-1 tpl:text-xs tpl:outline-none\"\n style=\"\n border-color: var(--tpl-primary);\n background-color: var(--tpl-bg);\n color: var(--tpl-text);\n \"\n :placeholder=\"t.mediaLibrary.folderName\"\n autofocus\n @keydown.enter=\"confirmCreateFolder\"\n @keydown.escape=\"cancelCreate\"\n @blur=\"confirmCreateFolder\"\n />\n </div>\n\n <!-- New folder button -->\n <button\n v-if=\"!isCreating\"\n class=\"tpl:flex tpl:w-full tpl:items-center tpl:gap-2 tpl:px-3 tpl:py-2 tpl:text-left tpl:text-xs tpl:transition-all tpl:duration-150\"\n style=\"color: var(--tpl-text-muted)\"\n @click=\"startCreateFolder\"\n >\n <Plus :size=\"14\" :stroke-width=\"1.5\" />\n {{ t.mediaLibrary.newFolder }}\n </button>\n\n <!-- Spacer to push frequently used to bottom -->\n <div class=\"tpl:flex-1\" />\n\n <!-- Frequently Used -->\n <button\n v-if=\"hasFrequentlyUsed\"\n class=\"tpl:flex tpl:w-full tpl:items-center tpl:gap-2 tpl:border-t tpl:px-3 tpl:py-2 tpl:text-left tpl:text-xs tpl:font-medium tpl:transition-all tpl:duration-150\"\n :style=\"{\n borderColor: 'var(--tpl-border)',\n backgroundColor:\n viewMode === 'frequently-used'\n ? 'var(--tpl-bg-active)'\n : 'transparent',\n color:\n viewMode === 'frequently-used'\n ? 'var(--tpl-primary)'\n : 'var(--tpl-text)',\n }\"\n @click=\"emit('showFrequentlyUsed')\"\n >\n <Star :size=\"14\" :stroke-width=\"1.5\" />\n {{ t.mediaLibrary.frequentlyUsed }}\n </button>\n </div>\n</template>\n","<script setup lang=\"ts\">\nimport MediaFolderTreeNode from \"./MediaFolderTreeNode.vue\";\nimport { useI18n } from \"../../composables/useI18n\";\nimport type { MediaViewMode } from \"../../composable\";\nimport type { MediaFolder } from \"../../types\";\nimport { File, Plus, Star } from \"@lucide/vue\";\nimport { ref } from \"vue\";\n\ndefineProps<{\n folders: MediaFolder[];\n currentFolderId: string | null;\n viewMode: MediaViewMode;\n hasFrequentlyUsed: boolean;\n}>();\n\nconst emit = defineEmits<{\n (e: \"navigate\", folderId: string | null): void;\n (e: \"createFolder\", name: string, parentId?: string | null): void;\n (e: \"renameFolder\", folderId: string, name: string): void;\n (e: \"deleteFolder\", folderId: string): void;\n (e: \"showFrequentlyUsed\"): void;\n}>();\n\nconst { t } = useI18n();\n\nconst isCreating = ref(false);\nconst newFolderName = ref(\"\");\n\nfunction startCreateFolder(): void {\n isCreating.value = true;\n newFolderName.value = \"\";\n}\n\nfunction confirmCreateFolder(): void {\n if (newFolderName.value.trim()) {\n emit(\"createFolder\", newFolderName.value.trim());\n }\n isCreating.value = false;\n newFolderName.value = \"\";\n}\n\nfunction cancelCreate(): void {\n isCreating.value = false;\n newFolderName.value = \"\";\n}\n</script>\n\n<template>\n <div class=\"tpl:flex tpl:h-full tpl:flex-col tpl:overflow-y-auto\">\n <!-- All Images root -->\n <button\n class=\"tpl:flex tpl:w-full tpl:items-center tpl:gap-2 tpl:px-3 tpl:py-2 tpl:text-left tpl:text-xs tpl:font-medium tpl:transition-all tpl:duration-150\"\n :style=\"{\n backgroundColor:\n viewMode === 'files' && currentFolderId === null\n ? 'var(--tpl-bg-active)'\n : 'transparent',\n color:\n viewMode === 'files' && currentFolderId === null\n ? 'var(--tpl-primary)'\n : 'var(--tpl-text)',\n }\"\n @click=\"emit('navigate', null)\"\n >\n <File :size=\"14\" :stroke-width=\"1.5\" />\n {{ t.mediaLibrary.allFiles }}\n </button>\n\n <!-- Recursive folder tree -->\n <MediaFolderTreeNode\n v-for=\"folder in folders\"\n :key=\"folder.id\"\n :folder=\"folder\"\n :current-folder-id=\"currentFolderId\"\n :depth=\"0\"\n @navigate=\"emit('navigate', $event)\"\n @create-folder=\"(name, parentId) => emit('createFolder', name, parentId)\"\n @rename-folder=\"(id, name) => emit('renameFolder', id, name)\"\n @delete-folder=\"emit('deleteFolder', $event)\"\n />\n\n <!-- New folder input -->\n <div v-if=\"isCreating\" class=\"tpl:px-3 tpl:py-2\">\n <input\n v-model=\"newFolderName\"\n type=\"text\"\n class=\"tpl:w-full tpl:rounded tpl:border tpl:px-2 tpl:py-1 tpl:text-xs tpl:outline-none\"\n style=\"\n border-color: var(--tpl-primary);\n background-color: var(--tpl-bg);\n color: var(--tpl-text);\n \"\n :placeholder=\"t.mediaLibrary.folderName\"\n autofocus\n @keydown.enter=\"confirmCreateFolder\"\n @keydown.escape=\"cancelCreate\"\n @blur=\"confirmCreateFolder\"\n />\n </div>\n\n <!-- New folder button -->\n <button\n v-if=\"!isCreating\"\n class=\"tpl:flex tpl:w-full tpl:items-center tpl:gap-2 tpl:px-3 tpl:py-2 tpl:text-left tpl:text-xs tpl:transition-all tpl:duration-150\"\n style=\"color: var(--tpl-text-muted)\"\n @click=\"startCreateFolder\"\n >\n <Plus :size=\"14\" :stroke-width=\"1.5\" />\n {{ t.mediaLibrary.newFolder }}\n </button>\n\n <!-- Spacer to push frequently used to bottom -->\n <div class=\"tpl:flex-1\" />\n\n <!-- Frequently Used -->\n <button\n v-if=\"hasFrequentlyUsed\"\n class=\"tpl:flex tpl:w-full tpl:items-center tpl:gap-2 tpl:border-t tpl:px-3 tpl:py-2 tpl:text-left tpl:text-xs tpl:font-medium tpl:transition-all tpl:duration-150\"\n :style=\"{\n borderColor: 'var(--tpl-border)',\n backgroundColor:\n viewMode === 'frequently-used'\n ? 'var(--tpl-bg-active)'\n : 'transparent',\n color:\n viewMode === 'frequently-used'\n ? 'var(--tpl-primary)'\n : 'var(--tpl-text)',\n }\"\n @click=\"emit('showFrequentlyUsed')\"\n >\n <Star :size=\"14\" :stroke-width=\"1.5\" />\n {{ t.mediaLibrary.frequentlyUsed }}\n </button>\n </div>\n</template>\n","<script setup lang=\"ts\">\nimport { computed } from \"vue\";\n\nconst props = defineProps<{\n mimeType: string;\n}>();\n\ninterface FileTypeConfig {\n label: string;\n color: string;\n bgColor: string;\n icon: \"document\" | \"video\" | \"audio\";\n}\n\nconst FILE_TYPE_MAP: Record<string, FileTypeConfig> = {\n \"application/pdf\": {\n label: \"PDF\",\n color: \"#dc2626\",\n bgColor: \"#fef2f2\",\n icon: \"document\",\n },\n \"application/vnd.openxmlformats-officedocument.wordprocessingml.document\": {\n label: \"DOC\",\n color: \"#2563eb\",\n bgColor: \"#eff6ff\",\n icon: \"document\",\n },\n \"application/msword\": {\n label: \"DOC\",\n color: \"#2563eb\",\n bgColor: \"#eff6ff\",\n icon: \"document\",\n },\n \"application/vnd.openxmlformats-officedocument.spreadsheetml.sheet\": {\n label: \"XLS\",\n color: \"#16a34a\",\n bgColor: \"#f0fdf4\",\n icon: \"document\",\n },\n \"application/vnd.ms-excel\": {\n label: \"XLS\",\n color: \"#16a34a\",\n bgColor: \"#f0fdf4\",\n icon: \"document\",\n },\n \"application/vnd.openxmlformats-officedocument.presentationml.presentation\": {\n label: \"PPT\",\n color: \"#ea580c\",\n bgColor: \"#fff7ed\",\n icon: \"document\",\n },\n \"application/vnd.ms-powerpoint\": {\n label: \"PPT\",\n color: \"#ea580c\",\n bgColor: \"#fff7ed\",\n icon: \"document\",\n },\n \"text/csv\": {\n label: \"CSV\",\n color: \"#16a34a\",\n bgColor: \"#f0fdf4\",\n icon: \"document\",\n },\n \"text/plain\": {\n label: \"TXT\",\n color: \"#6b7280\",\n bgColor: \"#f9fafb\",\n icon: \"document\",\n },\n \"video/mp4\": {\n label: \"MP4\",\n color: \"#9333ea\",\n bgColor: \"#faf5ff\",\n icon: \"video\",\n },\n \"video/quicktime\": {\n label: \"MOV\",\n color: \"#9333ea\",\n bgColor: \"#faf5ff\",\n icon: \"video\",\n },\n \"video/webm\": {\n label: \"WEBM\",\n color: \"#9333ea\",\n bgColor: \"#faf5ff\",\n icon: \"video\",\n },\n \"audio/mpeg\": {\n label: \"MP3\",\n color: \"#0d9488\",\n bgColor: \"#f0fdfa\",\n icon: \"audio\",\n },\n \"audio/wav\": {\n label: \"WAV\",\n color: \"#0d9488\",\n bgColor: \"#f0fdfa\",\n icon: \"audio\",\n },\n \"audio/ogg\": {\n label: \"OGG\",\n color: \"#0d9488\",\n bgColor: \"#f0fdfa\",\n icon: \"audio\",\n },\n};\n\nconst DEFAULT_CONFIG: FileTypeConfig = {\n label: \"FILE\",\n color: \"#6b7280\",\n bgColor: \"#f9fafb\",\n icon: \"document\",\n};\n\nconst config = computed(\n (): FileTypeConfig => FILE_TYPE_MAP[props.mimeType] ?? DEFAULT_CONFIG,\n);\n</script>\n\n<template>\n <div\n class=\"tpl:flex tpl:aspect-square tpl:flex-col tpl:items-center tpl:justify-center tpl:gap-2\"\n >\n <!-- Document icon -->\n <svg\n v-if=\"config.icon === 'document'\"\n width=\"60\"\n height=\"60\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n stroke-width=\"1.5\"\n :style=\"{ color: config.color }\"\n >\n <path d=\"M14 2H6a2 2 0 0 0-2 2v16a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2V8z\" />\n <polyline points=\"14 2 14 8 20 8\" />\n <line x1=\"8\" y1=\"13\" x2=\"16\" y2=\"13\" />\n <line x1=\"8\" y1=\"17\" x2=\"12\" y2=\"17\" />\n </svg>\n\n <!-- Video icon -->\n <svg\n v-else-if=\"config.icon === 'video'\"\n width=\"40\"\n height=\"40\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n stroke-width=\"1.5\"\n :style=\"{ color: config.color }\"\n >\n <rect x=\"2\" y=\"4\" width=\"20\" height=\"16\" rx=\"2\" />\n <polygon points=\"10,8 16,12 10,16\" fill=\"currentColor\" stroke=\"none\" />\n </svg>\n\n <!-- Audio icon -->\n <svg\n v-else\n width=\"40\"\n height=\"40\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n stroke-width=\"1.5\"\n :style=\"{ color: config.color }\"\n >\n <path d=\"M9 18V5l12-2v13\" />\n <circle cx=\"6\" cy=\"18\" r=\"3\" />\n <circle cx=\"18\" cy=\"16\" r=\"3\" />\n </svg>\n\n <span\n class=\"tpl:text-xs tpl:font-bold tpl:tracking-wider\"\n :style=\"{ color: config.color }\"\n >\n {{ config.label }}\n </span>\n </div>\n</template>\n","<script setup lang=\"ts\">\nimport { computed } from \"vue\";\n\nconst props = defineProps<{\n mimeType: string;\n}>();\n\ninterface FileTypeConfig {\n label: string;\n color: string;\n bgColor: string;\n icon: \"document\" | \"video\" | \"audio\";\n}\n\nconst FILE_TYPE_MAP: Record<string, FileTypeConfig> = {\n \"application/pdf\": {\n label: \"PDF\",\n color: \"#dc2626\",\n bgColor: \"#fef2f2\",\n icon: \"document\",\n },\n \"application/vnd.openxmlformats-officedocument.wordprocessingml.document\": {\n label: \"DOC\",\n color: \"#2563eb\",\n bgColor: \"#eff6ff\",\n icon: \"document\",\n },\n \"application/msword\": {\n label: \"DOC\",\n color: \"#2563eb\",\n bgColor: \"#eff6ff\",\n icon: \"document\",\n },\n \"application/vnd.openxmlformats-officedocument.spreadsheetml.sheet\": {\n label: \"XLS\",\n color: \"#16a34a\",\n bgColor: \"#f0fdf4\",\n icon: \"document\",\n },\n \"application/vnd.ms-excel\": {\n label: \"XLS\",\n color: \"#16a34a\",\n bgColor: \"#f0fdf4\",\n icon: \"document\",\n },\n \"application/vnd.openxmlformats-officedocument.presentationml.presentation\": {\n label: \"PPT\",\n color: \"#ea580c\",\n bgColor: \"#fff7ed\",\n icon: \"document\",\n },\n \"application/vnd.ms-powerpoint\": {\n label: \"PPT\",\n color: \"#ea580c\",\n bgColor: \"#fff7ed\",\n icon: \"document\",\n },\n \"text/csv\": {\n label: \"CSV\",\n color: \"#16a34a\",\n bgColor: \"#f0fdf4\",\n icon: \"document\",\n },\n \"text/plain\": {\n label: \"TXT\",\n color: \"#6b7280\",\n bgColor: \"#f9fafb\",\n icon: \"document\",\n },\n \"video/mp4\": {\n label: \"MP4\",\n color: \"#9333ea\",\n bgColor: \"#faf5ff\",\n icon: \"video\",\n },\n \"video/quicktime\": {\n label: \"MOV\",\n color: \"#9333ea\",\n bgColor: \"#faf5ff\",\n icon: \"video\",\n },\n \"video/webm\": {\n label: \"WEBM\",\n color: \"#9333ea\",\n bgColor: \"#faf5ff\",\n icon: \"video\",\n },\n \"audio/mpeg\": {\n label: \"MP3\",\n color: \"#0d9488\",\n bgColor: \"#f0fdfa\",\n icon: \"audio\",\n },\n \"audio/wav\": {\n label: \"WAV\",\n color: \"#0d9488\",\n bgColor: \"#f0fdfa\",\n icon: \"audio\",\n },\n \"audio/ogg\": {\n label: \"OGG\",\n color: \"#0d9488\",\n bgColor: \"#f0fdfa\",\n icon: \"audio\",\n },\n};\n\nconst DEFAULT_CONFIG: FileTypeConfig = {\n label: \"FILE\",\n color: \"#6b7280\",\n bgColor: \"#f9fafb\",\n icon: \"document\",\n};\n\nconst config = computed(\n (): FileTypeConfig => FILE_TYPE_MAP[props.mimeType] ?? DEFAULT_CONFIG,\n);\n</script>\n\n<template>\n <div\n class=\"tpl:flex tpl:aspect-square tpl:flex-col tpl:items-center tpl:justify-center tpl:gap-2\"\n >\n <!-- Document icon -->\n <svg\n v-if=\"config.icon === 'document'\"\n width=\"60\"\n height=\"60\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n stroke-width=\"1.5\"\n :style=\"{ color: config.color }\"\n >\n <path d=\"M14 2H6a2 2 0 0 0-2 2v16a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2V8z\" />\n <polyline points=\"14 2 14 8 20 8\" />\n <line x1=\"8\" y1=\"13\" x2=\"16\" y2=\"13\" />\n <line x1=\"8\" y1=\"17\" x2=\"12\" y2=\"17\" />\n </svg>\n\n <!-- Video icon -->\n <svg\n v-else-if=\"config.icon === 'video'\"\n width=\"40\"\n height=\"40\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n stroke-width=\"1.5\"\n :style=\"{ color: config.color }\"\n >\n <rect x=\"2\" y=\"4\" width=\"20\" height=\"16\" rx=\"2\" />\n <polygon points=\"10,8 16,12 10,16\" fill=\"currentColor\" stroke=\"none\" />\n </svg>\n\n <!-- Audio icon -->\n <svg\n v-else\n width=\"40\"\n height=\"40\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n stroke-width=\"1.5\"\n :style=\"{ color: config.color }\"\n >\n <path d=\"M9 18V5l12-2v13\" />\n <circle cx=\"6\" cy=\"18\" r=\"3\" />\n <circle cx=\"18\" cy=\"16\" r=\"3\" />\n </svg>\n\n <span\n class=\"tpl:text-xs tpl:font-bold tpl:tracking-wider\"\n :style=\"{ color: config.color }\"\n >\n {{ config.label }}\n </span>\n </div>\n</template>\n","<script setup lang=\"ts\">\nimport MediaFileIcon from \"./MediaFileIcon.vue\";\nimport { useI18n } from \"../../composables/useI18n\";\nimport { useMediaCategories } from \"../../composables/useMediaCategories\";\nimport type { MediaCategory, MediaItem } from \"../../types\";\nimport { useIntersectionObserver } from \"@vueuse/core\";\nimport { Check, File, LoaderCircle, Pencil, RefreshCw } from \"@lucide/vue\";\nimport { ref } from \"vue\";\n\nconst props = defineProps<{\n items: MediaItem[];\n selectedIds: Set<string>;\n isLoading: boolean;\n hasMore: boolean;\n accept?: MediaCategory[];\n layout?: \"grid\" | \"list\";\n}>();\n\nconst emit = defineEmits<{\n (e: \"select\", item: MediaItem): void;\n (e: \"toggle\", id: string): void;\n (e: \"loadMore\"): void;\n (e: \"edit\", item: MediaItem): void;\n (e: \"replace\", item: MediaItem): void;\n}>();\n\nconst { isAcceptedMimeType, isImageMimeType } = useMediaCategories();\n\nfunction isSelectable(item: MediaItem): boolean {\n if (!props.accept || props.accept.length === 0) {\n return true;\n }\n\n return isAcceptedMimeType(item.mime_type, props.accept);\n}\n\nfunction handleItemClick(item: MediaItem): void {\n emit(\"select\", item);\n}\n\nconst { t } = useI18n();\n\nconst sentinelRef = ref<HTMLElement | null>(null);\n\nuseIntersectionObserver(\n sentinelRef,\n ([{ isIntersecting }]) => {\n if (isIntersecting && props.hasMore && !props.isLoading) {\n emit(\"loadMore\");\n }\n },\n { threshold: 0.1 },\n);\n\nfunction formatSize(bytes: number): string {\n if (bytes < 1024) return `${bytes} B`;\n if (bytes < 1024 * 1024) return `${(bytes / 1024).toFixed(1)} KB`;\n return `${(bytes / (1024 * 1024)).toFixed(1)} MB`;\n}\n\nfunction formatDate(dateStr: string): string {\n return new Date(dateStr).toLocaleDateString(undefined, {\n year: \"numeric\",\n month: \"short\",\n day: \"numeric\",\n });\n}\n</script>\n\n<template>\n <div class=\"tpl:p-4\">\n <!-- Skeleton loading -->\n <div\n v-if=\"isLoading && items.length === 0\"\n :class=\"\n layout === 'list'\n ? 'tpl:flex tpl:flex-col tpl:gap-1'\n : 'tpl:grid tpl:grid-cols-4 tpl:gap-3'\n \"\n >\n <div\n v-for=\"i in 8\"\n :key=\"i\"\n class=\"tpl-pulse tpl:rounded-lg\"\n :class=\"layout === 'list' ? 'tpl:h-12' : 'tpl:aspect-square'\"\n style=\"background-color: var(--tpl-bg-hover)\"\n />\n </div>\n\n <!-- Empty state -->\n <div\n v-else-if=\"items.length === 0\"\n class=\"tpl:flex tpl:flex-col tpl:items-center tpl:justify-center tpl:py-16\"\n >\n <File\n class=\"tpl:mb-3\"\n :size=\"40\"\n :stroke-width=\"1\"\n style=\"color: var(--tpl-text-dim)\"\n />\n <p class=\"tpl:text-xs\" style=\"color: var(--tpl-text-muted)\">\n {{ t.mediaLibrary.noFiles }}\n </p>\n </div>\n\n <!-- Grid -->\n <div\n v-else-if=\"layout !== 'list'\"\n class=\"tpl:grid tpl:grid-cols-4 tpl:gap-3\"\n >\n <div\n v-for=\"item in items\"\n :key=\"item.id\"\n class=\"tpl-media-item tpl:group tpl:relative tpl:overflow-hidden tpl:rounded-lg tpl:border-2 tpl:transition-all tpl:duration-150\"\n :class=\"[\n 'tpl:cursor-pointer',\n !isSelectable(item) && !selectedIds.has(item.id)\n ? 'tpl:opacity-60'\n : '',\n selectedIds.has(item.id) ? 'tpl-media-item--selected' : '',\n ]\"\n :style=\"{\n borderColor: selectedIds.has(item.id)\n ? 'var(--tpl-primary)'\n : 'transparent',\n backgroundColor:\n !isSelectable(item) && !selectedIds.has(item.id)\n ? 'var(--tpl-bg)'\n : 'var(--tpl-bg-hover)',\n }\"\n @click=\"handleItemClick(item)\"\n >\n <div class=\"tpl:aspect-square\">\n <img\n v-if=\"isImageMimeType(item.mime_type)\"\n :src=\"item.small_url || item.url\"\n :alt=\"item.filename\"\n class=\"tpl:size-full tpl:object-cover\"\n loading=\"lazy\"\n />\n <MediaFileIcon v-else :mime-type=\"item.mime_type\" />\n </div>\n <div class=\"tpl:px-2 tpl:py-1.5\">\n <p\n class=\"tpl:truncate tpl:text-[10px] tpl:font-medium\"\n style=\"color: var(--tpl-text)\"\n >\n {{ item.filename }}\n </p>\n <p\n class=\"tpl:flex tpl:justify-between tpl:text-[9px]\"\n style=\"color: var(--tpl-text-muted)\"\n >\n <span>{{ formatSize(item.size) }}</span>\n <span\n v-if=\"\n isImageMimeType(item.mime_type) && item.width && item.height\n \"\n >\n {{ item.width }}×{{ item.height }}\n </span>\n </p>\n </div>\n <!-- Action buttons -->\n <div\n class=\"tpl:absolute tpl:top-1.5 tpl:left-1.5 tpl:flex tpl:gap-1 tpl:opacity-0 tpl:transition-opacity tpl:duration-150 tpl:group-hover:opacity-100\"\n >\n <!-- Edit button -->\n <button\n class=\"tpl:flex tpl:size-6 tpl:items-center tpl:justify-center tpl:rounded-full tpl:text-white\"\n style=\"background-color: rgba(0, 0, 0, 0.6)\"\n :title=\"t.mediaLibrary.editFile\"\n @click.stop=\"emit('edit', item)\"\n >\n <Pencil :size=\"11\" :stroke-width=\"2\" />\n </button>\n <!-- Replace button -->\n <button\n class=\"tpl:flex tpl:size-6 tpl:items-center tpl:justify-center tpl:rounded-full tpl:text-white\"\n style=\"background-color: rgba(0, 0, 0, 0.6)\"\n :title=\"t.mediaLibrary.replaceFile\"\n @click.stop=\"emit('replace', item)\"\n >\n <RefreshCw :size=\"11\" :stroke-width=\"2\" />\n </button>\n </div>\n <!-- Selection check -->\n <div\n v-if=\"selectedIds.has(item.id)\"\n class=\"tpl:absolute tpl:top-1.5 tpl:right-1.5 tpl:flex tpl:size-5 tpl:items-center tpl:justify-center tpl:rounded-full tpl:text-white\"\n style=\"background-color: var(--tpl-primary)\"\n >\n <Check :size=\"12\" :stroke-width=\"3\" />\n </div>\n </div>\n </div>\n\n <!-- List -->\n <div v-else class=\"tpl:flex tpl:flex-col tpl:gap-1\">\n <div\n v-for=\"item in items\"\n :key=\"item.id\"\n class=\"tpl-media-list-item tpl:group tpl:flex tpl:cursor-pointer tpl:items-center tpl:gap-3 tpl:rounded-lg tpl:px-3 tpl:py-2 tpl:transition-all tpl:duration-150\"\n :class=\"[\n !isSelectable(item) && !selectedIds.has(item.id)\n ? 'tpl:opacity-60'\n : '',\n ]\"\n :style=\"{\n backgroundColor: selectedIds.has(item.id)\n ? 'var(--tpl-bg-hover)'\n : 'transparent',\n }\"\n @click=\"handleItemClick(item)\"\n >\n <!-- Thumbnail -->\n <div\n class=\"tpl:size-10 tpl:shrink-0 tpl:overflow-hidden tpl:rounded\"\n style=\"background-color: var(--tpl-bg-hover)\"\n >\n <img\n v-if=\"isImageMimeType(item.mime_type)\"\n :src=\"item.small_url || item.url\"\n :alt=\"item.filename\"\n class=\"tpl:size-full tpl:object-cover\"\n loading=\"lazy\"\n />\n <div v-else class=\"tpl-list-icon tpl:size-full\">\n <MediaFileIcon :mime-type=\"item.mime_type\" />\n </div>\n </div>\n\n <!-- Info -->\n <div class=\"tpl:min-w-0 tpl:flex-1\">\n <p\n class=\"tpl:truncate tpl:text-xs tpl:font-medium\"\n style=\"color: var(--tpl-text)\"\n >\n {{ item.filename }}\n </p>\n <p class=\"tpl:text-[10px]\" style=\"color: var(--tpl-text-muted)\">\n {{ formatSize(item.size) }} ·\n {{ formatDate(item.created_at) }}\n <template\n v-if=\"\n isImageMimeType(item.mime_type) && item.width && item.height\n \"\n >\n ·\n {{ item.width }}×{{ item.height }}\n </template>\n </p>\n </div>\n\n <!-- Action buttons -->\n <div\n class=\"tpl:flex tpl:gap-1 tpl:opacity-0 tpl:transition-opacity tpl:duration-150 tpl:group-hover:opacity-100\"\n >\n <!-- Edit button -->\n <button\n class=\"tpl:flex tpl:size-6 tpl:shrink-0 tpl:cursor-pointer tpl:items-center tpl:justify-center tpl:rounded\"\n style=\"color: var(--tpl-text-muted)\"\n :title=\"t.mediaLibrary.editFile\"\n @click.stop=\"emit('edit', item)\"\n >\n <Pencil :size=\"12\" :stroke-width=\"2\" />\n </button>\n <!-- Replace button -->\n <button\n class=\"tpl:flex tpl:size-6 tpl:shrink-0 tpl:cursor-pointer tpl:items-center tpl:justify-center tpl:rounded\"\n style=\"color: var(--tpl-text-muted)\"\n :title=\"t.mediaLibrary.replaceFile\"\n @click.stop=\"emit('replace', item)\"\n >\n <RefreshCw :size=\"12\" :stroke-width=\"2\" />\n </button>\n </div>\n\n <!-- Selection check -->\n <div\n v-if=\"selectedIds.has(item.id)\"\n class=\"tpl:flex tpl:size-5 tpl:shrink-0 tpl:items-center tpl:justify-center tpl:rounded-full tpl:text-white\"\n style=\"background-color: var(--tpl-primary)\"\n >\n <Check :size=\"12\" :stroke-width=\"3\" />\n </div>\n </div>\n </div>\n\n <!-- Infinite scroll sentinel -->\n <div ref=\"sentinelRef\" class=\"tpl:h-4\" />\n\n <!-- Loading more indicator -->\n <div\n v-if=\"isLoading && items.length > 0\"\n class=\"tpl:flex tpl:justify-center tpl:py-4\"\n >\n <LoaderCircle\n class=\"tpl-spinner\"\n :size=\"20\"\n :stroke-width=\"2\"\n style=\"color: var(--tpl-primary)\"\n />\n </div>\n </div>\n</template>\n\n<style scoped>\n.tpl-media-item:not(.tpl-media-item--selected):hover {\n border-color: var(--tpl-border) !important;\n}\n\n.tpl-media-list-item:hover {\n background-color: var(--tpl-bg-hover) !important;\n}\n\n.tpl-list-icon {\n transform: scale(0.35);\n transform-origin: center;\n}\n</style>\n","<script setup lang=\"ts\">\nimport MediaFileIcon from \"./MediaFileIcon.vue\";\nimport { useI18n } from \"../../composables/useI18n\";\nimport { useMediaCategories } from \"../../composables/useMediaCategories\";\nimport type { MediaCategory, MediaItem } from \"../../types\";\nimport { useIntersectionObserver } from \"@vueuse/core\";\nimport { Check, File, LoaderCircle, Pencil, RefreshCw } from \"@lucide/vue\";\nimport { ref } from \"vue\";\n\nconst props = defineProps<{\n items: MediaItem[];\n selectedIds: Set<string>;\n isLoading: boolean;\n hasMore: boolean;\n accept?: MediaCategory[];\n layout?: \"grid\" | \"list\";\n}>();\n\nconst emit = defineEmits<{\n (e: \"select\", item: MediaItem): void;\n (e: \"toggle\", id: string): void;\n (e: \"loadMore\"): void;\n (e: \"edit\", item: MediaItem): void;\n (e: \"replace\", item: MediaItem): void;\n}>();\n\nconst { isAcceptedMimeType, isImageMimeType } = useMediaCategories();\n\nfunction isSelectable(item: MediaItem): boolean {\n if (!props.accept || props.accept.length === 0) {\n return true;\n }\n\n return isAcceptedMimeType(item.mime_type, props.accept);\n}\n\nfunction handleItemClick(item: MediaItem): void {\n emit(\"select\", item);\n}\n\nconst { t } = useI18n();\n\nconst sentinelRef = ref<HTMLElement | null>(null);\n\nuseIntersectionObserver(\n sentinelRef,\n ([{ isIntersecting }]) => {\n if (isIntersecting && props.hasMore && !props.isLoading) {\n emit(\"loadMore\");\n }\n },\n { threshold: 0.1 },\n);\n\nfunction formatSize(bytes: number): string {\n if (bytes < 1024) return `${bytes} B`;\n if (bytes < 1024 * 1024) return `${(bytes / 1024).toFixed(1)} KB`;\n return `${(bytes / (1024 * 1024)).toFixed(1)} MB`;\n}\n\nfunction formatDate(dateStr: string): string {\n return new Date(dateStr).toLocaleDateString(undefined, {\n year: \"numeric\",\n month: \"short\",\n day: \"numeric\",\n });\n}\n</script>\n\n<template>\n <div class=\"tpl:p-4\">\n <!-- Skeleton loading -->\n <div\n v-if=\"isLoading && items.length === 0\"\n :class=\"\n layout === 'list'\n ? 'tpl:flex tpl:flex-col tpl:gap-1'\n : 'tpl:grid tpl:grid-cols-4 tpl:gap-3'\n \"\n >\n <div\n v-for=\"i in 8\"\n :key=\"i\"\n class=\"tpl-pulse tpl:rounded-lg\"\n :class=\"layout === 'list' ? 'tpl:h-12' : 'tpl:aspect-square'\"\n style=\"background-color: var(--tpl-bg-hover)\"\n />\n </div>\n\n <!-- Empty state -->\n <div\n v-else-if=\"items.length === 0\"\n class=\"tpl:flex tpl:flex-col tpl:items-center tpl:justify-center tpl:py-16\"\n >\n <File\n class=\"tpl:mb-3\"\n :size=\"40\"\n :stroke-width=\"1\"\n style=\"color: var(--tpl-text-dim)\"\n />\n <p class=\"tpl:text-xs\" style=\"color: var(--tpl-text-muted)\">\n {{ t.mediaLibrary.noFiles }}\n </p>\n </div>\n\n <!-- Grid -->\n <div\n v-else-if=\"layout !== 'list'\"\n class=\"tpl:grid tpl:grid-cols-4 tpl:gap-3\"\n >\n <div\n v-for=\"item in items\"\n :key=\"item.id\"\n class=\"tpl-media-item tpl:group tpl:relative tpl:overflow-hidden tpl:rounded-lg tpl:border-2 tpl:transition-all tpl:duration-150\"\n :class=\"[\n 'tpl:cursor-pointer',\n !isSelectable(item) && !selectedIds.has(item.id)\n ? 'tpl:opacity-60'\n : '',\n selectedIds.has(item.id) ? 'tpl-media-item--selected' : '',\n ]\"\n :style=\"{\n borderColor: selectedIds.has(item.id)\n ? 'var(--tpl-primary)'\n : 'transparent',\n backgroundColor:\n !isSelectable(item) && !selectedIds.has(item.id)\n ? 'var(--tpl-bg)'\n : 'var(--tpl-bg-hover)',\n }\"\n @click=\"handleItemClick(item)\"\n >\n <div class=\"tpl:aspect-square\">\n <img\n v-if=\"isImageMimeType(item.mime_type)\"\n :src=\"item.small_url || item.url\"\n :alt=\"item.filename\"\n class=\"tpl:size-full tpl:object-cover\"\n loading=\"lazy\"\n />\n <MediaFileIcon v-else :mime-type=\"item.mime_type\" />\n </div>\n <div class=\"tpl:px-2 tpl:py-1.5\">\n <p\n class=\"tpl:truncate tpl:text-[10px] tpl:font-medium\"\n style=\"color: var(--tpl-text)\"\n >\n {{ item.filename }}\n </p>\n <p\n class=\"tpl:flex tpl:justify-between tpl:text-[9px]\"\n style=\"color: var(--tpl-text-muted)\"\n >\n <span>{{ formatSize(item.size) }}</span>\n <span\n v-if=\"\n isImageMimeType(item.mime_type) && item.width && item.height\n \"\n >\n {{ item.width }}×{{ item.height }}\n </span>\n </p>\n </div>\n <!-- Action buttons -->\n <div\n class=\"tpl:absolute tpl:top-1.5 tpl:left-1.5 tpl:flex tpl:gap-1 tpl:opacity-0 tpl:transition-opacity tpl:duration-150 tpl:group-hover:opacity-100\"\n >\n <!-- Edit button -->\n <button\n class=\"tpl:flex tpl:size-6 tpl:items-center tpl:justify-center tpl:rounded-full tpl:text-white\"\n style=\"background-color: rgba(0, 0, 0, 0.6)\"\n :title=\"t.mediaLibrary.editFile\"\n @click.stop=\"emit('edit', item)\"\n >\n <Pencil :size=\"11\" :stroke-width=\"2\" />\n </button>\n <!-- Replace button -->\n <button\n class=\"tpl:flex tpl:size-6 tpl:items-center tpl:justify-center tpl:rounded-full tpl:text-white\"\n style=\"background-color: rgba(0, 0, 0, 0.6)\"\n :title=\"t.mediaLibrary.replaceFile\"\n @click.stop=\"emit('replace', item)\"\n >\n <RefreshCw :size=\"11\" :stroke-width=\"2\" />\n </button>\n </div>\n <!-- Selection check -->\n <div\n v-if=\"selectedIds.has(item.id)\"\n class=\"tpl:absolute tpl:top-1.5 tpl:right-1.5 tpl:flex tpl:size-5 tpl:items-center tpl:justify-center tpl:rounded-full tpl:text-white\"\n style=\"background-color: var(--tpl-primary)\"\n >\n <Check :size=\"12\" :stroke-width=\"3\" />\n </div>\n </div>\n </div>\n\n <!-- List -->\n <div v-else class=\"tpl:flex tpl:flex-col tpl:gap-1\">\n <div\n v-for=\"item in items\"\n :key=\"item.id\"\n class=\"tpl-media-list-item tpl:group tpl:flex tpl:cursor-pointer tpl:items-center tpl:gap-3 tpl:rounded-lg tpl:px-3 tpl:py-2 tpl:transition-all tpl:duration-150\"\n :class=\"[\n !isSelectable(item) && !selectedIds.has(item.id)\n ? 'tpl:opacity-60'\n : '',\n ]\"\n :style=\"{\n backgroundColor: selectedIds.has(item.id)\n ? 'var(--tpl-bg-hover)'\n : 'transparent',\n }\"\n @click=\"handleItemClick(item)\"\n >\n <!-- Thumbnail -->\n <div\n class=\"tpl:size-10 tpl:shrink-0 tpl:overflow-hidden tpl:rounded\"\n style=\"background-color: var(--tpl-bg-hover)\"\n >\n <img\n v-if=\"isImageMimeType(item.mime_type)\"\n :src=\"item.small_url || item.url\"\n :alt=\"item.filename\"\n class=\"tpl:size-full tpl:object-cover\"\n loading=\"lazy\"\n />\n <div v-else class=\"tpl-list-icon tpl:size-full\">\n <MediaFileIcon :mime-type=\"item.mime_type\" />\n </div>\n </div>\n\n <!-- Info -->\n <div class=\"tpl:min-w-0 tpl:flex-1\">\n <p\n class=\"tpl:truncate tpl:text-xs tpl:font-medium\"\n style=\"color: var(--tpl-text)\"\n >\n {{ item.filename }}\n </p>\n <p class=\"tpl:text-[10px]\" style=\"color: var(--tpl-text-muted)\">\n {{ formatSize(item.size) }} ·\n {{ formatDate(item.created_at) }}\n <template\n v-if=\"\n isImageMimeType(item.mime_type) && item.width && item.height\n \"\n >\n ·\n {{ item.width }}×{{ item.height }}\n </template>\n </p>\n </div>\n\n <!-- Action buttons -->\n <div\n class=\"tpl:flex tpl:gap-1 tpl:opacity-0 tpl:transition-opacity tpl:duration-150 tpl:group-hover:opacity-100\"\n >\n <!-- Edit button -->\n <button\n class=\"tpl:flex tpl:size-6 tpl:shrink-0 tpl:cursor-pointer tpl:items-center tpl:justify-center tpl:rounded\"\n style=\"color: var(--tpl-text-muted)\"\n :title=\"t.mediaLibrary.editFile\"\n @click.stop=\"emit('edit', item)\"\n >\n <Pencil :size=\"12\" :stroke-width=\"2\" />\n </button>\n <!-- Replace button -->\n <button\n class=\"tpl:flex tpl:size-6 tpl:shrink-0 tpl:cursor-pointer tpl:items-center tpl:justify-center tpl:rounded\"\n style=\"color: var(--tpl-text-muted)\"\n :title=\"t.mediaLibrary.replaceFile\"\n @click.stop=\"emit('replace', item)\"\n >\n <RefreshCw :size=\"12\" :stroke-width=\"2\" />\n </button>\n </div>\n\n <!-- Selection check -->\n <div\n v-if=\"selectedIds.has(item.id)\"\n class=\"tpl:flex tpl:size-5 tpl:shrink-0 tpl:items-center tpl:justify-center tpl:rounded-full tpl:text-white\"\n style=\"background-color: var(--tpl-primary)\"\n >\n <Check :size=\"12\" :stroke-width=\"3\" />\n </div>\n </div>\n </div>\n\n <!-- Infinite scroll sentinel -->\n <div ref=\"sentinelRef\" class=\"tpl:h-4\" />\n\n <!-- Loading more indicator -->\n <div\n v-if=\"isLoading && items.length > 0\"\n class=\"tpl:flex tpl:justify-center tpl:py-4\"\n >\n <LoaderCircle\n class=\"tpl-spinner\"\n :size=\"20\"\n :stroke-width=\"2\"\n style=\"color: var(--tpl-primary)\"\n />\n </div>\n </div>\n</template>\n\n<style scoped>\n.tpl-media-item:not(.tpl-media-item--selected):hover {\n border-color: var(--tpl-border) !important;\n}\n\n.tpl-media-list-item:hover {\n background-color: var(--tpl-bg-hover) !important;\n}\n\n.tpl-list-icon {\n transform: scale(0.35);\n transform-origin: center;\n}\n</style>\n","<script setup lang=\"ts\">\nimport { useI18n } from \"../../composables/useI18n\";\nimport { POPOVER_TARGET_KEY, UI_THEME_KEY } from \"../../keys\";\nimport { LoaderCircle } from \"@lucide/vue\";\nimport { inject, ref, watch } from \"vue\";\n\nconst props = defineProps<{\n visible: boolean;\n isImporting: boolean;\n error: string | null;\n}>();\n\nconst emit = defineEmits<{\n (e: \"import\", url: string): void;\n (e: \"close\"): void;\n}>();\n\nconst { t } = useI18n();\nconst tplUiTheme = inject(UI_THEME_KEY, null);\nconst popoverTarget = inject(POPOVER_TARGET_KEY, ref<HTMLElement | null>(null));\n\nconst urlValue = ref(\"\");\n\nwatch(\n () => props.visible,\n (visible) => {\n if (visible) {\n urlValue.value = \"\";\n }\n },\n);\n\nfunction handleImport(): void {\n const trimmedUrl = urlValue.value.trim();\n if (!trimmedUrl || props.isImporting) {\n return;\n }\n\n emit(\"import\", trimmedUrl);\n}\n\nfunction handleClose(): void {\n if (!props.isImporting) {\n emit(\"close\");\n }\n}\n\nfunction handleKeydown(event: KeyboardEvent): void {\n if (event.key === \"Enter\") {\n event.preventDefault();\n handleImport();\n }\n if (event.key === \"Escape\") {\n handleClose();\n }\n}\n</script>\n\n<template>\n <Teleport :to=\"popoverTarget || 'body'\">\n <Transition\n enter-active-class=\"tpl:transition tpl:ease-out tpl:duration-150\"\n enter-from-class=\"tpl:opacity-0\"\n enter-to-class=\"tpl:opacity-100\"\n leave-active-class=\"tpl:transition tpl:ease-in tpl:duration-100\"\n leave-from-class=\"tpl:opacity-100\"\n leave-to-class=\"tpl:opacity-0\"\n >\n <div\n v-if=\"visible\"\n :data-tpl-theme=\"tplUiTheme\"\n class=\"tpl tpl:fixed tpl:inset-0 tpl:z-[10000] tpl:flex tpl:items-center tpl:justify-center tpl:p-4\"\n style=\"background-color: var(--tpl-overlay)\"\n @click.self=\"handleClose\"\n @keydown=\"handleKeydown\"\n >\n <div\n class=\"tpl:max-h-[90%] tpl:w-full tpl:max-w-sm tpl:overflow-y-auto tpl:rounded-lg tpl:p-5 tpl:shadow-xl\"\n style=\"background-color: var(--tpl-bg-elevated)\"\n >\n <h3\n class=\"tpl:mb-4 tpl:text-sm tpl:font-semibold\"\n style=\"color: var(--tpl-text)\"\n >\n {{ t.mediaLibrary.importFromUrl }}\n </h3>\n\n <!-- URL Input -->\n <div class=\"tpl:mb-3\">\n <input\n v-model=\"urlValue\"\n type=\"url\"\n class=\"tpl:w-full tpl:rounded-md tpl:border tpl:px-3 tpl:py-1.5 tpl:text-xs tpl:outline-none\"\n style=\"\n border-color: var(--tpl-border);\n background-color: var(--tpl-bg);\n color: var(--tpl-text);\n \"\n :placeholder=\"t.mediaLibrary.importUrlPlaceholder\"\n :disabled=\"isImporting\"\n autofocus\n />\n </div>\n\n <!-- Error message -->\n <p\n v-if=\"error\"\n class=\"tpl:mb-3 tpl:text-xs\"\n style=\"color: var(--tpl-danger)\"\n >\n {{ error }}\n </p>\n\n <!-- Actions -->\n <div class=\"tpl:flex tpl:justify-end tpl:gap-2\">\n <button\n class=\"tpl:cursor-pointer tpl:rounded-md tpl:border tpl:px-3 tpl:py-1.5 tpl:text-xs tpl:font-medium tpl:transition-all tpl:duration-150\"\n style=\"\n border-color: var(--tpl-border);\n color: var(--tpl-text);\n background-color: var(--tpl-bg);\n \"\n :disabled=\"isImporting\"\n :class=\"{\n 'tpl:cursor-not-allowed tpl:opacity-50': isImporting,\n }\"\n @click=\"handleClose\"\n >\n {{ t.mediaLibrary.cancel }}\n </button>\n <button\n class=\"tpl:cursor-pointer tpl:rounded-md tpl:px-3 tpl:py-1.5 tpl:text-xs tpl:font-medium tpl:text-white tpl:transition-all tpl:duration-150 tpl:disabled:cursor-not-allowed tpl:disabled:opacity-50\"\n style=\"\n background: linear-gradient(\n 135deg,\n var(--tpl-primary),\n var(--tpl-primary-hover)\n );\n \"\n :disabled=\"!urlValue.trim() || isImporting\"\n @click=\"handleImport\"\n >\n <span\n v-if=\"isImporting\"\n class=\"tpl:flex tpl:items-center tpl:gap-1.5\"\n >\n <LoaderCircle\n class=\"tpl:animate-spin\"\n :size=\"12\"\n :stroke-width=\"2\"\n />\n {{ t.mediaLibrary.importing }}\n </span>\n <span v-else>\n {{ t.mediaLibrary.import }}\n </span>\n </button>\n </div>\n </div>\n </div>\n </Transition>\n </Teleport>\n</template>\n","<script setup lang=\"ts\">\nimport { useI18n } from \"../../composables/useI18n\";\nimport { POPOVER_TARGET_KEY, UI_THEME_KEY } from \"../../keys\";\nimport { LoaderCircle } from \"@lucide/vue\";\nimport { inject, ref, watch } from \"vue\";\n\nconst props = defineProps<{\n visible: boolean;\n isImporting: boolean;\n error: string | null;\n}>();\n\nconst emit = defineEmits<{\n (e: \"import\", url: string): void;\n (e: \"close\"): void;\n}>();\n\nconst { t } = useI18n();\nconst tplUiTheme = inject(UI_THEME_KEY, null);\nconst popoverTarget = inject(POPOVER_TARGET_KEY, ref<HTMLElement | null>(null));\n\nconst urlValue = ref(\"\");\n\nwatch(\n () => props.visible,\n (visible) => {\n if (visible) {\n urlValue.value = \"\";\n }\n },\n);\n\nfunction handleImport(): void {\n const trimmedUrl = urlValue.value.trim();\n if (!trimmedUrl || props.isImporting) {\n return;\n }\n\n emit(\"import\", trimmedUrl);\n}\n\nfunction handleClose(): void {\n if (!props.isImporting) {\n emit(\"close\");\n }\n}\n\nfunction handleKeydown(event: KeyboardEvent): void {\n if (event.key === \"Enter\") {\n event.preventDefault();\n handleImport();\n }\n if (event.key === \"Escape\") {\n handleClose();\n }\n}\n</script>\n\n<template>\n <Teleport :to=\"popoverTarget || 'body'\">\n <Transition\n enter-active-class=\"tpl:transition tpl:ease-out tpl:duration-150\"\n enter-from-class=\"tpl:opacity-0\"\n enter-to-class=\"tpl:opacity-100\"\n leave-active-class=\"tpl:transition tpl:ease-in tpl:duration-100\"\n leave-from-class=\"tpl:opacity-100\"\n leave-to-class=\"tpl:opacity-0\"\n >\n <div\n v-if=\"visible\"\n :data-tpl-theme=\"tplUiTheme\"\n class=\"tpl tpl:fixed tpl:inset-0 tpl:z-[10000] tpl:flex tpl:items-center tpl:justify-center tpl:p-4\"\n style=\"background-color: var(--tpl-overlay)\"\n @click.self=\"handleClose\"\n @keydown=\"handleKeydown\"\n >\n <div\n class=\"tpl:max-h-[90%] tpl:w-full tpl:max-w-sm tpl:overflow-y-auto tpl:rounded-lg tpl:p-5 tpl:shadow-xl\"\n style=\"background-color: var(--tpl-bg-elevated)\"\n >\n <h3\n class=\"tpl:mb-4 tpl:text-sm tpl:font-semibold\"\n style=\"color: var(--tpl-text)\"\n >\n {{ t.mediaLibrary.importFromUrl }}\n </h3>\n\n <!-- URL Input -->\n <div class=\"tpl:mb-3\">\n <input\n v-model=\"urlValue\"\n type=\"url\"\n class=\"tpl:w-full tpl:rounded-md tpl:border tpl:px-3 tpl:py-1.5 tpl:text-xs tpl:outline-none\"\n style=\"\n border-color: var(--tpl-border);\n background-color: var(--tpl-bg);\n color: var(--tpl-text);\n \"\n :placeholder=\"t.mediaLibrary.importUrlPlaceholder\"\n :disabled=\"isImporting\"\n autofocus\n />\n </div>\n\n <!-- Error message -->\n <p\n v-if=\"error\"\n class=\"tpl:mb-3 tpl:text-xs\"\n style=\"color: var(--tpl-danger)\"\n >\n {{ error }}\n </p>\n\n <!-- Actions -->\n <div class=\"tpl:flex tpl:justify-end tpl:gap-2\">\n <button\n class=\"tpl:cursor-pointer tpl:rounded-md tpl:border tpl:px-3 tpl:py-1.5 tpl:text-xs tpl:font-medium tpl:transition-all tpl:duration-150\"\n style=\"\n border-color: var(--tpl-border);\n color: var(--tpl-text);\n background-color: var(--tpl-bg);\n \"\n :disabled=\"isImporting\"\n :class=\"{\n 'tpl:cursor-not-allowed tpl:opacity-50': isImporting,\n }\"\n @click=\"handleClose\"\n >\n {{ t.mediaLibrary.cancel }}\n </button>\n <button\n class=\"tpl:cursor-pointer tpl:rounded-md tpl:px-3 tpl:py-1.5 tpl:text-xs tpl:font-medium tpl:text-white tpl:transition-all tpl:duration-150 tpl:disabled:cursor-not-allowed tpl:disabled:opacity-50\"\n style=\"\n background: linear-gradient(\n 135deg,\n var(--tpl-primary),\n var(--tpl-primary-hover)\n );\n \"\n :disabled=\"!urlValue.trim() || isImporting\"\n @click=\"handleImport\"\n >\n <span\n v-if=\"isImporting\"\n class=\"tpl:flex tpl:items-center tpl:gap-1.5\"\n >\n <LoaderCircle\n class=\"tpl:animate-spin\"\n :size=\"12\"\n :stroke-width=\"2\"\n />\n {{ t.mediaLibrary.importing }}\n </span>\n <span v-else>\n {{ t.mediaLibrary.import }}\n </span>\n </button>\n </div>\n </div>\n </div>\n </Transition>\n </Teleport>\n</template>\n","<script setup lang=\"ts\">\nimport { useI18n } from \"../../composables/useI18n\";\nimport type { MediaFolder } from \"../../types\";\nimport { onClickOutside } from \"@vueuse/core\";\nimport { File, Folder } from \"@lucide/vue\";\nimport { ref } from \"vue\";\n\ndefineProps<{\n folders: MediaFolder[];\n currentFolderId: string | null;\n}>();\n\nconst emit = defineEmits<{\n (e: \"select\", folderId: string | null): void;\n (e: \"close\"): void;\n}>();\n\nconst { t } = useI18n();\nconst pickerRef = ref<HTMLDivElement | null>(null);\n\ninterface FlatFolder {\n id: string;\n name: string;\n depth: number;\n}\n\nfunction flattenFolders(\n folders: MediaFolder[],\n depth: number = 0,\n): FlatFolder[] {\n const result: FlatFolder[] = [];\n for (const folder of folders) {\n result.push({ id: folder.id, name: folder.name, depth });\n if (folder.children?.length) {\n result.push(...flattenFolders(folder.children, depth + 1));\n }\n }\n return result;\n}\n\nonClickOutside(pickerRef, () => {\n emit(\"close\");\n});\n</script>\n\n<template>\n <div\n ref=\"pickerRef\"\n class=\"tpl:absolute tpl:bottom-full tpl:left-0 tpl:z-10 tpl:mb-2 tpl:w-56 tpl:overflow-hidden tpl:rounded-lg tpl:border tpl:shadow-lg\"\n style=\"\n border-color: var(--tpl-border);\n background-color: var(--tpl-bg-elevated);\n \"\n >\n <div class=\"tpl:max-h-56 tpl:overflow-y-auto tpl:py-1\">\n <button\n v-if=\"currentFolderId !== null\"\n class=\"tpl:flex tpl:w-full tpl:items-center tpl:gap-1.5 tpl:px-3 tpl:py-1.5 tpl:text-left tpl:text-xs tpl:transition-colors tpl:duration-100\"\n style=\"color: var(--tpl-text)\"\n @click=\"emit('select', null)\"\n >\n <File class=\"tpl:shrink-0\" :size=\"14\" :stroke-width=\"1.5\" />\n {{ t.mediaLibrary.moveToRoot }}\n </button>\n <button\n v-for=\"folder in flattenFolders(folders)\"\n :key=\"folder.id\"\n class=\"tpl:flex tpl:w-full tpl:items-center tpl:gap-1.5 tpl:py-1.5 tpl:pr-3 tpl:text-left tpl:text-xs tpl:transition-colors tpl:duration-100\"\n :style=\"{\n paddingLeft: `${folder.depth * 16 + 12}px`,\n color:\n folder.id === currentFolderId\n ? 'var(--tpl-text-dim)'\n : 'var(--tpl-text)',\n opacity: folder.id === currentFolderId ? 0.5 : 1,\n }\"\n :disabled=\"folder.id === currentFolderId\"\n @click=\"emit('select', folder.id)\"\n >\n <Folder class=\"tpl:shrink-0\" :size=\"14\" :stroke-width=\"1.5\" />\n <span class=\"tpl:truncate\">{{ folder.name }}</span>\n <span\n v-if=\"folder.id === currentFolderId\"\n class=\"tpl:shrink-0\"\n style=\"color: var(--tpl-text-dim)\"\n >\n {{ t.mediaLibrary.currentFolder }}\n </span>\n </button>\n </div>\n </div>\n</template>\n","<script setup lang=\"ts\">\nimport { useI18n } from \"../../composables/useI18n\";\nimport type { MediaFolder } from \"../../types\";\nimport { onClickOutside } from \"@vueuse/core\";\nimport { File, Folder } from \"@lucide/vue\";\nimport { ref } from \"vue\";\n\ndefineProps<{\n folders: MediaFolder[];\n currentFolderId: string | null;\n}>();\n\nconst emit = defineEmits<{\n (e: \"select\", folderId: string | null): void;\n (e: \"close\"): void;\n}>();\n\nconst { t } = useI18n();\nconst pickerRef = ref<HTMLDivElement | null>(null);\n\ninterface FlatFolder {\n id: string;\n name: string;\n depth: number;\n}\n\nfunction flattenFolders(\n folders: MediaFolder[],\n depth: number = 0,\n): FlatFolder[] {\n const result: FlatFolder[] = [];\n for (const folder of folders) {\n result.push({ id: folder.id, name: folder.name, depth });\n if (folder.children?.length) {\n result.push(...flattenFolders(folder.children, depth + 1));\n }\n }\n return result;\n}\n\nonClickOutside(pickerRef, () => {\n emit(\"close\");\n});\n</script>\n\n<template>\n <div\n ref=\"pickerRef\"\n class=\"tpl:absolute tpl:bottom-full tpl:left-0 tpl:z-10 tpl:mb-2 tpl:w-56 tpl:overflow-hidden tpl:rounded-lg tpl:border tpl:shadow-lg\"\n style=\"\n border-color: var(--tpl-border);\n background-color: var(--tpl-bg-elevated);\n \"\n >\n <div class=\"tpl:max-h-56 tpl:overflow-y-auto tpl:py-1\">\n <button\n v-if=\"currentFolderId !== null\"\n class=\"tpl:flex tpl:w-full tpl:items-center tpl:gap-1.5 tpl:px-3 tpl:py-1.5 tpl:text-left tpl:text-xs tpl:transition-colors tpl:duration-100\"\n style=\"color: var(--tpl-text)\"\n @click=\"emit('select', null)\"\n >\n <File class=\"tpl:shrink-0\" :size=\"14\" :stroke-width=\"1.5\" />\n {{ t.mediaLibrary.moveToRoot }}\n </button>\n <button\n v-for=\"folder in flattenFolders(folders)\"\n :key=\"folder.id\"\n class=\"tpl:flex tpl:w-full tpl:items-center tpl:gap-1.5 tpl:py-1.5 tpl:pr-3 tpl:text-left tpl:text-xs tpl:transition-colors tpl:duration-100\"\n :style=\"{\n paddingLeft: `${folder.depth * 16 + 12}px`,\n color:\n folder.id === currentFolderId\n ? 'var(--tpl-text-dim)'\n : 'var(--tpl-text)',\n opacity: folder.id === currentFolderId ? 0.5 : 1,\n }\"\n :disabled=\"folder.id === currentFolderId\"\n @click=\"emit('select', folder.id)\"\n >\n <Folder class=\"tpl:shrink-0\" :size=\"14\" :stroke-width=\"1.5\" />\n <span class=\"tpl:truncate\">{{ folder.name }}</span>\n <span\n v-if=\"folder.id === currentFolderId\"\n class=\"tpl:shrink-0\"\n style=\"color: var(--tpl-text-dim)\"\n >\n {{ t.mediaLibrary.currentFolder }}\n </span>\n </button>\n </div>\n </div>\n</template>\n","<script setup lang=\"ts\">\nimport MediaFileIcon from \"./MediaFileIcon.vue\";\nimport { useI18n } from \"../../composables/useI18n\";\nimport { useMediaCategories } from \"../../composables/useMediaCategories\";\nimport type { MediaConversion, MediaFolder, MediaItem } from \"../../types\";\nimport { Folder } from \"@lucide/vue\";\nimport { computed } from \"vue\";\n\nconst props = defineProps<{\n item: MediaItem;\n folders?: MediaFolder[];\n selectedConversion: MediaConversion;\n}>();\n\nconst emit = defineEmits<{\n (e: \"update:selectedConversion\", value: MediaConversion): void;\n}>();\n\nconst { t } = useI18n();\n\nconst { isImageMimeType } = useMediaCategories();\n\ninterface ConversionOption {\n value: MediaConversion;\n label: string;\n url: string | null;\n}\n\nconst availableConversions = computed((): ConversionOption[] => {\n if (!isImage.value || !props.item.conversions_generated) {\n return [];\n }\n\n const options: ConversionOption[] = [];\n\n if (props.item.small_url) {\n options.push({\n value: \"small\",\n label: t.mediaLibrary.conversionSmall,\n url: props.item.small_url,\n });\n }\n\n if (props.item.medium_url) {\n options.push({\n value: \"medium\",\n label: t.mediaLibrary.conversionMedium,\n url: props.item.medium_url,\n });\n }\n\n if (props.item.large_url) {\n options.push({\n value: \"large\",\n label: t.mediaLibrary.conversionLarge,\n url: props.item.large_url,\n });\n }\n\n // Always add original option\n options.push({\n value: \"original\",\n label: t.mediaLibrary.conversionOriginal,\n url: props.item.url,\n });\n\n return options;\n});\n\nconst hasConversions = computed(\n () => isImage.value && availableConversions.value.length > 1,\n);\n\nconst previewUrl = computed(() => {\n if (!isImage.value) return null;\n\n switch (props.selectedConversion) {\n case \"small\":\n return props.item.small_url || props.item.url;\n case \"medium\":\n return props.item.medium_url || props.item.url;\n case \"large\":\n return props.item.large_url || props.item.url;\n default:\n return props.item.url;\n }\n});\n\nfunction handleConversionChange(event: Event): void {\n const target = event.target as HTMLSelectElement;\n emit(\"update:selectedConversion\", target.value as MediaConversion);\n}\n\nfunction buildFolderPath(\n folderList: MediaFolder[],\n targetId: string,\n currentPath: string[] = [],\n): string[] | null {\n for (const folder of folderList) {\n const newPath = [...currentPath, folder.name];\n if (folder.id === targetId) {\n return newPath;\n }\n if (folder.children) {\n const found = buildFolderPath(folder.children, targetId, newPath);\n if (found) return found;\n }\n }\n return null;\n}\n\nconst folderPath = computed(() => {\n if (!props.item.folder_id || !props.folders) {\n return null;\n }\n const path = buildFolderPath(props.folders, props.item.folder_id);\n return path ? path.join(\"/\") : null;\n});\n\nconst isImage = computed(() => isImageMimeType(props.item.mime_type));\n\nfunction formatSize(bytes: number): string {\n if (bytes < 1024) return `${bytes} B`;\n if (bytes < 1024 * 1024) return `${(bytes / 1024).toFixed(1)} KB`;\n return `${(bytes / (1024 * 1024)).toFixed(1)} MB`;\n}\n\nfunction formatDate(dateStr: string): string {\n return new Date(dateStr).toLocaleDateString(undefined, {\n year: \"numeric\",\n month: \"short\",\n day: \"numeric\",\n });\n}\n</script>\n\n<template>\n <div class=\"tpl:flex tpl:items-center tpl:gap-3\">\n <img\n v-if=\"isImage\"\n :src=\"previewUrl ?? undefined\"\n :alt=\"item.alt_text || item.filename\"\n class=\"tpl:size-10 tpl:shrink-0 tpl:rounded tpl:object-cover\"\n style=\"border: 1px solid var(--tpl-border)\"\n />\n <div\n v-else\n class=\"tpl:flex tpl:size-10 tpl:shrink-0 tpl:items-center tpl:justify-center tpl:overflow-hidden tpl:rounded\"\n style=\"border: 1px solid var(--tpl-border)\"\n >\n <MediaFileIcon :mime-type=\"item.mime_type\" class=\"tpl-preview-icon\" />\n </div>\n <div class=\"tpl:min-w-0 tpl:flex-1\">\n <p\n class=\"tpl:truncate tpl:text-xs tpl:font-medium\"\n style=\"color: var(--tpl-text)\"\n >\n {{ item.filename }}\n </p>\n <p\n class=\"tpl:mt-0.5 tpl:text-[10px]\"\n style=\"color: var(--tpl-text-muted)\"\n >\n {{ formatSize(item.size) }}\n · {{ formatDate(item.created_at) }}\n <template v-if=\"isImage && item.width && item.height\">\n · {{ item.width }}×{{ item.height }}px\n </template>\n <template v-if=\"folderPath\">\n ·\n <Folder class=\"tpl:mb-px tpl:inline\" :size=\"9\" :stroke-width=\"2\" />\n {{ folderPath }}\n </template>\n </p>\n <p\n v-if=\"isImage\"\n class=\"tpl:mt-0.5 tpl:truncate tpl:text-[10px] tpl:italic\"\n :class=\"{ 'tpl:invisible': !item.alt_text }\"\n style=\"color: var(--tpl-text-dim)\"\n >\n {{ item.alt_text || \" \" }}\n </p>\n </div>\n <!-- Conversion selector -->\n <div v-if=\"hasConversions\" class=\"tpl:shrink-0\">\n <label\n class=\"tpl:block tpl:text-[10px]\"\n style=\"color: var(--tpl-text-muted)\"\n >\n {{ t.mediaLibrary.conversionLabel }}\n </label>\n <select\n class=\"tpl:mt-0.5 tpl:rounded-md tpl:border tpl:py-1 tpl:pr-6 tpl:pl-2 tpl:text-xs tpl:outline-none\"\n style=\"\n border-color: var(--tpl-border);\n background-color: var(--tpl-bg);\n color: var(--tpl-text);\n \"\n :value=\"selectedConversion\"\n @change=\"handleConversionChange\"\n >\n <option\n v-for=\"option in availableConversions\"\n :key=\"option.value\"\n :value=\"option.value\"\n >\n {{ option.label }}\n </option>\n </select>\n </div>\n </div>\n</template>\n\n<style scoped>\n.tpl-preview-icon {\n transform: scale(0.45);\n transform-origin: center;\n}\n</style>\n","<script setup lang=\"ts\">\nimport MediaFileIcon from \"./MediaFileIcon.vue\";\nimport { useI18n } from \"../../composables/useI18n\";\nimport { useMediaCategories } from \"../../composables/useMediaCategories\";\nimport type { MediaConversion, MediaFolder, MediaItem } from \"../../types\";\nimport { Folder } from \"@lucide/vue\";\nimport { computed } from \"vue\";\n\nconst props = defineProps<{\n item: MediaItem;\n folders?: MediaFolder[];\n selectedConversion: MediaConversion;\n}>();\n\nconst emit = defineEmits<{\n (e: \"update:selectedConversion\", value: MediaConversion): void;\n}>();\n\nconst { t } = useI18n();\n\nconst { isImageMimeType } = useMediaCategories();\n\ninterface ConversionOption {\n value: MediaConversion;\n label: string;\n url: string | null;\n}\n\nconst availableConversions = computed((): ConversionOption[] => {\n if (!isImage.value || !props.item.conversions_generated) {\n return [];\n }\n\n const options: ConversionOption[] = [];\n\n if (props.item.small_url) {\n options.push({\n value: \"small\",\n label: t.mediaLibrary.conversionSmall,\n url: props.item.small_url,\n });\n }\n\n if (props.item.medium_url) {\n options.push({\n value: \"medium\",\n label: t.mediaLibrary.conversionMedium,\n url: props.item.medium_url,\n });\n }\n\n if (props.item.large_url) {\n options.push({\n value: \"large\",\n label: t.mediaLibrary.conversionLarge,\n url: props.item.large_url,\n });\n }\n\n // Always add original option\n options.push({\n value: \"original\",\n label: t.mediaLibrary.conversionOriginal,\n url: props.item.url,\n });\n\n return options;\n});\n\nconst hasConversions = computed(\n () => isImage.value && availableConversions.value.length > 1,\n);\n\nconst previewUrl = computed(() => {\n if (!isImage.value) return null;\n\n switch (props.selectedConversion) {\n case \"small\":\n return props.item.small_url || props.item.url;\n case \"medium\":\n return props.item.medium_url || props.item.url;\n case \"large\":\n return props.item.large_url || props.item.url;\n default:\n return props.item.url;\n }\n});\n\nfunction handleConversionChange(event: Event): void {\n const target = event.target as HTMLSelectElement;\n emit(\"update:selectedConversion\", target.value as MediaConversion);\n}\n\nfunction buildFolderPath(\n folderList: MediaFolder[],\n targetId: string,\n currentPath: string[] = [],\n): string[] | null {\n for (const folder of folderList) {\n const newPath = [...currentPath, folder.name];\n if (folder.id === targetId) {\n return newPath;\n }\n if (folder.children) {\n const found = buildFolderPath(folder.children, targetId, newPath);\n if (found) return found;\n }\n }\n return null;\n}\n\nconst folderPath = computed(() => {\n if (!props.item.folder_id || !props.folders) {\n return null;\n }\n const path = buildFolderPath(props.folders, props.item.folder_id);\n return path ? path.join(\"/\") : null;\n});\n\nconst isImage = computed(() => isImageMimeType(props.item.mime_type));\n\nfunction formatSize(bytes: number): string {\n if (bytes < 1024) return `${bytes} B`;\n if (bytes < 1024 * 1024) return `${(bytes / 1024).toFixed(1)} KB`;\n return `${(bytes / (1024 * 1024)).toFixed(1)} MB`;\n}\n\nfunction formatDate(dateStr: string): string {\n return new Date(dateStr).toLocaleDateString(undefined, {\n year: \"numeric\",\n month: \"short\",\n day: \"numeric\",\n });\n}\n</script>\n\n<template>\n <div class=\"tpl:flex tpl:items-center tpl:gap-3\">\n <img\n v-if=\"isImage\"\n :src=\"previewUrl ?? undefined\"\n :alt=\"item.alt_text || item.filename\"\n class=\"tpl:size-10 tpl:shrink-0 tpl:rounded tpl:object-cover\"\n style=\"border: 1px solid var(--tpl-border)\"\n />\n <div\n v-else\n class=\"tpl:flex tpl:size-10 tpl:shrink-0 tpl:items-center tpl:justify-center tpl:overflow-hidden tpl:rounded\"\n style=\"border: 1px solid var(--tpl-border)\"\n >\n <MediaFileIcon :mime-type=\"item.mime_type\" class=\"tpl-preview-icon\" />\n </div>\n <div class=\"tpl:min-w-0 tpl:flex-1\">\n <p\n class=\"tpl:truncate tpl:text-xs tpl:font-medium\"\n style=\"color: var(--tpl-text)\"\n >\n {{ item.filename }}\n </p>\n <p\n class=\"tpl:mt-0.5 tpl:text-[10px]\"\n style=\"color: var(--tpl-text-muted)\"\n >\n {{ formatSize(item.size) }}\n · {{ formatDate(item.created_at) }}\n <template v-if=\"isImage && item.width && item.height\">\n · {{ item.width }}×{{ item.height }}px\n </template>\n <template v-if=\"folderPath\">\n ·\n <Folder class=\"tpl:mb-px tpl:inline\" :size=\"9\" :stroke-width=\"2\" />\n {{ folderPath }}\n </template>\n </p>\n <p\n v-if=\"isImage\"\n class=\"tpl:mt-0.5 tpl:truncate tpl:text-[10px] tpl:italic\"\n :class=\"{ 'tpl:invisible': !item.alt_text }\"\n style=\"color: var(--tpl-text-dim)\"\n >\n {{ item.alt_text || \" \" }}\n </p>\n </div>\n <!-- Conversion selector -->\n <div v-if=\"hasConversions\" class=\"tpl:shrink-0\">\n <label\n class=\"tpl:block tpl:text-[10px]\"\n style=\"color: var(--tpl-text-muted)\"\n >\n {{ t.mediaLibrary.conversionLabel }}\n </label>\n <select\n class=\"tpl:mt-0.5 tpl:rounded-md tpl:border tpl:py-1 tpl:pr-6 tpl:pl-2 tpl:text-xs tpl:outline-none\"\n style=\"\n border-color: var(--tpl-border);\n background-color: var(--tpl-bg);\n color: var(--tpl-text);\n \"\n :value=\"selectedConversion\"\n @change=\"handleConversionChange\"\n >\n <option\n v-for=\"option in availableConversions\"\n :key=\"option.value\"\n :value=\"option.value\"\n >\n {{ option.label }}\n </option>\n </select>\n </div>\n </div>\n</template>\n\n<style scoped>\n.tpl-preview-icon {\n transform: scale(0.45);\n transform-origin: center;\n}\n</style>\n","<script setup lang=\"ts\">\nimport { useI18n } from \"../../composables/useI18n\";\nimport { POPOVER_TARGET_KEY, UI_THEME_KEY } from \"../../keys\";\nimport type { MediaItem, MediaUsageInfo } from \"../../types\";\nimport { computed, inject, ref, watch } from \"vue\";\n\nconst props = defineProps<{\n visible: boolean;\n item: MediaItem | null;\n usageInfo: MediaUsageInfo | null;\n isReplacing: boolean;\n error: string | null;\n}>();\n\nconst emit = defineEmits<{\n (e: \"replace\", file: File): void;\n (e: \"close\"): void;\n}>();\n\nconst { t } = useI18n();\nconst tplUiTheme = inject(UI_THEME_KEY, null);\nconst popoverTarget = inject(POPOVER_TARGET_KEY, ref<HTMLElement | null>(null));\n\nconst fileInputRef = ref<HTMLInputElement | null>(null);\nconst selectedFile = ref<File | null>(null);\n\nconst extension = computed(() => {\n if (!props.item) {\n return \"\";\n }\n\n const parts = props.item.filename.split(\".\");\n return parts.length > 1 ? parts[parts.length - 1].toLowerCase() : \"\";\n});\n\nconst acceptPattern = computed(() => {\n return extension.value ? `.${extension.value}` : \"*\";\n});\n\nconst hasUsage = computed(() => {\n return (props.usageInfo?.template_count ?? 0) > 0;\n});\n\nwatch(\n () => props.visible,\n (visible) => {\n if (!visible) {\n selectedFile.value = null;\n if (fileInputRef.value) {\n fileInputRef.value.value = \"\";\n }\n }\n },\n);\n\nfunction handleFileChange(event: Event): void {\n const input = event.target as HTMLInputElement;\n if (input.files && input.files.length > 0) {\n selectedFile.value = input.files[0];\n }\n}\n\nfunction handleReplace(): void {\n if (selectedFile.value) {\n emit(\"replace\", selectedFile.value);\n }\n}\n\nfunction handleKeydown(event: KeyboardEvent): void {\n if (event.key === \"Escape\") {\n emit(\"close\");\n }\n}\n</script>\n\n<template>\n <Teleport :to=\"popoverTarget || 'body'\">\n <Transition\n enter-active-class=\"tpl:transition tpl:ease-out tpl:duration-150\"\n enter-from-class=\"tpl:opacity-0\"\n enter-to-class=\"tpl:opacity-100\"\n leave-active-class=\"tpl:transition tpl:ease-in tpl:duration-100\"\n leave-from-class=\"tpl:opacity-100\"\n leave-to-class=\"tpl:opacity-0\"\n >\n <div\n v-if=\"visible && item\"\n :data-tpl-theme=\"tplUiTheme\"\n class=\"tpl tpl:fixed tpl:inset-0 tpl:z-[10000] tpl:flex tpl:items-center tpl:justify-center tpl:p-4\"\n style=\"background-color: var(--tpl-overlay)\"\n @click.self=\"emit('close')\"\n @keydown=\"handleKeydown\"\n >\n <div\n class=\"tpl:max-h-[90%] tpl:w-full tpl:max-w-sm tpl:overflow-y-auto tpl:rounded-lg tpl:p-5 tpl:shadow-xl\"\n style=\"background-color: var(--tpl-bg-elevated)\"\n >\n <h3\n class=\"tpl:mb-2 tpl:text-sm tpl:font-semibold\"\n style=\"color: var(--tpl-text)\"\n >\n {{ t.mediaLibrary.replaceWarningTitle }}\n </h3>\n\n <!-- Warning message -->\n <p class=\"tpl:mb-2 tpl:text-xs\" style=\"color: var(--tpl-text-muted)\">\n {{\n t.mediaLibrary.replaceWarningMessage.replace(\n \"{extension}\",\n `.${extension}`,\n )\n }}\n </p>\n\n <!-- Usage warning -->\n <p\n v-if=\"hasUsage\"\n class=\"tpl:mb-3 tpl:text-xs\"\n style=\"color: var(--tpl-warning)\"\n >\n {{\n t.mediaLibrary.replaceWarningUsageNote.replace(\n \"{count}\",\n usageInfo!.template_count.toString(),\n )\n }}\n </p>\n\n <!-- Current file info -->\n <div\n class=\"tpl:mb-3 tpl:rounded tpl:border tpl:p-2\"\n style=\"border-color: var(--tpl-border)\"\n >\n <p\n class=\"tpl:truncate tpl:text-xs tpl:font-medium\"\n style=\"color: var(--tpl-text)\"\n >\n {{ item.filename }}\n </p>\n </div>\n\n <!-- File input -->\n <div class=\"tpl:mb-4\">\n <label\n class=\"tpl:mb-1 tpl:block tpl:text-xs tpl:font-medium\"\n style=\"color: var(--tpl-text-muted)\"\n >\n {{ t.mediaLibrary.replaceSelectFile }}\n </label>\n <input\n ref=\"fileInputRef\"\n type=\"file\"\n :accept=\"acceptPattern\"\n class=\"tpl:w-full tpl:rounded-md tpl:border tpl:px-3 tpl:py-1.5 tpl:text-xs\"\n style=\"\n border-color: var(--tpl-border);\n background-color: var(--tpl-bg);\n color: var(--tpl-text);\n \"\n @change=\"handleFileChange\"\n />\n </div>\n\n <!-- Error message -->\n <p\n v-if=\"error\"\n class=\"tpl:mb-3 tpl:text-xs\"\n style=\"color: var(--tpl-danger)\"\n >\n {{ error }}\n </p>\n\n <!-- Actions -->\n <div class=\"tpl:flex tpl:justify-end tpl:gap-2\">\n <button\n class=\"tpl:cursor-pointer tpl:rounded-md tpl:border tpl:px-3 tpl:py-1.5 tpl:text-xs tpl:font-medium tpl:transition-all tpl:duration-150\"\n style=\"\n border-color: var(--tpl-border);\n color: var(--tpl-text);\n background-color: var(--tpl-bg);\n \"\n :disabled=\"isReplacing\"\n @click=\"emit('close')\"\n >\n {{ t.mediaLibrary.cancel }}\n </button>\n <button\n class=\"tpl:cursor-pointer tpl:rounded-md tpl:px-3 tpl:py-1.5 tpl:text-xs tpl:font-medium tpl:text-white tpl:transition-all tpl:duration-150 tpl:disabled:cursor-not-allowed tpl:disabled:opacity-50\"\n style=\"\n background: linear-gradient(\n 135deg,\n var(--tpl-primary),\n var(--tpl-primary-hover)\n );\n \"\n :disabled=\"!selectedFile || isReplacing\"\n @click=\"handleReplace\"\n >\n {{\n isReplacing ? t.mediaLibrary.replacing : t.mediaLibrary.replace\n }}\n </button>\n </div>\n </div>\n </div>\n </Transition>\n </Teleport>\n</template>\n","<script setup lang=\"ts\">\nimport { useI18n } from \"../../composables/useI18n\";\nimport { POPOVER_TARGET_KEY, UI_THEME_KEY } from \"../../keys\";\nimport type { MediaItem, MediaUsageInfo } from \"../../types\";\nimport { computed, inject, ref, watch } from \"vue\";\n\nconst props = defineProps<{\n visible: boolean;\n item: MediaItem | null;\n usageInfo: MediaUsageInfo | null;\n isReplacing: boolean;\n error: string | null;\n}>();\n\nconst emit = defineEmits<{\n (e: \"replace\", file: File): void;\n (e: \"close\"): void;\n}>();\n\nconst { t } = useI18n();\nconst tplUiTheme = inject(UI_THEME_KEY, null);\nconst popoverTarget = inject(POPOVER_TARGET_KEY, ref<HTMLElement | null>(null));\n\nconst fileInputRef = ref<HTMLInputElement | null>(null);\nconst selectedFile = ref<File | null>(null);\n\nconst extension = computed(() => {\n if (!props.item) {\n return \"\";\n }\n\n const parts = props.item.filename.split(\".\");\n return parts.length > 1 ? parts[parts.length - 1].toLowerCase() : \"\";\n});\n\nconst acceptPattern = computed(() => {\n return extension.value ? `.${extension.value}` : \"*\";\n});\n\nconst hasUsage = computed(() => {\n return (props.usageInfo?.template_count ?? 0) > 0;\n});\n\nwatch(\n () => props.visible,\n (visible) => {\n if (!visible) {\n selectedFile.value = null;\n if (fileInputRef.value) {\n fileInputRef.value.value = \"\";\n }\n }\n },\n);\n\nfunction handleFileChange(event: Event): void {\n const input = event.target as HTMLInputElement;\n if (input.files && input.files.length > 0) {\n selectedFile.value = input.files[0];\n }\n}\n\nfunction handleReplace(): void {\n if (selectedFile.value) {\n emit(\"replace\", selectedFile.value);\n }\n}\n\nfunction handleKeydown(event: KeyboardEvent): void {\n if (event.key === \"Escape\") {\n emit(\"close\");\n }\n}\n</script>\n\n<template>\n <Teleport :to=\"popoverTarget || 'body'\">\n <Transition\n enter-active-class=\"tpl:transition tpl:ease-out tpl:duration-150\"\n enter-from-class=\"tpl:opacity-0\"\n enter-to-class=\"tpl:opacity-100\"\n leave-active-class=\"tpl:transition tpl:ease-in tpl:duration-100\"\n leave-from-class=\"tpl:opacity-100\"\n leave-to-class=\"tpl:opacity-0\"\n >\n <div\n v-if=\"visible && item\"\n :data-tpl-theme=\"tplUiTheme\"\n class=\"tpl tpl:fixed tpl:inset-0 tpl:z-[10000] tpl:flex tpl:items-center tpl:justify-center tpl:p-4\"\n style=\"background-color: var(--tpl-overlay)\"\n @click.self=\"emit('close')\"\n @keydown=\"handleKeydown\"\n >\n <div\n class=\"tpl:max-h-[90%] tpl:w-full tpl:max-w-sm tpl:overflow-y-auto tpl:rounded-lg tpl:p-5 tpl:shadow-xl\"\n style=\"background-color: var(--tpl-bg-elevated)\"\n >\n <h3\n class=\"tpl:mb-2 tpl:text-sm tpl:font-semibold\"\n style=\"color: var(--tpl-text)\"\n >\n {{ t.mediaLibrary.replaceWarningTitle }}\n </h3>\n\n <!-- Warning message -->\n <p class=\"tpl:mb-2 tpl:text-xs\" style=\"color: var(--tpl-text-muted)\">\n {{\n t.mediaLibrary.replaceWarningMessage.replace(\n \"{extension}\",\n `.${extension}`,\n )\n }}\n </p>\n\n <!-- Usage warning -->\n <p\n v-if=\"hasUsage\"\n class=\"tpl:mb-3 tpl:text-xs\"\n style=\"color: var(--tpl-warning)\"\n >\n {{\n t.mediaLibrary.replaceWarningUsageNote.replace(\n \"{count}\",\n usageInfo!.template_count.toString(),\n )\n }}\n </p>\n\n <!-- Current file info -->\n <div\n class=\"tpl:mb-3 tpl:rounded tpl:border tpl:p-2\"\n style=\"border-color: var(--tpl-border)\"\n >\n <p\n class=\"tpl:truncate tpl:text-xs tpl:font-medium\"\n style=\"color: var(--tpl-text)\"\n >\n {{ item.filename }}\n </p>\n </div>\n\n <!-- File input -->\n <div class=\"tpl:mb-4\">\n <label\n class=\"tpl:mb-1 tpl:block tpl:text-xs tpl:font-medium\"\n style=\"color: var(--tpl-text-muted)\"\n >\n {{ t.mediaLibrary.replaceSelectFile }}\n </label>\n <input\n ref=\"fileInputRef\"\n type=\"file\"\n :accept=\"acceptPattern\"\n class=\"tpl:w-full tpl:rounded-md tpl:border tpl:px-3 tpl:py-1.5 tpl:text-xs\"\n style=\"\n border-color: var(--tpl-border);\n background-color: var(--tpl-bg);\n color: var(--tpl-text);\n \"\n @change=\"handleFileChange\"\n />\n </div>\n\n <!-- Error message -->\n <p\n v-if=\"error\"\n class=\"tpl:mb-3 tpl:text-xs\"\n style=\"color: var(--tpl-danger)\"\n >\n {{ error }}\n </p>\n\n <!-- Actions -->\n <div class=\"tpl:flex tpl:justify-end tpl:gap-2\">\n <button\n class=\"tpl:cursor-pointer tpl:rounded-md tpl:border tpl:px-3 tpl:py-1.5 tpl:text-xs tpl:font-medium tpl:transition-all tpl:duration-150\"\n style=\"\n border-color: var(--tpl-border);\n color: var(--tpl-text);\n background-color: var(--tpl-bg);\n \"\n :disabled=\"isReplacing\"\n @click=\"emit('close')\"\n >\n {{ t.mediaLibrary.cancel }}\n </button>\n <button\n class=\"tpl:cursor-pointer tpl:rounded-md tpl:px-3 tpl:py-1.5 tpl:text-xs tpl:font-medium tpl:text-white tpl:transition-all tpl:duration-150 tpl:disabled:cursor-not-allowed tpl:disabled:opacity-50\"\n style=\"\n background: linear-gradient(\n 135deg,\n var(--tpl-primary),\n var(--tpl-primary-hover)\n );\n \"\n :disabled=\"!selectedFile || isReplacing\"\n @click=\"handleReplace\"\n >\n {{\n isReplacing ? t.mediaLibrary.replacing : t.mediaLibrary.replace\n }}\n </button>\n </div>\n </div>\n </div>\n </Transition>\n </Teleport>\n</template>\n","<script setup lang=\"ts\">\nimport { useI18n } from \"../../composables/useI18n\";\nimport { useMediaCategories } from \"../../composables/useMediaCategories\";\nimport { useDropZone, useFileDialog } from \"@vueuse/core\";\nimport { LoaderCircle, Upload } from \"@lucide/vue\";\nimport { ref } from \"vue\";\n\ndefineProps<{\n isUploading: boolean;\n uploadProgress: { current: number; total: number } | null;\n}>();\n\nconst emit = defineEmits<{\n (e: \"upload\", files: File[]): void;\n}>();\n\nconst { t, format } = useI18n();\n\nconst { allAcceptedMimeTypes, allAcceptedInputString, maxFileSize } =\n useMediaCategories();\n\nconst dropZoneRef = ref<HTMLDivElement>();\n\nfunction validateFiles(fileList: File[] | FileList): File[] {\n const valid: File[] = [];\n for (const file of Array.from(fileList)) {\n if (\n allAcceptedMimeTypes.value.includes(file.type) &&\n file.size <= maxFileSize.value\n ) {\n valid.push(file);\n }\n }\n return valid;\n}\n\nfunction emitValidFiles(files: File[] | FileList): void {\n const valid = validateFiles(files);\n if (valid.length) {\n emit(\"upload\", valid);\n }\n}\n\nconst { isOverDropZone } = useDropZone(dropZoneRef, {\n onDrop: (files) => {\n if (files?.length) {\n emitValidFiles(files);\n }\n },\n});\n\nconst { open: openFilePicker, onChange } = useFileDialog({\n accept: allAcceptedInputString.value,\n multiple: true,\n});\n\nonChange((fileList) => {\n if (fileList?.length) {\n emitValidFiles(fileList);\n }\n});\n</script>\n\n<template>\n <div\n ref=\"dropZoneRef\"\n class=\"tpl-upload-zone tpl:flex tpl:cursor-pointer tpl:flex-col tpl:items-center tpl:justify-center tpl:rounded-lg tpl:border-2 tpl:border-dashed tpl:p-5 tpl:text-center tpl:transition-all tpl:duration-150\"\n :class=\"isOverDropZone ? 'tpl-upload-zone-active' : ''\"\n style=\"\n border-color: var(--tpl-border-light);\n background-color: var(--tpl-bg);\n \"\n @click=\"openFilePicker()\"\n >\n <div v-if=\"isUploading\" class=\"tpl:flex tpl:items-center tpl:gap-2\">\n <LoaderCircle\n class=\"tpl-spinner\"\n :size=\"20\"\n :stroke-width=\"2\"\n style=\"color: var(--tpl-primary)\"\n />\n <span class=\"tpl:text-xs\" style=\"color: var(--tpl-text-muted)\">{{\n uploadProgress && uploadProgress.total > 1\n ? format(t.mediaLibrary.uploadingProgress, {\n current: uploadProgress.current,\n total: uploadProgress.total,\n })\n : t.mediaLibrary.uploading\n }}</span>\n </div>\n <template v-else>\n <Upload\n class=\"tpl:mb-2\"\n :size=\"24\"\n :stroke-width=\"1.5\"\n style=\"color: var(--tpl-text-dim)\"\n />\n <p class=\"tpl:text-xs\" style=\"color: var(--tpl-text-muted)\">\n {{ t.mediaLibrary.dropOrClick }}\n </p>\n <p class=\"tpl:mt-1 tpl:text-[10px]\" style=\"color: var(--tpl-text-dim)\">\n {{ t.mediaLibrary.acceptedFormats }}\n </p>\n </template>\n </div>\n</template>\n","<script setup lang=\"ts\">\nimport { useI18n } from \"../../composables/useI18n\";\nimport { useMediaCategories } from \"../../composables/useMediaCategories\";\nimport { useDropZone, useFileDialog } from \"@vueuse/core\";\nimport { LoaderCircle, Upload } from \"@lucide/vue\";\nimport { ref } from \"vue\";\n\ndefineProps<{\n isUploading: boolean;\n uploadProgress: { current: number; total: number } | null;\n}>();\n\nconst emit = defineEmits<{\n (e: \"upload\", files: File[]): void;\n}>();\n\nconst { t, format } = useI18n();\n\nconst { allAcceptedMimeTypes, allAcceptedInputString, maxFileSize } =\n useMediaCategories();\n\nconst dropZoneRef = ref<HTMLDivElement>();\n\nfunction validateFiles(fileList: File[] | FileList): File[] {\n const valid: File[] = [];\n for (const file of Array.from(fileList)) {\n if (\n allAcceptedMimeTypes.value.includes(file.type) &&\n file.size <= maxFileSize.value\n ) {\n valid.push(file);\n }\n }\n return valid;\n}\n\nfunction emitValidFiles(files: File[] | FileList): void {\n const valid = validateFiles(files);\n if (valid.length) {\n emit(\"upload\", valid);\n }\n}\n\nconst { isOverDropZone } = useDropZone(dropZoneRef, {\n onDrop: (files) => {\n if (files?.length) {\n emitValidFiles(files);\n }\n },\n});\n\nconst { open: openFilePicker, onChange } = useFileDialog({\n accept: allAcceptedInputString.value,\n multiple: true,\n});\n\nonChange((fileList) => {\n if (fileList?.length) {\n emitValidFiles(fileList);\n }\n});\n</script>\n\n<template>\n <div\n ref=\"dropZoneRef\"\n class=\"tpl-upload-zone tpl:flex tpl:cursor-pointer tpl:flex-col tpl:items-center tpl:justify-center tpl:rounded-lg tpl:border-2 tpl:border-dashed tpl:p-5 tpl:text-center tpl:transition-all tpl:duration-150\"\n :class=\"isOverDropZone ? 'tpl-upload-zone-active' : ''\"\n style=\"\n border-color: var(--tpl-border-light);\n background-color: var(--tpl-bg);\n \"\n @click=\"openFilePicker()\"\n >\n <div v-if=\"isUploading\" class=\"tpl:flex tpl:items-center tpl:gap-2\">\n <LoaderCircle\n class=\"tpl-spinner\"\n :size=\"20\"\n :stroke-width=\"2\"\n style=\"color: var(--tpl-primary)\"\n />\n <span class=\"tpl:text-xs\" style=\"color: var(--tpl-text-muted)\">{{\n uploadProgress && uploadProgress.total > 1\n ? format(t.mediaLibrary.uploadingProgress, {\n current: uploadProgress.current,\n total: uploadProgress.total,\n })\n : t.mediaLibrary.uploading\n }}</span>\n </div>\n <template v-else>\n <Upload\n class=\"tpl:mb-2\"\n :size=\"24\"\n :stroke-width=\"1.5\"\n style=\"color: var(--tpl-text-dim)\"\n />\n <p class=\"tpl:text-xs\" style=\"color: var(--tpl-text-muted)\">\n {{ t.mediaLibrary.dropOrClick }}\n </p>\n <p class=\"tpl:mt-1 tpl:text-[10px]\" style=\"color: var(--tpl-text-dim)\">\n {{ t.mediaLibrary.acceptedFormats }}\n </p>\n </template>\n </div>\n</template>\n","<script setup lang=\"ts\">\nimport { useI18n } from \"../../composables/useI18n\";\nimport { computed, ref } from \"vue\";\n\nconst props = defineProps<{\n usedBytes: number;\n limitBytes: number;\n size?: number;\n}>();\n\nconst { t, format } = useI18n();\nconst showTooltip = ref(false);\n\nconst size = computed(() => props.size ?? 24);\nconst strokeWidth = computed(() => Math.max(2, size.value / 8));\nconst radius = computed(() => (size.value - strokeWidth.value) / 2);\nconst circumference = computed(() => 2 * Math.PI * radius.value);\n\nconst percentage = computed(() => {\n if (props.limitBytes <= 0) return 0;\n return Math.min(100, (props.usedBytes / props.limitBytes) * 100);\n});\n\nconst strokeDashoffset = computed(() => {\n return circumference.value - (percentage.value / 100) * circumference.value;\n});\n\nconst progressColor = computed(() => {\n if (percentage.value >= 95) {\n return \"var(--tpl-danger)\";\n }\n if (percentage.value >= 75) {\n return \"var(--tpl-warning, #f59e0b)\";\n }\n return \"var(--tpl-primary)\";\n});\n\nfunction formatBytes(bytes: number): string {\n if (bytes === 0) return \"0 B\";\n const k = 1024;\n const sizes = [\"B\", \"KB\", \"MB\", \"GB\"];\n const i = Math.floor(Math.log(bytes) / Math.log(k));\n const value = bytes / Math.pow(k, i);\n // Show 1 decimal for MB/GB, no decimals for B/KB\n const decimals = i >= 2 ? 1 : 0;\n return `${value.toFixed(decimals)} ${sizes[i]}`;\n}\n\nconst usedFormatted = computed(() => formatBytes(props.usedBytes));\nconst limitFormatted = computed(() => formatBytes(props.limitBytes));\nconst remainingBytes = computed(() =>\n Math.max(0, props.limitBytes - props.usedBytes),\n);\nconst remainingFormatted = computed(() => formatBytes(remainingBytes.value));\n\nconst tooltipText = computed(() =>\n format(t.mediaLibrary.storageTooltip, {\n used: usedFormatted.value,\n total: limitFormatted.value,\n remaining: remainingFormatted.value,\n }),\n);\n</script>\n\n<template>\n <div\n class=\"tpl:relative tpl:inline-flex tpl:cursor-help tpl:items-center tpl:justify-center\"\n @mouseenter=\"showTooltip = true\"\n @mouseleave=\"showTooltip = false\"\n >\n <svg\n :width=\"size\"\n :height=\"size\"\n class=\"tpl:-rotate-90\"\n :viewBox=\"`0 0 ${size} ${size}`\"\n >\n <!-- Background circle -->\n <circle\n :cx=\"size / 2\"\n :cy=\"size / 2\"\n :r=\"radius\"\n fill=\"none\"\n :stroke-width=\"strokeWidth\"\n style=\"stroke: var(--tpl-border)\"\n />\n <!-- Progress circle -->\n <circle\n :cx=\"size / 2\"\n :cy=\"size / 2\"\n :r=\"radius\"\n fill=\"none\"\n :stroke-width=\"strokeWidth\"\n :stroke=\"progressColor\"\n stroke-linecap=\"round\"\n :stroke-dasharray=\"circumference\"\n :stroke-dashoffset=\"strokeDashoffset\"\n class=\"tpl:transition-all tpl:duration-300 tpl:ease-out\"\n />\n </svg>\n\n <!-- Tooltip -->\n <Transition\n enter-active-class=\"tpl:transition tpl:ease-out tpl:duration-150\"\n enter-from-class=\"tpl:opacity-0 tpl:translate-y-1\"\n enter-to-class=\"tpl:opacity-100 tpl:translate-y-0\"\n leave-active-class=\"tpl:transition tpl:ease-in tpl:duration-100\"\n leave-from-class=\"tpl:opacity-100 tpl:translate-y-0\"\n leave-to-class=\"tpl:opacity-0 tpl:translate-y-1\"\n >\n <div\n v-if=\"showTooltip\"\n class=\"tpl:absolute tpl:top-full tpl:left-1/2 tpl:z-50 tpl:mt-2 tpl:-translate-x-1/2 tpl:rounded-md tpl:px-2.5 tpl:py-1.5 tpl:text-xs tpl:whitespace-nowrap tpl:shadow-lg\"\n style=\"background-color: var(--tpl-text); color: var(--tpl-bg-elevated)\"\n >\n {{ tooltipText }}\n <div\n class=\"tpl:absolute tpl:-top-1 tpl:left-1/2 tpl:size-2 tpl:-translate-x-1/2 tpl:rotate-45\"\n style=\"background-color: var(--tpl-text)\"\n />\n </div>\n </Transition>\n </div>\n</template>\n","<script setup lang=\"ts\">\nimport { useI18n } from \"../../composables/useI18n\";\nimport { computed, ref } from \"vue\";\n\nconst props = defineProps<{\n usedBytes: number;\n limitBytes: number;\n size?: number;\n}>();\n\nconst { t, format } = useI18n();\nconst showTooltip = ref(false);\n\nconst size = computed(() => props.size ?? 24);\nconst strokeWidth = computed(() => Math.max(2, size.value / 8));\nconst radius = computed(() => (size.value - strokeWidth.value) / 2);\nconst circumference = computed(() => 2 * Math.PI * radius.value);\n\nconst percentage = computed(() => {\n if (props.limitBytes <= 0) return 0;\n return Math.min(100, (props.usedBytes / props.limitBytes) * 100);\n});\n\nconst strokeDashoffset = computed(() => {\n return circumference.value - (percentage.value / 100) * circumference.value;\n});\n\nconst progressColor = computed(() => {\n if (percentage.value >= 95) {\n return \"var(--tpl-danger)\";\n }\n if (percentage.value >= 75) {\n return \"var(--tpl-warning, #f59e0b)\";\n }\n return \"var(--tpl-primary)\";\n});\n\nfunction formatBytes(bytes: number): string {\n if (bytes === 0) return \"0 B\";\n const k = 1024;\n const sizes = [\"B\", \"KB\", \"MB\", \"GB\"];\n const i = Math.floor(Math.log(bytes) / Math.log(k));\n const value = bytes / Math.pow(k, i);\n // Show 1 decimal for MB/GB, no decimals for B/KB\n const decimals = i >= 2 ? 1 : 0;\n return `${value.toFixed(decimals)} ${sizes[i]}`;\n}\n\nconst usedFormatted = computed(() => formatBytes(props.usedBytes));\nconst limitFormatted = computed(() => formatBytes(props.limitBytes));\nconst remainingBytes = computed(() =>\n Math.max(0, props.limitBytes - props.usedBytes),\n);\nconst remainingFormatted = computed(() => formatBytes(remainingBytes.value));\n\nconst tooltipText = computed(() =>\n format(t.mediaLibrary.storageTooltip, {\n used: usedFormatted.value,\n total: limitFormatted.value,\n remaining: remainingFormatted.value,\n }),\n);\n</script>\n\n<template>\n <div\n class=\"tpl:relative tpl:inline-flex tpl:cursor-help tpl:items-center tpl:justify-center\"\n @mouseenter=\"showTooltip = true\"\n @mouseleave=\"showTooltip = false\"\n >\n <svg\n :width=\"size\"\n :height=\"size\"\n class=\"tpl:-rotate-90\"\n :viewBox=\"`0 0 ${size} ${size}`\"\n >\n <!-- Background circle -->\n <circle\n :cx=\"size / 2\"\n :cy=\"size / 2\"\n :r=\"radius\"\n fill=\"none\"\n :stroke-width=\"strokeWidth\"\n style=\"stroke: var(--tpl-border)\"\n />\n <!-- Progress circle -->\n <circle\n :cx=\"size / 2\"\n :cy=\"size / 2\"\n :r=\"radius\"\n fill=\"none\"\n :stroke-width=\"strokeWidth\"\n :stroke=\"progressColor\"\n stroke-linecap=\"round\"\n :stroke-dasharray=\"circumference\"\n :stroke-dashoffset=\"strokeDashoffset\"\n class=\"tpl:transition-all tpl:duration-300 tpl:ease-out\"\n />\n </svg>\n\n <!-- Tooltip -->\n <Transition\n enter-active-class=\"tpl:transition tpl:ease-out tpl:duration-150\"\n enter-from-class=\"tpl:opacity-0 tpl:translate-y-1\"\n enter-to-class=\"tpl:opacity-100 tpl:translate-y-0\"\n leave-active-class=\"tpl:transition tpl:ease-in tpl:duration-100\"\n leave-from-class=\"tpl:opacity-100 tpl:translate-y-0\"\n leave-to-class=\"tpl:opacity-0 tpl:translate-y-1\"\n >\n <div\n v-if=\"showTooltip\"\n class=\"tpl:absolute tpl:top-full tpl:left-1/2 tpl:z-50 tpl:mt-2 tpl:-translate-x-1/2 tpl:rounded-md tpl:px-2.5 tpl:py-1.5 tpl:text-xs tpl:whitespace-nowrap tpl:shadow-lg\"\n style=\"background-color: var(--tpl-text); color: var(--tpl-bg-elevated)\"\n >\n {{ tooltipText }}\n <div\n class=\"tpl:absolute tpl:-top-1 tpl:left-1/2 tpl:size-2 tpl:-translate-x-1/2 tpl:rotate-45\"\n style=\"background-color: var(--tpl-text)\"\n />\n </div>\n </Transition>\n </div>\n</template>\n","import type { CropData } from \"../components/media/MediaEditModal.vue\";\nimport type { MediaConversion, MediaItem } from \"../types\";\nimport type { useMediaLibrary } from \"../composable\";\n\ntype UseMediaLibraryReturn = ReturnType<typeof useMediaLibrary>;\nimport { useClipboard, useDebounceFn } from \"@vueuse/core\";\nimport { computed, ref, watch, type ComputedRef, type Ref } from \"vue\";\n\nexport interface UseMediaLibraryUIOptions {\n library: UseMediaLibraryReturn;\n translations:\n | { mediaLibrary: Record<string, string> }\n | Ref<{ mediaLibrary: Record<string, string> }>;\n}\n\nexport interface UseMediaLibraryUIReturn {\n // UI state\n layoutMode: Ref<\"grid\" | \"list\">;\n showSidebar: Ref<boolean>;\n searchInput: Ref<string>;\n selectedConversion: Ref<MediaConversion>;\n editingItem: Ref<MediaItem | null>;\n showImportUrlModal: Ref<boolean>;\n showMovePicker: Ref<boolean>;\n\n // Derived state\n selectedUrl: ComputedRef<string | null>;\n hasFrequentlyUsed: ComputedRef<boolean>;\n displayItems: ComputedRef<MediaItem[]>;\n hasUsedFiles: ComputedRef<boolean>;\n\n // Clipboard\n copy: (text: string) => Promise<void>;\n copied: Ref<boolean>;\n\n // Category labels\n getCategoryLabel: (category: string) => string;\n\n // Handlers\n handleSearchInput: (value: string) => void;\n handleUpload: (files: File[]) => Promise<void>;\n handleSelect: (item: MediaItem) => void;\n handleCreateFolder: (name: string, parentId?: string | null) => Promise<void>;\n handleRenameFolder: (folderId: string, name: string) => Promise<void>;\n handleDeleteFolder: (folderId: string) => Promise<void>;\n handleEditItem: (item: MediaItem) => void;\n handleEditSave: (\n mediaId: string,\n filename: string,\n altText?: string,\n cropData?: CropData,\n ) => Promise<void>;\n handleImportFromUrl: (url: string) => Promise<void>;\n handleMoveToFolder: (folderId: string | null) => Promise<void>;\n handleDeleteClick: () => Promise<void>;\n handleReplaceItem: (item: MediaItem) => void;\n handleReplaceFile: (file: File) => Promise<void>;\n\n // Reset (used by modal when closing)\n resetUI: () => void;\n}\n\nexport function useMediaLibraryUI(\n options: UseMediaLibraryUIOptions,\n): UseMediaLibraryUIReturn {\n const { library, translations } = options;\n\n function getTranslations() {\n if (\"value\" in translations && typeof translations.value === \"object\") {\n return (translations as Ref<{ mediaLibrary: Record<string, string> }>)\n .value;\n }\n return translations as { mediaLibrary: Record<string, string> };\n }\n\n // --- UI state ---\n const layoutMode = ref<\"grid\" | \"list\">(\"grid\");\n const showSidebar = ref(false);\n const searchInput = ref(\"\");\n const selectedConversion = ref<MediaConversion>(\"original\");\n const editingItem = ref<MediaItem | null>(null);\n const showImportUrlModal = ref(false);\n const showMovePicker = ref(false);\n\n // --- Derived state ---\n const selectedUrl = computed(() => {\n const item = library.previewItem.value;\n if (!item) return null;\n\n switch (selectedConversion.value) {\n case \"small\":\n return item.small_url || item.url;\n case \"medium\":\n return item.medium_url || item.url;\n case \"large\":\n return item.large_url || item.url;\n default:\n return item.url;\n }\n });\n\n const hasFrequentlyUsed = computed(() => {\n return library.frequentlyUsedItems.value.length > 0;\n });\n\n const displayItems = computed(() => {\n if (library.viewMode.value === \"frequently-used\") {\n return library.frequentlyUsedItems.value;\n }\n return library.items.value;\n });\n\n const hasUsedFiles = computed(() => {\n return Object.values(library.deleteUsageInfo.value).some(\n (info) => info.template_count > 0,\n );\n });\n\n // --- Category labels ---\n const categoryLabels: Record<string, () => string> = {\n images: () => getTranslations().mediaLibrary.filterImages,\n documents: () => getTranslations().mediaLibrary.filterDocuments,\n videos: () => getTranslations().mediaLibrary.filterVideos,\n audio: () => getTranslations().mediaLibrary.filterAudio,\n };\n\n function getCategoryLabel(category: string): string {\n return categoryLabels[category]?.() ?? category;\n }\n\n // --- Watchers ---\n watch(showSidebar, (show) => {\n if (show) {\n library.loadFolders();\n }\n });\n\n watch(\n () => library.previewItem.value?.id,\n () => {\n selectedConversion.value = \"original\";\n },\n );\n\n // --- Search ---\n const debouncedSearch = useDebounceFn((value: string) => {\n library.search(value);\n }, 300);\n\n function handleSearchInput(value: string): void {\n searchInput.value = value;\n debouncedSearch(value);\n }\n\n // --- Clipboard ---\n const { copy, copied } = useClipboard({ copiedDuring: 2000, legacy: true });\n\n // --- Handlers ---\n async function handleUpload(files: File[]): Promise<void> {\n await library.uploadFiles(files);\n }\n\n function handleSelect(item: MediaItem): void {\n library.selectItem(item);\n }\n\n async function handleCreateFolder(\n name: string,\n parentId?: string | null,\n ): Promise<void> {\n await library.createFolder(name, parentId);\n }\n\n async function handleRenameFolder(\n folderId: string,\n name: string,\n ): Promise<void> {\n await library.renameFolder(folderId, name);\n }\n\n async function handleDeleteFolder(folderId: string): Promise<void> {\n await library.deleteFolder(folderId);\n }\n\n function handleEditItem(item: MediaItem): void {\n editingItem.value = item;\n }\n\n async function handleEditSave(\n mediaId: string,\n filename: string,\n altText?: string,\n cropData?: CropData,\n ): Promise<void> {\n if (cropData) {\n await library.replaceMediaDirectly(mediaId, cropData.file);\n }\n await library.updateFile(mediaId, filename, altText);\n editingItem.value = null;\n }\n\n async function handleImportFromUrl(url: string): Promise<void> {\n const result = await library.importFromUrl(url);\n if (result) {\n showImportUrlModal.value = false;\n }\n }\n\n async function handleMoveToFolder(folderId: string | null): Promise<void> {\n showMovePicker.value = false;\n await library.moveSelected(folderId);\n }\n\n async function handleDeleteClick(): Promise<void> {\n await library.checkUsageBeforeDelete();\n }\n\n function handleReplaceItem(item: MediaItem): void {\n library.checkUsageBeforeReplace(item);\n }\n\n async function handleReplaceFile(file: File): Promise<void> {\n await library.replaceFile(file);\n }\n\n function resetUI(): void {\n library.clearSelection();\n library.cancelDelete();\n library.cancelReplace();\n searchInput.value = \"\";\n library.categoryFilter.value = null;\n library.sortOption.value = \"newest\";\n library.viewMode.value = \"files\";\n editingItem.value = null;\n showImportUrlModal.value = false;\n selectedConversion.value = \"original\";\n }\n\n return {\n layoutMode,\n showSidebar,\n searchInput,\n selectedConversion,\n editingItem,\n showImportUrlModal,\n showMovePicker,\n selectedUrl,\n hasFrequentlyUsed,\n displayItems,\n hasUsedFiles,\n copy,\n copied,\n getCategoryLabel,\n handleSearchInput,\n handleUpload,\n handleSelect,\n handleCreateFolder,\n handleRenameFolder,\n handleDeleteFolder,\n handleEditItem,\n handleEditSave,\n handleImportFromUrl,\n handleMoveToFolder,\n handleDeleteClick,\n handleReplaceItem,\n handleReplaceFile,\n resetUI,\n };\n}\n","/// <reference types=\"vite/client\" />\n\nimport type en from \"./locales/en\";\n\nexport type MediaTranslations = typeof en;\n\n// Vite resolves this glob at build time. Adding a new locale file\n// automatically registers it — no array to keep in sync.\nconst localeModules = import.meta.glob<{ default: MediaTranslations }>(\n \"./locales/*.ts\",\n);\n\nfunction localesFromGlob(modules: Record<string, unknown>): string[] {\n return Object.keys(modules)\n .map((path) => path.match(/\\/([^/]+)\\.ts$/)?.[1])\n .filter((locale): locale is string => Boolean(locale));\n}\n\nconst supportedLocales = localesFromGlob(localeModules);\n\nfunction canonicalize(locale: string): string {\n return locale.trim().replace(/_/g, \"-\").toLowerCase();\n}\n\nfunction findSupportedLocale(locale: string): string | undefined {\n const canonical = canonicalize(locale);\n return supportedLocales.find((s) => canonicalize(s) === canonical);\n}\n\nfunction getBaseLocale(locale: string): string {\n return canonicalize(locale).split(\"-\")[0];\n}\n\nfunction resolveLocale(locale: string): string {\n return (\n findSupportedLocale(locale) ??\n findSupportedLocale(getBaseLocale(locale)) ??\n \"en\"\n );\n}\n\nexport async function loadMediaTranslations(\n locale: string,\n): Promise<MediaTranslations> {\n const target = resolveLocale(locale);\n const loader = localeModules[`./locales/${target}.ts`];\n const module = await loader();\n return module.default;\n}\n","<script setup lang=\"ts\">\nimport MediaBreadcrumb from \"./media/MediaBreadcrumb.vue\";\nimport MediaEditModal from \"./media/MediaEditModal.vue\";\nimport MediaFolderTree from \"./media/MediaFolderTree.vue\";\nimport MediaGrid from \"./media/MediaGrid.vue\";\nimport MediaImportUrlModal from \"./media/MediaImportUrlModal.vue\";\nimport MediaMovePicker from \"./media/MediaMovePicker.vue\";\nimport MediaPreviewPanel from \"./media/MediaPreviewPanel.vue\";\nimport MediaReplaceModal from \"./media/MediaReplaceModal.vue\";\nimport MediaUploadZone from \"./media/MediaUploadZone.vue\";\nimport StorageProgressRing from \"./media/StorageProgressRing.vue\";\nimport { useMediaCategories } from \"../composables/useMediaCategories\";\nimport { useMediaLibraryUI } from \"../composables/useMediaLibraryUI\";\nimport type { UsePlanConfigReturn } from \"@templatical/core/cloud\";\nimport { useMediaLibrary } from \"../composable\";\nimport type { MediaCategory, MediaItem } from \"../types\";\nimport type { AuthManager } from \"@templatical/core/cloud\";\nimport { useEventListener } from \"@vueuse/core\";\nimport {\n Check,\n Copy,\n Grid2x2,\n Link,\n List,\n PanelLeft,\n Search,\n X,\n} from \"@lucide/vue\";\nimport { computed, provide, ref, toRef, watch } from \"vue\";\nimport {\n PLAN_CONFIG_KEY,\n POPOVER_TARGET_KEY,\n TRANSLATIONS_KEY,\n UI_THEME_KEY,\n} from \"../keys\";\nimport { loadMediaTranslations, type MediaTranslations } from \"../i18n\";\n\nconst props = defineProps<{\n visible: boolean;\n accept?: MediaCategory[];\n /**\n * Authenticated Cloud session. **A prop, not an injection.** An injection would\n * have to agree with the host on key *identity*: a bare string never resolves\n * the `Symbol` `@templatical/editor` provides, and the miss is silent —\n * `undefined` here means the library opens and does nothing. A prop is checked\n * at compile time, which makes that class of miss impossible rather than merely\n * fixed.\n */\n authManager: AuthManager;\n /** Scopes every request. Same story as {@link authManager}. */\n projectId: string;\n /**\n * The active plan's config — media limits and the storage gauge. Re-provided\n * under `PLAN_CONFIG_KEY` for the five descendants that call\n * `useMediaCategories`, which is why this one is a prop *and* a provide.\n */\n planConfig: UsePlanConfigReturn;\n /**\n * Mount target for the modal's teleport. When provided, the modal and\n * its sub-modals render inside this element instead of `document.body`\n * — used by editors that wrap the media library inside a shadow root\n * (or any other DOM boundary) and want the modal to stay inside.\n * Defaults to `null` → teleport to body, preserving the original\n * standalone-SDK behavior.\n */\n popoverTarget?: HTMLElement | null;\n /**\n * BCP-47 locale for this package's own strings, defaulting to English.\n *\n * A locale rather than the strings themselves: media-library owns its\n * translations and loads them here, so a host passes a value it already has\n * and never handles media copy. That also keeps the load lazy — the host\n * imports nothing from this package's i18n, so nothing is fetched until this\n * modal mounts.\n */\n locale?: string;\n /**\n * Resolved UI theme (`\"light\"` / `\"dark\"`) for the overlay chrome.\n *\n * A plain string rather than the host's ref: props are reactive, so the\n * computed below tracks a host theme toggle without this package depending on\n * how the host stores it.\n */\n uiTheme?: string;\n}>();\n\nconst emit = defineEmits<{\n (e: \"close\"): void;\n (e: \"select\", item: MediaItem): void;\n}>();\n\n// Loaded here rather than injected from the host: a bare-string key never\n// resolves the `Symbol` `@templatical/editor` provides under the same name, so\n// a host-mounted modal used to get `undefined` and throw on its first label.\nconst translations = ref<MediaTranslations | null>(null);\nwatch(\n () => props.locale,\n async (locale) => {\n translations.value = await loadMediaTranslations(locale ?? \"en\");\n },\n { immediate: true },\n);\n\n// Descendants unwrap this at *their* setup, so the `v-if` below is what\n// guarantees they never read a null. See `useI18n`.\nprovide(TRANSLATIONS_KEY, translations);\n\n// Not `useI18n()` — a component never sees its own `provide`. The template's\n// 28 reads auto-unwrap this, and `useMediaLibraryUI` accepts a ref.\n// The `v-if` on the root guarantees non-null wherever the template reads it.\nconst t = computed(() => translations.value as MediaTranslations);\n// Provided, not injected: the three sub-modals teleport out of this component's\n// DOM, so a prop cannot reach them. Never a bare-string key — that is what left\n// the library light inside a dark editor.\nconst tplUiTheme = computed(() => props.uiTheme);\nprovide(UI_THEME_KEY, tplUiTheme);\n\n// Sub-modals (MediaReplaceModal, MediaEditModal, MediaImportUrlModal) inject\n// the same target so every nested teleport lands in the same place as this\n// one. Wrap the prop in a reactive ref so the provide updates if the host\n// remounts the modal with a different target.\nconst popoverTargetRef = toRef(() => props.popoverTarget ?? null);\nprovide(POPOVER_TARGET_KEY, popoverTargetRef);\n\n// Deep descendants (MediaGrid, MediaUploadZone, MediaPreviewPanel,\n// MediaEditModal) read the media limits through `useMediaCategories`, so the\n// prop is re-provided rather than drilled through four component layers. The\n// value still arrives as a prop, which is what keeps the package boundary typed.\n//\n// The object itself is stable (a host builds it once) and its reactivity lives in\n// the refs inside it, so providing it at setup is enough — no `toRef` dance.\nprovide(PLAN_CONFIG_KEY, props.planConfig);\n\n// Folders and URL import render on every plan: gating Cloud's media *UI* meters\n// no resource Cloud buys, so the media tier is limits-only and every plan gets\n// the same library. (URL import's real cost — bandwidth and SSRF exposure — is a\n// backend rate-limit and allow-list concern, not a client-side plan flag.)\n\n// Storage info\nconst storageUsedBytes = computed(\n () => props.planConfig.config.value?.storage.used_bytes ?? 0,\n);\nconst storageLimitBytes = computed(\n () => props.planConfig.config.value?.storage.limit_bytes ?? 0,\n);\n\n// `props.planConfig`, not the provide above: a component never sees its own\n// `provide` (Vue resolves `inject` against the parent chain), so injecting\n// here would throw in every host.\nconst { isAcceptedMimeType, availableCategories } = useMediaCategories(\n props.planConfig,\n);\n\nconst library = useMediaLibrary({\n projectId: props.projectId,\n authManager: props.authManager,\n});\n\nconst ui = useMediaLibraryUI({\n library,\n translations: t,\n});\n\n// Modal-specific: load on open, reset on close\nwatch(\n () => props.visible,\n (visible) => {\n if (visible) {\n library.loadItems();\n library.loadFrequentlyUsed();\n } else {\n ui.resetUI();\n }\n },\n);\n\n// Modal-specific: escape key\nfunction handleKeydown(event: KeyboardEvent): void {\n if (event.key === \"Escape\") {\n emit(\"close\");\n }\n}\nuseEventListener(document, \"keydown\", handleKeydown);\n\n// Modal-specific: accept filter + selection\nfunction isConfirmable(): boolean {\n if (!library.previewItem.value) {\n return false;\n }\n\n if (!props.accept?.length) {\n return true;\n }\n\n return isAcceptedMimeType(library.previewItem.value.mime_type, props.accept);\n}\n\nfunction confirmSelection(): void {\n if (isConfirmable()) {\n const item = library.previewItem.value!;\n const itemWithSelectedUrl: MediaItem = {\n ...item,\n url: ui.selectedUrl.value || item.url,\n };\n emit(\"select\", itemWithSelectedUrl);\n emit(\"close\");\n }\n}\n</script>\n\n<template>\n <Teleport :to=\"popoverTarget || 'body'\">\n <Transition\n enter-active-class=\"tpl:transition tpl:duration-200\"\n enter-from-class=\"tpl:opacity-0\"\n enter-to-class=\"tpl:opacity-100\"\n leave-active-class=\"tpl:transition tpl:duration-150\"\n leave-from-class=\"tpl:opacity-100\"\n leave-to-class=\"tpl:opacity-0\"\n >\n <!-- `translations` gates the subtree, not just this element's own labels:\n every descendant unwraps `TRANSLATIONS_KEY` at its own setup, so none\n may mount before the locale's strings have landed. -->\n <div\n v-if=\"visible && translations\"\n :data-tpl-theme=\"tplUiTheme\"\n class=\"tpl tpl-media-overlay tpl:fixed tpl:inset-0 tpl:z-[9999] tpl:flex tpl:items-center tpl:justify-center tpl:p-4\"\n @click.self=\"emit('close')\"\n >\n <!-- Caps are percentages of the overlay, never `vh`/`vw`. This overlay\n is `fixed; inset: 0`, which covers the viewport only while nothing\n traps it — an ancestor with `transform`, `filter`,\n `backdrop-filter`, `will-change: transform`, `contain: paint` or\n `container-type` becomes the containing block for fixed\n descendants, and this modal teleports into the editor's popover\n root, i.e. inside a consumer's markup. `inset: 0` then resolves to\n that ancestor's box while a viewport cap does not, and the panel\n overflows a container that usually also has `overflow: hidden`.\n That was issue #575 in the editor's dialogs; this modal had the\n same mismatch. Percentages resolve against whatever the overlay\n turned out to be, so they are correct either way. Locked by\n `tests/overlay-height-scope-audit.test.ts`.\n\n `p-4` is the gutter, and it belongs on this element rather than on\n the panel: insets size the overlay's border box, so padding here\n shrinks the content box the panel measures against. `height` stays\n a fixed preference — `max-height` is what reins it in. -->\n <div\n class=\"tpl-media-modal tpl-scale-in tpl:flex tpl:flex-col tpl:overflow-hidden tpl:rounded-[var(--tpl-radius-lg)]\"\n style=\"\n width: 900px;\n height: 650px;\n max-width: 100%;\n max-height: 90%;\n background-color: var(--tpl-bg-elevated);\n border: 1px solid var(--tpl-border);\n box-shadow: var(--tpl-shadow-xl);\n \"\n >\n <!-- Header -->\n <div\n class=\"tpl:flex tpl:shrink-0 tpl:items-center tpl:justify-between tpl:border-b tpl:px-5 tpl:py-3.5\"\n style=\"border-color: var(--tpl-border)\"\n >\n <h2\n class=\"tpl:text-sm tpl:font-semibold\"\n style=\"color: var(--tpl-text)\"\n >\n {{ t.mediaLibrary.title }}\n </h2>\n <div class=\"tpl:flex tpl:items-center tpl:gap-3\">\n <StorageProgressRing\n :used-bytes=\"storageUsedBytes\"\n :limit-bytes=\"storageLimitBytes\"\n :size=\"22\"\n />\n <div class=\"tpl:relative\">\n <input\n :value=\"ui.searchInput.value\"\n type=\"text\"\n class=\"tpl:w-52 tpl:rounded-md tpl:border tpl:py-1.5 tpl:pr-3 tpl:pl-8 tpl:text-xs tpl:shadow-xs tpl:transition-all tpl:duration-150 tpl:outline-none tpl:focus:shadow-[var(--tpl-ring)]\"\n style=\"\n border-color: var(--tpl-border);\n background-color: var(--tpl-bg);\n color: var(--tpl-text);\n \"\n :placeholder=\"t.mediaLibrary.searchPlaceholder\"\n @input=\"\n ui.handleSearchInput(\n ($event.target as HTMLInputElement).value,\n )\n \"\n />\n <Search\n class=\"tpl:absolute tpl:top-1/2 tpl:left-2.5 tpl:-translate-y-1/2\"\n :size=\"13\"\n :stroke-width=\"2\"\n style=\"color: var(--tpl-text-dim)\"\n />\n </div>\n <button\n class=\"tpl:flex tpl:size-7 tpl:items-center tpl:justify-center tpl:rounded-md tpl:transition-all tpl:duration-150\"\n style=\"color: var(--tpl-text-muted)\"\n @click=\"emit('close')\"\n >\n <X :size=\"18\" :stroke-width=\"2\" />\n </button>\n </div>\n </div>\n\n <!-- Body -->\n <div class=\"tpl:flex tpl:min-h-0 tpl:flex-1 tpl:overflow-hidden\">\n <!-- Sidebar (only when media folders feature is enabled and toggled on) -->\n <Transition\n enter-active-class=\"tpl:transition-all tpl:duration-200 tpl:ease-out\"\n enter-from-class=\"tpl:-ml-48 tpl:opacity-0\"\n enter-to-class=\"tpl:ml-0 tpl:opacity-100\"\n leave-active-class=\"tpl:transition-all tpl:duration-150 tpl:ease-in\"\n leave-from-class=\"tpl:ml-0 tpl:opacity-100\"\n leave-to-class=\"tpl:-ml-48 tpl:opacity-0\"\n >\n <div\n v-if=\"ui.showSidebar.value\"\n class=\"tpl:flex tpl:w-48 tpl:shrink-0 tpl:flex-col tpl:border-r\"\n style=\"\n border-color: var(--tpl-border);\n background-color: var(--tpl-bg);\n \"\n >\n <MediaFolderTree\n :folders=\"library.folders.value\"\n :current-folder-id=\"library.currentFolderId.value\"\n :view-mode=\"library.viewMode.value\"\n :has-frequently-used=\"ui.hasFrequentlyUsed.value\"\n @navigate=\"library.navigateToFolder\"\n @create-folder=\"ui.handleCreateFolder\"\n @rename-folder=\"ui.handleRenameFolder\"\n @delete-folder=\"ui.handleDeleteFolder\"\n @show-frequently-used=\"library.showFrequentlyUsed\"\n />\n </div>\n </Transition>\n\n <!-- Content area -->\n <div class=\"tpl:flex tpl:min-w-0 tpl:flex-1 tpl:flex-col\">\n <!-- Breadcrumb + Upload -->\n <div\n class=\"tpl:flex tpl:shrink-0 tpl:items-center tpl:justify-between tpl:border-b tpl:px-4 tpl:py-2.5\"\n style=\"border-color: var(--tpl-border)\"\n >\n <div class=\"tpl:flex tpl:items-center tpl:gap-2\">\n <!-- Sidebar toggle (only when media folders feature is enabled) -->\n <button\n class=\"tpl:flex tpl:size-7 tpl:cursor-pointer tpl:items-center tpl:justify-center tpl:rounded-md tpl:transition-all tpl:duration-150\"\n :style=\"{\n color: ui.showSidebar.value\n ? 'var(--tpl-primary)'\n : 'var(--tpl-text-muted)',\n backgroundColor: ui.showSidebar.value\n ? 'var(--tpl-bg)'\n : 'transparent',\n border: ui.showSidebar.value\n ? '1px solid var(--tpl-border)'\n : '1px solid transparent',\n }\"\n :title=\"\n ui.showSidebar.value\n ? t.mediaLibrary.hideFolders\n : t.mediaLibrary.showFolders\n \"\n @click=\"ui.showSidebar.value = !ui.showSidebar.value\"\n >\n <PanelLeft :size=\"16\" :stroke-width=\"2\" />\n </button>\n\n <template v-if=\"library.viewMode.value === 'frequently-used'\">\n <span\n class=\"tpl:text-xs tpl:font-medium\"\n style=\"color: var(--tpl-text)\"\n >\n {{ t.mediaLibrary.frequentlyUsed }}\n </span>\n </template>\n <template v-else>\n <MediaBreadcrumb\n :folders=\"library.folders.value\"\n :current-folder-id=\"library.currentFolderId.value\"\n @navigate=\"library.navigateToFolder\"\n />\n </template>\n\n <!-- Layout toggle -->\n <div\n class=\"tpl:flex tpl:rounded-md tpl:p-0.5\"\n style=\"\n border: 1px solid var(--tpl-border);\n background-color: var(--tpl-bg);\n \"\n >\n <button\n class=\"tpl:flex tpl:size-6 tpl:cursor-pointer tpl:items-center tpl:justify-center tpl:rounded tpl:transition-all tpl:duration-150\"\n :style=\"{\n color:\n ui.layoutMode.value === 'grid'\n ? 'var(--tpl-primary)'\n : 'var(--tpl-text-muted)',\n backgroundColor:\n ui.layoutMode.value === 'grid'\n ? 'var(--tpl-bg-elevated)'\n : 'transparent',\n }\"\n :title=\"t.mediaLibrary.viewGrid\"\n @click=\"ui.layoutMode.value = 'grid'\"\n >\n <Grid2x2 :size=\"14\" :stroke-width=\"2\" />\n </button>\n <button\n class=\"tpl:flex tpl:size-6 tpl:cursor-pointer tpl:items-center tpl:justify-center tpl:rounded tpl:transition-all tpl:duration-150\"\n :style=\"{\n color:\n ui.layoutMode.value === 'list'\n ? 'var(--tpl-primary)'\n : 'var(--tpl-text-muted)',\n backgroundColor:\n ui.layoutMode.value === 'list'\n ? 'var(--tpl-bg-elevated)'\n : 'transparent',\n }\"\n :title=\"t.mediaLibrary.viewList\"\n @click=\"ui.layoutMode.value = 'list'\"\n >\n <List :size=\"14\" :stroke-width=\"2\" />\n </button>\n </div>\n </div>\n\n <div class=\"tpl:flex tpl:items-center tpl:gap-2\">\n <select\n v-if=\"availableCategories.length > 1\"\n class=\"tpl:rounded-md tpl:border tpl:py-1.5 tpl:pr-7 tpl:pl-2.5 tpl:text-xs tpl:transition-all tpl:duration-150 tpl:outline-none\"\n style=\"\n border-color: var(--tpl-border);\n background-color: var(--tpl-bg);\n color: var(--tpl-text);\n \"\n :value=\"library.categoryFilter.value ?? ''\"\n @change=\"\n library.filterByCategory(\n ($event.target as HTMLSelectElement).value || null,\n )\n \"\n >\n <option value=\"\">\n {{ t.mediaLibrary.filterAll }}\n </option>\n <option\n v-for=\"category in availableCategories\"\n :key=\"category\"\n :value=\"category\"\n >\n {{ ui.getCategoryLabel(category) }}\n </option>\n </select>\n <select\n class=\"tpl:rounded-md tpl:border tpl:py-1.5 tpl:pr-7 tpl:pl-2.5 tpl:text-xs tpl:transition-all tpl:duration-150 tpl:outline-none\"\n style=\"\n border-color: var(--tpl-border);\n background-color: var(--tpl-bg);\n color: var(--tpl-text);\n \"\n :value=\"library.sortOption.value\"\n @change=\"\n library.sortBy(($event.target as HTMLSelectElement).value)\n \"\n >\n <option value=\"newest\">\n {{ t.mediaLibrary.sortNewest }}\n </option>\n <option value=\"oldest\">\n {{ t.mediaLibrary.sortOldest }}\n </option>\n <option value=\"name_asc\">\n {{ t.mediaLibrary.sortNameAsc }}\n </option>\n <option value=\"name_desc\">\n {{ t.mediaLibrary.sortNameDesc }}\n </option>\n <option value=\"size_asc\">\n {{ t.mediaLibrary.sortSizeAsc }}\n </option>\n <option value=\"size_desc\">\n {{ t.mediaLibrary.sortSizeDesc }}\n </option>\n </select>\n </div>\n </div>\n\n <!-- Scrollable content area -->\n <div class=\"tpl:min-h-0 tpl:flex-1 tpl:overflow-y-auto\">\n <!-- Upload zone (only in files mode) -->\n <div\n v-if=\"library.viewMode.value === 'files'\"\n class=\"tpl:px-4 tpl:pt-3\"\n >\n <MediaUploadZone\n :is-uploading=\"library.isUploading.value\"\n :upload-progress=\"library.uploadProgress.value\"\n @upload=\"ui.handleUpload\"\n />\n <button\n class=\"tpl:mt-2 tpl:flex tpl:w-full tpl:cursor-pointer tpl:items-center tpl:justify-center tpl:gap-1.5 tpl:rounded-md tpl:border tpl:border-dashed tpl:px-3 tpl:py-1.5 tpl:text-xs tpl:font-medium tpl:transition-all tpl:duration-150\"\n style=\"\n border-color: var(--tpl-border);\n color: var(--tpl-text-muted);\n background-color: var(--tpl-bg);\n \"\n @click=\"ui.showImportUrlModal.value = true\"\n >\n <Link :size=\"14\" :stroke-width=\"2\" />\n {{ t.mediaLibrary.importFromUrl }}\n </button>\n </div>\n\n <!-- Image grid -->\n <MediaGrid\n :items=\"ui.displayItems.value\"\n :selected-ids=\"library.selectedItems.value\"\n :is-loading=\"library.isLoading.value\"\n :has-more=\"\n library.viewMode.value === 'files' && library.hasMore.value\n \"\n :accept=\"accept\"\n :layout=\"ui.layoutMode.value\"\n @select=\"ui.handleSelect\"\n @toggle=\"library.toggleSelection\"\n @load-more=\"library.loadMore\"\n @edit=\"ui.handleEditItem\"\n @replace=\"ui.handleReplaceItem\"\n />\n </div>\n </div>\n </div>\n\n <!-- Import from URL Modal -->\n <MediaImportUrlModal\n :visible=\"ui.showImportUrlModal.value\"\n :is-importing=\"library.isImportingFromUrl.value\"\n :error=\"library.importFromUrlError.value\"\n @import=\"ui.handleImportFromUrl\"\n @close=\"ui.showImportUrlModal.value = false\"\n />\n\n <!-- Edit Modal -->\n <MediaEditModal\n :visible=\"!!ui.editingItem.value\"\n :item=\"ui.editingItem.value\"\n @save=\"ui.handleEditSave\"\n @close=\"ui.editingItem.value = null\"\n />\n\n <!-- Replace Modal -->\n <MediaReplaceModal\n :visible=\"library.showReplaceWarning.value\"\n :item=\"library.pendingReplaceItem.value\"\n :usage-info=\"library.replaceUsageInfo.value\"\n :is-replacing=\"library.isReplacing.value\"\n :error=\"library.replaceError.value\"\n @replace=\"ui.handleReplaceFile\"\n @close=\"library.cancelReplace\"\n />\n\n <!-- Delete Warning Dialog -->\n <Transition\n enter-active-class=\"tpl:transition tpl:ease-out tpl:duration-150\"\n enter-from-class=\"tpl:opacity-0\"\n enter-to-class=\"tpl:opacity-100\"\n leave-active-class=\"tpl:transition tpl:ease-in tpl:duration-100\"\n leave-from-class=\"tpl:opacity-100\"\n leave-to-class=\"tpl:opacity-0\"\n >\n <div\n v-if=\"library.showDeleteWarning.value\"\n class=\"tpl:absolute tpl:inset-0 tpl:z-10 tpl:flex tpl:items-center tpl:justify-center tpl:rounded-[var(--tpl-radius-lg)]\"\n style=\"\n background-color: var(--tpl-overlay);\n backdrop-filter: blur(8px);\n -webkit-backdrop-filter: blur(8px);\n \"\n @click.self=\"library.cancelDelete\"\n >\n <div\n class=\"tpl-scale-in tpl:mx-4 tpl:w-full tpl:max-w-sm tpl:rounded-[var(--tpl-radius-lg)] tpl:p-5\"\n style=\"\n background-color: var(--tpl-bg-elevated);\n box-shadow: var(--tpl-shadow-xl);\n \"\n >\n <h3\n class=\"tpl:mb-2 tpl:text-sm tpl:font-semibold\"\n style=\"color: var(--tpl-text)\"\n >\n {{ t.mediaLibrary.deleteWarningTitle }}\n </h3>\n <p\n class=\"tpl:text-xs\"\n :class=\"ui.hasUsedFiles.value ? 'tpl:mb-2' : 'tpl:mb-4'\"\n style=\"color: var(--tpl-text-muted)\"\n >\n {{ t.mediaLibrary.deleteWarningMessage }}\n </p>\n <p\n v-if=\"ui.hasUsedFiles.value\"\n class=\"tpl:mb-4 tpl:text-xs\"\n style=\"color: var(--tpl-text-muted)\"\n >\n {{ t.mediaLibrary.deleteWarningUsageNote }}\n </p>\n\n <div\n v-if=\"ui.hasUsedFiles.value\"\n class=\"tpl:mb-4 tpl:max-h-32 tpl:overflow-y-auto tpl:rounded tpl:border tpl:p-2\"\n style=\"border-color: var(--tpl-border)\"\n >\n <div\n v-for=\"(info, mediaId) in library.deleteUsageInfo.value\"\n :key=\"mediaId\"\n class=\"tpl:text-xs\"\n style=\"color: var(--tpl-text)\"\n >\n <template v-if=\"info.template_count > 0\">\n <span class=\"tpl:font-medium\">\n {{\n ui.displayItems.value.find((i) => i.id === mediaId)\n ?.filename || mediaId\n }}\n </span>\n <span style=\"color: var(--tpl-text-muted)\">\n -\n {{\n t.mediaLibrary.usedInTemplates.replace(\n \"{count}\",\n info.template_count.toString(),\n )\n }}\n </span>\n </template>\n </div>\n </div>\n\n <div class=\"tpl:flex tpl:justify-end tpl:gap-2\">\n <button\n class=\"tpl:cursor-pointer tpl:rounded-md tpl:border tpl:px-3 tpl:py-1.5 tpl:text-xs tpl:font-medium tpl:transition-all tpl:duration-150\"\n style=\"\n border-color: var(--tpl-border);\n color: var(--tpl-text);\n background-color: var(--tpl-bg);\n \"\n @click=\"library.cancelDelete\"\n >\n {{ t.mediaLibrary.cancel }}\n </button>\n <button\n class=\"tpl:cursor-pointer tpl:rounded-md tpl:border tpl:px-3 tpl:py-1.5 tpl:text-xs tpl:font-medium tpl:transition-all tpl:duration-150\"\n style=\"\n border-color: var(--tpl-danger);\n color: var(--tpl-danger);\n background-color: var(--tpl-danger-light);\n \"\n @click=\"library.confirmDelete\"\n >\n {{\n ui.hasUsedFiles.value\n ? t.mediaLibrary.deleteAnyway\n : t.mediaLibrary.confirmDelete\n }}\n </button>\n </div>\n </div>\n </div>\n </Transition>\n\n <!-- Footer -->\n <div\n class=\"tpl:flex tpl:shrink-0 tpl:items-center tpl:justify-between tpl:border-t tpl:px-5 tpl:py-3\"\n style=\"border-color: var(--tpl-border)\"\n >\n <div\n class=\"tpl:flex tpl:min-w-0 tpl:flex-1 tpl:items-center tpl:gap-3\"\n >\n <MediaPreviewPanel\n v-if=\"library.previewItem.value\"\n v-model:selected-conversion=\"ui.selectedConversion.value\"\n :item=\"library.previewItem.value\"\n :folders=\"library.folders.value\"\n />\n </div>\n <div class=\"tpl:flex tpl:items-center tpl:gap-5\">\n <!-- Copy URL + Move group -->\n <div\n v-if=\"library.selectedItems.value.size > 0\"\n class=\"tpl:flex tpl:items-center tpl:gap-2\"\n >\n <button\n v-if=\"library.previewItem.value\"\n class=\"tpl:flex tpl:cursor-pointer tpl:items-center tpl:gap-1 tpl:rounded-md tpl:border tpl:px-3 tpl:py-1.5 tpl:text-xs tpl:font-medium tpl:transition-all tpl:duration-150\"\n :style=\"{\n borderColor: ui.copied.value\n ? 'var(--tpl-success)'\n : 'var(--tpl-border)',\n color: ui.copied.value\n ? 'var(--tpl-success)'\n : 'var(--tpl-text)',\n backgroundColor: 'var(--tpl-bg)',\n }\"\n @click=\"ui.copy(ui.selectedUrl.value!)\"\n >\n <Copy v-if=\"!ui.copied.value\" :size=\"12\" :stroke-width=\"2\" />\n <Check v-else :size=\"12\" :stroke-width=\"2\" />\n {{\n ui.copied.value\n ? t.mediaLibrary.copied\n : t.mediaLibrary.copyUrl\n }}\n </button>\n <div class=\"tpl:relative\">\n <button\n class=\"tpl:cursor-pointer tpl:rounded-md tpl:border tpl:px-3 tpl:py-1.5 tpl:text-xs tpl:font-medium tpl:transition-all tpl:duration-150\"\n style=\"\n border-color: var(--tpl-border);\n color: var(--tpl-text);\n background-color: var(--tpl-bg);\n \"\n @click=\"ui.showMovePicker.value = !ui.showMovePicker.value\"\n >\n {{ t.mediaLibrary.moveSelected }}\n </button>\n <MediaMovePicker\n v-if=\"ui.showMovePicker.value\"\n :folders=\"library.folders.value\"\n :current-folder-id=\"library.currentFolderId.value\"\n @select=\"ui.handleMoveToFolder\"\n @close=\"ui.showMovePicker.value = false\"\n />\n </div>\n </div>\n <!-- Delete + Select group -->\n <div class=\"tpl:flex tpl:items-center tpl:gap-2\">\n <button\n v-if=\"library.selectedItems.value.size > 0\"\n class=\"tpl:cursor-pointer tpl:rounded-md tpl:border tpl:px-3 tpl:py-1.5 tpl:text-xs tpl:font-medium tpl:transition-all tpl:duration-150\"\n style=\"\n border-color: var(--tpl-danger);\n color: var(--tpl-danger);\n background-color: var(--tpl-danger-light);\n \"\n @click=\"ui.handleDeleteClick\"\n >\n {{ t.mediaLibrary.deleteSelected }}\n </button>\n <button\n class=\"tpl:cursor-pointer tpl:rounded-md tpl:px-4 tpl:py-1.5 tpl:text-sm tpl:font-medium tpl:shadow-xs tpl:transition-all tpl:duration-150 tpl:hover:opacity-90 tpl:disabled:cursor-not-allowed tpl:disabled:opacity-50\"\n style=\"\n background-color: var(--tpl-primary);\n color: var(--tpl-bg);\n \"\n :disabled=\"!isConfirmable()\"\n @click=\"confirmSelection\"\n >\n {{\n accept?.length\n ? t.mediaLibrary.selectImage\n : t.mediaLibrary.selectFile\n }}\n </button>\n </div>\n </div>\n </div>\n </div>\n </div>\n </Transition>\n </Teleport>\n</template>\n","<script setup lang=\"ts\">\nimport MediaBreadcrumb from \"./media/MediaBreadcrumb.vue\";\nimport MediaEditModal from \"./media/MediaEditModal.vue\";\nimport MediaFolderTree from \"./media/MediaFolderTree.vue\";\nimport MediaGrid from \"./media/MediaGrid.vue\";\nimport MediaImportUrlModal from \"./media/MediaImportUrlModal.vue\";\nimport MediaMovePicker from \"./media/MediaMovePicker.vue\";\nimport MediaPreviewPanel from \"./media/MediaPreviewPanel.vue\";\nimport MediaReplaceModal from \"./media/MediaReplaceModal.vue\";\nimport MediaUploadZone from \"./media/MediaUploadZone.vue\";\nimport StorageProgressRing from \"./media/StorageProgressRing.vue\";\nimport { useMediaCategories } from \"../composables/useMediaCategories\";\nimport { useMediaLibraryUI } from \"../composables/useMediaLibraryUI\";\nimport type { UsePlanConfigReturn } from \"@templatical/core/cloud\";\nimport { useMediaLibrary } from \"../composable\";\nimport type { MediaCategory, MediaItem } from \"../types\";\nimport type { AuthManager } from \"@templatical/core/cloud\";\nimport { useEventListener } from \"@vueuse/core\";\nimport {\n Check,\n Copy,\n Grid2x2,\n Link,\n List,\n PanelLeft,\n Search,\n X,\n} from \"@lucide/vue\";\nimport { computed, provide, ref, toRef, watch } from \"vue\";\nimport {\n PLAN_CONFIG_KEY,\n POPOVER_TARGET_KEY,\n TRANSLATIONS_KEY,\n UI_THEME_KEY,\n} from \"../keys\";\nimport { loadMediaTranslations, type MediaTranslations } from \"../i18n\";\n\nconst props = defineProps<{\n visible: boolean;\n accept?: MediaCategory[];\n /**\n * Authenticated Cloud session. **A prop, not an injection.** An injection would\n * have to agree with the host on key *identity*: a bare string never resolves\n * the `Symbol` `@templatical/editor` provides, and the miss is silent —\n * `undefined` here means the library opens and does nothing. A prop is checked\n * at compile time, which makes that class of miss impossible rather than merely\n * fixed.\n */\n authManager: AuthManager;\n /** Scopes every request. Same story as {@link authManager}. */\n projectId: string;\n /**\n * The active plan's config — media limits and the storage gauge. Re-provided\n * under `PLAN_CONFIG_KEY` for the five descendants that call\n * `useMediaCategories`, which is why this one is a prop *and* a provide.\n */\n planConfig: UsePlanConfigReturn;\n /**\n * Mount target for the modal's teleport. When provided, the modal and\n * its sub-modals render inside this element instead of `document.body`\n * — used by editors that wrap the media library inside a shadow root\n * (or any other DOM boundary) and want the modal to stay inside.\n * Defaults to `null` → teleport to body, preserving the original\n * standalone-SDK behavior.\n */\n popoverTarget?: HTMLElement | null;\n /**\n * BCP-47 locale for this package's own strings, defaulting to English.\n *\n * A locale rather than the strings themselves: media-library owns its\n * translations and loads them here, so a host passes a value it already has\n * and never handles media copy. That also keeps the load lazy — the host\n * imports nothing from this package's i18n, so nothing is fetched until this\n * modal mounts.\n */\n locale?: string;\n /**\n * Resolved UI theme (`\"light\"` / `\"dark\"`) for the overlay chrome.\n *\n * A plain string rather than the host's ref: props are reactive, so the\n * computed below tracks a host theme toggle without this package depending on\n * how the host stores it.\n */\n uiTheme?: string;\n}>();\n\nconst emit = defineEmits<{\n (e: \"close\"): void;\n (e: \"select\", item: MediaItem): void;\n}>();\n\n// Loaded here rather than injected from the host: a bare-string key never\n// resolves the `Symbol` `@templatical/editor` provides under the same name, so\n// a host-mounted modal used to get `undefined` and throw on its first label.\nconst translations = ref<MediaTranslations | null>(null);\nwatch(\n () => props.locale,\n async (locale) => {\n translations.value = await loadMediaTranslations(locale ?? \"en\");\n },\n { immediate: true },\n);\n\n// Descendants unwrap this at *their* setup, so the `v-if` below is what\n// guarantees they never read a null. See `useI18n`.\nprovide(TRANSLATIONS_KEY, translations);\n\n// Not `useI18n()` — a component never sees its own `provide`. The template's\n// 28 reads auto-unwrap this, and `useMediaLibraryUI` accepts a ref.\n// The `v-if` on the root guarantees non-null wherever the template reads it.\nconst t = computed(() => translations.value as MediaTranslations);\n// Provided, not injected: the three sub-modals teleport out of this component's\n// DOM, so a prop cannot reach them. Never a bare-string key — that is what left\n// the library light inside a dark editor.\nconst tplUiTheme = computed(() => props.uiTheme);\nprovide(UI_THEME_KEY, tplUiTheme);\n\n// Sub-modals (MediaReplaceModal, MediaEditModal, MediaImportUrlModal) inject\n// the same target so every nested teleport lands in the same place as this\n// one. Wrap the prop in a reactive ref so the provide updates if the host\n// remounts the modal with a different target.\nconst popoverTargetRef = toRef(() => props.popoverTarget ?? null);\nprovide(POPOVER_TARGET_KEY, popoverTargetRef);\n\n// Deep descendants (MediaGrid, MediaUploadZone, MediaPreviewPanel,\n// MediaEditModal) read the media limits through `useMediaCategories`, so the\n// prop is re-provided rather than drilled through four component layers. The\n// value still arrives as a prop, which is what keeps the package boundary typed.\n//\n// The object itself is stable (a host builds it once) and its reactivity lives in\n// the refs inside it, so providing it at setup is enough — no `toRef` dance.\nprovide(PLAN_CONFIG_KEY, props.planConfig);\n\n// Folders and URL import render on every plan: gating Cloud's media *UI* meters\n// no resource Cloud buys, so the media tier is limits-only and every plan gets\n// the same library. (URL import's real cost — bandwidth and SSRF exposure — is a\n// backend rate-limit and allow-list concern, not a client-side plan flag.)\n\n// Storage info\nconst storageUsedBytes = computed(\n () => props.planConfig.config.value?.storage.used_bytes ?? 0,\n);\nconst storageLimitBytes = computed(\n () => props.planConfig.config.value?.storage.limit_bytes ?? 0,\n);\n\n// `props.planConfig`, not the provide above: a component never sees its own\n// `provide` (Vue resolves `inject` against the parent chain), so injecting\n// here would throw in every host.\nconst { isAcceptedMimeType, availableCategories } = useMediaCategories(\n props.planConfig,\n);\n\nconst library = useMediaLibrary({\n projectId: props.projectId,\n authManager: props.authManager,\n});\n\nconst ui = useMediaLibraryUI({\n library,\n translations: t,\n});\n\n// Modal-specific: load on open, reset on close\nwatch(\n () => props.visible,\n (visible) => {\n if (visible) {\n library.loadItems();\n library.loadFrequentlyUsed();\n } else {\n ui.resetUI();\n }\n },\n);\n\n// Modal-specific: escape key\nfunction handleKeydown(event: KeyboardEvent): void {\n if (event.key === \"Escape\") {\n emit(\"close\");\n }\n}\nuseEventListener(document, \"keydown\", handleKeydown);\n\n// Modal-specific: accept filter + selection\nfunction isConfirmable(): boolean {\n if (!library.previewItem.value) {\n return false;\n }\n\n if (!props.accept?.length) {\n return true;\n }\n\n return isAcceptedMimeType(library.previewItem.value.mime_type, props.accept);\n}\n\nfunction confirmSelection(): void {\n if (isConfirmable()) {\n const item = library.previewItem.value!;\n const itemWithSelectedUrl: MediaItem = {\n ...item,\n url: ui.selectedUrl.value || item.url,\n };\n emit(\"select\", itemWithSelectedUrl);\n emit(\"close\");\n }\n}\n</script>\n\n<template>\n <Teleport :to=\"popoverTarget || 'body'\">\n <Transition\n enter-active-class=\"tpl:transition tpl:duration-200\"\n enter-from-class=\"tpl:opacity-0\"\n enter-to-class=\"tpl:opacity-100\"\n leave-active-class=\"tpl:transition tpl:duration-150\"\n leave-from-class=\"tpl:opacity-100\"\n leave-to-class=\"tpl:opacity-0\"\n >\n <!-- `translations` gates the subtree, not just this element's own labels:\n every descendant unwraps `TRANSLATIONS_KEY` at its own setup, so none\n may mount before the locale's strings have landed. -->\n <div\n v-if=\"visible && translations\"\n :data-tpl-theme=\"tplUiTheme\"\n class=\"tpl tpl-media-overlay tpl:fixed tpl:inset-0 tpl:z-[9999] tpl:flex tpl:items-center tpl:justify-center tpl:p-4\"\n @click.self=\"emit('close')\"\n >\n <!-- Caps are percentages of the overlay, never `vh`/`vw`. This overlay\n is `fixed; inset: 0`, which covers the viewport only while nothing\n traps it — an ancestor with `transform`, `filter`,\n `backdrop-filter`, `will-change: transform`, `contain: paint` or\n `container-type` becomes the containing block for fixed\n descendants, and this modal teleports into the editor's popover\n root, i.e. inside a consumer's markup. `inset: 0` then resolves to\n that ancestor's box while a viewport cap does not, and the panel\n overflows a container that usually also has `overflow: hidden`.\n That was issue #575 in the editor's dialogs; this modal had the\n same mismatch. Percentages resolve against whatever the overlay\n turned out to be, so they are correct either way. Locked by\n `tests/overlay-height-scope-audit.test.ts`.\n\n `p-4` is the gutter, and it belongs on this element rather than on\n the panel: insets size the overlay's border box, so padding here\n shrinks the content box the panel measures against. `height` stays\n a fixed preference — `max-height` is what reins it in. -->\n <div\n class=\"tpl-media-modal tpl-scale-in tpl:flex tpl:flex-col tpl:overflow-hidden tpl:rounded-[var(--tpl-radius-lg)]\"\n style=\"\n width: 900px;\n height: 650px;\n max-width: 100%;\n max-height: 90%;\n background-color: var(--tpl-bg-elevated);\n border: 1px solid var(--tpl-border);\n box-shadow: var(--tpl-shadow-xl);\n \"\n >\n <!-- Header -->\n <div\n class=\"tpl:flex tpl:shrink-0 tpl:items-center tpl:justify-between tpl:border-b tpl:px-5 tpl:py-3.5\"\n style=\"border-color: var(--tpl-border)\"\n >\n <h2\n class=\"tpl:text-sm tpl:font-semibold\"\n style=\"color: var(--tpl-text)\"\n >\n {{ t.mediaLibrary.title }}\n </h2>\n <div class=\"tpl:flex tpl:items-center tpl:gap-3\">\n <StorageProgressRing\n :used-bytes=\"storageUsedBytes\"\n :limit-bytes=\"storageLimitBytes\"\n :size=\"22\"\n />\n <div class=\"tpl:relative\">\n <input\n :value=\"ui.searchInput.value\"\n type=\"text\"\n class=\"tpl:w-52 tpl:rounded-md tpl:border tpl:py-1.5 tpl:pr-3 tpl:pl-8 tpl:text-xs tpl:shadow-xs tpl:transition-all tpl:duration-150 tpl:outline-none tpl:focus:shadow-[var(--tpl-ring)]\"\n style=\"\n border-color: var(--tpl-border);\n background-color: var(--tpl-bg);\n color: var(--tpl-text);\n \"\n :placeholder=\"t.mediaLibrary.searchPlaceholder\"\n @input=\"\n ui.handleSearchInput(\n ($event.target as HTMLInputElement).value,\n )\n \"\n />\n <Search\n class=\"tpl:absolute tpl:top-1/2 tpl:left-2.5 tpl:-translate-y-1/2\"\n :size=\"13\"\n :stroke-width=\"2\"\n style=\"color: var(--tpl-text-dim)\"\n />\n </div>\n <button\n class=\"tpl:flex tpl:size-7 tpl:items-center tpl:justify-center tpl:rounded-md tpl:transition-all tpl:duration-150\"\n style=\"color: var(--tpl-text-muted)\"\n @click=\"emit('close')\"\n >\n <X :size=\"18\" :stroke-width=\"2\" />\n </button>\n </div>\n </div>\n\n <!-- Body -->\n <div class=\"tpl:flex tpl:min-h-0 tpl:flex-1 tpl:overflow-hidden\">\n <!-- Sidebar (only when media folders feature is enabled and toggled on) -->\n <Transition\n enter-active-class=\"tpl:transition-all tpl:duration-200 tpl:ease-out\"\n enter-from-class=\"tpl:-ml-48 tpl:opacity-0\"\n enter-to-class=\"tpl:ml-0 tpl:opacity-100\"\n leave-active-class=\"tpl:transition-all tpl:duration-150 tpl:ease-in\"\n leave-from-class=\"tpl:ml-0 tpl:opacity-100\"\n leave-to-class=\"tpl:-ml-48 tpl:opacity-0\"\n >\n <div\n v-if=\"ui.showSidebar.value\"\n class=\"tpl:flex tpl:w-48 tpl:shrink-0 tpl:flex-col tpl:border-r\"\n style=\"\n border-color: var(--tpl-border);\n background-color: var(--tpl-bg);\n \"\n >\n <MediaFolderTree\n :folders=\"library.folders.value\"\n :current-folder-id=\"library.currentFolderId.value\"\n :view-mode=\"library.viewMode.value\"\n :has-frequently-used=\"ui.hasFrequentlyUsed.value\"\n @navigate=\"library.navigateToFolder\"\n @create-folder=\"ui.handleCreateFolder\"\n @rename-folder=\"ui.handleRenameFolder\"\n @delete-folder=\"ui.handleDeleteFolder\"\n @show-frequently-used=\"library.showFrequentlyUsed\"\n />\n </div>\n </Transition>\n\n <!-- Content area -->\n <div class=\"tpl:flex tpl:min-w-0 tpl:flex-1 tpl:flex-col\">\n <!-- Breadcrumb + Upload -->\n <div\n class=\"tpl:flex tpl:shrink-0 tpl:items-center tpl:justify-between tpl:border-b tpl:px-4 tpl:py-2.5\"\n style=\"border-color: var(--tpl-border)\"\n >\n <div class=\"tpl:flex tpl:items-center tpl:gap-2\">\n <!-- Sidebar toggle (only when media folders feature is enabled) -->\n <button\n class=\"tpl:flex tpl:size-7 tpl:cursor-pointer tpl:items-center tpl:justify-center tpl:rounded-md tpl:transition-all tpl:duration-150\"\n :style=\"{\n color: ui.showSidebar.value\n ? 'var(--tpl-primary)'\n : 'var(--tpl-text-muted)',\n backgroundColor: ui.showSidebar.value\n ? 'var(--tpl-bg)'\n : 'transparent',\n border: ui.showSidebar.value\n ? '1px solid var(--tpl-border)'\n : '1px solid transparent',\n }\"\n :title=\"\n ui.showSidebar.value\n ? t.mediaLibrary.hideFolders\n : t.mediaLibrary.showFolders\n \"\n @click=\"ui.showSidebar.value = !ui.showSidebar.value\"\n >\n <PanelLeft :size=\"16\" :stroke-width=\"2\" />\n </button>\n\n <template v-if=\"library.viewMode.value === 'frequently-used'\">\n <span\n class=\"tpl:text-xs tpl:font-medium\"\n style=\"color: var(--tpl-text)\"\n >\n {{ t.mediaLibrary.frequentlyUsed }}\n </span>\n </template>\n <template v-else>\n <MediaBreadcrumb\n :folders=\"library.folders.value\"\n :current-folder-id=\"library.currentFolderId.value\"\n @navigate=\"library.navigateToFolder\"\n />\n </template>\n\n <!-- Layout toggle -->\n <div\n class=\"tpl:flex tpl:rounded-md tpl:p-0.5\"\n style=\"\n border: 1px solid var(--tpl-border);\n background-color: var(--tpl-bg);\n \"\n >\n <button\n class=\"tpl:flex tpl:size-6 tpl:cursor-pointer tpl:items-center tpl:justify-center tpl:rounded tpl:transition-all tpl:duration-150\"\n :style=\"{\n color:\n ui.layoutMode.value === 'grid'\n ? 'var(--tpl-primary)'\n : 'var(--tpl-text-muted)',\n backgroundColor:\n ui.layoutMode.value === 'grid'\n ? 'var(--tpl-bg-elevated)'\n : 'transparent',\n }\"\n :title=\"t.mediaLibrary.viewGrid\"\n @click=\"ui.layoutMode.value = 'grid'\"\n >\n <Grid2x2 :size=\"14\" :stroke-width=\"2\" />\n </button>\n <button\n class=\"tpl:flex tpl:size-6 tpl:cursor-pointer tpl:items-center tpl:justify-center tpl:rounded tpl:transition-all tpl:duration-150\"\n :style=\"{\n color:\n ui.layoutMode.value === 'list'\n ? 'var(--tpl-primary)'\n : 'var(--tpl-text-muted)',\n backgroundColor:\n ui.layoutMode.value === 'list'\n ? 'var(--tpl-bg-elevated)'\n : 'transparent',\n }\"\n :title=\"t.mediaLibrary.viewList\"\n @click=\"ui.layoutMode.value = 'list'\"\n >\n <List :size=\"14\" :stroke-width=\"2\" />\n </button>\n </div>\n </div>\n\n <div class=\"tpl:flex tpl:items-center tpl:gap-2\">\n <select\n v-if=\"availableCategories.length > 1\"\n class=\"tpl:rounded-md tpl:border tpl:py-1.5 tpl:pr-7 tpl:pl-2.5 tpl:text-xs tpl:transition-all tpl:duration-150 tpl:outline-none\"\n style=\"\n border-color: var(--tpl-border);\n background-color: var(--tpl-bg);\n color: var(--tpl-text);\n \"\n :value=\"library.categoryFilter.value ?? ''\"\n @change=\"\n library.filterByCategory(\n ($event.target as HTMLSelectElement).value || null,\n )\n \"\n >\n <option value=\"\">\n {{ t.mediaLibrary.filterAll }}\n </option>\n <option\n v-for=\"category in availableCategories\"\n :key=\"category\"\n :value=\"category\"\n >\n {{ ui.getCategoryLabel(category) }}\n </option>\n </select>\n <select\n class=\"tpl:rounded-md tpl:border tpl:py-1.5 tpl:pr-7 tpl:pl-2.5 tpl:text-xs tpl:transition-all tpl:duration-150 tpl:outline-none\"\n style=\"\n border-color: var(--tpl-border);\n background-color: var(--tpl-bg);\n color: var(--tpl-text);\n \"\n :value=\"library.sortOption.value\"\n @change=\"\n library.sortBy(($event.target as HTMLSelectElement).value)\n \"\n >\n <option value=\"newest\">\n {{ t.mediaLibrary.sortNewest }}\n </option>\n <option value=\"oldest\">\n {{ t.mediaLibrary.sortOldest }}\n </option>\n <option value=\"name_asc\">\n {{ t.mediaLibrary.sortNameAsc }}\n </option>\n <option value=\"name_desc\">\n {{ t.mediaLibrary.sortNameDesc }}\n </option>\n <option value=\"size_asc\">\n {{ t.mediaLibrary.sortSizeAsc }}\n </option>\n <option value=\"size_desc\">\n {{ t.mediaLibrary.sortSizeDesc }}\n </option>\n </select>\n </div>\n </div>\n\n <!-- Scrollable content area -->\n <div class=\"tpl:min-h-0 tpl:flex-1 tpl:overflow-y-auto\">\n <!-- Upload zone (only in files mode) -->\n <div\n v-if=\"library.viewMode.value === 'files'\"\n class=\"tpl:px-4 tpl:pt-3\"\n >\n <MediaUploadZone\n :is-uploading=\"library.isUploading.value\"\n :upload-progress=\"library.uploadProgress.value\"\n @upload=\"ui.handleUpload\"\n />\n <button\n class=\"tpl:mt-2 tpl:flex tpl:w-full tpl:cursor-pointer tpl:items-center tpl:justify-center tpl:gap-1.5 tpl:rounded-md tpl:border tpl:border-dashed tpl:px-3 tpl:py-1.5 tpl:text-xs tpl:font-medium tpl:transition-all tpl:duration-150\"\n style=\"\n border-color: var(--tpl-border);\n color: var(--tpl-text-muted);\n background-color: var(--tpl-bg);\n \"\n @click=\"ui.showImportUrlModal.value = true\"\n >\n <Link :size=\"14\" :stroke-width=\"2\" />\n {{ t.mediaLibrary.importFromUrl }}\n </button>\n </div>\n\n <!-- Image grid -->\n <MediaGrid\n :items=\"ui.displayItems.value\"\n :selected-ids=\"library.selectedItems.value\"\n :is-loading=\"library.isLoading.value\"\n :has-more=\"\n library.viewMode.value === 'files' && library.hasMore.value\n \"\n :accept=\"accept\"\n :layout=\"ui.layoutMode.value\"\n @select=\"ui.handleSelect\"\n @toggle=\"library.toggleSelection\"\n @load-more=\"library.loadMore\"\n @edit=\"ui.handleEditItem\"\n @replace=\"ui.handleReplaceItem\"\n />\n </div>\n </div>\n </div>\n\n <!-- Import from URL Modal -->\n <MediaImportUrlModal\n :visible=\"ui.showImportUrlModal.value\"\n :is-importing=\"library.isImportingFromUrl.value\"\n :error=\"library.importFromUrlError.value\"\n @import=\"ui.handleImportFromUrl\"\n @close=\"ui.showImportUrlModal.value = false\"\n />\n\n <!-- Edit Modal -->\n <MediaEditModal\n :visible=\"!!ui.editingItem.value\"\n :item=\"ui.editingItem.value\"\n @save=\"ui.handleEditSave\"\n @close=\"ui.editingItem.value = null\"\n />\n\n <!-- Replace Modal -->\n <MediaReplaceModal\n :visible=\"library.showReplaceWarning.value\"\n :item=\"library.pendingReplaceItem.value\"\n :usage-info=\"library.replaceUsageInfo.value\"\n :is-replacing=\"library.isReplacing.value\"\n :error=\"library.replaceError.value\"\n @replace=\"ui.handleReplaceFile\"\n @close=\"library.cancelReplace\"\n />\n\n <!-- Delete Warning Dialog -->\n <Transition\n enter-active-class=\"tpl:transition tpl:ease-out tpl:duration-150\"\n enter-from-class=\"tpl:opacity-0\"\n enter-to-class=\"tpl:opacity-100\"\n leave-active-class=\"tpl:transition tpl:ease-in tpl:duration-100\"\n leave-from-class=\"tpl:opacity-100\"\n leave-to-class=\"tpl:opacity-0\"\n >\n <div\n v-if=\"library.showDeleteWarning.value\"\n class=\"tpl:absolute tpl:inset-0 tpl:z-10 tpl:flex tpl:items-center tpl:justify-center tpl:rounded-[var(--tpl-radius-lg)]\"\n style=\"\n background-color: var(--tpl-overlay);\n backdrop-filter: blur(8px);\n -webkit-backdrop-filter: blur(8px);\n \"\n @click.self=\"library.cancelDelete\"\n >\n <div\n class=\"tpl-scale-in tpl:mx-4 tpl:w-full tpl:max-w-sm tpl:rounded-[var(--tpl-radius-lg)] tpl:p-5\"\n style=\"\n background-color: var(--tpl-bg-elevated);\n box-shadow: var(--tpl-shadow-xl);\n \"\n >\n <h3\n class=\"tpl:mb-2 tpl:text-sm tpl:font-semibold\"\n style=\"color: var(--tpl-text)\"\n >\n {{ t.mediaLibrary.deleteWarningTitle }}\n </h3>\n <p\n class=\"tpl:text-xs\"\n :class=\"ui.hasUsedFiles.value ? 'tpl:mb-2' : 'tpl:mb-4'\"\n style=\"color: var(--tpl-text-muted)\"\n >\n {{ t.mediaLibrary.deleteWarningMessage }}\n </p>\n <p\n v-if=\"ui.hasUsedFiles.value\"\n class=\"tpl:mb-4 tpl:text-xs\"\n style=\"color: var(--tpl-text-muted)\"\n >\n {{ t.mediaLibrary.deleteWarningUsageNote }}\n </p>\n\n <div\n v-if=\"ui.hasUsedFiles.value\"\n class=\"tpl:mb-4 tpl:max-h-32 tpl:overflow-y-auto tpl:rounded tpl:border tpl:p-2\"\n style=\"border-color: var(--tpl-border)\"\n >\n <div\n v-for=\"(info, mediaId) in library.deleteUsageInfo.value\"\n :key=\"mediaId\"\n class=\"tpl:text-xs\"\n style=\"color: var(--tpl-text)\"\n >\n <template v-if=\"info.template_count > 0\">\n <span class=\"tpl:font-medium\">\n {{\n ui.displayItems.value.find((i) => i.id === mediaId)\n ?.filename || mediaId\n }}\n </span>\n <span style=\"color: var(--tpl-text-muted)\">\n -\n {{\n t.mediaLibrary.usedInTemplates.replace(\n \"{count}\",\n info.template_count.toString(),\n )\n }}\n </span>\n </template>\n </div>\n </div>\n\n <div class=\"tpl:flex tpl:justify-end tpl:gap-2\">\n <button\n class=\"tpl:cursor-pointer tpl:rounded-md tpl:border tpl:px-3 tpl:py-1.5 tpl:text-xs tpl:font-medium tpl:transition-all tpl:duration-150\"\n style=\"\n border-color: var(--tpl-border);\n color: var(--tpl-text);\n background-color: var(--tpl-bg);\n \"\n @click=\"library.cancelDelete\"\n >\n {{ t.mediaLibrary.cancel }}\n </button>\n <button\n class=\"tpl:cursor-pointer tpl:rounded-md tpl:border tpl:px-3 tpl:py-1.5 tpl:text-xs tpl:font-medium tpl:transition-all tpl:duration-150\"\n style=\"\n border-color: var(--tpl-danger);\n color: var(--tpl-danger);\n background-color: var(--tpl-danger-light);\n \"\n @click=\"library.confirmDelete\"\n >\n {{\n ui.hasUsedFiles.value\n ? t.mediaLibrary.deleteAnyway\n : t.mediaLibrary.confirmDelete\n }}\n </button>\n </div>\n </div>\n </div>\n </Transition>\n\n <!-- Footer -->\n <div\n class=\"tpl:flex tpl:shrink-0 tpl:items-center tpl:justify-between tpl:border-t tpl:px-5 tpl:py-3\"\n style=\"border-color: var(--tpl-border)\"\n >\n <div\n class=\"tpl:flex tpl:min-w-0 tpl:flex-1 tpl:items-center tpl:gap-3\"\n >\n <MediaPreviewPanel\n v-if=\"library.previewItem.value\"\n v-model:selected-conversion=\"ui.selectedConversion.value\"\n :item=\"library.previewItem.value\"\n :folders=\"library.folders.value\"\n />\n </div>\n <div class=\"tpl:flex tpl:items-center tpl:gap-5\">\n <!-- Copy URL + Move group -->\n <div\n v-if=\"library.selectedItems.value.size > 0\"\n class=\"tpl:flex tpl:items-center tpl:gap-2\"\n >\n <button\n v-if=\"library.previewItem.value\"\n class=\"tpl:flex tpl:cursor-pointer tpl:items-center tpl:gap-1 tpl:rounded-md tpl:border tpl:px-3 tpl:py-1.5 tpl:text-xs tpl:font-medium tpl:transition-all tpl:duration-150\"\n :style=\"{\n borderColor: ui.copied.value\n ? 'var(--tpl-success)'\n : 'var(--tpl-border)',\n color: ui.copied.value\n ? 'var(--tpl-success)'\n : 'var(--tpl-text)',\n backgroundColor: 'var(--tpl-bg)',\n }\"\n @click=\"ui.copy(ui.selectedUrl.value!)\"\n >\n <Copy v-if=\"!ui.copied.value\" :size=\"12\" :stroke-width=\"2\" />\n <Check v-else :size=\"12\" :stroke-width=\"2\" />\n {{\n ui.copied.value\n ? t.mediaLibrary.copied\n : t.mediaLibrary.copyUrl\n }}\n </button>\n <div class=\"tpl:relative\">\n <button\n class=\"tpl:cursor-pointer tpl:rounded-md tpl:border tpl:px-3 tpl:py-1.5 tpl:text-xs tpl:font-medium tpl:transition-all tpl:duration-150\"\n style=\"\n border-color: var(--tpl-border);\n color: var(--tpl-text);\n background-color: var(--tpl-bg);\n \"\n @click=\"ui.showMovePicker.value = !ui.showMovePicker.value\"\n >\n {{ t.mediaLibrary.moveSelected }}\n </button>\n <MediaMovePicker\n v-if=\"ui.showMovePicker.value\"\n :folders=\"library.folders.value\"\n :current-folder-id=\"library.currentFolderId.value\"\n @select=\"ui.handleMoveToFolder\"\n @close=\"ui.showMovePicker.value = false\"\n />\n </div>\n </div>\n <!-- Delete + Select group -->\n <div class=\"tpl:flex tpl:items-center tpl:gap-2\">\n <button\n v-if=\"library.selectedItems.value.size > 0\"\n class=\"tpl:cursor-pointer tpl:rounded-md tpl:border tpl:px-3 tpl:py-1.5 tpl:text-xs tpl:font-medium tpl:transition-all tpl:duration-150\"\n style=\"\n border-color: var(--tpl-danger);\n color: var(--tpl-danger);\n background-color: var(--tpl-danger-light);\n \"\n @click=\"ui.handleDeleteClick\"\n >\n {{ t.mediaLibrary.deleteSelected }}\n </button>\n <button\n class=\"tpl:cursor-pointer tpl:rounded-md tpl:px-4 tpl:py-1.5 tpl:text-sm tpl:font-medium tpl:shadow-xs tpl:transition-all tpl:duration-150 tpl:hover:opacity-90 tpl:disabled:cursor-not-allowed tpl:disabled:opacity-50\"\n style=\"\n background-color: var(--tpl-primary);\n color: var(--tpl-bg);\n \"\n :disabled=\"!isConfirmable()\"\n @click=\"confirmSelection\"\n >\n {{\n accept?.length\n ? t.mediaLibrary.selectImage\n : t.mediaLibrary.selectFile\n }}\n </button>\n </div>\n </div>\n </div>\n </div>\n </div>\n </Transition>\n </Teleport>\n</template>\n","<script setup lang=\"ts\">\nimport MediaBreadcrumb from \"../components/media/MediaBreadcrumb.vue\";\nimport MediaEditModal from \"../components/media/MediaEditModal.vue\";\nimport MediaFolderTree from \"../components/media/MediaFolderTree.vue\";\nimport MediaGrid from \"../components/media/MediaGrid.vue\";\nimport MediaImportUrlModal from \"../components/media/MediaImportUrlModal.vue\";\nimport MediaMovePicker from \"../components/media/MediaMovePicker.vue\";\nimport MediaPreviewPanel from \"../components/media/MediaPreviewPanel.vue\";\nimport MediaReplaceModal from \"../components/media/MediaReplaceModal.vue\";\nimport MediaUploadZone from \"../components/media/MediaUploadZone.vue\";\nimport StorageProgressRing from \"../components/media/StorageProgressRing.vue\";\nimport { useMediaLibrary } from \"../composable\";\nimport { useMediaCategories } from \"../composables/useMediaCategories\";\nimport { useMediaLibraryUI } from \"../composables/useMediaLibraryUI\";\nimport type { PlanConfig, PlanFeatures } from \"@templatical/types\";\nimport type { MediaItem } from \"../types\";\nimport type { AuthManager } from \"@templatical/core/cloud\";\nimport type { MediaTranslations } from \"../i18n\";\nimport {\n Check,\n Copy,\n Grid2x2,\n Link,\n List,\n PanelLeft,\n Search,\n} from \"@lucide/vue\";\nimport { computed, onMounted, provide, ref } from \"vue\";\nimport { PLAN_CONFIG_KEY, TRANSLATIONS_KEY } from \"../keys\";\n\nconst props = defineProps<{\n authManager: AuthManager;\n projectId: string;\n planConfig: PlanConfig;\n translations: MediaTranslations;\n onSelect?: (item: MediaItem) => void;\n onError?: (error: Error) => void;\n}>();\n\nconst emit = defineEmits<{\n (e: \"ready\"): void;\n}>();\n\nconst t = computed(() => props.translations);\n\n// `TRANSLATIONS_KEY`, not the bare string it used to be: a string never\n// resolves the `Symbol` a host provides under the same name. Wrapped in a ref\n// because the key carries one — this shell always has its strings up front.\nprovide(TRANSLATIONS_KEY, ref(props.translations));\n\n// `useMediaCategories` (called by five descendants) needs a `UsePlanConfigReturn`;\n// the standalone SDK is handed a plain `PlanConfig`, so it adapts one here. Under\n// the shared `PLAN_CONFIG_KEY` — the same key `MediaLibraryModal` provides — so\n// the two hosts cannot drift on how it is spelled. `authManager` and `projectId`\n// are deliberately not provided alongside it: the modal takes them as props, and\n// nothing else in this package injects them.\nconst planConfigRef = ref<PlanConfig | null>(props.planConfig);\nconst planConfig = {\n config: planConfigRef,\n isLoading: ref(false),\n hasFeature: (feature: keyof PlanFeatures) =>\n props.planConfig.features[feature] ?? false,\n features: computed(() => props.planConfig.features),\n fetchConfig: async () => {},\n};\nprovide(PLAN_CONFIG_KEY, planConfig);\n\n// Folders and URL import render on every plan: gating Cloud's media *UI* meters\n// no resource Cloud buys, so the media tier is limits-only and every plan gets\n// the same library.\n\n// Storage info\nconst storageUsedBytes = computed(\n () => props.planConfig.storage.used_bytes ?? 0,\n);\nconst storageLimitBytes = computed(\n () => props.planConfig.storage.limit_bytes ?? 0,\n);\n\n// `planConfig` directly, not the provide above: a component never sees its own\n// `provide` (Vue resolves `inject` against the parent chain).\nconst { availableCategories } = useMediaCategories(planConfig);\n\nconst library = useMediaLibrary({\n projectId: props.projectId,\n authManager: props.authManager,\n onError: props.onError,\n});\n\nconst ui = useMediaLibraryUI({\n library,\n translations: t,\n});\n\n// Standalone-specific: confirm selection via callback\nfunction confirmSelection(): void {\n if (!library.previewItem.value) {\n return;\n }\n\n const item = library.previewItem.value;\n const itemWithSelectedUrl: MediaItem = {\n ...item,\n url: ui.selectedUrl.value || item.url,\n };\n props.onSelect?.(itemWithSelectedUrl);\n}\n\nonMounted(() => {\n library.loadItems();\n library.loadFrequentlyUsed();\n emit(\"ready\");\n});\n</script>\n\n<template>\n <div\n class=\"tpl tpl:flex tpl:flex-col tpl:overflow-hidden tpl:rounded-[var(--tpl-radius-lg)]\"\n style=\"\n width: 100%;\n height: 100%;\n background-color: var(--tpl-bg-elevated);\n border: 1px solid var(--tpl-border);\n \"\n >\n <!-- Header -->\n <div\n class=\"tpl:flex tpl:shrink-0 tpl:items-center tpl:justify-between tpl:border-b tpl:px-5 tpl:py-3.5\"\n style=\"border-color: var(--tpl-border)\"\n >\n <h2 class=\"tpl:text-sm tpl:font-semibold\" style=\"color: var(--tpl-text)\">\n {{ t.mediaLibrary.title }}\n </h2>\n <div class=\"tpl:flex tpl:items-center tpl:gap-3\">\n <StorageProgressRing\n :used-bytes=\"storageUsedBytes\"\n :limit-bytes=\"storageLimitBytes\"\n :size=\"22\"\n />\n <div class=\"tpl:relative\">\n <input\n :value=\"ui.searchInput.value\"\n type=\"text\"\n class=\"tpl:w-52 tpl:rounded-md tpl:border tpl:py-1.5 tpl:pr-3 tpl:pl-8 tpl:text-xs tpl:shadow-xs tpl:transition-all tpl:duration-150 tpl:outline-none tpl:focus:shadow-[var(--tpl-ring)]\"\n style=\"\n border-color: var(--tpl-border);\n background-color: var(--tpl-bg);\n color: var(--tpl-text);\n \"\n :placeholder=\"t.mediaLibrary.searchPlaceholder\"\n @input=\"\n ui.handleSearchInput(($event.target as HTMLInputElement).value)\n \"\n />\n <Search\n class=\"tpl:absolute tpl:top-1/2 tpl:left-2.5 tpl:-translate-y-1/2\"\n :size=\"13\"\n :stroke-width=\"2\"\n style=\"color: var(--tpl-text-dim)\"\n />\n </div>\n </div>\n </div>\n\n <!-- Body -->\n <div class=\"tpl:flex tpl:min-h-0 tpl:flex-1 tpl:overflow-hidden\">\n <!-- Sidebar (only when media folders feature is enabled and toggled on) -->\n <Transition\n enter-active-class=\"tpl:transition-all tpl:duration-200 tpl:ease-out\"\n enter-from-class=\"tpl:-ml-48 tpl:opacity-0\"\n enter-to-class=\"tpl:ml-0 tpl:opacity-100\"\n leave-active-class=\"tpl:transition-all tpl:duration-150 tpl:ease-in\"\n leave-from-class=\"tpl:ml-0 tpl:opacity-100\"\n leave-to-class=\"tpl:-ml-48 tpl:opacity-0\"\n >\n <div\n v-if=\"ui.showSidebar.value\"\n class=\"tpl:flex tpl:w-48 tpl:shrink-0 tpl:flex-col tpl:border-r\"\n style=\"\n border-color: var(--tpl-border);\n background-color: var(--tpl-bg);\n \"\n >\n <MediaFolderTree\n :folders=\"library.folders.value\"\n :current-folder-id=\"library.currentFolderId.value\"\n :view-mode=\"library.viewMode.value\"\n :has-frequently-used=\"ui.hasFrequentlyUsed.value\"\n @navigate=\"library.navigateToFolder\"\n @create-folder=\"ui.handleCreateFolder\"\n @rename-folder=\"ui.handleRenameFolder\"\n @delete-folder=\"ui.handleDeleteFolder\"\n @show-frequently-used=\"library.showFrequentlyUsed\"\n />\n </div>\n </Transition>\n\n <!-- Content area -->\n <div class=\"tpl:flex tpl:min-w-0 tpl:flex-1 tpl:flex-col\">\n <!-- Breadcrumb + Upload -->\n <div\n class=\"tpl:flex tpl:shrink-0 tpl:items-center tpl:justify-between tpl:border-b tpl:px-4 tpl:py-2.5\"\n style=\"border-color: var(--tpl-border)\"\n >\n <div class=\"tpl:flex tpl:items-center tpl:gap-2\">\n <!-- Sidebar toggle (only when media folders feature is enabled) -->\n <button\n class=\"tpl:flex tpl:size-7 tpl:cursor-pointer tpl:items-center tpl:justify-center tpl:rounded-md tpl:transition-all tpl:duration-150\"\n :style=\"{\n color: ui.showSidebar.value\n ? 'var(--tpl-primary)'\n : 'var(--tpl-text-muted)',\n backgroundColor: ui.showSidebar.value\n ? 'var(--tpl-bg)'\n : 'transparent',\n border: ui.showSidebar.value\n ? '1px solid var(--tpl-border)'\n : '1px solid transparent',\n }\"\n :title=\"\n ui.showSidebar.value\n ? t.mediaLibrary.hideFolders\n : t.mediaLibrary.showFolders\n \"\n @click=\"ui.showSidebar.value = !ui.showSidebar.value\"\n >\n <PanelLeft :size=\"16\" :stroke-width=\"2\" />\n </button>\n\n <template v-if=\"library.viewMode.value === 'frequently-used'\">\n <span\n class=\"tpl:text-xs tpl:font-medium\"\n style=\"color: var(--tpl-text)\"\n >\n {{ t.mediaLibrary.frequentlyUsed }}\n </span>\n </template>\n <template v-else>\n <MediaBreadcrumb\n :folders=\"library.folders.value\"\n :current-folder-id=\"library.currentFolderId.value\"\n @navigate=\"library.navigateToFolder\"\n />\n </template>\n\n <!-- Layout toggle -->\n <div\n class=\"tpl:flex tpl:rounded-md tpl:p-0.5\"\n style=\"\n border: 1px solid var(--tpl-border);\n background-color: var(--tpl-bg);\n \"\n >\n <button\n class=\"tpl:flex tpl:size-6 tpl:cursor-pointer tpl:items-center tpl:justify-center tpl:rounded tpl:transition-all tpl:duration-150\"\n :style=\"{\n color:\n ui.layoutMode.value === 'grid'\n ? 'var(--tpl-primary)'\n : 'var(--tpl-text-muted)',\n backgroundColor:\n ui.layoutMode.value === 'grid'\n ? 'var(--tpl-bg-elevated)'\n : 'transparent',\n }\"\n :title=\"t.mediaLibrary.viewGrid\"\n @click=\"ui.layoutMode.value = 'grid'\"\n >\n <Grid2x2 :size=\"14\" :stroke-width=\"2\" />\n </button>\n <button\n class=\"tpl:flex tpl:size-6 tpl:cursor-pointer tpl:items-center tpl:justify-center tpl:rounded tpl:transition-all tpl:duration-150\"\n :style=\"{\n color:\n ui.layoutMode.value === 'list'\n ? 'var(--tpl-primary)'\n : 'var(--tpl-text-muted)',\n backgroundColor:\n ui.layoutMode.value === 'list'\n ? 'var(--tpl-bg-elevated)'\n : 'transparent',\n }\"\n :title=\"t.mediaLibrary.viewList\"\n @click=\"ui.layoutMode.value = 'list'\"\n >\n <List :size=\"14\" :stroke-width=\"2\" />\n </button>\n </div>\n </div>\n\n <div class=\"tpl:flex tpl:items-center tpl:gap-2\">\n <select\n v-if=\"availableCategories.length > 1\"\n class=\"tpl:rounded-md tpl:border tpl:py-1.5 tpl:pr-7 tpl:pl-2.5 tpl:text-xs tpl:transition-all tpl:duration-150 tpl:outline-none\"\n style=\"\n border-color: var(--tpl-border);\n background-color: var(--tpl-bg);\n color: var(--tpl-text);\n \"\n :value=\"library.categoryFilter.value ?? ''\"\n @change=\"\n library.filterByCategory(\n ($event.target as HTMLSelectElement).value || null,\n )\n \"\n >\n <option value=\"\">\n {{ t.mediaLibrary.filterAll }}\n </option>\n <option\n v-for=\"category in availableCategories\"\n :key=\"category\"\n :value=\"category\"\n >\n {{ ui.getCategoryLabel(category) }}\n </option>\n </select>\n <select\n class=\"tpl:rounded-md tpl:border tpl:py-1.5 tpl:pr-7 tpl:pl-2.5 tpl:text-xs tpl:transition-all tpl:duration-150 tpl:outline-none\"\n style=\"\n border-color: var(--tpl-border);\n background-color: var(--tpl-bg);\n color: var(--tpl-text);\n \"\n :value=\"library.sortOption.value\"\n @change=\"\n library.sortBy(($event.target as HTMLSelectElement).value)\n \"\n >\n <option value=\"newest\">\n {{ t.mediaLibrary.sortNewest }}\n </option>\n <option value=\"oldest\">\n {{ t.mediaLibrary.sortOldest }}\n </option>\n <option value=\"name_asc\">\n {{ t.mediaLibrary.sortNameAsc }}\n </option>\n <option value=\"name_desc\">\n {{ t.mediaLibrary.sortNameDesc }}\n </option>\n <option value=\"size_asc\">\n {{ t.mediaLibrary.sortSizeAsc }}\n </option>\n <option value=\"size_desc\">\n {{ t.mediaLibrary.sortSizeDesc }}\n </option>\n </select>\n </div>\n </div>\n\n <!-- Scrollable content area -->\n <div class=\"tpl:min-h-0 tpl:flex-1 tpl:overflow-y-auto\">\n <!-- Upload zone (only in files mode) -->\n <div\n v-if=\"library.viewMode.value === 'files'\"\n class=\"tpl:px-4 tpl:pt-3\"\n >\n <MediaUploadZone\n :is-uploading=\"library.isUploading.value\"\n :upload-progress=\"library.uploadProgress.value\"\n @upload=\"ui.handleUpload\"\n />\n <button\n class=\"tpl:mt-2 tpl:flex tpl:w-full tpl:cursor-pointer tpl:items-center tpl:justify-center tpl:gap-1.5 tpl:rounded-md tpl:border tpl:border-dashed tpl:px-3 tpl:py-1.5 tpl:text-xs tpl:font-medium tpl:transition-all tpl:duration-150\"\n style=\"\n border-color: var(--tpl-border);\n color: var(--tpl-text-muted);\n background-color: var(--tpl-bg);\n \"\n @click=\"ui.showImportUrlModal.value = true\"\n >\n <Link :size=\"14\" :stroke-width=\"2\" />\n {{ t.mediaLibrary.importFromUrl }}\n </button>\n </div>\n\n <!-- Image grid -->\n <MediaGrid\n :items=\"ui.displayItems.value\"\n :selected-ids=\"library.selectedItems.value\"\n :is-loading=\"library.isLoading.value\"\n :has-more=\"\n library.viewMode.value === 'files' && library.hasMore.value\n \"\n :layout=\"ui.layoutMode.value\"\n @select=\"ui.handleSelect\"\n @toggle=\"library.toggleSelection\"\n @load-more=\"library.loadMore\"\n @edit=\"ui.handleEditItem\"\n @replace=\"ui.handleReplaceItem\"\n />\n </div>\n </div>\n </div>\n\n <!-- Import from URL Modal -->\n <MediaImportUrlModal\n :visible=\"ui.showImportUrlModal.value\"\n :is-importing=\"library.isImportingFromUrl.value\"\n :error=\"library.importFromUrlError.value\"\n @import=\"ui.handleImportFromUrl\"\n @close=\"ui.showImportUrlModal.value = false\"\n />\n\n <!-- Edit Modal -->\n <MediaEditModal\n :visible=\"!!ui.editingItem.value\"\n :item=\"ui.editingItem.value\"\n @save=\"ui.handleEditSave\"\n @close=\"ui.editingItem.value = null\"\n />\n\n <!-- Replace Modal -->\n <MediaReplaceModal\n :visible=\"library.showReplaceWarning.value\"\n :item=\"library.pendingReplaceItem.value\"\n :usage-info=\"library.replaceUsageInfo.value\"\n :is-replacing=\"library.isReplacing.value\"\n :error=\"library.replaceError.value\"\n @replace=\"ui.handleReplaceFile\"\n @close=\"library.cancelReplace\"\n />\n\n <!-- Delete Warning Dialog -->\n <Transition\n enter-active-class=\"tpl:transition tpl:ease-out tpl:duration-150\"\n enter-from-class=\"tpl:opacity-0\"\n enter-to-class=\"tpl:opacity-100\"\n leave-active-class=\"tpl:transition tpl:ease-in tpl:duration-100\"\n leave-from-class=\"tpl:opacity-100\"\n leave-to-class=\"tpl:opacity-0\"\n >\n <div\n v-if=\"library.showDeleteWarning.value\"\n class=\"tpl:absolute tpl:inset-0 tpl:z-10 tpl:flex tpl:items-center tpl:justify-center tpl:rounded-[var(--tpl-radius-lg)]\"\n style=\"\n background-color: rgba(0, 0, 0, 0.5);\n backdrop-filter: blur(8px);\n -webkit-backdrop-filter: blur(8px);\n \"\n @click.self=\"library.cancelDelete\"\n >\n <div\n class=\"tpl-scale-in tpl:mx-4 tpl:w-full tpl:max-w-sm tpl:rounded-[var(--tpl-radius-lg)] tpl:p-5\"\n style=\"\n background-color: var(--tpl-bg-elevated);\n box-shadow: var(--tpl-shadow-xl);\n \"\n >\n <h3\n class=\"tpl:mb-2 tpl:text-sm tpl:font-semibold\"\n style=\"color: var(--tpl-text)\"\n >\n {{ t.mediaLibrary.deleteWarningTitle }}\n </h3>\n <p\n class=\"tpl:text-xs\"\n :class=\"ui.hasUsedFiles.value ? 'tpl:mb-2' : 'tpl:mb-4'\"\n style=\"color: var(--tpl-text-muted)\"\n >\n {{ t.mediaLibrary.deleteWarningMessage }}\n </p>\n <p\n v-if=\"ui.hasUsedFiles.value\"\n class=\"tpl:mb-4 tpl:text-xs\"\n style=\"color: var(--tpl-text-muted)\"\n >\n {{ t.mediaLibrary.deleteWarningUsageNote }}\n </p>\n\n <div\n v-if=\"ui.hasUsedFiles.value\"\n class=\"tpl:mb-4 tpl:max-h-32 tpl:overflow-y-auto tpl:rounded tpl:border tpl:p-2\"\n style=\"border-color: var(--tpl-border)\"\n >\n <div\n v-for=\"(info, mediaId) in library.deleteUsageInfo.value\"\n :key=\"mediaId\"\n class=\"tpl:text-xs\"\n style=\"color: var(--tpl-text)\"\n >\n <template v-if=\"info.template_count > 0\">\n <span class=\"tpl:font-medium\">\n {{\n ui.displayItems.value.find((i) => i.id === mediaId)\n ?.filename || mediaId\n }}\n </span>\n <span style=\"color: var(--tpl-text-muted)\">\n -\n {{\n t.mediaLibrary.usedInTemplates.replace(\n \"{count}\",\n info.template_count.toString(),\n )\n }}\n </span>\n </template>\n </div>\n </div>\n\n <div class=\"tpl:flex tpl:justify-end tpl:gap-2\">\n <button\n class=\"tpl:cursor-pointer tpl:rounded-md tpl:border tpl:px-3 tpl:py-1.5 tpl:text-xs tpl:font-medium tpl:transition-all tpl:duration-150\"\n style=\"\n border-color: var(--tpl-border);\n color: var(--tpl-text);\n background-color: var(--tpl-bg);\n \"\n @click=\"library.cancelDelete\"\n >\n {{ t.mediaLibrary.cancel }}\n </button>\n <button\n class=\"tpl:cursor-pointer tpl:rounded-md tpl:border tpl:px-3 tpl:py-1.5 tpl:text-xs tpl:font-medium tpl:transition-all tpl:duration-150\"\n style=\"\n border-color: var(--tpl-danger);\n color: var(--tpl-danger);\n background-color: var(--tpl-danger-light);\n \"\n @click=\"library.confirmDelete\"\n >\n {{\n ui.hasUsedFiles.value\n ? t.mediaLibrary.deleteAnyway\n : t.mediaLibrary.confirmDelete\n }}\n </button>\n </div>\n </div>\n </div>\n </Transition>\n\n <!-- Footer -->\n <div\n class=\"tpl:flex tpl:shrink-0 tpl:items-center tpl:justify-between tpl:border-t tpl:px-5 tpl:py-3\"\n style=\"border-color: var(--tpl-border)\"\n >\n <div class=\"tpl:flex tpl:min-w-0 tpl:flex-1 tpl:items-center tpl:gap-3\">\n <MediaPreviewPanel\n v-if=\"library.previewItem.value\"\n v-model:selected-conversion=\"ui.selectedConversion.value\"\n :item=\"library.previewItem.value\"\n :folders=\"library.folders.value\"\n />\n </div>\n <div class=\"tpl:flex tpl:items-center tpl:gap-5\">\n <!-- Copy URL + Move group -->\n <div\n v-if=\"library.selectedItems.value.size > 0\"\n class=\"tpl:flex tpl:items-center tpl:gap-2\"\n >\n <button\n v-if=\"library.previewItem.value\"\n class=\"tpl:flex tpl:cursor-pointer tpl:items-center tpl:gap-1 tpl:rounded-md tpl:border tpl:px-3 tpl:py-1.5 tpl:text-xs tpl:font-medium tpl:transition-all tpl:duration-150\"\n :style=\"{\n borderColor: ui.copied.value\n ? 'var(--tpl-success)'\n : 'var(--tpl-border)',\n color: ui.copied.value ? 'var(--tpl-success)' : 'var(--tpl-text)',\n backgroundColor: 'var(--tpl-bg)',\n }\"\n @click=\"ui.copy(ui.selectedUrl.value!)\"\n >\n <Copy v-if=\"!ui.copied.value\" :size=\"12\" :stroke-width=\"2\" />\n <Check v-else :size=\"12\" :stroke-width=\"2\" />\n {{\n ui.copied.value ? t.mediaLibrary.copied : t.mediaLibrary.copyUrl\n }}\n </button>\n <div class=\"tpl:relative\">\n <button\n class=\"tpl:cursor-pointer tpl:rounded-md tpl:border tpl:px-3 tpl:py-1.5 tpl:text-xs tpl:font-medium tpl:transition-all tpl:duration-150\"\n style=\"\n border-color: var(--tpl-border);\n color: var(--tpl-text);\n background-color: var(--tpl-bg);\n \"\n @click=\"ui.showMovePicker.value = !ui.showMovePicker.value\"\n >\n {{ t.mediaLibrary.moveSelected }}\n </button>\n <MediaMovePicker\n v-if=\"ui.showMovePicker.value\"\n :folders=\"library.folders.value\"\n :current-folder-id=\"library.currentFolderId.value\"\n @select=\"ui.handleMoveToFolder\"\n @close=\"ui.showMovePicker.value = false\"\n />\n </div>\n </div>\n <!-- Delete + Select group -->\n <div class=\"tpl:flex tpl:items-center tpl:gap-2\">\n <button\n v-if=\"library.selectedItems.value.size > 0\"\n class=\"tpl:cursor-pointer tpl:rounded-md tpl:border tpl:px-3 tpl:py-1.5 tpl:text-xs tpl:font-medium tpl:transition-all tpl:duration-150\"\n style=\"\n border-color: var(--tpl-danger);\n color: var(--tpl-danger);\n background-color: var(--tpl-danger-light);\n \"\n @click=\"ui.handleDeleteClick\"\n >\n {{ t.mediaLibrary.deleteSelected }}\n </button>\n <button\n v-if=\"onSelect\"\n class=\"tpl:cursor-pointer tpl:rounded-md tpl:px-4 tpl:py-1.5 tpl:text-sm tpl:font-medium tpl:shadow-xs tpl:transition-all tpl:duration-150 tpl:hover:opacity-90 tpl:disabled:cursor-not-allowed tpl:disabled:opacity-50\"\n style=\"background-color: var(--tpl-primary); color: var(--tpl-bg)\"\n :disabled=\"!library.previewItem.value\"\n @click=\"confirmSelection\"\n >\n {{ t.mediaLibrary.selectFile }}\n </button>\n </div>\n </div>\n </div>\n </div>\n</template>\n","<script setup lang=\"ts\">\nimport MediaBreadcrumb from \"../components/media/MediaBreadcrumb.vue\";\nimport MediaEditModal from \"../components/media/MediaEditModal.vue\";\nimport MediaFolderTree from \"../components/media/MediaFolderTree.vue\";\nimport MediaGrid from \"../components/media/MediaGrid.vue\";\nimport MediaImportUrlModal from \"../components/media/MediaImportUrlModal.vue\";\nimport MediaMovePicker from \"../components/media/MediaMovePicker.vue\";\nimport MediaPreviewPanel from \"../components/media/MediaPreviewPanel.vue\";\nimport MediaReplaceModal from \"../components/media/MediaReplaceModal.vue\";\nimport MediaUploadZone from \"../components/media/MediaUploadZone.vue\";\nimport StorageProgressRing from \"../components/media/StorageProgressRing.vue\";\nimport { useMediaLibrary } from \"../composable\";\nimport { useMediaCategories } from \"../composables/useMediaCategories\";\nimport { useMediaLibraryUI } from \"../composables/useMediaLibraryUI\";\nimport type { PlanConfig, PlanFeatures } from \"@templatical/types\";\nimport type { MediaItem } from \"../types\";\nimport type { AuthManager } from \"@templatical/core/cloud\";\nimport type { MediaTranslations } from \"../i18n\";\nimport {\n Check,\n Copy,\n Grid2x2,\n Link,\n List,\n PanelLeft,\n Search,\n} from \"@lucide/vue\";\nimport { computed, onMounted, provide, ref } from \"vue\";\nimport { PLAN_CONFIG_KEY, TRANSLATIONS_KEY } from \"../keys\";\n\nconst props = defineProps<{\n authManager: AuthManager;\n projectId: string;\n planConfig: PlanConfig;\n translations: MediaTranslations;\n onSelect?: (item: MediaItem) => void;\n onError?: (error: Error) => void;\n}>();\n\nconst emit = defineEmits<{\n (e: \"ready\"): void;\n}>();\n\nconst t = computed(() => props.translations);\n\n// `TRANSLATIONS_KEY`, not the bare string it used to be: a string never\n// resolves the `Symbol` a host provides under the same name. Wrapped in a ref\n// because the key carries one — this shell always has its strings up front.\nprovide(TRANSLATIONS_KEY, ref(props.translations));\n\n// `useMediaCategories` (called by five descendants) needs a `UsePlanConfigReturn`;\n// the standalone SDK is handed a plain `PlanConfig`, so it adapts one here. Under\n// the shared `PLAN_CONFIG_KEY` — the same key `MediaLibraryModal` provides — so\n// the two hosts cannot drift on how it is spelled. `authManager` and `projectId`\n// are deliberately not provided alongside it: the modal takes them as props, and\n// nothing else in this package injects them.\nconst planConfigRef = ref<PlanConfig | null>(props.planConfig);\nconst planConfig = {\n config: planConfigRef,\n isLoading: ref(false),\n hasFeature: (feature: keyof PlanFeatures) =>\n props.planConfig.features[feature] ?? false,\n features: computed(() => props.planConfig.features),\n fetchConfig: async () => {},\n};\nprovide(PLAN_CONFIG_KEY, planConfig);\n\n// Folders and URL import render on every plan: gating Cloud's media *UI* meters\n// no resource Cloud buys, so the media tier is limits-only and every plan gets\n// the same library.\n\n// Storage info\nconst storageUsedBytes = computed(\n () => props.planConfig.storage.used_bytes ?? 0,\n);\nconst storageLimitBytes = computed(\n () => props.planConfig.storage.limit_bytes ?? 0,\n);\n\n// `planConfig` directly, not the provide above: a component never sees its own\n// `provide` (Vue resolves `inject` against the parent chain).\nconst { availableCategories } = useMediaCategories(planConfig);\n\nconst library = useMediaLibrary({\n projectId: props.projectId,\n authManager: props.authManager,\n onError: props.onError,\n});\n\nconst ui = useMediaLibraryUI({\n library,\n translations: t,\n});\n\n// Standalone-specific: confirm selection via callback\nfunction confirmSelection(): void {\n if (!library.previewItem.value) {\n return;\n }\n\n const item = library.previewItem.value;\n const itemWithSelectedUrl: MediaItem = {\n ...item,\n url: ui.selectedUrl.value || item.url,\n };\n props.onSelect?.(itemWithSelectedUrl);\n}\n\nonMounted(() => {\n library.loadItems();\n library.loadFrequentlyUsed();\n emit(\"ready\");\n});\n</script>\n\n<template>\n <div\n class=\"tpl tpl:flex tpl:flex-col tpl:overflow-hidden tpl:rounded-[var(--tpl-radius-lg)]\"\n style=\"\n width: 100%;\n height: 100%;\n background-color: var(--tpl-bg-elevated);\n border: 1px solid var(--tpl-border);\n \"\n >\n <!-- Header -->\n <div\n class=\"tpl:flex tpl:shrink-0 tpl:items-center tpl:justify-between tpl:border-b tpl:px-5 tpl:py-3.5\"\n style=\"border-color: var(--tpl-border)\"\n >\n <h2 class=\"tpl:text-sm tpl:font-semibold\" style=\"color: var(--tpl-text)\">\n {{ t.mediaLibrary.title }}\n </h2>\n <div class=\"tpl:flex tpl:items-center tpl:gap-3\">\n <StorageProgressRing\n :used-bytes=\"storageUsedBytes\"\n :limit-bytes=\"storageLimitBytes\"\n :size=\"22\"\n />\n <div class=\"tpl:relative\">\n <input\n :value=\"ui.searchInput.value\"\n type=\"text\"\n class=\"tpl:w-52 tpl:rounded-md tpl:border tpl:py-1.5 tpl:pr-3 tpl:pl-8 tpl:text-xs tpl:shadow-xs tpl:transition-all tpl:duration-150 tpl:outline-none tpl:focus:shadow-[var(--tpl-ring)]\"\n style=\"\n border-color: var(--tpl-border);\n background-color: var(--tpl-bg);\n color: var(--tpl-text);\n \"\n :placeholder=\"t.mediaLibrary.searchPlaceholder\"\n @input=\"\n ui.handleSearchInput(($event.target as HTMLInputElement).value)\n \"\n />\n <Search\n class=\"tpl:absolute tpl:top-1/2 tpl:left-2.5 tpl:-translate-y-1/2\"\n :size=\"13\"\n :stroke-width=\"2\"\n style=\"color: var(--tpl-text-dim)\"\n />\n </div>\n </div>\n </div>\n\n <!-- Body -->\n <div class=\"tpl:flex tpl:min-h-0 tpl:flex-1 tpl:overflow-hidden\">\n <!-- Sidebar (only when media folders feature is enabled and toggled on) -->\n <Transition\n enter-active-class=\"tpl:transition-all tpl:duration-200 tpl:ease-out\"\n enter-from-class=\"tpl:-ml-48 tpl:opacity-0\"\n enter-to-class=\"tpl:ml-0 tpl:opacity-100\"\n leave-active-class=\"tpl:transition-all tpl:duration-150 tpl:ease-in\"\n leave-from-class=\"tpl:ml-0 tpl:opacity-100\"\n leave-to-class=\"tpl:-ml-48 tpl:opacity-0\"\n >\n <div\n v-if=\"ui.showSidebar.value\"\n class=\"tpl:flex tpl:w-48 tpl:shrink-0 tpl:flex-col tpl:border-r\"\n style=\"\n border-color: var(--tpl-border);\n background-color: var(--tpl-bg);\n \"\n >\n <MediaFolderTree\n :folders=\"library.folders.value\"\n :current-folder-id=\"library.currentFolderId.value\"\n :view-mode=\"library.viewMode.value\"\n :has-frequently-used=\"ui.hasFrequentlyUsed.value\"\n @navigate=\"library.navigateToFolder\"\n @create-folder=\"ui.handleCreateFolder\"\n @rename-folder=\"ui.handleRenameFolder\"\n @delete-folder=\"ui.handleDeleteFolder\"\n @show-frequently-used=\"library.showFrequentlyUsed\"\n />\n </div>\n </Transition>\n\n <!-- Content area -->\n <div class=\"tpl:flex tpl:min-w-0 tpl:flex-1 tpl:flex-col\">\n <!-- Breadcrumb + Upload -->\n <div\n class=\"tpl:flex tpl:shrink-0 tpl:items-center tpl:justify-between tpl:border-b tpl:px-4 tpl:py-2.5\"\n style=\"border-color: var(--tpl-border)\"\n >\n <div class=\"tpl:flex tpl:items-center tpl:gap-2\">\n <!-- Sidebar toggle (only when media folders feature is enabled) -->\n <button\n class=\"tpl:flex tpl:size-7 tpl:cursor-pointer tpl:items-center tpl:justify-center tpl:rounded-md tpl:transition-all tpl:duration-150\"\n :style=\"{\n color: ui.showSidebar.value\n ? 'var(--tpl-primary)'\n : 'var(--tpl-text-muted)',\n backgroundColor: ui.showSidebar.value\n ? 'var(--tpl-bg)'\n : 'transparent',\n border: ui.showSidebar.value\n ? '1px solid var(--tpl-border)'\n : '1px solid transparent',\n }\"\n :title=\"\n ui.showSidebar.value\n ? t.mediaLibrary.hideFolders\n : t.mediaLibrary.showFolders\n \"\n @click=\"ui.showSidebar.value = !ui.showSidebar.value\"\n >\n <PanelLeft :size=\"16\" :stroke-width=\"2\" />\n </button>\n\n <template v-if=\"library.viewMode.value === 'frequently-used'\">\n <span\n class=\"tpl:text-xs tpl:font-medium\"\n style=\"color: var(--tpl-text)\"\n >\n {{ t.mediaLibrary.frequentlyUsed }}\n </span>\n </template>\n <template v-else>\n <MediaBreadcrumb\n :folders=\"library.folders.value\"\n :current-folder-id=\"library.currentFolderId.value\"\n @navigate=\"library.navigateToFolder\"\n />\n </template>\n\n <!-- Layout toggle -->\n <div\n class=\"tpl:flex tpl:rounded-md tpl:p-0.5\"\n style=\"\n border: 1px solid var(--tpl-border);\n background-color: var(--tpl-bg);\n \"\n >\n <button\n class=\"tpl:flex tpl:size-6 tpl:cursor-pointer tpl:items-center tpl:justify-center tpl:rounded tpl:transition-all tpl:duration-150\"\n :style=\"{\n color:\n ui.layoutMode.value === 'grid'\n ? 'var(--tpl-primary)'\n : 'var(--tpl-text-muted)',\n backgroundColor:\n ui.layoutMode.value === 'grid'\n ? 'var(--tpl-bg-elevated)'\n : 'transparent',\n }\"\n :title=\"t.mediaLibrary.viewGrid\"\n @click=\"ui.layoutMode.value = 'grid'\"\n >\n <Grid2x2 :size=\"14\" :stroke-width=\"2\" />\n </button>\n <button\n class=\"tpl:flex tpl:size-6 tpl:cursor-pointer tpl:items-center tpl:justify-center tpl:rounded tpl:transition-all tpl:duration-150\"\n :style=\"{\n color:\n ui.layoutMode.value === 'list'\n ? 'var(--tpl-primary)'\n : 'var(--tpl-text-muted)',\n backgroundColor:\n ui.layoutMode.value === 'list'\n ? 'var(--tpl-bg-elevated)'\n : 'transparent',\n }\"\n :title=\"t.mediaLibrary.viewList\"\n @click=\"ui.layoutMode.value = 'list'\"\n >\n <List :size=\"14\" :stroke-width=\"2\" />\n </button>\n </div>\n </div>\n\n <div class=\"tpl:flex tpl:items-center tpl:gap-2\">\n <select\n v-if=\"availableCategories.length > 1\"\n class=\"tpl:rounded-md tpl:border tpl:py-1.5 tpl:pr-7 tpl:pl-2.5 tpl:text-xs tpl:transition-all tpl:duration-150 tpl:outline-none\"\n style=\"\n border-color: var(--tpl-border);\n background-color: var(--tpl-bg);\n color: var(--tpl-text);\n \"\n :value=\"library.categoryFilter.value ?? ''\"\n @change=\"\n library.filterByCategory(\n ($event.target as HTMLSelectElement).value || null,\n )\n \"\n >\n <option value=\"\">\n {{ t.mediaLibrary.filterAll }}\n </option>\n <option\n v-for=\"category in availableCategories\"\n :key=\"category\"\n :value=\"category\"\n >\n {{ ui.getCategoryLabel(category) }}\n </option>\n </select>\n <select\n class=\"tpl:rounded-md tpl:border tpl:py-1.5 tpl:pr-7 tpl:pl-2.5 tpl:text-xs tpl:transition-all tpl:duration-150 tpl:outline-none\"\n style=\"\n border-color: var(--tpl-border);\n background-color: var(--tpl-bg);\n color: var(--tpl-text);\n \"\n :value=\"library.sortOption.value\"\n @change=\"\n library.sortBy(($event.target as HTMLSelectElement).value)\n \"\n >\n <option value=\"newest\">\n {{ t.mediaLibrary.sortNewest }}\n </option>\n <option value=\"oldest\">\n {{ t.mediaLibrary.sortOldest }}\n </option>\n <option value=\"name_asc\">\n {{ t.mediaLibrary.sortNameAsc }}\n </option>\n <option value=\"name_desc\">\n {{ t.mediaLibrary.sortNameDesc }}\n </option>\n <option value=\"size_asc\">\n {{ t.mediaLibrary.sortSizeAsc }}\n </option>\n <option value=\"size_desc\">\n {{ t.mediaLibrary.sortSizeDesc }}\n </option>\n </select>\n </div>\n </div>\n\n <!-- Scrollable content area -->\n <div class=\"tpl:min-h-0 tpl:flex-1 tpl:overflow-y-auto\">\n <!-- Upload zone (only in files mode) -->\n <div\n v-if=\"library.viewMode.value === 'files'\"\n class=\"tpl:px-4 tpl:pt-3\"\n >\n <MediaUploadZone\n :is-uploading=\"library.isUploading.value\"\n :upload-progress=\"library.uploadProgress.value\"\n @upload=\"ui.handleUpload\"\n />\n <button\n class=\"tpl:mt-2 tpl:flex tpl:w-full tpl:cursor-pointer tpl:items-center tpl:justify-center tpl:gap-1.5 tpl:rounded-md tpl:border tpl:border-dashed tpl:px-3 tpl:py-1.5 tpl:text-xs tpl:font-medium tpl:transition-all tpl:duration-150\"\n style=\"\n border-color: var(--tpl-border);\n color: var(--tpl-text-muted);\n background-color: var(--tpl-bg);\n \"\n @click=\"ui.showImportUrlModal.value = true\"\n >\n <Link :size=\"14\" :stroke-width=\"2\" />\n {{ t.mediaLibrary.importFromUrl }}\n </button>\n </div>\n\n <!-- Image grid -->\n <MediaGrid\n :items=\"ui.displayItems.value\"\n :selected-ids=\"library.selectedItems.value\"\n :is-loading=\"library.isLoading.value\"\n :has-more=\"\n library.viewMode.value === 'files' && library.hasMore.value\n \"\n :layout=\"ui.layoutMode.value\"\n @select=\"ui.handleSelect\"\n @toggle=\"library.toggleSelection\"\n @load-more=\"library.loadMore\"\n @edit=\"ui.handleEditItem\"\n @replace=\"ui.handleReplaceItem\"\n />\n </div>\n </div>\n </div>\n\n <!-- Import from URL Modal -->\n <MediaImportUrlModal\n :visible=\"ui.showImportUrlModal.value\"\n :is-importing=\"library.isImportingFromUrl.value\"\n :error=\"library.importFromUrlError.value\"\n @import=\"ui.handleImportFromUrl\"\n @close=\"ui.showImportUrlModal.value = false\"\n />\n\n <!-- Edit Modal -->\n <MediaEditModal\n :visible=\"!!ui.editingItem.value\"\n :item=\"ui.editingItem.value\"\n @save=\"ui.handleEditSave\"\n @close=\"ui.editingItem.value = null\"\n />\n\n <!-- Replace Modal -->\n <MediaReplaceModal\n :visible=\"library.showReplaceWarning.value\"\n :item=\"library.pendingReplaceItem.value\"\n :usage-info=\"library.replaceUsageInfo.value\"\n :is-replacing=\"library.isReplacing.value\"\n :error=\"library.replaceError.value\"\n @replace=\"ui.handleReplaceFile\"\n @close=\"library.cancelReplace\"\n />\n\n <!-- Delete Warning Dialog -->\n <Transition\n enter-active-class=\"tpl:transition tpl:ease-out tpl:duration-150\"\n enter-from-class=\"tpl:opacity-0\"\n enter-to-class=\"tpl:opacity-100\"\n leave-active-class=\"tpl:transition tpl:ease-in tpl:duration-100\"\n leave-from-class=\"tpl:opacity-100\"\n leave-to-class=\"tpl:opacity-0\"\n >\n <div\n v-if=\"library.showDeleteWarning.value\"\n class=\"tpl:absolute tpl:inset-0 tpl:z-10 tpl:flex tpl:items-center tpl:justify-center tpl:rounded-[var(--tpl-radius-lg)]\"\n style=\"\n background-color: rgba(0, 0, 0, 0.5);\n backdrop-filter: blur(8px);\n -webkit-backdrop-filter: blur(8px);\n \"\n @click.self=\"library.cancelDelete\"\n >\n <div\n class=\"tpl-scale-in tpl:mx-4 tpl:w-full tpl:max-w-sm tpl:rounded-[var(--tpl-radius-lg)] tpl:p-5\"\n style=\"\n background-color: var(--tpl-bg-elevated);\n box-shadow: var(--tpl-shadow-xl);\n \"\n >\n <h3\n class=\"tpl:mb-2 tpl:text-sm tpl:font-semibold\"\n style=\"color: var(--tpl-text)\"\n >\n {{ t.mediaLibrary.deleteWarningTitle }}\n </h3>\n <p\n class=\"tpl:text-xs\"\n :class=\"ui.hasUsedFiles.value ? 'tpl:mb-2' : 'tpl:mb-4'\"\n style=\"color: var(--tpl-text-muted)\"\n >\n {{ t.mediaLibrary.deleteWarningMessage }}\n </p>\n <p\n v-if=\"ui.hasUsedFiles.value\"\n class=\"tpl:mb-4 tpl:text-xs\"\n style=\"color: var(--tpl-text-muted)\"\n >\n {{ t.mediaLibrary.deleteWarningUsageNote }}\n </p>\n\n <div\n v-if=\"ui.hasUsedFiles.value\"\n class=\"tpl:mb-4 tpl:max-h-32 tpl:overflow-y-auto tpl:rounded tpl:border tpl:p-2\"\n style=\"border-color: var(--tpl-border)\"\n >\n <div\n v-for=\"(info, mediaId) in library.deleteUsageInfo.value\"\n :key=\"mediaId\"\n class=\"tpl:text-xs\"\n style=\"color: var(--tpl-text)\"\n >\n <template v-if=\"info.template_count > 0\">\n <span class=\"tpl:font-medium\">\n {{\n ui.displayItems.value.find((i) => i.id === mediaId)\n ?.filename || mediaId\n }}\n </span>\n <span style=\"color: var(--tpl-text-muted)\">\n -\n {{\n t.mediaLibrary.usedInTemplates.replace(\n \"{count}\",\n info.template_count.toString(),\n )\n }}\n </span>\n </template>\n </div>\n </div>\n\n <div class=\"tpl:flex tpl:justify-end tpl:gap-2\">\n <button\n class=\"tpl:cursor-pointer tpl:rounded-md tpl:border tpl:px-3 tpl:py-1.5 tpl:text-xs tpl:font-medium tpl:transition-all tpl:duration-150\"\n style=\"\n border-color: var(--tpl-border);\n color: var(--tpl-text);\n background-color: var(--tpl-bg);\n \"\n @click=\"library.cancelDelete\"\n >\n {{ t.mediaLibrary.cancel }}\n </button>\n <button\n class=\"tpl:cursor-pointer tpl:rounded-md tpl:border tpl:px-3 tpl:py-1.5 tpl:text-xs tpl:font-medium tpl:transition-all tpl:duration-150\"\n style=\"\n border-color: var(--tpl-danger);\n color: var(--tpl-danger);\n background-color: var(--tpl-danger-light);\n \"\n @click=\"library.confirmDelete\"\n >\n {{\n ui.hasUsedFiles.value\n ? t.mediaLibrary.deleteAnyway\n : t.mediaLibrary.confirmDelete\n }}\n </button>\n </div>\n </div>\n </div>\n </Transition>\n\n <!-- Footer -->\n <div\n class=\"tpl:flex tpl:shrink-0 tpl:items-center tpl:justify-between tpl:border-t tpl:px-5 tpl:py-3\"\n style=\"border-color: var(--tpl-border)\"\n >\n <div class=\"tpl:flex tpl:min-w-0 tpl:flex-1 tpl:items-center tpl:gap-3\">\n <MediaPreviewPanel\n v-if=\"library.previewItem.value\"\n v-model:selected-conversion=\"ui.selectedConversion.value\"\n :item=\"library.previewItem.value\"\n :folders=\"library.folders.value\"\n />\n </div>\n <div class=\"tpl:flex tpl:items-center tpl:gap-5\">\n <!-- Copy URL + Move group -->\n <div\n v-if=\"library.selectedItems.value.size > 0\"\n class=\"tpl:flex tpl:items-center tpl:gap-2\"\n >\n <button\n v-if=\"library.previewItem.value\"\n class=\"tpl:flex tpl:cursor-pointer tpl:items-center tpl:gap-1 tpl:rounded-md tpl:border tpl:px-3 tpl:py-1.5 tpl:text-xs tpl:font-medium tpl:transition-all tpl:duration-150\"\n :style=\"{\n borderColor: ui.copied.value\n ? 'var(--tpl-success)'\n : 'var(--tpl-border)',\n color: ui.copied.value ? 'var(--tpl-success)' : 'var(--tpl-text)',\n backgroundColor: 'var(--tpl-bg)',\n }\"\n @click=\"ui.copy(ui.selectedUrl.value!)\"\n >\n <Copy v-if=\"!ui.copied.value\" :size=\"12\" :stroke-width=\"2\" />\n <Check v-else :size=\"12\" :stroke-width=\"2\" />\n {{\n ui.copied.value ? t.mediaLibrary.copied : t.mediaLibrary.copyUrl\n }}\n </button>\n <div class=\"tpl:relative\">\n <button\n class=\"tpl:cursor-pointer tpl:rounded-md tpl:border tpl:px-3 tpl:py-1.5 tpl:text-xs tpl:font-medium tpl:transition-all tpl:duration-150\"\n style=\"\n border-color: var(--tpl-border);\n color: var(--tpl-text);\n background-color: var(--tpl-bg);\n \"\n @click=\"ui.showMovePicker.value = !ui.showMovePicker.value\"\n >\n {{ t.mediaLibrary.moveSelected }}\n </button>\n <MediaMovePicker\n v-if=\"ui.showMovePicker.value\"\n :folders=\"library.folders.value\"\n :current-folder-id=\"library.currentFolderId.value\"\n @select=\"ui.handleMoveToFolder\"\n @close=\"ui.showMovePicker.value = false\"\n />\n </div>\n </div>\n <!-- Delete + Select group -->\n <div class=\"tpl:flex tpl:items-center tpl:gap-2\">\n <button\n v-if=\"library.selectedItems.value.size > 0\"\n class=\"tpl:cursor-pointer tpl:rounded-md tpl:border tpl:px-3 tpl:py-1.5 tpl:text-xs tpl:font-medium tpl:transition-all tpl:duration-150\"\n style=\"\n border-color: var(--tpl-danger);\n color: var(--tpl-danger);\n background-color: var(--tpl-danger-light);\n \"\n @click=\"ui.handleDeleteClick\"\n >\n {{ t.mediaLibrary.deleteSelected }}\n </button>\n <button\n v-if=\"onSelect\"\n class=\"tpl:cursor-pointer tpl:rounded-md tpl:px-4 tpl:py-1.5 tpl:text-sm tpl:font-medium tpl:shadow-xs tpl:transition-all tpl:duration-150 tpl:hover:opacity-90 tpl:disabled:cursor-not-allowed tpl:disabled:opacity-50\"\n style=\"background-color: var(--tpl-primary); color: var(--tpl-bg)\"\n :disabled=\"!library.previewItem.value\"\n @click=\"confirmSelection\"\n >\n {{ t.mediaLibrary.selectFile }}\n </button>\n </div>\n </div>\n </div>\n </div>\n</template>\n","import { createSdkAuthManager } from \"@templatical/core/cloud\";\nimport type { PlanConfig } from \"@templatical/types\";\nimport { ApiClient } from \"@templatical/core/cloud\";\nimport MediaLibrary from \"./MediaLibrary.vue\";\nimport { loadMediaTranslations, type MediaTranslations } from \"../i18n\";\nimport type { MediaLibraryConfig, MediaLibraryInstance } from \"./types\";\nimport { createApp, h, ref, type App, type Ref } from \"vue\";\n\n// Import SDK styles\nimport \"../styles/index.css\";\n\n// Re-export types for consumers\nexport type { MediaFolder, MediaItem } from \"../types\";\nexport type { MediaLibraryConfig, MediaLibraryInstance } from \"./types\";\n\nlet appInstance: App | null = null;\nconst mediaLibraryRef: Ref<InstanceType<typeof MediaLibrary> | null> =\n ref(null);\n\nasync function init(config: MediaLibraryConfig): Promise<MediaLibraryInstance> {\n const container =\n typeof config.container === \"string\"\n ? document.querySelector(config.container)\n : config.container;\n\n if (!container) {\n throw new Error(`Container element not found: ${config.container}`);\n }\n\n // Initialize auth\n const authManager = createSdkAuthManager(config.auth, config.onError);\n await authManager.initialize();\n\n // Fetch plan config\n const apiClient = new ApiClient(authManager);\n const planConfig: PlanConfig = await apiClient.fetchConfig();\n\n // Load translations\n const translations: MediaTranslations = await loadMediaTranslations(\n config.locale ?? \"en\",\n );\n\n // Apply theme overrides to container\n applyTheme(container as HTMLElement, config.theme);\n\n // Unmount any prior app *after* awaits so concurrent init() calls don't\n // both pass an early check while appInstance is still null and orphan\n // the first-mounted app.\n if (appInstance) {\n unmount();\n }\n\n return new Promise((resolve, reject) => {\n try {\n appInstance = createApp({\n setup() {\n const onReady = () => {\n const instance: MediaLibraryInstance = {\n setTheme: (theme) => applyTheme(container as HTMLElement, theme),\n unmount,\n };\n\n resolve(instance);\n };\n\n return () =>\n h(MediaLibrary, {\n authManager,\n projectId: authManager.projectId,\n planConfig,\n translations,\n onSelect: config.onSelect,\n onError: config.onError,\n ref: mediaLibraryRef,\n onReady,\n });\n },\n });\n\n appInstance.mount(container);\n } catch (error) {\n reject(error);\n }\n });\n}\n\nfunction unmount(): void {\n if (appInstance) {\n appInstance.unmount();\n appInstance = null;\n mediaLibraryRef.value = null;\n }\n}\n\nfunction applyTheme(\n container: HTMLElement,\n theme?: { primaryColor?: string; borderRadius?: number },\n): void {\n if (!theme) {\n return;\n }\n\n if (theme.primaryColor) {\n container.style.setProperty(\"--tpl-primary\", theme.primaryColor);\n }\n\n if (theme.borderRadius !== undefined) {\n container.style.setProperty(\"--tpl-radius\", `${theme.borderRadius}px`);\n container.style.setProperty(\n \"--tpl-radius-sm\",\n `${Math.max(0, theme.borderRadius - 3)}px`,\n );\n container.style.setProperty(\n \"--tpl-radius-lg\",\n `${theme.borderRadius + 4}px`,\n );\n }\n}\n\nconst TemplaticalMedia = {\n init,\n unmount,\n};\n\n// Assign to window for IIFE usage\nif (typeof window !== \"undefined\") {\n (\n window as unknown as Window & { TemplaticalMedia: typeof TemplaticalMedia }\n ).TemplaticalMedia = TemplaticalMedia;\n}\n\n// Named exports for destructured imports\nexport { init, unmount };\n\n// Default export for library mode\nexport default TemplaticalMedia;\n"],"x_google_ignoreList":[8],"mappings":"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"}
|