@templatical/editor 0.39.0 → 0.39.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 (273) hide show
  1. package/README.md +2 -4
  2. package/dist/{AiChatSidebar-jVlXXND3.js → AiChatSidebar-pOxCZWz9.js} +14 -14
  3. package/dist/{AiFeatureMenu-C1HCntyQ.js → AiFeatureMenu-Bljk6Qjv.js} +7 -7
  4. package/dist/{BlockIssueBadge-JhNgcUmZ.js → BlockIssueBadge-D5oGxOQP.js} +5 -5
  5. package/dist/{BlockPreviewCanvas-C_rA5LJN.js → BlockPreviewCanvas-DXGjUECG.js} +27 -27
  6. package/dist/{CloudHeaderExtras-DvYyNsPB.js → CloudHeaderExtras-DaocwNmy.js} +5 -5
  7. package/dist/{CloudPanels-CDPhPVdd.js → CloudPanels-CyZAnSJY.js} +7 -7
  8. package/dist/{CollaboratorBar-Co9UPoB0.js → CollaboratorBar-C7Zca3g1.js} +4 -4
  9. package/dist/{CommentsPanel-CRcVN9Ri.js → CommentsPanel-CNOb7YCm.js} +2 -2
  10. package/dist/{CommentsSidebar-gDU977br.js → CommentsSidebar-VmwjU9va.js} +14 -14
  11. package/dist/{CountdownBlock-CEzrfe5R.js → CountdownBlock-DSvbf3qU.js} +3 -3
  12. package/dist/{CountdownToolbar-B00zhkNJ.js → CountdownToolbar-C2kfS6Oy.js} +31 -30
  13. package/dist/{DesignReferenceSidebar-DedivZZl.js → DesignReferenceSidebar-QC4gEUWp.js} +11 -11
  14. package/dist/{IssuesPanel-C-PjdmAV.js → IssuesPanel-DL2Xr14_.js} +8 -8
  15. package/dist/{LoadingTrack-BlTL4zFv.js → LoadingTrack-C2jKCU2d.js} +1 -1
  16. package/dist/LogicTagInsertButton-D8IwH-9Z.js +1071 -0
  17. package/dist/MediaEditModal-D4GEq2md.js +3545 -0
  18. package/dist/{MediaPanels-BpQNY8YX.js → MediaPanels-sapgKtxu.js} +2 -2
  19. package/dist/MergeTagInput-QI-5KG2R.js +81 -0
  20. package/dist/{MergeTagModeToggle-DGuzSAdX.js → MergeTagModeToggle-D793Bj_E.js} +14 -55
  21. package/dist/{ParagraphEditor-jMKLLTa8.js → ParagraphEditor-DkkPSexG.js} +65 -66
  22. package/dist/{RestoreVersionDialog-DG1jUdBM.js → RestoreVersionDialog-BgueZnZr.js} +5 -5
  23. package/dist/{RichTextEditorContent-JrNEg0kv.js → RichTextEditorContent-BC5UTVnb.js} +11 -11
  24. package/dist/{SaveBlockDialog-C0KC-OKs.js → SaveBlockDialog-BuTuVlLr.js} +12 -11
  25. package/dist/{SavedBlocksBrowserModal-zyOiRgWZ.js → SavedBlocksBrowserModal-Srhix8BB.js} +17 -16
  26. package/dist/{SavedBlocksPanels-epMd799w.js → SavedBlocksPanels-B2iScCS-.js} +2 -2
  27. package/dist/{SavedBlocksPickBar-CJqqQ3jd.js → SavedBlocksPickBar-cI7bDQQi.js} +4 -4
  28. package/dist/{TemplateScoringPanel-m2FOeaai.js → TemplateScoringPanel-C2Rdlyn6.js} +16 -16
  29. package/dist/TemplateSettings-C_5leDdF.js +245 -0
  30. package/dist/{TestEmailModal-D58kYkMV.js → TestEmailModal-DJ5q_u4N.js} +10 -10
  31. package/dist/{TestEmailPanel-BmFVBIQt.js → TestEmailPanel-CP24UGst.js} +2 -2
  32. package/dist/{TitleEditor-C4BGPXnf.js → TitleEditor-QBBOXtxx.js} +15 -15
  33. package/dist/ToggleSwitch-JvQ_CmI1.js +102 -0
  34. package/dist/Toolbar-COD2TW20.js +2426 -0
  35. package/dist/{TplModal-BIDJw4Kj.js → TplModal-C8xGjC1l.js} +5 -5
  36. package/dist/{VersionHistoryMenu-dt_aZQfh.js → VersionHistoryMenu-BVQityes.js} +10 -10
  37. package/dist/{VersionHistoryPanels-B_5SBRrr.js → VersionHistoryPanels-BrK6na4A.js} +2 -2
  38. package/dist/{VersionPreviewBanner-DttvOkwd.js → VersionPreviewBanner-BaMSgA1O.js} +3 -3
  39. package/dist/{blockTypeIcons-CzTizYmK.js → blockTypeIcons-CdXugKyV.js} +16 -37
  40. package/dist/bundle-stats.json +8 -8
  41. package/dist/{ca-Jx2CDwtn.js → ca-BTf1Zbqb.js} +9 -0
  42. package/dist/cdn/chunks/{AiChatSidebar-DeZl9Tk0.js → AiChatSidebar-CjSEoK4x.js} +8 -8
  43. package/dist/cdn/chunks/{AiChatSidebar-DeZl9Tk0.js.map → AiChatSidebar-CjSEoK4x.js.map} +1 -1
  44. package/dist/cdn/chunks/{AiFeatureMenu-Bv8jMu9p.js → AiFeatureMenu-l0K5TOSn.js} +6 -6
  45. package/dist/cdn/chunks/{AiFeatureMenu-Bv8jMu9p.js.map → AiFeatureMenu-l0K5TOSn.js.map} +1 -1
  46. package/dist/cdn/chunks/{BlockIssueBadge-B6PpoOPv.js → BlockIssueBadge-9hHpaXb9.js} +5 -5
  47. package/dist/cdn/chunks/{BlockIssueBadge-B6PpoOPv.js.map → BlockIssueBadge-9hHpaXb9.js.map} +1 -1
  48. package/dist/cdn/chunks/{BlockPreviewCanvas-DfEtDosD.js → BlockPreviewCanvas-lQrAdgG3.js} +30 -30
  49. package/dist/cdn/chunks/{BlockPreviewCanvas-DfEtDosD.js.map → BlockPreviewCanvas-lQrAdgG3.js.map} +1 -1
  50. package/dist/cdn/chunks/{CloudHeaderExtras-Hk98ub-C.js → CloudHeaderExtras-CXNe7Q-4.js} +5 -5
  51. package/dist/cdn/chunks/{CloudHeaderExtras-Hk98ub-C.js.map → CloudHeaderExtras-CXNe7Q-4.js.map} +1 -1
  52. package/dist/cdn/chunks/{CloudPanels-Ba3GLmvF.js → CloudPanels-bHhh9AUA.js} +6 -6
  53. package/dist/cdn/chunks/{CloudPanels-Ba3GLmvF.js.map → CloudPanels-bHhh9AUA.js.map} +1 -1
  54. package/dist/cdn/chunks/{CollaboratorBar-D2dCQ9gg.js → CollaboratorBar-DgqcaGGI.js} +5 -5
  55. package/dist/cdn/chunks/{CollaboratorBar-D2dCQ9gg.js.map → CollaboratorBar-DgqcaGGI.js.map} +1 -1
  56. package/dist/cdn/chunks/{CommentsPanel-CV2HveQk.js → CommentsPanel-Cy4TlTHC.js} +3 -3
  57. package/dist/cdn/chunks/{CommentsPanel-CV2HveQk.js.map → CommentsPanel-Cy4TlTHC.js.map} +1 -1
  58. package/dist/cdn/chunks/{CommentsSidebar-Dok_vaRc.js → CommentsSidebar-C7oAP3Mx.js} +5 -5
  59. package/dist/cdn/chunks/{CommentsSidebar-Dok_vaRc.js.map → CommentsSidebar-C7oAP3Mx.js.map} +1 -1
  60. package/dist/cdn/chunks/{CountdownBlock-DGDl3ota.js → CountdownBlock-DdC8Lg5F.js} +4 -4
  61. package/dist/cdn/chunks/{CountdownBlock-DGDl3ota.js.map → CountdownBlock-DdC8Lg5F.js.map} +1 -1
  62. package/dist/cdn/chunks/{CountdownToolbar-B9Rin64t.js → CountdownToolbar-CN9h4nlC.js} +22 -21
  63. package/dist/cdn/chunks/{CountdownToolbar-B9Rin64t.js.map → CountdownToolbar-CN9h4nlC.js.map} +1 -1
  64. package/dist/cdn/chunks/{DesignReferenceSidebar-eCuTFak2.js → DesignReferenceSidebar-Bjo0M-AY.js} +7 -7
  65. package/dist/cdn/chunks/{DesignReferenceSidebar-eCuTFak2.js.map → DesignReferenceSidebar-Bjo0M-AY.js.map} +1 -1
  66. package/dist/cdn/chunks/{IssuesPanel-CP7FEzw7.js → IssuesPanel-DdFk-Blf.js} +6 -6
  67. package/dist/cdn/chunks/{IssuesPanel-CP7FEzw7.js.map → IssuesPanel-DdFk-Blf.js.map} +1 -1
  68. package/dist/cdn/chunks/{LoadingTrack-Cm3TDKb3.js → LoadingTrack-Ba5xh5HD.js} +2 -2
  69. package/dist/cdn/chunks/{LoadingTrack-Cm3TDKb3.js.map → LoadingTrack-Ba5xh5HD.js.map} +1 -1
  70. package/dist/cdn/chunks/LogicTagInsertButton-DpyPozop.js +1035 -0
  71. package/dist/cdn/chunks/LogicTagInsertButton-DpyPozop.js.map +1 -0
  72. package/dist/cdn/chunks/MediaEditModal-BBZRcYKe.js +3529 -0
  73. package/dist/cdn/chunks/MediaEditModal-BBZRcYKe.js.map +1 -0
  74. package/dist/cdn/chunks/{MediaPanels-TYrKKHX5.js → MediaPanels-CSBCsFwT.js} +3 -3
  75. package/dist/cdn/chunks/{MediaPanels-TYrKKHX5.js.map → MediaPanels-CSBCsFwT.js.map} +1 -1
  76. package/dist/cdn/chunks/MergeTagInput-ERJr7bP_.js +83 -0
  77. package/dist/cdn/chunks/MergeTagInput-ERJr7bP_.js.map +1 -0
  78. package/dist/cdn/chunks/{MergeTagModeToggle-QGTUIWWo.js → MergeTagModeToggle-n3nvSNeQ.js} +5 -5
  79. package/dist/cdn/chunks/{MergeTagModeToggle-QGTUIWWo.js.map → MergeTagModeToggle-n3nvSNeQ.js.map} +1 -1
  80. package/dist/cdn/chunks/{ParagraphEditor-D1tsPv4v.js → ParagraphEditor-DO4RzP8l.js} +40 -40
  81. package/dist/cdn/chunks/{ParagraphEditor-D1tsPv4v.js.map → ParagraphEditor-DO4RzP8l.js.map} +1 -1
  82. package/dist/cdn/chunks/{RestoreVersionDialog-BeCxNPLS.js → RestoreVersionDialog-CzZ_sFnz.js} +5 -5
  83. package/dist/cdn/chunks/{RestoreVersionDialog-BeCxNPLS.js.map → RestoreVersionDialog-CzZ_sFnz.js.map} +1 -1
  84. package/dist/cdn/chunks/{RichTextEditorContent-BBxzACFQ.js → RichTextEditorContent-Ch5zeyZ7.js} +8 -8
  85. package/dist/cdn/chunks/{RichTextEditorContent-BBxzACFQ.js.map → RichTextEditorContent-Ch5zeyZ7.js.map} +1 -1
  86. package/dist/cdn/chunks/{SaveBlockDialog-CLgh_g7H.js → SaveBlockDialog-LgxYrXyx.js} +10 -9
  87. package/dist/cdn/chunks/{SaveBlockDialog-CLgh_g7H.js.map → SaveBlockDialog-LgxYrXyx.js.map} +1 -1
  88. package/dist/cdn/chunks/{SavedBlocksBrowserModal-B4TcUJJe.js → SavedBlocksBrowserModal-CdeSsTpb.js} +9 -9
  89. package/dist/cdn/chunks/{SavedBlocksBrowserModal-B4TcUJJe.js.map → SavedBlocksBrowserModal-CdeSsTpb.js.map} +1 -1
  90. package/dist/cdn/chunks/{SavedBlocksPanels-CaBsHoRC.js → SavedBlocksPanels-B5hakNJj.js} +3 -3
  91. package/dist/cdn/chunks/{SavedBlocksPanels-CaBsHoRC.js.map → SavedBlocksPanels-B5hakNJj.js.map} +1 -1
  92. package/dist/cdn/chunks/{SavedBlocksPickBar-iG35XCDx.js → SavedBlocksPickBar-Cl6PLwwV.js} +5 -5
  93. package/dist/cdn/chunks/{SavedBlocksPickBar-iG35XCDx.js.map → SavedBlocksPickBar-Cl6PLwwV.js.map} +1 -1
  94. package/dist/cdn/chunks/{TemplateScoringPanel-DuQJBykq.js → TemplateScoringPanel--JxR6CsQ.js} +6 -6
  95. package/dist/cdn/chunks/{TemplateScoringPanel-DuQJBykq.js.map → TemplateScoringPanel--JxR6CsQ.js.map} +1 -1
  96. package/dist/cdn/chunks/TemplateSettings-DjXiiiNr.js +207 -0
  97. package/dist/cdn/chunks/TemplateSettings-DjXiiiNr.js.map +1 -0
  98. package/dist/cdn/chunks/{TestEmailModal-D6Woss3r.js → TestEmailModal-BAuDxJtD.js} +9 -9
  99. package/dist/cdn/chunks/{TestEmailModal-D6Woss3r.js.map → TestEmailModal-BAuDxJtD.js.map} +1 -1
  100. package/dist/cdn/chunks/{TestEmailPanel-CWQFB7J3.js → TestEmailPanel-GUGZisLp.js} +3 -3
  101. package/dist/cdn/chunks/{TestEmailPanel-CWQFB7J3.js.map → TestEmailPanel-GUGZisLp.js.map} +1 -1
  102. package/dist/cdn/chunks/{TitleEditor-CbY1tgSl.js → TitleEditor-uKu33Nwr.js} +12 -12
  103. package/dist/cdn/chunks/{TitleEditor-CbY1tgSl.js.map → TitleEditor-uKu33Nwr.js.map} +1 -1
  104. package/dist/cdn/chunks/ToggleSwitch-CDy8OfcB.js +104 -0
  105. package/dist/cdn/chunks/ToggleSwitch-CDy8OfcB.js.map +1 -0
  106. package/dist/cdn/chunks/Toolbar-dxDYwN5E.js +2385 -0
  107. package/dist/cdn/chunks/Toolbar-dxDYwN5E.js.map +1 -0
  108. package/dist/cdn/chunks/{TplModal-CGpp-d_r.js → TplModal-DuwS2ifK.js} +5 -5
  109. package/dist/cdn/chunks/{TplModal-CGpp-d_r.js.map → TplModal-DuwS2ifK.js.map} +1 -1
  110. package/dist/cdn/chunks/{VersionHistoryMenu-ByVJXDbK.js → VersionHistoryMenu-Dij1pTEb.js} +6 -6
  111. package/dist/cdn/chunks/{VersionHistoryMenu-ByVJXDbK.js.map → VersionHistoryMenu-Dij1pTEb.js.map} +1 -1
  112. package/dist/cdn/chunks/{VersionHistoryPanels-CQJ5OggF.js → VersionHistoryPanels-GeR6MStB.js} +3 -3
  113. package/dist/cdn/chunks/{VersionHistoryPanels-CQJ5OggF.js.map → VersionHistoryPanels-GeR6MStB.js.map} +1 -1
  114. package/dist/cdn/chunks/{VersionPreviewBanner-G4lLbfr8.js → VersionPreviewBanner-Df3FVlig.js} +4 -4
  115. package/dist/cdn/chunks/{VersionPreviewBanner-G4lLbfr8.js.map → VersionPreviewBanner-Df3FVlig.js.map} +1 -1
  116. package/dist/cdn/chunks/{blockTypeIcons-CQY-vxdM.js → blockTypeIcons-raBjStuv.js} +2 -2
  117. package/dist/cdn/chunks/{blockTypeIcons-CQY-vxdM.js.map → blockTypeIcons-raBjStuv.js.map} +1 -1
  118. package/dist/cdn/chunks/{ca-Jx2CDwtn.js → ca-BTf1Zbqb.js} +10 -1
  119. package/dist/cdn/chunks/{ca-Jx2CDwtn.js.map → ca-BTf1Zbqb.js.map} +1 -1
  120. package/dist/cdn/chunks/{cloud-BLgCKP7Z.js → cloud-eaXyxZ8l.js} +2 -2
  121. package/dist/cdn/chunks/{cloud-BLgCKP7Z.js.map → cloud-eaXyxZ8l.js.map} +1 -1
  122. package/dist/cdn/chunks/{createCloudRuntime-ClvtMBF1.js → createCloudRuntime-D5bXzcTe.js} +6 -6
  123. package/dist/cdn/chunks/{createCloudRuntime-ClvtMBF1.js.map → createCloudRuntime-D5bXzcTe.js.map} +1 -1
  124. package/dist/{de-Ck0pBGHu.js → cdn/chunks/de-xzrh9PA3.js} +11 -0
  125. package/dist/cdn/chunks/{de-Ck0pBGHu.js.map → de-xzrh9PA3.js.map} +1 -1
  126. package/dist/cdn/chunks/{dist-BW6Y49zE.js → dist-BRZhN8qJ.js} +4 -4
  127. package/dist/cdn/chunks/dist-BRZhN8qJ.js.map +1 -0
  128. package/dist/cdn/chunks/{dist-CAFTQ6Y2.js → dist-CXB2_kBa.js} +27 -22
  129. package/dist/cdn/chunks/dist-CXB2_kBa.js.map +1 -0
  130. package/dist/cdn/chunks/{draggable-kbOhCgnk.js → draggable-IB4x6w2O.js} +1477 -1470
  131. package/dist/cdn/chunks/draggable-IB4x6w2O.js.map +1 -0
  132. package/dist/cdn/chunks/editor-modal-C-yBlj2C.js +2700 -0
  133. package/dist/cdn/chunks/editor-modal-C-yBlj2C.js.map +1 -0
  134. package/dist/cdn/chunks/en-DYtFUE2l.js +2 -0
  135. package/dist/cdn/chunks/{es-lagTvUfX.js → es-BT4LSpE2.js} +10 -1
  136. package/dist/cdn/chunks/{es-lagTvUfX.js.map → es-BT4LSpE2.js.map} +1 -1
  137. package/dist/cdn/chunks/{extensions-D2YIhF7u.js → extensions-Bhu8UEE5.js} +105 -45
  138. package/dist/cdn/chunks/extensions-Bhu8UEE5.js.map +1 -0
  139. package/dist/cdn/chunks/{fr-C4hVl5Lk.js → fr-CI7OJoql.js} +10 -1
  140. package/dist/cdn/chunks/{fr-C4hVl5Lk.js.map → fr-CI7OJoql.js.map} +1 -1
  141. package/dist/cdn/chunks/{icons-DdrAicM2.js → icons-BKkJ-5xF.js} +43 -43
  142. package/dist/cdn/chunks/{icons-DdrAicM2.js.map → icons-BKkJ-5xF.js.map} +1 -1
  143. package/dist/cdn/chunks/{keys-DXYJTLZF.js → keys-dJbD1QPs.js} +2 -2
  144. package/dist/cdn/chunks/{keys-DXYJTLZF.js.map → keys-dJbD1QPs.js.map} +1 -1
  145. package/dist/{nl-CReD7Apd.js → cdn/chunks/nl-D8y5OWGB.js} +11 -0
  146. package/dist/cdn/chunks/{nl-CReD7Apd.js.map → nl-D8y5OWGB.js.map} +1 -1
  147. package/dist/cdn/chunks/{pt-BR-BRA0-vGP.js → pt-BR-DMCbUBvJ.js} +10 -1
  148. package/dist/cdn/chunks/{pt-BR-BRA0-vGP.js.map → pt-BR-DMCbUBvJ.js.map} +1 -1
  149. package/dist/cdn/chunks/socialIcons-9VrG8X3m.js +1054 -0
  150. package/dist/cdn/chunks/socialIcons-9VrG8X3m.js.map +1 -0
  151. package/dist/cdn/chunks/{src-fn7uy1FD.js → src-O5Sp_qJ7.js} +3 -3
  152. package/dist/cdn/chunks/{src-fn7uy1FD.js.map → src-O5Sp_qJ7.js.map} +1 -1
  153. package/dist/cdn/chunks/templateSettingsFields-YCFVBVYh.js +36 -0
  154. package/dist/cdn/chunks/templateSettingsFields-YCFVBVYh.js.map +1 -0
  155. package/dist/cdn/chunks/{tiptap-Epe8m3Vo.js → tiptap-DhLuKyDc.js} +2776 -2773
  156. package/dist/cdn/chunks/tiptap-DhLuKyDc.js.map +1 -0
  157. package/dist/cdn/chunks/{useAliveFlag-CT9gjvO_.js → useAliveFlag-DAlQLbM2.js} +2 -2
  158. package/dist/cdn/chunks/{useAliveFlag-CT9gjvO_.js.map → useAliveFlag-DAlQLbM2.js.map} +1 -1
  159. package/dist/cdn/chunks/{useCloudI18n-OezCj0cx.js → useCloudI18n-C09JcFS0.js} +3 -3
  160. package/dist/cdn/chunks/{useCloudI18n-OezCj0cx.js.map → useCloudI18n-C09JcFS0.js.map} +1 -1
  161. package/dist/cdn/chunks/useEditorCore-BHmIp1hW.js +2592 -0
  162. package/dist/cdn/chunks/useEditorCore-BHmIp1hW.js.map +1 -0
  163. package/dist/cdn/chunks/useEditorRoot-DFx2fXJP.js +10 -0
  164. package/dist/cdn/chunks/{useEditorRoot-ByHPMqYT.js.map → useEditorRoot-DFx2fXJP.js.map} +1 -1
  165. package/dist/cdn/chunks/{useI18n-BhE7ndNr.js → useI18n-DTZ9sIcv.js} +3 -3
  166. package/dist/cdn/chunks/{useI18n-BhE7ndNr.js.map → useI18n-DTZ9sIcv.js.map} +1 -1
  167. package/dist/cdn/chunks/useLogicTag-E2V0Xdcb.js +38 -0
  168. package/dist/cdn/chunks/useLogicTag-E2V0Xdcb.js.map +1 -0
  169. package/dist/cdn/chunks/{useMergeTag-DE2mpy1w.js → useMergeTag-BE8oDoha.js} +3 -3
  170. package/dist/cdn/chunks/{useMergeTag-DE2mpy1w.js.map → useMergeTag-BE8oDoha.js.map} +1 -1
  171. package/dist/cdn/chunks/{usePopoverPosition-BPL891uG.js → usePopoverPosition-gB9q-ql7.js} +3 -3
  172. package/dist/cdn/chunks/{usePopoverPosition-BPL891uG.js.map → usePopoverPosition-gB9q-ql7.js.map} +1 -1
  173. package/dist/cdn/chunks/{useScrollToBlock-DwF4pVur.js → useScrollToBlock-CtTXwmiU.js} +3 -3
  174. package/dist/cdn/chunks/{useScrollToBlock-DwF4pVur.js.map → useScrollToBlock-CtTXwmiU.js.map} +1 -1
  175. package/dist/cdn/editor.css +1 -1
  176. package/dist/cdn/editor.js +809 -3337
  177. package/dist/cdn/editor.js.map +1 -1
  178. package/dist/{check-9xX6RVHz.js → check-eqb2JhqU.js} +1 -1
  179. package/dist/{chevron-down-J5hFJ6TL.js → chevron-down-Dkr-7Ywl.js} +1 -1
  180. package/dist/{chevron-right-BJuo5PQ-.js → chevron-right-Bge4XF_B.js} +1 -1
  181. package/dist/{chevron-up-Qfi5k52_.js → chevron-up-CQAyl0kC.js} +1 -1
  182. package/dist/{circle-alert-BiArYmkB.js → circle-alert-CYgTHKWr.js} +1 -1
  183. package/dist/{clock-BkYJZ7Y0.js → clock-BgSJZJP5.js} +1 -1
  184. package/dist/{cloud-DdidMW6f.js → cloud-C9xWZXhg.js} +1 -1
  185. package/dist/{copy-BRLUNHwF.js → copy-mw6PVnOJ.js} +1 -1
  186. package/dist/{createCloudRuntime-CNFXaTNQ.js → createCloudRuntime-BGd5--Bq.js} +5 -5
  187. package/dist/{createLucideIcon-CDDkF1Tm.js → createLucideIcon-BxY5yz5u.js} +6 -6
  188. package/dist/{cdn/chunks/de-Ck0pBGHu.js → de-xzrh9PA3.js} +9 -2
  189. package/dist/{dist-D8i1ixHK.js → dist-8VFzbeu9.js} +3 -3
  190. package/dist/{dist-DBirAJIs.js → dist-BDuPwOyn.js} +26 -21
  191. package/dist/{dist-CtF9STPS.js → dist-BJM3eFyT.js} +1 -1
  192. package/dist/{dist-DkcA6epL.js → dist-BdHF7nyq.js} +3 -3
  193. package/dist/{dist-ByT5fgKq.js → dist-Bl4rxpX9.js} +1 -1
  194. package/dist/{dist-BVqAYoRB.js → dist-BmsLcnrO.js} +4 -4
  195. package/dist/{dist-CtMXAH7a.js → dist-BxVnMgXZ.js} +1 -1
  196. package/dist/{dist-DC-3T0ED.js → dist-CQSVro7b.js} +1 -1
  197. package/dist/{dist-f7HXo6j6.js → dist-DQbOebGW.js} +1 -1
  198. package/dist/{dist-DL9334yz.js → dist-DerFNpDY.js} +3 -3
  199. package/dist/{dist-D08oVYhr.js → dist-Djmzp6wi.js} +1 -1
  200. package/dist/{dist-D7WY8VPq.js → dist-DyrEOKEJ.js} +1 -1
  201. package/dist/{dist-DzdeVn-W.js → dist-EDkj3Ub1.js} +1 -1
  202. package/dist/{dist-C1tsW_99.js → dist-wyXxj3R1.js} +1 -1
  203. package/dist/editor-modal-oD1qNz_P.js +2773 -0
  204. package/dist/en-CM5fTFSo.js +2 -0
  205. package/dist/{es-lagTvUfX.js → es-BT4LSpE2.js} +9 -0
  206. package/dist/extensions-DRN-elXT.js +1645 -0
  207. package/dist/{eye-DwhBOaV8.js → eye-DphkRtAD.js} +1 -1
  208. package/dist/{fr-C4hVl5Lk.js → fr-CI7OJoql.js} +9 -0
  209. package/dist/{image-up-CiyQNZBt.js → image-up-Qi2BXD7T.js} +1 -1
  210. package/dist/{info-D6A1qEiF.js → info-VSyAs02q.js} +1 -1
  211. package/dist/{keys-DD1rl72F.js → keys-BdoSgsz9.js} +1 -1
  212. package/dist/{link-tKGmYWsB.js → link-CNuozGqD.js} +1 -1
  213. package/dist/{list-DjZQRpeI.js → list-BA0I5Wmu.js} +1 -1
  214. package/dist/{loader-circle-D9ZL3Sv0.js → loader-circle-z5eeqasv.js} +1 -1
  215. package/dist/{message-circle-KTHxCcpB.js → message-circle-BsQ9hEup.js} +1 -1
  216. package/dist/{cdn/chunks/nl-CReD7Apd.js → nl-D8y5OWGB.js} +9 -2
  217. package/dist/package-OkXfuRoO.js +25 -0
  218. package/dist/{pencil-Bq-nbQ7F.js → pencil-DFVFA7Dj.js} +1 -1
  219. package/dist/{plus-CRMnR4IG.js → plus-D8bkVjZ7.js} +1 -1
  220. package/dist/{pt-BR-BRA0-vGP.js → pt-BR-DMCbUBvJ.js} +9 -0
  221. package/dist/{refresh-cw-D7bYS5tm.js → refresh-cw-DPB7YFuz.js} +1 -1
  222. package/dist/{runtime-dom.esm-bundler-PnoZU512.js → runtime-dom.esm-bundler-BGbPz4-g.js} +2 -2
  223. package/dist/{search-DUo0YwPz.js → search-C-dCgqIa.js} +1 -1
  224. package/dist/{send-DaVMQphu.js → send-Cm2fy2zm.js} +1 -1
  225. package/dist/{shield-check-DxaaurL9.js → shield-check-COgBYFDF.js} +1 -1
  226. package/dist/smartphone-v0u_MOEV.js +46 -0
  227. package/dist/socialIcons-DkGcpEwC.js +1130 -0
  228. package/dist/{sparkles-D6T6k30e.js → sparkles-Ds0RF8Iu.js} +1 -1
  229. package/dist/style.css +1 -1
  230. package/dist/templateSettingsFields-YCFVBVYh.js +34 -0
  231. package/dist/templatical-editor.js +895 -3498
  232. package/dist/{text-align-start-vreFpmCX.js → text-align-start-DiavaIm6.js} +1 -1
  233. package/dist/{trash-DBv8MGY6.js → trash-DnOkfu2V.js} +1 -1
  234. package/dist/{triangle-alert-CmNS2LLv.js → triangle-alert-DGLAyXnh.js} +1 -1
  235. package/dist/{upload-DDB9Fs0P.js → upload-BBDme2cy.js} +1 -1
  236. package/dist/{useAliveFlag-oyByIcjy.js → useAliveFlag-BkKyhkwZ.js} +1 -1
  237. package/dist/{useCloudI18n-C1wuXik6.js → useCloudI18n-D1iedlP3.js} +2 -2
  238. package/dist/{useEditorCore-jfwgLThK.js → useEditorCore-C5APBjjV.js} +1140 -2325
  239. package/dist/{useEditorRoot-eVv4doqZ.js → useEditorRoot-BOxn5EfP.js} +2 -2
  240. package/dist/{useI18n-VOtdfENx.js → useI18n-Ds_-druD.js} +2 -2
  241. package/dist/useLogicTag-DoHfc08B.js +36 -0
  242. package/dist/{useMergeTag-CQM9pFca.js → useMergeTag-DXyum3kG.js} +2 -2
  243. package/dist/{usePopoverPosition-gZjRywai.js → usePopoverPosition-Du-Ah8E9.js} +2 -2
  244. package/dist/{useScrollToBlock-C0Ehnyl4.js → useScrollToBlock-DXQYPCnJ.js} +3 -3
  245. package/dist/{vue.runtime.esm-bundler-DShF3P6k.js → vue.runtime.esm-bundler-CyqhBwpY.js} +1133 -1126
  246. package/dist/{x-B7sgO_z8.js → x-3BHV3Q6K.js} +1 -1
  247. package/package.json +14 -14
  248. package/dist/ColorPicker-BTtN94te.js +0 -501
  249. package/dist/FieldRow-C8nOknr_.js +0 -128
  250. package/dist/MergeTagInput-Cw1RoMly.js +0 -509
  251. package/dist/MergeTagSuggestion-BXO3UIXW.js +0 -1329
  252. package/dist/cdn/chunks/ColorPicker-BaonTCAQ.js +0 -502
  253. package/dist/cdn/chunks/ColorPicker-BaonTCAQ.js.map +0 -1
  254. package/dist/cdn/chunks/FieldRow-D9OJhYeb.js +0 -130
  255. package/dist/cdn/chunks/FieldRow-D9OJhYeb.js.map +0 -1
  256. package/dist/cdn/chunks/MergeTagInput-CSIThqkz.js +0 -470
  257. package/dist/cdn/chunks/MergeTagInput-CSIThqkz.js.map +0 -1
  258. package/dist/cdn/chunks/MergeTagSuggestion-CY6WK8Eb.js +0 -215
  259. package/dist/cdn/chunks/MergeTagSuggestion-CY6WK8Eb.js.map +0 -1
  260. package/dist/cdn/chunks/dist-BW6Y49zE.js.map +0 -1
  261. package/dist/cdn/chunks/dist-CAFTQ6Y2.js.map +0 -1
  262. package/dist/cdn/chunks/draggable-kbOhCgnk.js.map +0 -1
  263. package/dist/cdn/chunks/editor-modal-B6IdQWlf.js +0 -5908
  264. package/dist/cdn/chunks/editor-modal-B6IdQWlf.js.map +0 -1
  265. package/dist/cdn/chunks/en-DjunooBz.js +0 -2
  266. package/dist/cdn/chunks/extensions-D2YIhF7u.js.map +0 -1
  267. package/dist/cdn/chunks/tiptap-Epe8m3Vo.js.map +0 -1
  268. package/dist/cdn/chunks/useEditorCore-06PtcUi1.js +0 -3698
  269. package/dist/cdn/chunks/useEditorCore-06PtcUi1.js.map +0 -1
  270. package/dist/cdn/chunks/useEditorRoot-ByHPMqYT.js +0 -10
  271. package/dist/editor-modal-uAEB6xKz.js +0 -5998
  272. package/dist/en-CQWkDCpm.js +0 -2
  273. package/dist/extensions-CcGj7OfS.js +0 -470
