@aswin.dev/editor 0.7.0 → 0.7.1

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.
Files changed (169) hide show
  1. package/README.md +3 -3
  2. package/dist/{AccessibilityPanel-CvQGLdu6.js → AccessibilityPanel-COL6Wm7p.js} +37 -37
  3. package/dist/{AiChatSidebar-B3SJIKG_.js → AiChatSidebar-DWGPVtvC.js} +68 -68
  4. package/dist/{AiFeatureMenu-BLLKoOos.js → AiFeatureMenu-duUFSfDf.js} +22 -22
  5. package/dist/{BlockA11yBadge-CXDLqkcJ.js → BlockA11yBadge-Qs6HtXid.js} +12 -12
  6. package/dist/CloudEditor-CFldoCOb.js +1207 -0
  7. package/dist/{CollaboratorBar-DuPYW5iF.js → CollaboratorBar-Bw-lbt61.js} +21 -21
  8. package/dist/CommentsSidebar-BaD5F53-.js +436 -0
  9. package/dist/CountdownBlock-DaYGxKqo.js +92 -0
  10. package/dist/CountdownToolbar-Dg4F8MTk.js +210 -0
  11. package/dist/{DesignReferenceSidebar-B8V_F2yF.js → DesignReferenceSidebar-BSH7uNP_.js} +58 -58
  12. package/dist/{LoadingTrack-B0CWFHXQ.js → LoadingTrack-Ba2pfF57.js} +2 -2
  13. package/dist/{ModuleBrowserModal-DrUFMTDx.js → ModuleBrowserModal-6phxZSKI.js} +80 -80
  14. package/dist/ModulePreviewCanvas-BW8L3eQX.js +108 -0
  15. package/dist/{NumberWithSuffix-DkXUez9t.js → NumberWithSuffix-BpUzQOJt.js} +87 -87
  16. package/dist/{ParagraphEditor-D75wl3BX.js → ParagraphEditor-DNSzAB-I.js} +182 -182
  17. package/dist/{RichTextEditorContent-DYkIauIk.js → RichTextEditorContent-CrqPQdnk.js} +38 -38
  18. package/dist/{SaveModuleDialog-FZ9lxY7_.js → SaveModuleDialog-zMQTpez7.js} +28 -28
  19. package/dist/{SnapshotHistory-BR3eV120.js → SnapshotHistory-Do-A5rYU.js} +45 -50
  20. package/dist/{TemplateScoringPanel-4GTNHej5.js → TemplateScoringPanel-CS7o62zS.js} +75 -75
  21. package/dist/{TestEmailModal--ue5w9fT.js → TestEmailModal-DGj_9V1u.js} +28 -28
  22. package/dist/{TitleEditor-fStSADI-.js → TitleEditor-C7IDnAoS.js} +68 -68
  23. package/dist/{TplModal-BwSfxIHf.js → TplModal-BAsVzcTb.js} +14 -14
  24. package/dist/{accessibility-e8JYu_zd.js → accessibility-BU09xZrQ.js} +1 -1
  25. package/dist/{blockTypeIcons-BcTrDjmH.js → blockTypeIcons-C6LDKvmd.js} +19 -5
  26. package/dist/bundle-stats.json +7 -7
  27. package/dist/{check-Da05j8yl.js → check-DJrpDKO_.js} +1 -1
  28. package/dist/{chevron-down-R2uY34iD.js → chevron-down-C5oBUhT8.js} +1 -1
  29. package/dist/chevron-right-BqCptpdp.js +10 -0
  30. package/dist/{circle-alert-DZuGWPX-.js → circle-alert-ZQQc98HC.js} +1 -1
  31. package/dist/{clock-CRp2sIub.js → clock-ik2pRJKG.js} +1 -1
  32. package/dist/{cloud-DEk_b4CR.js → cloud-6ZmAvF0j.js} +485 -427
  33. package/dist/{createLucideIcon-C3pa2siy.js → createLucideIcon-ClREiSx3.js} +6 -6
  34. package/dist/{de-Brqvgr43.js → de-DWcgp-7T.js} +209 -1
  35. package/dist/{dist-BaQIYPsn.js → dist-BUzw1buG.js} +1 -1
  36. package/dist/{dist-DjviJBCi.js → dist-BZyY-SS4.js} +1 -1
  37. package/dist/{dist-D6uC2xhi.js → dist-BadNx4qo.js} +1 -1
  38. package/dist/{dist-aRzjfSRN.js → dist-BesOh2mk.js} +1 -1
  39. package/dist/{dist-D90y8dvT.js → dist-Bz3M4RXG.js} +3 -3
  40. package/dist/dist-C04s_fLA.js +563 -0
  41. package/dist/{dist-DDJIWTRY.js → dist-C3T2AKtB.js} +1 -1
  42. package/dist/{dist-BFawx6IS.js → dist-C9ckKEZL.js} +51 -51
  43. package/dist/{dist-us-RpCWN.js → dist-CBItRG-Z.js} +1 -1
  44. package/dist/{dist-wzMIGj-D.js → dist-COSzWQUs.js} +1 -1
  45. package/dist/dist-CivF9P8b.js +382 -0
  46. package/dist/{dist-Cp0zXPAD.js → dist-DtiDUrX-.js} +1 -1
  47. package/dist/{dist-KoBJjK1G.js → dist-Dzt5foyL.js} +1 -1
  48. package/dist/{en-WDVp87TE.js → en-Cxd4fhNm.js} +209 -1
  49. package/dist/{extensions-CUcl9Ok4.js → extensions-D__hOlV1.js} +106 -106
  50. package/dist/{image-up-MBZKKg9p.js → image-up-DT7gcJLN.js} +1 -1
  51. package/dist/index.d.ts +88 -11
  52. package/dist/{info-CJEC7piy.js → info-BSPGcsSM.js} +1 -1
  53. package/dist/keys-CvX8D-8C.js +10 -0
  54. package/dist/{loader-circle-DsY5Yg33.js → loader-circle-Balo8p3d.js} +1 -1
  55. package/dist/{message-circle-yElBbR2C.js → message-circle-B39qAHxs.js} +1 -1
  56. package/dist/pencil-BZJPNYWR.js +10 -0
  57. package/dist/{refresh-cw-CE_AGtn8.js → refresh-cw-DwDqGUM0.js} +1 -1
  58. package/dist/{scan-line-D0vcUekt.js → scan-line-CzfFJO1o.js} +1 -1
  59. package/dist/{send-DH4oDQqC.js → send-D2eSo4GH.js} +1 -1
  60. package/dist/{shield-check-CfJgs2Hd.js → shield-check-jkpgcC0-.js} +1 -1
  61. package/dist/{sparkles-CvRXGqFs.js → sparkles-Chm5CZfb.js} +1 -1
  62. package/dist/style.css +1 -1
  63. package/dist/styleConstants-34eUKPOZ.js +55 -0
  64. package/dist/styles-B4tjX5SP.js +5224 -0
  65. package/dist/templatical-editor.js +189 -126
  66. package/dist/{text-align-start-BT9VUDxK.js → text-align-start-CzBnJsW8.js} +1 -1
  67. package/dist/{trash-2-DbP2Y6t2.js → trash-2-CtK2apEH.js} +1 -1
  68. package/dist/{triangle-alert-aOXceTSe.js → triangle-alert-KpDVNbpn.js} +1 -1
  69. package/dist/{useCloudI18n-BuIwR6OE.js → useCloudI18n-DOKSZql1.js} +2 -2
  70. package/dist/{useEditorCore-C6ost42Q.js → useEditorCore-wslttMH-.js} +2425 -2250
  71. package/dist/{useI18n-lb2DHDiu.js → useI18n-C2xQZ6K9.js} +2 -2
  72. package/dist/{useMergeTag-CBwKnnNB.js → useMergeTag-DX0XG5V9.js} +5 -5
  73. package/dist/{vue.runtime.esm-bundler-DpvJL-nX.js → vue.runtime.esm-bundler-CjauPXjj.js} +1 -1
  74. package/dist/{x-u2oVmjN_.js → x-BkaOMosX.js} +1 -1
  75. package/package.json +10 -10
  76. package/dist/CloudEditor-BCz1ZTYC.js +0 -1172
  77. package/dist/CommentsSidebar-B1pvJdqF.js +0 -441
  78. package/dist/CountdownBlock-BNSj1jvJ.js +0 -92
  79. package/dist/CountdownToolbar-ClJr2GzL.js +0 -210
  80. package/dist/ModulePreviewCanvas-CHdOwV_4.js +0 -106
  81. package/dist/cdn/chunks/AccessibilityPanel-B6DOjojm.js +0 -97
  82. package/dist/cdn/chunks/AccessibilityPanel-B6DOjojm.js.map +0 -1
  83. package/dist/cdn/chunks/AiFeatureMenu-qEdB2fZJ.js +0 -59
  84. package/dist/cdn/chunks/AiFeatureMenu-qEdB2fZJ.js.map +0 -1
  85. package/dist/cdn/chunks/BlockA11yBadge-DcEZftf6.js +0 -33
  86. package/dist/cdn/chunks/BlockA11yBadge-DcEZftf6.js.map +0 -1
  87. package/dist/cdn/chunks/CloudEditor-D2GsEC_n.js +0 -1143
  88. package/dist/cdn/chunks/CloudEditor-D2GsEC_n.js.map +0 -1
  89. package/dist/cdn/chunks/CollaboratorBar--nO7TX6b.js +0 -51
  90. package/dist/cdn/chunks/CollaboratorBar--nO7TX6b.js.map +0 -1
  91. package/dist/cdn/chunks/CountdownBlock-5YdT1uUu.js +0 -93
  92. package/dist/cdn/chunks/CountdownBlock-5YdT1uUu.js.map +0 -1
  93. package/dist/cdn/chunks/CountdownToolbar-DXPXrbAA.js +0 -212
  94. package/dist/cdn/chunks/CountdownToolbar-DXPXrbAA.js.map +0 -1
  95. package/dist/cdn/chunks/ModuleBrowserModal-DxoPp81s.js +0 -195
  96. package/dist/cdn/chunks/ModuleBrowserModal-DxoPp81s.js.map +0 -1
  97. package/dist/cdn/chunks/ModulePreviewCanvas-CoLdb4ar.js +0 -107
  98. package/dist/cdn/chunks/ModulePreviewCanvas-CoLdb4ar.js.map +0 -1
  99. package/dist/cdn/chunks/NumberWithSuffix-CE3NrZhH.js +0 -423
  100. package/dist/cdn/chunks/NumberWithSuffix-CE3NrZhH.js.map +0 -1
  101. package/dist/cdn/chunks/ParagraphEditor-B6Ygu-Mq.js +0 -544
  102. package/dist/cdn/chunks/ParagraphEditor-B6Ygu-Mq.js.map +0 -1
  103. package/dist/cdn/chunks/RichTextEditorContent-DL_y2SrR.js +0 -106
  104. package/dist/cdn/chunks/RichTextEditorContent-DL_y2SrR.js.map +0 -1
  105. package/dist/cdn/chunks/SaveModuleDialog-B0TnO_o9.js +0 -119
  106. package/dist/cdn/chunks/SaveModuleDialog-B0TnO_o9.js.map +0 -1
  107. package/dist/cdn/chunks/TitleEditor-BHpfxvwy.js +0 -171
  108. package/dist/cdn/chunks/TitleEditor-BHpfxvwy.js.map +0 -1
  109. package/dist/cdn/chunks/blockTypeIcons-BzzY9_kA.js +0 -22
  110. package/dist/cdn/chunks/blockTypeIcons-BzzY9_kA.js.map +0 -1
  111. package/dist/cdn/chunks/de-Ce-LbJ2J.js +0 -89
  112. package/dist/cdn/chunks/de-Ce-LbJ2J.js.map +0 -1
  113. package/dist/cdn/chunks/de-D8CnZxV9.js +0 -523
  114. package/dist/cdn/chunks/de-D8CnZxV9.js.map +0 -1
  115. package/dist/cdn/chunks/de-RQrZR56a.js +0 -209
  116. package/dist/cdn/chunks/de-RQrZR56a.js.map +0 -1
  117. package/dist/cdn/chunks/draggable-Bcb86AsV.js +0 -11572
  118. package/dist/cdn/chunks/draggable-Bcb86AsV.js.map +0 -1
  119. package/dist/cdn/chunks/emojiData-EMFlj6FJ.js +0 -19
  120. package/dist/cdn/chunks/emojiData-EMFlj6FJ.js.map +0 -1
  121. package/dist/cdn/chunks/en-8FHaQv4V.js +0 -523
  122. package/dist/cdn/chunks/en-8FHaQv4V.js.map +0 -1
  123. package/dist/cdn/chunks/en-Bl1ecfRF.js +0 -209
  124. package/dist/cdn/chunks/en-Bl1ecfRF.js.map +0 -1
  125. package/dist/cdn/chunks/en-DiCWK5fG.js +0 -89
  126. package/dist/cdn/chunks/en-DiCWK5fG.js.map +0 -1
  127. package/dist/cdn/chunks/extensions-DIxF31tA.js +0 -598
  128. package/dist/cdn/chunks/extensions-DIxF31tA.js.map +0 -1
  129. package/dist/cdn/chunks/features-DEMb13KS.js +0 -6814
  130. package/dist/cdn/chunks/features-DEMb13KS.js.map +0 -1
  131. package/dist/cdn/chunks/icons-CsLTcirh.js +0 -700
  132. package/dist/cdn/chunks/icons-CsLTcirh.js.map +0 -1
  133. package/dist/cdn/chunks/liquid.browser-lQbkge2E.js +0 -3279
  134. package/dist/cdn/chunks/liquid.browser-lQbkge2E.js.map +0 -1
  135. package/dist/cdn/chunks/media-library-CVaNvhpM.js +0 -6014
  136. package/dist/cdn/chunks/media-library-CVaNvhpM.js.map +0 -1
  137. package/dist/cdn/chunks/pusher-CDbNlZBE.js +0 -2508
  138. package/dist/cdn/chunks/pusher-CDbNlZBE.js.map +0 -1
  139. package/dist/cdn/chunks/quality-BaBfc54_.js +0 -1456
  140. package/dist/cdn/chunks/quality-BaBfc54_.js.map +0 -1
  141. package/dist/cdn/chunks/readableTextColor-DhoK4XiZ.js +0 -32
  142. package/dist/cdn/chunks/readableTextColor-DhoK4XiZ.js.map +0 -1
  143. package/dist/cdn/chunks/renderer-CUxvx7ro.js +0 -548
  144. package/dist/cdn/chunks/renderer-CUxvx7ro.js.map +0 -1
  145. package/dist/cdn/chunks/rolldown-runtime-BNuo_Jkg.js +0 -20
  146. package/dist/cdn/chunks/src-CRaqN-p8.js +0 -497
  147. package/dist/cdn/chunks/src-CRaqN-p8.js.map +0 -1
  148. package/dist/cdn/chunks/styleConstants-DP1VOca8.js +0 -57
  149. package/dist/cdn/chunks/styleConstants-DP1VOca8.js.map +0 -1
  150. package/dist/cdn/chunks/styles-BHJULjNR.js +0 -2947
  151. package/dist/cdn/chunks/styles-BHJULjNR.js.map +0 -1
  152. package/dist/cdn/chunks/tiptap-ZhwKyFp7.js +0 -14654
  153. package/dist/cdn/chunks/tiptap-ZhwKyFp7.js.map +0 -1
  154. package/dist/cdn/editor.css +0 -2
  155. package/dist/cdn/editor.js +0 -250
  156. package/dist/cdn/editor.js.map +0 -1
  157. package/dist/dist-B1IR0bpH.js +0 -326
  158. package/dist/dist-DJmnUmW9.js +0 -362
  159. package/dist/keys-ciNfSSGj.js +0 -10
  160. package/dist/styleConstants-fWzlIIwN.js +0 -55
  161. package/dist/styles-DEXEkBvg.js +0 -3176
  162. /package/dist/{_plugin-vue_export-helper-B0hnzhyu.js → _plugin-vue_export-helper-BVAJ4lgT.js} +0 -0
  163. /package/dist/{de-DCaaCE5s.js → de-GOtR9DwW.js} +0 -0
  164. /package/dist/{dist-iLBdeBDR.js → dist-DXa1uAMh.js} +0 -0
  165. /package/dist/{emojiData-PQyVa4bU.js → emojiData-DrBuvEoP.js} +0 -0
  166. /package/dist/{en-DXCyK4-X.js → en-dFFQVzNn.js} +0 -0
  167. /package/dist/{formatRelativeTime-BOEf47hq.js → formatRelativeTime-BhhO8yCl.js} +0 -0
  168. /package/dist/{liquid.browser-CdMv1BTn.js → liquid.browser-BvCyLQII.js} +0 -0
  169. /package/dist/{readableTextColor-CY3SiRnt.js → readableTextColor-DVuzNX1y.js} +0 -0
