@templatical/editor 0.25.0 → 0.25.2

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 (216) hide show
  1. package/dist/{AiChatSidebar-CIkS8DsO.js → AiChatSidebar-JLsbPnsH.js} +14 -14
  2. package/dist/{AiFeatureMenu-Cji1LBJJ.js → AiFeatureMenu-BvA-lViN.js} +7 -7
  3. package/dist/{BlockIssueBadge-BQiT0FML.js → BlockIssueBadge-Cf0-GC3o.js} +5 -5
  4. package/dist/{BlockPreviewCanvas-DAnwZofk.js → BlockPreviewCanvas-CnJIM5TO.js} +3 -3
  5. package/dist/{CloudEditor-CXaft6Ej.js → CloudEditor-Caq7z4-7.js} +25 -25
  6. package/dist/{CollaboratorBar-BR-rL2wG.js → CollaboratorBar-BFz4LgA0.js} +4 -4
  7. package/dist/{ColorPicker-B4ArSUhy.js → ColorPicker-B5xXWWX5.js} +6 -6
  8. package/dist/{CommentsSidebar-Bm5GLDts.js → CommentsSidebar-CGihWwn9.js} +15 -15
  9. package/dist/{CountdownBlock-CIVAQDVu.js → CountdownBlock-DuyvGcr8.js} +3 -3
  10. package/dist/{CountdownToolbar-DBmb3tlb.js → CountdownToolbar-DpNCZAUI.js} +4 -4
  11. package/dist/{DesignReferenceSidebar-CnyJ8L-j.js → DesignReferenceSidebar-CiIHHiil.js} +11 -11
  12. package/dist/{IssuesPanel-D3XgmYCt.js → IssuesPanel-CUkmAC_S.js} +8 -8
  13. package/dist/{LoadingTrack-XK_eeUdq.js → LoadingTrack-BexpNuTV.js} +1 -1
  14. package/dist/{MergeTagModeToggle-BK0fI3P2.js → MergeTagModeToggle-C6nS3qri.js} +5 -5
  15. package/dist/{MergeTagSuggestion-D0OHRv7L.js → MergeTagSuggestion-98fAcuM-.js} +26 -24
  16. package/dist/{NumberWithSuffix-Cjj9UNIp.js → NumberWithSuffix-DB-1GNvx.js} +2 -2
  17. package/dist/{ParagraphEditor-jGnbJEA2.js → ParagraphEditor-NgW-T9YV.js} +114 -97
  18. package/dist/{RichTextEditorContent-DaaKdzjb.js → RichTextEditorContent-CN7OVR6u.js} +8 -8
  19. package/dist/{SaveBlockDialog-B3ngEldp.js → SaveBlockDialog-lgcmhAsO.js} +10 -10
  20. package/dist/{SavedBlocksBrowserModal-DawN3XaB.js → SavedBlocksBrowserModal-3u247V2z.js} +11 -11
  21. package/dist/{SavedBlocksPanels-eDC9Y46N.js → SavedBlocksPanels-Dh6dABJt.js} +2 -2
  22. package/dist/{SavedBlocksPickBar-CQbbXmzj.js → SavedBlocksPickBar-Bo82D3Qy.js} +4 -4
  23. package/dist/{SnapshotHistory-COxKtHM-.js → SnapshotHistory-Dsb1i40w.js} +16 -16
  24. package/dist/{TemplateScoringPanel-bUuqOO1z.js → TemplateScoringPanel-Bzd_YSag.js} +15 -15
  25. package/dist/{TestEmailModal-CytkbZVQ.js → TestEmailModal-DvqDTOcO.js} +10 -10
  26. package/dist/{TestEmailPanel-CHUY7VZn.js → TestEmailPanel-BXoVnAqu.js} +2 -2
  27. package/dist/{TitleEditor-aMR1bOyY.js → TitleEditor-DWSi998C.js} +12 -12
  28. package/dist/{TplModal-fmYNYdyp.js → TplModal-DKn0h2qe.js} +5 -5
  29. package/dist/{blockTypeIcons-C6b9rg88.js → blockTypeIcons-DKlza6aR.js} +2 -2
  30. package/dist/bundle-stats.json +6 -6
  31. package/dist/{ca-8Dvbwo50.js → ca-D1zgI9fQ.js} +1 -0
  32. package/dist/cdn/chunks/{AiChatSidebar-bkBKpNgE.js → AiChatSidebar-BY1Iy-e8.js} +14 -14
  33. package/dist/cdn/chunks/{AiChatSidebar-bkBKpNgE.js.map → AiChatSidebar-BY1Iy-e8.js.map} +1 -1
  34. package/dist/cdn/chunks/{AiFeatureMenu-CI4SYTq2.js → AiFeatureMenu-BS4Rek6j.js} +6 -6
  35. package/dist/cdn/chunks/{AiFeatureMenu-CI4SYTq2.js.map → AiFeatureMenu-BS4Rek6j.js.map} +1 -1
  36. package/dist/cdn/chunks/{BlockIssueBadge-CRnx8Dv9.js → BlockIssueBadge-BcIQUe_Q.js} +5 -5
  37. package/dist/cdn/chunks/{BlockIssueBadge-CRnx8Dv9.js.map → BlockIssueBadge-BcIQUe_Q.js.map} +1 -1
  38. package/dist/cdn/chunks/{BlockPreviewCanvas-CXCWhqbp.js → BlockPreviewCanvas-oND1iXLL.js} +4 -4
  39. package/dist/cdn/chunks/{BlockPreviewCanvas-CXCWhqbp.js.map → BlockPreviewCanvas-oND1iXLL.js.map} +1 -1
  40. package/dist/cdn/chunks/{CloudEditor-D-t7RyDh.js → CloudEditor-BaqiFbf0.js} +28 -28
  41. package/dist/cdn/chunks/{CloudEditor-D-t7RyDh.js.map → CloudEditor-BaqiFbf0.js.map} +1 -1
  42. package/dist/cdn/chunks/{CollaboratorBar-DcXYo47v.js → CollaboratorBar-DF02nTwF.js} +5 -5
  43. package/dist/cdn/chunks/{CollaboratorBar-DcXYo47v.js.map → CollaboratorBar-DF02nTwF.js.map} +1 -1
  44. package/dist/cdn/chunks/{ColorPicker-_1O7YU2z.js → ColorPicker-BXH44v2H.js} +7 -7
  45. package/dist/cdn/chunks/{ColorPicker-_1O7YU2z.js.map → ColorPicker-BXH44v2H.js.map} +1 -1
  46. package/dist/cdn/chunks/{CommentsSidebar-BEgLBYX-.js → CommentsSidebar-B9bWvvbl.js} +10 -10
  47. package/dist/cdn/chunks/{CommentsSidebar-BEgLBYX-.js.map → CommentsSidebar-B9bWvvbl.js.map} +1 -1
  48. package/dist/cdn/chunks/{CountdownBlock-CPnQA44g.js → CountdownBlock-BTpRd0Hn.js} +4 -4
  49. package/dist/cdn/chunks/{CountdownBlock-CPnQA44g.js.map → CountdownBlock-BTpRd0Hn.js.map} +1 -1
  50. package/dist/cdn/chunks/{CountdownToolbar-Cdo-30U4.js → CountdownToolbar-CW10rbWt.js} +5 -5
  51. package/dist/cdn/chunks/{CountdownToolbar-Cdo-30U4.js.map → CountdownToolbar-CW10rbWt.js.map} +1 -1
  52. package/dist/cdn/chunks/{DesignReferenceSidebar-DPqBr-ut.js → DesignReferenceSidebar-BXjH47QC.js} +9 -9
  53. package/dist/cdn/chunks/{DesignReferenceSidebar-DPqBr-ut.js.map → DesignReferenceSidebar-BXjH47QC.js.map} +1 -1
  54. package/dist/cdn/chunks/{IssuesPanel-DoQWb23r.js → IssuesPanel-DStHCHfr.js} +7 -7
  55. package/dist/cdn/chunks/{IssuesPanel-DoQWb23r.js.map → IssuesPanel-DStHCHfr.js.map} +1 -1
  56. package/dist/cdn/chunks/{LoadingTrack-G2tuXqCJ.js → LoadingTrack-DQowK3MV.js} +2 -2
  57. package/dist/cdn/chunks/{LoadingTrack-G2tuXqCJ.js.map → LoadingTrack-DQowK3MV.js.map} +1 -1
  58. package/dist/cdn/chunks/{MergeTagModeToggle-CWuVC3MU.js → MergeTagModeToggle-BCmQg4Qe.js} +5 -5
  59. package/dist/cdn/chunks/{MergeTagModeToggle-CWuVC3MU.js.map → MergeTagModeToggle-BCmQg4Qe.js.map} +1 -1
  60. package/dist/cdn/chunks/{MergeTagSuggestion-Ces5Ua78.js → MergeTagSuggestion-BgExdloL.js} +3 -3
  61. package/dist/cdn/chunks/{MergeTagSuggestion-Ces5Ua78.js.map → MergeTagSuggestion-BgExdloL.js.map} +1 -1
  62. package/dist/cdn/chunks/{NumberWithSuffix-DQ4sgvt5.js → NumberWithSuffix-BANVbpT0.js} +3 -3
  63. package/dist/cdn/chunks/{NumberWithSuffix-DQ4sgvt5.js.map → NumberWithSuffix-BANVbpT0.js.map} +1 -1
  64. package/dist/cdn/chunks/{ParagraphEditor-Uv5LPF3W.js → ParagraphEditor-DqilB4_f.js} +142 -132
  65. package/dist/cdn/chunks/ParagraphEditor-DqilB4_f.js.map +1 -0
  66. package/dist/cdn/chunks/{RichTextEditorContent-Bt3s09qY.js → RichTextEditorContent-BeJx4LVH.js} +7 -7
  67. package/dist/cdn/chunks/{RichTextEditorContent-Bt3s09qY.js.map → RichTextEditorContent-BeJx4LVH.js.map} +1 -1
  68. package/dist/cdn/chunks/{SaveBlockDialog-BAew6EFd.js → SaveBlockDialog-Dm31xRZy.js} +8 -8
  69. package/dist/cdn/chunks/{SaveBlockDialog-BAew6EFd.js.map → SaveBlockDialog-Dm31xRZy.js.map} +1 -1
  70. package/dist/cdn/chunks/{SavedBlocksBrowserModal-Dn4IJDJW.js → SavedBlocksBrowserModal-Tp37b4y7.js} +9 -9
  71. package/dist/cdn/chunks/{SavedBlocksBrowserModal-Dn4IJDJW.js.map → SavedBlocksBrowserModal-Tp37b4y7.js.map} +1 -1
  72. package/dist/cdn/chunks/{SavedBlocksPanels-B62U5DYW.js → SavedBlocksPanels-ElerTTa_.js} +3 -3
  73. package/dist/cdn/chunks/{SavedBlocksPanels-B62U5DYW.js.map → SavedBlocksPanels-ElerTTa_.js.map} +1 -1
  74. package/dist/cdn/chunks/{SavedBlocksPickBar-CyRKZg2T.js → SavedBlocksPickBar-QHJ-Mjx0.js} +7 -7
  75. package/dist/cdn/chunks/{SavedBlocksPickBar-CyRKZg2T.js.map → SavedBlocksPickBar-QHJ-Mjx0.js.map} +1 -1
  76. package/dist/cdn/chunks/{SnapshotHistory-QQt0DKey.js → SnapshotHistory-jogWGLB-.js} +12 -12
  77. package/dist/cdn/chunks/{SnapshotHistory-QQt0DKey.js.map → SnapshotHistory-jogWGLB-.js.map} +1 -1
  78. package/dist/cdn/chunks/{TemplateScoringPanel-BwyCMcit.js → TemplateScoringPanel-B2XIOTl-.js} +52 -52
  79. package/dist/cdn/chunks/{TemplateScoringPanel-BwyCMcit.js.map → TemplateScoringPanel-B2XIOTl-.js.map} +1 -1
  80. package/dist/cdn/chunks/{TestEmailModal-B5UQkDJp.js → TestEmailModal-BcPjQygV.js} +9 -9
  81. package/dist/cdn/chunks/{TestEmailModal-B5UQkDJp.js.map → TestEmailModal-BcPjQygV.js.map} +1 -1
  82. package/dist/cdn/chunks/{TestEmailPanel-CvuBq4RA.js → TestEmailPanel-1zxRa00s.js} +3 -3
  83. package/dist/cdn/chunks/{TestEmailPanel-CvuBq4RA.js.map → TestEmailPanel-1zxRa00s.js.map} +1 -1
  84. package/dist/cdn/chunks/{TitleEditor-B9W954u9.js → TitleEditor-DTrmublj.js} +14 -14
  85. package/dist/cdn/chunks/{TitleEditor-B9W954u9.js.map → TitleEditor-DTrmublj.js.map} +1 -1
  86. package/dist/cdn/chunks/{TplModal-B8UsvWc8.js → TplModal-By50gtwa.js} +5 -5
  87. package/dist/cdn/chunks/{TplModal-B8UsvWc8.js.map → TplModal-By50gtwa.js.map} +1 -1
  88. package/dist/cdn/chunks/blockTypeIcons-BhFhHuFt.js +21 -0
  89. package/dist/cdn/chunks/{blockTypeIcons-B8s3_ahs.js.map → blockTypeIcons-BhFhHuFt.js.map} +1 -1
  90. package/dist/cdn/chunks/{ca-8Dvbwo50.js → ca-D1zgI9fQ.js} +2 -1
  91. package/dist/cdn/chunks/ca-D1zgI9fQ.js.map +1 -0
  92. package/dist/cdn/chunks/{cloud-DOaGUdR0.js → cloud-B0f7Ub8f.js} +3 -3
  93. package/dist/cdn/chunks/{cloud-DOaGUdR0.js.map → cloud-B0f7Ub8f.js.map} +1 -1
  94. package/dist/cdn/chunks/{de-CieSMCUp.js → de-DHra3lvx.js} +2 -1
  95. package/dist/cdn/chunks/de-DHra3lvx.js.map +1 -0
  96. package/dist/cdn/chunks/{dist-lZgXNk4G.js → dist-B4VIlp1g.js} +3 -3
  97. package/dist/cdn/chunks/{dist-lZgXNk4G.js.map → dist-B4VIlp1g.js.map} +1 -1
  98. package/dist/cdn/chunks/{dist-B8AX9np4.js → dist-H51neg3K.js} +10 -8
  99. package/dist/cdn/chunks/{dist-B8AX9np4.js.map → dist-H51neg3K.js.map} +1 -1
  100. package/dist/cdn/chunks/{draggable-JcMTNF3U.js → draggable-Z4XXmbPC.js} +556 -522
  101. package/dist/cdn/chunks/draggable-Z4XXmbPC.js.map +1 -0
  102. package/dist/cdn/chunks/{en-D0t_2Fq_.js → en-DlqX2YWZ.js} +2 -1
  103. package/dist/cdn/chunks/en-DlqX2YWZ.js.map +1 -0
  104. package/dist/cdn/chunks/{es-DwDoNuLM.js → es-Cuss2snv.js} +2 -1
  105. package/dist/cdn/chunks/es-Cuss2snv.js.map +1 -0
  106. package/dist/cdn/chunks/{extensions-5jgtarD-.js → extensions-Dq0D79tq.js} +6 -6
  107. package/dist/cdn/chunks/{extensions-5jgtarD-.js.map → extensions-Dq0D79tq.js.map} +1 -1
  108. package/dist/cdn/chunks/{fr-CSEEzv1_.js → fr-Cm85vB2g.js} +2 -1
  109. package/dist/cdn/chunks/fr-Cm85vB2g.js.map +1 -0
  110. package/dist/cdn/chunks/{htmlparser-CPhs2cYE.js → htmlparser-DTML8Gvz.js} +8 -7
  111. package/dist/cdn/chunks/{htmlparser-CPhs2cYE.js.map → htmlparser-DTML8Gvz.js.map} +1 -1
  112. package/dist/cdn/chunks/{icons-Cp4ZIJw-.js → icons-C_kRN0_C.js} +104 -97
  113. package/dist/cdn/chunks/icons-C_kRN0_C.js.map +1 -0
  114. package/dist/cdn/chunks/{keys-BxPCfHBH.js → keys-DsoX52o_.js} +2 -2
  115. package/dist/cdn/chunks/{keys-BxPCfHBH.js.map → keys-DsoX52o_.js.map} +1 -1
  116. package/dist/cdn/chunks/{liquid.browser-CZaQe87t.js → liquid.browser-DrGys_ek.js} +22 -20
  117. package/dist/cdn/chunks/{liquid.browser-CZaQe87t.js.map → liquid.browser-DrGys_ek.js.map} +1 -1
  118. package/dist/cdn/chunks/{nl-xyk1T2mA.js → nl-dmiIX7oT.js} +2 -1
  119. package/dist/cdn/chunks/nl-dmiIX7oT.js.map +1 -0
  120. package/dist/cdn/chunks/{pt-BR-yr6uOJgn.js → pt-BR-CaIG-7EM.js} +2 -1
  121. package/dist/cdn/chunks/pt-BR-CaIG-7EM.js.map +1 -0
  122. package/dist/cdn/chunks/{pusher-kUlkqMvR.js → pusher-BbIHJKf3.js} +29 -25
  123. package/dist/cdn/chunks/{pusher-kUlkqMvR.js.map → pusher-BbIHJKf3.js.map} +1 -1
  124. package/dist/cdn/chunks/{src-C417zeUg.js → src-Aea1Vl1H.js} +2 -2
  125. package/dist/cdn/chunks/{src-C417zeUg.js.map → src-Aea1Vl1H.js.map} +1 -1
  126. package/dist/cdn/chunks/{src-Dpj0x27M.js → src-CRvTVX4F.js} +427 -424
  127. package/dist/cdn/chunks/{src-Dpj0x27M.js.map → src-CRvTVX4F.js.map} +1 -1
  128. package/dist/cdn/chunks/{src-B8W42vT-.js → src-_GNJgPcS.js} +216 -176
  129. package/dist/cdn/chunks/src-_GNJgPcS.js.map +1 -0
  130. package/dist/cdn/chunks/{styles-DANwMzW2.js → styles-znpPfrFd.js} +79 -79
  131. package/dist/cdn/chunks/{styles-DANwMzW2.js.map → styles-znpPfrFd.js.map} +1 -1
  132. package/dist/cdn/chunks/{tiptap-rsib432n.js → tiptap-C5vzWlHv.js} +225 -183
  133. package/dist/cdn/chunks/tiptap-C5vzWlHv.js.map +1 -0
  134. package/dist/cdn/chunks/{useAliveFlag-CseYNikC.js → useAliveFlag-4IDYQRNu.js} +2 -2
  135. package/dist/cdn/chunks/{useAliveFlag-CseYNikC.js.map → useAliveFlag-4IDYQRNu.js.map} +1 -1
  136. package/dist/cdn/chunks/{useCloudI18n-CjVzv11v.js → useCloudI18n-D4JpHTPk.js} +3 -3
  137. package/dist/cdn/chunks/{useCloudI18n-CjVzv11v.js.map → useCloudI18n-D4JpHTPk.js.map} +1 -1
  138. package/dist/cdn/chunks/{useEditorCore-DfW-thCr.js → useEditorCore-BMXBmdd8.js} +28 -28
  139. package/dist/cdn/chunks/useEditorCore-BMXBmdd8.js.map +1 -0
  140. package/dist/cdn/chunks/{useI18n-DniEFeIl.js → useI18n-BvcEYzrI.js} +3 -3
  141. package/dist/cdn/chunks/{useI18n-DniEFeIl.js.map → useI18n-BvcEYzrI.js.map} +1 -1
  142. package/dist/cdn/chunks/{useMergeTag-Bk9_f5cc.js → useMergeTag-BSdxMUzg.js} +3 -3
  143. package/dist/cdn/chunks/{useMergeTag-Bk9_f5cc.js.map → useMergeTag-BSdxMUzg.js.map} +1 -1
  144. package/dist/cdn/chunks/{usePopoverPosition-C4xFJCJ2.js → usePopoverPosition-ig-71caO.js} +3 -3
  145. package/dist/cdn/chunks/{usePopoverPosition-C4xFJCJ2.js.map → usePopoverPosition-ig-71caO.js.map} +1 -1
  146. package/dist/cdn/editor.js +15 -15
  147. package/dist/{check-CIhIDh4h.js → check-COV27dGb.js} +1 -1
  148. package/dist/{chevron-down-CZ0m6G3s.js → chevron-down-vsU88vcr.js} +1 -1
  149. package/dist/{chevron-up-BH_tJLeb.js → chevron-up-RrZ0Rjn9.js} +1 -1
  150. package/dist/{circle-alert-DkEXnGPV.js → circle-alert-B6GlHmmi.js} +1 -1
  151. package/dist/{clock-BDIJZUET.js → clock-egOt8zjQ.js} +1 -1
  152. package/dist/{cloud-BZn3jqoL.js → cloud-D-2StbvU.js} +1 -1
  153. package/dist/{createLucideIcon-AEltGIse.js → createLucideIcon-D6cqT5Pm.js} +3 -3
  154. package/dist/{de-CieSMCUp.js → de-DHra3lvx.js} +1 -0
  155. package/dist/{dist-iCEDH3cC.js → dist-B56SufAv.js} +1 -1
  156. package/dist/{dist-CkPvZCld.js → dist-BQZkRg05.js} +1 -1
  157. package/dist/{dist-DT1XnEnj.js → dist-BpKxrUi2.js} +2 -2
  158. package/dist/{dist-CcQFPJMF.js → dist-CHxPjcxA.js} +181 -145
  159. package/dist/{dist-BxbTVeY0.js → dist-CqV4XslQ.js} +1 -1
  160. package/dist/{dist-Dx71pluS.js → dist-D4GoAr2g.js} +9 -7
  161. package/dist/{dist-DSIgxp0v.js → dist-DHwnYYx0.js} +1 -1
  162. package/dist/{dist-DX4x6mQ1.js → dist-Du95Y9M3.js} +1 -1
  163. package/dist/{dist-B6Px6GPj.js → dist-DzzTB4eE.js} +1 -1
  164. package/dist/{dist-DyCHUyRR.js → dist-GUZZpDK3.js} +1 -1
  165. package/dist/{dist-nR6mxyqI.js → dist-MwT7T6Xp.js} +1 -1
  166. package/dist/{dist-CIqhVQ1O.js → dist-UkG5ZJ1P.js} +17 -15
  167. package/dist/{dist-CRH880TV.js → dist-vpuiQ7_Q.js} +1 -1
  168. package/dist/{en-D0t_2Fq_.js → en-DlqX2YWZ.js} +1 -0
  169. package/dist/{es-DwDoNuLM.js → es-Cuss2snv.js} +1 -0
  170. package/dist/{extensions-BjvyU9Ea.js → extensions-y6KjLr9t.js} +7 -7
  171. package/dist/{fr-CSEEzv1_.js → fr-Cm85vB2g.js} +1 -0
  172. package/dist/{image-up-8ktdYdaZ.js → image-up-CycES-MQ.js} +1 -1
  173. package/dist/{info-CvrCgTLH.js → info-BUdvm046.js} +1 -1
  174. package/dist/{keys-BFPiNAIn.js → keys-fwF3qZax.js} +1 -1
  175. package/dist/{liquid.browser-BECWFL5Z.js → liquid.browser-Di5zMIEx.js} +21 -19
  176. package/dist/{list-checks-yzGT93ZL.js → list-checks-BAeuuATD.js} +1 -1
  177. package/dist/{loader-circle-B6euendB.js → loader-circle-L5yuAx_j.js} +1 -1
  178. package/dist/{message-circle-BMldLVcA.js → message-circle-DRdaapVc.js} +1 -1
  179. package/dist/{nl-xyk1T2mA.js → nl-dmiIX7oT.js} +1 -0
  180. package/dist/{pencil-CkKkSd6N.js → pencil-BfErVPf_.js} +1 -1
  181. package/dist/{pt-BR-yr6uOJgn.js → pt-BR-CaIG-7EM.js} +1 -0
  182. package/dist/{refresh-cw-fBPgB97G.js → refresh-cw-D0PYatER.js} +1 -1
  183. package/dist/{runtime-dom.esm-bundler-CBbDt7sw.js → runtime-dom.esm-bundler-CepEmvwF.js} +172 -168
  184. package/dist/{scan-line-CRoEOUiK.js → scan-line-Byi3fJcr.js} +1 -1
  185. package/dist/{send-B9Tt2qBi.js → send-DuyNexMY.js} +1 -1
  186. package/dist/{shield-check-QfZkYeIo.js → shield-check-BkkN_1qw.js} +1 -1
  187. package/dist/{sparkles-8UeMmZb8.js → sparkles-DAw2sBXk.js} +1 -1
  188. package/dist/{styles-C9GM-bBC.js → styles-BzwheHH_.js} +32 -32
  189. package/dist/templatical-editor.js +17 -17
  190. package/dist/{text-align-start-Dn8uIheW.js → text-align-start-Ba3xJKn6.js} +1 -1
  191. package/dist/{trash-2-DDyvqj0E.js → trash-2-CapEBXBI.js} +1 -1
  192. package/dist/{triangle-alert-B3PydLzl.js → triangle-alert-52pdw8jI.js} +1 -1
  193. package/dist/{upload-hE8ItfyG.js → upload-oAgigC31.js} +1 -1
  194. package/dist/{useAliveFlag-AfoTE_AY.js → useAliveFlag-cvyBxHp7.js} +1 -1
  195. package/dist/{useCloudI18n-B2lItQ6O.js → useCloudI18n-DKVm6PCa.js} +2 -2
  196. package/dist/{useEditorCore-Ck_hBiGA.js → useEditorCore-BhjEMSeE.js} +23 -23
  197. package/dist/{useI18n-C1KcdX_K.js → useI18n-DoVKdCTH.js} +2 -2
  198. package/dist/{useMergeTag-DHCwRMfH.js → useMergeTag-DTSOQnyr.js} +2 -2
  199. package/dist/{usePopoverPosition-ClnEh_Cp.js → usePopoverPosition-C0dPEF4X.js} +4 -4
  200. package/dist/{vue.runtime.esm-bundler-Xpz-L9Fn.js → vue.runtime.esm-bundler-D1diBMsm.js} +297 -251
  201. package/dist/{x-C4lETLDx.js → x-DvBgbDuf.js} +1 -1
  202. package/package.json +11 -11
  203. package/dist/cdn/chunks/ParagraphEditor-Uv5LPF3W.js.map +0 -1
  204. package/dist/cdn/chunks/blockTypeIcons-B8s3_ahs.js +0 -21
  205. package/dist/cdn/chunks/ca-8Dvbwo50.js.map +0 -1
  206. package/dist/cdn/chunks/de-CieSMCUp.js.map +0 -1
  207. package/dist/cdn/chunks/draggable-JcMTNF3U.js.map +0 -1
  208. package/dist/cdn/chunks/en-D0t_2Fq_.js.map +0 -1
  209. package/dist/cdn/chunks/es-DwDoNuLM.js.map +0 -1
  210. package/dist/cdn/chunks/fr-CSEEzv1_.js.map +0 -1
  211. package/dist/cdn/chunks/icons-Cp4ZIJw-.js.map +0 -1
  212. package/dist/cdn/chunks/nl-xyk1T2mA.js.map +0 -1
  213. package/dist/cdn/chunks/pt-BR-yr6uOJgn.js.map +0 -1
  214. package/dist/cdn/chunks/src-B8W42vT-.js.map +0 -1
  215. package/dist/cdn/chunks/tiptap-rsib432n.js.map +0 -1
  216. package/dist/cdn/chunks/useEditorCore-DfW-thCr.js.map +0 -1