@@ -0,0 +1,2 @@
1
+ import { i as e } from "./editor-modal-C-yBlj2C.js";
2
+ export { e as default };
@@ -77,9 +77,18 @@ var e = { mediaLibrary: {
77
77
  cropOutputSize: "Tamaño de salida",
78
78
  cropPixels: "px",
79
79
  cropOptional: "(opcional)",
80
+ close: "Cerrar",
81
+ searchAriaLabel: "Buscar archivos",
82
+ filterAriaLabel: "Filtrar por tipo",
83
+ filesListAriaLabel: "Archivos",
84
+ loading: "Cargando",
85
+ expandFolder: "Expandir carpeta",
86
+ collapseFolder: "Contraer carpeta",
87
+ deleteFolder: "Eliminar carpeta",
88
+ deleteFolderConfirm: "Confirmar eliminación",
80
89
  storageTooltip: "{used} de {total} usados ({remaining} restantes)"
81
90
  } };
82
91
  //#endregion
83
92
  export { e as default };
84
93
 
85
- //# sourceMappingURL=es-lagTvUfX.js.map
94
+ //# sourceMappingURL=es-BT4LSpE2.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"es-lagTvUfX.js","names":[],"sources":["../../../../media-library/src/i18n/locales/es.ts"],"sourcesContent":["const es = {\n mediaLibrary: {\n title: \"Biblioteca multimedia\",\n searchPlaceholder: \"Buscar archivos...\",\n allFiles: \"Todos los archivos\",\n filterAll: \"Todos los tipos\",\n filterImages: \"Imágenes\",\n filterDocuments: \"Documentos\",\n filterVideos: \"Vídeos\",\n filterAudio: \"Audio\",\n newFolder: \"Nueva carpeta\",\n folderName: \"Nombre de la carpeta\",\n noFiles: \"No se han encontrado archivos\",\n noSearchResults: \"Ningún archivo coincide con tu búsqueda\",\n dropOrClick: \"Suelta los archivos aquí o haz clic para subirlos\",\n acceptedFormats: \"Imágenes, PDF, vídeo, audio y documentos (máx. 10 MB)\",\n uploading: \"Subiendo...\",\n uploadingProgress: \"Subiendo {current} de {total}...\",\n selectImage: \"Seleccionar imagen\",\n selectFile: \"Seleccionar archivo\",\n deleteSelected: \"Eliminar\",\n copyUrl: \"Copiar URL\",\n copied: \"¡Copiada!\",\n browseMedia: \"Explorar la biblioteca multimedia\",\n renameFolder: \"Cambiar nombre de la carpeta\",\n addSubfolder: \"Añadir subcarpeta\",\n subfolderName: \"Nombre de la subcarpeta\",\n sortNewest: \"Más recientes primero\",\n sortOldest: \"Más antiguos primero\",\n sortNameAsc: \"Nombre de A a Z\",\n sortNameDesc: \"Nombre de Z a A\",\n sortSizeAsc: \"Más pequeños primero\",\n sortSizeDesc: \"Más grandes primero\",\n moveSelected: \"Mover\",\n moveToRoot: \"Todos los archivos\",\n currentFolder: \"(actual)\",\n confirmDelete: \"¿Confirmar?\",\n renameFile: \"Cambiar nombre\",\n editFile: \"Editar archivo\",\n fileName: \"Nombre del archivo\",\n altText: \"Texto alternativo\",\n altTextPlaceholder: \"Describe esta imagen para mejorar la accesibilidad\",\n saveChanges: \"Guardar\",\n cancel: \"Cancelar\",\n frequentlyUsed: \"Usados frecuentemente\",\n deleteWarningTitle: \"Eliminar archivo\",\n deleteWarningMessage: \"¿Estás seguro? Esta acción es irreversible.\",\n deleteWarningUsageNote:\n \"Los siguientes archivos se utilizan en plantillas. Si los eliminas, es posible que esas plantillas dejen de funcionar correctamente.\",\n deleteAnyway: \"Eliminar\",\n usedInTemplates: \"Usado en {count} plantilla(s)\",\n viewGrid: \"Vista de cuadrícula\",\n viewList: \"Vista de lista\",\n showFolders: \"Mostrar carpetas\",\n hideFolders: \"Ocultar carpetas\",\n importFromUrl: \"Importar desde URL\",\n importUrlPlaceholder: \"https://example.com/image.jpg\",\n import: \"Importar\",\n importing: \"Importando...\",\n importError: \"No se ha podido importar desde la URL\",\n replaceFile: \"Reemplazar archivo\",\n replaceWarningTitle: \"Reemplazar archivo\",\n replaceWarningMessage:\n \"Estás a punto de reemplazar este archivo. El archivo de reemplazo debe tener la misma extensión ({extension}).\",\n replaceWarningUsageNote:\n \"Este archivo se utiliza en {count} plantilla(s). Al reemplazarlo, se actualizarán todas las referencias.\",\n replaceSelectFile: \"Seleccionar archivo de reemplazo\",\n replace: \"Reemplazar\",\n replacing: \"Reemplazando...\",\n replaceError: \"No se ha podido reemplazar el archivo\",\n saving: \"Guardando...\",\n cropAspectRatio: \"Relación de aspecto\",\n cropFree: \"Libre\",\n cropSquare: \"1:1\",\n cropLandscape43: \"4:3\",\n cropLandscape169: \"16:9\",\n cropOriginal: \"Original\",\n cropMaxWidth: \"Anchura máxima\",\n cropMaxHeight: \"Altura máxima\",\n cropOutputSize: \"Tamaño de salida\",\n cropPixels: \"px\",\n cropOptional: \"(opcional)\",\n storageTooltip: \"{used} de {total} usados ({remaining} restantes)\",\n },\n};\n\nexport default es;\n"],"mappings":";AAAA,IAAM,IAAK,EACT,cAAc;CACZ,OAAO;CACP,mBAAmB;CACnB,UAAU;CACV,WAAW;CACX,cAAc;CACd,iBAAiB;CACjB,cAAc;CACd,aAAa;CACb,WAAW;CACX,YAAY;CACZ,SAAS;CACT,iBAAiB;CACjB,aAAa;CACb,iBAAiB;CACjB,WAAW;CACX,mBAAmB;CACnB,aAAa;CACb,YAAY;CACZ,gBAAgB;CAChB,SAAS;CACT,QAAQ;CACR,aAAa;CACb,cAAc;CACd,cAAc;CACd,eAAe;CACf,YAAY;CACZ,YAAY;CACZ,aAAa;CACb,cAAc;CACd,aAAa;CACb,cAAc;CACd,cAAc;CACd,YAAY;CACZ,eAAe;CACf,eAAe;CACf,YAAY;CACZ,UAAU;CACV,UAAU;CACV,SAAS;CACT,oBAAoB;CACpB,aAAa;CACb,QAAQ;CACR,gBAAgB;CAChB,oBAAoB;CACpB,sBAAsB;CACtB,wBACE;CACF,cAAc;CACd,iBAAiB;CACjB,UAAU;CACV,UAAU;CACV,aAAa;CACb,aAAa;CACb,eAAe;CACf,sBAAsB;CACtB,QAAQ;CACR,WAAW;CACX,aAAa;CACb,aAAa;CACb,qBAAqB;CACrB,uBACE;CACF,yBACE;CACF,mBAAmB;CACnB,SAAS;CACT,WAAW;CACX,cAAc;CACd,QAAQ;CACR,iBAAiB;CACjB,UAAU;CACV,YAAY;CACZ,iBAAiB;CACjB,kBAAkB;CAClB,cAAc;CACd,cAAc;CACd,eAAe;CACf,gBAAgB;CAChB,YAAY;CACZ,cAAc;CACd,gBAAgB;AAClB,EACF"}
1
+ {"version":3,"file":"es-BT4LSpE2.js","names":[],"sources":["../../../../media-library/src/i18n/locales/es.ts"],"sourcesContent":["const es = {\n mediaLibrary: {\n title: \"Biblioteca multimedia\",\n searchPlaceholder: \"Buscar archivos...\",\n allFiles: \"Todos los archivos\",\n filterAll: \"Todos los tipos\",\n filterImages: \"Imágenes\",\n filterDocuments: \"Documentos\",\n filterVideos: \"Vídeos\",\n filterAudio: \"Audio\",\n newFolder: \"Nueva carpeta\",\n folderName: \"Nombre de la carpeta\",\n noFiles: \"No se han encontrado archivos\",\n noSearchResults: \"Ningún archivo coincide con tu búsqueda\",\n dropOrClick: \"Suelta los archivos aquí o haz clic para subirlos\",\n acceptedFormats: \"Imágenes, PDF, vídeo, audio y documentos (máx. 10 MB)\",\n uploading: \"Subiendo...\",\n uploadingProgress: \"Subiendo {current} de {total}...\",\n selectImage: \"Seleccionar imagen\",\n selectFile: \"Seleccionar archivo\",\n deleteSelected: \"Eliminar\",\n copyUrl: \"Copiar URL\",\n copied: \"¡Copiada!\",\n browseMedia: \"Explorar la biblioteca multimedia\",\n renameFolder: \"Cambiar nombre de la carpeta\",\n addSubfolder: \"Añadir subcarpeta\",\n subfolderName: \"Nombre de la subcarpeta\",\n sortNewest: \"Más recientes primero\",\n sortOldest: \"Más antiguos primero\",\n sortNameAsc: \"Nombre de A a Z\",\n sortNameDesc: \"Nombre de Z a A\",\n sortSizeAsc: \"Más pequeños primero\",\n sortSizeDesc: \"Más grandes primero\",\n moveSelected: \"Mover\",\n moveToRoot: \"Todos los archivos\",\n currentFolder: \"(actual)\",\n confirmDelete: \"¿Confirmar?\",\n renameFile: \"Cambiar nombre\",\n editFile: \"Editar archivo\",\n fileName: \"Nombre del archivo\",\n altText: \"Texto alternativo\",\n altTextPlaceholder: \"Describe esta imagen para mejorar la accesibilidad\",\n saveChanges: \"Guardar\",\n cancel: \"Cancelar\",\n frequentlyUsed: \"Usados frecuentemente\",\n deleteWarningTitle: \"Eliminar archivo\",\n deleteWarningMessage: \"¿Estás seguro? Esta acción es irreversible.\",\n deleteWarningUsageNote:\n \"Los siguientes archivos se utilizan en plantillas. Si los eliminas, es posible que esas plantillas dejen de funcionar correctamente.\",\n deleteAnyway: \"Eliminar\",\n usedInTemplates: \"Usado en {count} plantilla(s)\",\n viewGrid: \"Vista de cuadrícula\",\n viewList: \"Vista de lista\",\n showFolders: \"Mostrar carpetas\",\n hideFolders: \"Ocultar carpetas\",\n importFromUrl: \"Importar desde URL\",\n importUrlPlaceholder: \"https://example.com/image.jpg\",\n import: \"Importar\",\n importing: \"Importando...\",\n importError: \"No se ha podido importar desde la URL\",\n replaceFile: \"Reemplazar archivo\",\n replaceWarningTitle: \"Reemplazar archivo\",\n replaceWarningMessage:\n \"Estás a punto de reemplazar este archivo. El archivo de reemplazo debe tener la misma extensión ({extension}).\",\n replaceWarningUsageNote:\n \"Este archivo se utiliza en {count} plantilla(s). Al reemplazarlo, se actualizarán todas las referencias.\",\n replaceSelectFile: \"Seleccionar archivo de reemplazo\",\n replace: \"Reemplazar\",\n replacing: \"Reemplazando...\",\n replaceError: \"No se ha podido reemplazar el archivo\",\n saving: \"Guardando...\",\n cropAspectRatio: \"Relación de aspecto\",\n cropFree: \"Libre\",\n cropSquare: \"1:1\",\n cropLandscape43: \"4:3\",\n cropLandscape169: \"16:9\",\n cropOriginal: \"Original\",\n cropMaxWidth: \"Anchura máxima\",\n cropMaxHeight: \"Altura máxima\",\n cropOutputSize: \"Tamaño de salida\",\n cropPixels: \"px\",\n cropOptional: \"(opcional)\",\n close: \"Cerrar\",\n searchAriaLabel: \"Buscar archivos\",\n filterAriaLabel: \"Filtrar por tipo\",\n filesListAriaLabel: \"Archivos\",\n loading: \"Cargando\",\n expandFolder: \"Expandir carpeta\",\n collapseFolder: \"Contraer carpeta\",\n deleteFolder: \"Eliminar carpeta\",\n deleteFolderConfirm: \"Confirmar eliminación\",\n storageTooltip: \"{used} de {total} usados ({remaining} restantes)\",\n },\n};\n\nexport default es;\n"],"mappings":";AAAA,IAAM,IAAK,EACT,cAAc;CACZ,OAAO;CACP,mBAAmB;CACnB,UAAU;CACV,WAAW;CACX,cAAc;CACd,iBAAiB;CACjB,cAAc;CACd,aAAa;CACb,WAAW;CACX,YAAY;CACZ,SAAS;CACT,iBAAiB;CACjB,aAAa;CACb,iBAAiB;CACjB,WAAW;CACX,mBAAmB;CACnB,aAAa;CACb,YAAY;CACZ,gBAAgB;CAChB,SAAS;CACT,QAAQ;CACR,aAAa;CACb,cAAc;CACd,cAAc;CACd,eAAe;CACf,YAAY;CACZ,YAAY;CACZ,aAAa;CACb,cAAc;CACd,aAAa;CACb,cAAc;CACd,cAAc;CACd,YAAY;CACZ,eAAe;CACf,eAAe;CACf,YAAY;CACZ,UAAU;CACV,UAAU;CACV,SAAS;CACT,oBAAoB;CACpB,aAAa;CACb,QAAQ;CACR,gBAAgB;CAChB,oBAAoB;CACpB,sBAAsB;CACtB,wBACE;CACF,cAAc;CACd,iBAAiB;CACjB,UAAU;CACV,UAAU;CACV,aAAa;CACb,aAAa;CACb,eAAe;CACf,sBAAsB;CACtB,QAAQ;CACR,WAAW;CACX,aAAa;CACb,aAAa;CACb,qBAAqB;CACrB,uBACE;CACF,yBACE;CACF,mBAAmB;CACnB,SAAS;CACT,WAAW;CACX,cAAc;CACd,QAAQ;CACR,iBAAiB;CACjB,UAAU;CACV,YAAY;CACZ,iBAAiB;CACjB,kBAAkB;CAClB,cAAc;CACd,cAAc;CACd,eAAe;CACf,gBAAgB;CAChB,YAAY;CACZ,cAAc;CACd,OAAO;CACP,iBAAiB;CACjB,iBAAiB;CACjB,oBAAoB;CACpB,SAAS;CACT,cAAc;CACd,gBAAgB;CAChB,cAAc;CACd,qBAAqB;CACrB,gBAAgB;AAClB,EACF"}
@@ -1,11 +1,11 @@
1
- import { H as e, N as t, Q as n, S as r, U as i, Y as a, at as o, c as s, ct as c, f as l, g as u, h as d, k as f, l as p, lt as m, m as h, o as g, p as _, ut as v } from "./draggable-kbOhCgnk.js";
1
+ import { H as e, N as t, Q as n, S as r, U as i, Y as a, at as o, c as s, ct as c, f as l, g as u, h as d, k as f, l as p, lt as m, m as h, o as g, p as _, ut as v } from "./draggable-IB4x6w2O.js";
2
2
  import { a as y, d as b, o as x, r as S } from "./src-Dwgq7hf4.js";
