@templatical/editor 0.37.0 → 0.39.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (223) hide show
  1. package/dist/{AiChatSidebar-tu4eLcf_.js → AiChatSidebar-jVlXXND3.js} +66 -66
  2. package/dist/{AiFeatureMenu-BF0i0vA4.js → AiFeatureMenu-C1HCntyQ.js} +6 -6
  3. package/dist/{BlockIssueBadge-DT-FqKeC.js → BlockIssueBadge-JhNgcUmZ.js} +4 -4
  4. package/dist/{BlockPreviewCanvas-DDCmMram.js → BlockPreviewCanvas-C_rA5LJN.js} +2 -2
  5. package/dist/{CloudHeaderExtras-NPhudovT.js → CloudHeaderExtras-DvYyNsPB.js} +3 -3
  6. package/dist/{CloudPanels-Iwnky0iA.js → CloudPanels-CDPhPVdd.js} +5 -5
  7. package/dist/{CollaboratorBar-DAITu0hz.js → CollaboratorBar-Co9UPoB0.js} +3 -3
  8. package/dist/{ColorPicker-BqlZ_TqG.js → ColorPicker-BTtN94te.js} +6 -6
  9. package/dist/{CommentsPanel-CDvgmWP1.js → CommentsPanel-CRcVN9Ri.js} +1 -1
  10. package/dist/{CommentsSidebar-X_xqM3dR.js → CommentsSidebar-gDU977br.js} +12 -12
  11. package/dist/{CountdownBlock-ZFJIdbP6.js → CountdownBlock-CEzrfe5R.js} +1 -1
  12. package/dist/{CountdownToolbar-DBFoG3a6.js → CountdownToolbar-B00zhkNJ.js} +2 -2
  13. package/dist/{DesignReferenceSidebar--QtXjLrw.js → DesignReferenceSidebar-DedivZZl.js} +7 -7
  14. package/dist/{IssuesPanel-BLbNFMSX.js → IssuesPanel-C-PjdmAV.js} +7 -7
  15. package/dist/{MediaPanels-CMTAhDXB.js → MediaPanels-BpQNY8YX.js} +1 -1
  16. package/dist/{MergeTagInput-BEjzj4Iu.js → MergeTagInput-Cw1RoMly.js} +201 -149
  17. package/dist/{MergeTagModeToggle-DKN6ihI5.js → MergeTagModeToggle-DGuzSAdX.js} +35 -35
  18. package/dist/{MergeTagSuggestion-DKoLEeoj.js → MergeTagSuggestion-BXO3UIXW.js} +2 -2
  19. package/dist/{ParagraphEditor-1E9yzOfk.js → ParagraphEditor-jMKLLTa8.js} +38 -38
  20. package/dist/{RestoreVersionDialog-BMGUkcd8.js → RestoreVersionDialog-DG1jUdBM.js} +4 -4
  21. package/dist/{RichTextEditorContent-BnxbQUV9.js → RichTextEditorContent-JrNEg0kv.js} +8 -8
  22. package/dist/{SaveBlockDialog-WKASpCCT.js → SaveBlockDialog-C0KC-OKs.js} +8 -8
  23. package/dist/{SavedBlocksBrowserModal-AYEXTMtQ.js → SavedBlocksBrowserModal-zyOiRgWZ.js} +10 -10
  24. package/dist/{SavedBlocksPanels-D_CpacTl.js → SavedBlocksPanels-epMd799w.js} +1 -1
  25. package/dist/{SavedBlocksPickBar-BHMwg-1G.js → SavedBlocksPickBar-CJqqQ3jd.js} +3 -3
  26. package/dist/{TemplateScoringPanel-CSin43YM.js → TemplateScoringPanel-m2FOeaai.js} +103 -103
  27. package/dist/{TestEmailModal-BxizsRCd.js → TestEmailModal-D58kYkMV.js} +54 -54
  28. package/dist/{TestEmailPanel-vd2e5HzT.js → TestEmailPanel-BmFVBIQt.js} +1 -1
  29. package/dist/{TitleEditor-CLJ68Ty4.js → TitleEditor-C4BGPXnf.js} +13 -13
  30. package/dist/{TplModal-Q9fDgS1M.js → TplModal-BIDJw4Kj.js} +3 -3
  31. package/dist/{VersionHistoryMenu-eGYVhM4H.js → VersionHistoryMenu-dt_aZQfh.js} +7 -7
  32. package/dist/{VersionHistoryPanels-C7Ntrrfq.js → VersionHistoryPanels-B_5SBRrr.js} +1 -1
  33. package/dist/{VersionPreviewBanner-BbQXnR0M.js → VersionPreviewBanner-DttvOkwd.js} +2 -2
  34. package/dist/{blockTypeIcons-5qD4bB76.js → blockTypeIcons-CzTizYmK.js} +2 -2
  35. package/dist/bundle-stats.json +8 -8
  36. package/dist/{cdn/chunks/ca-D9S-UCfZ.js → ca-YlPDhElv.js} +5 -3
  37. package/dist/cdn/chunks/{AiChatSidebar-dyqqHAcI.js → AiChatSidebar-DeZl9Tk0.js} +54 -54
  38. package/dist/cdn/chunks/AiChatSidebar-DeZl9Tk0.js.map +1 -0
  39. package/dist/cdn/chunks/{AiFeatureMenu-BjVMwhW8.js → AiFeatureMenu-Bv8jMu9p.js} +5 -5
  40. package/dist/cdn/chunks/{AiFeatureMenu-BjVMwhW8.js.map → AiFeatureMenu-Bv8jMu9p.js.map} +1 -1
  41. package/dist/cdn/chunks/{BlockIssueBadge-BJ__oEtm.js → BlockIssueBadge-B6PpoOPv.js} +4 -4
  42. package/dist/cdn/chunks/{BlockIssueBadge-BJ__oEtm.js.map → BlockIssueBadge-B6PpoOPv.js.map} +1 -1
  43. package/dist/cdn/chunks/{BlockPreviewCanvas-B5f26eLE.js → BlockPreviewCanvas-DfEtDosD.js} +3 -3
  44. package/dist/cdn/chunks/{BlockPreviewCanvas-B5f26eLE.js.map → BlockPreviewCanvas-DfEtDosD.js.map} +1 -1
  45. package/dist/cdn/chunks/{CloudHeaderExtras-D5P5IEKA.js → CloudHeaderExtras-Hk98ub-C.js} +4 -4
  46. package/dist/cdn/chunks/{CloudHeaderExtras-D5P5IEKA.js.map → CloudHeaderExtras-Hk98ub-C.js.map} +1 -1
  47. package/dist/cdn/chunks/{CloudPanels-DkmR05nB.js → CloudPanels-Ba3GLmvF.js} +5 -5
  48. package/dist/cdn/chunks/{CloudPanels-DkmR05nB.js.map → CloudPanels-Ba3GLmvF.js.map} +1 -1
  49. package/dist/cdn/chunks/{CollaboratorBar-Yn7KSpt4.js → CollaboratorBar-D2dCQ9gg.js} +4 -4
  50. package/dist/cdn/chunks/{CollaboratorBar-Yn7KSpt4.js.map → CollaboratorBar-D2dCQ9gg.js.map} +1 -1
  51. package/dist/cdn/chunks/{ColorPicker-LcrzgMoW.js → ColorPicker-BaonTCAQ.js} +7 -7
  52. package/dist/cdn/chunks/{ColorPicker-LcrzgMoW.js.map → ColorPicker-BaonTCAQ.js.map} +1 -1
  53. package/dist/cdn/chunks/{CommentsPanel-CntwwocI.js → CommentsPanel-CV2HveQk.js} +2 -2
  54. package/dist/cdn/chunks/{CommentsPanel-CntwwocI.js.map → CommentsPanel-CV2HveQk.js.map} +1 -1
  55. package/dist/cdn/chunks/{CommentsSidebar-BLDKnKy7.js → CommentsSidebar-Dok_vaRc.js} +4 -4
  56. package/dist/cdn/chunks/{CommentsSidebar-BLDKnKy7.js.map → CommentsSidebar-Dok_vaRc.js.map} +1 -1
  57. package/dist/cdn/chunks/{CountdownBlock-B4AfqJwb.js → CountdownBlock-DGDl3ota.js} +2 -2
  58. package/dist/cdn/chunks/{CountdownBlock-B4AfqJwb.js.map → CountdownBlock-DGDl3ota.js.map} +1 -1
  59. package/dist/cdn/chunks/{CountdownToolbar-CA1dpuOI.js → CountdownToolbar-B9Rin64t.js} +3 -3
  60. package/dist/cdn/chunks/{CountdownToolbar-CA1dpuOI.js.map → CountdownToolbar-B9Rin64t.js.map} +1 -1
  61. package/dist/cdn/chunks/{DesignReferenceSidebar-D1Y9Hswe.js → DesignReferenceSidebar-eCuTFak2.js} +4 -4
  62. package/dist/cdn/chunks/{DesignReferenceSidebar-D1Y9Hswe.js.map → DesignReferenceSidebar-eCuTFak2.js.map} +1 -1
  63. package/dist/cdn/chunks/{IssuesPanel-Q62LTqvd.js → IssuesPanel-CP7FEzw7.js} +5 -5
  64. package/dist/cdn/chunks/{IssuesPanel-Q62LTqvd.js.map → IssuesPanel-CP7FEzw7.js.map} +1 -1
  65. package/dist/cdn/chunks/{MediaPanels-D21M6shx.js → MediaPanels-TYrKKHX5.js} +2 -2
  66. package/dist/cdn/chunks/{MediaPanels-D21M6shx.js.map → MediaPanels-TYrKKHX5.js.map} +1 -1
  67. package/dist/cdn/chunks/MergeTagInput-CSIThqkz.js +470 -0
  68. package/dist/cdn/chunks/MergeTagInput-CSIThqkz.js.map +1 -0
  69. package/dist/cdn/chunks/{MergeTagModeToggle-DYxkAGtA.js → MergeTagModeToggle-QGTUIWWo.js} +32 -32
  70. package/dist/cdn/chunks/{MergeTagModeToggle-DYxkAGtA.js.map → MergeTagModeToggle-QGTUIWWo.js.map} +1 -1
  71. package/dist/cdn/chunks/{MergeTagSuggestion-t8Uj00Er.js → MergeTagSuggestion-CY6WK8Eb.js} +3 -3
  72. package/dist/cdn/chunks/MergeTagSuggestion-CY6WK8Eb.js.map +1 -0
  73. package/dist/cdn/chunks/{ParagraphEditor-Bd-GQXee.js → ParagraphEditor-D1tsPv4v.js} +22 -22
  74. package/dist/cdn/chunks/{ParagraphEditor-Bd-GQXee.js.map → ParagraphEditor-D1tsPv4v.js.map} +1 -1
  75. package/dist/cdn/chunks/{RestoreVersionDialog-2X9RpM9A.js → RestoreVersionDialog-BeCxNPLS.js} +4 -4
  76. package/dist/cdn/chunks/{RestoreVersionDialog-2X9RpM9A.js.map → RestoreVersionDialog-BeCxNPLS.js.map} +1 -1
  77. package/dist/cdn/chunks/{RichTextEditorContent-D_rb0rmU.js → RichTextEditorContent-BBxzACFQ.js} +8 -8
  78. package/dist/cdn/chunks/{RichTextEditorContent-D_rb0rmU.js.map → RichTextEditorContent-BBxzACFQ.js.map} +1 -1
  79. package/dist/cdn/chunks/{SaveBlockDialog-CufdTomT.js → SaveBlockDialog-CLgh_g7H.js} +7 -7
  80. package/dist/cdn/chunks/{SaveBlockDialog-CufdTomT.js.map → SaveBlockDialog-CLgh_g7H.js.map} +1 -1
  81. package/dist/cdn/chunks/{SavedBlocksBrowserModal-CqpaNsk7.js → SavedBlocksBrowserModal-B4TcUJJe.js} +8 -8
  82. package/dist/cdn/chunks/{SavedBlocksBrowserModal-CqpaNsk7.js.map → SavedBlocksBrowserModal-B4TcUJJe.js.map} +1 -1
  83. package/dist/cdn/chunks/{SavedBlocksPanels-DpxYxddo.js → SavedBlocksPanels-CaBsHoRC.js} +2 -2
  84. package/dist/cdn/chunks/{SavedBlocksPanels-DpxYxddo.js.map → SavedBlocksPanels-CaBsHoRC.js.map} +1 -1
  85. package/dist/cdn/chunks/{SavedBlocksPickBar-Drpoav1B.js → SavedBlocksPickBar-iG35XCDx.js} +4 -4
  86. package/dist/cdn/chunks/{SavedBlocksPickBar-Drpoav1B.js.map → SavedBlocksPickBar-iG35XCDx.js.map} +1 -1
  87. package/dist/cdn/chunks/{TemplateScoringPanel-DBjUNULq.js → TemplateScoringPanel-DuQJBykq.js} +86 -86
  88. package/dist/cdn/chunks/TemplateScoringPanel-DuQJBykq.js.map +1 -0
  89. package/dist/cdn/chunks/{TestEmailModal-BTNlSW6f.js → TestEmailModal-D6Woss3r.js} +52 -52
  90. package/dist/cdn/chunks/TestEmailModal-D6Woss3r.js.map +1 -0
  91. package/dist/cdn/chunks/{TestEmailPanel-D0A9Zgxr.js → TestEmailPanel-CWQFB7J3.js} +2 -2
  92. package/dist/cdn/chunks/{TestEmailPanel-D0A9Zgxr.js.map → TestEmailPanel-CWQFB7J3.js.map} +1 -1
  93. package/dist/cdn/chunks/{TitleEditor-CrnuIq62.js → TitleEditor-CbY1tgSl.js} +12 -12
  94. package/dist/cdn/chunks/TitleEditor-CbY1tgSl.js.map +1 -0
  95. package/dist/cdn/chunks/{TplModal-DYXrTz42.js → TplModal-CGpp-d_r.js} +4 -4
  96. package/dist/cdn/chunks/{TplModal-DYXrTz42.js.map → TplModal-CGpp-d_r.js.map} +1 -1
  97. package/dist/cdn/chunks/{VersionHistoryMenu-bDGnE4hb.js → VersionHistoryMenu-ByVJXDbK.js} +4 -4
  98. package/dist/cdn/chunks/{VersionHistoryMenu-bDGnE4hb.js.map → VersionHistoryMenu-ByVJXDbK.js.map} +1 -1
  99. package/dist/cdn/chunks/{VersionHistoryPanels-82P0Q0HM.js → VersionHistoryPanels-CQJ5OggF.js} +2 -2
  100. package/dist/cdn/chunks/{VersionHistoryPanels-82P0Q0HM.js.map → VersionHistoryPanels-CQJ5OggF.js.map} +1 -1
  101. package/dist/cdn/chunks/{VersionPreviewBanner-BJiwKkVC.js → VersionPreviewBanner-G4lLbfr8.js} +3 -3
  102. package/dist/cdn/chunks/{VersionPreviewBanner-BJiwKkVC.js.map → VersionPreviewBanner-G4lLbfr8.js.map} +1 -1
  103. package/dist/cdn/chunks/{blockTypeIcons-CNjJSFun.js → blockTypeIcons-CQY-vxdM.js} +2 -2
  104. package/dist/cdn/chunks/{blockTypeIcons-CNjJSFun.js.map → blockTypeIcons-CQY-vxdM.js.map} +1 -1
  105. package/dist/{ca-D9S-UCfZ.js → cdn/chunks/ca-YlPDhElv.js} +7 -1
  106. package/dist/cdn/chunks/{ca-D9S-UCfZ.js.map → ca-YlPDhElv.js.map} +1 -1
  107. package/dist/cdn/chunks/cloud-BLgCKP7Z.js.map +1 -1
  108. package/dist/cdn/chunks/{createCloudRuntime-U-qCH-dq.js → createCloudRuntime-ClvtMBF1.js} +2 -2
  109. package/dist/cdn/chunks/{createCloudRuntime-U-qCH-dq.js.map → createCloudRuntime-ClvtMBF1.js.map} +1 -1
  110. package/dist/cdn/chunks/{de-BUPszLpi.js → de-CONjnzrF.js} +6 -2
  111. package/dist/cdn/chunks/{de-BUPszLpi.js.map → de-CONjnzrF.js.map} +1 -1
  112. package/dist/cdn/chunks/draggable-kbOhCgnk.js.map +1 -1
  113. package/dist/cdn/chunks/{editor-modal-MXgtarMl.js → editor-modal-B6IdQWlf.js} +3 -3
  114. package/dist/cdn/chunks/{editor-modal-MXgtarMl.js.map → editor-modal-B6IdQWlf.js.map} +1 -1
  115. package/dist/cdn/chunks/{en-BbOC5x3w.js → en-BAMooiOF.js} +6 -2
  116. package/dist/cdn/chunks/{en-BbOC5x3w.js.map → en-BAMooiOF.js.map} +1 -1
  117. package/dist/cdn/chunks/en-DjunooBz.js +2 -0
  118. package/dist/{es-0bCDcT9p.js → cdn/chunks/es-I47lHs2m.js} +7 -1
  119. package/dist/cdn/chunks/{es-0bCDcT9p.js.map → es-I47lHs2m.js.map} +1 -1
  120. package/dist/cdn/chunks/{extensions-B8_jnIkD.js → extensions-D2YIhF7u.js} +126 -101
  121. package/dist/cdn/chunks/extensions-D2YIhF7u.js.map +1 -0
  122. package/dist/cdn/chunks/{fr-Brr8mJ9e.js → fr-B8MIKjT4.js} +6 -2
  123. package/dist/cdn/chunks/{fr-Brr8mJ9e.js.map → fr-B8MIKjT4.js.map} +1 -1
  124. package/dist/cdn/chunks/htmlparser-ClUZ6waR.js +1113 -0
  125. package/dist/cdn/chunks/htmlparser-ClUZ6waR.js.map +1 -0
  126. package/dist/cdn/chunks/{icons-BUlqGSgd.js → icons-DdrAicM2.js} +33 -33
  127. package/dist/cdn/chunks/{icons-BUlqGSgd.js.map → icons-DdrAicM2.js.map} +1 -1
  128. package/dist/cdn/chunks/keys-DXYJTLZF.js +12 -0
  129. package/dist/cdn/chunks/keys-DXYJTLZF.js.map +1 -0
  130. package/dist/{nl-Co3_RL0M.js → cdn/chunks/nl-CBLxcb-0.js} +7 -1
  131. package/dist/cdn/chunks/{nl-Co3_RL0M.js.map → nl-CBLxcb-0.js.map} +1 -1
  132. package/dist/{pt-BR-BECez5b0.js → cdn/chunks/pt-BR-CMSRfX7t.js} +7 -1
  133. package/dist/cdn/chunks/{pt-BR-BECez5b0.js.map → pt-BR-CMSRfX7t.js.map} +1 -1
  134. package/dist/cdn/chunks/{src-CUvZWL6Y.js → src-CaNsA_WX.js} +2 -2
  135. package/dist/cdn/chunks/{src-CUvZWL6Y.js.map → src-CaNsA_WX.js.map} +1 -1
  136. package/dist/cdn/chunks/src-Dwgq7hf4.js.map +1 -1
  137. package/dist/cdn/chunks/{src-Ozknnj-v.js → src-fn7uy1FD.js} +3 -3
  138. package/dist/cdn/chunks/{src-Ozknnj-v.js.map → src-fn7uy1FD.js.map} +1 -1
  139. package/dist/cdn/chunks/{useCloudI18n-DSWSGj-A.js → useCloudI18n-OezCj0cx.js} +2 -2
  140. package/dist/cdn/chunks/{useCloudI18n-DSWSGj-A.js.map → useCloudI18n-OezCj0cx.js.map} +1 -1
  141. package/dist/cdn/chunks/{useEditorCore-Cs7rYVBo.js → useEditorCore-06PtcUi1.js} +482 -473
  142. package/dist/cdn/chunks/useEditorCore-06PtcUi1.js.map +1 -0
  143. package/dist/cdn/chunks/{useEditorRoot-B0zW2nT4.js → useEditorRoot-ByHPMqYT.js} +2 -2
  144. package/dist/cdn/chunks/{useEditorRoot-B0zW2nT4.js.map → useEditorRoot-ByHPMqYT.js.map} +1 -1
  145. package/dist/cdn/chunks/{useI18n-Dlo7R9RA.js → useI18n-BhE7ndNr.js} +2 -2
  146. package/dist/cdn/chunks/{useI18n-Dlo7R9RA.js.map → useI18n-BhE7ndNr.js.map} +1 -1
  147. package/dist/cdn/chunks/useMergeTag-DE2mpy1w.js +60 -0
  148. package/dist/cdn/chunks/useMergeTag-DE2mpy1w.js.map +1 -0
  149. package/dist/cdn/chunks/{usePopoverPosition-ElP3ABaV.js → usePopoverPosition-BPL891uG.js} +2 -2
  150. package/dist/cdn/chunks/{usePopoverPosition-ElP3ABaV.js.map → usePopoverPosition-BPL891uG.js.map} +1 -1
  151. package/dist/cdn/chunks/{useScrollToBlock-nTbWkgaU.js → useScrollToBlock-DwF4pVur.js} +2 -2
  152. package/dist/cdn/chunks/{useScrollToBlock-nTbWkgaU.js.map → useScrollToBlock-DwF4pVur.js.map} +1 -1
  153. package/dist/cdn/editor.css +1 -1
  154. package/dist/cdn/editor.js +894 -857
  155. package/dist/cdn/editor.js.map +1 -1
  156. package/dist/{check-DWtkBzBU.js → check-9xX6RVHz.js} +1 -1
  157. package/dist/{chevron-down-C-Fjxcqj.js → chevron-down-J5hFJ6TL.js} +1 -1
  158. package/dist/{chevron-right-SOkn2d4P.js → chevron-right-BJuo5PQ-.js} +1 -1
  159. package/dist/{chevron-up-lntU1ypp.js → chevron-up-Qfi5k52_.js} +1 -1
  160. package/dist/{circle-alert-CjzUTwy3.js → circle-alert-BiArYmkB.js} +1 -1
  161. package/dist/{clock-pB2QKPsJ.js → clock-BkYJZ7Y0.js} +1 -1
  162. package/dist/{copy-CId1E038.js → copy-BRLUNHwF.js} +1 -1
  163. package/dist/{createCloudRuntime-x5WZm3p8.js → createCloudRuntime-CNFXaTNQ.js} +1 -1
  164. package/dist/{createLucideIcon-Cwf_nTzE.js → createLucideIcon-CDDkF1Tm.js} +5 -5
  165. package/dist/{de-BUPszLpi.js → de-CONjnzrF.js} +5 -1
  166. package/dist/{editor-modal-B_LaQf0s.js → editor-modal-uAEB6xKz.js} +15 -15
  167. package/dist/{en-BbOC5x3w.js → en-BAMooiOF.js} +5 -1
  168. package/dist/en-CQWkDCpm.js +2 -0
  169. package/dist/{cdn/chunks/es-0bCDcT9p.js → es-I47lHs2m.js} +5 -3
  170. package/dist/{extensions-CHOBZRab.js → extensions-CcGj7OfS.js} +129 -104
  171. package/dist/{eye-BuGtFUoJ.js → eye-DwhBOaV8.js} +1 -1
  172. package/dist/{fr-Brr8mJ9e.js → fr-B8MIKjT4.js} +5 -1
  173. package/dist/{image-up-gH4JEpU5.js → image-up-CiyQNZBt.js} +1 -1
  174. package/dist/index.d.ts +15 -0
  175. package/dist/{info-BQ60P82u.js → info-D6A1qEiF.js} +1 -1
  176. package/dist/keys-DD1rl72F.js +10 -0
  177. package/dist/{link-3R8it3J7.js → link-tKGmYWsB.js} +1 -1
  178. package/dist/{list-Ccdgj46T.js → list-DjZQRpeI.js} +1 -1
  179. package/dist/{loader-circle-B_tAD4k6.js → loader-circle-D9ZL3Sv0.js} +1 -1
  180. package/dist/{message-circle-P-KSc6V0.js → message-circle-KTHxCcpB.js} +1 -1
  181. package/dist/{cdn/chunks/nl-Co3_RL0M.js → nl-CBLxcb-0.js} +5 -3
  182. package/dist/{pencil-9ZiwqS4r.js → pencil-Bq-nbQ7F.js} +1 -1
  183. package/dist/{plus-BwJEzCaO.js → plus-CRMnR4IG.js} +1 -1
  184. package/dist/{cdn/chunks/pt-BR-BECez5b0.js → pt-BR-CMSRfX7t.js} +5 -3
  185. package/dist/{refresh-cw-DEgfb2FK.js → refresh-cw-D7bYS5tm.js} +1 -1
  186. package/dist/{search-DqQ8Li5E.js → search-DUo0YwPz.js} +1 -1
  187. package/dist/{send-CE6uvqop.js → send-DaVMQphu.js} +1 -1
  188. package/dist/{shield-check-DhD1Z3rd.js → shield-check-DxaaurL9.js} +1 -1
  189. package/dist/{sparkles-R0ZQHa6F.js → sparkles-D6T6k30e.js} +1 -1
  190. package/dist/style.css +1 -1
  191. package/dist/templatical-editor.js +1156 -1119
  192. package/dist/{text-align-start-DSux2UNn.js → text-align-start-vreFpmCX.js} +1 -1
  193. package/dist/{trash-Cf_SqsER.js → trash-DBv8MGY6.js} +1 -1
  194. package/dist/{triangle-alert-C6tGa6jw.js → triangle-alert-CmNS2LLv.js} +1 -1
  195. package/dist/{upload-DusKjpVr.js → upload-DDB9Fs0P.js} +1 -1
  196. package/dist/{useCloudI18n-BLyh_e2T.js → useCloudI18n-C1wuXik6.js} +1 -1
  197. package/dist/{useEditorCore-DhlKOYwe.js → useEditorCore-jfwgLThK.js} +1077 -1068
  198. package/dist/{useEditorRoot-ds57-l6F.js → useEditorRoot-eVv4doqZ.js} +1 -1
  199. package/dist/{useI18n-BbdxxpOE.js → useI18n-VOtdfENx.js} +1 -1
  200. package/dist/useMergeTag-CQM9pFca.js +58 -0
  201. package/dist/{usePopoverPosition-CprM5p-c.js → usePopoverPosition-gZjRywai.js} +1 -1
  202. package/dist/{useScrollToBlock-BTFw0b9O.js → useScrollToBlock-C0Ehnyl4.js} +2 -2
  203. package/dist/{x-D_-42Ukq.js → x-B7sgO_z8.js} +1 -1
  204. package/package.json +10 -10
  205. package/dist/cdn/chunks/AiChatSidebar-dyqqHAcI.js.map +0 -1
  206. package/dist/cdn/chunks/MergeTagInput-l7paaAml.js +0 -419
  207. package/dist/cdn/chunks/MergeTagInput-l7paaAml.js.map +0 -1
  208. package/dist/cdn/chunks/MergeTagSuggestion-t8Uj00Er.js.map +0 -1
  209. package/dist/cdn/chunks/TemplateScoringPanel-DBjUNULq.js.map +0 -1
  210. package/dist/cdn/chunks/TestEmailModal-BTNlSW6f.js.map +0 -1
  211. package/dist/cdn/chunks/TitleEditor-CrnuIq62.js.map +0 -1
  212. package/dist/cdn/chunks/en-C9U7N77n.js +0 -2
  213. package/dist/cdn/chunks/extensions-B8_jnIkD.js.map +0 -1
  214. package/dist/cdn/chunks/htmlparser-DTML8Gvz.js +0 -1007
  215. package/dist/cdn/chunks/htmlparser-DTML8Gvz.js.map +0 -1
  216. package/dist/cdn/chunks/keys-DBFhDFng.js +0 -12
  217. package/dist/cdn/chunks/keys-DBFhDFng.js.map +0 -1
  218. package/dist/cdn/chunks/useEditorCore-Cs7rYVBo.js.map +0 -1
  219. package/dist/cdn/chunks/useMergeTag-BYAifvh8.js +0 -46
  220. package/dist/cdn/chunks/useMergeTag-BYAifvh8.js.map +0 -1
  221. package/dist/en-DcmpWV53.js +0 -2
  222. package/dist/keys-DQA2i1k1.js +0 -10
  223. package/dist/useMergeTag-DlvOBW_B.js +0 -44