@@ -1 +1 @@
1
- {"version":3,"file":"BlockPreviewCanvas-CXCWhqbp.js","names":[],"sources":["../../../src/components/blocks/PreviewSectionBlock.vue","../../../src/components/blocks/PreviewSectionBlock.vue","../../../src/components/BlockPreviewCanvas.vue","../../../src/components/BlockPreviewCanvas.vue"],"sourcesContent":["<script setup lang=\"ts\">\nimport ButtonBlock from \"./ButtonBlock.vue\";\nimport CustomBlock from \"./CustomBlock.vue\";\nimport DividerBlock from \"./DividerBlock.vue\";\nimport HtmlBlock from \"./HtmlBlock.vue\";\nimport ImageBlock from \"./ImageBlock.vue\";\nimport MenuBlock from \"./MenuBlock.vue\";\nimport SocialIconsBlock from \"./SocialIconsBlock.vue\";\nimport SpacerBlock from \"./SpacerBlock.vue\";\nimport TableBlock from \"./TableBlock.vue\";\nimport TitleBlock from \"./TitleBlock.vue\";\nimport ParagraphBlock from \"./ParagraphBlock.vue\";\nimport VideoBlock from \"./VideoBlock.vue\";\nimport {\n resolveBlockComponent,\n getBlockWrapperStyle,\n} from \"../../utils/blockComponentResolver\";\nimport type {\n Block,\n SectionBlock as SectionBlockType,\n} from \"@templatical/types\";\nimport { computed, inject, type Component } from \"vue\";\nimport { BLOCK_REGISTRY_KEY } from \"../../keys\";\n\nconst previewBlockComponentMap: Record<string, Component> = {\n title: TitleBlock,\n paragraph: ParagraphBlock,\n image: ImageBlock,\n video: VideoBlock,\n button: ButtonBlock,\n divider: DividerBlock,\n social: SocialIconsBlock,\n menu: MenuBlock,\n table: TableBlock,\n spacer: SpacerBlock,\n html: HtmlBlock,\n custom: CustomBlock,\n};\n\nconst props = defineProps<{\n block: SectionBlockType;\n viewport: \"desktop\";\n}>();\n\ndefineOptions({ name: \"PreviewSectionBlock\" });\n\nconst blockRegistry = inject(BLOCK_REGISTRY_KEY, null);\n\nconst columnWidths = computed(() => {\n switch (props.block.columns) {\n case \"2\":\n return [\"50%\", \"50%\"];\n case \"3\":\n return [\"33.33%\", \"33.33%\", \"33.33%\"];\n case \"1-2\":\n return [\"33.33%\", \"66.67%\"];\n case \"2-1\":\n return [\"66.67%\", \"33.33%\"];\n default:\n return [\"100%\"];\n }\n});\n\nconst columns = computed(() => {\n const count = columnWidths.value.length;\n const children = [...props.block.children];\n while (children.length < count) {\n children.push([]);\n }\n return children.slice(0, count);\n});\n\nfunction getColumnBlocks(colIndex: number): Block[] {\n return columns.value[colIndex] || [];\n}\n\nfunction getBlockComponent(block: Block): Component | null {\n return resolveBlockComponent(block, blockRegistry, previewBlockComponentMap);\n}\n</script>\n\n<template>\n <div class=\"tpl:w-full\">\n <div class=\"tpl:flex tpl:gap-0\">\n <div\n v-for=\"(_, colIndex) in columns\"\n :key=\"colIndex\"\n :style=\"{ width: columnWidths[colIndex] }\"\n >\n <div\n v-for=\"childBlock in getColumnBlocks(colIndex)\"\n :key=\"childBlock.id\"\n :style=\"getBlockWrapperStyle(childBlock)\"\n >\n <!-- Recursive self-reference for nested sections -->\n <PreviewSectionBlock\n v-if=\"childBlock.type === 'section'\"\n :block=\"childBlock\"\n viewport=\"desktop\"\n />\n <component\n :is=\"getBlockComponent(childBlock)\"\n v-else\n :block=\"childBlock\"\n viewport=\"desktop\"\n />\n </div>\n </div>\n </div>\n </div>\n</template>\n","<script setup lang=\"ts\">\nimport ButtonBlock from \"./ButtonBlock.vue\";\nimport CustomBlock from \"./CustomBlock.vue\";\nimport DividerBlock from \"./DividerBlock.vue\";\nimport HtmlBlock from \"./HtmlBlock.vue\";\nimport ImageBlock from \"./ImageBlock.vue\";\nimport MenuBlock from \"./MenuBlock.vue\";\nimport SocialIconsBlock from \"./SocialIconsBlock.vue\";\nimport SpacerBlock from \"./SpacerBlock.vue\";\nimport TableBlock from \"./TableBlock.vue\";\nimport TitleBlock from \"./TitleBlock.vue\";\nimport ParagraphBlock from \"./ParagraphBlock.vue\";\nimport VideoBlock from \"./VideoBlock.vue\";\nimport {\n resolveBlockComponent,\n getBlockWrapperStyle,\n} from \"../../utils/blockComponentResolver\";\nimport type {\n Block,\n SectionBlock as SectionBlockType,\n} from \"@templatical/types\";\nimport { computed, inject, type Component } from \"vue\";\nimport { BLOCK_REGISTRY_KEY } from \"../../keys\";\n\nconst previewBlockComponentMap: Record<string, Component> = {\n title: TitleBlock,\n paragraph: ParagraphBlock,\n image: ImageBlock,\n video: VideoBlock,\n button: ButtonBlock,\n divider: DividerBlock,\n social: SocialIconsBlock,\n menu: MenuBlock,\n table: TableBlock,\n spacer: SpacerBlock,\n html: HtmlBlock,\n custom: CustomBlock,\n};\n\nconst props = defineProps<{\n block: SectionBlockType;\n viewport: \"desktop\";\n}>();\n\ndefineOptions({ name: \"PreviewSectionBlock\" });\n\nconst blockRegistry = inject(BLOCK_REGISTRY_KEY, null);\n\nconst columnWidths = computed(() => {\n switch (props.block.columns) {\n case \"2\":\n return [\"50%\", \"50%\"];\n case \"3\":\n return [\"33.33%\", \"33.33%\", \"33.33%\"];\n case \"1-2\":\n return [\"33.33%\", \"66.67%\"];\n case \"2-1\":\n return [\"66.67%\", \"33.33%\"];\n default:\n return [\"100%\"];\n }\n});\n\nconst columns = computed(() => {\n const count = columnWidths.value.length;\n const children = [...props.block.children];\n while (children.length < count) {\n children.push([]);\n }\n return children.slice(0, count);\n});\n\nfunction getColumnBlocks(colIndex: number): Block[] {\n return columns.value[colIndex] || [];\n}\n\nfunction getBlockComponent(block: Block): Component | null {\n return resolveBlockComponent(block, blockRegistry, previewBlockComponentMap);\n}\n</script>\n\n<template>\n <div class=\"tpl:w-full\">\n <div class=\"tpl:flex tpl:gap-0\">\n <div\n v-for=\"(_, colIndex) in columns\"\n :key=\"colIndex\"\n :style=\"{ width: columnWidths[colIndex] }\"\n >\n <div\n v-for=\"childBlock in getColumnBlocks(colIndex)\"\n :key=\"childBlock.id\"\n :style=\"getBlockWrapperStyle(childBlock)\"\n >\n <!-- Recursive self-reference for nested sections -->\n <PreviewSectionBlock\n v-if=\"childBlock.type === 'section'\"\n :block=\"childBlock\"\n viewport=\"desktop\"\n />\n <component\n :is=\"getBlockComponent(childBlock)\"\n v-else\n :block=\"childBlock\"\n viewport=\"desktop\"\n />\n </div>\n </div>\n </div>\n </div>\n</template>\n","<script setup lang=\"ts\">\nimport ButtonBlock from \"./blocks/ButtonBlock.vue\";\nimport CustomBlock from \"./blocks/CustomBlock.vue\";\nimport DividerBlock from \"./blocks/DividerBlock.vue\";\nimport HtmlBlock from \"./blocks/HtmlBlock.vue\";\nimport ImageBlock from \"./blocks/ImageBlock.vue\";\nimport MenuBlock from \"./blocks/MenuBlock.vue\";\nimport PreviewSectionBlock from \"./blocks/PreviewSectionBlock.vue\";\nimport SocialIconsBlock from \"./blocks/SocialIconsBlock.vue\";\nimport SpacerBlock from \"./blocks/SpacerBlock.vue\";\nimport TableBlock from \"./blocks/TableBlock.vue\";\nimport TitleBlock from \"./blocks/TitleBlock.vue\";\nimport ParagraphBlock from \"./blocks/ParagraphBlock.vue\";\nimport VideoBlock from \"./blocks/VideoBlock.vue\";\nimport {\n BLOCK_REGISTRY_KEY,\n CONDITION_PREVIEW_KEY,\n EDITOR_KEY,\n MERGE_TAG_SAMPLE_MODE_KEY,\n USE_MERGE_TAG_SAMPLES_KEY,\n} from \"../keys\";\nimport {\n resolveBlockComponent,\n getBlockWrapperStyle,\n getDocumentStyle,\n} from \"../utils/blockComponentResolver\";\nimport {\n EMAIL_FRAME_WIDTH_TRANSITION,\n getEmailFrameWidth,\n} from \"../utils/emailFrameWidth\";\nimport type { Block, ViewportSize } from \"@templatical/types\";\nimport { computed, inject, provide, type Component } from \"vue\";\n\nconst props = withDefaults(\n defineProps<{\n blocks: Block[];\n /**\n * Which viewport to render. Defaults to `desktop`, so the saved-blocks\n * surfaces — which have no viewport control — behave exactly as before.\n * The test-email dialog passes the user's choice so responsive blocks show\n * the variant a recipient on that device would receive.\n */\n viewport?: ViewportSize;\n /**\n * Whether the hand-toggled display-condition filter still applies here.\n * `false` where a resolver owns the preview: it has already evaluated every\n * condition against real data, so layering a manual hide on top would veto\n * the answer that was asked for.\n *\n * A prop rather than an injected `PREVIEW_RESOLUTION_KEY` read, because the\n * test-email dialog builds its *own* resolution instance (keyed to the\n * selected recipient) — injecting would consult the shared canvas instance\n * and get the wrong answer.\n */\n applyConditionFilter?: boolean;\n }>(),\n { viewport: \"desktop\", applyConditionFilter: true },\n);\n\nconst blockRegistry = inject(BLOCK_REGISTRY_KEY);\nconst editor = inject(EDITOR_KEY, null);\nconst conditionPreview = inject(CONDITION_PREVIEW_KEY, null);\n\n/**\n * This canvas is only ever a preview — nothing here is editable — so it honours\n * the user's mode directly, with no `previewMode` gate of the kind `Canvas.vue`\n * needs. Re-provided rather than left to inherit, because a `BlockPreviewCanvas`\n * inside a dialog may sit under an editing `Canvas` that provides `false`.\n */\nconst mergeTagSampleMode = inject(MERGE_TAG_SAMPLE_MODE_KEY, null);\nprovide(\n USE_MERGE_TAG_SAMPLES_KEY,\n computed(() => mergeTagSampleMode?.value ?? false),\n);\n\n/**\n * Blocks a display condition currently excludes, so a preview never shows\n * content the recipient won't get. The canvas does the same via\n * `v-show=\"!conditionPreview?.isHidden(block.id)\"`.\n *\n * A no-op for the saved-blocks browser: entries there carry their *stored* ids,\n * which aren't in the current template, so nothing is tracked as hidden. It\n * bites where it should — the save dialog and the test-email preview, both of\n * which show blocks that are live on the canvas.\n *\n * Skipped entirely when `applyConditionFilter` is false — see the prop.\n */\nconst visibleBlocks = computed(() =>\n props.applyConditionFilter\n ? props.blocks.filter((block) => !conditionPreview?.isHidden(block.id))\n : props.blocks,\n);\n\n/**\n * Frame width, from the one helper the canvas and the scaled preview rows also\n * use — so all three agree by construction rather than by three constants that\n * happen to match. A template with a custom body width now previews at that\n * width instead of a flat 600.\n */\nconst frameWidth = computed(() =>\n getEmailFrameWidth(editor?.content.value.settings, props.viewport),\n);\n\n/**\n * The same document-level style the canvas applies, so a previewed block\n * renders identically to the canvas one: without it the font falls back to the\n * editor UI's and the link rules hit their unset defaults, dropping the\n * underline and the link colour.\n *\n * Read from the *current* template even in the saved-blocks browser, where the\n * previewed content came from elsewhere — a saved block stores only `Block[]`,\n * and the current settings are what it will actually look like once inserted.\n */\nconst documentStyle = computed(() =>\n editor ? getDocumentStyle(editor.content.value.settings) : {},\n);\n\nconst previewComponentMap: Record<string, Component> = {\n section: PreviewSectionBlock,\n title: TitleBlock,\n paragraph: ParagraphBlock,\n image: ImageBlock,\n video: VideoBlock,\n button: ButtonBlock,\n divider: DividerBlock,\n social: SocialIconsBlock,\n menu: MenuBlock,\n table: TableBlock,\n spacer: SpacerBlock,\n html: HtmlBlock,\n custom: CustomBlock,\n};\n\nfunction getBlockComponent(block: Block): Component | null {\n return resolveBlockComponent(block, blockRegistry, previewComponentMap);\n}\n</script>\n\n<template>\n <div\n data-testid=\"block-preview-canvas\"\n class=\"tpl:pointer-events-none tpl:mx-auto tpl:select-none tpl:rounded-lg\"\n :style=\"{\n width: `${frameWidth}px`,\n transition: EMAIL_FRAME_WIDTH_TRANSITION,\n backgroundColor: 'var(--tpl-canvas-bg)',\n boxShadow: 'var(--tpl-shadow-sm)',\n ...documentStyle,\n }\"\n >\n <div\n v-for=\"block in visibleBlocks\"\n :key=\"block.id\"\n :style=\"getBlockWrapperStyle(block)\"\n >\n <component\n :is=\"getBlockComponent(block)\"\n :block=\"block\"\n :viewport=\"viewport\"\n />\n </div>\n </div>\n</template>\n","<script setup lang=\"ts\">\nimport ButtonBlock from \"./blocks/ButtonBlock.vue\";\nimport CustomBlock from \"./blocks/CustomBlock.vue\";\nimport DividerBlock from \"./blocks/DividerBlock.vue\";\nimport HtmlBlock from \"./blocks/HtmlBlock.vue\";\nimport ImageBlock from \"./blocks/ImageBlock.vue\";\nimport MenuBlock from \"./blocks/MenuBlock.vue\";\nimport PreviewSectionBlock from \"./blocks/PreviewSectionBlock.vue\";\nimport SocialIconsBlock from \"./blocks/SocialIconsBlock.vue\";\nimport SpacerBlock from \"./blocks/SpacerBlock.vue\";\nimport TableBlock from \"./blocks/TableBlock.vue\";\nimport TitleBlock from \"./blocks/TitleBlock.vue\";\nimport ParagraphBlock from \"./blocks/ParagraphBlock.vue\";\nimport VideoBlock from \"./blocks/VideoBlock.vue\";\nimport {\n BLOCK_REGISTRY_KEY,\n CONDITION_PREVIEW_KEY,\n EDITOR_KEY,\n MERGE_TAG_SAMPLE_MODE_KEY,\n USE_MERGE_TAG_SAMPLES_KEY,\n} from \"../keys\";\nimport {\n resolveBlockComponent,\n getBlockWrapperStyle,\n getDocumentStyle,\n} from \"../utils/blockComponentResolver\";\nimport {\n EMAIL_FRAME_WIDTH_TRANSITION,\n getEmailFrameWidth,\n} from \"../utils/emailFrameWidth\";\nimport type { Block, ViewportSize } from \"@templatical/types\";\nimport { computed, inject, provide, type Component } from \"vue\";\n\nconst props = withDefaults(\n defineProps<{\n blocks: Block[];\n /**\n * Which viewport to render. Defaults to `desktop`, so the saved-blocks\n * surfaces — which have no viewport control — behave exactly as before.\n * The test-email dialog passes the user's choice so responsive blocks show\n * the variant a recipient on that device would receive.\n */\n viewport?: ViewportSize;\n /**\n * Whether the hand-toggled display-condition filter still applies here.\n * `false` where a resolver owns the preview: it has already evaluated every\n * condition against real data, so layering a manual hide on top would veto\n * the answer that was asked for.\n *\n * A prop rather than an injected `PREVIEW_RESOLUTION_KEY` read, because the\n * test-email dialog builds its *own* resolution instance (keyed to the\n * selected recipient) — injecting would consult the shared canvas instance\n * and get the wrong answer.\n */\n applyConditionFilter?: boolean;\n }>(),\n { viewport: \"desktop\", applyConditionFilter: true },\n);\n\nconst blockRegistry = inject(BLOCK_REGISTRY_KEY);\nconst editor = inject(EDITOR_KEY, null);\nconst conditionPreview = inject(CONDITION_PREVIEW_KEY, null);\n\n/**\n * This canvas is only ever a preview — nothing here is editable — so it honours\n * the user's mode directly, with no `previewMode` gate of the kind `Canvas.vue`\n * needs. Re-provided rather than left to inherit, because a `BlockPreviewCanvas`\n * inside a dialog may sit under an editing `Canvas` that provides `false`.\n */\nconst mergeTagSampleMode = inject(MERGE_TAG_SAMPLE_MODE_KEY, null);\nprovide(\n USE_MERGE_TAG_SAMPLES_KEY,\n computed(() => mergeTagSampleMode?.value ?? false),\n);\n\n/**\n * Blocks a display condition currently excludes, so a preview never shows\n * content the recipient won't get. The canvas does the same via\n * `v-show=\"!conditionPreview?.isHidden(block.id)\"`.\n *\n * A no-op for the saved-blocks browser: entries there carry their *stored* ids,\n * which aren't in the current template, so nothing is tracked as hidden. It\n * bites where it should — the save dialog and the test-email preview, both of\n * which show blocks that are live on the canvas.\n *\n * Skipped entirely when `applyConditionFilter` is false — see the prop.\n */\nconst visibleBlocks = computed(() =>\n props.applyConditionFilter\n ? props.blocks.filter((block) => !conditionPreview?.isHidden(block.id))\n : props.blocks,\n);\n\n/**\n * Frame width, from the one helper the canvas and the scaled preview rows also\n * use — so all three agree by construction rather than by three constants that\n * happen to match. A template with a custom body width now previews at that\n * width instead of a flat 600.\n */\nconst frameWidth = computed(() =>\n getEmailFrameWidth(editor?.content.value.settings, props.viewport),\n);\n\n/**\n * The same document-level style the canvas applies, so a previewed block\n * renders identically to the canvas one: without it the font falls back to the\n * editor UI's and the link rules hit their unset defaults, dropping the\n * underline and the link colour.\n *\n * Read from the *current* template even in the saved-blocks browser, where the\n * previewed content came from elsewhere — a saved block stores only `Block[]`,\n * and the current settings are what it will actually look like once inserted.\n */\nconst documentStyle = computed(() =>\n editor ? getDocumentStyle(editor.content.value.settings) : {},\n);\n\nconst previewComponentMap: Record<string, Component> = {\n section: PreviewSectionBlock,\n title: TitleBlock,\n paragraph: ParagraphBlock,\n image: ImageBlock,\n video: VideoBlock,\n button: ButtonBlock,\n divider: DividerBlock,\n social: SocialIconsBlock,\n menu: MenuBlock,\n table: TableBlock,\n spacer: SpacerBlock,\n html: HtmlBlock,\n custom: CustomBlock,\n};\n\nfunction getBlockComponent(block: Block): Component | null {\n return resolveBlockComponent(block, blockRegistry, previewComponentMap);\n}\n</script>\n\n<template>\n <div\n data-testid=\"block-preview-canvas\"\n class=\"tpl:pointer-events-none tpl:mx-auto tpl:select-none tpl:rounded-lg\"\n :style=\"{\n width: `${frameWidth}px`,\n transition: EMAIL_FRAME_WIDTH_TRANSITION,\n backgroundColor: 'var(--tpl-canvas-bg)',\n boxShadow: 'var(--tpl-shadow-sm)',\n ...documentStyle,\n }\"\n >\n <div\n v-for=\"block in visibleBlocks\"\n :key=\"block.id\"\n :style=\"getBlockWrapperStyle(block)\"\n >\n <component\n :is=\"getBlockComponent(block)\"\n :block=\"block\"\n :viewport=\"viewport\"\n />\n </div>\n </div>\n</template>\n"],"mappings":"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"}
1
+ {"version":3,"file":"BlockPreviewCanvas-oND1iXLL.js","names":[],"sources":["../../../src/components/blocks/PreviewSectionBlock.vue","../../../src/components/blocks/PreviewSectionBlock.vue","../../../src/components/BlockPreviewCanvas.vue","../../../src/components/BlockPreviewCanvas.vue"],"sourcesContent":["<script setup lang=\"ts\">\nimport ButtonBlock from \"./ButtonBlock.vue\";\nimport CustomBlock from \"./CustomBlock.vue\";\nimport DividerBlock from \"./DividerBlock.vue\";\nimport HtmlBlock from \"./HtmlBlock.vue\";\nimport ImageBlock from \"./ImageBlock.vue\";\nimport MenuBlock from \"./MenuBlock.vue\";\nimport SocialIconsBlock from \"./SocialIconsBlock.vue\";\nimport SpacerBlock from \"./SpacerBlock.vue\";\nimport TableBlock from \"./TableBlock.vue\";\nimport TitleBlock from \"./TitleBlock.vue\";\nimport ParagraphBlock from \"./ParagraphBlock.vue\";\nimport VideoBlock from \"./VideoBlock.vue\";\nimport {\n resolveBlockComponent,\n getBlockWrapperStyle,\n} from \"../../utils/blockComponentResolver\";\nimport type {\n Block,\n SectionBlock as SectionBlockType,\n} from \"@templatical/types\";\nimport { computed, inject, type Component } from \"vue\";\nimport { BLOCK_REGISTRY_KEY } from \"../../keys\";\n\nconst previewBlockComponentMap: Record<string, Component> = {\n title: TitleBlock,\n paragraph: ParagraphBlock,\n image: ImageBlock,\n video: VideoBlock,\n button: ButtonBlock,\n divider: DividerBlock,\n social: SocialIconsBlock,\n menu: MenuBlock,\n table: TableBlock,\n spacer: SpacerBlock,\n html: HtmlBlock,\n custom: CustomBlock,\n};\n\nconst props = defineProps<{\n block: SectionBlockType;\n viewport: \"desktop\";\n}>();\n\ndefineOptions({ name: \"PreviewSectionBlock\" });\n\nconst blockRegistry = inject(BLOCK_REGISTRY_KEY, null);\n\nconst columnWidths = computed(() => {\n switch (props.block.columns) {\n case \"2\":\n return [\"50%\", \"50%\"];\n case \"3\":\n return [\"33.33%\", \"33.33%\", \"33.33%\"];\n case \"1-2\":\n return [\"33.33%\", \"66.67%\"];\n case \"2-1\":\n return [\"66.67%\", \"33.33%\"];\n default:\n return [\"100%\"];\n }\n});\n\nconst columns = computed(() => {\n const count = columnWidths.value.length;\n const children = [...props.block.children];\n while (children.length < count) {\n children.push([]);\n }\n return children.slice(0, count);\n});\n\nfunction getColumnBlocks(colIndex: number): Block[] {\n return columns.value[colIndex] || [];\n}\n\nfunction getBlockComponent(block: Block): Component | null {\n return resolveBlockComponent(block, blockRegistry, previewBlockComponentMap);\n}\n</script>\n\n<template>\n <div class=\"tpl:w-full\">\n <div class=\"tpl:flex tpl:gap-0\">\n <div\n v-for=\"(_, colIndex) in columns\"\n :key=\"colIndex\"\n :style=\"{ width: columnWidths[colIndex] }\"\n >\n <div\n v-for=\"childBlock in getColumnBlocks(colIndex)\"\n :key=\"childBlock.id\"\n :style=\"getBlockWrapperStyle(childBlock)\"\n >\n <!-- Recursive self-reference for nested sections -->\n <PreviewSectionBlock\n v-if=\"childBlock.type === 'section'\"\n :block=\"childBlock\"\n viewport=\"desktop\"\n />\n <component\n :is=\"getBlockComponent(childBlock)\"\n v-else\n :block=\"childBlock\"\n viewport=\"desktop\"\n />\n </div>\n </div>\n </div>\n </div>\n</template>\n","<script setup lang=\"ts\">\nimport ButtonBlock from \"./ButtonBlock.vue\";\nimport CustomBlock from \"./CustomBlock.vue\";\nimport DividerBlock from \"./DividerBlock.vue\";\nimport HtmlBlock from \"./HtmlBlock.vue\";\nimport ImageBlock from \"./ImageBlock.vue\";\nimport MenuBlock from \"./MenuBlock.vue\";\nimport SocialIconsBlock from \"./SocialIconsBlock.vue\";\nimport SpacerBlock from \"./SpacerBlock.vue\";\nimport TableBlock from \"./TableBlock.vue\";\nimport TitleBlock from \"./TitleBlock.vue\";\nimport ParagraphBlock from \"./ParagraphBlock.vue\";\nimport VideoBlock from \"./VideoBlock.vue\";\nimport {\n resolveBlockComponent,\n getBlockWrapperStyle,\n} from \"../../utils/blockComponentResolver\";\nimport type {\n Block,\n SectionBlock as SectionBlockType,\n} from \"@templatical/types\";\nimport { computed, inject, type Component } from \"vue\";\nimport { BLOCK_REGISTRY_KEY } from \"../../keys\";\n\nconst previewBlockComponentMap: Record<string, Component> = {\n title: TitleBlock,\n paragraph: ParagraphBlock,\n image: ImageBlock,\n video: VideoBlock,\n button: ButtonBlock,\n divider: DividerBlock,\n social: SocialIconsBlock,\n menu: MenuBlock,\n table: TableBlock,\n spacer: SpacerBlock,\n html: HtmlBlock,\n custom: CustomBlock,\n};\n\nconst props = defineProps<{\n block: SectionBlockType;\n viewport: \"desktop\";\n}>();\n\ndefineOptions({ name: \"PreviewSectionBlock\" });\n\nconst blockRegistry = inject(BLOCK_REGISTRY_KEY, null);\n\nconst columnWidths = computed(() => {\n switch (props.block.columns) {\n case \"2\":\n return [\"50%\", \"50%\"];\n case \"3\":\n return [\"33.33%\", \"33.33%\", \"33.33%\"];\n case \"1-2\":\n return [\"33.33%\", \"66.67%\"];\n case \"2-1\":\n return [\"66.67%\", \"33.33%\"];\n default:\n return [\"100%\"];\n }\n});\n\nconst columns = computed(() => {\n const count = columnWidths.value.length;\n const children = [...props.block.children];\n while (children.length < count) {\n children.push([]);\n }\n return children.slice(0, count);\n});\n\nfunction getColumnBlocks(colIndex: number): Block[] {\n return columns.value[colIndex] || [];\n}\n\nfunction getBlockComponent(block: Block): Component | null {\n return resolveBlockComponent(block, blockRegistry, previewBlockComponentMap);\n}\n</script>\n\n<template>\n <div class=\"tpl:w-full\">\n <div class=\"tpl:flex tpl:gap-0\">\n <div\n v-for=\"(_, colIndex) in columns\"\n :key=\"colIndex\"\n :style=\"{ width: columnWidths[colIndex] }\"\n >\n <div\n v-for=\"childBlock in getColumnBlocks(colIndex)\"\n :key=\"childBlock.id\"\n :style=\"getBlockWrapperStyle(childBlock)\"\n >\n <!-- Recursive self-reference for nested sections -->\n <PreviewSectionBlock\n v-if=\"childBlock.type === 'section'\"\n :block=\"childBlock\"\n viewport=\"desktop\"\n />\n <component\n :is=\"getBlockComponent(childBlock)\"\n v-else\n :block=\"childBlock\"\n viewport=\"desktop\"\n />\n </div>\n </div>\n </div>\n </div>\n</template>\n","<script setup lang=\"ts\">\nimport ButtonBlock from \"./blocks/ButtonBlock.vue\";\nimport CustomBlock from \"./blocks/CustomBlock.vue\";\nimport DividerBlock from \"./blocks/DividerBlock.vue\";\nimport HtmlBlock from \"./blocks/HtmlBlock.vue\";\nimport ImageBlock from \"./blocks/ImageBlock.vue\";\nimport MenuBlock from \"./blocks/MenuBlock.vue\";\nimport PreviewSectionBlock from \"./blocks/PreviewSectionBlock.vue\";\nimport SocialIconsBlock from \"./blocks/SocialIconsBlock.vue\";\nimport SpacerBlock from \"./blocks/SpacerBlock.vue\";\nimport TableBlock from \"./blocks/TableBlock.vue\";\nimport TitleBlock from \"./blocks/TitleBlock.vue\";\nimport ParagraphBlock from \"./blocks/ParagraphBlock.vue\";\nimport VideoBlock from \"./blocks/VideoBlock.vue\";\nimport {\n BLOCK_REGISTRY_KEY,\n CONDITION_PREVIEW_KEY,\n EDITOR_KEY,\n MERGE_TAG_SAMPLE_MODE_KEY,\n USE_MERGE_TAG_SAMPLES_KEY,\n} from \"../keys\";\nimport {\n resolveBlockComponent,\n getBlockWrapperStyle,\n getDocumentStyle,\n} from \"../utils/blockComponentResolver\";\nimport {\n EMAIL_FRAME_WIDTH_TRANSITION,\n getEmailFrameWidth,\n} from \"../utils/emailFrameWidth\";\nimport type { Block, ViewportSize } from \"@templatical/types\";\nimport { computed, inject, provide, type Component } from \"vue\";\n\nconst props = withDefaults(\n defineProps<{\n blocks: Block[];\n /**\n * Which viewport to render. Defaults to `desktop`, so the saved-blocks\n * surfaces — which have no viewport control — behave exactly as before.\n * The test-email dialog passes the user's choice so responsive blocks show\n * the variant a recipient on that device would receive.\n */\n viewport?: ViewportSize;\n /**\n * Whether the hand-toggled display-condition filter still applies here.\n * `false` where a resolver owns the preview: it has already evaluated every\n * condition against real data, so layering a manual hide on top would veto\n * the answer that was asked for.\n *\n * A prop rather than an injected `PREVIEW_RESOLUTION_KEY` read, because the\n * test-email dialog builds its *own* resolution instance (keyed to the\n * selected recipient) — injecting would consult the shared canvas instance\n * and get the wrong answer.\n */\n applyConditionFilter?: boolean;\n }>(),\n { viewport: \"desktop\", applyConditionFilter: true },\n);\n\nconst blockRegistry = inject(BLOCK_REGISTRY_KEY);\nconst editor = inject(EDITOR_KEY, null);\nconst conditionPreview = inject(CONDITION_PREVIEW_KEY, null);\n\n/**\n * This canvas is only ever a preview — nothing here is editable — so it honours\n * the user's mode directly, with no `previewMode` gate of the kind `Canvas.vue`\n * needs. Re-provided rather than left to inherit, because a `BlockPreviewCanvas`\n * inside a dialog may sit under an editing `Canvas` that provides `false`.\n */\nconst mergeTagSampleMode = inject(MERGE_TAG_SAMPLE_MODE_KEY, null);\nprovide(\n USE_MERGE_TAG_SAMPLES_KEY,\n computed(() => mergeTagSampleMode?.value ?? false),\n);\n\n/**\n * Blocks a display condition currently excludes, so a preview never shows\n * content the recipient won't get. The canvas does the same via\n * `v-show=\"!conditionPreview?.isHidden(block.id)\"`.\n *\n * A no-op for the saved-blocks browser: entries there carry their *stored* ids,\n * which aren't in the current template, so nothing is tracked as hidden. It\n * bites where it should — the save dialog and the test-email preview, both of\n * which show blocks that are live on the canvas.\n *\n * Skipped entirely when `applyConditionFilter` is false — see the prop.\n */\nconst visibleBlocks = computed(() =>\n props.applyConditionFilter\n ? props.blocks.filter((block) => !conditionPreview?.isHidden(block.id))\n : props.blocks,\n);\n\n/**\n * Frame width, from the one helper the canvas and the scaled preview rows also\n * use — so all three agree by construction rather than by three constants that\n * happen to match. A template with a custom body width now previews at that\n * width instead of a flat 600.\n */\nconst frameWidth = computed(() =>\n getEmailFrameWidth(editor?.content.value.settings, props.viewport),\n);\n\n/**\n * The same document-level style the canvas applies, so a previewed block\n * renders identically to the canvas one: without it the font falls back to the\n * editor UI's and the link rules hit their unset defaults, dropping the\n * underline and the link colour.\n *\n * Read from the *current* template even in the saved-blocks browser, where the\n * previewed content came from elsewhere — a saved block stores only `Block[]`,\n * and the current settings are what it will actually look like once inserted.\n */\nconst documentStyle = computed(() =>\n editor ? getDocumentStyle(editor.content.value.settings) : {},\n);\n\nconst previewComponentMap: Record<string, Component> = {\n section: PreviewSectionBlock,\n title: TitleBlock,\n paragraph: ParagraphBlock,\n image: ImageBlock,\n video: VideoBlock,\n button: ButtonBlock,\n divider: DividerBlock,\n social: SocialIconsBlock,\n menu: MenuBlock,\n table: TableBlock,\n spacer: SpacerBlock,\n html: HtmlBlock,\n custom: CustomBlock,\n};\n\nfunction getBlockComponent(block: Block): Component | null {\n return resolveBlockComponent(block, blockRegistry, previewComponentMap);\n}\n</script>\n\n<template>\n <div\n data-testid=\"block-preview-canvas\"\n class=\"tpl:pointer-events-none tpl:mx-auto tpl:select-none tpl:rounded-lg\"\n :style=\"{\n width: `${frameWidth}px`,\n transition: EMAIL_FRAME_WIDTH_TRANSITION,\n backgroundColor: 'var(--tpl-canvas-bg)',\n boxShadow: 'var(--tpl-shadow-sm)',\n ...documentStyle,\n }\"\n >\n <div\n v-for=\"block in visibleBlocks\"\n :key=\"block.id\"\n :style=\"getBlockWrapperStyle(block)\"\n >\n <component\n :is=\"getBlockComponent(block)\"\n :block=\"block\"\n :viewport=\"viewport\"\n />\n </div>\n </div>\n</template>\n","<script setup lang=\"ts\">\nimport ButtonBlock from \"./blocks/ButtonBlock.vue\";\nimport CustomBlock from \"./blocks/CustomBlock.vue\";\nimport DividerBlock from \"./blocks/DividerBlock.vue\";\nimport HtmlBlock from \"./blocks/HtmlBlock.vue\";\nimport ImageBlock from \"./blocks/ImageBlock.vue\";\nimport MenuBlock from \"./blocks/MenuBlock.vue\";\nimport PreviewSectionBlock from \"./blocks/PreviewSectionBlock.vue\";\nimport SocialIconsBlock from \"./blocks/SocialIconsBlock.vue\";\nimport SpacerBlock from \"./blocks/SpacerBlock.vue\";\nimport TableBlock from \"./blocks/TableBlock.vue\";\nimport TitleBlock from \"./blocks/TitleBlock.vue\";\nimport ParagraphBlock from \"./blocks/ParagraphBlock.vue\";\nimport VideoBlock from \"./blocks/VideoBlock.vue\";\nimport {\n BLOCK_REGISTRY_KEY,\n CONDITION_PREVIEW_KEY,\n EDITOR_KEY,\n MERGE_TAG_SAMPLE_MODE_KEY,\n USE_MERGE_TAG_SAMPLES_KEY,\n} from \"../keys\";\nimport {\n resolveBlockComponent,\n getBlockWrapperStyle,\n getDocumentStyle,\n} from \"../utils/blockComponentResolver\";\nimport {\n EMAIL_FRAME_WIDTH_TRANSITION,\n getEmailFrameWidth,\n} from \"../utils/emailFrameWidth\";\nimport type { Block, ViewportSize } from \"@templatical/types\";\nimport { computed, inject, provide, type Component } from \"vue\";\n\nconst props = withDefaults(\n defineProps<{\n blocks: Block[];\n /**\n * Which viewport to render. Defaults to `desktop`, so the saved-blocks\n * surfaces — which have no viewport control — behave exactly as before.\n * The test-email dialog passes the user's choice so responsive blocks show\n * the variant a recipient on that device would receive.\n */\n viewport?: ViewportSize;\n /**\n * Whether the hand-toggled display-condition filter still applies here.\n * `false` where a resolver owns the preview: it has already evaluated every\n * condition against real data, so layering a manual hide on top would veto\n * the answer that was asked for.\n *\n * A prop rather than an injected `PREVIEW_RESOLUTION_KEY` read, because the\n * test-email dialog builds its *own* resolution instance (keyed to the\n * selected recipient) — injecting would consult the shared canvas instance\n * and get the wrong answer.\n */\n applyConditionFilter?: boolean;\n }>(),\n { viewport: \"desktop\", applyConditionFilter: true },\n);\n\nconst blockRegistry = inject(BLOCK_REGISTRY_KEY);\nconst editor = inject(EDITOR_KEY, null);\nconst conditionPreview = inject(CONDITION_PREVIEW_KEY, null);\n\n/**\n * This canvas is only ever a preview — nothing here is editable — so it honours\n * the user's mode directly, with no `previewMode` gate of the kind `Canvas.vue`\n * needs. Re-provided rather than left to inherit, because a `BlockPreviewCanvas`\n * inside a dialog may sit under an editing `Canvas` that provides `false`.\n */\nconst mergeTagSampleMode = inject(MERGE_TAG_SAMPLE_MODE_KEY, null);\nprovide(\n USE_MERGE_TAG_SAMPLES_KEY,\n computed(() => mergeTagSampleMode?.value ?? false),\n);\n\n/**\n * Blocks a display condition currently excludes, so a preview never shows\n * content the recipient won't get. The canvas does the same via\n * `v-show=\"!conditionPreview?.isHidden(block.id)\"`.\n *\n * A no-op for the saved-blocks browser: entries there carry their *stored* ids,\n * which aren't in the current template, so nothing is tracked as hidden. It\n * bites where it should — the save dialog and the test-email preview, both of\n * which show blocks that are live on the canvas.\n *\n * Skipped entirely when `applyConditionFilter` is false — see the prop.\n */\nconst visibleBlocks = computed(() =>\n props.applyConditionFilter\n ? props.blocks.filter((block) => !conditionPreview?.isHidden(block.id))\n : props.blocks,\n);\n\n/**\n * Frame width, from the one helper the canvas and the scaled preview rows also\n * use — so all three agree by construction rather than by three constants that\n * happen to match. A template with a custom body width now previews at that\n * width instead of a flat 600.\n */\nconst frameWidth = computed(() =>\n getEmailFrameWidth(editor?.content.value.settings, props.viewport),\n);\n\n/**\n * The same document-level style the canvas applies, so a previewed block\n * renders identically to the canvas one: without it the font falls back to the\n * editor UI's and the link rules hit their unset defaults, dropping the\n * underline and the link colour.\n *\n * Read from the *current* template even in the saved-blocks browser, where the\n * previewed content came from elsewhere — a saved block stores only `Block[]`,\n * and the current settings are what it will actually look like once inserted.\n */\nconst documentStyle = computed(() =>\n editor ? getDocumentStyle(editor.content.value.settings) : {},\n);\n\nconst previewComponentMap: Record<string, Component> = {\n section: PreviewSectionBlock,\n title: TitleBlock,\n paragraph: ParagraphBlock,\n image: ImageBlock,\n video: VideoBlock,\n button: ButtonBlock,\n divider: DividerBlock,\n social: SocialIconsBlock,\n menu: MenuBlock,\n table: TableBlock,\n spacer: SpacerBlock,\n html: HtmlBlock,\n custom: CustomBlock,\n};\n\nfunction getBlockComponent(block: Block): Component | null {\n return resolveBlockComponent(block, blockRegistry, previewComponentMap);\n}\n</script>\n\n<template>\n <div\n data-testid=\"block-preview-canvas\"\n class=\"tpl:pointer-events-none tpl:mx-auto tpl:select-none tpl:rounded-lg\"\n :style=\"{\n width: `${frameWidth}px`,\n transition: EMAIL_FRAME_WIDTH_TRANSITION,\n backgroundColor: 'var(--tpl-canvas-bg)',\n boxShadow: 'var(--tpl-shadow-sm)',\n ...documentStyle,\n }\"\n >\n <div\n v-for=\"block in visibleBlocks\"\n :key=\"block.id\"\n :style=\"getBlockWrapperStyle(block)\"\n >\n <component\n :is=\"getBlockComponent(block)\"\n :block=\"block\"\n :viewport=\"viewport\"\n />\n </div>\n </div>\n</template>\n"],"mappings":"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"}
@@ -1,18 +1,18 @@
1
- import { $ as e, A as t, H as n, J as r, M as i, N as a, P as o, V as s, Z as c, _ as l, b as u, ct as d, f, g as p, h as m, it as h, j as g, l as _, m as v, n as y, ot as b, p as x, s as S, st as C, u as w, v as T, x as E, y as D, z as O } from "./draggable-JcMTNF3U.js";
1
+ import { $ as e, A as t, H as n, J as r, M as i, N as a, P as o, V as s, Z as c, _ as l, b as u, ct as d, f, g as p, h as m, it as h, j as g, l as _, m as v, n as y, ot as b, p as x, s as S, st as C, u as w, v as T, x as E, y as D, z as O } from "./draggable-Z4XXmbPC.js";
2
2
  import { t as k } from "./timeouts-SsLMC4a3.js";