3
- import { t as C } from "./useI18n-BhE7ndNr.js";
4
- import { t as w } from "./useMergeTag-DE2mpy1w.js";
5
- import { _ as T, g as E, h as D, n as O, t as k, v as A, y as j } from "./tiptap-Epe8m3Vo.js";
6
- import { i as M, r as N, t as P } from "./MergeTagSuggestion-CY6WK8Eb.js";
3
+ import { t as C } from "./useI18n-DTZ9sIcv.js";
4
+ import { t as w } from "./useMergeTag-BE8oDoha.js";
5
+ import { _ as T, g as E, h as D, n as O, r as k, t as A, v as j, y as M } from "./tiptap-DhLuKyDc.js";
6
+ import { a as N, o as P, s as F } from "./LogicTagInsertButton-DpyPozop.js";
7
7
  //#region src/extensions/FontSize.ts
8
- var F = D.create({
8
+ var I = D.create({
9
9
  name: "fontSize",
10
10
  addOptions() {
11
11
  return { types: ["textStyle"] };
@@ -26,7 +26,7 @@ var F = D.create({
26
26
  unsetFontSize: () => ({ chain: e }) => e().setMark("textStyle", { fontSize: null }).removeEmptyTextStyle().run()
27
27
  };
28
28
  }
29
- }), I = D.create({
29
+ }), L = D.create({
30
30
  name: "letterSpacing",
31
31
  addOptions() {
32
32
  return { types: ["textStyle"] };
@@ -47,7 +47,7 @@ var F = D.create({
47
47
  unsetLetterSpacing: () => ({ chain: e }) => e().setMark("textStyle", { letterSpacing: null }).removeEmptyTextStyle().run()
48
48
  };
49
49
  }
50
- }), L = D.create({
50
+ }), R = D.create({
51
51
  name: "lineBoundaryKeys",
52
52
  addKeyboardShortcuts() {
53
53
  let e = (e) => ({ editor: t }) => {
@@ -61,7 +61,7 @@ var F = D.create({
61
61
  Home: e("backward")
62
62
  };
63
63
  }
64
- }), R = D.create({
64
+ }), z = D.create({
65
65
  name: "lineHeight",
66
66
  addOptions() {
67
67
  return {
@@ -85,11 +85,11 @@ var F = D.create({
85
85
  unsetLineHeight: () => ({ commands: e }) => this.options.types.every((t) => e.resetAttributes(t, "lineHeight"))
86
86
  };
87
87
  }
88
- }), z = [
88
+ }), B = [
89
89
  "aria-label",
90
90
  "data-tooltip",
91
91
  "onKeydown"
92
- ], B = ["aria-label", "onKeydown"], V = ["aria-label"], H = /* @__PURE__ */ r({
92
+ ], V = ["aria-label", "onKeydown"], H = ["aria-label"], U = /* @__PURE__ */ r({
93
93
  __name: "LogicMergeTagNodeView",
94
94
  props: {
95
95
  node: {},
@@ -99,16 +99,16 @@ var F = D.create({
99
99
  updateAttributes: { type: Function }
100
100
  },
101
101
  setup(r) {
102
- let a = r, { syntax: x } = w(), { t: S } = C(), T = l(() => b(a.node.attrs.value, x)), E = l(() => y(a.node.attrs.value, x)), D = n(!1), O = n(""), A = n(null), j = !1;
102
+ let a = r, { syntax: x } = w(), { t: S } = C(), T = l(() => b(a.node.attrs.value, x)), E = l(() => y(a.node.attrs.value, x)), D = n(!1), k = n(""), A = n(null), j = !1;
103
103
  function M() {
104
- O.value = a.node.attrs.value, j = !1, D.value = !0, f(() => {
104
+ k.value = a.node.attrs.value, j = !1, D.value = !0, f(() => {
105
105
  A.value?.focus(), A.value?.select();
106
106
  });
107
107
  }
108
108
  function N() {
109
109
  if (j) return;
110
110
  j = !0;
111
- let e = O.value.trim();
111
+ let e = k.value.trim();
112
112
  if (!e) {
113
113
  D.value = !1;
114
114
  return;
@@ -121,7 +121,7 @@ var F = D.create({
121
121
  function P(e) {
122
122
  e.key === "Enter" ? (e.preventDefault(), N()) : e.key === "Escape" && (D.value = !1);
123
123
  }
124
- return (n, a) => (t(), h(o(k), {
124
+ return (n, a) => (t(), h(o(O), {
125
125
  as: "span",
126
126
  class: c(T.value ? "tpl-logic-merge-tag-node tpl:group tpl:mx-0.5 tpl:inline-flex tpl:items-center tpl:gap-1 tpl:rounded tpl:px-1.5 tpl:py-0.5 tpl:text-[0.8em] tpl:font-bold tpl:tracking-wide tpl:uppercase tpl:select-none" : ""),
127
127
  style: m(T.value ? "background-color: transparent; border: 1.5px solid color-mix(in srgb, var(--tpl-primary) 50%, transparent); color: var(--tpl-primary);" : ""),
@@ -131,12 +131,12 @@ var F = D.create({
131
131
  key: 0,
132
132
  ref_key: "inputRef",
133
133
  ref: A,
134
- "onUpdate:modelValue": a[0] ||= (e) => O.value = e,
134
+ "onUpdate:modelValue": a[0] ||= (e) => k.value = e,
135
135
  type: "text",
136
136
  class: "tpl:w-40 tpl:rounded tpl:border-none tpl:bg-transparent tpl:px-0.5 tpl:py-0 tpl:text-[1em] tpl:font-medium tpl:normal-case tpl:outline-none tpl:text-[var(--tpl-primary)]",
137
137
  onBlur: N,
138
138
  onKeydown: P
139
- }, null, 544)), [[g, O.value]]) : T.value ? (t(), u("span", {
139
+ }, null, 544)), [[g, k.value]]) : T.value ? (t(), u("span", {
140
140
  key: 1,
141
141
  role: "button",
142
142
  tabindex: "0",
@@ -145,14 +145,14 @@ var F = D.create({
145
145
  "data-tooltip": r.node.attrs.value,
146
146
  onClick: p(M, ["stop"]),
147
147
  onKeydown: [s(p(M, ["stop"]), ["enter"]), s(p(M, ["prevent", "stop"]), ["space"])]
148
- }, v(E.value), 41, z)) : (t(), u("span", {
148
+ }, v(E.value), 41, B)) : (t(), u("span", {
149
149
  key: 2,
150
150
  role: "button",
151
151
  tabindex: "0",
152
152
  "aria-label": o(S).mergeTag.editValue,
153
153
  onClick: p(M, ["stop"]),
154
154
  onKeydown: [s(p(M, ["stop"]), ["enter"]), s(p(M, ["prevent", "stop"]), ["space"])]
155
- }, v(r.node.attrs.value), 41, B)), T.value ? (t(), u("button", {
155
+ }, v(r.node.attrs.value), 41, V)), T.value ? (t(), u("button", {
156
156
  key: 3,
157
157
  type: "button",
158
158
  "aria-label": o(S).mergeTag.deleteMergeTag,
@@ -177,25 +177,25 @@ var F = D.create({
177
177
  y1: "6",
178
178
  x2: "18",
179
179
  y2: "18"
180
- })], -1)]], 8, V)) : d("", !0)]),
180
+ })], -1)]], 8, H)) : d("", !0)]),
181
181
  _: 1
182
182
  }, 8, ["class", "style"]));
183
183
  }
184
184
  });
185
185
  //#endregion
186
186
  //#region src/extensions/isNodeSelected.ts
187
- function U(e, t) {
187
+ function W(e, t) {
188
188
  let { $from: n, $to: r } = e.state.selection;
189
189
  return n.pos === r.pos ? n.pos > 0 && n.nodeBefore?.type.name === t || n.nodeAfter?.type.name === t : !1;
190
190
  }
191
191
  //#endregion
192
192
  //#region src/extensions/renderVueNodeView.ts
193
- function W(e) {
194
- return O(e);
193
+ function G(e) {
194
+ return k(e);
195
195
  }
196
196
  //#endregion
197
197
  //#region src/extensions/LogicMergeTagNode.ts
198
- var G = T.create({
198
+ var K = T.create({
199
199
  name: "logicMergeTagNode",
200
200
  group: "inline",
201
201
  inline: !0,
@@ -229,7 +229,7 @@ var G = T.create({
229
229
  let n = y(e.attrs.value, this.options.syntax);
230
230
  return [
231
231
  "span",
232
- j(t, {
232
+ M(t, {
233
233
  "data-logic-merge-tag": e.attrs.value,
234
234
  "data-keyword": n
235
235
  }),
@@ -237,12 +237,12 @@ var G = T.create({
237
237
  ];
238
238
  },
239
239
  addNodeView() {
240
- return W(H);
240
+ return G(U);
241
241
  },
242
242
  addKeyboardShortcuts() {
243
243
  return {
244
- Backspace: () => U(this.editor, this.name),
245
- Delete: () => U(this.editor, this.name)
244
+ Backspace: () => W(this.editor, this.name),
245
+ Delete: () => W(this.editor, this.name)
246
246
  };
247
247
  },
248
248
  addInputRules() {
@@ -262,7 +262,7 @@ var G = T.create({
262
262
  },
263
263
  addPasteRules() {
264
264
  let e = new RegExp(this.options.syntax.logic.source, "g");
265
- return [new A({
265
+ return [new j({
266
266
  find: e,
267
267
  handler: ({ state: e, range: t, match: n }) => {
268
268
  let r = n[0];
@@ -275,11 +275,11 @@ var G = T.create({
275
275
  }
276
276
  })];
277
277
  }
278
- }), K = ["aria-invalid"], q = [
278
+ }), q = ["aria-invalid"], J = [
279
279
  "aria-label",
280
280
  "data-tooltip",
281
281
  "onKeydown"
282
- ], J = ["aria-label"], Y = /* @__PURE__ */ r({
282
+ ], Y = ["aria-label"], X = /* @__PURE__ */ r({
283
283
  __name: "MergeTagNodeView",
284
284
  props: {
285
285
  node: {},
@@ -287,7 +287,7 @@ var G = T.create({
287
287
  updateAttributes: { type: Function }
288
288
  },
289
289
  setup(r) {
290
- let d = r, { getMergeTagLabel: m, getMergeTagDisplayLabel: y, findMergeTag: b, canRepickMergeTag: x, showRawValue: S, isMergeTagValue: T, requestMergeTag: E } = w(), { t: D, format: O } = C(), A = l(() => y(d.node.attrs.value, d.node.attrs.label)), j = l(() => x(d.node.attrs.value)), M = n(!1), N = n(""), P = n(null), F = !1;
290
+ let d = r, { getMergeTagLabel: m, getMergeTagDisplayLabel: y, findMergeTag: b, canRepickMergeTag: x, showRawValue: S, isMergeTagValue: T, requestMergeTag: E } = w(), { t: D, format: k } = C(), A = l(() => y(d.node.attrs.value, d.node.attrs.label)), j = l(() => x(d.node.attrs.value)), M = n(!1), N = n(""), P = n(null), F = !1;
291
291
  a(() => {
292
292
  F = !0;
293
293
  });
@@ -327,7 +327,7 @@ var G = T.create({
327
327
  B();
328
328
  } else e.key === "Escape" && (M.value = !1);
329
329
  }
330
- return (n, a) => (t(), h(o(k), {
330
+ return (n, a) => (t(), h(o(O), {
331
331
  as: "span",
332
332
  class: "tpl-merge-tag-node tpl:group tpl:mx-0.5 tpl:inline-flex tpl:items-center tpl:gap-1 tpl:rounded tpl:px-1.5 tpl:py-0.5 tpl:text-[0.9em] tpl:font-medium tpl:select-none tpl:text-[var(--tpl-primary)]",
333
333
  style: { "background-color": "color-mix(in srgb, var(--tpl-primary) 20%, transparent)" },
@@ -343,16 +343,16 @@ var G = T.create({
343
343
  class: c(["tpl:w-32 tpl:rounded tpl:bg-transparent tpl:px-0.5 tpl:py-0 tpl:text-[1em] tpl:font-medium tpl:outline-none tpl:text-[var(--tpl-primary)]", I.value ? "tpl:border-none" : "tpl:border tpl:border-[var(--tpl-danger)]"]),
344
344
  onBlur: B,
345
345
  onKeydown: V
346
- }, null, 42, K)), [[g, N.value]]) : (t(), u("span", {
346
+ }, null, 42, q)), [[g, N.value]]) : (t(), u("span", {
347
347
  key: 1,
348
348
  role: "button",
349
349
  tabindex: "0",
350
- "aria-label": j.value ? o(O)(o(D).mergeTag.changeTag, { label: A.value }) : o(D).mergeTag.editValue,
350
+ "aria-label": j.value ? o(k)(o(D).mergeTag.changeTag, { label: A.value }) : o(D).mergeTag.editValue,
351
351
  class: c(["tpl:cursor-pointer", o(S) ? "tpl-tooltip" : ""]),
352
352
  "data-tooltip": o(S) ? r.node.attrs.value : void 0,
353
353
  onClick: p(z, ["stop"]),
354
354
  onKeydown: [s(p(z, ["stop"]), ["enter"]), s(p(z, ["prevent", "stop"]), ["space"])]
355
- }, v(A.value), 43, q)), _("button", {
355
+ }, v(A.value), 43, J)), _("button", {
356
356
  type: "button",
357
357
  "aria-label": o(D).mergeTag.deleteMergeTag,
358
358
  class: "tpl-merge-tag-delete tpl:flex tpl:size-5 tpl:cursor-pointer tpl:items-center tpl:justify-center tpl:rounded-full tpl:border-none tpl:bg-transparent tpl:p-0 tpl:opacity-60 tpl:transition-all tpl:hover:opacity-100 tpl:text-[var(--tpl-primary)]",
@@ -376,11 +376,11 @@ var G = T.create({
376
376
  y1: "6",
377
377
  x2: "18",
378
378
  y2: "18"
379
- })], -1)]], 8, J)]),
379
+ })], -1)]], 8, Y)]),
380
380
  _: 1
381
381
  }));
382
382
  }
383
- }), X = T.create({
383
+ }), Z = T.create({
384
384
  name: "mergeTagNode",
385
385
  group: "inline",
386
386
  inline: !0,
@@ -412,7 +412,7 @@ var G = T.create({
412
412
  let n = x(e.attrs.value, this.options.mergeTags());
413
413
  return [
414
414
  "span",
415
- j(t, {
415
+ M(t, {
416
416
  "data-merge-tag": e.attrs.value,
417
417
  "data-label": n
418
418
  }),
@@ -420,7 +420,7 @@ var G = T.create({
420
420
  ];
421
421
  },
422
422
  addNodeView() {
423
- return W(Y);
423
+ return G(X);
424
424
  },
425
425
  addCommands() {
426
426
  return { insertMergeTag: (e) => ({ commands: t }) => t.insertContent({
@@ -433,8 +433,8 @@ var G = T.create({
433
433
  },
434
434
  addKeyboardShortcuts() {
435
435
  return {
436
- Backspace: () => U(this.editor, this.name),
437
- Delete: () => U(this.editor, this.name)
436
+ Backspace: () => W(this.editor, this.name),
437
+ Delete: () => W(this.editor, this.name)
438
438
  };
439
439
  },
440
440
  addInputRules() {
@@ -452,7 +452,7 @@ var G = T.create({
452
452
  },
453
453
  addPasteRules() {
454
454
  let e = new RegExp(this.options.syntax.value.source, "g");
455
- return [new A({
455
+ return [new j({
456
456
  find: e,
457
457
  handler: ({ state: e, range: t, match: n }) => {
458
458
  let r = n[0], i = x(r, this.options.mergeTags()), a = this.type.create({
@@ -465,6 +465,66 @@ var G = T.create({
465
465
  }
466
466
  });
467
467
  //#endregion
468
- export { F as FontSize, I as LetterSpacing, L as LineBoundaryKeys, R as LineHeight, G as LogicMergeTagNode, X as MergeTagNode, P as MergeTagSuggestion, N as filterMergeTags, M as handleSuggestionKeyDown };
468
+ //#region src/extensions/MergeTagSuggestion.ts
469
+ function Q(e, t) {
470
+ return () => {
471
+ let n = N(e, t);
472
+ return {
473
+ onStart: (e) => {
474
+ n.open({
475
+ items: e.items,
476
+ getRect: e.clientRect ?? null,
477
+ anchorEl: e.editor.view?.dom ?? null,
478
+ onCommand: (t) => e.command(t)
479
+ });
480
+ },
481
+ onUpdate: (e) => {
482
+ n.update({
483
+ items: e.items,
484
+ getRect: e.clientRect ?? null,
485
+ onCommand: (t) => e.command(t)
486
+ });
487
+ },
488
+ onKeyDown: (e) => e.event.key === "Escape" || n.handleKeyDown(e.event),
489
+ onExit: () => n.close()
490
+ };
491
+ };
492
+ }
493
+ var $ = D.create({
494
+ name: "mergeTagSuggestion",
495
+ addOptions() {
496
+ return {
497
+ mergeTags: () => [],
498
+ char: "{{",
499
+ emptyText: "No matching merge tags",
500
+ popoverRoot: null
501
+ };
502
+ },
503
+ addProseMirrorPlugins() {
504
+ let e = this.options.mergeTags(), t = this.options.emptyText, n = this.options.popoverRoot, r = {
505
+ char: this.options.char,
506
+ allowSpaces: !1,
507
+ startOfLine: !1,
508
+ allowedPrefixes: null,
509
+ items: ({ query: t }) => P(e, t),
510
+ command: ({ editor: e, range: t, props: n }) => {
511
+ e.chain().focus().insertContentAt(t, {
512
+ type: "mergeTagNode",
513
+ attrs: {
514
+ label: n.label,
515
+ value: n.value
516
+ }
517
+ }).run();
518
+ },
519
+ render: Q(t, n)
520
+ };
521
+ return [A({
522
+ editor: this.editor,
523
+ ...r
524
+ })];
525
+ }
526
+ });
527
+ //#endregion
528
+ export { I as FontSize, L as LetterSpacing, R as LineBoundaryKeys, z as LineHeight, K as LogicMergeTagNode, Z as MergeTagNode, $ as MergeTagSuggestion, P as filterMergeTags, F as handleSuggestionKeyDown };
469
529
 
470
- //# sourceMappingURL=extensions-D2YIhF7u.js.map
530
+ //# sourceMappingURL=extensions-Bhu8UEE5.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"extensions-Bhu8UEE5.js","names":[],"sources":["../../../src/extensions/FontSize.ts","../../../src/extensions/LetterSpacing.ts","../../../src/extensions/LineBoundaryKeys.ts","../../../src/extensions/LineHeight.ts","../../../src/extensions/LogicMergeTagNodeView.vue","../../../src/extensions/LogicMergeTagNodeView.vue","../../../src/extensions/isNodeSelected.ts","../../../src/extensions/renderVueNodeView.ts","../../../src/extensions/LogicMergeTagNode.ts","../../../src/extensions/MergeTagNodeView.vue","../../../src/extensions/MergeTagNodeView.vue","../../../src/extensions/MergeTagNode.ts","../../../src/extensions/MergeTagSuggestion.ts"],"sourcesContent":["import { Extension } from \"@tiptap/core\";\n\nexport interface FontSizeOptions {\n types: string[];\n}\n\ndeclare module \"@tiptap/core\" {\n interface Commands<ReturnType> {\n fontSize: {\n setFontSize: (size: string) => ReturnType;\n unsetFontSize: () => ReturnType;\n };\n }\n}\n\nexport const FontSize = Extension.create<FontSizeOptions>({\n name: \"fontSize\",\n\n addOptions() {\n return {\n types: [\"textStyle\"],\n };\n },\n\n addGlobalAttributes() {\n return [\n {\n types: this.options.types,\n attributes: {\n fontSize: {\n default: null,\n parseHTML: (element) =>\n element.style.fontSize?.replace(/['\"]+/g, \"\") || null,\n renderHTML: (attributes) => {\n if (!attributes.fontSize) {\n return {};\n }\n return {\n style: `font-size: ${attributes.fontSize}`,\n };\n },\n },\n },\n },\n ];\n },\n\n addCommands() {\n return {\n setFontSize:\n (size: string) =>\n ({ chain }) => {\n return chain().setMark(\"textStyle\", { fontSize: size }).run();\n },\n unsetFontSize:\n () =>\n ({ chain }) => {\n return chain()\n .setMark(\"textStyle\", { fontSize: null })\n .removeEmptyTextStyle()\n .run();\n },\n };\n },\n});\n","import { Extension } from \"@tiptap/core\";\n\nexport interface LetterSpacingOptions {\n types: string[];\n}\n\ndeclare module \"@tiptap/core\" {\n interface Commands<ReturnType> {\n letterSpacing: {\n setLetterSpacing: (spacing: string) => ReturnType;\n unsetLetterSpacing: () => ReturnType;\n };\n }\n}\n\nexport const LetterSpacing = Extension.create<LetterSpacingOptions>({\n name: \"letterSpacing\",\n\n addOptions() {\n return {\n types: [\"textStyle\"],\n };\n },\n\n addGlobalAttributes() {\n return [\n {\n types: this.options.types,\n attributes: {\n letterSpacing: {\n default: null,\n parseHTML: (element) =>\n element.style.letterSpacing?.replace(/['\"]+/g, \"\") || null,\n renderHTML: (attributes) => {\n if (!attributes.letterSpacing) {\n return {};\n }\n return {\n style: `letter-spacing: ${attributes.letterSpacing}`,\n };\n },\n },\n },\n },\n ];\n },\n\n addCommands() {\n return {\n setLetterSpacing:\n (spacing: string) =>\n ({ chain }) => {\n return chain().setMark(\"textStyle\", { letterSpacing: spacing }).run();\n },\n unsetLetterSpacing:\n () =>\n ({ chain }) => {\n return chain()\n .setMark(\"textStyle\", { letterSpacing: null })\n .removeEmptyTextStyle()\n .run();\n },\n };\n },\n});\n","import { Extension } from \"@tiptap/core\";\n\n/**\n * Routes plain End/Home through `Selection.modify` instead of the browser's\n * native caret movement.\n *\n * Chromium (verified 140–151, including stable Chrome) has a bug where a\n * native End or Home pressed while a triple-click selection is active puts\n * Blink's selection state into a mode where the next typed character\n * natively smooth-scrolls the nearest scrollable ancestor (the editor's\n * canvas, `.tpl-body`) to its very bottom (End) or top (Home), dragging the\n * caret out of view. The state cannot be repaired after the fact — clearing\n * or re-setting the DOM selection, blur/refocus, and preventDefault on the\n * clicks all fail — but a programmatic caret move never arms it.\n *\n * `Selection.modify(\"move\", direction, \"lineboundary\")` is the exact\n * equivalent of the native key (visual line boundary, bidi-aware via the\n * logical forward/backward directions), so behavior is unchanged for users.\n * Shift+End / Shift+Home extend selections natively and do not trigger the\n * bug, so only the plain keys are bound — a keymap entry without modifiers\n * never matches the shifted keys.\n */\nexport const LineBoundaryKeys = Extension.create({\n name: \"lineBoundaryKeys\",\n\n addKeyboardShortcuts() {\n const moveToLineBoundary =\n (direction: \"forward\" | \"backward\") =>\n ({ editor }: { editor: { view: unknown } }): boolean => {\n const view = editor.view as {\n composing: boolean;\n root: DocumentOrShadowRoot & {\n getSelection?: () => Selection | null;\n };\n dom: HTMLElement;\n };\n // During IME composition End/Home commit the composition; leave\n // that to the browser.\n if (!view || view.composing) return false;\n // `view.root` is the editable's Document or ShadowRoot, so the\n // selection resolves correctly in both mount modes. ShadowRoot's\n // getSelection is Chromium-only; elsewhere fall back to the owner\n // document (Chromium is also the only engine with the bug).\n const selection =\n typeof view.root?.getSelection === \"function\"\n ? view.root.getSelection()\n : (view.dom?.ownerDocument?.getSelection?.() ?? null);\n // `modify` is non-standard; without it, or with a selection that\n // is not ours, native handling is the safer default.\n if (!selection || typeof selection.modify !== \"function\") return false;\n if (!selection.anchorNode || !view.dom.contains(selection.anchorNode)) {\n return false;\n }\n selection.modify(\"move\", direction, \"lineboundary\");\n return true;\n };\n\n return {\n End: moveToLineBoundary(\"forward\"),\n Home: moveToLineBoundary(\"backward\"),\n };\n },\n});\n","import { Extension } from \"@tiptap/core\";\n\nexport interface LineHeightOptions {\n types: string[];\n defaultLineHeight: string;\n}\n\ndeclare module \"@tiptap/core\" {\n interface Commands<ReturnType> {\n lineHeight: {\n setLineHeight: (lineHeight: string) => ReturnType;\n unsetLineHeight: () => ReturnType;\n };\n }\n}\n\nexport const LineHeight = Extension.create<LineHeightOptions>({\n name: \"lineHeight\",\n\n addOptions() {\n return {\n types: [\"paragraph\"],\n defaultLineHeight: \"1.5\",\n };\n },\n\n addGlobalAttributes() {\n return [\n {\n types: this.options.types,\n attributes: {\n lineHeight: {\n default: null,\n parseHTML: (element) => element.style.lineHeight || null,\n renderHTML: (attributes) => {\n if (!attributes.lineHeight) {\n return {};\n }\n return {\n style: `line-height: ${attributes.lineHeight}`,\n };\n },\n },\n },\n },\n ];\n },\n\n addCommands() {\n return {\n setLineHeight:\n (lineHeight: string) =>\n ({ commands }) => {\n return this.options.types.every((type) =>\n commands.updateAttributes(type, { lineHeight }),\n );\n },\n unsetLineHeight:\n () =>\n ({ commands }) => {\n return this.options.types.every((type) =>\n commands.resetAttributes(type, \"lineHeight\"),\n );\n },\n };\n },\n});\n","<script setup lang=\"ts\">\nimport { useI18n } from \"../composables/useI18n\";\nimport { useMergeTag } from \"../composables/useMergeTag\";\nimport {\n getLogicMergeTagKeyword,\n isLogicMergeTagValue,\n} from \"@templatical/types\";\nimport type { Editor } from \"@tiptap/core\";\nimport { NodeViewWrapper } from \"@tiptap/vue-3\";\nimport { computed, nextTick, ref } from \"vue\";\n\nconst props = defineProps<{\n node: {\n attrs: {\n value: string;\n keyword: string;\n };\n };\n editor: Editor;\n getPos: () => number;\n deleteNode: () => void;\n updateAttributes: (attrs: Record<string, unknown>) => void;\n}>();\n\nconst { syntax } = useMergeTag();\nconst { t } = useI18n();\n\nconst isValid = computed(() =>\n isLogicMergeTagValue(props.node.attrs.value, syntax),\n);\nconst displayKeyword = computed(() =>\n getLogicMergeTagKeyword(props.node.attrs.value, syntax),\n);\n\nconst isEditing = ref(false);\nconst editValue = ref(\"\");\nconst inputRef = ref<HTMLInputElement | null>(null);\nlet handled = false;\n\nfunction startEditing(): void {\n editValue.value = props.node.attrs.value;\n handled = false;\n isEditing.value = true;\n nextTick(() => {\n inputRef.value?.focus();\n inputRef.value?.select();\n });\n}\n\nfunction finishEditing(): void {\n if (handled) {\n return;\n }\n handled = true;\n\n const newValue = editValue.value.trim();\n if (!newValue) {\n isEditing.value = false;\n return;\n }\n\n if (newValue !== props.node.attrs.value) {\n props.updateAttributes({\n value: newValue,\n keyword: isLogicMergeTagValue(newValue, syntax)\n ? getLogicMergeTagKeyword(newValue, syntax)\n : \"\",\n });\n }\n isEditing.value = false;\n}\n\nfunction handleKeydown(event: KeyboardEvent): void {\n if (event.key === \"Enter\") {\n event.preventDefault();\n finishEditing();\n } else if (event.key === \"Escape\") {\n isEditing.value = false;\n }\n}\n</script>\n\n<template>\n <NodeViewWrapper\n as=\"span\"\n :class=\"\n isValid\n ? 'tpl-logic-merge-tag-node tpl:group tpl:mx-0.5 tpl:inline-flex tpl:items-center tpl:gap-1 tpl:rounded tpl:px-1.5 tpl:py-0.5 tpl:text-[0.8em] tpl:font-bold tpl:tracking-wide tpl:uppercase tpl:select-none'\n : ''\n \"\n :style=\"\n isValid\n ? 'background-color: transparent; border: 1.5px solid color-mix(in srgb, var(--tpl-primary) 50%, transparent); color: var(--tpl-primary);'\n : ''\n \"\n contenteditable=\"false\"\n >\n <!-- Edit mode -->\n <input\n v-if=\"isEditing\"\n ref=\"inputRef\"\n v-model=\"editValue\"\n type=\"text\"\n class=\"tpl:w-40 tpl:rounded tpl:border-none tpl:bg-transparent tpl:px-0.5 tpl:py-0 tpl:text-[1em] tpl:font-medium tpl:normal-case tpl:outline-none tpl:text-[var(--tpl-primary)]\"\n @blur=\"finishEditing\"\n @keydown=\"handleKeydown\"\n />\n <!-- Display mode: valid merge tag -->\n <span\n v-else-if=\"isValid\"\n role=\"button\"\n tabindex=\"0\"\n :aria-label=\"t.mergeTag.editValue\"\n class=\"tpl-tooltip tpl:cursor-pointer\"\n :data-tooltip=\"node.attrs.value\"\n @click.stop=\"startEditing\"\n @keydown.enter.stop=\"startEditing\"\n @keydown.space.prevent.stop=\"startEditing\"\n >\n {{ displayKeyword }}\n </span>\n <!-- Display mode: invalid (plain text) -->\n <span\n v-else\n role=\"button\"\n tabindex=\"0\"\n :aria-label=\"t.mergeTag.editValue\"\n @click.stop=\"startEditing\"\n @keydown.enter.stop=\"startEditing\"\n @keydown.space.prevent.stop=\"startEditing\"\n >\n {{ node.attrs.value }}\n </span>\n <button\n v-if=\"isValid\"\n type=\"button\"\n :aria-label=\"t.mergeTag.deleteMergeTag\"\n class=\"tpl-merge-tag-delete tpl:flex tpl:size-5 tpl:cursor-pointer tpl:items-center tpl:justify-center tpl:rounded-full tpl:border-none tpl:bg-transparent tpl:p-0 tpl:opacity-60 tpl:transition-all tpl:hover:opacity-100 tpl:text-[var(--tpl-primary)]\"\n contenteditable=\"false\"\n @click.stop.prevent=\"deleteNode\"\n >\n <svg\n width=\"10\"\n height=\"10\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n stroke-width=\"3\"\n aria-hidden=\"true\"\n >\n <line x1=\"18\" y1=\"6\" x2=\"6\" y2=\"18\" />\n <line x1=\"6\" y1=\"6\" x2=\"18\" y2=\"18\" />\n </svg>\n </button>\n </NodeViewWrapper>\n</template>\n","<script setup lang=\"ts\">\nimport { useI18n } from \"../composables/useI18n\";\nimport { useMergeTag } from \"../composables/useMergeTag\";\nimport {\n getLogicMergeTagKeyword,\n isLogicMergeTagValue,\n} from \"@templatical/types\";\nimport type { Editor } from \"@tiptap/core\";\nimport { NodeViewWrapper } from \"@tiptap/vue-3\";\nimport { computed, nextTick, ref } from \"vue\";\n\nconst props = defineProps<{\n node: {\n attrs: {\n value: string;\n keyword: string;\n };\n };\n editor: Editor;\n getPos: () => number;\n deleteNode: () => void;\n updateAttributes: (attrs: Record<string, unknown>) => void;\n}>();\n\nconst { syntax } = useMergeTag();\nconst { t } = useI18n();\n\nconst isValid = computed(() =>\n isLogicMergeTagValue(props.node.attrs.value, syntax),\n);\nconst displayKeyword = computed(() =>\n getLogicMergeTagKeyword(props.node.attrs.value, syntax),\n);\n\nconst isEditing = ref(false);\nconst editValue = ref(\"\");\nconst inputRef = ref<HTMLInputElement | null>(null);\nlet handled = false;\n\nfunction startEditing(): void {\n editValue.value = props.node.attrs.value;\n handled = false;\n isEditing.value = true;\n nextTick(() => {\n inputRef.value?.focus();\n inputRef.value?.select();\n });\n}\n\nfunction finishEditing(): void {\n if (handled) {\n return;\n }\n handled = true;\n\n const newValue = editValue.value.trim();\n if (!newValue) {\n isEditing.value = false;\n return;\n }\n\n if (newValue !== props.node.attrs.value) {\n props.updateAttributes({\n value: newValue,\n keyword: isLogicMergeTagValue(newValue, syntax)\n ? getLogicMergeTagKeyword(newValue, syntax)\n : \"\",\n });\n }\n isEditing.value = false;\n}\n\nfunction handleKeydown(event: KeyboardEvent): void {\n if (event.key === \"Enter\") {\n event.preventDefault();\n finishEditing();\n } else if (event.key === \"Escape\") {\n isEditing.value = false;\n }\n}\n</script>\n\n<template>\n <NodeViewWrapper\n as=\"span\"\n :class=\"\n isValid\n ? 'tpl-logic-merge-tag-node tpl:group tpl:mx-0.5 tpl:inline-flex tpl:items-center tpl:gap-1 tpl:rounded tpl:px-1.5 tpl:py-0.5 tpl:text-[0.8em] tpl:font-bold tpl:tracking-wide tpl:uppercase tpl:select-none'\n : ''\n \"\n :style=\"\n isValid\n ? 'background-color: transparent; border: 1.5px solid color-mix(in srgb, var(--tpl-primary) 50%, transparent); color: var(--tpl-primary);'\n : ''\n \"\n contenteditable=\"false\"\n >\n <!-- Edit mode -->\n <input\n v-if=\"isEditing\"\n ref=\"inputRef\"\n v-model=\"editValue\"\n type=\"text\"\n class=\"tpl:w-40 tpl:rounded tpl:border-none tpl:bg-transparent tpl:px-0.5 tpl:py-0 tpl:text-[1em] tpl:font-medium tpl:normal-case tpl:outline-none tpl:text-[var(--tpl-primary)]\"\n @blur=\"finishEditing\"\n @keydown=\"handleKeydown\"\n />\n <!-- Display mode: valid merge tag -->\n <span\n v-else-if=\"isValid\"\n role=\"button\"\n tabindex=\"0\"\n :aria-label=\"t.mergeTag.editValue\"\n class=\"tpl-tooltip tpl:cursor-pointer\"\n :data-tooltip=\"node.attrs.value\"\n @click.stop=\"startEditing\"\n @keydown.enter.stop=\"startEditing\"\n @keydown.space.prevent.stop=\"startEditing\"\n >\n {{ displayKeyword }}\n </span>\n <!-- Display mode: invalid (plain text) -->\n <span\n v-else\n role=\"button\"\n tabindex=\"0\"\n :aria-label=\"t.mergeTag.editValue\"\n @click.stop=\"startEditing\"\n @keydown.enter.stop=\"startEditing\"\n @keydown.space.prevent.stop=\"startEditing\"\n >\n {{ node.attrs.value }}\n </span>\n <button\n v-if=\"isValid\"\n type=\"button\"\n :aria-label=\"t.mergeTag.deleteMergeTag\"\n class=\"tpl-merge-tag-delete tpl:flex tpl:size-5 tpl:cursor-pointer tpl:items-center tpl:justify-center tpl:rounded-full tpl:border-none tpl:bg-transparent tpl:p-0 tpl:opacity-60 tpl:transition-all tpl:hover:opacity-100 tpl:text-[var(--tpl-primary)]\"\n contenteditable=\"false\"\n @click.stop.prevent=\"deleteNode\"\n >\n <svg\n width=\"10\"\n height=\"10\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n stroke-width=\"3\"\n aria-hidden=\"true\"\n >\n <line x1=\"18\" y1=\"6\" x2=\"6\" y2=\"18\" />\n <line x1=\"6\" y1=\"6\" x2=\"18\" y2=\"18\" />\n </svg>\n </button>\n </NodeViewWrapper>\n</template>\n","import type { Editor } from \"@tiptap/core\";\n\n/**\n * Decides whether MergeTagNode / LogicMergeTagNode should swallow a\n * Backspace/Delete keystroke (returning `true` from a TipTap keymap\n * suppresses the default behavior).\n *\n * Only suppresses in the cursor-adjacent case so the \"first press\n * selects the atom, second press deletes it\" UX works. Range selections\n * (Cmd+A, drag-select, double-click-word) explicitly fall through —\n * default `replaceSelection` then deletes the entire range including\n * any merge-tag atoms inside it.\n *\n * Earlier revisions also returned `true` whenever `nodesBetween($from,\n * $to)` found a merge tag anywhere in the selection range — which\n * silently broke Cmd+A + Backspace for any paragraph containing a\n * merge tag (entire deletion was cancelled, nothing happened). The\n * cursor-adjacent protection is the only piece that should survive.\n */\nexport function isNodeSelected(editor: Editor, nodeTypeName: string): boolean {\n const { $from, $to } = editor.state.selection;\n\n // Range selection: let TipTap's default range-delete run. Even when\n // the range contains atom nodes, ProseMirror's replaceSelection\n // handles atomic deletion correctly.\n if ($from.pos !== $to.pos) return false;\n\n // Cursor-adjacent atom: protect from single-keystroke deletion.\n // (`$from.pos > 0` guards against reading `nodeBefore` at doc start\n // where ProseMirror's index would be undefined for nodeBefore.)\n if ($from.pos > 0 && $from.nodeBefore?.type.name === nodeTypeName) {\n return true;\n }\n if ($from.nodeAfter?.type.name === nodeTypeName) {\n return true;\n }\n\n return false;\n}\n","import type { Component } from \"vue\";\nimport { VueNodeViewRenderer } from \"@tiptap/vue-3\";\n\n/**\n * Typed wrapper for VueNodeViewRenderer that handles the known type mismatch\n * between Vue SFC default exports and TipTap's expected component type.\n */\nexport function renderVueNodeView(component: Component) {\n return VueNodeViewRenderer(\n component as Parameters<typeof VueNodeViewRenderer>[0],\n );\n}\n","import LogicMergeTagNodeView from \"./LogicMergeTagNodeView.vue\";\nimport type { SyntaxPreset } from \"@templatical/types\";\nimport {\n getLogicMergeTagKeyword,\n isLogicMergeTagValue,\n SYNTAX_PRESETS,\n} from \"@templatical/types\";\nimport { InputRule, mergeAttributes, Node, PasteRule } from \"@tiptap/core\";\nimport { isNodeSelected } from \"./isNodeSelected\";\nimport { renderVueNodeView } from \"./renderVueNodeView\";\n\nexport interface LogicMergeTagNodeOptions {\n syntax: SyntaxPreset;\n}\n\nexport const LogicMergeTagNode = Node.create<LogicMergeTagNodeOptions>({\n name: \"logicMergeTagNode\",\n\n group: \"inline\",\n\n inline: true,\n\n atom: true,\n\n addOptions() {\n return {\n syntax: SYNTAX_PRESETS.liquid,\n };\n },\n\n addAttributes() {\n return {\n // Both attributes are state, not markup, same as `MergeTagNode`:\n // `renderHTML()` emits the canonical `data-logic-merge-tag` /\n // `data-keyword` pair and `parseHTML` reads only those. `rendered: false`\n // keeps TipTap from also serializing each attribute under its own name,\n // which would put a write-only duplicate of the same data on every tag.\n value: {\n default: \"\",\n rendered: false,\n parseHTML: (element) =>\n element.getAttribute(\"data-logic-merge-tag\") || \"\",\n },\n keyword: {\n default: \"\",\n rendered: false,\n parseHTML: (element) =>\n element.getAttribute(\"data-keyword\") || element.textContent || \"\",\n },\n };\n },\n\n parseHTML() {\n return [\n {\n tag: \"span[data-logic-merge-tag]\",\n },\n ];\n },\n\n renderHTML({ node, HTMLAttributes }) {\n if (!isLogicMergeTagValue(node.attrs.value, this.options.syntax)) {\n return [\"span\", {}, node.attrs.value];\n }\n\n const keyword = getLogicMergeTagKeyword(\n node.attrs.value,\n this.options.syntax,\n );\n\n return [\n \"span\",\n mergeAttributes(HTMLAttributes, {\n \"data-logic-merge-tag\": node.attrs.value,\n \"data-keyword\": keyword,\n }),\n keyword,\n ];\n },\n\n addNodeView() {\n return renderVueNodeView(LogicMergeTagNodeView);\n },\n\n addKeyboardShortcuts() {\n return {\n Backspace: () => isNodeSelected(this.editor, this.name),\n Delete: () => isNodeSelected(this.editor, this.name),\n };\n },\n\n addInputRules() {\n const inputRegex = new RegExp(this.options.syntax.logic.source + \"$\", \"\");\n\n return [\n new InputRule({\n find: inputRegex,\n handler: ({ state, range, match }) => {\n const fullValue = match[0];\n if (!isLogicMergeTagValue(fullValue, this.options.syntax)) {\n return;\n }\n\n const keyword = getLogicMergeTagKeyword(\n fullValue,\n this.options.syntax,\n );\n\n const node = this.type.create({\n value: fullValue,\n keyword,\n });\n\n state.tr.replaceWith(range.from, range.to, node);\n },\n }),\n ];\n },\n\n addPasteRules() {\n const pasteRegex = new RegExp(this.options.syntax.logic.source, \"g\");\n\n return [\n new PasteRule({\n find: pasteRegex,\n handler: ({ state, range, match }) => {\n const fullValue = match[0];\n if (!isLogicMergeTagValue(fullValue, this.options.syntax)) {\n return;\n }\n\n const keyword = getLogicMergeTagKeyword(\n fullValue,\n this.options.syntax,\n );\n\n const node = this.type.create({\n value: fullValue,\n keyword,\n });\n\n state.tr.replaceWith(range.from, range.to, node);\n },\n }),\n ];\n },\n});\n","<script setup lang=\"ts\">\nimport { useI18n } from \"../composables/useI18n\";\nimport { useMergeTag } from \"../composables/useMergeTag\";\nimport { NodeViewWrapper } from \"@tiptap/vue-3\";\nimport { computed, nextTick, onScopeDispose, ref } from \"vue\";\n\nconst props = defineProps<{\n node: {\n attrs: {\n label: string;\n value: string;\n };\n };\n deleteNode: () => void;\n updateAttributes: (attrs: Record<string, unknown>) => void;\n}>();\n\nconst {\n getMergeTagLabel,\n getMergeTagDisplayLabel,\n findMergeTag,\n canRepickMergeTag,\n showRawValue,\n isMergeTagValue,\n requestMergeTag,\n} = useMergeTag();\nconst { t, format } = useI18n();\n\n// `node.attrs.label` is the label captured when the tag was inserted. It is\n// only ever a fallback — the configured tags win, which is what keeps a\n// relabelled tag from rendering its stale stored copy.\nconst displayLabel = computed(() =>\n getMergeTagDisplayLabel(props.node.attrs.value, props.node.attrs.label),\n);\nconst canRepick = computed(() => canRepickMergeTag(props.node.attrs.value));\n\nconst isEditing = ref(false);\nconst editValue = ref(\"\");\nconst inputRef = ref<HTMLInputElement | null>(null);\n\n// The chooser mounts in the popover root, outside this node view, so the node\n// can be torn down while it is open — a collaborator edit, a block change, the\n// editor unmounting. Writing attributes onto a destroyed node view throws.\nlet disposed = false;\nonScopeDispose(() => {\n disposed = true;\n});\n\n/** Whether the text currently in the raw input is a usable merge tag. */\nconst isEditValueValid = computed(\n () =>\n editValue.value.trim() === \"\" || isMergeTagValue(editValue.value.trim()),\n);\n\n/**\n * Swap this tag for another one, chosen through the same chooser insertion\n * uses. `requestMergeTag` sets the editor-wide requesting flag for the whole\n * await, which is what stops `useRichTextEditor`'s click-outside handler\n * finishing the block when the user clicks a row in the chooser — that would\n * dispose this node view and silently drop the update.\n */\nasync function repick(): Promise<void> {\n const replacement = await requestMergeTag({\n reason: \"edit\",\n current: findMergeTag(props.node.attrs.value),\n });\n if (disposed || !replacement) return;\n props.updateAttributes({\n value: replacement.value,\n label: replacement.label,\n });\n}\n\nfunction startEditing(): void {\n editValue.value = props.node.attrs.value;\n isEditing.value = true;\n nextTick(() => {\n inputRef.value?.focus();\n inputRef.value?.select();\n });\n}\n\n/**\n * Activating the chip opens the chooser when one can resolve this token, and\n * the raw input only when none can. Editing a token as free text is how a\n * chip ends up holding something that is not a merge tag at all, which the\n * renderer then emits verbatim into the sent email.\n */\nfunction activate(): void {\n if (canRepick.value) {\n void repick();\n return;\n }\n startEditing();\n}\n\nfunction finishEditing(): void {\n const newValue = editValue.value.trim();\n // Never commit something that isn't a merge tag: `renderHTML` writes the\n // value straight into `data-merge-tag`, and the renderer drops that into the\n // MJML unchanged, so a typo would ship as literal text in the email.\n if (\n newValue &&\n newValue !== props.node.attrs.value &&\n isMergeTagValue(newValue)\n ) {\n props.updateAttributes({\n // The honest resolution, not the display chain: this is written into the\n // document as `data-label`, so a placeholder would be persisted as if it\n // were the tag's name.\n value: newValue,\n label: getMergeTagLabel(newValue),\n });\n }\n isEditing.value = false;\n}\n\nfunction handleKeydown(event: KeyboardEvent): void {\n if (event.key === \"Enter\") {\n event.preventDefault();\n // Enter on an invalid value keeps the input open rather than discarding\n // what was typed — the border and `aria-invalid` already say why.\n if (!isEditValueValid.value) return;\n finishEditing();\n } else if (event.key === \"Escape\") {\n isEditing.value = false;\n }\n}\n</script>\n\n<template>\n <NodeViewWrapper\n as=\"span\"\n class=\"tpl-merge-tag-node tpl:group tpl:mx-0.5 tpl:inline-flex tpl:items-center tpl:gap-1 tpl:rounded tpl:px-1.5 tpl:py-0.5 tpl:text-[0.9em] tpl:font-medium tpl:select-none tpl:text-[var(--tpl-primary)]\"\n style=\"\n background-color: color-mix(in srgb, var(--tpl-primary) 20%, transparent);\n \"\n contenteditable=\"false\"\n >\n <!-- Edit mode -->\n <input\n v-if=\"isEditing\"\n ref=\"inputRef\"\n v-model=\"editValue\"\n type=\"text\"\n :aria-invalid=\"isEditValueValid ? undefined : 'true'\"\n class=\"tpl:w-32 tpl:rounded tpl:bg-transparent tpl:px-0.5 tpl:py-0 tpl:text-[1em] tpl:font-medium tpl:outline-none tpl:text-[var(--tpl-primary)]\"\n :class=\"\n isEditValueValid\n ? 'tpl:border-none'\n : 'tpl:border tpl:border-[var(--tpl-danger)]'\n \"\n @blur=\"finishEditing\"\n @keydown=\"handleKeydown\"\n />\n <!-- Display mode -->\n <span\n v-else\n role=\"button\"\n tabindex=\"0\"\n :aria-label=\"\n canRepick\n ? format(t.mergeTag.changeTag, { label: displayLabel })\n : t.mergeTag.editValue\n \"\n class=\"tpl:cursor-pointer\"\n :class=\"showRawValue ? 'tpl-tooltip' : ''\"\n :data-tooltip=\"showRawValue ? node.attrs.value : undefined\"\n @click.stop=\"activate\"\n @keydown.enter.stop=\"activate\"\n @keydown.space.prevent.stop=\"activate\"\n >\n {{ displayLabel }}\n </span>\n <button\n type=\"button\"\n :aria-label=\"t.mergeTag.deleteMergeTag\"\n class=\"tpl-merge-tag-delete tpl:flex tpl:size-5 tpl:cursor-pointer tpl:items-center tpl:justify-center tpl:rounded-full tpl:border-none tpl:bg-transparent tpl:p-0 tpl:opacity-60 tpl:transition-all tpl:hover:opacity-100 tpl:text-[var(--tpl-primary)]\"\n contenteditable=\"false\"\n @click.stop.prevent=\"deleteNode\"\n >\n <svg\n width=\"10\"\n height=\"10\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n stroke-width=\"3\"\n aria-hidden=\"true\"\n >\n <line x1=\"18\" y1=\"6\" x2=\"6\" y2=\"18\" />\n <line x1=\"6\" y1=\"6\" x2=\"18\" y2=\"18\" />\n </svg>\n </button>\n </NodeViewWrapper>\n</template>\n","<script setup lang=\"ts\">\nimport { useI18n } from \"../composables/useI18n\";\nimport { useMergeTag } from \"../composables/useMergeTag\";\nimport { NodeViewWrapper } from \"@tiptap/vue-3\";\nimport { computed, nextTick, onScopeDispose, ref } from \"vue\";\n\nconst props = defineProps<{\n node: {\n attrs: {\n label: string;\n value: string;\n };\n };\n deleteNode: () => void;\n updateAttributes: (attrs: Record<string, unknown>) => void;\n}>();\n\nconst {\n getMergeTagLabel,\n getMergeTagDisplayLabel,\n findMergeTag,\n canRepickMergeTag,\n showRawValue,\n isMergeTagValue,\n requestMergeTag,\n} = useMergeTag();\nconst { t, format } = useI18n();\n\n// `node.attrs.label` is the label captured when the tag was inserted. It is\n// only ever a fallback — the configured tags win, which is what keeps a\n// relabelled tag from rendering its stale stored copy.\nconst displayLabel = computed(() =>\n getMergeTagDisplayLabel(props.node.attrs.value, props.node.attrs.label),\n);\nconst canRepick = computed(() => canRepickMergeTag(props.node.attrs.value));\n\nconst isEditing = ref(false);\nconst editValue = ref(\"\");\nconst inputRef = ref<HTMLInputElement | null>(null);\n\n// The chooser mounts in the popover root, outside this node view, so the node\n// can be torn down while it is open — a collaborator edit, a block change, the\n// editor unmounting. Writing attributes onto a destroyed node view throws.\nlet disposed = false;\nonScopeDispose(() => {\n disposed = true;\n});\n\n/** Whether the text currently in the raw input is a usable merge tag. */\nconst isEditValueValid = computed(\n () =>\n editValue.value.trim() === \"\" || isMergeTagValue(editValue.value.trim()),\n);\n\n/**\n * Swap this tag for another one, chosen through the same chooser insertion\n * uses. `requestMergeTag` sets the editor-wide requesting flag for the whole\n * await, which is what stops `useRichTextEditor`'s click-outside handler\n * finishing the block when the user clicks a row in the chooser — that would\n * dispose this node view and silently drop the update.\n */\nasync function repick(): Promise<void> {\n const replacement = await requestMergeTag({\n reason: \"edit\",\n current: findMergeTag(props.node.attrs.value),\n });\n if (disposed || !replacement) return;\n props.updateAttributes({\n value: replacement.value,\n label: replacement.label,\n });\n}\n\nfunction startEditing(): void {\n editValue.value = props.node.attrs.value;\n isEditing.value = true;\n nextTick(() => {\n inputRef.value?.focus();\n inputRef.value?.select();\n });\n}\n\n/**\n * Activating the chip opens the chooser when one can resolve this token, and\n * the raw input only when none can. Editing a token as free text is how a\n * chip ends up holding something that is not a merge tag at all, which the\n * renderer then emits verbatim into the sent email.\n */\nfunction activate(): void {\n if (canRepick.value) {\n void repick();\n return;\n }\n startEditing();\n}\n\nfunction finishEditing(): void {\n const newValue = editValue.value.trim();\n // Never commit something that isn't a merge tag: `renderHTML` writes the\n // value straight into `data-merge-tag`, and the renderer drops that into the\n // MJML unchanged, so a typo would ship as literal text in the email.\n if (\n newValue &&\n newValue !== props.node.attrs.value &&\n isMergeTagValue(newValue)\n ) {\n props.updateAttributes({\n // The honest resolution, not the display chain: this is written into the\n // document as `data-label`, so a placeholder would be persisted as if it\n // were the tag's name.\n value: newValue,\n label: getMergeTagLabel(newValue),\n });\n }\n isEditing.value = false;\n}\n\nfunction handleKeydown(event: KeyboardEvent): void {\n if (event.key === \"Enter\") {\n event.preventDefault();\n // Enter on an invalid value keeps the input open rather than discarding\n // what was typed — the border and `aria-invalid` already say why.\n if (!isEditValueValid.value) return;\n finishEditing();\n } else if (event.key === \"Escape\") {\n isEditing.value = false;\n }\n}\n</script>\n\n<template>\n <NodeViewWrapper\n as=\"span\"\n class=\"tpl-merge-tag-node tpl:group tpl:mx-0.5 tpl:inline-flex tpl:items-center tpl:gap-1 tpl:rounded tpl:px-1.5 tpl:py-0.5 tpl:text-[0.9em] tpl:font-medium tpl:select-none tpl:text-[var(--tpl-primary)]\"\n style=\"\n background-color: color-mix(in srgb, var(--tpl-primary) 20%, transparent);\n \"\n contenteditable=\"false\"\n >\n <!-- Edit mode -->\n <input\n v-if=\"isEditing\"\n ref=\"inputRef\"\n v-model=\"editValue\"\n type=\"text\"\n :aria-invalid=\"isEditValueValid ? undefined : 'true'\"\n class=\"tpl:w-32 tpl:rounded tpl:bg-transparent tpl:px-0.5 tpl:py-0 tpl:text-[1em] tpl:font-medium tpl:outline-none tpl:text-[var(--tpl-primary)]\"\n :class=\"\n isEditValueValid\n ? 'tpl:border-none'\n : 'tpl:border tpl:border-[var(--tpl-danger)]'\n \"\n @blur=\"finishEditing\"\n @keydown=\"handleKeydown\"\n />\n <!-- Display mode -->\n <span\n v-else\n role=\"button\"\n tabindex=\"0\"\n :aria-label=\"\n canRepick\n ? format(t.mergeTag.changeTag, { label: displayLabel })\n : t.mergeTag.editValue\n \"\n class=\"tpl:cursor-pointer\"\n :class=\"showRawValue ? 'tpl-tooltip' : ''\"\n :data-tooltip=\"showRawValue ? node.attrs.value : undefined\"\n @click.stop=\"activate\"\n @keydown.enter.stop=\"activate\"\n @keydown.space.prevent.stop=\"activate\"\n >\n {{ displayLabel }}\n </span>\n <button\n type=\"button\"\n :aria-label=\"t.mergeTag.deleteMergeTag\"\n class=\"tpl-merge-tag-delete tpl:flex tpl:size-5 tpl:cursor-pointer tpl:items-center tpl:justify-center tpl:rounded-full tpl:border-none tpl:bg-transparent tpl:p-0 tpl:opacity-60 tpl:transition-all tpl:hover:opacity-100 tpl:text-[var(--tpl-primary)]\"\n contenteditable=\"false\"\n @click.stop.prevent=\"deleteNode\"\n >\n <svg\n width=\"10\"\n height=\"10\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n stroke-width=\"3\"\n aria-hidden=\"true\"\n >\n <line x1=\"18\" y1=\"6\" x2=\"6\" y2=\"18\" />\n <line x1=\"6\" y1=\"6\" x2=\"18\" y2=\"18\" />\n </svg>\n </button>\n </NodeViewWrapper>\n</template>\n","import MergeTagNodeView from \"./MergeTagNodeView.vue\";\nimport type { MergeTag, SyntaxPreset } from \"@templatical/types\";\nimport { getMergeTagLabel, SYNTAX_PRESETS } from \"@templatical/types\";\nimport { InputRule, mergeAttributes, Node, PasteRule } from \"@tiptap/core\";\nimport { isNodeSelected } from \"./isNodeSelected\";\nimport { renderVueNodeView } from \"./renderVueNodeView\";\n\nexport interface MergeTagNodeOptions {\n /**\n * Read live, not captured. `renderHTML` and the input/paste rules resolve a\n * label every time they run, and `editor.setMergeTags` can replace the list\n * while a block is open for editing.\n */\n mergeTags: () => MergeTag[];\n syntax: SyntaxPreset;\n}\n\n/**\n * Inserted-node attrs are intentionally limited to `label` + `value`. The\n * `MergeTag` interface also carries optional `group` / `description` for\n * the built-in picker, but those are display-only and must NOT leak into\n * the document JSON — they would bloat templates and pollute serialized\n * state. `Pick<>` makes the constraint explicit at the type level.\n */\nexport type InsertMergeTagAttrs = Pick<MergeTag, \"label\" | \"value\">;\n\ndeclare module \"@tiptap/core\" {\n interface Commands<ReturnType> {\n mergeTagNode: {\n insertMergeTag: (attrs: InsertMergeTagAttrs) => ReturnType;\n };\n }\n}\n\nexport const MergeTagNode = Node.create<MergeTagNodeOptions>({\n name: \"mergeTagNode\",\n\n group: \"inline\",\n\n inline: true,\n\n atom: true,\n\n addOptions() {\n return {\n mergeTags: () => [],\n syntax: SYNTAX_PRESETS.liquid,\n };\n },\n\n addAttributes() {\n return {\n // Both attributes are state, not markup: `renderHTML()` below emits the\n // canonical `data-merge-tag` / `data-label` pair and `parseHTML` reads\n // only those. `rendered: false` keeps TipTap from also serializing each\n // attribute under its own name, which would put a write-only duplicate\n // of the same data on every tag — invalid on a `<span>`, and paid again\n // through storage, autosave, snapshots and version history.\n label: {\n default: \"\",\n rendered: false,\n parseHTML: (element) =>\n element.getAttribute(\"data-label\") || element.textContent || \"\",\n },\n value: {\n default: \"\",\n rendered: false,\n parseHTML: (element) => element.getAttribute(\"data-merge-tag\") || \"\",\n },\n };\n },\n\n parseHTML() {\n return [\n {\n tag: \"span[data-merge-tag]\",\n },\n ];\n },\n\n renderHTML({ node, HTMLAttributes }) {\n const label = getMergeTagLabel(node.attrs.value, this.options.mergeTags());\n\n return [\n \"span\",\n mergeAttributes(HTMLAttributes, {\n \"data-merge-tag\": node.attrs.value,\n \"data-label\": label,\n }),\n label,\n ];\n },\n\n addNodeView() {\n return renderVueNodeView(MergeTagNodeView);\n },\n\n addCommands() {\n return {\n insertMergeTag:\n (attrs: InsertMergeTagAttrs) =>\n ({ commands }) => {\n // Whitelist explicitly — even if a caller smuggles extra keys via\n // a wider type assertion, only label/value reach the node attrs.\n return commands.insertContent({\n type: this.name,\n attrs: { label: attrs.label, value: attrs.value },\n });\n },\n };\n },\n\n addKeyboardShortcuts() {\n return {\n Backspace: () => isNodeSelected(this.editor, this.name),\n Delete: () => isNodeSelected(this.editor, this.name),\n };\n },\n\n addInputRules() {\n const inputRegex = new RegExp(this.options.syntax.value.source + \"$\", \"\");\n\n return [\n new InputRule({\n find: inputRegex,\n handler: ({ state, range, match }) => {\n const fullValue = match[0];\n const label = getMergeTagLabel(fullValue, this.options.mergeTags());\n\n const node = this.type.create({\n label,\n value: fullValue,\n });\n\n state.tr.replaceWith(range.from, range.to, node);\n },\n }),\n ];\n },\n\n addPasteRules() {\n const pasteRegex = new RegExp(this.options.syntax.value.source, \"g\");\n\n return [\n new PasteRule({\n find: pasteRegex,\n handler: ({ state, range, match }) => {\n const fullValue = match[0];\n const label = getMergeTagLabel(fullValue, this.options.mergeTags());\n\n const node = this.type.create({\n label,\n value: fullValue,\n });\n\n state.tr.replaceWith(range.from, range.to, node);\n },\n }),\n ];\n },\n});\n","import type { MergeTag } from \"@templatical/types\";\nimport { Extension } from \"@tiptap/core\";\nimport Suggestion, {\n type SuggestionOptions,\n type SuggestionProps,\n type SuggestionKeyDownProps,\n} from \"@tiptap/suggestion\";\nimport type { Ref } from \"vue\";\nimport { createMergeTagPopup, filterMergeTags } from \"../utils/mergeTagPopup\";\n\nexport interface MergeTagSuggestionOptions {\n /** Available merge tags */\n /**\n * Read live, not captured: the list can be replaced while a block is being\n * edited (`editor.setMergeTags`), and a snapshot taken when the extension\n * was configured would keep suggesting the old tags.\n */\n mergeTags: () => MergeTag[];\n /** Trigger string (e.g. \"{{\", \"*|\", \"%%=\") */\n char: string;\n /** Localized empty-state label */\n emptyText: string;\n /**\n * Mount target for the suggestion popup. When provided with a non-null\n * `.value`, the popup attaches into that element instead of\n * `document.body` — keeping it inside the editor's effective DOM root\n * (shadow-aware). Pass the ref returned by `usePopoverRoot()`.\n *\n * Falls back to `document.body` when omitted or when the ref's value is\n * null at popup-open time (e.g. headless/test editors without an editor\n * shell). Preserves pre-Phase-3 behavior for callers that don't migrate.\n */\n popoverRoot?: Ref<HTMLElement | null> | null;\n}\n\n/**\n * Builds the `@tiptap/suggestion` `render` factory for the merge-tag popup.\n * A thin adapter over {@link createMergeTagPopup}: it maps ProseMirror's\n * `SuggestionProps` (items, `clientRect`, `view.dom`, `command`) onto the\n * controller. Exported as a standalone function so that mapping can be\n * unit-tested with mocked `SuggestionProps` instead of a full editor.\n */\nexport function createMergeTagSuggestionRenderer(\n emptyText: string,\n popoverRootRef?: Ref<HTMLElement | null> | null,\n): NonNullable<SuggestionOptions<MergeTag>[\"render\"]> {\n return () => {\n const popup = createMergeTagPopup(emptyText, popoverRootRef);\n\n return {\n onStart: (props: SuggestionProps<MergeTag>) => {\n // Use view.dom (ProseMirror contenteditable, actually\n // attached to the DOM) rather than options.element, which may\n // be a detached div when no `element` is passed to the editor\n // constructor (as is the case with @tiptap/vue-3 EditorContent).\n const viewDom = props.editor.view?.dom as HTMLElement | undefined;\n popup.open({\n items: props.items,\n getRect: props.clientRect ?? null,\n anchorEl: viewDom ?? null,\n onCommand: (item) => props.command(item),\n });\n },\n onUpdate: (props: SuggestionProps<MergeTag>) => {\n popup.update({\n items: props.items,\n getRect: props.clientRect ?? null,\n onCommand: (item) => props.command(item),\n });\n },\n onKeyDown: (props: SuggestionKeyDownProps): boolean => {\n // Escape closes via TipTap's suggestion plugin (→ onExit); report it\n // handled without selecting.\n if (props.event.key === \"Escape\") {\n return true;\n }\n return popup.handleKeyDown(props.event);\n },\n onExit: () => popup.close(),\n };\n };\n}\n\nexport const MergeTagSuggestion = Extension.create<MergeTagSuggestionOptions>({\n name: \"mergeTagSuggestion\",\n\n addOptions() {\n return {\n mergeTags: () => [],\n char: \"{{\",\n emptyText: \"No matching merge tags\",\n popoverRoot: null,\n };\n },\n\n addProseMirrorPlugins() {\n const tags = this.options.mergeTags();\n const emptyText = this.options.emptyText;\n const popoverRootRef = this.options.popoverRoot;\n\n const config: Omit<SuggestionOptions<MergeTag>, \"editor\"> = {\n char: this.options.char,\n allowSpaces: false,\n startOfLine: false,\n // Default is [\" \"] which requires whitespace/line-start before the\n // trigger char — so `.{{` would not fire. Allow any preceding char.\n allowedPrefixes: null,\n items: ({ query }: { query: string }) => filterMergeTags(tags, query),\n command: ({\n editor,\n range,\n props,\n }: {\n editor: SuggestionProps<MergeTag>[\"editor\"];\n range: { from: number; to: number };\n props: MergeTag;\n }) => {\n // Use insertContentAt for atomic replace (matches the canonical\n // @tiptap/suggestion + Mention pattern). Avoids edge cases where\n // chained deleteRange + insertMergeTag fails to insert when the\n // selection state shifts mid-chain.\n editor\n .chain()\n .focus()\n .insertContentAt(range, {\n type: \"mergeTagNode\",\n attrs: { label: props.label, value: props.value },\n })\n .run();\n },\n render: createMergeTagSuggestionRenderer(emptyText, popoverRootRef),\n };\n\n return [\n Suggestion({\n editor: this.editor,\n ...config,\n }),\n ];\n },\n});\n"],"mappings":"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"}
@@ -77,9 +77,18 @@ var e = { mediaLibrary: {
77
77
  cropOutputSize: "Taille de sortie",
78
78
  cropPixels: "px",
79
79
  cropOptional: "(facultatif)",
80
+ close: "Fermer",
81
+ searchAriaLabel: "Rechercher des fichiers",
82
+ filterAriaLabel: "Filtrer par type",
83
+ filesListAriaLabel: "Fichiers",
84
+ loading: "Chargement",
85
+ expandFolder: "Développer le dossier",
86
+ collapseFolder: "Réduire le dossier",
87
+ deleteFolder: "Supprimer le dossier",
88
+ deleteFolderConfirm: "Confirmer la suppression",
80
89
  storageTooltip: "{used} sur {total} utilisés ({remaining} restants)"
81
90
  } };
82
91
  //#endregion
83
92
  export { e as default };
84
93
 
85
- //# sourceMappingURL=fr-C4hVl5Lk.js.map
94
+ //# sourceMappingURL=fr-CI7OJoql.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"fr-C4hVl5Lk.js","names":[],"sources":["../../../../media-library/src/i18n/locales/fr.ts"],"sourcesContent":["const fr = {\n mediaLibrary: {\n title: \"Médiathèque\",\n searchPlaceholder: \"Rechercher des fichiers...\",\n allFiles: \"Tous les fichiers\",\n filterAll: \"Tous les types\",\n filterImages: \"Images\",\n filterDocuments: \"Documents\",\n filterVideos: \"Vidéos\",\n filterAudio: \"Audio\",\n newFolder: \"Nouveau dossier\",\n folderName: \"Nom du dossier\",\n noFiles: \"Aucun fichier trouvé\",\n noSearchResults: \"Aucun fichier ne correspond à votre recherche\",\n dropOrClick: \"Déposez des fichiers ici ou cliquez pour téléverser\",\n acceptedFormats: \"Images, PDF, vidéo, audio, documents (max 10 Mo)\",\n uploading: \"Téléversement...\",\n uploadingProgress: \"Téléversement de {current} sur {total}...\",\n selectImage: \"Sélectionner l'image\",\n selectFile: \"Sélectionner le fichier\",\n deleteSelected: \"Supprimer\",\n copyUrl: \"Copier l'URL\",\n copied: \"Copié !\",\n browseMedia: \"Parcourir la médiathèque\",\n renameFolder: \"Renommer le dossier\",\n addSubfolder: \"Ajouter un sous-dossier\",\n subfolderName: \"Nom du sous-dossier\",\n sortNewest: \"Plus récents d'abord\",\n sortOldest: \"Plus anciens d'abord\",\n sortNameAsc: \"Nom A-Z\",\n sortNameDesc: \"Nom Z-A\",\n sortSizeAsc: \"Plus petits d'abord\",\n sortSizeDesc: \"Plus grands d'abord\",\n moveSelected: \"Déplacer\",\n moveToRoot: \"Tous les fichiers\",\n currentFolder: \"(actuel)\",\n confirmDelete: \"Confirmer ?\",\n renameFile: \"Renommer\",\n editFile: \"Modifier le fichier\",\n fileName: \"Nom de fichier\",\n altText: \"Texte alternatif\",\n altTextPlaceholder: \"Décrivez cette image pour l'accessibilité\",\n saveChanges: \"Enregistrer\",\n cancel: \"Annuler\",\n frequentlyUsed: \"Fréquemment utilisés\",\n deleteWarningTitle: \"Supprimer le fichier\",\n deleteWarningMessage: \"Êtes-vous sûr ? Cette action est irréversible.\",\n deleteWarningUsageNote:\n \"Les fichiers suivants sont utilisés dans des modèles. Les supprimer peut casser ces modèles.\",\n deleteAnyway: \"Supprimer\",\n usedInTemplates: \"Utilisé dans {count} modèle(s)\",\n viewGrid: \"Vue en grille\",\n viewList: \"Vue en liste\",\n showFolders: \"Afficher les dossiers\",\n hideFolders: \"Masquer les dossiers\",\n importFromUrl: \"Importer depuis une URL\",\n importUrlPlaceholder: \"https://example.com/image.jpg\",\n import: \"Importer\",\n importing: \"Importation...\",\n importError: \"Échec de l'importation depuis l'URL\",\n replaceFile: \"Remplacer le fichier\",\n replaceWarningTitle: \"Remplacer le fichier\",\n replaceWarningMessage:\n \"Vous êtes sur le point de remplacer ce fichier. Le remplacement doit avoir la même extension ({extension}).\",\n replaceWarningUsageNote:\n \"Ce fichier est utilisé dans {count} modèle(s). Le remplacer mettra à jour toutes les références.\",\n replaceSelectFile: \"Sélectionner le fichier de remplacement\",\n replace: \"Remplacer\",\n replacing: \"Remplacement...\",\n replaceError: \"Échec du remplacement du fichier\",\n saving: \"Enregistrement...\",\n cropAspectRatio: \"Proportions\",\n cropFree: \"Libre\",\n cropSquare: \"1:1\",\n cropLandscape43: \"4:3\",\n cropLandscape169: \"16:9\",\n cropOriginal: \"Originales\",\n cropMaxWidth: \"Largeur max\",\n cropMaxHeight: \"Hauteur max\",\n cropOutputSize: \"Taille de sortie\",\n cropPixels: \"px\",\n cropOptional: \"(facultatif)\",\n storageTooltip: \"{used} sur {total} utilisés ({remaining} restants)\",\n },\n};\n\nexport default fr;\n"],"mappings":";AAAA,IAAM,IAAK,EACT,cAAc;CACZ,OAAO;CACP,mBAAmB;CACnB,UAAU;CACV,WAAW;CACX,cAAc;CACd,iBAAiB;CACjB,cAAc;CACd,aAAa;CACb,WAAW;CACX,YAAY;CACZ,SAAS;CACT,iBAAiB;CACjB,aAAa;CACb,iBAAiB;CACjB,WAAW;CACX,mBAAmB;CACnB,aAAa;CACb,YAAY;CACZ,gBAAgB;CAChB,SAAS;CACT,QAAQ;CACR,aAAa;CACb,cAAc;CACd,cAAc;CACd,eAAe;CACf,YAAY;CACZ,YAAY;CACZ,aAAa;CACb,cAAc;CACd,aAAa;CACb,cAAc;CACd,cAAc;CACd,YAAY;CACZ,eAAe;CACf,eAAe;CACf,YAAY;CACZ,UAAU;CACV,UAAU;CACV,SAAS;CACT,oBAAoB;CACpB,aAAa;CACb,QAAQ;CACR,gBAAgB;CAChB,oBAAoB;CACpB,sBAAsB;CACtB,wBACE;CACF,cAAc;CACd,iBAAiB;CACjB,UAAU;CACV,UAAU;CACV,aAAa;CACb,aAAa;CACb,eAAe;CACf,sBAAsB;CACtB,QAAQ;CACR,WAAW;CACX,aAAa;CACb,aAAa;CACb,qBAAqB;CACrB,uBACE;CACF,yBACE;CACF,mBAAmB;CACnB,SAAS;CACT,WAAW;CACX,cAAc;CACd,QAAQ;CACR,iBAAiB;CACjB,UAAU;CACV,YAAY;CACZ,iBAAiB;CACjB,kBAAkB;CAClB,cAAc;CACd,cAAc;CACd,eAAe;CACf,gBAAgB;CAChB,YAAY;CACZ,cAAc;CACd,gBAAgB;AAClB,EACF"}
1
+ {"version":3,"file":"fr-CI7OJoql.js","names":[],"sources":["../../../../media-library/src/i18n/locales/fr.ts"],"sourcesContent":["const fr = {\n mediaLibrary: {\n title: \"Médiathèque\",\n searchPlaceholder: \"Rechercher des fichiers...\",\n allFiles: \"Tous les fichiers\",\n filterAll: \"Tous les types\",\n filterImages: \"Images\",\n filterDocuments: \"Documents\",\n filterVideos: \"Vidéos\",\n filterAudio: \"Audio\",\n newFolder: \"Nouveau dossier\",\n folderName: \"Nom du dossier\",\n noFiles: \"Aucun fichier trouvé\",\n noSearchResults: \"Aucun fichier ne correspond à votre recherche\",\n dropOrClick: \"Déposez des fichiers ici ou cliquez pour téléverser\",\n acceptedFormats: \"Images, PDF, vidéo, audio, documents (max 10 Mo)\",\n uploading: \"Téléversement...\",\n uploadingProgress: \"Téléversement de {current} sur {total}...\",\n selectImage: \"Sélectionner l'image\",\n selectFile: \"Sélectionner le fichier\",\n deleteSelected: \"Supprimer\",\n copyUrl: \"Copier l'URL\",\n copied: \"Copié !\",\n browseMedia: \"Parcourir la médiathèque\",\n renameFolder: \"Renommer le dossier\",\n addSubfolder: \"Ajouter un sous-dossier\",\n subfolderName: \"Nom du sous-dossier\",\n sortNewest: \"Plus récents d'abord\",\n sortOldest: \"Plus anciens d'abord\",\n sortNameAsc: \"Nom A-Z\",\n sortNameDesc: \"Nom Z-A\",\n sortSizeAsc: \"Plus petits d'abord\",\n sortSizeDesc: \"Plus grands d'abord\",\n moveSelected: \"Déplacer\",\n moveToRoot: \"Tous les fichiers\",\n currentFolder: \"(actuel)\",\n confirmDelete: \"Confirmer ?\",\n renameFile: \"Renommer\",\n editFile: \"Modifier le fichier\",\n fileName: \"Nom de fichier\",\n altText: \"Texte alternatif\",\n altTextPlaceholder: \"Décrivez cette image pour l'accessibilité\",\n saveChanges: \"Enregistrer\",\n cancel: \"Annuler\",\n frequentlyUsed: \"Fréquemment utilisés\",\n deleteWarningTitle: \"Supprimer le fichier\",\n deleteWarningMessage: \"Êtes-vous sûr ? Cette action est irréversible.\",\n deleteWarningUsageNote:\n \"Les fichiers suivants sont utilisés dans des modèles. Les supprimer peut casser ces modèles.\",\n deleteAnyway: \"Supprimer\",\n usedInTemplates: \"Utilisé dans {count} modèle(s)\",\n viewGrid: \"Vue en grille\",\n viewList: \"Vue en liste\",\n showFolders: \"Afficher les dossiers\",\n hideFolders: \"Masquer les dossiers\",\n importFromUrl: \"Importer depuis une URL\",\n importUrlPlaceholder: \"https://example.com/image.jpg\",\n import: \"Importer\",\n importing: \"Importation...\",\n importError: \"Échec de l'importation depuis l'URL\",\n replaceFile: \"Remplacer le fichier\",\n replaceWarningTitle: \"Remplacer le fichier\",\n replaceWarningMessage:\n \"Vous êtes sur le point de remplacer ce fichier. Le remplacement doit avoir la même extension ({extension}).\",\n replaceWarningUsageNote:\n \"Ce fichier est utilisé dans {count} modèle(s). Le remplacer mettra à jour toutes les références.\",\n replaceSelectFile: \"Sélectionner le fichier de remplacement\",\n replace: \"Remplacer\",\n replacing: \"Remplacement...\",\n replaceError: \"Échec du remplacement du fichier\",\n saving: \"Enregistrement...\",\n cropAspectRatio: \"Proportions\",\n cropFree: \"Libre\",\n cropSquare: \"1:1\",\n cropLandscape43: \"4:3\",\n cropLandscape169: \"16:9\",\n cropOriginal: \"Originales\",\n cropMaxWidth: \"Largeur max\",\n cropMaxHeight: \"Hauteur max\",\n cropOutputSize: \"Taille de sortie\",\n cropPixels: \"px\",\n cropOptional: \"(facultatif)\",\n close: \"Fermer\",\n searchAriaLabel: \"Rechercher des fichiers\",\n filterAriaLabel: \"Filtrer par type\",\n filesListAriaLabel: \"Fichiers\",\n loading: \"Chargement\",\n expandFolder: \"Développer le dossier\",\n collapseFolder: \"Réduire le dossier\",\n deleteFolder: \"Supprimer le dossier\",\n deleteFolderConfirm: \"Confirmer la suppression\",\n storageTooltip: \"{used} sur {total} utilisés ({remaining} restants)\",\n },\n};\n\nexport default fr;\n"],"mappings":";AAAA,IAAM,IAAK,EACT,cAAc;CACZ,OAAO;CACP,mBAAmB;CACnB,UAAU;CACV,WAAW;CACX,cAAc;CACd,iBAAiB;CACjB,cAAc;CACd,aAAa;CACb,WAAW;CACX,YAAY;CACZ,SAAS;CACT,iBAAiB;CACjB,aAAa;CACb,iBAAiB;CACjB,WAAW;CACX,mBAAmB;CACnB,aAAa;CACb,YAAY;CACZ,gBAAgB;CAChB,SAAS;CACT,QAAQ;CACR,aAAa;CACb,cAAc;CACd,cAAc;CACd,eAAe;CACf,YAAY;CACZ,YAAY;CACZ,aAAa;CACb,cAAc;CACd,aAAa;CACb,cAAc;CACd,cAAc;CACd,YAAY;CACZ,eAAe;CACf,eAAe;CACf,YAAY;CACZ,UAAU;CACV,UAAU;CACV,SAAS;CACT,oBAAoB;CACpB,aAAa;CACb,QAAQ;CACR,gBAAgB;CAChB,oBAAoB;CACpB,sBAAsB;CACtB,wBACE;CACF,cAAc;CACd,iBAAiB;CACjB,UAAU;CACV,UAAU;CACV,aAAa;CACb,aAAa;CACb,eAAe;CACf,sBAAsB;CACtB,QAAQ;CACR,WAAW;CACX,aAAa;CACb,aAAa;CACb,qBAAqB;CACrB,uBACE;CACF,yBACE;CACF,mBAAmB;CACnB,SAAS;CACT,WAAW;CACX,cAAc;CACd,QAAQ;CACR,iBAAiB;CACjB,UAAU;CACV,YAAY;CACZ,iBAAiB;CACjB,kBAAkB;CAClB,cAAc;CACd,cAAc;CACd,eAAe;CACf,gBAAgB;CAChB,YAAY;CACZ,cAAc;CACd,OAAO;CACP,iBAAiB;CACjB,iBAAiB;CACjB,oBAAoB;CACpB,SAAS;CACT,cAAc;CACd,gBAAgB;CAChB,cAAc;CACd,qBAAqB;CACrB,gBAAgB;AAClB,EACF"}