@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,2 +0,0 @@
1
- @import"https://fonts.bunny.net/css?family=geist:400,500,600";.tpl-loading-track[data-v-1ed538ec]{height:3px;width:100%;border-radius:9999px;background:linear-gradient(90deg,transparent 0%,color-mix(in srgb,var(--tpl-primary) 10%,transparent) 15%,color-mix(in srgb,var(--tpl-primary) 30%,transparent) 30%,var(--tpl-primary) 50%,color-mix(in srgb,var(--tpl-primary) 30%,transparent) 70%,color-mix(in srgb,var(--tpl-primary) 10%,transparent) 85%,transparent 100%);background-size:200% 100%;animation:tpl-loading-flow-1ed538ec 3s ease-in-out infinite}@keyframes tpl-loading-flow-1ed538ec{0%{background-position:100% 0}to{background-position:-100% 0}}.tpl-block--idle[data-v-850614e7]{outline:1.5px dashed color-mix(in srgb,var(--tpl-primary) 30%,transparent);outline-offset:-1px;transition:outline .15s cubic-bezier(.16,1,.3,1),box-shadow .15s cubic-bezier(.16,1,.3,1)}.tpl-block--idle[data-v-850614e7]:hover{outline:1.5px solid color-mix(in srgb,var(--tpl-primary) 50%,transparent);outline-offset:-1px;box-shadow:0 0 8px color-mix(in srgb,var(--tpl-primary) 8%,transparent)}.tpl-block--selected[data-v-850614e7]{outline:2px solid color-mix(in srgb,var(--tpl-primary) 60%,transparent);outline-offset:-1px;box-shadow:0 0 12px color-mix(in srgb,var(--tpl-primary) 15%,transparent);transition:outline .15s cubic-bezier(.16,1,.3,1),box-shadow .15s cubic-bezier(.16,1,.3,1)}.tpl-block-action-btn[data-v-850614e7]{color:var(--tpl-text-muted);background-color:transparent}.tpl-block-action-btn[data-v-850614e7]:hover{background-color:var(--tpl-bg-hover);color:var(--tpl-text)}.tpl-block-action-btn[data-v-850614e7]:active{transform:scale(.9)}.tpl-block-delete-btn[data-v-850614e7]:hover{background-color:var(--tpl-danger-light);color:var(--tpl-danger)}.tpl-condition-toggle[data-v-850614e7]:hover{background-color:var(--tpl-bg-hover)!important}.tpl-condition-toggle[data-v-850614e7]:active{transform:scale(.9)}.tpl-block-hidden-overlay[data-v-850614e7]{background-color:color-mix(in srgb,var(--tpl-bg) 60%,transparent)}.tpl-table-editable[data-v-4f49860b] th[contenteditable],.tpl-table-editable[data-v-4f49860b] td[contenteditable]{outline:none;cursor:text;min-width:2rem}.tpl-table-editable[data-v-4f49860b] th[contenteditable]:empty:before,.tpl-table-editable[data-v-4f49860b] td[contenteditable]:empty:before{content:attr(data-placeholder);color:var(--tpl-text-dim);pointer-events:none}.tpl-table-editable[data-v-4f49860b] th[contenteditable]:focus,.tpl-table-editable[data-v-4f49860b] td[contenteditable]:focus{outline:2px solid var(--tpl-primary);outline-offset:-2px;border-radius:1px}.tpl-ai-slide-enter-active[data-v-a55e4bff]{transition:transform .28s cubic-bezier(.16,1,.3,1)}.tpl-ai-slide-leave-active[data-v-a55e4bff]{transition:transform .2s cubic-bezier(.16,1,.3,1)}.tpl-ai-input-wrapper[data-v-a55e4bff]:focus-within{border-color:var(--tpl-primary);box-shadow:var(--tpl-ring)}.tpl-ai-send-btn[data-v-a55e4bff]:not(:disabled):hover{transform:scale(1.05)}.tpl-suggestion-btn[data-v-a55e4bff]:hover{border-color:var(--tpl-primary)!important;background-color:var(--tpl-primary-light)!important}.tpl-comments-slide-enter-active[data-v-d204f573]{transition:transform .28s cubic-bezier(.16,1,.3,1)}.tpl-comments-slide-leave-active[data-v-d204f573]{transition:transform .2s cubic-bezier(.16,1,.3,1)}.tpl-comments-input-wrapper[data-v-d204f573]:focus-within{border-color:var(--tpl-primary);box-shadow:var(--tpl-ring)}.tpl-comments-send-btn[data-v-d204f573]:not(:disabled):hover{transform:scale(1.05)}.tpl-comment-filter[data-v-d204f573]{color:var(--tpl-text-muted);background-color:transparent}.tpl-comment-filter[data-v-d204f573]:hover{background-color:var(--tpl-bg-hover);color:var(--tpl-text)}.tpl-comment-filter--active[data-v-d204f573]{background-color:var(--tpl-primary-light);color:var(--tpl-primary)}.tpl-comment-action[data-v-d204f573]{color:var(--tpl-text-dim);background-color:transparent}.tpl-comment-action[data-v-d204f573]:hover{background-color:var(--tpl-bg-hover);color:var(--tpl-text)}.tpl-comment-delete[data-v-d204f573]:hover{background-color:var(--tpl-danger-light);color:var(--tpl-danger)}.tpl-comment-card[data-v-d204f573],.tpl-comment-reply-card[data-v-d204f573]{border-color:var(--tpl-border);background-color:var(--tpl-bg)}.tpl-resolve-enter-active[data-v-d204f573],.tpl-resolve-leave-active[data-v-d204f573]{transition:opacity .3s ease,transform .3s ease}.tpl-resolve-enter-from[data-v-d204f573],.tpl-resolve-leave-to[data-v-d204f573]{opacity:0;transform:translateY(-4px)}.tpl-resolve-icon[data-v-d204f573]{transition:color .3s ease,transform .2s ease}.tpl-resolve-icon[data-v-d204f573]:active{transform:scale(1.3)}.tpl-replies-enter-active[data-v-d204f573],.tpl-replies-leave-active[data-v-d204f573]{transition:opacity .25s ease,transform .25s ease}.tpl-replies-enter-from[data-v-d204f573],.tpl-replies-leave-to[data-v-d204f573]{opacity:0;transform:translateY(-4px)}.tpl-design-slide-enter-active[data-v-bdbf8d0d]{transition:transform .28s cubic-bezier(.16,1,.3,1)}.tpl-design-slide-leave-active[data-v-bdbf8d0d]{transition:transform .2s cubic-bezier(.16,1,.3,1)}.tpl-design-prompt-input[data-v-bdbf8d0d]:focus{border-color:var(--tpl-primary);box-shadow:var(--tpl-ring)}.tpl-design-dropzone[data-v-bdbf8d0d]:hover{border-color:var(--tpl-primary)!important;background-color:var(--tpl-primary-light)!important}.tpl-scoring-slide-enter-active[data-v-3a059e8d]{transition:transform .28s cubic-bezier(.16,1,.3,1)}.tpl-scoring-slide-leave-active[data-v-3a059e8d]{transition:transform .2s cubic-bezier(.16,1,.3,1)}.tpl-scoring-fix-btn[data-v-3a059e8d]:not(:disabled):hover{border-color:var(--tpl-primary)!important;background-color:var(--tpl-primary-light)!important}hex-color-picker{--hcp-width: 200px}hex-color-picker::part(hue){border-radius:var(--tpl-radius-sm, 7px)}hex-color-picker::part(saturation){border-radius:var(--tpl-radius-sm, 7px) var(--tpl-radius-sm, 7px) 0 0}.tpl-canvas--dark-mode[data-v-5a826917] img,.tpl-canvas--dark-mode[data-v-5a826917] .tpl-block-actions,.tpl-canvas--dark-mode[data-v-5a826917] .tpl-condition-toggle,.tpl-canvas--dark-mode[data-v-5a826917] .tpl-block-hidden-overlay{filter:invert(1) hue-rotate(180deg)}.tpl-pulse-fill[data-v-358207dd]{animation:tpl-field-pulse-358207dd 1s ease-out}@keyframes tpl-field-pulse-358207dd{0%{box-shadow:0 0 color-mix(in srgb,var(--tpl-warning) 30%,transparent);background-color:color-mix(in srgb,var(--tpl-warning) 6%,transparent)}40%{box-shadow:0 0 0 3px color-mix(in srgb,var(--tpl-warning) 15%,transparent);background-color:color-mix(in srgb,var(--tpl-warning) 5%,transparent)}to{box-shadow:0 0 0 0 transparent;background-color:transparent}}@media(prefers-reduced-motion:reduce){.tpl-pulse-fill[data-v-358207dd]{animation:none}}input[type=number][data-v-9a9c8a07]::-webkit-outer-spin-button,input[type=number][data-v-9a9c8a07]::-webkit-inner-spin-button{-webkit-appearance:none;margin:0}input[type=number][data-v-9a9c8a07]{-moz-appearance:textfield}.tpl-collapsible[data-v-2ac88283]{display:grid;grid-template-rows:0fr;transition:grid-template-rows .2s cubic-bezier(.16,1,.3,1)}.tpl-collapsible--open[data-v-2ac88283]{grid-template-rows:1fr}.tpl-collapsible>div[data-v-2ac88283]{overflow:hidden}.tpl-icon-enter-active[data-v-af87d02a],.tpl-icon-leave-active[data-v-af87d02a]{transition:opacity .12s cubic-bezier(.16,1,.3,1),transform .12s cubic-bezier(.16,1,.3,1)}.tpl-icon-enter-from[data-v-af87d02a],.tpl-icon-leave-to[data-v-af87d02a]{opacity:0;transform:scale(.8)}.tpl-preview-toggle[data-v-af87d02a]:hover{background-color:var(--tpl-bg-hover)}.tpl-preview-toggle[data-v-af87d02a]:active{transform:scale(.92)}.tpl-icon-enter-active[data-v-f8694f76],.tpl-icon-leave-active[data-v-f8694f76]{transition:opacity .12s cubic-bezier(.16,1,.3,1),transform .12s cubic-bezier(.16,1,.3,1)}.tpl-icon-enter-from[data-v-f8694f76],.tpl-icon-leave-to[data-v-f8694f76]{opacity:0;transform:scale(.8)}.tpl-dark-mode-toggle[data-v-f8694f76]:hover{background-color:var(--tpl-bg-hover)}.tpl-dark-mode-toggle[data-v-f8694f76]:active{transform:scale(.92)}@layer properties{@supports (((-webkit-hyphens:none)) and (not (margin-trim:inline))) or ((-moz-orient:inline) and (not (color:rgb(from red r g b)))){*,:before,:after,::backdrop{--tw-translate-x:0;--tw-translate-y:0;--tw-translate-z:0;--tw-scale-x:1;--tw-scale-y:1;--tw-scale-z:1;--tw-space-y-reverse:0;--tw-space-x-reverse:0;--tw-border-style:solid;--tw-leading:initial;--tw-font-weight:initial;--tw-tracking:initial;--tw-ordinal:initial;--tw-slashed-zero:initial;--tw-numeric-figure:initial;--tw-numeric-spacing:initial;--tw-numeric-fraction:initial;--tw-shadow:0 0 #0000;--tw-shadow-color:initial;--tw-shadow-alpha:100%;--tw-inset-shadow:0 0 #0000;--tw-inset-shadow-color:initial;--tw-inset-shadow-alpha:100%;--tw-ring-color:initial;--tw-ring-shadow:0 0 #0000;--tw-inset-ring-color:initial;--tw-inset-ring-shadow:0 0 #0000;--tw-ring-inset:initial;--tw-ring-offset-width:0px;--tw-ring-offset-color:#fff;--tw-ring-offset-shadow:0 0 #0000;--tw-backdrop-blur:initial;--tw-backdrop-brightness:initial;--tw-backdrop-contrast:initial;--tw-backdrop-grayscale:initial;--tw-backdrop-hue-rotate:initial;--tw-backdrop-invert:initial;--tw-backdrop-opacity:initial;--tw-backdrop-saturate:initial;--tw-backdrop-sepia:initial;--tw-duration:initial;--tw-ease:initial;--tpl-comet-angle:0deg;--tpl-comet-start:100%}}}@layer theme{:root,:host{--tpl-radius-sm:.25rem;--tpl-radius-md:.375rem;--tpl-radius-lg:.5rem;--tpl-shadow-sm:0 1px 3px 0 #0000001a, 0 1px 2px -1px #0000001a;--tpl-shadow-md:0 4px 6px -1px #0000001a, 0 2px 4px -2px #0000001a;--tpl-shadow-lg:0 10px 15px -3px #0000001a, 0 4px 6px -4px #0000001a;--tpl-shadow-xl:0 20px 25px -5px #0000001a, 0 8px 10px -6px #0000001a}}@layer base,components;.tpl{--tpl-bg:oklch(99.5% .002 60);--tpl-bg-elevated:oklch(98% .004 60);--tpl-bg-hover:oklch(96% .006 60);--tpl-bg-active:oklch(93.5% .008 60);--tpl-border:oklch(92% .006 60);--tpl-border-light:oklch(86% .01 60);--tpl-text:oklch(18% .01 60);--tpl-text-muted:oklch(50% .015 60);--tpl-text-dim:oklch(68% .012 60);--tpl-primary:oklch(70% .16 55);--tpl-primary-hover:oklch(63% .17 55);--tpl-primary-light:oklch(95% .04 55);--tpl-secondary:oklch(60% .118 184.71);--tpl-secondary-hover:oklch(53.2% .105 186.39);--tpl-secondary-light:oklch(93.8% .03 186.82);--tpl-success:oklch(62.8% .194 155.1);--tpl-success-light:oklch(93.6% .043 163.51);--tpl-warning:oklch(76.9% .168 70.08);--tpl-warning-light:oklch(95% .038 73.59);--tpl-danger:oklch(63.7% .237 25.33);--tpl-danger-light:oklch(93.6% .032 17.72);--tpl-canvas-bg:oklch(97.5% .003 60);--tpl-radius:10px;--tpl-radius-sm:7px;--tpl-radius-lg:14px;--tpl-font-family:"Geist", ui-sans-serif, system-ui, sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Noto Color Emoji";--tpl-shadow-sm:0 1px 2px #00000008;--tpl-shadow:0 1px 2px #0000000a, 0 1px 3px #00000008;--tpl-shadow-md:0 2px 8px #0000000f, 0 1px 3px #0000000a;--tpl-shadow-lg:0 4px 16px #00000014, 0 2px 6px #0000000a;--tpl-shadow-xl:0 8px 32px #0000001a, 0 4px 12px #0000000f;--tpl-overlay:#00000080;--tpl-ring:0 0 0 3px var(--tpl-primary-light);--tpl-transition:.12s cubic-bezier(.16, 1, .3, 1)}.tpl[data-tpl-theme=dark]{--tpl-bg:oklch(16% .005 60);--tpl-bg-elevated:oklch(21% .006 60);--tpl-bg-hover:oklch(26% .007 60);--tpl-bg-active:oklch(30% .008 60);--tpl-border:oklch(30% .006 60);--tpl-border-light:oklch(38% .008 60);--tpl-text:oklch(93% .005 60);--tpl-text-muted:oklch(65% .01 60);--tpl-text-dim:oklch(50% .008 60);--tpl-primary:oklch(73% .15 55);--tpl-primary-hover:oklch(78% .14 55);--tpl-primary-light:oklch(28% .05 55);--tpl-secondary:oklch(63% .11 184.71);--tpl-secondary-hover:oklch(68% .1 186.39);--tpl-secondary-light:oklch(25% .03 186.82);--tpl-success:oklch(65% .18 155.1);--tpl-success-light:oklch(25% .04 163.51);--tpl-warning:oklch(78% .16 70.08);--tpl-warning-light:oklch(28% .04 73.59);--tpl-danger:oklch(65% .22 25.33);--tpl-danger-light:oklch(25% .04 17.72);--tpl-canvas-bg:oklch(10% .003 60);--tpl-shadow-sm:0 1px 2px #0003;--tpl-shadow:0 1px 2px #0000004d, 0 1px 3px #0003;--tpl-shadow-md:0 2px 8px #00000059, 0 1px 3px #00000040;--tpl-shadow-lg:0 4px 16px #0006, 0 2px 6px #0000004d;--tpl-shadow-xl:0 8px 32px #00000080, 0 4px 12px #00000059;--tpl-overlay:#000000b3;--tpl-ring:0 0 0 3px var(--tpl-primary-light)}.tpl[data-tpl-theme=dark] .tpl-canvas-wrapper{--tpl-bg-elevated:oklch(98% .004 60);--tpl-border-light:oklch(86% .01 60);--tpl-text:oklch(18% .01 60);--tpl-text-muted:oklch(50% .015 60);--tpl-text-dim:oklch(68% .012 60);--tpl-primary-light:oklch(95% .04 55);--tpl-primary-hover:oklch(60% .16 55);color:var(--tpl-text)}.tpl{height:100%;font-family:Geist,ui-sans-serif,system-ui,sans-serif,Apple Color Emoji,Segoe UI Emoji,Segoe UI Symbol,Noto Color Emoji;font-size:.875rem;line-height:var(--tw-leading,calc(1.25 / .875));--tw-leading:1.5;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale;background-color:var(--tpl-bg);min-height:600px;color:var(--tpl-text);line-height:1.5;font-family:var(--tpl-font-family);flex-direction:column;display:flex}.tpl button{cursor:pointer;background:0 0;border:none}.tpl button:focus-visible,.tpl input:focus-visible,.tpl select:focus-visible,.tpl textarea:focus-visible{box-shadow:var(--tpl-ring);outline:none}@keyframes tpl-dot-bounce{0%,80%,to{opacity:.3;transform:scale(.8)}40%{opacity:1;transform:scale(1)}}.tpl-dot{animation:1.2s ease-in-out infinite tpl-dot-bounce}@keyframes tpl-fade-in{0%{opacity:0;transform:translateY(4px)}to{opacity:1;transform:translateY(0)}}@keyframes tpl-slide-in-right{0%{opacity:0;transform:translate(16px)}to{opacity:1;transform:translate(0)}}@keyframes tpl-slide-in-up{0%{opacity:0;transform:translateY(8px)}to{opacity:1;transform:translateY(0)}}@keyframes tpl-shimmer{0%{background-position:-200% 0}to{background-position:200% 0}}.tpl-fade-in{animation:.2s cubic-bezier(.16,1,.3,1) tpl-fade-in}.tpl-slide-in-right{animation:.25s cubic-bezier(.16,1,.3,1) tpl-slide-in-right}.tpl-slide-in-up{animation:.2s cubic-bezier(.16,1,.3,1) tpl-slide-in-up}.tpl-shimmer{background:linear-gradient(90deg,var(--tpl-bg-hover) 25%,var(--tpl-bg-active) 50%,var(--tpl-bg-hover) 75%);background-size:200% 100%;animation:1.5s linear infinite tpl-shimmer}.tpl-preview-mode .tpl-block--idle,.tpl-preview-mode .tpl-block--idle:hover,.tpl-preview-mode .tpl-block--selected{box-shadow:none!important;outline:none!important}.tpl-preview-mode .tpl-block{cursor:default;pointer-events:none}.tpl-preview-mode .tpl-block-actions,.tpl-preview-mode .tpl-block-hidden-overlay,.tpl-preview-mode .tpl-condition-toggle,.tpl-preview-mode .tpl-comment-indicator,.tpl-preview-mode .tpl-collab-lock{display:none}.tpl-ghost{border:none!important;border-top:2px dotted var(--tpl-primary)!important;background-color:#0000!important;justify-content:center!important;align-items:center!important;width:100%!important;height:0!important;min-height:0!important;max-height:0!important;margin:12px 0!important;padding:0!important;display:flex!important;position:relative!important;overflow:visible!important}@supports (color:color-mix(in lab,red,red)){.tpl-ghost{border-top:2px dotted color-mix(in srgb,var(--tpl-primary) 50%,transparent)!important}}.tpl-ghost{box-shadow:none!important;border-radius:0!important}.tpl-ghost>*{display:none!important}.tpl-ghost:before{content:var(--tpl-drop-text,"Drop here");white-space:nowrap!important;color:var(--tpl-primary)!important;background-color:var(--tpl-primary)!important;padding:2px 8px!important;font-size:12px!important;font-weight:500!important;position:absolute!important;top:50%!important;left:50%!important;transform:translate(-50%,-50%)!important}@supports (color:color-mix(in lab,red,red)){.tpl-ghost:before{background-color:color-mix(in srgb,var(--tpl-primary) 15%,var(--tpl-bg))!important}}.tpl-ghost:before{border-radius:var(--tpl-radius-sm)!important;box-shadow:none!important}.tpl-dragging{opacity:.8;box-shadow:var(--tpl-shadow-xl)}.tpl-block--lifted{outline:2px dashed var(--tpl-primary)!important;outline-offset:2px!important;box-shadow:var(--tpl-shadow-xl),0 0 0 4px var(--tpl-primary)!important}@supports (color:color-mix(in lab,red,red)){.tpl-block--lifted{box-shadow:var(--tpl-shadow-xl),0 0 0 4px color-mix(in srgb,var(--tpl-primary) 20%,transparent)!important}}.tpl-block--lifted{transition:transform .15s cubic-bezier(.16,1,.3,1),box-shadow .15s cubic-bezier(.16,1,.3,1);transform:scale(1.01)}.tpl-sr-only{clip:rect(0,0,0,0);white-space:nowrap;border:0;width:1px;height:1px;margin:-1px;padding:0;position:absolute;overflow:hidden}.tpl-text-toolbar-btn{cursor:pointer;--tw-border-style:none;width:2rem;height:2rem;transition-property:all;transition-timing-function:var(--tw-ease,cubic-bezier(.4, 0, .2, 1));transition-duration:var(--tw-duration,.15s);--tw-duration:.15s;color:var(--tpl-text);background-color:#0000;border-style:none;border-radius:.25rem;justify-content:center;align-items:center;padding:0;transition-duration:.15s;display:flex}.tpl-text-toolbar-btn:hover{background-color:var(--tpl-bg-active)}.tpl-text-toolbar-btn--active{box-shadow:inset 0 0 0 1.5px var(--tpl-primary-hover);background-color:var(--tpl-primary)!important;color:var(--tpl-bg)!important}.tpl-text-toolbar-btn--active svg{stroke-width:2.75px}.tpl-text-content,.tpl-text-editable .tiptap{--tw-outline-style:none;outline-style:none}.tpl-text-editable{border-style:var(--tw-border-style);--tw-border-style:dashed;border-style:dashed;border-width:1px;border-color:var(--tpl-primary);border-radius:.25rem;min-height:1.5em;padding:.5rem}.tpl-text-content p,.tpl-text-editable .tiptap p{margin:0 0 .5rem}:is(.tpl-text-content p,.tpl-text-editable .tiptap p):last-child{margin-bottom:0}.tpl-text-content ul,.tpl-text-content ol,.tpl-text-editable .tiptap ul,.tpl-text-editable .tiptap ol{margin-block:.5rem;padding-left:1.5rem}.tpl-text-content li,.tpl-text-editable .tiptap li{margin-block:.25rem}.tpl-text-content s,.tpl-text-editable .tiptap s{text-decoration-line:line-through}.tpl-text-content sub,.tpl-text-editable .tiptap sub{vertical-align:sub;font-size:.75em}.tpl-text-content sup,.tpl-text-editable .tiptap sup{vertical-align:super;font-size:.75em}.tpl-text-content a,.tpl-text-editable a{color:var(--tpl-primary);text-decoration-line:underline}.tpl-text-content span[data-merge-tag],.tpl-text-editable span[data-merge-tag]{--tw-font-weight:500;background-color:var(--tpl-primary);border-radius:.25rem;align-items:center;margin-inline:.125rem;padding-block:.125rem;padding-inline:.375rem;font-size:.9em;font-weight:500;display:inline-flex}@supports (color:color-mix(in lab,red,red)){.tpl-text-content span[data-merge-tag],.tpl-text-editable span[data-merge-tag]{background-color:color-mix(in srgb,var(--tpl-primary) 20%,transparent)}}.tpl-text-content span[data-merge-tag],.tpl-text-editable span[data-merge-tag]{color:var(--tpl-primary)}.tpl-text-content span[data-logic-merge-tag],.tpl-text-editable span[data-logic-merge-tag]{--tw-font-weight:700;--tw-tracking:.025em;letter-spacing:.025em;text-transform:uppercase;border:1.5px solid var(--tpl-primary);background-color:#0000;border-radius:.25rem;align-items:center;margin-inline:.125rem;padding-block:.125rem;padding-inline:.375rem;font-size:.8em;font-weight:700;display:inline-flex}@supports (color:color-mix(in lab,red,red)){.tpl-text-content span[data-logic-merge-tag],.tpl-text-editable span[data-logic-merge-tag]{border:1.5px solid color-mix(in srgb,var(--tpl-primary) 50%,transparent)}}.tpl-text-content span[data-logic-merge-tag],.tpl-text-editable span[data-logic-merge-tag]{color:var(--tpl-primary)}.tpl-tooltip{position:relative}.tpl-tooltip:after{content:attr(data-tooltip);border-radius:var(--tpl-radius-sm);background-color:var(--tpl-text);color:var(--tpl-bg);white-space:normal;text-align:center;pointer-events:none;opacity:0;text-transform:none;z-index:50;max-width:220px;padding:4px 10px;font-size:12px;font-weight:500;line-height:1.4;transition:opacity .15s;position:absolute;top:calc(100% + 6px);left:50%;transform:translate(-50%)}.tpl-tooltip:before{content:"";border:4px solid #0000;border-bottom-color:var(--tpl-text);pointer-events:none;opacity:0;z-index:50;transition:opacity .15s;position:absolute;top:calc(100% + 2px);left:50%;transform:translate(-50%)}.tpl-tooltip:hover:after,.tpl-tooltip:hover:before{opacity:1}.tpl.tpl-media-overlay{background-color:var(--tpl-overlay);-webkit-backdrop-filter:blur(8px);height:100%;min-height:0;color:var(--tpl-text);flex-direction:row;justify-content:center;align-items:center;display:flex}.tpl.tpl-text-toolbar{flex-direction:row;height:auto;min-height:0;display:flex}.tpl.tpl-link-dialog{background-color:var(--tpl-overlay);flex-direction:row;justify-content:center;align-items:center;height:100%;min-height:0;display:flex}.tpl-upload-zone-active{border-color:var(--tpl-primary)!important;background-color:var(--tpl-primary-light)!important}@property --tpl-comet-angle{syntax:"<angle>";inherits:false;initial-value:0deg}@property --tpl-comet-start{syntax:"<percentage>";inherits:false;initial-value:100%}@keyframes tpl-ai-comet{0%{--tpl-comet-angle:0deg;--tpl-comet-start:100%}1%{--tpl-comet-angle:24deg;--tpl-comet-start:88%}5%{--tpl-comet-angle:120deg;--tpl-comet-start:60%}25%{--tpl-comet-angle:600deg;--tpl-comet-start:60%}33%{--tpl-comet-angle:720deg;--tpl-comet-start:100%}to{--tpl-comet-angle:720deg;--tpl-comet-start:100%}}.tpl-ai-btn--idle{background-color:var(--tpl-primary-light);color:var(--tpl-primary-hover);box-shadow:none;z-index:0;position:relative}.tpl-ai-btn--idle:before{content:"";border-radius:inherit;background:conic-gradient(from var(--tpl-comet-angle),transparent 0%,transparent var(--tpl-comet-start),var(--tpl-primary) 80%,var(--tpl-primary) 90%,var(--tpl-primary) 97%,transparent 100%);padding:2px;position:absolute;inset:-2px}@supports (color:color-mix(in lab,red,red)){.tpl-ai-btn--idle:before{background:conic-gradient(from var(--tpl-comet-angle),transparent 0%,transparent var(--tpl-comet-start),color-mix(in srgb,var(--tpl-primary) 40%,transparent) 80%,var(--tpl-primary) 90%,var(--tpl-primary) 97%,transparent 100%)}}.tpl-ai-btn--idle:before{z-index:-1;pointer-events:none;animation:20s linear 3s infinite tpl-ai-comet;-webkit-mask-image:linear-gradient(#fff 0 0),linear-gradient(#fff 0 0);mask-image:linear-gradient(#fff 0 0),linear-gradient(#fff 0 0);-webkit-mask-position:0 0,0 0;mask-position:0 0,0 0;-webkit-mask-size:auto,auto;mask-size:auto,auto;-webkit-mask-repeat:repeat,repeat;mask-repeat:repeat,repeat;-webkit-mask-clip:content-box,border-box;mask-clip:content-box,border-box;-webkit-mask-origin:content-box,border-box;mask-origin:content-box,border-box;-webkit-mask-composite:xor;mask-composite:exclude;-webkit-mask-source-type:auto,auto;mask-mode:match-source,match-source}.tpl-ai-btn--idle:hover{background-color:var(--tpl-primary);color:var(--tpl-bg);transform:translateY(-1px);box-shadow:0 0 0 3px var(--tpl-primary),0 4px 16px var(--tpl-primary)!important}@supports (color:color-mix(in lab,red,red)){.tpl-ai-btn--idle:hover{box-shadow:0 0 0 3px color-mix(in srgb,var(--tpl-primary) 20%,transparent),0 4px 16px color-mix(in srgb,var(--tpl-primary) 30%,transparent)!important}}.tpl-ai-btn--idle:hover:before{animation:none}.tpl-ai-btn--active{background-color:var(--tpl-primary-light);color:var(--tpl-primary-hover);border:1px solid var(--tpl-primary)}.tpl-ai-btn--active .tpl-ai-btn-icon{fill:var(--tpl-primary)}@supports (color:color-mix(in lab,red,red)){.tpl-ai-btn--active .tpl-ai-btn-icon{fill:color-mix(in srgb,var(--tpl-primary) 25%,transparent)}}.tpl-ai-btn--active:hover{background-color:var(--tpl-primary-light)}@supports (color:color-mix(in lab,red,red)){.tpl-ai-btn--active:hover{background-color:color-mix(in srgb,var(--tpl-primary-light) 80%,var(--tpl-primary))}}.tpl-merge-tag-delete:hover{color:var(--tpl-danger)!important}@media(prefers-reduced-motion:reduce){.tpl-pulse,.tpl-dot,.tpl-shimmer,.tpl-fade-in,.tpl-scale-in,.tpl-slide-in-right,.tpl-slide-in-up,.tpl-ai-btn--idle:before{animation:none}.tpl-shimmer{background:var(--tpl-bg-hover)}.tpl *,.tpl :before,.tpl :after{transition-duration:.01ms!important}.tpl-spinner{animation:1s linear infinite tpl-spin}}.tpl-restore-btn-enter-active[data-v-9ffdcb5e]{transition:opacity .2s cubic-bezier(.16,1,.3,1),transform .2s cubic-bezier(.16,1,.3,1)}.tpl-restore-btn-leave-active[data-v-9ffdcb5e]{transition:opacity .15s ease-in,transform .15s ease-in}.tpl-restore-btn-enter-from[data-v-9ffdcb5e],.tpl-restore-btn-leave-to[data-v-9ffdcb5e]{opacity:0;transform:translateY(-8px) scale(.9)}.tpl-restore-btn-enter-to[data-v-9ffdcb5e],.tpl-restore-btn-leave-from[data-v-9ffdcb5e]{opacity:1;transform:translateY(0) scale(1)}.tpl-restore-btn-enter-active[data-v-b332971f]{transition:opacity .2s cubic-bezier(.16,1,.3,1),transform .2s cubic-bezier(.16,1,.3,1)}.tpl-restore-btn-leave-active[data-v-b332971f]{transition:opacity .15s ease-in,transform .15s ease-in}.tpl-restore-btn-enter-from[data-v-b332971f],.tpl-restore-btn-leave-to[data-v-b332971f]{opacity:0;transform:translateY(-8px) scale(.9)}.tpl-restore-btn-enter-to[data-v-b332971f],.tpl-restore-btn-leave-from[data-v-b332971f]{opacity:1;transform:translateY(0) scale(1)}.tpl-ai-feature-menu-item[data-v-07839fa3]:hover{background-color:var(--tpl-bg-hover)!important}.tpl-module-delete-btn:hover{color:var(--tpl-danger)!important}.vue-advanced-cropper{text-align:center;position:relative;user-select:none;max-height:100%;max-width:100%;direction:ltr}.vue-advanced-cropper__stretcher{pointer-events:none;position:relative;max-width:100%;max-height:100%}.vue-advanced-cropper__image{user-select:none;position:absolute;transform-origin:center;max-width:none!important}.vue-advanced-cropper__background,.vue-advanced-cropper__foreground{opacity:1;background:#000;transform:translate(-50%,-50%);position:absolute;top:50%;left:50%}.vue-advanced-cropper__foreground{opacity:.5}.vue-advanced-cropper__boundaries{opacity:1;transform:translate(-50%,-50%);position:absolute;left:50%;top:50%}.vue-advanced-cropper__cropper-wrapper{width:100%;height:100%}.vue-advanced-cropper__image-wrapper{overflow:hidden;position:absolute;width:100%;height:100%}.vue-advanced-cropper__stencil-wrapper{position:absolute}.vue-simple-handler{display:block;background:#fff;height:10px;width:10px}.vue-handler-wrapper{position:absolute;transform:translate(-50%,-50%);width:30px;height:30px}.vue-handler-wrapper__draggable{width:100%;height:100%;display:flex;align-items:center;justify-content:center}.vue-handler-wrapper--west-north{cursor:nw-resize}.vue-handler-wrapper--north{cursor:n-resize}.vue-handler-wrapper--east-north{cursor:ne-resize}.vue-handler-wrapper--east{cursor:e-resize}.vue-handler-wrapper--east-south{cursor:se-resize}.vue-handler-wrapper--south{cursor:s-resize}.vue-handler-wrapper--west-south{cursor:sw-resize}.vue-handler-wrapper--west{cursor:w-resize}.vue-handler-wrapper--disabled{cursor:auto}.vue-line-wrapper{background:none;position:absolute;display:flex;align-items:center;justify-content:center}.vue-line-wrapper--north,.vue-line-wrapper--south{height:12px;width:100%;left:0;transform:translateY(-50%)}.vue-line-wrapper--north{top:0;cursor:n-resize}.vue-line-wrapper--south{top:100%;cursor:s-resize}.vue-line-wrapper--east,.vue-line-wrapper--west{width:12px;height:100%;transform:translate(-50%);top:0}.vue-line-wrapper--east{left:100%;cursor:e-resize}.vue-line-wrapper--west{left:0;cursor:w-resize}.vue-line-wrapper--disabled{cursor:auto}.vue-bounding-box{position:relative;height:100%;width:100%}.vue-bounding-box__handler{position:absolute}.vue-bounding-box__handler--west-north{left:0;top:0}.vue-bounding-box__handler--north{left:50%;top:0}.vue-bounding-box__handler--east-north{left:100%;top:0}.vue-bounding-box__handler--east{left:100%;top:50%}.vue-bounding-box__handler--east-south{left:100%;top:100%}.vue-bounding-box__handler--south{left:50%;top:100%}.vue-bounding-box__handler--west-south{left:0;top:100%}.vue-bounding-box__handler--west{left:0;top:50%}.vue-draggable-area{position:relative}.vue-preview-result{overflow:hidden;box-sizing:border-box;position:absolute;height:100%;width:100%}.vue-preview-result__wrapper{position:absolute}.vue-preview-result__image{pointer-events:none;position:relative;user-select:none;transform-origin:center;max-width:none!important}.vue-rectangle-stencil{position:absolute;height:100%;width:100%;box-sizing:border-box}.vue-rectangle-stencil__preview{position:absolute;width:100%;height:100%}.vue-rectangle-stencil--movable{cursor:move}.vue-circle-stencil{position:absolute;height:100%;width:100%;box-sizing:content-box;cursor:move}.vue-circle-stencil__preview{border-radius:50%;position:absolute;width:100%;height:100%}.vue-circle-stencil--movable{cursor:move}.vue-preview{overflow:hidden;box-sizing:border-box;position:relative}.vue-preview--fill{width:100%;height:100%;position:absolute}.vue-preview__wrapper{position:absolute;height:100%;width:100%}.vue-preview__image{pointer-events:none;position:absolute;user-select:none;transform-origin:center;max-width:none!important}.vue-simple-line{background:none;transition:border .5s;border-color:#ffffff4d;border-width:0;border-style:solid}.vue-simple-line--south,.vue-simple-line--north{height:0;width:100%}.vue-simple-line--east,.vue-simple-line--west{height:100%;width:0}.vue-simple-line--east{border-right-width:1px}.vue-simple-line--west{border-left-width:1px}.vue-simple-line--south{border-bottom-width:1px}.vue-simple-line--north{border-top-width:1px}.vue-simple-line--hover{opacity:1;border-color:#fff}[data-v-7c7d7d1f] .tpl-cropper-background{background-color:var(--tpl-bg)!important}[data-v-7c7d7d1f] .vue-advanced-cropper{background-color:transparent!important}[data-v-7c7d7d1f] .vue-advanced-cropper__background{background-color:var(--tpl-bg)!important}[data-v-7c7d7d1f] .vue-advanced-cropper__foreground{background-color:var(--tpl-overlay)!important}.tpl-media-item[data-v-78d7ed75]:not(.tpl-media-item--selected):hover{border-color:var(--tpl-border)!important}.tpl-media-list-item[data-v-78d7ed75]:hover{background-color:var(--tpl-bg-hover)!important}.tpl-list-icon[data-v-78d7ed75]{transform:scale(.35);transform-origin:center}.tpl-preview-icon[data-v-56be5670]{transform:scale(.45);transform-origin:center}@layer properties{@supports (((-webkit-hyphens:none)) and (not (margin-trim:inline))) or ((-moz-orient:inline) and (not (color:rgb(from red r g b)))){*,:before,:after,::backdrop{--tw-translate-x:0;--tw-translate-y:0;--tw-translate-z:0;--tw-scale-x:1;--tw-scale-y:1;--tw-scale-z:1;--tw-space-y-reverse:0;--tw-space-x-reverse:0;--tw-border-style:solid;--tw-leading:initial;--tw-font-weight:initial;--tw-tracking:initial;--tw-ordinal:initial;--tw-slashed-zero:initial;--tw-numeric-figure:initial;--tw-numeric-spacing:initial;--tw-numeric-fraction:initial;--tw-shadow:0 0 #0000;--tw-shadow-color:initial;--tw-shadow-alpha:100%;--tw-inset-shadow:0 0 #0000;--tw-inset-shadow-color:initial;--tw-inset-shadow-alpha:100%;--tw-ring-color:initial;--tw-ring-shadow:0 0 #0000;--tw-inset-ring-color:initial;--tw-inset-ring-shadow:0 0 #0000;--tw-ring-inset:initial;--tw-ring-offset-width:0px;--tw-ring-offset-color:#fff;--tw-ring-offset-shadow:0 0 #0000;--tw-backdrop-blur:initial;--tw-backdrop-brightness:initial;--tw-backdrop-contrast:initial;--tw-backdrop-grayscale:initial;--tw-backdrop-hue-rotate:initial;--tw-backdrop-invert:initial;--tw-backdrop-opacity:initial;--tw-backdrop-saturate:initial;--tw-backdrop-sepia:initial;--tw-duration:initial;--tw-ease:initial}}}@layer theme{:root,:host{--tpl-radius-sm:.25rem;--tpl-radius-md:.375rem;--tpl-radius-lg:.5rem;--tpl-shadow-sm:0 1px 3px 0 #0000001a, 0 1px 2px -1px #0000001a;--tpl-shadow-md:0 4px 6px -1px #0000001a, 0 2px 4px -2px #0000001a;--tpl-shadow-lg:0 10px 15px -3px #0000001a, 0 4px 6px -4px #0000001a;--tpl-shadow-xl:0 20px 25px -5px #0000001a, 0 8px 10px -6px #0000001a}}.tpl\:pointer-events-auto{pointer-events:auto}.tpl\:pointer-events-none{pointer-events:none}.tpl\:invisible{visibility:hidden}.tpl\:absolute{position:absolute}.tpl\:fixed{position:fixed}.tpl\:relative{position:relative}.tpl\:sticky{position:sticky}.tpl\:inset-0{inset:0}.tpl\:inset-y-1{inset-block:.25rem}.tpl\:-top-0\.5{top:-.125rem}.tpl\:-top-1{top:-.25rem}.tpl\:top-0{top:0}.tpl\:top-1{top:.25rem}.tpl\:top-1\.5{top:.375rem}.tpl\:top-1\/2{top:50%}.tpl\:top-2{top:.5rem}.tpl\:top-14{top:3.5rem}.tpl\:top-16{top:4rem}.tpl\:top-\[104px\]{top:104px}.tpl\:top-full{top:100%}.tpl\:-right-1{right:-.25rem}.tpl\:-right-2{right:-.5rem}.tpl\:right-0{right:0}.tpl\:right-1{right:.25rem}.tpl\:right-1\.5{right:.375rem}.tpl\:right-2{right:.5rem}.tpl\:right-2\.5{right:.625rem}.tpl\:right-\[320px\]{right:320px}.tpl\:right-\[360px\]{right:360px}.tpl\:right-\[680px\]{right:680px}.tpl\:bottom-0{bottom:0}.tpl\:bottom-full{bottom:100%}.tpl\:-left-1{left:-.25rem}.tpl\:left-0{left:0}.tpl\:left-1\.5{left:.375rem}.tpl\:left-1\/2{left:50%}.tpl\:left-2\.5{left:.625rem}.tpl\:left-3{left:.75rem}.tpl\:left-12{left:3rem}.tpl\:z-10{z-index:10}.tpl\:z-40{z-index:40}.tpl\:z-50{z-index:50}.tpl\:z-\[4\]{z-index:4}.tpl\:z-\[5\]{z-index:5}.tpl\:z-\[9999\]{z-index:9999}.tpl\:z-\[10000\]{z-index:10000}.tpl\:m-0{margin:0}.tpl\:m-6{margin:1.5rem}.tpl\:mx-0\.5{margin-inline:.125rem}.tpl\:mx-1{margin-inline:.25rem}.tpl\:mx-1\.5{margin-inline:.375rem}.tpl\:mx-3{margin-inline:.75rem}.tpl\:mx-4{margin-inline:1rem}.tpl\:mx-auto{margin-inline:auto}.tpl\:mt-0\.5{margin-top:.125rem}.tpl\:mt-1{margin-top:.25rem}.tpl\:mt-1\.5{margin-top:.375rem}.tpl\:mt-2{margin-top:.5rem}.tpl\:mt-3{margin-top:.75rem}.tpl\:mt-4{margin-top:1rem}.tpl\:\!mb-0{margin-bottom:0!important}.tpl\:mb-1{margin-bottom:.25rem}.tpl\:mb-1\.5{margin-bottom:.375rem}.tpl\:mb-2{margin-bottom:.5rem}.tpl\:mb-2\.5{margin-bottom:.625rem}.tpl\:mb-3{margin-bottom:.75rem}.tpl\:mb-3\.5{margin-bottom:.875rem}.tpl\:mb-4{margin-bottom:1rem}.tpl\:mb-px{margin-bottom:1px}.tpl\:-ml-48{margin-left:-12rem}.tpl\:ml-0{margin-left:0}.tpl\:ml-1{margin-left:.25rem}.tpl\:ml-5{margin-left:1.25rem}.tpl\:ml-auto{margin-left:auto}.tpl\:\!flex{display:flex!important}.tpl\:block{display:block}.tpl\:flex{display:flex}.tpl\:grid{display:grid}.tpl\:hidden{display:none}.tpl\:inline{display:inline}.tpl\:inline-block{display:inline-block}.tpl\:inline-flex{display:inline-flex}.tpl\:aspect-square{aspect-ratio:1}.tpl\:size-1\.5{width:.375rem;height:.375rem}.tpl\:size-2{width:.5rem;height:.5rem}.tpl\:size-3{width:.75rem;height:.75rem}.tpl\:size-3\.5{width:.875rem;height:.875rem}.tpl\:size-4{width:1rem;height:1rem}.tpl\:size-4\.5{width:1.125rem;height:1.125rem}.tpl\:size-5{width:1.25rem;height:1.25rem}.tpl\:size-6{width:1.5rem;height:1.5rem}.tpl\:size-7{width:1.75rem;height:1.75rem}.tpl\:size-8{width:2rem;height:2rem}.tpl\:size-10{width:2.5rem;height:2.5rem}.tpl\:size-12{width:3rem;height:3rem}.tpl\:size-16{width:4rem;height:4rem}.tpl\:size-full{width:100%;height:100%}.tpl\:h-0{height:0}.tpl\:h-2\.5{height:.625rem}.tpl\:h-3{height:.75rem}.tpl\:h-4{height:1rem}.tpl\:h-5{height:1.25rem}.tpl\:h-6{height:1.5rem}.tpl\:h-7{height:1.75rem}.tpl\:h-8{height:2rem}.tpl\:h-9{height:2.25rem}.tpl\:h-10{height:2.5rem}.tpl\:h-12{height:3rem}.tpl\:h-14{height:3.5rem}.tpl\:h-32{height:8rem}.tpl\:h-44{height:11rem}.tpl\:h-\[32px\]{height:32px}.tpl\:h-auto{height:auto}.tpl\:h-full{height:100%}.tpl\:max-h-24{max-height:6rem}.tpl\:max-h-32{max-height:8rem}.tpl\:max-h-40{max-height:10rem}.tpl\:max-h-48{max-height:12rem}.tpl\:max-h-56{max-height:14rem}.tpl\:max-h-64{max-height:16rem}.tpl\:max-h-\[50vh\]{max-height:50vh}.tpl\:max-h-\[80vh\]{max-height:80vh}.tpl\:max-h-\[90vh\]{max-height:90vh}.tpl\:min-h-0{min-height:0}.tpl\:min-h-6{min-height:1.5rem}.tpl\:min-h-10{min-height:2.5rem}.tpl\:min-h-\[1\.5em\]{min-height:1.5em}.tpl\:min-h-\[1em\]{min-height:1em}.tpl\:min-h-\[5rem\]{min-height:5rem}.tpl\:min-h-\[48px\]{min-height:48px}.tpl\:min-h-\[60px\]{min-height:60px}.tpl\:min-h-\[64px\]{min-height:64px}.tpl\:min-h-\[68px\]{min-height:68px}.tpl\:min-h-\[72px\]{min-height:72px}.tpl\:min-h-\[80px\]{min-height:80px}.tpl\:min-h-\[100px\]{min-height:100px}.tpl\:min-h-\[120px\]{min-height:120px}.tpl\:min-h-\[150px\]{min-height:150px}.tpl\:min-h-\[400px\]{min-height:400px}.tpl\:w-1\/2{width:50%}.tpl\:w-1\/3{width:33.3333%}.tpl\:w-2\/3{width:66.6667%}.tpl\:w-3\/4{width:75%}.tpl\:w-5\/6{width:83.3333%}.tpl\:w-8{width:2rem}.tpl\:w-9{width:2.25rem}.tpl\:w-10{width:2.5rem}.tpl\:w-12{width:3rem}.tpl\:w-16{width:4rem}.tpl\:w-20{width:5rem}.tpl\:w-28{width:7rem}.tpl\:w-32{width:8rem}.tpl\:w-36{width:9rem}.tpl\:w-40{width:10rem}.tpl\:w-48{width:12rem}.tpl\:w-52{width:13rem}.tpl\:w-56{width:14rem}.tpl\:w-72{width:18rem}.tpl\:w-\[280px\]{width:280px}.tpl\:w-\[300px\]{width:300px}.tpl\:w-\[320px\]{width:320px}.tpl\:w-\[360px\]{width:360px}.tpl\:w-\[400px\]{width:400px}.tpl\:w-\[600px\]{width:600px}.tpl\:w-full{width:100%}.tpl\:w-px{width:1px}.tpl\:max-w-2xl{max-width:42rem}.tpl\:max-w-\[220px\]{max-width:220px}.tpl\:max-w-\[240px\]{max-width:240px}.tpl\:max-w-\[320px\]{max-width:320px}.tpl\:max-w-\[600px\]{max-width:600px}.tpl\:max-w-\[1000px\]{max-width:1000px}.tpl\:max-w-full{max-width:100%}.tpl\:max-w-md{max-width:28rem}.tpl\:max-w-sm{max-width:24rem}.tpl\:min-w-0{min-width:0}.tpl\:min-w-6{min-width:1.5rem}.tpl\:min-w-\[20px\]{min-width:20px}.tpl\:min-w-\[200px\]{min-width:200px}.tpl\:flex-1{flex:1}.tpl\:shrink-0{flex-shrink:0}.tpl\:origin-top-right{transform-origin:100% 0}.tpl\:-translate-x-1\/2{--tw-translate-x: -50% ;translate:var(--tw-translate-x) var(--tw-translate-y)}.tpl\:-translate-x-full{--tw-translate-x:-100%;translate:var(--tw-translate-x) var(--tw-translate-y)}.tpl\:translate-x-0{--tw-translate-x: 0rem ;translate:var(--tw-translate-x) var(--tw-translate-y)}.tpl\:translate-x-4{--tw-translate-x: 1rem ;translate:var(--tw-translate-x) var(--tw-translate-y)}.tpl\:translate-x-full{--tw-translate-x:100%;translate:var(--tw-translate-x) var(--tw-translate-y)}.tpl\:-translate-y-1\/2{--tw-translate-y: -50% ;translate:var(--tw-translate-x) var(--tw-translate-y)}.tpl\:-translate-y-2{--tw-translate-y: -.5rem ;translate:var(--tw-translate-x) var(--tw-translate-y)}.tpl\:-translate-y-full{--tw-translate-y:-100%;translate:var(--tw-translate-x) var(--tw-translate-y)}.tpl\:translate-y-0{--tw-translate-y: 0rem ;translate:var(--tw-translate-x) var(--tw-translate-y)}.tpl\:translate-y-1{--tw-translate-y: .25rem ;translate:var(--tw-translate-x) var(--tw-translate-y)}.tpl\:translate-y-\[-8px\]{--tw-translate-y:-8px;translate:var(--tw-translate-x) var(--tw-translate-y)}.tpl\:scale-95{--tw-scale-x:95%;--tw-scale-y:95%;--tw-scale-z:95%;scale:var(--tw-scale-x) var(--tw-scale-y)}.tpl\:scale-100{--tw-scale-x:100%;--tw-scale-y:100%;--tw-scale-z:100%;scale:var(--tw-scale-x) var(--tw-scale-y)}.tpl\:-rotate-90{rotate:-90deg}.tpl\:rotate-0{rotate:0deg}.tpl\:rotate-45{rotate:45deg}.tpl\:rotate-90{rotate:90deg}.tpl\:rotate-180{rotate:180deg}.tpl\:animate-pulse{animation:2s cubic-bezier(.4,0,.6,1) infinite pulse}.tpl\:animate-spin{animation:1s linear infinite spin}.tpl\:cursor-default{cursor:default}.tpl\:cursor-grab{cursor:grab}.tpl\:cursor-help{cursor:help}.tpl\:cursor-not-allowed{cursor:not-allowed}.tpl\:cursor-pointer{cursor:pointer}.tpl\:resize-none{resize:none}.tpl\:resize-y{resize:vertical}.tpl\:list-none{list-style-type:none}.tpl\:grid-cols-2{grid-template-columns:repeat(2,minmax(0,1fr))}.tpl\:grid-cols-4{grid-template-columns:repeat(4,minmax(0,1fr))}.tpl\:grid-cols-10{grid-template-columns:repeat(10,minmax(0,1fr))}.tpl\:grid-cols-\[1fr_auto_1fr\]{grid-template-columns:1fr auto 1fr}.tpl\:flex-col{flex-direction:column}.tpl\:flex-wrap{flex-wrap:wrap}.tpl\:items-center{align-items:center}.tpl\:items-end{align-items:flex-end}.tpl\:items-start{align-items:flex-start}.tpl\:items-stretch{align-items:stretch}.tpl\:justify-between{justify-content:space-between}.tpl\:justify-center{justify-content:center}.tpl\:justify-end{justify-content:flex-end}.tpl\:gap-0{gap:0}.tpl\:gap-0\.5{gap:.125rem}.tpl\:gap-1{gap:.25rem}.tpl\:gap-1\.5{gap:.375rem}.tpl\:gap-2{gap:.5rem}.tpl\:gap-2\.5{gap:.625rem}.tpl\:gap-3{gap:.75rem}.tpl\:gap-4{gap:1rem}.tpl\:gap-5{gap:1.25rem}.tpl\:gap-6{gap:1.5rem}.tpl\:gap-10{gap:2.5rem}:where(.tpl\:space-y-1>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(.25rem * var(--tw-space-y-reverse));margin-block-end:calc(.25rem * calc(1 - var(--tw-space-y-reverse)))}:where(.tpl\:space-y-2>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(.5rem * var(--tw-space-y-reverse));margin-block-end:calc(.5rem * calc(1 - var(--tw-space-y-reverse)))}:where(.tpl\:space-y-3>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(.75rem * var(--tw-space-y-reverse));margin-block-end:calc(.75rem * calc(1 - var(--tw-space-y-reverse)))}.tpl\:gap-x-1{column-gap:.25rem}:where(.tpl\:-space-x-1\.5>:not(:last-child)){--tw-space-x-reverse:0;margin-inline-start:calc(-.375rem * var(--tw-space-x-reverse));margin-inline-end:calc(-.375rem * calc(1 - var(--tw-space-x-reverse)))}.tpl\:gap-y-0\.5{row-gap:.125rem}.tpl\:self-end{align-self:flex-end}.tpl\:self-start{align-self:flex-start}.tpl\:truncate{text-overflow:ellipsis;white-space:nowrap;overflow:hidden}.tpl\:overflow-auto{overflow:auto}.tpl\:overflow-hidden{overflow:hidden}.tpl\:overflow-x-auto{overflow-x:auto}.tpl\:overflow-y-auto{overflow-y:auto}.tpl\:rounded{border-radius:.25rem}.tpl\:rounded-\[calc\(var\(--tpl-radius-sm\)-2px\)\]{border-radius:calc(var(--tpl-radius-sm) - 2px)}.tpl\:rounded-\[var\(--tpl-radius\)\]{border-radius:var(--tpl-radius)}.tpl\:rounded-\[var\(--tpl-radius-lg\)\]{border-radius:var(--tpl-radius-lg)}.tpl\:rounded-\[var\(--tpl-radius-md\)\]{border-radius:var(--tpl-radius-md)}.tpl\:rounded-\[var\(--tpl-radius-sm\)\]{border-radius:var(--tpl-radius-sm)}.tpl\:rounded-full{border-radius:3.40282e38px}.tpl\:rounded-lg{border-radius:.5rem}.tpl\:rounded-md{border-radius:.375rem}.tpl\:rounded-sm{border-radius:.25rem}.tpl\:rounded-xl{border-radius:.75rem}.tpl\:rounded-l-\[var\(--tpl-radius-sm\)\]{border-top-left-radius:var(--tpl-radius-sm);border-bottom-left-radius:var(--tpl-radius-sm)}.tpl\:rounded-tl-lg{border-top-left-radius:.5rem}.tpl\:rounded-r-\[var\(--tpl-radius-sm\)\]{border-top-right-radius:var(--tpl-radius-sm);border-bottom-right-radius:var(--tpl-radius-sm)}.tpl\:rounded-r-none{border-top-right-radius:0;border-bottom-right-radius:0}.tpl\:border{border-style:var(--tw-border-style);border-width:1px}.tpl\:border-0{border-style:var(--tw-border-style);border-width:0}.tpl\:border-2{border-style:var(--tw-border-style);border-width:2px}.tpl\:border-x-0{border-inline-style:var(--tw-border-style);border-inline-width:0}.tpl\:border-y{border-block-style:var(--tw-border-style);border-block-width:1px}.tpl\:border-t{border-top-style:var(--tw-border-style);border-top-width:1px}.tpl\:border-r{border-right-style:var(--tw-border-style);border-right-width:1px}.tpl\:border-r-0{border-right-style:var(--tw-border-style);border-right-width:0}.tpl\:border-b{border-bottom-style:var(--tw-border-style);border-bottom-width:1px}.tpl\:border-l{border-left-style:var(--tw-border-style);border-left-width:1px}.tpl\:border-l-0{border-left-style:var(--tw-border-style);border-left-width:0}.tpl\:border-l-2{border-left-style:var(--tw-border-style);border-left-width:2px}.tpl\:border-dashed{--tw-border-style:dashed;border-style:dashed}.tpl\:border-none{--tw-border-style:none;border-style:none}.tpl\:border-\[var\(--tpl-bg\)\]{border-color:var(--tpl-bg)}.tpl\:border-\[var\(--tpl-border\)\]{border-color:var(--tpl-border)}.tpl\:border-\[var\(--tpl-border-light\)\]{border-color:var(--tpl-border-light)}.tpl\:border-\[var\(--tpl-danger\)\]{border-color:var(--tpl-danger)}.tpl\:border-\[var\(--tpl-primary\)\]{border-color:var(--tpl-primary)}.tpl\:border-\[var\(--tpl-warning\)\]{border-color:var(--tpl-warning)}.tpl\:border-transparent{border-color:#0000}.tpl\:border-b-\[var\(--tpl-border-light\)\]{border-bottom-color:var(--tpl-border-light)}.tpl\:border-l-transparent{border-left-color:#0000}.tpl\:bg-\[var\(--tpl-bg\)\]{background-color:var(--tpl-bg)}.tpl\:bg-\[var\(--tpl-bg-active\)\]{background-color:var(--tpl-bg-active)}.tpl\:bg-\[var\(--tpl-bg-elevated\)\]{background-color:var(--tpl-bg-elevated)}.tpl\:bg-\[var\(--tpl-bg-hover\)\]{background-color:var(--tpl-bg-hover)}.tpl\:bg-\[var\(--tpl-border\)\]{background-color:var(--tpl-border)}.tpl\:bg-\[var\(--tpl-canvas-bg\)\]{background-color:var(--tpl-canvas-bg)}.tpl\:bg-\[var\(--tpl-danger\)\]{background-color:var(--tpl-danger)}.tpl\:bg-\[var\(--tpl-danger-light\)\]{background-color:var(--tpl-danger-light)}.tpl\:bg-\[var\(--tpl-primary\)\]{background-color:var(--tpl-primary)}.tpl\:bg-\[var\(--tpl-primary-light\)\]{background-color:var(--tpl-primary-light)}.tpl\:bg-\[var\(--tpl-warning-light\)\]{background-color:var(--tpl-warning-light)}.tpl\:bg-black\/30{background-color:oklab(0% none none/.3)}.tpl\:bg-black\/40{background-color:oklab(0% none none/.4)}.tpl\:bg-transparent{background-color:#0000}.tpl\:bg-white\/90{background-color:#ffffffe6}.tpl\:object-contain{object-fit:contain}.tpl\:object-cover{object-fit:cover}.tpl\:p-0{padding:0}.tpl\:p-0\.5{padding:.125rem}.tpl\:p-1{padding:.25rem}.tpl\:p-1\.5{padding:.375rem}.tpl\:p-2{padding:.5rem}.tpl\:p-3{padding:.75rem}.tpl\:p-4{padding:1rem}.tpl\:p-5{padding:1.25rem}.tpl\:p-6{padding:1.5rem}.tpl\:p-8{padding:2rem}.tpl\:px-0\.5{padding-inline:.125rem}.tpl\:px-1{padding-inline:.25rem}.tpl\:px-1\.5{padding-inline:.375rem}.tpl\:px-2{padding-inline:.5rem}.tpl\:px-2\.5{padding-inline:.625rem}.tpl\:px-3{padding-inline:.75rem}.tpl\:px-3\.5{padding-inline:.875rem}.tpl\:px-4{padding-inline:1rem}.tpl\:px-5{padding-inline:1.25rem}.tpl\:px-6{padding-inline:1.5rem}.tpl\:px-8{padding-inline:2rem}.tpl\:px-10{padding-inline:2.5rem}.tpl\:py-0{padding-block:0}.tpl\:py-0\.5{padding-block:.125rem}.tpl\:py-1{padding-block:.25rem}.tpl\:py-1\.5{padding-block:.375rem}.tpl\:py-2{padding-block:.5rem}.tpl\:py-2\.5{padding-block:.625rem}.tpl\:py-3{padding-block:.75rem}.tpl\:py-3\.5{padding-block:.875rem}.tpl\:py-4{padding-block:1rem}.tpl\:py-5{padding-block:1.25rem}.tpl\:py-6{padding-block:1.5rem}.tpl\:py-8{padding-block:2rem}.tpl\:py-10{padding-block:2.5rem}.tpl\:py-12{padding-block:3rem}.tpl\:py-16{padding-block:4rem}.tpl\:py-\[5px\]{padding-block:5px}.tpl\:py-\[7px\]{padding-block:7px}.tpl\:py-px{padding-block:1px}.tpl\:pt-1{padding-top:.25rem}.tpl\:pt-2{padding-top:.5rem}.tpl\:pt-3{padding-top:.75rem}.tpl\:pt-4{padding-top:1rem}.tpl\:pr-2{padding-right:.5rem}.tpl\:pr-3{padding-right:.75rem}.tpl\:pr-4{padding-right:1rem}.tpl\:pr-6{padding-right:1.5rem}.tpl\:pr-7{padding-right:1.75rem}.tpl\:pr-8{padding-right:2rem}.tpl\:pb-1{padding-bottom:.25rem}.tpl\:pb-2{padding-bottom:.5rem}.tpl\:pb-3{padding-bottom:.75rem}.tpl\:pb-4{padding-bottom:1rem}.tpl\:pl-2{padding-left:.5rem}.tpl\:pl-2\.5{padding-left:.625rem}.tpl\:pl-3{padding-left:.75rem}.tpl\:pl-8{padding-left:2rem}.tpl\:pl-9{padding-left:2.25rem}.tpl\:pl-\[18px\]{padding-left:18px}.tpl\:text-center{text-align:center}.tpl\:text-left{text-align:left}.tpl\:font-mono{font-family:ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,Liberation Mono,Courier New,monospace}.tpl\:font-sans{font-family:Geist,ui-sans-serif,system-ui,sans-serif,Apple Color Emoji,Segoe UI Emoji,Segoe UI Symbol,Noto Color Emoji}.tpl\:text-4xl{font-size:2.25rem;line-height:var(--tw-leading,calc(2.5 / 2.25))}.tpl\:text-base{font-size:1rem;line-height:var(--tw-leading, 1.5 )}.tpl\:text-lg{font-size:1.125rem;line-height:var(--tw-leading,calc(1.75 / 1.125))}.tpl\:text-sm{font-size:.875rem;line-height:var(--tw-leading,calc(1.25 / .875))}.tpl\:text-xs{font-size:.75rem;line-height:var(--tw-leading,calc(1 / .75))}.tpl\:text-\[0\.8em\]{font-size:.8em}.tpl\:text-\[0\.9em\]{font-size:.9em}.tpl\:text-\[1em\]{font-size:1em}.tpl\:text-\[8px\]{font-size:8px}.tpl\:text-\[9px\]{font-size:9px}.tpl\:text-\[10px\]{font-size:10px}.tpl\:text-\[11px\]{font-size:11px}.tpl\:text-\[12px\]{font-size:12px}.tpl\:text-\[13px\]{font-size:13px}.tpl\:leading-normal{--tw-leading:1.5;line-height:1.5}.tpl\:leading-relaxed{--tw-leading:1.625;line-height:1.625}.tpl\:leading-snug{--tw-leading:1.375;line-height:1.375}.tpl\:leading-tight{--tw-leading:1.25;line-height:1.25}.tpl\:font-\[var\(--tpl-font-family\)\]{--tw-font-weight:var(--tpl-font-family);font-weight:var(--tpl-font-family)}.tpl\:font-bold{--tw-font-weight:700;font-weight:700}.tpl\:font-medium{--tw-font-weight:500;font-weight:500}.tpl\:font-normal{--tw-font-weight:400;font-weight:400}.tpl\:font-semibold{--tw-font-weight:600;font-weight:600}.tpl\:tracking-wide{--tw-tracking:.025em;letter-spacing:.025em}.tpl\:tracking-wider{--tw-tracking:.05em;letter-spacing:.05em}.tpl\:whitespace-nowrap{white-space:nowrap}.tpl\:whitespace-pre-wrap{white-space:pre-wrap}.tpl\:text-\[var\(--tpl-bg\)\]{color:var(--tpl-bg)}.tpl\:text-\[var\(--tpl-border\)\]{color:var(--tpl-border)}.tpl\:text-\[var\(--tpl-border-light\)\]{color:var(--tpl-border-light)}.tpl\:text-\[var\(--tpl-danger\)\]{color:var(--tpl-danger)}.tpl\:text-\[var\(--tpl-primary\)\]{color:var(--tpl-primary)}.tpl\:text-\[var\(--tpl-primary-hover\)\]{color:var(--tpl-primary-hover)}.tpl\:text-\[var\(--tpl-success\)\]{color:var(--tpl-success)}.tpl\:text-\[var\(--tpl-text\)\]{color:var(--tpl-text)}.tpl\:text-\[var\(--tpl-text-dim\)\]{color:var(--tpl-text-dim)}.tpl\:text-\[var\(--tpl-text-muted\)\]{color:var(--tpl-text-muted)}.tpl\:text-\[var\(--tpl-warning\)\]{color:var(--tpl-warning)}.tpl\:text-white{color:#fff}.tpl\:normal-case{text-transform:none}.tpl\:uppercase{text-transform:uppercase}.tpl\:italic{font-style:italic}.tpl\:tabular-nums{--tw-numeric-spacing:tabular-nums;font-variant-numeric:var(--tw-ordinal,) var(--tw-slashed-zero,) var(--tw-numeric-figure,) var(--tw-numeric-spacing,) var(--tw-numeric-fraction,)}.tpl\:no-underline{text-decoration-line:none}.tpl\:underline{text-decoration-line:underline}.tpl\:accent-\[var\(--tpl-primary\)\]{accent-color:var(--tpl-primary)}.tpl\:opacity-0{opacity:0}.tpl\:opacity-50{opacity:.5}.tpl\:opacity-60{opacity:.6}.tpl\:opacity-70{opacity:.7}.tpl\:opacity-90{opacity:.9}.tpl\:opacity-100{opacity:1}.tpl\:shadow{--tw-shadow:0 1px 3px 0 var(--tw-shadow-color,#0000001a), 0 1px 2px -1px var(--tw-shadow-color,#0000001a);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.tpl\:shadow-\[var\(--tpl-ring\)\]{--tw-shadow:var(--tpl-ring);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.tpl\:shadow-\[var\(--tpl-shadow\)\]{--tw-shadow:var(--tpl-shadow);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.tpl\:shadow-\[var\(--tpl-shadow-lg\)\]{--tw-shadow:var(--tpl-shadow-lg);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.tpl\:shadow-\[var\(--tpl-shadow-md\)\]{--tw-shadow:var(--tpl-shadow-md);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.tpl\:shadow-\[var\(--tpl-shadow-sm\)\]{--tw-shadow:var(--tpl-shadow-sm);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.tpl\:shadow-lg{--tw-shadow:0 10px 15px -3px var(--tw-shadow-color,#0000001a), 0 4px 6px -4px var(--tw-shadow-color,#0000001a);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.tpl\:shadow-md{--tw-shadow:0 4px 6px -1px var(--tw-shadow-color,#0000001a), 0 2px 4px -2px var(--tw-shadow-color,#0000001a);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.tpl\:shadow-sm{--tw-shadow:0 1px 3px 0 var(--tw-shadow-color,#0000001a), 0 1px 2px -1px var(--tw-shadow-color,#0000001a);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.tpl\:shadow-xl{--tw-shadow:0 20px 25px -5px var(--tw-shadow-color,#0000001a), 0 8px 10px -6px var(--tw-shadow-color,#0000001a);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.tpl\:shadow-xs{--tw-shadow:0 1px 2px 0 var(--tw-shadow-color,#0000000d);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.tpl\:ring-1{--tw-ring-shadow:var(--tw-ring-inset,) 0 0 0 calc(1px + var(--tw-ring-offset-width)) var(--tw-ring-color,currentcolor);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.tpl\:ring-\[var\(--tpl-border\)\]{--tw-ring-color:var(--tpl-border)}.tpl\:backdrop-blur-\[2px\]{--tw-backdrop-blur:blur(2px);-webkit-backdrop-filter:var(--tw-backdrop-blur,) var(--tw-backdrop-brightness,) var(--tw-backdrop-contrast,) var(--tw-backdrop-grayscale,) var(--tw-backdrop-hue-rotate,) var(--tw-backdrop-invert,) var(--tw-backdrop-opacity,) var(--tw-backdrop-saturate,) var(--tw-backdrop-sepia,);backdrop-filter:var(--tw-backdrop-blur,) var(--tw-backdrop-brightness,) var(--tw-backdrop-contrast,) var(--tw-backdrop-grayscale,) var(--tw-backdrop-hue-rotate,) var(--tw-backdrop-invert,) var(--tw-backdrop-opacity,) var(--tw-backdrop-saturate,) var(--tw-backdrop-sepia,)}.tpl\:transition{transition-property:color,background-color,border-color,outline-color,text-decoration-color,fill,stroke,--tw-gradient-from,--tw-gradient-via,--tw-gradient-to,opacity,box-shadow,transform,translate,scale,rotate,filter,-webkit-backdrop-filter,backdrop-filter,display,content-visibility,overlay,pointer-events;transition-timing-function:var(--tw-ease,cubic-bezier(.4, 0, .2, 1));transition-duration:var(--tw-duration,.15s)}.tpl\:transition-all{transition-property:all;transition-timing-function:var(--tw-ease,cubic-bezier(.4, 0, .2, 1));transition-duration:var(--tw-duration,.15s)}.tpl\:transition-colors{transition-property:color,background-color,border-color,outline-color,text-decoration-color,fill,stroke,--tw-gradient-from,--tw-gradient-via,--tw-gradient-to;transition-timing-function:var(--tw-ease,cubic-bezier(.4, 0, .2, 1));transition-duration:var(--tw-duration,.15s)}.tpl\:transition-opacity{transition-property:opacity;transition-timing-function:var(--tw-ease,cubic-bezier(.4, 0, .2, 1));transition-duration:var(--tw-duration,.15s)}.tpl\:transition-shadow{transition-property:box-shadow;transition-timing-function:var(--tw-ease,cubic-bezier(.4, 0, .2, 1));transition-duration:var(--tw-duration,.15s)}.tpl\:transition-transform{transition-property:transform,translate,scale,rotate;transition-timing-function:var(--tw-ease,cubic-bezier(.4, 0, .2, 1));transition-duration:var(--tw-duration,.15s)}.tpl\:duration-100{--tw-duration:.1s;transition-duration:.1s}.tpl\:duration-150{--tw-duration:.15s;transition-duration:.15s}.tpl\:duration-200{--tw-duration:.2s;transition-duration:.2s}.tpl\:duration-300{--tw-duration:.3s;transition-duration:.3s}.tpl\:duration-\[80ms\]{--tw-duration:80ms;transition-duration:80ms}.tpl\:duration-\[120ms\]{--tw-duration:.12s;transition-duration:.12s}.tpl\:ease-\[cubic-bezier\(0\.16\,1\,0\.3\,1\)\]{--tw-ease:cubic-bezier(.16,1,.3,1);transition-timing-function:cubic-bezier(.16,1,.3,1)}.tpl\:ease-in{--tw-ease:cubic-bezier(.4, 0, 1, 1);transition-timing-function:cubic-bezier(.4,0,1,1)}.tpl\:ease-out{--tw-ease:cubic-bezier(0, 0, .2, 1);transition-timing-function:cubic-bezier(0,0,.2,1)}.tpl\:outline-none{--tw-outline-style:none;outline-style:none}.tpl\:select-none{-webkit-user-select:none;user-select:none}@media(hover:hover){.tpl\:group-hover\:bg-black\/40:is(:where(.tpl\:group):hover *){background-color:oklab(0% none none/.4)}.tpl\:group-hover\:opacity-100:is(:where(.tpl\:group):hover *){opacity:1}}.tpl\:placeholder\:text-\[var\(--tpl-text-dim\)\]::placeholder{color:var(--tpl-text-dim)}.tpl\:last\:mb-0:last-child{margin-bottom:0}@media(hover:hover){.tpl\:hover\:z-10:hover{z-index:10}.tpl\:hover\:scale-110:hover{--tw-scale-x:110%;--tw-scale-y:110%;--tw-scale-z:110%;scale:var(--tw-scale-x) var(--tw-scale-y)}.tpl\:hover\:scale-125:hover{--tw-scale-x:125%;--tw-scale-y:125%;--tw-scale-z:125%;scale:var(--tw-scale-x) var(--tw-scale-y)}.tpl\:hover\:border-\[var\(--tpl-danger\)\]:hover{border-color:var(--tpl-danger)}.tpl\:hover\:border-\[var\(--tpl-primary\)\]:hover{border-color:var(--tpl-primary)}.tpl\:hover\:bg-\[var\(--tpl-bg-active\)\]:hover{background-color:var(--tpl-bg-active)}.tpl\:hover\:bg-\[var\(--tpl-bg-hover\)\]:hover{background-color:var(--tpl-bg-hover)}.tpl\:hover\:bg-\[var\(--tpl-danger-light\)\]:hover{background-color:var(--tpl-danger-light)}.tpl\:hover\:bg-\[var\(--tpl-primary-hover\)\]:hover{background-color:var(--tpl-primary-hover)}.tpl\:hover\:text-\[var\(--tpl-danger\)\]:hover{color:var(--tpl-danger)}.tpl\:hover\:text-\[var\(--tpl-primary\)\]:hover{color:var(--tpl-primary)}.tpl\:hover\:text-\[var\(--tpl-text\)\]:hover{color:var(--tpl-text)}.tpl\:hover\:underline:hover{text-decoration-line:underline}.tpl\:hover\:opacity-80:hover{opacity:.8}.tpl\:hover\:opacity-90:hover{opacity:.9}}.tpl\:focus\:border-\[var\(--tpl-primary\)\]:focus{border-color:var(--tpl-primary)}.tpl\:focus\:shadow-\[0_0_0_3px_var\(--tpl-primary-light\)\]:focus{--tw-shadow:0 0 0 3px var(--tw-shadow-color,var(--tpl-primary-light));box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.tpl\:focus\:shadow-\[var\(--tpl-ring\)\]:focus{--tw-shadow:var(--tpl-ring);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.tpl\:active\:cursor-grabbing:active{cursor:grabbing}.tpl\:disabled\:cursor-not-allowed:disabled{cursor:not-allowed}.tpl\:disabled\:opacity-30:disabled{opacity:.3}.tpl\:disabled\:opacity-40:disabled{opacity:.4}.tpl\:disabled\:opacity-50:disabled{opacity:.5}@layer base,components;.tpl{--tpl-bg:oklch(99.5% .002 60);--tpl-bg-elevated:oklch(98% .004 60);--tpl-bg-hover:oklch(96% .006 60);--tpl-bg-active:oklch(93.5% .008 60);--tpl-border:oklch(92% .006 60);--tpl-border-light:oklch(86% .01 60);--tpl-text:oklch(18% .01 60);--tpl-text-muted:oklch(50% .015 60);--tpl-text-dim:oklch(68% .012 60);--tpl-primary:oklch(70% .16 55);--tpl-primary-hover:oklch(63% .17 55);--tpl-primary-light:oklch(95% .04 55);--tpl-secondary:oklch(60% .118 184.71);--tpl-secondary-hover:oklch(53.2% .105 186.39);--tpl-secondary-light:oklch(93.8% .03 186.82);--tpl-success:oklch(62.8% .194 155.1);--tpl-success-light:oklch(93.6% .043 163.51);--tpl-warning:oklch(76.9% .168 70.08);--tpl-warning-light:oklch(95% .038 73.59);--tpl-danger:oklch(63.7% .237 25.33);--tpl-danger-light:oklch(93.6% .032 17.72);--tpl-radius:10px;--tpl-radius-sm:7px;--tpl-radius-lg:14px;--tpl-font-family:"Geist", ui-sans-serif, system-ui, sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Noto Color Emoji";--tpl-shadow:0 1px 2px #0000000a, 0 1px 3px #00000008;--tpl-shadow-md:0 2px 8px #0000000f, 0 1px 3px #0000000a;--tpl-shadow-lg:0 4px 16px #00000014, 0 2px 6px #0000000a;--tpl-shadow-xl:0 8px 32px #0000001a, 0 4px 12px #0000000f;--tpl-ring:0 0 0 3px var(--tpl-primary-light);--tpl-transition:.12s cubic-bezier(.16, 1, .3, 1)}.tpl[data-tpl-theme=dark]{--tpl-bg:oklch(16% .005 60);--tpl-bg-elevated:oklch(21% .006 60);--tpl-bg-hover:oklch(26% .007 60);--tpl-bg-active:oklch(30% .008 60);--tpl-border:oklch(30% .006 60);--tpl-border-light:oklch(38% .008 60);--tpl-text:oklch(93% .005 60);--tpl-text-muted:oklch(65% .01 60);--tpl-text-dim:oklch(50% .008 60);--tpl-primary:oklch(73% .15 55);--tpl-primary-hover:oklch(78% .14 55);--tpl-primary-light:oklch(28% .05 55);--tpl-secondary:oklch(63% .11 184.71);--tpl-secondary-hover:oklch(68% .1 186.39);--tpl-secondary-light:oklch(25% .03 186.82);--tpl-success:oklch(65% .18 155.1);--tpl-success-light:oklch(25% .04 163.51);--tpl-warning:oklch(78% .16 70.08);--tpl-warning-light:oklch(28% .04 73.59);--tpl-danger:oklch(65% .22 25.33);--tpl-danger-light:oklch(25% .04 17.72);--tpl-shadow:0 1px 2px #0000004d, 0 1px 3px #0003;--tpl-shadow-md:0 2px 8px #00000059, 0 1px 3px #00000040;--tpl-shadow-lg:0 4px 16px #0006, 0 2px 6px #0000004d;--tpl-shadow-xl:0 8px 32px #00000080, 0 4px 12px #00000059;--tpl-ring:0 0 0 3px var(--tpl-primary-light)}.tpl{font-family:Geist,ui-sans-serif,system-ui,sans-serif,Apple Color Emoji,Segoe UI Emoji,Segoe UI Symbol,Noto Color Emoji;font-size:.875rem;line-height:var(--tw-leading,calc(1.25 / .875));--tw-leading:1.5;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale;background-color:var(--tpl-bg);color:var(--tpl-text);line-height:1.5;font-family:var(--tpl-font-family)}.tpl button,.tpl input,.tpl select,.tpl textarea{font-family:inherit}.tpl button{cursor:pointer;background:0 0;border:none;outline:none}.tpl ::-webkit-scrollbar{width:6px;height:6px}.tpl ::-webkit-scrollbar-track{background:0 0}.tpl ::-webkit-scrollbar-thumb{background-color:var(--tpl-border-light)}@supports (color:color-mix(in lab,red,red)){.tpl ::-webkit-scrollbar-thumb{background-color:color-mix(in srgb,var(--tpl-border-light) 60%,transparent)}}.tpl ::-webkit-scrollbar-thumb{border-radius:.25rem}.tpl ::-webkit-scrollbar-thumb:hover{background-color:var(--tpl-border-light)}@keyframes tpl-pulse{0%,to{opacity:1}50%{opacity:.5}}@keyframes tpl-spin{0%{transform:rotate(0)}to{transform:rotate(360deg)}}@keyframes tpl-scale-in{0%{opacity:0;transform:scale(.97)}to{opacity:1;transform:scale(1)}}.tpl-pulse{animation:2s infinite tpl-pulse}.tpl-spinner{animation:1s linear infinite tpl-spin}.tpl-scale-in{animation:.15s cubic-bezier(.16,1,.3,1) tpl-scale-in}@property --tw-translate-x{syntax:"*";inherits:false;initial-value:0}@property --tw-translate-y{syntax:"*";inherits:false;initial-value:0}@property --tw-translate-z{syntax:"*";inherits:false;initial-value:0}@property --tw-scale-x{syntax:"*";inherits:false;initial-value:1}@property --tw-scale-y{syntax:"*";inherits:false;initial-value:1}@property --tw-scale-z{syntax:"*";inherits:false;initial-value:1}@property --tw-space-y-reverse{syntax:"*";inherits:false;initial-value:0}@property --tw-space-x-reverse{syntax:"*";inherits:false;initial-value:0}@property --tw-border-style{syntax:"*";inherits:false;initial-value:solid}@property --tw-leading{syntax:"*";inherits:false}@property --tw-font-weight{syntax:"*";inherits:false}@property --tw-tracking{syntax:"*";inherits:false}@property --tw-ordinal{syntax:"*";inherits:false}@property --tw-slashed-zero{syntax:"*";inherits:false}@property --tw-numeric-figure{syntax:"*";inherits:false}@property --tw-numeric-spacing{syntax:"*";inherits:false}@property --tw-numeric-fraction{syntax:"*";inherits:false}@property --tw-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-shadow-color{syntax:"*";inherits:false}@property --tw-shadow-alpha{syntax:"<percentage>";inherits:false;initial-value:100%}@property --tw-inset-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-inset-shadow-color{syntax:"*";inherits:false}@property --tw-inset-shadow-alpha{syntax:"<percentage>";inherits:false;initial-value:100%}@property --tw-ring-color{syntax:"*";inherits:false}@property --tw-ring-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-inset-ring-color{syntax:"*";inherits:false}@property --tw-inset-ring-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-ring-inset{syntax:"*";inherits:false}@property --tw-ring-offset-width{syntax:"<length>";inherits:false;initial-value:0}@property --tw-ring-offset-color{syntax:"*";inherits:false;initial-value:#fff}@property --tw-ring-offset-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-backdrop-blur{syntax:"*";inherits:false}@property --tw-backdrop-brightness{syntax:"*";inherits:false}@property --tw-backdrop-contrast{syntax:"*";inherits:false}@property --tw-backdrop-grayscale{syntax:"*";inherits:false}@property --tw-backdrop-hue-rotate{syntax:"*";inherits:false}@property --tw-backdrop-invert{syntax:"*";inherits:false}@property --tw-backdrop-opacity{syntax:"*";inherits:false}@property --tw-backdrop-saturate{syntax:"*";inherits:false}@property --tw-backdrop-sepia{syntax:"*";inherits:false}@property --tw-duration{syntax:"*";inherits:false}@property --tw-ease{syntax:"*";inherits:false}@keyframes spin{to{transform:rotate(360deg)}}@keyframes pulse{50%{opacity:.5}}
2
- /*$vite$:1*/
@@ -1,250 +0,0 @@
1
- import { $ as e, H as t, M as n, N as r, S as i, U as a, _ as o, at as s, b as c, c as l, ct as ee, g as u, h as d, j as f, lt as p, m, n as te, r as h, st as g, w as _, y as v } from "./chunks/draggable-Bcb86AsV.js";
2
- import { J as y, Ln as b, dn as x, k as S, tt as C } from "./chunks/features-DEMb13KS.js";
3
- import { C as w } from "./chunks/icons-CsLTcirh.js";
4
- import { a as ne, c as re, i as ie, n as T, o as E, r as D, s as O, t as k } from "./chunks/styles-BHJULjNR.js";
5
- //#region src/Editor.vue?vue&type=script&setup=true&lang.ts
6
- var A = ["data-tpl-theme"], j = {
7
- class: "tpl-header tpl:absolute tpl:top-0 tpl:right-0 tpl:left-0 tpl:z-50 tpl:grid tpl:h-14 tpl:grid-cols-[1fr_auto_1fr] tpl:items-center tpl:px-4 tpl:shadow-[var(--tpl-shadow-md)] tpl:border-b tpl:border-[var(--tpl-border)]",
8
- style: {
9
- "background-color": "color-mix(in srgb, var(--tpl-bg) 80%, transparent)",
10
- "backdrop-filter": "blur(12px)",
11
- "-webkit-backdrop-filter": "blur(12px)"
12
- }
13
- }, M = { class: "tpl:flex tpl:items-center tpl:justify-center tpl:gap-10" }, N = { class: "tpl:sticky tpl:top-0 tpl:z-40 tpl:h-0" }, P = { class: "tpl:flex tpl:justify-center tpl:p-8" }, F = ["aria-label"], I = /* @__PURE__ */ C(/* @__PURE__ */ i({
14
- __name: "Editor",
15
- props: {
16
- config: {},
17
- translations: {},
18
- fontsManager: {}
19
- },
20
- setup(e, { expose: i }) {
21
- let h = e, _ = x({
22
- content: h.config.content,
23
- templateDefaults: h.config.templateDefaults
24
- }), y = S({
25
- editor: _,
26
- config: {
27
- uiTheme: h.config.uiTheme,
28
- theme: h.config.theme,
29
- blockDefaults: h.config.blockDefaults,
30
- customBlocks: h.config.customBlocks,
31
- mergeTags: h.config.mergeTags,
32
- displayConditions: h.config.displayConditions,
33
- onRequestMedia: h.config.onRequestMedia,
34
- accessibility: re(h.config),
35
- onSave: h.config.onSave ? () => h.config.onSave(JSON.parse(JSON.stringify(_.state.content))) : void 0
36
- },
37
- translations: h.translations,
38
- fontsManager: h.fontsManager,
39
- autoSaveOptions: h.config.onChange ? { onChange: () => h.config.onChange(JSON.parse(JSON.stringify(_.state.content))) } : null
40
- });
41
- return f(async () => {
42
- await h.fontsManager.loadCustomFonts();
43
- }), n(() => {
44
- h.fontsManager.cleanupFontLinks(), y.destroy();
45
- }), i({
46
- getContent: () => _.content.value,
47
- setContent: (e) => _.setContent(e),
48
- setTheme: (e) => _.setUiTheme(e),
49
- renderCustomBlock: y.registry.renderCustomBlock
50
- }), (n, i) => (r(), o("div", {
51
- class: g(["tpl tpl:relative tpl:h-full tpl:overflow-hidden", { "tpl:dark": s(_).state.darkMode }]),
52
- "data-tpl-theme": s(y).resolvedTheme.value,
53
- style: ee(s(y).themeStyles.value)
54
- }, [
55
- m("header", j, [
56
- i[5] ||= m("div", { class: "tpl:flex tpl:items-center tpl:gap-2.5" }, null, -1),
57
- m("div", M, [
58
- c(ie, {
59
- viewport: s(_).state.viewport,
60
- onChange: s(_).setViewport
61
- }, null, 8, ["viewport", "onChange"]),
62
- c(T, {
63
- "dark-mode": s(_).state.darkMode,
64
- onChange: s(_).setDarkMode
65
- }, null, 8, ["dark-mode", "onChange"]),
66
- c(D, {
67
- "preview-mode": s(_).state.previewMode,
68
- onChange: s(_).setPreviewMode
69
- }, null, 8, ["preview-mode", "onChange"])
70
- ]),
71
- i[6] ||= m("div", { class: "tpl:flex tpl:min-w-[200px] tpl:items-center tpl:justify-end tpl:gap-3" }, null, -1)
72
- ]),
73
- a(c(E, null, null, 512), [[l, !s(_).state.previewMode]]),
74
- m("div", {
75
- class: g(["tpl-body tpl:absolute tpl:bottom-0 tpl:overflow-auto tpl:bg-[var(--tpl-canvas-bg)]", [s(_).state.previewMode ? "tpl:left-0 tpl:right-0" : "tpl:left-12 tpl:right-[320px]", "tpl:top-14"]]),
76
- style: { transition: "all 300ms cubic-bezier(0.34, 1.56, 0.64, 1)" }
77
- }, [m("div", N, [c(te, { name: "tpl-restore-btn" }, {
78
- default: t(() => [s(y).conditionPreview.hasHiddenBlocks.value ? (r(), o("button", {
79
- key: 0,
80
- class: "tpl:absolute tpl:left-1/2 tpl:top-2 tpl:-translate-x-1/2 tpl:inline-flex tpl:items-center tpl:gap-1.5 tpl:rounded-full tpl:border tpl:px-3.5 tpl:py-1.5 tpl:text-xs tpl:font-medium tpl:whitespace-nowrap tpl:shadow-md tpl:hover:opacity-80 tpl:bg-[var(--tpl-warning-light)] tpl:text-[var(--tpl-warning)] tpl:border-[var(--tpl-warning)]",
81
- style: { "backdrop-filter": "blur(8px)" },
82
- onClick: i[0] ||= (e) => s(y).conditionPreview.reset()
83
- }, [c(s(w), {
84
- size: 13,
85
- "stroke-width": 2
86
- }), v(" " + p(s(y).t.blockSettings.restoreHiddenBlocks), 1)])) : u("", !0)]),
87
- _: 1
88
- })]), m("div", P, [c(O, {
89
- viewport: s(_).state.viewport,
90
- content: s(_).content.value,
91
- "selected-block-id": s(_).state.selectedBlockId,
92
- "dark-mode": s(_).state.darkMode,
93
- "preview-mode": s(_).state.previewMode,
94
- onSelectBlock: s(_).selectBlock
95
- }, null, 8, [
96
- "viewport",
97
- "content",
98
- "selected-block-id",
99
- "dark-mode",
100
- "preview-mode",
101
- "onSelectBlock"
102
- ])])], 2),
103
- e.config.branding === !1 ? u("", !0) : (r(), d(k, {
104
- key: 0,
105
- "position-class": [s(_).state.previewMode ? "tpl:left-0 tpl:right-0" : "tpl:left-12 tpl:right-[320px]"]
106
- }, null, 8, ["position-class"])),
107
- m("div", {
108
- class: "tpl-sr-only",
109
- role: "status",
110
- "aria-live": "polite",
111
- "aria-atomic": "true",
112
- "aria-label": s(y).t.landmarks.reorderAnnouncements
113
- }, p(s(y).keyboardReorder.announcement.value), 9, F),
114
- a(c(ne, {
115
- "selected-block": s(_).selectedBlock.value,
116
- settings: s(_).content.value.settings,
117
- onUpdateBlock: i[1] ||= (e) => s(_).updateBlock(s(_).state.selectedBlockId, e),
118
- onDeleteBlock: i[2] ||= () => {
119
- s(_).state.selectedBlockId && s(y).blockActions.deleteBlock(s(_).state.selectedBlockId);
120
- },
121
- onDuplicateBlock: i[3] ||= () => {
122
- s(_).selectedBlock.value && s(y).blockActions.duplicateBlock(s(_).selectedBlock.value);
123
- },
124
- onUpdateSettings: i[4] ||= (e) => s(_).updateSettings(e)
125
- }, null, 8, ["selected-block", "settings"]), [[l, !s(_).state.previewMode]])
126
- ], 14, A));
127
- }
128
- }), [["__scopeId", "data-v-9ffdcb5e"]]), L = /* @__PURE__ */ Object.assign({
129
- "./locales/de.ts": () => import("./chunks/de-D8CnZxV9.js"),
130
- "./locales/en.ts": () => import("./chunks/en-8FHaQv4V.js")
131
- }), R = /* @__PURE__ */ Object.assign({
132
- "./locales/cloud/de.ts": () => import("./chunks/de-RQrZR56a.js"),
133
- "./locales/cloud/en.ts": () => import("./chunks/en-Bl1ecfRF.js")
134
- });
135
- function z(e) {
136
- return Object.keys(e).map((e) => e.match(/\/([^/]+)\.ts$/)?.[1]).filter((e) => !!e);
137
- }
138
- var B = z(L), V = z(R);
139
- function H(e) {
140
- return e.split("-")[0].toLowerCase();
141
- }
142
- function U(e, t) {
143
- let n = H(e);
144
- return t.includes(n) ? n : "en";
145
- }
146
- async function W(e) {
147
- let t = L[`./locales/${U(e, B)}.ts`];
148
- return (await t()).default;
149
- }
150
- async function G(e) {
151
- let t = R[`./locales/cloud/${U(e, V)}.ts`];
152
- return (await t()).default;
153
- }
154
- //#endregion
155
- //#region src/utils/toMjml.ts
156
- async function K(e) {
157
- let t;
158
- try {
159
- t = await import("./chunks/renderer-CUxvx7ro.js").then((e) => e.t);
160
- } catch {
161
- throw Error("[Templatical] toMjml() requires the @templatical/renderer package. Please install it.");
162
- }
163
- return t.renderToMjml(e.getContent(), { renderCustomBlock: e.renderCustomBlock });
164
- }
165
- //#endregion
166
- //#region src/index.ts
167
- var q = null, J = e(null);
168
- async function Y(e) {
169
- let t = typeof e.container == "string" ? document.querySelector(e.container) : e.container;
170
- if (!t) throw Error(`[Templatical] Container element not found: ${e.container}`);
171
- let n = await W(e.locale ?? "en"), r = y(e.fonts);
172
- q && Q(), q = h({ setup() {
173
- return () => _(I, {
174
- config: e,
175
- translations: n,
176
- fontsManager: r,
177
- ref: J
178
- });
179
- } }), q.mount(t);
180
- let i = {
181
- getContent() {
182
- return JSON.parse(JSON.stringify(J.value ? J.value.getContent() : e.content));
183
- },
184
- setContent(t) {
185
- J.value && J.value.setContent(t), e.content = t;
186
- },
187
- setTheme(e) {
188
- J.value && J.value.setTheme(e);
189
- },
190
- unmount: Q,
191
- renderCustomBlock(e) {
192
- return J.value ? J.value.renderCustomBlock(e) : Promise.reject(/* @__PURE__ */ Error("[Templatical] Editor not ready"));
193
- },
194
- toMjml: () => K(i)
195
- };
196
- return i;
197
- }
198
- var X = null, Z = e(null);
199
- async function ae(e) {
200
- let t = typeof e.container == "string" ? document.querySelector(e.container) : e.container;
201
- if (!t) throw Error(`[Templatical] Container element not found: ${e.container}`);
202
- let { default: n } = await import("./chunks/CloudEditor-D2GsEC_n.js"), [r, i] = await Promise.all([W(e.locale ?? "en"), G(e.locale ?? "en")]), a = y(e.fonts);
203
- return X && $(), await new Promise((o, s) => {
204
- let c = setTimeout(() => {
205
- s(/* @__PURE__ */ Error("[Templatical] Cloud editor initialization timed out"));
206
- }, b);
207
- X = h({ setup() {
208
- return () => _(n, {
209
- config: e,
210
- translations: r,
211
- cloudTranslations: i,
212
- fontsManager: a,
213
- ref: Z,
214
- onReady: () => {
215
- clearTimeout(c), o();
216
- }
217
- });
218
- } }), X.mount(t);
219
- }), {
220
- getContent() {
221
- return JSON.parse(JSON.stringify(Z.value ? Z.value.getContent() : e.content));
222
- },
223
- setContent(e) {
224
- Z.value && Z.value.setContent(e);
225
- },
226
- setTheme(e) {
227
- Z.value && Z.value.setTheme(e);
228
- },
229
- unmount: $,
230
- create(e) {
231
- return Z.value ? Z.value.create(e) : Promise.reject(/* @__PURE__ */ Error("[Templatical] Cloud editor not ready"));
232
- },
233
- load(e) {
234
- return Z.value ? Z.value.load(e) : Promise.reject(/* @__PURE__ */ Error("[Templatical] Cloud editor not ready"));
235
- },
236
- save() {
237
- return Z.value ? Z.value.save() : Promise.reject(/* @__PURE__ */ Error("[Templatical] Cloud editor not ready"));
238
- }
239
- };
240
- }
241
- function Q() {
242
- q && (q.unmount(), q = null, J.value = null);
243
- }
244
- function $() {
245
- X && (X.unmount(), X = null, Z.value = null);
246
- }
247
- //#endregion
248
- export { Y as init, ae as initCloud, Q as unmount, y as useFonts };
249
-
250
- //# sourceMappingURL=editor.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"editor.js","names":[],"sources":["../../src/Editor.vue","../../src/Editor.vue","../../src/i18n/index.ts","../../src/utils/toMjml.ts","../../src/index.ts"],"sourcesContent":["<script setup lang=\"ts\">\nimport { onMounted, onUnmounted } from \"vue\";\nimport type { TemplaticalEditorConfig } from \"./index\";\nimport { useEditor } from \"@templatical/core\";\nimport type { TemplateContent, UiTheme } from \"@templatical/types\";\nimport { useEditorCore } from \"./composables/useEditorCore\";\nimport { resolveAccessibilityOptions } from \"./utils/resolveAccessibilityOptions\";\nimport type { Translations } from \"./i18n\";\nimport type { UseFontsReturn } from \"./composables/useFonts\";\n\nimport { RotateCcw } from \"@lucide/vue\";\nimport Canvas from \"./components/Canvas.vue\";\nimport Sidebar from \"./components/Sidebar.vue\";\nimport RightSidebar from \"./components/RightSidebar.vue\";\nimport ViewportToggle from \"./components/ViewportToggle.vue\";\nimport PreviewToggle from \"./components/PreviewToggle.vue\";\nimport DarkModeToggle from \"./components/DarkModeToggle.vue\";\nimport EditorFooter from \"./components/EditorFooter.vue\";\nimport \"./styles/index.css\";\n\nconst props = defineProps<{\n config: TemplaticalEditorConfig;\n translations: Translations;\n fontsManager: UseFontsReturn;\n}>();\n\n// --- Core editor state ---\nconst editor = useEditor({\n content: props.config.content!,\n templateDefaults: props.config.templateDefaults,\n});\n\n// --- Shared editor core (composables, provides, plugins, keyboard) ---\nconst core = useEditorCore({\n editor,\n config: {\n uiTheme: props.config.uiTheme,\n theme: props.config.theme,\n blockDefaults: props.config.blockDefaults,\n customBlocks: props.config.customBlocks,\n mergeTags: props.config.mergeTags,\n displayConditions: props.config.displayConditions,\n onRequestMedia: props.config.onRequestMedia,\n accessibility: resolveAccessibilityOptions(props.config),\n onSave: props.config.onSave\n ? () =>\n props.config.onSave!(JSON.parse(JSON.stringify(editor.state.content)))\n : undefined,\n },\n translations: props.translations,\n fontsManager: props.fontsManager,\n autoSaveOptions: props.config.onChange\n ? {\n onChange: () =>\n props.config.onChange!(\n JSON.parse(JSON.stringify(editor.state.content)),\n ),\n }\n : null,\n});\n\n// --- Lifecycle ---\nonMounted(async () => {\n await props.fontsManager.loadCustomFonts();\n});\n\nonUnmounted(() => {\n props.fontsManager.cleanupFontLinks();\n core.destroy();\n});\n\n// --- Public API (accessed via template ref from init()) ---\ndefineExpose({\n getContent: () => editor.content.value,\n setContent: (content: TemplateContent) => editor.setContent(content),\n setTheme: (theme: UiTheme) => editor.setUiTheme(theme),\n renderCustomBlock: core.registry.renderCustomBlock,\n});\n</script>\n\n<template>\n <div\n class=\"tpl tpl:relative tpl:h-full tpl:overflow-hidden\"\n :class=\"{ 'tpl:dark': editor.state.darkMode }\"\n :data-tpl-theme=\"core.resolvedTheme.value\"\n :style=\"core.themeStyles.value\"\n >\n <!-- Header — absolute, full width, above everything -->\n <header\n class=\"tpl-header tpl:absolute tpl:top-0 tpl:right-0 tpl:left-0 tpl:z-50 tpl:grid tpl:h-14 tpl:grid-cols-[1fr_auto_1fr] tpl:items-center tpl:px-4 tpl:shadow-[var(--tpl-shadow-md)] tpl:border-b tpl:border-[var(--tpl-border)]\"\n style=\"\n background-color: color-mix(in srgb, var(--tpl-bg) 80%, transparent);\n backdrop-filter: blur(12px);\n -webkit-backdrop-filter: blur(12px);\n \"\n >\n <!-- Left: empty (reserved for embedder customization) -->\n <div class=\"tpl:flex tpl:items-center tpl:gap-2.5\"></div>\n\n <!-- Center: viewport + preview + dark mode -->\n <div class=\"tpl:flex tpl:items-center tpl:justify-center tpl:gap-10\">\n <ViewportToggle\n :viewport=\"editor.state.viewport\"\n @change=\"editor.setViewport\"\n />\n <DarkModeToggle\n :dark-mode=\"editor.state.darkMode\"\n @change=\"editor.setDarkMode\"\n />\n <PreviewToggle\n :preview-mode=\"editor.state.previewMode\"\n @change=\"editor.setPreviewMode\"\n />\n </div>\n\n <!-- Right: empty in OSS mode -->\n <div\n class=\"tpl:flex tpl:min-w-[200px] tpl:items-center tpl:justify-end tpl:gap-3\"\n ></div>\n </header>\n\n <!-- Left sidebar — absolute, below header -->\n <Sidebar v-show=\"!editor.state.previewMode\" />\n\n <!-- Canvas area — absolute, fills remaining space -->\n <div\n class=\"tpl-body tpl:absolute tpl:bottom-0 tpl:overflow-auto tpl:bg-[var(--tpl-canvas-bg)]\"\n style=\"transition: all 300ms cubic-bezier(0.34, 1.56, 0.64, 1)\"\n :class=\"[\n editor.state.previewMode\n ? 'tpl:left-0 tpl:right-0'\n : 'tpl:left-12 tpl:right-[320px]',\n 'tpl:top-14',\n ]\"\n >\n <!-- Restore hidden blocks button -->\n <div class=\"tpl:sticky tpl:top-0 tpl:z-40 tpl:h-0\">\n <Transition name=\"tpl-restore-btn\">\n <button\n v-if=\"core.conditionPreview.hasHiddenBlocks.value\"\n class=\"tpl:absolute tpl:left-1/2 tpl:top-2 tpl:-translate-x-1/2 tpl:inline-flex tpl:items-center tpl:gap-1.5 tpl:rounded-full tpl:border tpl:px-3.5 tpl:py-1.5 tpl:text-xs tpl:font-medium tpl:whitespace-nowrap tpl:shadow-md tpl:hover:opacity-80 tpl:bg-[var(--tpl-warning-light)] tpl:text-[var(--tpl-warning)] tpl:border-[var(--tpl-warning)]\"\n style=\"backdrop-filter: blur(8px)\"\n @click=\"core.conditionPreview.reset()\"\n >\n <RotateCcw :size=\"13\" :stroke-width=\"2\" />\n {{ core.t.blockSettings.restoreHiddenBlocks }}\n </button>\n </Transition>\n </div>\n <div class=\"tpl:flex tpl:justify-center tpl:p-8\">\n <Canvas\n :viewport=\"editor.state.viewport\"\n :content=\"editor.content.value\"\n :selected-block-id=\"editor.state.selectedBlockId\"\n :dark-mode=\"editor.state.darkMode\"\n :preview-mode=\"editor.state.previewMode\"\n @select-block=\"editor.selectBlock\"\n />\n </div>\n </div>\n\n <EditorFooter\n v-if=\"config.branding !== false\"\n :position-class=\"[\n editor.state.previewMode\n ? 'tpl:left-0 tpl:right-0'\n : 'tpl:left-12 tpl:right-[320px]',\n ]\"\n />\n\n <!-- Keyboard reorder announcement region (visually hidden, screen-reader live) -->\n <div\n class=\"tpl-sr-only\"\n role=\"status\"\n aria-live=\"polite\"\n aria-atomic=\"true\"\n :aria-label=\"core.t.landmarks.reorderAnnouncements\"\n >\n {{ core.keyboardReorder.announcement.value }}\n </div>\n\n <!-- Right sidebar — persisted with v-show -->\n <RightSidebar\n v-show=\"!editor.state.previewMode\"\n :selected-block=\"editor.selectedBlock.value\"\n :settings=\"editor.content.value.settings\"\n @update-block=\"\n (updates) => editor.updateBlock(editor.state.selectedBlockId!, updates)\n \"\n @delete-block=\"\n () => {\n if (editor.state.selectedBlockId) {\n core.blockActions.deleteBlock(editor.state.selectedBlockId);\n }\n }\n \"\n @duplicate-block=\"\n () => {\n if (editor.selectedBlock.value) {\n core.blockActions.duplicateBlock(editor.selectedBlock.value);\n }\n }\n \"\n @update-settings=\"(updates) => editor.updateSettings(updates)\"\n />\n </div>\n</template>\n\n<style scoped>\n.tpl-restore-btn-enter-active {\n transition:\n opacity 200ms cubic-bezier(0.16, 1, 0.3, 1),\n transform 200ms cubic-bezier(0.16, 1, 0.3, 1);\n}\n\n.tpl-restore-btn-leave-active {\n transition:\n opacity 150ms ease-in,\n transform 150ms ease-in;\n}\n\n.tpl-restore-btn-enter-from,\n.tpl-restore-btn-leave-to {\n opacity: 0;\n transform: translateY(-8px) scale(0.9);\n}\n\n.tpl-restore-btn-enter-to,\n.tpl-restore-btn-leave-from {\n opacity: 1;\n transform: translateY(0) scale(1);\n}\n</style>\n","<script setup lang=\"ts\">\nimport { onMounted, onUnmounted } from \"vue\";\nimport type { TemplaticalEditorConfig } from \"./index\";\nimport { useEditor } from \"@templatical/core\";\nimport type { TemplateContent, UiTheme } from \"@templatical/types\";\nimport { useEditorCore } from \"./composables/useEditorCore\";\nimport { resolveAccessibilityOptions } from \"./utils/resolveAccessibilityOptions\";\nimport type { Translations } from \"./i18n\";\nimport type { UseFontsReturn } from \"./composables/useFonts\";\n\nimport { RotateCcw } from \"@lucide/vue\";\nimport Canvas from \"./components/Canvas.vue\";\nimport Sidebar from \"./components/Sidebar.vue\";\nimport RightSidebar from \"./components/RightSidebar.vue\";\nimport ViewportToggle from \"./components/ViewportToggle.vue\";\nimport PreviewToggle from \"./components/PreviewToggle.vue\";\nimport DarkModeToggle from \"./components/DarkModeToggle.vue\";\nimport EditorFooter from \"./components/EditorFooter.vue\";\nimport \"./styles/index.css\";\n\nconst props = defineProps<{\n config: TemplaticalEditorConfig;\n translations: Translations;\n fontsManager: UseFontsReturn;\n}>();\n\n// --- Core editor state ---\nconst editor = useEditor({\n content: props.config.content!,\n templateDefaults: props.config.templateDefaults,\n});\n\n// --- Shared editor core (composables, provides, plugins, keyboard) ---\nconst core = useEditorCore({\n editor,\n config: {\n uiTheme: props.config.uiTheme,\n theme: props.config.theme,\n blockDefaults: props.config.blockDefaults,\n customBlocks: props.config.customBlocks,\n mergeTags: props.config.mergeTags,\n displayConditions: props.config.displayConditions,\n onRequestMedia: props.config.onRequestMedia,\n accessibility: resolveAccessibilityOptions(props.config),\n onSave: props.config.onSave\n ? () =>\n props.config.onSave!(JSON.parse(JSON.stringify(editor.state.content)))\n : undefined,\n },\n translations: props.translations,\n fontsManager: props.fontsManager,\n autoSaveOptions: props.config.onChange\n ? {\n onChange: () =>\n props.config.onChange!(\n JSON.parse(JSON.stringify(editor.state.content)),\n ),\n }\n : null,\n});\n\n// --- Lifecycle ---\nonMounted(async () => {\n await props.fontsManager.loadCustomFonts();\n});\n\nonUnmounted(() => {\n props.fontsManager.cleanupFontLinks();\n core.destroy();\n});\n\n// --- Public API (accessed via template ref from init()) ---\ndefineExpose({\n getContent: () => editor.content.value,\n setContent: (content: TemplateContent) => editor.setContent(content),\n setTheme: (theme: UiTheme) => editor.setUiTheme(theme),\n renderCustomBlock: core.registry.renderCustomBlock,\n});\n</script>\n\n<template>\n <div\n class=\"tpl tpl:relative tpl:h-full tpl:overflow-hidden\"\n :class=\"{ 'tpl:dark': editor.state.darkMode }\"\n :data-tpl-theme=\"core.resolvedTheme.value\"\n :style=\"core.themeStyles.value\"\n >\n <!-- Header — absolute, full width, above everything -->\n <header\n class=\"tpl-header tpl:absolute tpl:top-0 tpl:right-0 tpl:left-0 tpl:z-50 tpl:grid tpl:h-14 tpl:grid-cols-[1fr_auto_1fr] tpl:items-center tpl:px-4 tpl:shadow-[var(--tpl-shadow-md)] tpl:border-b tpl:border-[var(--tpl-border)]\"\n style=\"\n background-color: color-mix(in srgb, var(--tpl-bg) 80%, transparent);\n backdrop-filter: blur(12px);\n -webkit-backdrop-filter: blur(12px);\n \"\n >\n <!-- Left: empty (reserved for embedder customization) -->\n <div class=\"tpl:flex tpl:items-center tpl:gap-2.5\"></div>\n\n <!-- Center: viewport + preview + dark mode -->\n <div class=\"tpl:flex tpl:items-center tpl:justify-center tpl:gap-10\">\n <ViewportToggle\n :viewport=\"editor.state.viewport\"\n @change=\"editor.setViewport\"\n />\n <DarkModeToggle\n :dark-mode=\"editor.state.darkMode\"\n @change=\"editor.setDarkMode\"\n />\n <PreviewToggle\n :preview-mode=\"editor.state.previewMode\"\n @change=\"editor.setPreviewMode\"\n />\n </div>\n\n <!-- Right: empty in OSS mode -->\n <div\n class=\"tpl:flex tpl:min-w-[200px] tpl:items-center tpl:justify-end tpl:gap-3\"\n ></div>\n </header>\n\n <!-- Left sidebar — absolute, below header -->\n <Sidebar v-show=\"!editor.state.previewMode\" />\n\n <!-- Canvas area — absolute, fills remaining space -->\n <div\n class=\"tpl-body tpl:absolute tpl:bottom-0 tpl:overflow-auto tpl:bg-[var(--tpl-canvas-bg)]\"\n style=\"transition: all 300ms cubic-bezier(0.34, 1.56, 0.64, 1)\"\n :class=\"[\n editor.state.previewMode\n ? 'tpl:left-0 tpl:right-0'\n : 'tpl:left-12 tpl:right-[320px]',\n 'tpl:top-14',\n ]\"\n >\n <!-- Restore hidden blocks button -->\n <div class=\"tpl:sticky tpl:top-0 tpl:z-40 tpl:h-0\">\n <Transition name=\"tpl-restore-btn\">\n <button\n v-if=\"core.conditionPreview.hasHiddenBlocks.value\"\n class=\"tpl:absolute tpl:left-1/2 tpl:top-2 tpl:-translate-x-1/2 tpl:inline-flex tpl:items-center tpl:gap-1.5 tpl:rounded-full tpl:border tpl:px-3.5 tpl:py-1.5 tpl:text-xs tpl:font-medium tpl:whitespace-nowrap tpl:shadow-md tpl:hover:opacity-80 tpl:bg-[var(--tpl-warning-light)] tpl:text-[var(--tpl-warning)] tpl:border-[var(--tpl-warning)]\"\n style=\"backdrop-filter: blur(8px)\"\n @click=\"core.conditionPreview.reset()\"\n >\n <RotateCcw :size=\"13\" :stroke-width=\"2\" />\n {{ core.t.blockSettings.restoreHiddenBlocks }}\n </button>\n </Transition>\n </div>\n <div class=\"tpl:flex tpl:justify-center tpl:p-8\">\n <Canvas\n :viewport=\"editor.state.viewport\"\n :content=\"editor.content.value\"\n :selected-block-id=\"editor.state.selectedBlockId\"\n :dark-mode=\"editor.state.darkMode\"\n :preview-mode=\"editor.state.previewMode\"\n @select-block=\"editor.selectBlock\"\n />\n </div>\n </div>\n\n <EditorFooter\n v-if=\"config.branding !== false\"\n :position-class=\"[\n editor.state.previewMode\n ? 'tpl:left-0 tpl:right-0'\n : 'tpl:left-12 tpl:right-[320px]',\n ]\"\n />\n\n <!-- Keyboard reorder announcement region (visually hidden, screen-reader live) -->\n <div\n class=\"tpl-sr-only\"\n role=\"status\"\n aria-live=\"polite\"\n aria-atomic=\"true\"\n :aria-label=\"core.t.landmarks.reorderAnnouncements\"\n >\n {{ core.keyboardReorder.announcement.value }}\n </div>\n\n <!-- Right sidebar — persisted with v-show -->\n <RightSidebar\n v-show=\"!editor.state.previewMode\"\n :selected-block=\"editor.selectedBlock.value\"\n :settings=\"editor.content.value.settings\"\n @update-block=\"\n (updates) => editor.updateBlock(editor.state.selectedBlockId!, updates)\n \"\n @delete-block=\"\n () => {\n if (editor.state.selectedBlockId) {\n core.blockActions.deleteBlock(editor.state.selectedBlockId);\n }\n }\n \"\n @duplicate-block=\"\n () => {\n if (editor.selectedBlock.value) {\n core.blockActions.duplicateBlock(editor.selectedBlock.value);\n }\n }\n \"\n @update-settings=\"(updates) => editor.updateSettings(updates)\"\n />\n </div>\n</template>\n\n<style scoped>\n.tpl-restore-btn-enter-active {\n transition:\n opacity 200ms cubic-bezier(0.16, 1, 0.3, 1),\n transform 200ms cubic-bezier(0.16, 1, 0.3, 1);\n}\n\n.tpl-restore-btn-leave-active {\n transition:\n opacity 150ms ease-in,\n transform 150ms ease-in;\n}\n\n.tpl-restore-btn-enter-from,\n.tpl-restore-btn-leave-to {\n opacity: 0;\n transform: translateY(-8px) scale(0.9);\n}\n\n.tpl-restore-btn-enter-to,\n.tpl-restore-btn-leave-from {\n opacity: 1;\n transform: translateY(0) scale(1);\n}\n</style>\n","/// <reference types=\"vite/client\" />\n\nimport type en from \"./locales/en\";\nimport type cloudEn from \"./locales/cloud/en\";\n\nexport type Translations = typeof en;\nexport type CloudTranslations = typeof cloudEn;\nexport type TranslationKey = keyof Translations;\n\n// Vite resolves these globs at build time. Adding a new locale file\n// automatically registers it — no array to keep in sync.\nconst ossModules = import.meta.glob<{ default: Translations }>(\n \"./locales/*.ts\",\n);\nconst cloudModules = import.meta.glob<{ default: CloudTranslations }>(\n \"./locales/cloud/*.ts\",\n);\n\nfunction localesFromGlob(modules: Record<string, unknown>): string[] {\n return Object.keys(modules)\n .map((path) => path.match(/\\/([^/]+)\\.ts$/)?.[1])\n .filter((locale): locale is string => Boolean(locale));\n}\n\nconst supportedLocales = localesFromGlob(ossModules);\nconst supportedCloudLocales = localesFromGlob(cloudModules);\n\n/**\n * Get the base language code from a locale string.\n * e.g., 'en-GB' -> 'en', 'de-DE' -> 'de'\n */\nexport function getBaseLocale(locale: string): string {\n return locale.split(\"-\")[0].toLowerCase();\n}\n\nfunction resolveLocale(locale: string, supported: string[]): string {\n const base = getBaseLocale(locale);\n return supported.includes(base) ? base : \"en\";\n}\n\n/**\n * Load OSS translations for a given locale.\n * Falls back to English if the locale is not supported.\n */\nexport async function loadTranslations(locale: string): Promise<Translations> {\n const target = resolveLocale(locale, supportedLocales);\n const loader = ossModules[`./locales/${target}.ts`];\n const mod = await loader();\n return mod.default;\n}\n\n/**\n * Load cloud translations for a given locale.\n * Cloud translations cover features available only via initCloud() —\n * AI, comments, collaboration, scoring, snapshots, plan limits, etc.\n * OSS contributors don't need to translate these; cloud locales fall back\n * to English independently of the OSS locale.\n */\nexport async function loadCloudTranslations(\n locale: string,\n): Promise<CloudTranslations> {\n const target = resolveLocale(locale, supportedCloudLocales);\n const loader = cloudModules[`./locales/cloud/${target}.ts`];\n const mod = await loader();\n return mod.default;\n}\n\n/** Check if a locale has OSS translations (matched by base, e.g. en-GB → en). */\nexport function isLocaleSupported(locale: string): boolean {\n return (\n supportedLocales.includes(locale) ||\n supportedLocales.includes(getBaseLocale(locale))\n );\n}\n\n/** Check if a locale has cloud translations (matched by base). */\nexport function isCloudLocaleSupported(locale: string): boolean {\n return (\n supportedCloudLocales.includes(locale) ||\n supportedCloudLocales.includes(getBaseLocale(locale))\n );\n}\n\n/** List of OSS-supported locales. */\nexport function getSupportedLocales(): string[] {\n return [...supportedLocales];\n}\n\n/** List of cloud-supported locales. May be a subset of OSS locales. */\nexport function getSupportedCloudLocales(): string[] {\n return [...supportedCloudLocales];\n}\n","import type { CustomBlock, TemplateContent } from \"@templatical/types\";\n\n/**\n * Minimal slice of the editor surface needed by `toMjmlForInstance`.\n * Decoupled from the full `TemplaticalEditor` type so this helper can be\n * tested in isolation with a stub object.\n */\nexport interface ToMjmlSource {\n getContent(): TemplateContent;\n renderCustomBlock(block: CustomBlock): Promise<string>;\n}\n\n/**\n * Lazy-load `@templatical/renderer` and render the editor's current content\n * to MJML, wiring the editor's own custom block resolver into the renderer's\n * `renderCustomBlock` callback.\n *\n * The renderer is an optional peer dependency (small, MIT-licensed). It is\n * only loaded when an export is actually requested. Consumers that don't\n * need MJML export at all (e.g., embedding the editor in an app where the\n * backend handles export) can omit the install entirely; calling `toMjml()`\n * in that case throws a clear error naming the missing package.\n *\n * The dynamic import is cached by the module system, so subsequent calls\n * skip the import overhead.\n */\nexport async function toMjmlForInstance(\n instance: ToMjmlSource,\n): Promise<string> {\n let renderer: typeof import(\"@templatical/renderer\");\n try {\n renderer = await import(\"@templatical/renderer\");\n } catch {\n throw new Error(\n \"[Templatical] toMjml() requires the @templatical/renderer package. Please install it.\",\n );\n }\n return renderer.renderToMjml(instance.getContent(), {\n renderCustomBlock: instance.renderCustomBlock,\n });\n}\n","import { createApp, h, ref, type App, type Ref } from \"vue\";\nimport { INIT_TIMEOUT_MS } from \"./constants/timeouts\";\nimport type {\n BlockDefaults,\n CustomBlock,\n CustomBlockDefinition,\n DisplayConditionsConfig,\n FontsConfig,\n MediaResult,\n MergeTagsConfig,\n SaveResult,\n Template,\n TemplateContent,\n TemplateDefaults,\n ThemeOverrides,\n UiTheme,\n} from \"@templatical/types\";\nimport type { MediaRequestContext } from \"@templatical/media-library\";\n\nimport Editor from \"./Editor.vue\";\nimport { loadTranslations, loadCloudTranslations } from \"./i18n\";\nimport { useFonts } from \"./composables\";\nimport { toMjmlForInstance } from \"./utils/toMjml\";\n\n// ---------------------------------------------------------------------------\n// OSS config + return types\n// ---------------------------------------------------------------------------\n\nexport interface TemplaticalEditorConfig {\n container: string | HTMLElement;\n content?: TemplateContent;\n\n onChange?: (content: TemplateContent) => void;\n onSave?: (content: TemplateContent) => void;\n onError?: (error: Error) => void;\n\n onRequestMedia?: OnRequestMedia;\n\n mergeTags?: MergeTagsConfig;\n displayConditions?: DisplayConditionsConfig;\n customBlocks?: CustomBlockDefinition[];\n fonts?: FontsConfig;\n\n blockDefaults?: BlockDefaults;\n templateDefaults?: TemplateDefaults;\n\n theme?: ThemeOverrides;\n uiTheme?: UiTheme;\n locale?: string;\n\n /**\n * Show the \"Powered by Templatical\" footer. Defaults to `true`.\n * Set to `false` to hide the footer (no attribution required by the license).\n */\n branding?: boolean;\n\n /**\n * Accessibility linter (`@templatical/quality`) configuration.\n *\n * - When unset, the linter loads on demand once the user opens the panel.\n * - When `disabled: true`, the optional peer is never imported (saves the\n * chunk download) and the sidebar tab + inline badges are suppressed.\n * - `rules`/`thresholds` follow the shape exported by `@templatical/quality`.\n */\n accessibility?: import(\"@templatical/quality\").A11yOptions;\n}\n\n/** Function type for media browser requests, used by both OSS and Cloud editors. */\nexport type OnRequestMedia = (\n context?: MediaRequestContext,\n) => Promise<MediaResult | null>;\n\ninterface TemplaticalEditorBase {\n getContent(): TemplateContent;\n setContent(content: TemplateContent): void;\n setTheme(theme: UiTheme): void;\n unmount(): void;\n}\n\nexport interface TemplaticalEditor extends TemplaticalEditorBase {\n /**\n * Render the current template to an MJML string. Resolves custom blocks\n * via the editor's internal block registry. Throws if the optional\n * `@templatical/renderer` package is not installed.\n */\n toMjml(): Promise<string>;\n /**\n * Render a single custom block to its HTML representation, using the\n * registered custom block definition's template and the block's current\n * field values. Exposed for headless callers that want to reuse the\n * editor's renderer (e.g., to drive `@templatical/renderer`'s\n * `renderCustomBlock` option from outside the editor instance).\n */\n renderCustomBlock(block: CustomBlock): Promise<string>;\n}\n\n/**\n * Cloud editor does not expose `toMjml` or `renderCustomBlock`: the cloud\n * backend performs MJML conversion server-side with additional processing\n * (e.g., signed image URLs, attachment handling) that isn't available client\n * side. Use the cloud `save()` flow to persist content; the backend handles\n * MJML/HTML export from there.\n */\nexport interface TemplaticalCloudEditor extends TemplaticalEditorBase {\n create(content?: TemplateContent): Promise<Template>;\n load(templateId: string): Promise<Template>;\n save(): Promise<SaveResult>;\n}\n\n// ---------------------------------------------------------------------------\n// OSS init — sync\n// ---------------------------------------------------------------------------\n\nlet appInstance: App | null = null;\nconst editorRef: Ref<InstanceType<typeof Editor> | null> = ref(null);\n\nexport async function init(\n config: TemplaticalEditorConfig,\n): Promise<TemplaticalEditor> {\n const container =\n typeof config.container === \"string\"\n ? document.querySelector(config.container)\n : config.container;\n\n if (!container) {\n throw new Error(\n `[Templatical] Container element not found: ${config.container}`,\n );\n }\n\n // Load translations before mounting so child components can use useI18n synchronously\n const translations = await loadTranslations(config.locale ?? \"en\");\n\n // Create fonts manager to pass to Editor\n const fontsManager = useFonts(config.fonts);\n\n // Unmount any prior app *after* awaits — checking before the await would\n // let two concurrent init() calls both pass the guard while appInstance is\n // still null and orphan the first-mounted app.\n if (appInstance) {\n unmount();\n }\n\n appInstance = createApp({\n setup() {\n return () =>\n h(Editor, {\n config,\n translations,\n fontsManager,\n ref: editorRef,\n });\n },\n });\n\n appInstance.mount(container);\n\n const instance: TemplaticalEditor = {\n getContent() {\n if (editorRef.value) {\n return JSON.parse(JSON.stringify(editorRef.value.getContent()));\n }\n return JSON.parse(JSON.stringify(config.content));\n },\n setContent(content: TemplateContent) {\n if (editorRef.value) {\n editorRef.value.setContent(content);\n }\n config.content = content;\n },\n setTheme(theme: UiTheme) {\n if (editorRef.value) {\n editorRef.value.setTheme(theme);\n }\n },\n unmount,\n renderCustomBlock(block: CustomBlock) {\n if (!editorRef.value) {\n return Promise.reject(new Error(\"[Templatical] Editor not ready\"));\n }\n return editorRef.value.renderCustomBlock(block);\n },\n toMjml: () => toMjmlForInstance(instance),\n };\n\n return instance;\n}\n\n// ---------------------------------------------------------------------------\n// Cloud init — async, flat config, tree-shaken when not called\n// ---------------------------------------------------------------------------\n\nlet cloudAppInstance: App | null = null;\n\nconst cloudEditorRef: Ref<InstanceType<\n typeof import(\"./cloud/CloudEditor.vue\").default\n> | null> = ref(null);\n\nexport async function initCloud(\n config: import(\"./cloud/CloudEditor.vue\").TemplaticalCloudEditorConfig,\n): Promise<TemplaticalCloudEditor> {\n const container =\n typeof config.container === \"string\"\n ? document.querySelector(config.container)\n : config.container;\n\n if (!container) {\n throw new Error(\n `[Templatical] Container element not found: ${config.container}`,\n );\n }\n\n // Dynamic import — CloudEditor.vue is tree-shaken from the OSS bundle\n const { default: CloudEditor } = await import(\"./cloud/CloudEditor.vue\");\n\n // Load OSS + cloud translations in parallel so child components can use\n // useI18n / useCloudI18n synchronously\n const [translations, cloudTranslations] = await Promise.all([\n loadTranslations(config.locale ?? \"en\"),\n loadCloudTranslations(config.locale ?? \"en\"),\n ]);\n\n // Create fonts manager to pass to CloudEditor\n const fontsManager = useFonts(config.fonts);\n\n // Unmount any prior app *after* awaits — checking before the await would\n // let two concurrent initCloud() calls both pass the guard while\n // cloudAppInstance is still null and orphan the first-mounted app.\n if (cloudAppInstance) {\n unmountCloud();\n }\n\n // Promise that resolves when CloudEditor emits 'ready'\n const readyPromise = new Promise<void>((resolve, reject) => {\n const timeout = setTimeout(() => {\n reject(new Error(\"[Templatical] Cloud editor initialization timed out\"));\n }, INIT_TIMEOUT_MS);\n\n cloudAppInstance = createApp({\n setup() {\n return () =>\n h(CloudEditor, {\n config,\n translations,\n cloudTranslations,\n fontsManager,\n ref: cloudEditorRef,\n onReady: () => {\n clearTimeout(timeout);\n resolve();\n },\n });\n },\n });\n\n cloudAppInstance.mount(container);\n });\n\n await readyPromise;\n\n const instance: TemplaticalCloudEditor = {\n getContent() {\n if (cloudEditorRef.value) {\n return JSON.parse(JSON.stringify(cloudEditorRef.value.getContent()));\n }\n return JSON.parse(JSON.stringify(config.content));\n },\n setContent(content: TemplateContent) {\n if (cloudEditorRef.value) {\n cloudEditorRef.value.setContent(content);\n }\n },\n setTheme(theme: UiTheme) {\n if (cloudEditorRef.value) {\n cloudEditorRef.value.setTheme(theme);\n }\n },\n unmount: unmountCloud,\n create(content?: TemplateContent) {\n if (!cloudEditorRef.value) {\n return Promise.reject(\n new Error(\"[Templatical] Cloud editor not ready\"),\n );\n }\n return cloudEditorRef.value.create(content);\n },\n load(templateId: string) {\n if (!cloudEditorRef.value) {\n return Promise.reject(\n new Error(\"[Templatical] Cloud editor not ready\"),\n );\n }\n return cloudEditorRef.value.load(templateId);\n },\n save() {\n if (!cloudEditorRef.value) {\n return Promise.reject(\n new Error(\"[Templatical] Cloud editor not ready\"),\n );\n }\n return cloudEditorRef.value.save();\n },\n };\n\n return instance;\n}\n\n// ---------------------------------------------------------------------------\n// Unmount helpers\n// ---------------------------------------------------------------------------\n\nexport function unmount(): void {\n if (appInstance) {\n appInstance.unmount();\n appInstance = null;\n editorRef.value = null;\n }\n}\n\nfunction unmountCloud(): void {\n if (cloudAppInstance) {\n cloudAppInstance.unmount();\n cloudAppInstance = null;\n cloudEditorRef.value = null;\n }\n}\n\n// ---------------------------------------------------------------------------\n// Re-exports\n// ---------------------------------------------------------------------------\n\nexport type { TemplaticalCloudEditorConfig } from \"./cloud/CloudEditor.vue\";\nexport type {\n BlockDefaults,\n TemplateContent,\n TemplateDefaults,\n ThemeOverrides,\n UiTheme,\n MergeTagsConfig,\n DisplayConditionsConfig,\n CustomBlockDefinition,\n ViewportSize,\n CustomFont,\n FontsConfig,\n SaveResult,\n Template,\n} from \"@templatical/types\";\n\nexport type { UseFontsReturn, FontOption } from \"./composables/useFonts\";\nexport { useFonts } from \"./composables/useFonts\";\nexport type { EditorCapabilities } from \"./types/editor-capabilities\";\n"],"mappings":"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"}