3
3
  import { B as A } from "./src-CZjSXPYq.js";
4
- import { T as j, b as M, j as ee, t as N } from "./useEditorCore-DfW-thCr.js";
5
- import { _ as P } from "./dist-lZgXNk4G.js";
6
- import { t as F } from "./dist-B8AX9np4.js";
7
- import { M as I, c as te, d as L, i as R, l as z, t as B, z as ne } from "./keys-BxPCfHBH.js";
8
- import { t as V } from "./useI18n-DniEFeIl.js";
9
- import { F as H, I as U, It as W, M as G, Ot as K, T as q, it as J, jt as Y, tt as re, u as ie } from "./icons-Cp4ZIJw-.js";
4
+ import { T as j, b as M, j as ee, t as N } from "./useEditorCore-BMXBmdd8.js";
5
+ import { _ as P } from "./dist-B4VIlp1g.js";
6
+ import { t as F } from "./dist-H51neg3K.js";
7
+ import { M as I, c as te, d as L, i as R, l as z, t as B, z as ne } from "./keys-DsoX52o_.js";
8
+ import { t as V } from "./useI18n-BvcEYzrI.js";
9
+ import { E as H, F as U, I as W, Lt as G, M as K, Mt as q, it as J, kt as Y, tt as re, u as ie } from "./icons-C_kRN0_C.js";
10
10
  import { t as ae } from "./_plugin-vue_export-helper-B3ysoDQm.js";