@@ -1 +0,0 @@
1
- {"version":3,"file":"media-library-CVaNvhpM.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/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.33_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/components/MediaLibraryModal.vue","../../../../media-library/src/components/MediaLibraryModal.vue"],"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 { MediaTranslations } from \"../i18n\";\nimport { type Ref, inject, isRef } from \"vue\";\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 * @param translationsOverride - Optional translations to use instead of injected value\n */\nexport function useI18n(\n translationsOverride?: MediaTranslations,\n): UseI18nReturn {\n const injected =\n translationsOverride ??\n inject<MediaTranslations | Ref<MediaTranslations>>(\"translations\")!;\n const t = isRef(injected) ? injected.value : injected;\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 { UsePlanConfigReturn } from \"@templatical/core/cloud\";\nimport type { MediaCategory, MediaCategoryData } from \"../types\";\nimport { computed, inject, type ComputedRef } from \"vue\";\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(): UseMediaCategoriesReturn {\n const planConfig = inject<UsePlanConfigReturn>(\"planConfig\")!;\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\"\n | \"square\"\n | \"landscape43\"\n | \"landscape169\"\n | \"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 targetHeight = maxHeight;\n targetWidth = Math.round(\n targetWidth *\n (maxHeight / (sourceHeight * (maxWidth ? maxWidth / sourceWidth : 1))),\n );\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 type { MediaItem } from \"../../types\";\nimport { computed, inject, ref, watch, type Ref } 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<Ref<\"light\" | \"dark\">>(\"tplUiTheme\");\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=\"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\"\n style=\"background-color: var(--tpl-overlay)\"\n @click.self=\"emit('close')\"\n @keydown=\"handleKeydown\"\n >\n <div\n class=\"tpl:mx-4 tpl:flex tpl:max-h-[90vh] 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 type { MediaItem } from \"../../types\";\nimport { computed, inject, ref, watch, type Ref } 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<Ref<\"light\" | \"dark\">>(\"tplUiTheme\");\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=\"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\"\n style=\"background-color: var(--tpl-overlay)\"\n @click.self=\"emit('close')\"\n @keydown=\"handleKeydown\"\n >\n <div\n class=\"tpl:mx-4 tpl:flex tpl:max-h-[90vh] 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 }}&times;{{ 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) }} &middot;\n {{ formatDate(item.created_at) }}\n <template\n v-if=\"\n isImageMimeType(item.mime_type) && item.width && item.height\n \"\n >\n &middot;\n {{ item.width }}&times;{{ 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 }}&times;{{ 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) }} &middot;\n {{ formatDate(item.created_at) }}\n <template\n v-if=\"\n isImageMimeType(item.mime_type) && item.width && item.height\n \"\n >\n &middot;\n {{ item.width }}&times;{{ 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 { LoaderCircle } from \"@lucide/vue\";\nimport { inject, ref, watch, type Ref } 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<Ref<\"light\" | \"dark\">>(\"tplUiTheme\");\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=\"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\"\n style=\"background-color: var(--tpl-overlay)\"\n @click.self=\"handleClose\"\n @keydown=\"handleKeydown\"\n >\n <div\n class=\"tpl:mx-4 tpl:w-full tpl:max-w-sm 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 { LoaderCircle } from \"@lucide/vue\";\nimport { inject, ref, watch, type Ref } 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<Ref<\"light\" | \"dark\">>(\"tplUiTheme\");\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=\"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\"\n style=\"background-color: var(--tpl-overlay)\"\n @click.self=\"handleClose\"\n @keydown=\"handleKeydown\"\n >\n <div\n class=\"tpl:mx-4 tpl:w-full tpl:max-w-sm 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 &middot; {{ formatDate(item.created_at) }}\n <template v-if=\"isImage && item.width && item.height\">\n &middot; {{ item.width }}&times;{{ item.height }}px\n </template>\n <template v-if=\"folderPath\">\n &middot;\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 || \"&nbsp;\" }}\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 &middot; {{ formatDate(item.created_at) }}\n <template v-if=\"isImage && item.width && item.height\">\n &middot; {{ item.width }}&times;{{ item.height }}px\n </template>\n <template v-if=\"folderPath\">\n &middot;\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 || \"&nbsp;\" }}\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 type { MediaItem, MediaUsageInfo } from \"../../types\";\nimport { computed, inject, ref, watch, type Ref } 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<Ref<\"light\" | \"dark\">>(\"tplUiTheme\");\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=\"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\"\n style=\"background-color: var(--tpl-overlay)\"\n @click.self=\"emit('close')\"\n @keydown=\"handleKeydown\"\n >\n <div\n class=\"tpl:mx-4 tpl:w-full tpl:max-w-sm 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 type { MediaItem, MediaUsageInfo } from \"../../types\";\nimport { computed, inject, ref, watch, type Ref } 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<Ref<\"light\" | \"dark\">>(\"tplUiTheme\");\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=\"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\"\n style=\"background-color: var(--tpl-overlay)\"\n @click.self=\"emit('close')\"\n @keydown=\"handleKeydown\"\n >\n <div\n class=\"tpl:mx-4 tpl:w-full tpl:max-w-sm 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 canUseMediaFolders: ComputedRef<boolean>;\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, canUseMediaFolders, 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 && canUseMediaFolders.value) {\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","<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 { useI18n } from \"../composables/useI18n\";\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, inject, watch, type ComputedRef, type Ref } from \"vue\";\n\nconst props = defineProps<{\n visible: boolean;\n accept?: MediaCategory[];\n}>();\n\nconst emit = defineEmits<{\n (e: \"close\"): void;\n (e: \"select\", item: MediaItem): void;\n}>();\n\nconst { t } = useI18n();\nconst tplUiTheme = inject<Ref<\"light\" | \"dark\">>(\"tplUiTheme\");\nconst authManager = inject<AuthManager>(\"authManager\")!;\nconst projectIdRef = inject<ComputedRef<string>>(\"projectId\")!;\nconst projectId = computed(() => projectIdRef.value);\nconst planConfig = inject<UsePlanConfigReturn>(\"planConfig\")!;\n\n// Feature flags\nconst canUseMediaFolders = computed(() =>\n planConfig.hasFeature(\"media_folders\"),\n);\nconst canImportFromUrl = computed(() =>\n planConfig.hasFeature(\"import_from_url\"),\n);\n\n// Storage info\nconst storageUsedBytes = computed(\n () => planConfig.config.value?.storage.used_bytes ?? 0,\n);\nconst storageLimitBytes = computed(\n () => planConfig.config.value?.storage.limit_bytes ?? 0,\n);\n\nconst { isAcceptedMimeType, availableCategories } = useMediaCategories();\n\nconst library = useMediaLibrary({\n projectId: projectId.value,\n authManager,\n});\n\nconst ui = useMediaLibraryUI({\n library,\n canUseMediaFolders,\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=\"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 <div\n v-if=\"visible\"\n :data-tpl-theme=\"tplUiTheme\"\n class=\"tpl tpl-media-overlay tpl:fixed tpl:inset-0 tpl:z-[9999]\"\n @click.self=\"emit('close')\"\n >\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: 95vw;\n max-height: 90vh;\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=\"canUseMediaFolders && 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 v-if=\"canUseMediaFolders\"\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 v-if=\"canImportFromUrl\"\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 v-if=\"canUseMediaFolders\" 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 { useI18n } from \"../composables/useI18n\";\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, inject, watch, type ComputedRef, type Ref } from \"vue\";\n\nconst props = defineProps<{\n visible: boolean;\n accept?: MediaCategory[];\n}>();\n\nconst emit = defineEmits<{\n (e: \"close\"): void;\n (e: \"select\", item: MediaItem): void;\n}>();\n\nconst { t } = useI18n();\nconst tplUiTheme = inject<Ref<\"light\" | \"dark\">>(\"tplUiTheme\");\nconst authManager = inject<AuthManager>(\"authManager\")!;\nconst projectIdRef = inject<ComputedRef<string>>(\"projectId\")!;\nconst projectId = computed(() => projectIdRef.value);\nconst planConfig = inject<UsePlanConfigReturn>(\"planConfig\")!;\n\n// Feature flags\nconst canUseMediaFolders = computed(() =>\n planConfig.hasFeature(\"media_folders\"),\n);\nconst canImportFromUrl = computed(() =>\n planConfig.hasFeature(\"import_from_url\"),\n);\n\n// Storage info\nconst storageUsedBytes = computed(\n () => planConfig.config.value?.storage.used_bytes ?? 0,\n);\nconst storageLimitBytes = computed(\n () => planConfig.config.value?.storage.limit_bytes ?? 0,\n);\n\nconst { isAcceptedMimeType, availableCategories } = useMediaCategories();\n\nconst library = useMediaLibrary({\n projectId: projectId.value,\n authManager,\n});\n\nconst ui = useMediaLibraryUI({\n library,\n canUseMediaFolders,\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=\"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 <div\n v-if=\"visible\"\n :data-tpl-theme=\"tplUiTheme\"\n class=\"tpl tpl-media-overlay tpl:fixed tpl:inset-0 tpl:z-[9999]\"\n @click.self=\"emit('close')\"\n >\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: 95vw;\n max-height: 90vh;\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=\"canUseMediaFolders && 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 v-if=\"canUseMediaFolders\"\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 v-if=\"canImportFromUrl\"\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 v-if=\"canUseMediaFolders\" 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"],"x_google_ignoreList":[7],"mappings":"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"}