@@ -1,5 +1,5 @@
1
1
  import { S as e } from "./vue.runtime.esm-bundler-DShF3P6k.js";
2
- import { _ as t } from "./keys-DQA2i1k1.js";
2
+ import { _ as t } from "./keys-DD1rl72F.js";
3
3
  //#region src/composables/useEditorRoot.ts
4
4
  function n() {
5
5
  return e(t, document) ?? document;
@@ -1,5 +1,5 @@
1
1
  import { K as e, S as t } from "./vue.runtime.esm-bundler-DShF3P6k.js";
2
- import { G as n } from "./keys-DQA2i1k1.js";
2
+ import { q as n } from "./keys-DD1rl72F.js";
3
3
  //#region src/composables/useI18n.ts
4
4
  function r(r) {
5
5
  let i = r ?? t(n, null);
@@ -0,0 +1,58 @@
1
+ import { S as e, Z as t, s as n } from "./vue.runtime.esm-bundler-DShF3P6k.js";
2
+ import { I as r, k as i, o as a } from "./dist-tGkjkX-v.js";
3
+ import { A as o, D as s, L as c, M as l, N as u, O as d, P as f, k as p, q as m } from "./keys-DD1rl72F.js";
4
+ //#region src/composables/useMergeTag.ts
5
+ function h() {
6
+ let h = e(s, f), g = e(u, a.liquid), _ = e(c, null), v = e(d, !0), y = e(p, null), b = e(l, !0), x = e(m, null)?.mergeTag.unknownLabel ?? "Merge tag", S = e(o, null) ?? t(!1);
7
+ function C(e) {
8
+ return r(e, g);
9
+ }
10
+ function w(e) {
11
+ return i(e, h.value);
12
+ }
13
+ function T(e) {
14
+ return h.value.find((t) => t.value === e);
15
+ }
16
+ function E(e) {
17
+ return !!_ || T(e) !== void 0;
18
+ }
19
+ function D(e, t) {
20
+ let n = T(e);
21
+ return n ? n.label : t?.trim() ? t.trim() : b ? e : x;
22
+ }
23
+ async function O(e) {
24
+ if (_) {
25
+ S.value = !0;
26
+ try {
27
+ return await _(e);
28
+ } finally {
29
+ S.value = !1;
30
+ }
31
+ }
32
+ if (h.value.length > 0 && y) {
33
+ S.value = !0;
34
+ try {
35
+ return await y.open(h.value, { current: e?.current });
36
+ } finally {
37
+ S.value = !1;
38
+ }
39
+ }
40
+ return null;
41
+ }
42
+ return {
43
+ mergeTags: h,
44
+ isRequesting: S,
45
+ canRequestMergeTag: n(() => !!_ || h.value.length > 0),
46
+ autocomplete: v,
47
+ syntax: g,
48
+ isMergeTagValue: C,
49
+ getMergeTagLabel: w,
50
+ findMergeTag: T,
51
+ canRepickMergeTag: E,
52
+ getMergeTagDisplayLabel: D,
53
+ showRawValue: b,
54
+ requestMergeTag: O
55
+ };
56
+ }
57
+ //#endregion
58
+ export { h as t };
@@ -1,5 +1,5 @@
1
1
  import { S as e, Z as t } from "./vue.runtime.esm-bundler-DShF3P6k.js";
2
- import { L as n } from "./keys-DQA2i1k1.js";
2
+ import { z as n } from "./keys-DD1rl72F.js";
3
3
  //#region src/utils/resolveColorsConfig.ts
4
4
  var r = {
5
5
  presets: [],
@@ -1,6 +1,6 @@
1
1
  import { E as e } from "./vue.runtime.esm-bundler-DShF3P6k.js";
2
- import { t } from "./createLucideIcon-Cwf_nTzE.js";
3
- import { t as n } from "./useEditorRoot-ds57-l6F.js";
2
+ import { t } from "./createLucideIcon-CDDkF1Tm.js";
3
+ import { t as n } from "./useEditorRoot-eVv4doqZ.js";
4
4
  var r = t({
5
5
  name: "list-checks",
6
6
  size: 24,
@@ -1,4 +1,4 @@
1
- import { t as e } from "./createLucideIcon-Cwf_nTzE.js";
1
+ import { t as e } from "./createLucideIcon-CDDkF1Tm.js";
2
2
  var t = e({
3
3
  name: "x",
4
4
  size: 24,
package/package.json CHANGED
@@ -1,14 +1,14 @@
1
1
  {
2
2
  "name": "@templatical/editor",
3
3
  "description": "Vue 3 visual drag-and-drop email editor powered by Templatical",
4
- "version": "0.37.0",
4
+ "version": "0.39.0",
5
5
  "bugs": "https://github.com/templatical/sdk/issues",
6
6
  "devDependencies": {
7
- "@lucide/vue": "^1.43.0",
8
- "@templatical/core": "0.37.0",
9
- "@templatical/media-library": "0.37.0",
10
- "@templatical/quality": "0.37.0",
11
- "@templatical/types": "0.37.0",
7
+ "@lucide/vue": "^1.45.0",
8
+ "@templatical/core": "0.39.0",
9
+ "@templatical/media-library": "0.39.0",
10
+ "@templatical/quality": "0.39.0",
11
+ "@templatical/types": "0.39.0",
12
12
  "@tiptap/core": "^3.31.3",
13
13
  "@tiptap/extension-color": "^3.31.3",
14
14
  "@tiptap/extension-font-family": "^3.31.3",
@@ -26,13 +26,13 @@
26
26
  "@vue/test-utils": "^2.5.0",
27
27
  "@vueuse/core": "^14.4.0",
28
28
  "es-module-lexer": "^3.0.2",
29
- "happy-dom": "^20.14.0",
29
+ "happy-dom": "^20.14.5",
30
30
  "jsdom": "30.0.1",
31
31
  "liquidjs": "^10.29.0",
32
32
  "tailwindcss": "^4.3.3",
33
33
  "typescript": "^6.0.3",
34
34
  "vanilla-colorful": "^0.7.2",
35
- "vite": "^8.2.2",
35
+ "vite": "^8.3.0",
36
36
  "vitest": "^5.0.0",
37
37
  "vue": "^3.5.42",
38
38
  "vue-draggable-plus": "^0.6.1",
@@ -64,8 +64,8 @@
64
64
  "license": "FSL-1.1-MIT",
65
65
  "module": "./dist/templatical-editor.js",
66
66
  "peerDependencies": {
67
- "@templatical/quality": "0.37.0",
68
- "@templatical/renderer": "0.37.0"
67
+ "@templatical/quality": "0.39.0",
68
+ "@templatical/renderer": "0.39.0"
69
69
  },
70
70
  "peerDependenciesMeta": {
71
71
  "@templatical/renderer": {
@@ -1 +0,0 @@
1
- {"version":3,"file":"AiChatSidebar-dyqqHAcI.js","names":[],"sources":["../../../src/cloud/components/AiChatSidebar.vue","../../../src/cloud/components/AiChatSidebar.vue"],"sourcesContent":["<script setup lang=\"ts\">\nimport LoadingTrack from \"../../components/LoadingTrack.vue\";\nimport { useAiChat } from \"@templatical/core/cloud\";\nimport {\n CLOUD_TRANSLATIONS_KEY,\n EDITOR_KEY,\n AUTH_MANAGER_KEY,\n MERGE_TAGS_KEY,\n requireInject,\n} from \"../../keys\";\nimport { useAliveFlag } from \"../../composables/useAliveFlag\";\nimport type { TemplateContent } from \"@templatical/types\";\nimport {\n CircleAlert,\n LoaderCircle,\n Redo2,\n Send,\n Sparkles,\n Trash2,\n Undo2,\n X,\n} from \"@lucide/vue\";\nimport { inject, nextTick, ref, watch } from \"vue\";\nimport { useIntervalFn, useTimeoutFn } from \"@vueuse/core\";\n\nconst props = defineProps<{\n visible: boolean;\n onApply?: (content: TemplateContent) => void;\n}>();\n\nconst emit = defineEmits<{\n (e: \"close\"): void;\n}>();\n\nconst cloudTranslations = requireInject(\n CLOUD_TRANSLATIONS_KEY,\n \"AiChatSidebar\",\n);\nconst editor = requireInject(EDITOR_KEY, \"AiChatSidebar\");\nconst authManager = requireInject(AUTH_MANAGER_KEY, \"AiChatSidebar\");\nconst mergeTags = inject(MERGE_TAGS_KEY, []);\nconst aliveFlag = useAliveFlag();\n\nconst aiChat = useAiChat({\n authManager,\n getTemplateId: () => editor.state.template?.id ?? null,\n onApply: props.onApply,\n onError: undefined,\n});\n\nconst promptInput = ref(\"\");\nconst messagesContainer = ref<HTMLElement | null>(null);\nconst historyLoaded = ref(false);\nconst visibleSuggestionCount = ref(0);\n\nconst { pause: pauseReveal, resume: resumeReveal } = useIntervalFn(\n () => {\n const count = aiChat.suggestions.value?.length ?? 0;\n if (visibleSuggestionCount.value < count) {\n visibleSuggestionCount.value++;\n } else {\n pauseReveal();\n }\n },\n 150,\n { immediate: false },\n);\n\nconst { start: startRevealTimeout } = useTimeoutFn(() => resumeReveal(), 100, {\n immediate: false,\n});\n\nwatch(\n () => aiChat.suggestions.value?.length ?? 0,\n (count) => {\n pauseReveal();\n if (count === 0) {\n visibleSuggestionCount.value = 0;\n return;\n }\n\n visibleSuggestionCount.value = 0;\n startRevealTimeout();\n },\n);\n\nfunction scrollToBottom(): void {\n nextTick(() => {\n if (messagesContainer.value) {\n messagesContainer.value.scrollTop = messagesContainer.value.scrollHeight;\n }\n });\n}\n\nwatch(\n () => aiChat.messages.value?.length ?? 0,\n () => scrollToBottom(),\n);\n\nwatch(\n () => props.visible,\n async (isVisible) => {\n if (isVisible && !historyLoaded.value) {\n historyLoaded.value = true;\n await aiChat.loadConversation();\n if (!aliveFlag.alive) return;\n\n if (\n (aiChat.messages.value?.length ?? 0) === 0 &&\n editor.content.value.blocks.length === 0\n ) {\n aiChat.loadSuggestions(editor.content.value, mergeTags);\n }\n }\n },\n);\n\nasync function handleSend(): Promise<void> {\n const prompt = promptInput.value.trim();\n if (!prompt || aiChat.isGenerating.value) {\n return;\n }\n\n promptInput.value = \"\";\n aiChat.error.value = null;\n aiChat.failedPrompt.value = null;\n scrollToBottom();\n\n await aiChat.sendPrompt(prompt, editor.content.value, mergeTags);\n if (!aliveFlag.alive) return;\n\n if (aiChat.failedPrompt.value) {\n promptInput.value = aiChat.failedPrompt.value;\n }\n\n scrollToBottom();\n}\n\nfunction stripJsonBlock(text: string): string {\n return text\n .replace(/```json[\\s\\S]*?```/g, \"\")\n .replace(/```json[\\s\\S]*/g, \"\")\n .trim();\n}\n\nfunction handleSuggestionClick(suggestion: string): void {\n pauseReveal();\n promptInput.value = suggestion;\n handleSend();\n}\n\nfunction handleKeydown(event: KeyboardEvent): void {\n if (event.key === \"Enter\" && !event.shiftKey) {\n event.preventDefault();\n handleSend();\n }\n}\n</script>\n\n<template>\n <Transition\n enter-active-class=\"tpl-ai-slide-enter-active\"\n enter-from-class=\"tpl:translate-x-full\"\n enter-to-class=\"tpl:translate-x-0\"\n leave-active-class=\"tpl-ai-slide-leave-active\"\n leave-from-class=\"tpl:translate-x-0\"\n leave-to-class=\"tpl:translate-x-full\"\n >\n <div\n v-if=\"visible\"\n class=\"tpl-ai-sidebar tpl:absolute tpl:top-14 tpl:right-0 tpl:bottom-0 tpl:flex tpl:w-[360px] tpl:flex-col tpl:border-l tpl:border-[var(--tpl-border)] tpl:bg-[var(--tpl-bg-elevated)]\"\n >\n <!-- Header -->\n <div\n class=\"tpl:flex tpl:items-center tpl:justify-between tpl:border-b tpl:border-[var(--tpl-border)] tpl:px-4 tpl:py-3\"\n >\n <div\n class=\"tpl:flex tpl:items-center tpl:gap-1.5 tpl:text-sm tpl:font-medium tpl:text-[var(--tpl-primary)]\"\n >\n <Sparkles :size=\"13\" :stroke-width=\"2\" />\n <span>\n {{ cloudTranslations.aiChat.title }}\n </span>\n </div>\n <div class=\"tpl:flex tpl:items-center tpl:gap-1\">\n <button\n v-if=\"(aiChat.messages.value?.length ?? 0) > 0\"\n class=\"tpl:rounded-md tpl:p-0.5 tpl:transition-colors tpl:text-[var(--tpl-text-muted)]\"\n :title=\"cloudTranslations.aiChat.clear\"\n @click=\"aiChat.clearChat()\"\n >\n <Trash2 :size=\"14\" :stroke-width=\"2\" />\n </button>\n <button\n class=\"tpl:rounded-md tpl:p-0.5 tpl:transition-colors tpl:text-[var(--tpl-text-muted)]\"\n @click=\"emit('close')\"\n >\n <X :size=\"14\" :stroke-width=\"2\" />\n </button>\n </div>\n </div>\n\n <!-- Messages wrapper -->\n <div class=\"tpl:relative tpl:flex tpl:min-h-0 tpl:flex-1 tpl:flex-col\">\n <!-- Messages -->\n <div\n ref=\"messagesContainer\"\n class=\"tpl:flex-1 tpl:overflow-y-auto tpl:p-4\"\n >\n <!-- Loading history state -->\n <div\n v-if=\"aiChat.isLoadingHistory.value\"\n class=\"tpl:flex tpl:h-full tpl:flex-col tpl:items-center tpl:justify-center tpl:gap-3 tpl:text-center\"\n >\n <LoaderCircle\n class=\"tpl-spinner tpl:text-[var(--tpl-text-muted)]\"\n :size=\"24\"\n :stroke-width=\"2\"\n />\n <p class=\"tpl:text-sm tpl:text-[var(--tpl-text-muted)]\">\n {{ cloudTranslations.aiChat.loadingHistory }}\n </p>\n </div>\n\n <!-- Empty state -->\n <div\n v-else-if=\"(aiChat.messages.value?.length ?? 0) === 0\"\n class=\"tpl:flex tpl:h-full tpl:flex-col tpl:items-center tpl:justify-center tpl:gap-3 tpl:text-center\"\n >\n <Sparkles\n :size=\"32\"\n :stroke-width=\"1.5\"\n class=\"tpl:text-[var(--tpl-text-dim)]\"\n />\n <p\n class=\"tpl:max-w-[240px] tpl:text-sm tpl:text-[var(--tpl-text-muted)]\"\n >\n {{ cloudTranslations.aiChat.placeholder }}\n </p>\n </div>\n\n <!-- Message list -->\n <div v-else class=\"tpl:flex tpl:flex-col tpl:gap-4\">\n <div\n v-for=\"(message, index) in aiChat.messages.value\"\n :key=\"message.id\"\n class=\"tpl:flex tpl:flex-col tpl:gap-2\"\n >\n <!-- User message -->\n <div\n v-if=\"message.role === 'user'\"\n class=\"tpl:self-end tpl:rounded-[var(--tpl-radius-sm)] tpl:px-3.5 tpl:py-2.5 tpl:text-sm\"\n style=\"\n background-color: var(--tpl-primary-light);\n color: var(--tpl-text);\n max-width: 85%;\n box-shadow: var(--tpl-shadow);\n \"\n >\n {{ message.content }}\n </div>\n\n <!-- Assistant message -->\n <div v-else class=\"tpl:flex tpl:flex-col tpl:gap-2\">\n <LoadingTrack\n v-if=\"\n !stripJsonBlock(message.content) &&\n aiChat.isGenerating.value &&\n index === (aiChat.messages.value?.length ?? 0) - 1\n \"\n />\n <div\n v-else\n class=\"tpl:rounded-[var(--tpl-radius-sm)] tpl:px-3.5 tpl:py-2.5 tpl:text-sm tpl:whitespace-pre-wrap\"\n style=\"\n max-width: 85%;\n background-color: var(--tpl-bg);\n color: var(--tpl-text);\n box-shadow: var(--tpl-shadow);\n \"\n >\n {{\n stripJsonBlock(message.content) ||\n cloudTranslations.aiChat.applied\n }}\n </div>\n <button\n v-if=\"\n message.id === aiChat.lastApplyMessageId.value &&\n !aiChat.isGenerating.value\n \"\n class=\"tpl:inline-flex tpl:items-center tpl:gap-1.5 tpl:self-start tpl:rounded-md tpl:border tpl:px-2.5 tpl:py-1.5 tpl:text-xs tpl:font-medium tpl:transition-all\"\n style=\"\n border-color: var(--tpl-border);\n color: var(--tpl-text-muted);\n background-color: transparent;\n \"\n @click=\"aiChat.toggleLastRevert()\"\n >\n <template v-if=\"aiChat.isLastChangeReverted.value\">\n <Redo2 :size=\"12\" :stroke-width=\"2\" />\n {{ cloudTranslations.aiChat.reapply }}\n </template>\n <template v-else>\n <Undo2 :size=\"12\" :stroke-width=\"2\" />\n {{ cloudTranslations.aiChat.revert }}\n </template>\n </button>\n </div>\n </div>\n </div>\n </div>\n\n <!-- Error message -->\n <div\n v-if=\"aiChat.error.value\"\n class=\"tpl:mx-3 tpl:mb-2 tpl:flex tpl:items-start tpl:gap-2 tpl:rounded-lg tpl:px-3 tpl:py-2 tpl:text-xs\"\n style=\"\n background-color: var(--tpl-danger-light);\n color: var(--tpl-danger);\n \"\n >\n <CircleAlert\n :size=\"14\"\n :stroke-width=\"2\"\n class=\"tpl:mt-0.5 tpl:shrink-0\"\n />\n <span>{{\n aiChat.error.value === \"ai_apply_failed\"\n ? cloudTranslations.aiChat.applyFailed\n : cloudTranslations.aiChat.error\n }}</span>\n </div>\n\n <!-- Suggestions (overlay) -->\n <div\n v-if=\"(aiChat.suggestions.value?.length ?? 0) > 0\"\n class=\"tpl:absolute tpl:right-0 tpl:bottom-0 tpl:left-0 tpl:z-10 tpl:px-3 tpl:pb-3\"\n style=\"\n background-color: color-mix(\n in srgb,\n var(--tpl-bg) 50%,\n transparent\n );\n backdrop-filter: blur(2px);\n \"\n >\n <div class=\"tpl:flex tpl:flex-col tpl:gap-1.5\">\n <button\n v-for=\"(suggestion, index) in aiChat.suggestions.value ?? []\"\n :key=\"index\"\n class=\"tpl-suggestion-btn tpl:cursor-pointer tpl:rounded-[var(--tpl-radius-sm)] tpl:border tpl:px-3 tpl:py-2 tpl:text-left tpl:text-xs tpl:leading-snug tpl:transition-all tpl:duration-300 tpl:ease-out\"\n :class=\"\n (aiChat.suggestions.value?.length ?? 0) - 1 - index <\n visibleSuggestionCount\n ? 'tpl:translate-y-0 tpl:opacity-100'\n : 'tpl:pointer-events-none tpl:-translate-y-2 tpl:opacity-0'\n \"\n style=\"\n border-color: var(--tpl-border);\n color: var(--tpl-primary);\n background-color: var(--tpl-bg);\n box-shadow: var(--tpl-shadow);\n \"\n @click=\"handleSuggestionClick(suggestion)\"\n >\n {{ suggestion }}\n </button>\n </div>\n </div>\n </div>\n\n <!-- Input area -->\n <div class=\"tpl:border-t tpl:p-3 tpl:border-[var(--tpl-border)]\">\n <div\n class=\"tpl-ai-input-wrapper tpl-focus-ring-host tpl:flex tpl:items-end tpl:gap-2 tpl:rounded-[var(--tpl-radius)] tpl:border tpl:px-3 tpl:py-2 tpl:border-[var(--tpl-border)] tpl:bg-[var(--tpl-bg)]\"\n >\n <textarea\n v-model=\"promptInput\"\n class=\"tpl:max-h-32 tpl:min-h-[64px] tpl:flex-1 tpl:resize-none tpl:border-none tpl:bg-transparent tpl:font-sans tpl:text-sm tpl:outline-none tpl:text-[var(--tpl-text)]\"\n :placeholder=\"cloudTranslations.aiChat.inputPlaceholder\"\n :disabled=\"aiChat.isGenerating.value\"\n rows=\"3\"\n @keydown=\"handleKeydown\"\n />\n <button\n class=\"tpl-ai-send-btn tpl:flex tpl:shrink-0 tpl:items-center tpl:justify-center tpl:rounded-md tpl:p-1.5 tpl:transition-all tpl:disabled:opacity-40 tpl:text-[var(--tpl-primary)]\"\n :disabled=\"!promptInput.trim() || aiChat.isGenerating.value\"\n @click=\"handleSend\"\n >\n <Send :size=\"16\" :stroke-width=\"2\" />\n </button>\n </div>\n\n <!-- AI disclaimer -->\n <p\n class=\"tpl:m-0 tpl:px-1 tpl:pt-2 tpl:text-center tpl:text-[11px] tpl:text-[var(--tpl-text-dim)]\"\n >\n {{ cloudTranslations.aiMenu.disclaimer }}\n </p>\n </div>\n </div>\n </Transition>\n</template>\n\n<style scoped>\n.tpl-ai-slide-enter-active {\n transition: transform 280ms cubic-bezier(0.16, 1, 0.3, 1);\n}\n\n.tpl-ai-slide-leave-active {\n transition: transform 200ms cubic-bezier(0.16, 1, 0.3, 1);\n}\n\n.tpl-ai-input-wrapper:focus-within {\n border-color: var(--tpl-primary);\n box-shadow: var(--tpl-ring);\n}\n\n.tpl-ai-send-btn:not(:disabled):hover {\n transform: scale(1.05);\n}\n\n.tpl-suggestion-btn:hover {\n border-color: var(--tpl-primary) !important;\n background-color: var(--tpl-primary-light) !important;\n}\n</style>\n","<script setup lang=\"ts\">\nimport LoadingTrack from \"../../components/LoadingTrack.vue\";\nimport { useAiChat } from \"@templatical/core/cloud\";\nimport {\n CLOUD_TRANSLATIONS_KEY,\n EDITOR_KEY,\n AUTH_MANAGER_KEY,\n MERGE_TAGS_KEY,\n requireInject,\n} from \"../../keys\";\nimport { useAliveFlag } from \"../../composables/useAliveFlag\";\nimport type { TemplateContent } from \"@templatical/types\";\nimport {\n CircleAlert,\n LoaderCircle,\n Redo2,\n Send,\n Sparkles,\n Trash2,\n Undo2,\n X,\n} from \"@lucide/vue\";\nimport { inject, nextTick, ref, watch } from \"vue\";\nimport { useIntervalFn, useTimeoutFn } from \"@vueuse/core\";\n\nconst props = defineProps<{\n visible: boolean;\n onApply?: (content: TemplateContent) => void;\n}>();\n\nconst emit = defineEmits<{\n (e: \"close\"): void;\n}>();\n\nconst cloudTranslations = requireInject(\n CLOUD_TRANSLATIONS_KEY,\n \"AiChatSidebar\",\n);\nconst editor = requireInject(EDITOR_KEY, \"AiChatSidebar\");\nconst authManager = requireInject(AUTH_MANAGER_KEY, \"AiChatSidebar\");\nconst mergeTags = inject(MERGE_TAGS_KEY, []);\nconst aliveFlag = useAliveFlag();\n\nconst aiChat = useAiChat({\n authManager,\n getTemplateId: () => editor.state.template?.id ?? null,\n onApply: props.onApply,\n onError: undefined,\n});\n\nconst promptInput = ref(\"\");\nconst messagesContainer = ref<HTMLElement | null>(null);\nconst historyLoaded = ref(false);\nconst visibleSuggestionCount = ref(0);\n\nconst { pause: pauseReveal, resume: resumeReveal } = useIntervalFn(\n () => {\n const count = aiChat.suggestions.value?.length ?? 0;\n if (visibleSuggestionCount.value < count) {\n visibleSuggestionCount.value++;\n } else {\n pauseReveal();\n }\n },\n 150,\n { immediate: false },\n);\n\nconst { start: startRevealTimeout } = useTimeoutFn(() => resumeReveal(), 100, {\n immediate: false,\n});\n\nwatch(\n () => aiChat.suggestions.value?.length ?? 0,\n (count) => {\n pauseReveal();\n if (count === 0) {\n visibleSuggestionCount.value = 0;\n return;\n }\n\n visibleSuggestionCount.value = 0;\n startRevealTimeout();\n },\n);\n\nfunction scrollToBottom(): void {\n nextTick(() => {\n if (messagesContainer.value) {\n messagesContainer.value.scrollTop = messagesContainer.value.scrollHeight;\n }\n });\n}\n\nwatch(\n () => aiChat.messages.value?.length ?? 0,\n () => scrollToBottom(),\n);\n\nwatch(\n () => props.visible,\n async (isVisible) => {\n if (isVisible && !historyLoaded.value) {\n historyLoaded.value = true;\n await aiChat.loadConversation();\n if (!aliveFlag.alive) return;\n\n if (\n (aiChat.messages.value?.length ?? 0) === 0 &&\n editor.content.value.blocks.length === 0\n ) {\n aiChat.loadSuggestions(editor.content.value, mergeTags);\n }\n }\n },\n);\n\nasync function handleSend(): Promise<void> {\n const prompt = promptInput.value.trim();\n if (!prompt || aiChat.isGenerating.value) {\n return;\n }\n\n promptInput.value = \"\";\n aiChat.error.value = null;\n aiChat.failedPrompt.value = null;\n scrollToBottom();\n\n await aiChat.sendPrompt(prompt, editor.content.value, mergeTags);\n if (!aliveFlag.alive) return;\n\n if (aiChat.failedPrompt.value) {\n promptInput.value = aiChat.failedPrompt.value;\n }\n\n scrollToBottom();\n}\n\nfunction stripJsonBlock(text: string): string {\n return text\n .replace(/```json[\\s\\S]*?```/g, \"\")\n .replace(/```json[\\s\\S]*/g, \"\")\n .trim();\n}\n\nfunction handleSuggestionClick(suggestion: string): void {\n pauseReveal();\n promptInput.value = suggestion;\n handleSend();\n}\n\nfunction handleKeydown(event: KeyboardEvent): void {\n if (event.key === \"Enter\" && !event.shiftKey) {\n event.preventDefault();\n handleSend();\n }\n}\n</script>\n\n<template>\n <Transition\n enter-active-class=\"tpl-ai-slide-enter-active\"\n enter-from-class=\"tpl:translate-x-full\"\n enter-to-class=\"tpl:translate-x-0\"\n leave-active-class=\"tpl-ai-slide-leave-active\"\n leave-from-class=\"tpl:translate-x-0\"\n leave-to-class=\"tpl:translate-x-full\"\n >\n <div\n v-if=\"visible\"\n class=\"tpl-ai-sidebar tpl:absolute tpl:top-14 tpl:right-0 tpl:bottom-0 tpl:flex tpl:w-[360px] tpl:flex-col tpl:border-l tpl:border-[var(--tpl-border)] tpl:bg-[var(--tpl-bg-elevated)]\"\n >\n <!-- Header -->\n <div\n class=\"tpl:flex tpl:items-center tpl:justify-between tpl:border-b tpl:border-[var(--tpl-border)] tpl:px-4 tpl:py-3\"\n >\n <div\n class=\"tpl:flex tpl:items-center tpl:gap-1.5 tpl:text-sm tpl:font-medium tpl:text-[var(--tpl-primary)]\"\n >\n <Sparkles :size=\"13\" :stroke-width=\"2\" />\n <span>\n {{ cloudTranslations.aiChat.title }}\n </span>\n </div>\n <div class=\"tpl:flex tpl:items-center tpl:gap-1\">\n <button\n v-if=\"(aiChat.messages.value?.length ?? 0) > 0\"\n class=\"tpl:rounded-md tpl:p-0.5 tpl:transition-colors tpl:text-[var(--tpl-text-muted)]\"\n :title=\"cloudTranslations.aiChat.clear\"\n @click=\"aiChat.clearChat()\"\n >\n <Trash2 :size=\"14\" :stroke-width=\"2\" />\n </button>\n <button\n class=\"tpl:rounded-md tpl:p-0.5 tpl:transition-colors tpl:text-[var(--tpl-text-muted)]\"\n @click=\"emit('close')\"\n >\n <X :size=\"14\" :stroke-width=\"2\" />\n </button>\n </div>\n </div>\n\n <!-- Messages wrapper -->\n <div class=\"tpl:relative tpl:flex tpl:min-h-0 tpl:flex-1 tpl:flex-col\">\n <!-- Messages -->\n <div\n ref=\"messagesContainer\"\n class=\"tpl:flex-1 tpl:overflow-y-auto tpl:p-4\"\n >\n <!-- Loading history state -->\n <div\n v-if=\"aiChat.isLoadingHistory.value\"\n class=\"tpl:flex tpl:h-full tpl:flex-col tpl:items-center tpl:justify-center tpl:gap-3 tpl:text-center\"\n >\n <LoaderCircle\n class=\"tpl-spinner tpl:text-[var(--tpl-text-muted)]\"\n :size=\"24\"\n :stroke-width=\"2\"\n />\n <p class=\"tpl:text-sm tpl:text-[var(--tpl-text-muted)]\">\n {{ cloudTranslations.aiChat.loadingHistory }}\n </p>\n </div>\n\n <!-- Empty state -->\n <div\n v-else-if=\"(aiChat.messages.value?.length ?? 0) === 0\"\n class=\"tpl:flex tpl:h-full tpl:flex-col tpl:items-center tpl:justify-center tpl:gap-3 tpl:text-center\"\n >\n <Sparkles\n :size=\"32\"\n :stroke-width=\"1.5\"\n class=\"tpl:text-[var(--tpl-text-dim)]\"\n />\n <p\n class=\"tpl:max-w-[240px] tpl:text-sm tpl:text-[var(--tpl-text-muted)]\"\n >\n {{ cloudTranslations.aiChat.placeholder }}\n </p>\n </div>\n\n <!-- Message list -->\n <div v-else class=\"tpl:flex tpl:flex-col tpl:gap-4\">\n <div\n v-for=\"(message, index) in aiChat.messages.value\"\n :key=\"message.id\"\n class=\"tpl:flex tpl:flex-col tpl:gap-2\"\n >\n <!-- User message -->\n <div\n v-if=\"message.role === 'user'\"\n class=\"tpl:self-end tpl:rounded-[var(--tpl-radius-sm)] tpl:px-3.5 tpl:py-2.5 tpl:text-sm\"\n style=\"\n background-color: var(--tpl-primary-light);\n color: var(--tpl-text);\n max-width: 85%;\n box-shadow: var(--tpl-shadow);\n \"\n >\n {{ message.content }}\n </div>\n\n <!-- Assistant message -->\n <div v-else class=\"tpl:flex tpl:flex-col tpl:gap-2\">\n <LoadingTrack\n v-if=\"\n !stripJsonBlock(message.content) &&\n aiChat.isGenerating.value &&\n index === (aiChat.messages.value?.length ?? 0) - 1\n \"\n />\n <div\n v-else\n class=\"tpl:rounded-[var(--tpl-radius-sm)] tpl:px-3.5 tpl:py-2.5 tpl:text-sm tpl:whitespace-pre-wrap\"\n style=\"\n max-width: 85%;\n background-color: var(--tpl-bg);\n color: var(--tpl-text);\n box-shadow: var(--tpl-shadow);\n \"\n >\n {{\n stripJsonBlock(message.content) ||\n cloudTranslations.aiChat.applied\n }}\n </div>\n <button\n v-if=\"\n message.id === aiChat.lastApplyMessageId.value &&\n !aiChat.isGenerating.value\n \"\n class=\"tpl:inline-flex tpl:items-center tpl:gap-1.5 tpl:self-start tpl:rounded-md tpl:border tpl:px-2.5 tpl:py-1.5 tpl:text-xs tpl:font-medium tpl:transition-all\"\n style=\"\n border-color: var(--tpl-border);\n color: var(--tpl-text-muted);\n background-color: transparent;\n \"\n @click=\"aiChat.toggleLastRevert()\"\n >\n <template v-if=\"aiChat.isLastChangeReverted.value\">\n <Redo2 :size=\"12\" :stroke-width=\"2\" />\n {{ cloudTranslations.aiChat.reapply }}\n </template>\n <template v-else>\n <Undo2 :size=\"12\" :stroke-width=\"2\" />\n {{ cloudTranslations.aiChat.revert }}\n </template>\n </button>\n </div>\n </div>\n </div>\n </div>\n\n <!-- Error message -->\n <div\n v-if=\"aiChat.error.value\"\n class=\"tpl:mx-3 tpl:mb-2 tpl:flex tpl:items-start tpl:gap-2 tpl:rounded-lg tpl:px-3 tpl:py-2 tpl:text-xs\"\n style=\"\n background-color: var(--tpl-danger-light);\n color: var(--tpl-danger);\n \"\n >\n <CircleAlert\n :size=\"14\"\n :stroke-width=\"2\"\n class=\"tpl:mt-0.5 tpl:shrink-0\"\n />\n <span>{{\n aiChat.error.value === \"ai_apply_failed\"\n ? cloudTranslations.aiChat.applyFailed\n : cloudTranslations.aiChat.error\n }}</span>\n </div>\n\n <!-- Suggestions (overlay) -->\n <div\n v-if=\"(aiChat.suggestions.value?.length ?? 0) > 0\"\n class=\"tpl:absolute tpl:right-0 tpl:bottom-0 tpl:left-0 tpl:z-10 tpl:px-3 tpl:pb-3\"\n style=\"\n background-color: color-mix(\n in srgb,\n var(--tpl-bg) 50%,\n transparent\n );\n backdrop-filter: blur(2px);\n \"\n >\n <div class=\"tpl:flex tpl:flex-col tpl:gap-1.5\">\n <button\n v-for=\"(suggestion, index) in aiChat.suggestions.value ?? []\"\n :key=\"index\"\n class=\"tpl-suggestion-btn tpl:cursor-pointer tpl:rounded-[var(--tpl-radius-sm)] tpl:border tpl:px-3 tpl:py-2 tpl:text-left tpl:text-xs tpl:leading-snug tpl:transition-all tpl:duration-300 tpl:ease-out\"\n :class=\"\n (aiChat.suggestions.value?.length ?? 0) - 1 - index <\n visibleSuggestionCount\n ? 'tpl:translate-y-0 tpl:opacity-100'\n : 'tpl:pointer-events-none tpl:-translate-y-2 tpl:opacity-0'\n \"\n style=\"\n border-color: var(--tpl-border);\n color: var(--tpl-primary);\n background-color: var(--tpl-bg);\n box-shadow: var(--tpl-shadow);\n \"\n @click=\"handleSuggestionClick(suggestion)\"\n >\n {{ suggestion }}\n </button>\n </div>\n </div>\n </div>\n\n <!-- Input area -->\n <div class=\"tpl:border-t tpl:p-3 tpl:border-[var(--tpl-border)]\">\n <div\n class=\"tpl-ai-input-wrapper tpl-focus-ring-host tpl:flex tpl:items-end tpl:gap-2 tpl:rounded-[var(--tpl-radius)] tpl:border tpl:px-3 tpl:py-2 tpl:border-[var(--tpl-border)] tpl:bg-[var(--tpl-bg)]\"\n >\n <textarea\n v-model=\"promptInput\"\n class=\"tpl:max-h-32 tpl:min-h-[64px] tpl:flex-1 tpl:resize-none tpl:border-none tpl:bg-transparent tpl:font-sans tpl:text-sm tpl:outline-none tpl:text-[var(--tpl-text)]\"\n :placeholder=\"cloudTranslations.aiChat.inputPlaceholder\"\n :disabled=\"aiChat.isGenerating.value\"\n rows=\"3\"\n @keydown=\"handleKeydown\"\n />\n <button\n class=\"tpl-ai-send-btn tpl:flex tpl:shrink-0 tpl:items-center tpl:justify-center tpl:rounded-md tpl:p-1.5 tpl:transition-all tpl:disabled:opacity-40 tpl:text-[var(--tpl-primary)]\"\n :disabled=\"!promptInput.trim() || aiChat.isGenerating.value\"\n @click=\"handleSend\"\n >\n <Send :size=\"16\" :stroke-width=\"2\" />\n </button>\n </div>\n\n <!-- AI disclaimer -->\n <p\n class=\"tpl:m-0 tpl:px-1 tpl:pt-2 tpl:text-center tpl:text-[11px] tpl:text-[var(--tpl-text-dim)]\"\n >\n {{ cloudTranslations.aiMenu.disclaimer }}\n </p>\n </div>\n </div>\n </Transition>\n</template>\n\n<style scoped>\n.tpl-ai-slide-enter-active {\n transition: transform 280ms cubic-bezier(0.16, 1, 0.3, 1);\n}\n\n.tpl-ai-slide-leave-active {\n transition: transform 200ms cubic-bezier(0.16, 1, 0.3, 1);\n}\n\n.tpl-ai-input-wrapper:focus-within {\n border-color: var(--tpl-primary);\n box-shadow: var(--tpl-ring);\n}\n\n.tpl-ai-send-btn:not(:disabled):hover {\n transform: scale(1.05);\n}\n\n.tpl-suggestion-btn:hover {\n border-color: var(--tpl-primary) !important;\n background-color: var(--tpl-primary-light) !important;\n}\n</style>\n"],"mappings":"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"}
@@ -1,419 +0,0 @@
1
- import { E as e, F as t, K as n, N as r, Q as i, S as a, Y as o, at as s, b as c, c as l, ct as u, f as d, g as f, h as p, k as m, l as h, m as g, p as _, q as v, u as y, ut as b, y as x } from "./draggable-kbOhCgnk.js";
2
- import { a as S, c as C, d as w, l as T } from "./src-Dwgq7hf4.js";
3
- import { C as E } from "./useEditorCore-Cs7rYVBo.js";
4
- import { G as D } from "./keys-DBFhDFng.js";
5
- import { t as O } from "./useI18n-Dlo7R9RA.js";
6
- import { n as k } from "./usePopoverPosition-ElP3ABaV.js";
7
- import { P as A, Rt as j, n as M } from "./icons-BUlqGSgd.js";
8
- import { t as N } from "./_plugin-vue_export-helper-B3ysoDQm.js";
9
- import { t as P } from "./useMergeTag-BYAifvh8.js";
10
- import { p as F } from "./styleConstants-C_YAPdQS.js";
11
- import { n as I, r as L } from "./MergeTagSuggestion-t8Uj00Er.js";
12
- //#region src/utils/mergeTagTrigger.ts
13
- function R(e, t, n, r) {
14
- if (!n) return null;
15
- let i = e.slice(0, t), a = i.lastIndexOf(n);
16
- if (a === -1) return null;
17
- let o = i.slice(a + n.length);
18
- return /\s/.test(o) || r && o.includes(r) ? null : {
19
- triggerStart: a,
20
- caret: t,
21
- query: o
22
- };
23
- }
24
- //#endregion
25
- //#region src/utils/textFieldCaret.ts
26
- var z = /* @__PURE__ */ "boxSizing.width.borderTopWidth.borderRightWidth.borderBottomWidth.borderLeftWidth.borderStyle.paddingTop.paddingRight.paddingBottom.paddingLeft.fontStyle.fontVariant.fontWeight.fontStretch.fontSize.lineHeight.fontFamily.textAlign.textTransform.textIndent.letterSpacing.wordSpacing.tabSize.whiteSpace.wordWrap.wordBreak".split(".");
27
- function B(e, t, n) {
28
- return {
29
- left: e,
30
- top: t,
31
- bottom: n,
32
- right: e,
33
- width: 0,
34
- height: n - t,
35
- x: e,
36
- y: t,
37
- toJSON: () => ({})
38
- };
39
- }
40
- function V(e, t) {
41
- let n = e.ownerDocument, r = n.defaultView;
42
- if (!r) return null;
43
- let i = e.tagName === "INPUT", a = r.getComputedStyle(e), o = n.createElement("div");
44
- o.setAttribute("aria-hidden", "true");
45
- let s = o.style;
46
- s.position = "absolute", s.visibility = "hidden", s.top = "0", s.left = "0", s.overflow = "hidden", s.whiteSpace = i ? "pre" : "pre-wrap", s.wordWrap = i ? "normal" : "break-word";
47
- let c = s, l = a;
48
- for (let e of z) c[e] = l[e];
49
- i && (s.width = "auto", s.whiteSpace = "pre");
50
- let u = e.value, d = u.slice(0, t);
51
- i && (d = d.replace(/\s/g, "\xA0")), o.textContent = d;
52
- let f = n.createElement("span");
53
- f.textContent = u.slice(t) || ".", o.appendChild(f), n.body.appendChild(o);
54
- let p = f.offsetTop, m = f.offsetLeft;
55
- n.body.removeChild(o);
56
- let h = e.getBoundingClientRect(), g = parseFloat(a.borderTopWidth) || 0, _ = parseFloat(a.borderLeftWidth) || 0, v = parseFloat(a.lineHeight) || parseFloat(a.fontSize) || 0, y = h.left + m + _ - e.scrollLeft;
57
- if (i) return B(y, h.top, h.bottom);
58
- let b = h.top + p + g - e.scrollTop;
59
- return B(y, b, b + v);
60
- }
61
- //#endregion
62
- //#region src/composables/useMergeTagAutocomplete.ts
63
- var H = /* @__PURE__ */ new Set([
64
- "ArrowLeft",
65
- "ArrowRight",
66
- "Home",
67
- "End"
68
- ]);
69
- function U(t) {
70
- let { elementRef: r, modelValue: i, emit: a, mergeTags: s, syntax: c, enabled: l, onInsert: u } = t, d = T(c), f = C(c), p = l && d !== null && s.length > 0, h = e(D, null), g = (v(h) ? h.value : h)?.mergeTag?.suggestionEmpty ?? "No matching merge tags", _ = k(), y = I(g, _), b = !1;
71
- n() && o(() => {
72
- b = !0, y.close();
73
- });
74
- function x(e) {
75
- let t = e.value ?? "";
76
- return R(t, e.selectionStart ?? t.length, d, f);
77
- }
78
- function S(e, t, n) {
79
- let o = e.value ?? i(), s = o.slice(t.caret), c = f && s.startsWith(f) ? f.length : 0, l = o.slice(0, t.triggerStart), d = o.slice(t.caret + c), p = l + n.value + d, h = l.length + n.value.length;
80
- u?.(), a(p), y.close(), m(() => {
81
- if (b) return;
82
- let e = r.value;
83
- e?.focus(), e?.setSelectionRange(h, h);
84
- });
85
- }
86
- function w() {
87
- if (!p || b) return;
88
- let e = r.value;
89
- if (!e) {
90
- y.close();
91
- return;
92
- }
93
- let t = x(e);
94
- if (!t) {
95
- y.close();
96
- return;
97
- }
98
- let n = L(s, t.query), i = () => V(e, t.triggerStart), a = (n) => S(e, t, n);
99
- y.isOpen() ? y.update({
100
- items: n,
101
- getRect: i,
102
- onCommand: a
103
- }) : y.open({
104
- items: n,
105
- getRect: i,
106
- anchorEl: e,
107
- onCommand: a
108
- });
109
- }
110
- function E(e) {
111
- return y.isOpen() ? e.key === "Escape" ? (y.close(), !0) : H.has(e.key) ? (y.close(), !1) : y.handleKeyDown(e) : !1;
112
- }
113
- return {
114
- available: p,
115
- refresh: w,
116
- handleKeydown: E,
117
- close: () => y.close(),
118
- isOpen: () => y.isOpen()
119
- };
120
- }
121
- //#endregion
122
- //#region src/composables/useMergeTagField.ts
123
- function W(e) {
124
- let { modelValue: t, emit: r, elementRef: a } = e, { mergeTags: s, canRequestMergeTag: c, isRequesting: l, isMergeTagValue: u, getMergeTagLabel: f, requestMergeTag: p, syntax: h, autocomplete: g } = P(), { canInsertLogicTag: _, isRequesting: v, requestLogicTag: y } = E(), b = i(!1), x = !1, C = !1;
125
- n() && o(() => {
126
- C = !0;
127
- });
128
- let T = U({
129
- elementRef: a,
130
- modelValue: t,
131
- emit: r,
132
- mergeTags: s,
133
- syntax: h,
134
- enabled: g,
135
- onInsert: () => {
136
- b.value = !0;
137
- }
138
- }), D = d(() => {
139
- let e = t();
140
- if (!e) return [];
141
- let n = [], r = `(${h.value.source}|${h.logic.source})`, i = new RegExp(r, "g"), a = 0, o;
142
- for (; (o = i.exec(e)) !== null;) {
143
- o.index > a && n.push({
144
- type: "text",
145
- value: e.slice(a, o.index)
146
- });
147
- let t = o[0];
148
- u(t) ? n.push({
149
- type: "mergeTag",
150
- value: t,
151
- label: f(t)
152
- }) : w(t, h) ? n.push({
153
- type: "logicMergeTag",
154
- value: t,
155
- keyword: S(t, h)
156
- }) : n.push({
157
- type: "text",
158
- value: t
159
- }), a = o.index + t.length;
160
- }
161
- return a < e.length && n.push({
162
- type: "text",
163
- value: e.slice(a)
164
- }), n;
165
- }), O = d(() => D.value.some((e) => e.type === "mergeTag" || e.type === "logicMergeTag"));
166
- function k() {
167
- b.value = !0, m(() => {
168
- a.value?.focus();
169
- let e = t()?.length || 0;
170
- a.value?.setSelectionRange(e, e);
171
- });
172
- }
173
- function A() {
174
- x || (b.value = !1);
175
- }
176
- function j(e) {
177
- r(e.target.value), T.refresh();
178
- }
179
- function M(e) {
180
- return T.handleKeydown(e) ? (e.preventDefault(), !0) : (e.key === "Escape" && A(), !1);
181
- }
182
- function N() {
183
- T.refresh();
184
- }
185
- function F() {
186
- T.close(), A();
187
- }
188
- function I() {
189
- r("");
190
- }
191
- async function L() {
192
- let e = b.value && a.value ? a.value.selectionStart ?? t().length : t().length;
193
- x = !0;
194
- let n;
195
- try {
196
- n = await p();
197
- } finally {
198
- x = !1;
199
- }
200
- if (!C && n) {
201
- let i = t().slice(0, e), o = t().slice(e), s = i + n.value + o;
202
- r(s), b.value = !0, m(() => {
203
- if (C) return;
204
- let t = e + n.value.length;
205
- a.value?.focus(), a.value?.setSelectionRange(t, t);
206
- });
207
- }
208
- }
209
- async function R() {
210
- let e = a.value, n = e?.selectionStart ?? t().length, i = e?.selectionEnd ?? n;
211
- x = !0;
212
- let o;
213
- try {
214
- o = await y();
215
- } finally {
216
- x = !1;
217
- }
218
- if (C || !o) return;
219
- let s = t(), c, l;
220
- "before" in o ? (c = s.slice(0, n) + o.before + s.slice(n, i) + o.after + s.slice(i), l = n + o.before.length + (i - n)) : (c = s.slice(0, n) + o.value + s.slice(n), l = n + o.value.length), r(c), b.value = !0, m(() => {
221
- C || (a.value?.focus(), a.value?.setSelectionRange(l, l));
222
- });
223
- }
224
- return {
225
- segments: D,
226
- hasMergeTags: O,
227
- canRequestMergeTag: c,
228
- isRequestingMergeTag: l,
229
- canInsertLogicTag: _,
230
- isRequestingLogicTag: v,
231
- isEditing: b,
232
- startEditing: k,
233
- stopEditing: A,
234
- handleInput: j,
235
- handleKeydown: M,
236
- handleClick: N,
237
- handleBlur: F,
238
- clearValue: I,
239
- insertMergeTag: L,
240
- insertLogicTag: R,
241
- autocompleteAvailable: T.available
242
- };
243
- }
244
- //#endregion
245
- //#region src/components/MergeTagSegments.vue?vue&type=script&setup=true&lang.ts
246
- var G = ["aria-label", "onKeydown"], K = ["data-tooltip"], q = ["data-tooltip"], J = {
247
- key: 2,
248
- class: "tpl:text-sm tpl:text-[var(--tpl-text)]"
249
- }, Y = ["aria-label", "title"], X = /* @__PURE__ */ a({
250
- __name: "MergeTagSegments",
251
- props: {
252
- segments: {},
253
- displayClass: {},
254
- pulse: { type: Boolean }
255
- },
256
- emits: ["edit", "clear"],
257
- setup(e, { emit: n }) {
258
- let i = n, { t: a } = O();
259
- function o() {
260
- i("edit");
261
- }
262
- return (n, d) => (r(), f("div", {
263
- role: "button",
264
- tabindex: "0",
265
- "aria-label": s(a).mergeTag.clickToEdit,
266
- class: u([e.displayClass, { "tpl-pulse-fill": e.pulse }]),
267
- onClick: o,
268
- onKeydown: [l(o, ["enter"]), l(h(o, ["prevent"]), ["space"])]
269
- }, [(r(!0), f(y, null, t(e.segments, (e, t) => (r(), f(y, { key: `${e.type}-${t}-${e.value}` }, [e.type === "mergeTag" ? (r(), f("span", {
270
- key: 0,
271
- class: "tpl-tooltip 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",
272
- "data-tooltip": e.value,
273
- style: {
274
- "background-color": "color-mix(\n in srgb,\n var(--tpl-primary) 20%,\n transparent\n )",
275
- color: "var(--tpl-primary)"
276
- }
277
- }, b(e.label), 9, K)) : e.type === "logicMergeTag" ? (r(), f("span", {
278
- key: 1,
279
- class: "tpl-tooltip tpl:inline-flex tpl:items-center tpl:rounded tpl:px-1.5 tpl:py-0.5 tpl:text-[0.8em] tpl:font-bold tpl:tracking-wide tpl:uppercase",
280
- "data-tooltip": e.value,
281
- style: {
282
- "background-color": "transparent",
283
- border: "1.5px solid\n color-mix(in srgb, var(--tpl-primary) 50%, transparent)",
284
- color: "var(--tpl-primary)"
285
- }
286
- }, b(e.keyword), 9, q)) : (r(), f("span", J, b(e.value), 1))], 64))), 128)), _("button", {
287
- type: "button",
288
- class: "tpl:ml-auto tpl:flex tpl:size-6 tpl:shrink-0 tpl:cursor-pointer tpl:items-center tpl:justify-center tpl:rounded-full tpl:border-none tpl:bg-transparent tpl:p-0 tpl:text-[var(--tpl-text-dim)] tpl:opacity-60 tpl:transition-all tpl:hover:text-[var(--tpl-danger)] tpl:hover:opacity-100",
289
- "aria-label": s(a).mergeTag.remove,
290
- title: s(a).mergeTag.remove,
291
- onClick: d[0] ||= h((e) => i("clear"), ["stop"])
292
- }, [c(s(M), {
293
- size: 12,
294
- "stroke-width": 2.5
295
- })], 8, Y)], 42, G));
296
- }
297
- }), Z = [
298
- "aria-label",
299
- "title",
300
- "disabled"
301
- ], ee = "tpl:flex tpl:items-center tpl:justify-center tpl:gap-1 tpl:rounded-[var(--tpl-radius-sm)] tpl:border tpl:border-[var(--tpl-border)] tpl:bg-[var(--tpl-bg-hover)] tpl:px-2 tpl:py-1 tpl:text-xs tpl:text-[var(--tpl-text-muted)] tpl:transition-all tpl:duration-[120ms] tpl:hover:bg-[var(--tpl-primary-light)] tpl:hover:text-[var(--tpl-primary)] tpl:hover:border-[var(--tpl-primary)]", Q = /* @__PURE__ */ a({
302
- __name: "MergeTagInsertButton",
303
- props: { disabled: { type: Boolean } },
304
- emits: ["insert"],
305
- setup(e) {
306
- let { t } = O();
307
- return (n, i) => (r(), f("button", {
308
- type: "button",
309
- class: u([ee, "tpl:mt-1.5"]),
310
- "aria-label": s(t).mergeTag.insert,
311
- title: s(t).mergeTag.insert,
312
- disabled: e.disabled,
313
- onMousedown: i[0] ||= h(() => {}, ["prevent"]),
314
- onClick: i[1] ||= (e) => n.$emit("insert")
315
- }, [c(s(A), {
316
- size: 12,
317
- "stroke-width": 2
318
- }), x(" " + b(s(t).mergeTag.insertShort), 1)], 42, Z));
319
- }
320
- }), te = [
321
- "aria-label",
322
- "title",
323
- "disabled"
324
- ], ne = "tpl:flex tpl:items-center tpl:justify-center tpl:gap-1 tpl:rounded-[var(--tpl-radius-sm)] tpl:border tpl:border-[var(--tpl-border)] tpl:bg-[var(--tpl-bg-hover)] tpl:px-2 tpl:py-1 tpl:text-xs tpl:text-[var(--tpl-text-muted)] tpl:transition-all tpl:duration-[120ms] tpl:hover:bg-[var(--tpl-primary-light)] tpl:hover:text-[var(--tpl-primary)] tpl:hover:border-[var(--tpl-primary)]", $ = /* @__PURE__ */ a({
325
- __name: "LogicTagInsertButton",
326
- props: { disabled: { type: Boolean } },
327
- emits: ["insert"],
328
- setup(e) {
329
- let { t } = O();
330
- return (n, i) => (r(), f("button", {
331
- type: "button",
332
- class: u([ne, "tpl:mt-1.5"]),
333
- "aria-label": s(t).logicTag.insert,
334
- title: s(t).logicTag.insert,
335
- disabled: e.disabled,
336
- "data-testid": "field-insert-logic-button",
337
- onMousedown: i[0] ||= h(() => {}, ["prevent"]),
338
- onClick: i[1] ||= (e) => n.$emit("insert")
339
- }, [c(s(j), {
340
- size: 12,
341
- "stroke-width": 2
342
- }), x(" " + b(s(t).logicTag.insertShort), 1)], 42, te));
343
- }
344
- }), re = { key: 0 }, ie = {
345
- key: 0,
346
- class: "tpl:flex tpl:flex-wrap tpl:gap-1.5"
347
- }, ae = { key: 1 }, oe = [
348
- "type",
349
- "value",
350
- "placeholder"
351
- ], se = {
352
- key: 0,
353
- class: "tpl:flex tpl:flex-wrap tpl:gap-1.5"
354
- }, ce = "tpl:flex tpl:w-full tpl:min-h-10 tpl:cursor-pointer tpl:items-center tpl:flex-wrap tpl:gap-1 tpl:rounded-[var(--tpl-radius-sm)] tpl:border tpl:shadow-[var(--tpl-shadow-sm)] tpl:bg-[var(--tpl-bg)] tpl:border-[var(--tpl-border)] tpl:px-3.5 tpl:py-1.5 tpl:transition-all tpl:duration-[120ms] tpl:ease-[cubic-bezier(0.16,1,0.3,1)]", le = /*#__PURE__*/ N(/* @__PURE__ */ a({
355
- __name: "MergeTagInput",
356
- props: {
357
- modelValue: {},
358
- type: { default: "text" },
359
- placeholder: { default: "" },
360
- pulse: {
361
- type: Boolean,
362
- default: !1
363
- }
364
- },
365
- emits: ["update:modelValue", "keydown"],
366
- setup(e, { emit: t }) {
367
- let n = e, a = t, o = i(null), { segments: l, hasMergeTags: d, canRequestMergeTag: m, isRequestingMergeTag: h, canInsertLogicTag: v, isRequestingLogicTag: y, isEditing: b, startEditing: x, handleInput: S, handleKeydown: C, handleClick: w, handleBlur: T, clearValue: E, insertMergeTag: D, insertLogicTag: O } = W({
368
- modelValue: () => n.modelValue,
369
- emit: (e) => a("update:modelValue", e),
370
- elementRef: o
371
- });
372
- function k(e) {
373
- C(e) || a("keydown", e);
374
- }
375
- return (t, n) => s(d) && !s(b) ? (r(), f("div", re, [c(X, {
376
- segments: s(l),
377
- "display-class": ce,
378
- pulse: e.pulse,
379
- onEdit: s(x),
380
- onClear: s(E)
381
- }, null, 8, [
382
- "segments",
383
- "pulse",
384
- "onEdit",
385
- "onClear"
386
- ]), s(m) || s(v) ? (r(), f("div", ie, [s(m) ? (r(), g(Q, {
387
- key: 0,
388
- disabled: s(h),
389
- onInsert: s(D)
390
- }, null, 8, ["disabled", "onInsert"])) : p("", !0), s(v) ? (r(), g($, {
391
- key: 1,
392
- disabled: s(y),
393
- onInsert: s(O)
394
- }, null, 8, ["disabled", "onInsert"])) : p("", !0)])) : p("", !0)])) : (r(), f("div", ae, [_("input", {
395
- ref_key: "inputRef",
396
- ref: o,
397
- type: e.type,
398
- class: u([s(F), { "tpl-pulse-fill": e.pulse }]),
399
- value: e.modelValue,
400
- placeholder: e.placeholder,
401
- onInput: n[0] ||= (...e) => s(S) && s(S)(...e),
402
- onKeydown: k,
403
- onClick: n[1] ||= (...e) => s(w) && s(w)(...e),
404
- onBlur: n[2] ||= (...e) => s(T) && s(T)(...e)
405
- }, null, 42, oe), s(m) || s(v) ? (r(), f("div", se, [s(m) ? (r(), g(Q, {
406
- key: 0,
407
- disabled: s(h),
408
- onInsert: s(D)
409
- }, null, 8, ["disabled", "onInsert"])) : p("", !0), s(v) ? (r(), g($, {
410
- key: 1,
411
- disabled: s(y),
412
- onInsert: s(O)
413
- }, null, 8, ["disabled", "onInsert"])) : p("", !0)])) : p("", !0)]));
414
- }
415
- }), [["__scopeId", "data-v-31b31866"]]);
416
- //#endregion
417
- export { W as a, X as i, $ as n, Q as r, le as t };
418
-
419
- //# sourceMappingURL=MergeTagInput-l7paaAml.js.map