11
- import { n as X } from "./useCloudI18n-CjVzv11v.js";
12
- import { a as Z, c as oe, d as Q, f as se, i as ce, l as le, m as ue, n as de, o as fe, p as pe, r as me, s as he, t as ge, u as _e } from "./styles-DANwMzW2.js";
13
- import { d as $ } from "./ColorPicker-_1O7YU2z.js";
14
- import { n as ve, t as ye } from "./MergeTagModeToggle-CWuVC3MU.js";
15
- import { C as be, a as xe, c as Se, d as Ce, f as we, g as Te, h as Ee, i as De, l as Oe, n as ke, o as Ae, p as je, r as Me, s as Ne, t as Pe, u as Fe, v as Ie, y as Le } from "./cloud-DOaGUdR0.js";
11
+ import { n as X } from "./useCloudI18n-D4JpHTPk.js";
12
+ import { a as Z, c as oe, d as Q, f as se, i as ce, l as le, m as ue, n as de, o as fe, p as pe, r as me, s as he, t as ge, u as _e } from "./styles-znpPfrFd.js";
13
+ import { d as $ } from "./ColorPicker-BXH44v2H.js";
14
+ import { n as ve, t as ye } from "./MergeTagModeToggle-BCmQg4Qe.js";
15
+ import { C as be, a as xe, c as Se, d as Ce, f as we, g as Te, h as Ee, i as De, l as Oe, n as ke, o as Ae, p as je, r as Me, s as Ne, t as Pe, u as Fe, v as Ie, y as Le } from "./cloud-B0f7Ub8f.js";
16
16
  //#region src/cloud/composables/useSnapshotPreview.ts
17
17
  function Re(t) {
18
18
  let { authManager: n, editor: i, history: a, conditionPreview: o, autoSave: s, onError: l } = t, u = e(null), d = c(null), p = c(null), m = !1;
@@ -184,7 +184,7 @@ function He(e) {
184
184
  let t = f(e);
185
185
  if (t) return s?.(t), null;
186
186
  try {
187
- let { MediaApiClient: t } = await import("./src-Dpj0x27M.js");
187
+ let { MediaApiClient: t } = await import("./src-CRvTVX4F.js");
188
188
  return l(await new t(a).uploadMedia(e));
189
189
  } catch (e) {
190
190
  return s?.(e), null;
@@ -613,7 +613,7 @@ var qe = ["aria-label"], Je = { class: "tpl:flex tpl:max-h-[80vh] tpl:w-full tpl
613
613
  },
614
614
  emits: ["save"],
615
615
  setup(e) {
616
- let t = u(() => import("./CollaboratorBar-DcXYo47v.js")), n = u(() => import("./SnapshotHistory-QQt0DKey.js")), r = u(() => import("./AiFeatureMenu-CI4SYTq2.js")), { t: a } = V(), { t: o, format: c } = X();
616
+ let t = u(() => import("./CollaboratorBar-DF02nTwF.js")), n = u(() => import("./SnapshotHistory-jogWGLB-.js")), r = u(() => import("./AiFeatureMenu-BS4Rek6j.js")), { t: a } = V(), { t: o, format: c } = X();
617
617
  return (l, u) => (i(), p("header", rt, [
618
618
  x("div", it, [e.featureFlags.templateLimit.value === null ? m("", !0) : (i(), p("span", at, d(h(c)(h(o).header.templatesUsed, {
619
619
  used: e.featureFlags.templateCount.value,
@@ -663,10 +663,10 @@ var qe = ["aria-label"], Je = { class: "tpl:flex tpl:max-h-[80vh] tpl:w-full tpl
663
663
  "aria-live": "assertive",
664
664
  class: "tpl-tooltip tpl-status tpl:flex tpl:items-center tpl:gap-1.5 tpl:text-xs tpl:text-[var(--tpl-danger)]",
665
665
  "data-tooltip": e.featureFlags.saveErrorMessage.value
666
- }, [D(h(Y), {
666
+ }, [D(h(q), {
667
667
  size: 12,
668
668
  "stroke-width": 2.5
669
- }), T(" " + d(h(o).header.saveFailed), 1)], 8, ct)) : e.featureFlags.saveStatus.value === "saved" ? (i(), p("div", lt, [D(h(W), {
669
+ }), T(" " + d(h(o).header.saveFailed), 1)], 8, ct)) : e.featureFlags.saveStatus.value === "saved" ? (i(), p("div", lt, [D(h(G), {
670
670
  size: 12,
671
671
  "stroke-width": 2.5
672
672
  }), T(" " + d(h(o).header.saved), 1)])) : e.editor.state.isDirty ? (i(), p("div", ut, [u[5] ||= x("span", { class: "tpl-pulse tpl:size-1.5 tpl:rounded-full tpl:bg-[var(--tpl-primary)]" }, null, -1), T(" " + d(h(o).header.unsaved), 1)])) : m("", !0),
@@ -697,7 +697,7 @@ var qe = ["aria-label"], Je = { class: "tpl:flex tpl:max-h-[80vh] tpl:w-full tpl
697
697
  "aria-expanded": e.panelState.aiMenuOpen.value,
698
698
  class: b(["tpl-ai-btn tpl:inline-flex tpl:items-center tpl:gap-1.5 tpl:rounded-[var(--tpl-radius-sm)] tpl:border-none tpl:px-4 tpl:py-2 tpl:text-sm tpl:font-semibold tpl:whitespace-nowrap tpl:transition-all tpl:duration-200", e.panelState.aiButtonActive.value ? "tpl-ai-btn--active" : "tpl-ai-btn--idle"]),
699
699
  onClick: u[2] ||= _((...t) => e.panelState.toggleAiMenu && e.panelState.toggleAiMenu(...t), ["stop"])
700
- }, [D(h(q), {
700
+ }, [D(h(H), {
701
701
  size: 16,
702
702
  "stroke-width": 2,
703
703
  class: "tpl-ai-btn-icon"
@@ -731,7 +731,7 @@ var qe = ["aria-label"], Je = { class: "tpl:flex tpl:max-h-[80vh] tpl:w-full tpl
731
731
  class: "tpl-spinner",
732
732
  size: 16,
733
733
  "stroke-width": 2
734
- })) : (i(), v(h(G), {
734
+ })) : (i(), v(h(K), {
735
735
  key: 0,
736
736
  size: 16,
737
737
  "stroke-width": 2
@@ -750,7 +750,7 @@ var qe = ["aria-label"], Je = { class: "tpl:flex tpl:max-h-[80vh] tpl:w-full tpl
750
750
  class: "tpl-spinner",
751
751
  size: 16,
752
752
  "stroke-width": 2
753
- })) : (i(), v(h(H), {
753
+ })) : (i(), v(h(U), {
754
754
  key: 0,
755
755
  size: 16,
756
756
  "stroke-width": 2
@@ -769,9 +769,9 @@ var qe = ["aria-label"], Je = { class: "tpl:flex tpl:max-h-[80vh] tpl:w-full tpl
769
769
  mediaLib: {}
770
770
  },
771
771
  setup(e, { expose: t }) {
772
- let n = u(() => import("./AiChatSidebar-bkBKpNgE.js")), r = u(() => import("./CommentsSidebar-BEgLBYX-.js")), a = u(() => import("./DesignReferenceSidebar-DPqBr-ut.js")), o = u(() => import("./TemplateScoringPanel-BwyCMcit.js")), s = u(async () => {
772
+ let n = u(() => import("./AiChatSidebar-BY1Iy-e8.js")), r = u(() => import("./CommentsSidebar-B9bWvvbl.js")), a = u(() => import("./DesignReferenceSidebar-BXjH47QC.js")), o = u(() => import("./TemplateScoringPanel-B2XIOTl-.js")), s = u(async () => {
773
773
  try {
774
- return (await import("./src-Dpj0x27M.js")).MediaLibraryModal;
774
+ return (await import("./src-CRvTVX4F.js")).MediaLibraryModal;
775
775
  } catch {
776
776
  throw Error("[Templatical] Cloud media library requires the optional peer dependency '@templatical/media-library'. Please install it.");
777
777
  }
@@ -852,7 +852,7 @@ var qe = ["aria-label"], Je = { class: "tpl:flex tpl:max-h-[80vh] tpl:w-full tpl
852
852
  return "isNotFound" in e && !!e.isNotFound;
853
853
  }
854
854
  return (t, s) => e.visible && e.error ? (i(), p("div", Ct, [
855
- x("div", wt, [D(h(Y), {
855
+ x("div", wt, [D(h(q), {
856
856
  size: 32,
857
857
  "stroke-width": 1.5,
858
858
  class: "tpl:text-[var(--tpl-danger)]"
@@ -874,7 +874,7 @@ var qe = ["aria-label"], Je = { class: "tpl:flex tpl:max-h-[80vh] tpl:w-full tpl
874
874
  emits: ["cancel", "confirm"],
875
875
  setup(e, { emit: t }) {
876
876
  let n = t, { t: r } = X();
877
- return (t, a) => e.visible ? (i(), p("div", kt, [x("div", At, [D(h(K), {
877
+ return (t, a) => e.visible ? (i(), p("div", kt, [x("div", At, [D(h(Y), {
878
878
  size: 18,
879
879
  "stroke-width": 2,
880
880
  class: "tpl:text-[var(--tpl-primary)]"
@@ -915,7 +915,7 @@ var qe = ["aria-label"], Je = { class: "tpl:flex tpl:max-h-[80vh] tpl:w-full tpl
915
915
  },
916
916
  emits: ["ready"],
917
917
  setup(e, { expose: r, emit: o }) {
918
- let l = u(() => import("./SavedBlocksPanels-B62U5DYW.js")), f = u(() => import("./TestEmailPanel-CvuBq4RA.js")), w = e;
918
+ let l = u(() => import("./SavedBlocksPanels-ElerTTa_.js")), f = u(() => import("./TestEmailPanel-1zxRa00s.js")), w = e;
919
919
  a(z, w.cloudTranslations);
920
920
  let E = o, O = c(null), k = c(null), A = Ue({
921
921
  config: w.config,
@@ -925,7 +925,7 @@ var qe = ["aria-label"], Je = { class: "tpl:flex tpl:max-h-[80vh] tpl:w-full tpl
925
925
  getCommentsSidebar: () => O.value ? { filterByBlock: O.value.filterCommentsByBlock } : null,
926
926
  editorRoot: w.shadowRoot,
927
927
  containerEl: k
928
- }), { isInitializing: j, isAuthReady: ee, initError: N, planConfigInstance: P, websocket: F, collaboration: I, isCollaborationEnabled: te, editor: L, core: R, featureFlags: B, mediaLib: ne, exporter: V, testEmail: H, commentsInstance: W, savedBlocks: G, panelState: K, snapshotPreview: q, collabWarning: J, setThemeOverrides: Y, setUiTheme: re } = A, { showNotice: ie } = M(() => w.config.smallScreenNotice);
928
+ }), { isInitializing: j, isAuthReady: ee, initError: N, planConfigInstance: P, websocket: F, collaboration: I, isCollaborationEnabled: te, editor: L, core: R, featureFlags: B, mediaLib: ne, exporter: V, testEmail: H, commentsInstance: U, savedBlocks: G, panelState: K, snapshotPreview: q, collabWarning: J, setThemeOverrides: Y, setUiTheme: re } = A, { showNotice: ie } = M(() => w.config.smallScreenNotice);
929
929
  async function ae() {
930
930
  try {
931
931
  await q.confirmRestoreSnapshot();
@@ -1007,7 +1007,7 @@ var qe = ["aria-label"], Je = { class: "tpl:flex tpl:max-h-[80vh] tpl:w-full tpl
1007
1007
  "feature-flags": h(B),
1008
1008
  "panel-state": h(K),
1009
1009
  "snapshot-preview": h(q),
1010
- "comments-instance": h(W),
1010
+ "comments-instance": h(U),
1011
1011
  "test-email": h(H),
1012
1012
  websocket: h(F),
1013
1013
  collaboration: h(I),
@@ -1075,7 +1075,7 @@ var qe = ["aria-label"], Je = { class: "tpl:flex tpl:max-h-[80vh] tpl:w-full tpl
1075
1075
  },
1076
1076
  "data-testid": "restore-hidden-blocks",
1077
1077
  onClick: r[0] ||= (e) => h(R).conditionPreview.reset()
1078
- }, [D(h(U), {
1078
+ }, [D(h(W), {
1079
1079
  size: 13,
1080
1080
  "stroke-width": 2
1081
1081
  }), T(" " + d(h(R).t.blockSettings.restoreHiddenBlocks), 1)])) : m("", !0)]),
@@ -1163,4 +1163,4 @@ var qe = ["aria-label"], Je = { class: "tpl:flex tpl:max-h-[80vh] tpl:w-full tpl
1163
1163
  //#endregion
1164
1164
  export { zt as default };
1165
1165
 
1166
- //# sourceMappingURL=CloudEditor-D-t7RyDh.js.map
1166
+ //# sourceMappingURL=CloudEditor-BaqiFbf0.js.map