@templatical/editor 0.26.1 → 0.26.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 (81) hide show
  1. package/dist/{AiChatSidebar-B_fwa6zc.js → AiChatSidebar-CMBz6Wix.js} +1 -1
  2. package/dist/{AiFeatureMenu-BBBKsYD4.js → AiFeatureMenu-BY6mubnR.js} +1 -1
  3. package/dist/{BlockPreviewCanvas-zyyq2de0.js → BlockPreviewCanvas-DbNOqSI1.js} +1 -1
  4. package/dist/{CloudEditor-DM3RRCVn.js → CloudEditor-DEnMNMbm.js} +8 -8
  5. package/dist/{CollaboratorBar-Coj8Ebwf.js → CollaboratorBar-zvfvE7f-.js} +1 -1
  6. package/dist/{DesignReferenceSidebar-hDXOvGoV.js → DesignReferenceSidebar-Bx96XFmK.js} +1 -1
  7. package/dist/{MergeTagModeToggle-D0t5NHBZ.js → MergeTagModeToggle-P-UguQHc.js} +1 -1
  8. package/dist/{ParagraphEditor-B-CYrQMY.js → ParagraphEditor-CLvv5Ija.js} +2 -2
  9. package/dist/{SaveBlockDialog-CoVPZfUv.js → SaveBlockDialog-fVp_PwZi.js} +3 -3
  10. package/dist/{SavedBlocksBrowserModal-DX13xw0O.js → SavedBlocksBrowserModal-KWlaiLlr.js} +4 -4
  11. package/dist/{SavedBlocksPanels-B7pBiZcc.js → SavedBlocksPanels-CQsZvWO_.js} +1 -1
  12. package/dist/{SavedBlocksPickBar-ZfqXByph.js → SavedBlocksPickBar-C3h8oL3r.js} +1 -1
  13. package/dist/{SnapshotHistory-BxABntv5.js → SnapshotHistory-DjA3Ej_i.js} +1 -1
  14. package/dist/{TestEmailModal-Db4qheuy.js → TestEmailModal-EM0RP_9L.js} +5 -5
  15. package/dist/{TestEmailPanel-B-SXSnRg.js → TestEmailPanel-B6goIAxT.js} +1 -1
  16. package/dist/{TitleEditor-DmoaKooA.js → TitleEditor-JEaP9jVF.js} +2 -2
  17. package/dist/{TplModal-Bym-Kf_i.js → TplModal-DoneXIj_.js} +1 -1
  18. package/dist/{blockTypeIcons-BnCXsB2I.js → blockTypeIcons-2_85L_CL.js} +1 -1
  19. package/dist/bundle-stats.json +6 -6
  20. package/dist/cdn/chunks/{AiChatSidebar-CFvS4-EZ.js → AiChatSidebar-CQ8KUmNB.js} +2 -2
  21. package/dist/cdn/chunks/{AiChatSidebar-CFvS4-EZ.js.map → AiChatSidebar-CQ8KUmNB.js.map} +1 -1
  22. package/dist/cdn/chunks/{AiFeatureMenu-a0gBZiJ9.js → AiFeatureMenu-Cwj8afsi.js} +2 -2
  23. package/dist/cdn/chunks/{AiFeatureMenu-a0gBZiJ9.js.map → AiFeatureMenu-Cwj8afsi.js.map} +1 -1
  24. package/dist/cdn/chunks/{BlockPreviewCanvas-C27XK2q0.js → BlockPreviewCanvas-DPtiMsVz.js} +2 -2
  25. package/dist/cdn/chunks/{BlockPreviewCanvas-C27XK2q0.js.map → BlockPreviewCanvas-DPtiMsVz.js.map} +1 -1
  26. package/dist/cdn/chunks/{CloudEditor-Ddnatfuw.js → CloudEditor-CQ830jJt.js} +11 -11
  27. package/dist/cdn/chunks/{CloudEditor-Ddnatfuw.js.map → CloudEditor-CQ830jJt.js.map} +1 -1
  28. package/dist/cdn/chunks/{CollaboratorBar-C5Xf6Mz9.js → CollaboratorBar-BF469_AN.js} +2 -2
  29. package/dist/cdn/chunks/{CollaboratorBar-C5Xf6Mz9.js.map → CollaboratorBar-BF469_AN.js.map} +1 -1
  30. package/dist/cdn/chunks/{DesignReferenceSidebar-CZiP00JN.js → DesignReferenceSidebar-B-HFXV0W.js} +2 -2
  31. package/dist/cdn/chunks/{DesignReferenceSidebar-CZiP00JN.js.map → DesignReferenceSidebar-B-HFXV0W.js.map} +1 -1
  32. package/dist/cdn/chunks/{MergeTagModeToggle-ClGdRNpZ.js → MergeTagModeToggle-DQ79SqQc.js} +2 -2
  33. package/dist/cdn/chunks/{MergeTagModeToggle-ClGdRNpZ.js.map → MergeTagModeToggle-DQ79SqQc.js.map} +1 -1
  34. package/dist/cdn/chunks/{ParagraphEditor-BNc146Pp.js → ParagraphEditor-Bzcma_Lm.js} +3 -3
  35. package/dist/cdn/chunks/{ParagraphEditor-BNc146Pp.js.map → ParagraphEditor-Bzcma_Lm.js.map} +1 -1
  36. package/dist/cdn/chunks/{SaveBlockDialog-ogieDQp7.js → SaveBlockDialog-BfNVeXXV.js} +4 -4
  37. package/dist/cdn/chunks/{SaveBlockDialog-ogieDQp7.js.map → SaveBlockDialog-BfNVeXXV.js.map} +1 -1
  38. package/dist/cdn/chunks/{SavedBlocksBrowserModal-DSpZcT_T.js → SavedBlocksBrowserModal-C59D4G5C.js} +4 -4
  39. package/dist/cdn/chunks/{SavedBlocksBrowserModal-DSpZcT_T.js.map → SavedBlocksBrowserModal-C59D4G5C.js.map} +1 -1
  40. package/dist/cdn/chunks/{SavedBlocksPanels-WYrSyf-l.js → SavedBlocksPanels-e4HyTZ8v.js} +2 -2
  41. package/dist/cdn/chunks/{SavedBlocksPanels-WYrSyf-l.js.map → SavedBlocksPanels-e4HyTZ8v.js.map} +1 -1
  42. package/dist/cdn/chunks/{SavedBlocksPickBar-DGbLBG5P.js → SavedBlocksPickBar-DMHxPCM4.js} +2 -2
  43. package/dist/cdn/chunks/{SavedBlocksPickBar-DGbLBG5P.js.map → SavedBlocksPickBar-DMHxPCM4.js.map} +1 -1
  44. package/dist/cdn/chunks/{SnapshotHistory-VyL4tJwn.js → SnapshotHistory-80tAU_VX.js} +2 -2
  45. package/dist/cdn/chunks/{SnapshotHistory-VyL4tJwn.js.map → SnapshotHistory-80tAU_VX.js.map} +1 -1
  46. package/dist/cdn/chunks/{TestEmailModal-DRte11oT.js → TestEmailModal-DdWfAGNe.js} +6 -6
  47. package/dist/cdn/chunks/{TestEmailModal-DRte11oT.js.map → TestEmailModal-DdWfAGNe.js.map} +1 -1
  48. package/dist/cdn/chunks/{TestEmailPanel-CpK5t4E3.js → TestEmailPanel-CZAG1gQE.js} +2 -2
  49. package/dist/cdn/chunks/{TestEmailPanel-CpK5t4E3.js.map → TestEmailPanel-CZAG1gQE.js.map} +1 -1
  50. package/dist/cdn/chunks/{TitleEditor-EkDchueW.js → TitleEditor-D0_LY2Ex.js} +3 -3
  51. package/dist/cdn/chunks/{TitleEditor-EkDchueW.js.map → TitleEditor-D0_LY2Ex.js.map} +1 -1
  52. package/dist/cdn/chunks/{TplModal-BGLstO3F.js → TplModal-iCmoKB2k.js} +2 -2
  53. package/dist/cdn/chunks/{TplModal-BGLstO3F.js.map → TplModal-iCmoKB2k.js.map} +1 -1
  54. package/dist/cdn/chunks/{cloud-CNpvDuv7.js → cloud-DcC8bPwn.js} +2 -2
  55. package/dist/cdn/chunks/{cloud-CNpvDuv7.js.map → cloud-DcC8bPwn.js.map} +1 -1
  56. package/dist/cdn/chunks/{extensions-CZAB08kD.js → extensions-C7h52yuk.js} +7 -3
  57. package/dist/cdn/chunks/extensions-C7h52yuk.js.map +1 -0
  58. package/dist/cdn/chunks/{src-DsvVSm7Z.js → src-B_QJduQD.js} +162 -145
  59. package/dist/cdn/chunks/{src-DsvVSm7Z.js.map → src-B_QJduQD.js.map} +1 -1
  60. package/dist/cdn/chunks/{src-COnW7gMq.js → src-CUKUsRzX.js} +3 -3
  61. package/dist/cdn/chunks/{src-COnW7gMq.js.map → src-CUKUsRzX.js.map} +1 -1
  62. package/dist/cdn/chunks/{src-DzH5U9Vm.js → src-Cx70q30o.js} +2 -2
  63. package/dist/cdn/chunks/{src-DzH5U9Vm.js.map → src-Cx70q30o.js.map} +1 -1
  64. package/dist/cdn/chunks/{src-BRRRFqXr.js → src-xkGep9eN.js} +2 -2
  65. package/dist/cdn/chunks/{src-BRRRFqXr.js.map → src-xkGep9eN.js.map} +1 -1
  66. package/dist/cdn/chunks/{styles-DEU_sn3k.js → styles-CND3ey2g.js} +6 -6
  67. package/dist/cdn/chunks/{styles-DEU_sn3k.js.map → styles-CND3ey2g.js.map} +1 -1
  68. package/dist/cdn/chunks/{useEditorCore-fyFmWS3D.js → useEditorCore-CKQ9gmoo.js} +6 -6
  69. package/dist/cdn/chunks/{useEditorCore-fyFmWS3D.js.map → useEditorCore-CKQ9gmoo.js.map} +1 -1
  70. package/dist/cdn/chunks/{useMergeTag-DjQoCGEz.js → useMergeTag-JmXOtpln.js} +2 -2
  71. package/dist/cdn/chunks/{useMergeTag-DjQoCGEz.js.map → useMergeTag-JmXOtpln.js.map} +1 -1
  72. package/dist/cdn/editor.js +7 -7
  73. package/dist/{cloud-4SuOLNTK.js → cloud-qINCmQbn.js} +1 -1
  74. package/dist/{dist-BvYvG5SQ.js → dist-B1kLn1rs.js} +55 -38
  75. package/dist/{extensions-Dz5jj0wf.js → extensions-DzKNPITR.js} +6 -2
  76. package/dist/{styles-DbP2S8Z1.js → styles-BK36D1sy.js} +6 -6
  77. package/dist/templatical-editor.js +7 -7
  78. package/dist/{useEditorCore-CbcmGpwp.js → useEditorCore-idmPLUeb.js} +4 -4
  79. package/dist/{useMergeTag-B9xG9EJ7.js → useMergeTag-CYZk7dZD.js} +1 -1
  80. package/package.json +7 -7
  81. package/dist/cdn/chunks/extensions-CZAB08kD.js.map +0 -1
@@ -1,5 +1,5 @@
1
1
  import { T as e, Z as t } from "./draggable-DCs9qL-b.js";
2
- import { f as n, o as r, r as i } from "./src-DsvVSm7Z.js";
2
+ import { f as n, o as r, r as i } from "./src-B_QJduQD.js";
3
3
  import { A as a, D as o, E as s, N as c, O as l } from "./keys-Cmc2Yl3D.js";
4
4
  //#region src/composables/useMergeTag.ts
5
5
  function u() {
@@ -43,4 +43,4 @@ function u() {
43
43
  //#endregion
44
44
  export { u as t };
45
45
 
46
- //# sourceMappingURL=useMergeTag-DjQoCGEz.js.map
46
+ //# sourceMappingURL=useMergeTag-JmXOtpln.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"useMergeTag-DjQoCGEz.js","names":[],"sources":["../../../src/composables/useMergeTag.ts"],"sourcesContent":["import type { MergeTag, SyntaxPreset } from \"@templatical/types\";\nimport {\n isMergeTagValue as checkIsMergeTagValue,\n getMergeTagLabel as resolveMergeTagLabel,\n SYNTAX_PRESETS,\n} from \"@templatical/types\";\nimport { inject, ref, type Ref } from \"vue\";\nimport {\n MERGE_TAGS_KEY,\n MERGE_TAG_SYNTAX_KEY,\n MERGE_TAG_AUTOCOMPLETE_KEY,\n MERGE_TAG_PICKER_KEY,\n ON_REQUEST_MERGE_TAG_KEY,\n} from \"../keys\";\n\nexport interface UseMergeTagReturn {\n /** Available merge tags from config */\n mergeTags: MergeTag[];\n /** Whether a merge tag request is in progress */\n isRequesting: Ref<boolean>;\n /**\n * Whether the \"Insert merge tag\" button should be shown. True when\n * either `onRequestMergeTag` is provided or `mergeTags.tags` is\n * non-empty (the built-in picker then handles the click).\n */\n canRequestMergeTag: boolean;\n /** Whether typing-based autocomplete is enabled by configuration */\n autocomplete: boolean;\n /** The resolved syntax preset for merge tags */\n syntax: SyntaxPreset;\n /** Check if a value matches the configured merge tag syntax */\n isMergeTagValue: (value: string) => boolean;\n /** Get the human-readable label for a merge tag value */\n getMergeTagLabel: (value: string) => string;\n /**\n * Request a merge tag from the user. Precedence: when\n * `onRequestMergeTag` is set it owns the UX; otherwise the built-in\n * picker opens with the configured `mergeTags.tags`; otherwise null.\n */\n requestMergeTag: () => Promise<MergeTag | null>;\n}\n\n/**\n * Composable for merge tag functionality.\n * Provides utilities for detecting, displaying, and requesting merge tags.\n */\nexport function useMergeTag(): UseMergeTagReturn {\n const mergeTags = inject(MERGE_TAGS_KEY, []);\n const syntax = inject(MERGE_TAG_SYNTAX_KEY, SYNTAX_PRESETS.liquid);\n const onRequestMergeTag = inject(ON_REQUEST_MERGE_TAG_KEY, null);\n const autocomplete = inject(MERGE_TAG_AUTOCOMPLETE_KEY, true);\n // Picker may be null in headless contexts (tests, non-editor consumers).\n // requestMergeTag() returns null in that case rather than throwing.\n const picker = inject(MERGE_TAG_PICKER_KEY, null);\n\n const isRequesting = ref(false);\n\n function isMergeTagValue(value: string): boolean {\n return checkIsMergeTagValue(value, syntax);\n }\n\n function getMergeTagLabel(value: string): string {\n return resolveMergeTagLabel(value, mergeTags);\n }\n\n /**\n * Request a merge tag from the user. Precedence:\n * 1. `onRequestMergeTag` callback (consumer-owned UX)\n * 2. Built-in picker over `mergeTags.tags`\n * 3. null (nothing configured)\n */\n async function requestMergeTag(): Promise<MergeTag | null> {\n if (onRequestMergeTag) {\n isRequesting.value = true;\n try {\n return await onRequestMergeTag();\n } finally {\n isRequesting.value = false;\n }\n }\n if (mergeTags.length > 0 && picker) {\n isRequesting.value = true;\n try {\n return await picker.open(mergeTags);\n } finally {\n isRequesting.value = false;\n }\n }\n return null;\n }\n\n const canRequestMergeTag = !!onRequestMergeTag || mergeTags.length > 0;\n\n return {\n mergeTags,\n isRequesting,\n canRequestMergeTag,\n autocomplete,\n syntax,\n isMergeTagValue,\n getMergeTagLabel,\n requestMergeTag,\n };\n}\n"],"mappings":";;;;AA8CA,SAAgB,IAAiC;CAC/C,IAAM,IAAY,EAAO,GAAgB,CAAC,CAAC,GACrC,IAAS,EAAO,GAAsB,EAAe,MAAM,GAC3D,IAAoB,EAAO,GAA0B,IAAI,GACzD,IAAe,EAAO,GAA4B,EAAI,GAGtD,IAAS,EAAO,GAAsB,IAAI,GAE1C,IAAe,EAAI,EAAK;CAE9B,SAAS,EAAgB,GAAwB;EAC/C,OAAO,EAAqB,GAAO,CAAM;CAC3C;CAEA,SAAS,EAAiB,GAAuB;EAC/C,OAAO,EAAqB,GAAO,CAAS;CAC9C;CAQA,eAAe,IAA4C;EACzD,IAAI,GAAmB;GACrB,EAAa,QAAQ;GACrB,IAAI;IACF,OAAO,MAAM,EAAkB;GACjC,UAAU;IACR,EAAa,QAAQ;GACvB;EACF;EACA,IAAI,EAAU,SAAS,KAAK,GAAQ;GAClC,EAAa,QAAQ;GACrB,IAAI;IACF,OAAO,MAAM,EAAO,KAAK,CAAS;GACpC,UAAU;IACR,EAAa,QAAQ;GACvB;EACF;EACA,OAAO;CACT;CAIA,OAAO;EACL;EACA;EACA,oBALyB,CAAC,CAAC,KAAqB,EAAU,SAAS;EAMnE;EACA;EACA,iBAAA;EACA,kBAAA;EACA;CACF;AACF"}
1
+ {"version":3,"file":"useMergeTag-JmXOtpln.js","names":[],"sources":["../../../src/composables/useMergeTag.ts"],"sourcesContent":["import type { MergeTag, SyntaxPreset } from \"@templatical/types\";\nimport {\n isMergeTagValue as checkIsMergeTagValue,\n getMergeTagLabel as resolveMergeTagLabel,\n SYNTAX_PRESETS,\n} from \"@templatical/types\";\nimport { inject, ref, type Ref } from \"vue\";\nimport {\n MERGE_TAGS_KEY,\n MERGE_TAG_SYNTAX_KEY,\n MERGE_TAG_AUTOCOMPLETE_KEY,\n MERGE_TAG_PICKER_KEY,\n ON_REQUEST_MERGE_TAG_KEY,\n} from \"../keys\";\n\nexport interface UseMergeTagReturn {\n /** Available merge tags from config */\n mergeTags: MergeTag[];\n /** Whether a merge tag request is in progress */\n isRequesting: Ref<boolean>;\n /**\n * Whether the \"Insert merge tag\" button should be shown. True when\n * either `onRequestMergeTag` is provided or `mergeTags.tags` is\n * non-empty (the built-in picker then handles the click).\n */\n canRequestMergeTag: boolean;\n /** Whether typing-based autocomplete is enabled by configuration */\n autocomplete: boolean;\n /** The resolved syntax preset for merge tags */\n syntax: SyntaxPreset;\n /** Check if a value matches the configured merge tag syntax */\n isMergeTagValue: (value: string) => boolean;\n /** Get the human-readable label for a merge tag value */\n getMergeTagLabel: (value: string) => string;\n /**\n * Request a merge tag from the user. Precedence: when\n * `onRequestMergeTag` is set it owns the UX; otherwise the built-in\n * picker opens with the configured `mergeTags.tags`; otherwise null.\n */\n requestMergeTag: () => Promise<MergeTag | null>;\n}\n\n/**\n * Composable for merge tag functionality.\n * Provides utilities for detecting, displaying, and requesting merge tags.\n */\nexport function useMergeTag(): UseMergeTagReturn {\n const mergeTags = inject(MERGE_TAGS_KEY, []);\n const syntax = inject(MERGE_TAG_SYNTAX_KEY, SYNTAX_PRESETS.liquid);\n const onRequestMergeTag = inject(ON_REQUEST_MERGE_TAG_KEY, null);\n const autocomplete = inject(MERGE_TAG_AUTOCOMPLETE_KEY, true);\n // Picker may be null in headless contexts (tests, non-editor consumers).\n // requestMergeTag() returns null in that case rather than throwing.\n const picker = inject(MERGE_TAG_PICKER_KEY, null);\n\n const isRequesting = ref(false);\n\n function isMergeTagValue(value: string): boolean {\n return checkIsMergeTagValue(value, syntax);\n }\n\n function getMergeTagLabel(value: string): string {\n return resolveMergeTagLabel(value, mergeTags);\n }\n\n /**\n * Request a merge tag from the user. Precedence:\n * 1. `onRequestMergeTag` callback (consumer-owned UX)\n * 2. Built-in picker over `mergeTags.tags`\n * 3. null (nothing configured)\n */\n async function requestMergeTag(): Promise<MergeTag | null> {\n if (onRequestMergeTag) {\n isRequesting.value = true;\n try {\n return await onRequestMergeTag();\n } finally {\n isRequesting.value = false;\n }\n }\n if (mergeTags.length > 0 && picker) {\n isRequesting.value = true;\n try {\n return await picker.open(mergeTags);\n } finally {\n isRequesting.value = false;\n }\n }\n return null;\n }\n\n const canRequestMergeTag = !!onRequestMergeTag || mergeTags.length > 0;\n\n return {\n mergeTags,\n isRequesting,\n canRequestMergeTag,\n autocomplete,\n syntax,\n isMergeTagValue,\n getMergeTagLabel,\n requestMergeTag,\n };\n}\n"],"mappings":";;;;AA8CA,SAAgB,IAAiC;CAC/C,IAAM,IAAY,EAAO,GAAgB,CAAC,CAAC,GACrC,IAAS,EAAO,GAAsB,EAAe,MAAM,GAC3D,IAAoB,EAAO,GAA0B,IAAI,GACzD,IAAe,EAAO,GAA4B,EAAI,GAGtD,IAAS,EAAO,GAAsB,IAAI,GAE1C,IAAe,EAAI,EAAK;CAE9B,SAAS,EAAgB,GAAwB;EAC/C,OAAO,EAAqB,GAAO,CAAM;CAC3C;CAEA,SAAS,EAAiB,GAAuB;EAC/C,OAAO,EAAqB,GAAO,CAAS;CAC9C;CAQA,eAAe,IAA4C;EACzD,IAAI,GAAmB;GACrB,EAAa,QAAQ;GACrB,IAAI;IACF,OAAO,MAAM,EAAkB;GACjC,UAAU;IACR,EAAa,QAAQ;GACvB;EACF;EACA,IAAI,EAAU,SAAS,KAAK,GAAQ;GAClC,EAAa,QAAQ;GACrB,IAAI;IACF,OAAO,MAAM,EAAO,KAAK,CAAS;GACpC,UAAU;IACR,EAAa,QAAQ;GACvB;EACF;EACA,OAAO;CACT;CAIA,OAAO;EACL;EACA;EACA,oBALyB,CAAC,CAAC,KAAqB,EAAU,SAAS;EAMnE;EACA;EACA,iBAAA;EACA,kBAAA;EACA;CACF;AACF"}
@@ -1,11 +1,11 @@
1
1
  import { A as e, C as t, H as n, M as r, V as i, Z as a, b as o, ct as s, g as c, h as l, it as u, j as d, l as f, lt as p, m, n as ee, p as h, r as g, s as _, st as v, v as y, x as b, y as x } from "./chunks/draggable-DCs9qL-b.js";
2
2
  import { r as S } from "./chunks/timeouts-SsLMC4a3.js";
3
- import { R as C, b as w } from "./chunks/src-DsvVSm7Z.js";
4
- import { F as T, R as E, b as te, t as ne, w as D } from "./chunks/useEditorCore-fyFmWS3D.js";
3
+ import { R as C, b as w } from "./chunks/src-B_QJduQD.js";
4
+ import { F as T, R as E, b as te, t as ne, w as D } from "./chunks/useEditorCore-CKQ9gmoo.js";
5
5
  import { I as re, M as ie } from "./chunks/icons-CvYN6zrM.js";
6
6
  import { t as O } from "./chunks/_plugin-vue_export-helper-B3ysoDQm.js";
7
- import { a as ae, c as oe, d as se, f as ce, i as le, l as ue, m as de, n as fe, o as pe, p as k, r as me, s as he, t as ge, u as _e } from "./chunks/styles-DEU_sn3k.js";
8
- import { n as ve, t as ye } from "./chunks/MergeTagModeToggle-ClGdRNpZ.js";
7
+ import { a as ae, c as oe, d as se, f as ce, i as le, l as ue, m as de, n as fe, o as pe, p as k, r as me, s as he, t as ge, u as _e } from "./chunks/styles-CND3ey2g.js";
8
+ import { n as ve, t as ye } from "./chunks/MergeTagModeToggle-DQ79SqQc.js";
9
9
  //#region src/Editor.vue?vue&type=script&setup=true&lang.ts
10
10
  var be = ["data-tpl-theme"], A = {
11
11
  class: "tpl-header tpl:absolute tpl:top-0 tpl:right-0 tpl:left-0 tpl:z-50 tpl:grid tpl:h-14 tpl:grid-cols-[1fr_auto_1fr] tpl:items-center tpl:px-4 tpl:shadow-[var(--tpl-shadow-md)] tpl:border-b tpl:border-[var(--tpl-border)]",
@@ -30,12 +30,12 @@ var be = ["data-tpl-theme"], A = {
30
30
  provider: b.config.savedBlocks,
31
31
  editor: S,
32
32
  onError: b.config.onError
33
- }) : null, T = o(() => import("./chunks/SavedBlocksPanels-WYrSyf-l.js")), D = b.config.testEmail ? ce({
33
+ }) : null, T = o(() => import("./chunks/SavedBlocksPanels-e4HyTZ8v.js")), D = b.config.testEmail ? ce({
34
34
  provider: b.config.testEmail,
35
35
  getContent: () => S.content.value,
36
36
  renderMjml: F,
37
37
  onError: b.config.onError
38
- }) : null, O = o(() => import("./chunks/TestEmailPanel-CpK5t4E3.js")), P = ne({
38
+ }) : null, O = o(() => import("./chunks/TestEmailPanel-CZAG1gQE.js")), P = ne({
39
39
  editor: S,
40
40
  containerEl: C,
41
41
  config: {
@@ -332,7 +332,7 @@ function $(e) {
332
332
  async function Ne(e) {
333
333
  let n = typeof e.container == "string" ? document.querySelector(e.container) : e.container;
334
334
  if (!n) throw Error(`[Templatical] Container element not found: ${e.container}`);
335
- let { default: r } = await import("./chunks/CloudEditor-Ddnatfuw.js"), [i, o] = await Promise.all([G(e.locale ?? "en"), we(e.locale ?? "en")]), s = D(e.fonts);
335
+ let { default: r } = await import("./chunks/CloudEditor-CQ830jJt.js"), [i, o] = await Promise.all([G(e.locale ?? "en"), we(e.locale ?? "en")]), s = D(e.fonts);
336
336
  $(n);
337
337
  let c = q(n, e.shadowDom ?? !0), l = a(null);
338
338
  return await new Promise((a, u) => {
@@ -1,5 +1,5 @@
1
1
  import { I as e, J as t, K as n, Y as r, q as i, s as a } from "./vue.runtime.esm-bundler-D1diBMsm.js";
2
- import { o, p as s } from "./dist-BvYvG5SQ.js";
2
+ import { o, p as s } from "./dist-B1kLn1rs.js";
3
3
  //#region ../core/dist/cloud/index.js
4
4
  var c = class e {
5
5
  static DEFAULT_BASE_URL = "https://templatical.com";
@@ -326,12 +326,12 @@ function I(e = {}) {
326
326
  styles: C()
327
327
  }, e);
328
328
  }
329
- function ne(e) {
329
+ function L(e) {
330
330
  return e.type === "repeatable" ? e.default ?? [] : e.type === "boolean" ? e.default ?? !1 : e.type === "number" ? e.default ?? 0 : e.default ?? "";
331
331
  }
332
- function re(e) {
332
+ function ne(e) {
333
333
  let t = {};
334
- for (let n of e.fields) t[n.key] = ne(n);
334
+ for (let n of e.fields) t[n.key] = L(n);
335
335
  let n = x(C(), e.defaultStyles);
336
336
  return {
337
337
  id: S(),
@@ -342,7 +342,7 @@ function re(e) {
342
342
  ...e.dataSource ? { dataSourceFetched: !1 } : {}
343
343
  };
344
344
  }
345
- function ie(e, t) {
345
+ function re(e, t) {
346
346
  switch (e) {
347
347
  case "section": return k(t?.section);
348
348
  case "title": return w(t?.title);
@@ -360,11 +360,11 @@ function ie(e, t) {
360
360
  default: throw Error(`Unknown block type: ${e}`);
361
361
  }
362
362
  }
363
- function L(e) {
363
+ function R(e) {
364
364
  let t = JSON.parse(JSON.stringify(e));
365
- return t.id = S(), t.type === "section" && (t.children = t.children.map((e) => e.map((e) => L(e)))), t;
365
+ return t.id = S(), t.type === "section" && (t.children = t.children.map((e) => e.map((e) => R(e)))), t;
366
366
  }
367
- function ae(e) {
367
+ function ie(e) {
368
368
  let t = /* @__PURE__ */ new WeakSet();
369
369
  return JSON.parse(JSON.stringify(e, (e, n) => {
370
370
  if (typeof n == "object" && n) {
@@ -374,8 +374,8 @@ function ae(e) {
374
374
  return n;
375
375
  }));
376
376
  }
377
- var R = /* @__PURE__ */ new Set(["\"", "'"]);
378
- function z(e, t) {
377
+ var z = /* @__PURE__ */ new Set(["\"", "'"]);
378
+ function ae(e, t) {
379
379
  let n = null;
380
380
  for (let r = t; r < e.length; r++) {
381
381
  let t = e[r];
@@ -383,7 +383,7 @@ function z(e, t) {
383
383
  t === n && (n = null);
384
384
  continue;
385
385
  }
386
- if (R.has(t)) {
386
+ if (z.has(t)) {
387
387
  n = t;
388
388
  continue;
389
389
  }
@@ -397,7 +397,24 @@ function B(e) {
397
397
  function V(e) {
398
398
  return e === " " || e === " " || e === "\n" || e === "\r" || e === "\f";
399
399
  }
400
- function H(e, t) {
400
+ var H = {
401
+ amp: "&",
402
+ lt: "<",
403
+ gt: ">",
404
+ quot: "\"",
405
+ apos: "'",
406
+ nbsp: "\xA0"
407
+ };
408
+ function U(e) {
409
+ return e.includes("&") ? e.replace(/&(#[0-9]+|#[xX][0-9a-fA-F]+|[a-zA-Z][a-zA-Z0-9]*);/g, (e, t) => {
410
+ if (t[0] === "#") {
411
+ let n = t[1] === "x" || t[1] === "X" ? Number.parseInt(t.slice(2), 16) : Number.parseInt(t.slice(1), 10);
412
+ return !Number.isFinite(n) || n < 1 || n > 1114111 || n >= 55296 && n <= 57343 ? e : String.fromCodePoint(n);
413
+ }
414
+ return H[t.toLowerCase()] ?? e;
415
+ }) : e;
416
+ }
417
+ function W(e, t) {
401
418
  let n = t.toLowerCase(), r = 0;
402
419
  for (; r < e.length;) {
403
420
  for (; r < e.length && (V(e[r]) || e[r] === "/");) r++;
@@ -413,20 +430,20 @@ function H(e, t) {
413
430
  if (e[r] !== "=") continue;
414
431
  for (r++; r < e.length && V(e[r]);) r++;
415
432
  let a = e[r];
416
- if (R.has(a)) {
433
+ if (z.has(a)) {
417
434
  let t = r + 1, o = e.indexOf(a, t);
418
435
  if (o === -1) return null;
419
- if (i === n) return e.substring(t, o);
436
+ if (i === n) return U(e.substring(t, o));
420
437
  r = o + 1;
421
438
  continue;
422
439
  }
423
440
  let o = r;
424
441
  for (; r < e.length && !V(e[r]) && e[r] !== ">";) r++;
425
- if (i === n) return e.substring(o, r);
442
+ if (i === n) return U(e.substring(o, r));
426
443
  }
427
444
  return null;
428
445
  }
429
- var U = {
446
+ var G = {
430
447
  liquid: {
431
448
  value: /\{\{.+?\}\}/g,
432
449
  logic: /\{%-?\s*(\w+).*?-?%\}/g
@@ -443,33 +460,33 @@ var U = {
443
460
  value: /%%=.+?=%%/g,
444
461
  logic: /%%\[\s*(\w+).*?\]%%/g
445
462
  }
446
- }, W = {
463
+ }, K = {
447
464
  liquid: "{{",
448
465
  handlebars: "{{",
449
466
  mailchimp: "*|",
450
467
  ampscript: "%%="
451
- }, G = {
468
+ }, q = {
452
469
  liquid: "}}",
453
470
  handlebars: "}}",
454
471
  mailchimp: "|*",
455
472
  ampscript: "=%%"
456
473
  };
457
- function K(e) {
458
- for (let t of Object.keys(U)) if (U[t].value.source === e.value.source) return W[t];
474
+ function oe(e) {
475
+ for (let t of Object.keys(G)) if (G[t].value.source === e.value.source) return K[t];
459
476
  return null;
460
477
  }
461
- function q(e) {
462
- for (let t of Object.keys(U)) if (U[t].value.source === e.value.source) return G[t];
478
+ function se(e) {
479
+ for (let t of Object.keys(G)) if (G[t].value.source === e.value.source) return q[t];
463
480
  return null;
464
481
  }
465
- function oe(e) {
466
- return e ? typeof e == "string" ? U[e] ?? U.liquid : e : U.liquid;
482
+ function ce(e) {
483
+ return e ? typeof e == "string" ? G[e] ?? G.liquid : e : G.liquid;
467
484
  }
468
485
  function J(e) {
469
486
  let t = e.source, n = e.flags.replace("g", "");
470
487
  return RegExp(`^${t}$`, n);
471
488
  }
472
- function se(e, t) {
489
+ function le(e, t) {
473
490
  let n = e?.trim() || "";
474
491
  return !J(t.logic).test(n) && J(t.value).test(n);
475
492
  }
@@ -477,40 +494,40 @@ function Y(e, t) {
477
494
  let n = t.find((t) => t.value === e);
478
495
  return n ? n.label : e;
479
496
  }
480
- function ce(e, t) {
497
+ function ue(e, t) {
481
498
  return $(e, "data-merge-tag", (e) => Y(e, t));
482
499
  }
483
500
  function X(e, t) {
484
501
  return t.find((t) => t.value === e)?.sample;
485
502
  }
486
- function Z(e, t) {
487
- return $(e, "data-merge-tag", (e) => de(X(e, t) ?? Y(e, t)), { unwrap: (e) => X(e, t) !== void 0 });
503
+ function de(e, t) {
504
+ return $(e, "data-merge-tag", (e) => me(X(e, t) ?? Y(e, t)), { unwrap: (e) => X(e, t) !== void 0 });
488
505
  }
489
- function le(e) {
506
+ function fe(e) {
490
507
  return e.some((e) => e.sample !== void 0);
491
508
  }
492
- function ue(e, t) {
509
+ function pe(e, t) {
493
510
  if (!e) return e;
494
511
  let n = e;
495
512
  for (let e of t) e.sample !== void 0 && (n = n.split(e.value).join(e.sample));
496
513
  return n;
497
514
  }
498
- function de(e) {
515
+ function me(e) {
499
516
  return e.replace(/&/g, "&amp;").replace(/</g, "&lt;").replace(/>/g, "&gt;").replace(/"/g, "&quot;");
500
517
  }
501
- function fe(e, t) {
518
+ function he(e, t) {
502
519
  if (!e) return !1;
503
520
  let n = new RegExp(t.value.source, t.value.flags), r = new RegExp(t.logic.source, t.logic.flags);
504
521
  return n.test(e) || r.test(e);
505
522
  }
506
- function pe(e, t) {
523
+ function Z(e, t) {
507
524
  return J(t.logic).test(e?.trim() || "");
508
525
  }
509
526
  function Q(e, t) {
510
527
  let n = new RegExp(t.logic.source, t.logic.flags.replace("g", "")), r = e.match(n);
511
528
  return r && r[1] ? r[1].toUpperCase() : e;
512
529
  }
513
- function me(e, t) {
530
+ function ge(e, t) {
514
531
  return $(e, "data-logic-merge-tag", (e) => Q(e, t));
515
532
  }
516
533
  function $(e, t, n, r) {
@@ -526,7 +543,7 @@ function $(e, t, n, r) {
526
543
  i += e.substring(a, o + 5), a = o + 5;
527
544
  continue;
528
545
  }
529
- let c = z(e, o + 5);
546
+ let c = ae(e, o + 5);
530
547
  if (c === -1) {
531
548
  i += e.substring(a);
532
549
  break;
@@ -536,7 +553,7 @@ function $(e, t, n, r) {
536
553
  i += e.substring(a);
537
554
  break;
538
555
  }
539
- let u = H(e.substring(o + 5, c), t);
556
+ let u = W(e.substring(o + 5, c), t);
540
557
  if (u === null) {
541
558
  i += e.substring(a, o + 5), a = o + 5;
542
559
  continue;
@@ -546,12 +563,12 @@ function $(e, t, n, r) {
546
563
  }
547
564
  return i;
548
565
  }
549
- function he(e) {
566
+ function _e(e) {
550
567
  if (typeof e != "object" || !e) return !1;
551
568
  let t = e;
552
569
  return Array.isArray(t.blocks);
553
570
  }
554
- var ge = class extends Error {
571
+ var ve = class extends Error {
555
572
  statusCode;
556
573
  constructor(e, t) {
557
574
  super(e), this.statusCode = t, this.name = "SdkError";
@@ -567,4 +584,4 @@ var ge = class extends Error {
567
584
  }
568
585
  };
569
586
  //#endregion
570
- export { K as A, Z as B, w as C, Y as D, Q as E, he as F, me as I, ce as L, n as M, pe as N, X as O, se as P, oe as R, F as S, S as T, ue as V, P as _, U as a, j as b, fe as c, I as d, re as f, E as g, N as h, t as i, le as j, q as k, ie as l, O as m, _ as n, ge as o, b as p, e as r, L as s, g as t, D as u, T as v, A as w, M as x, k as y, ae as z };
587
+ export { oe as A, de as B, w as C, Y as D, Q as E, _e as F, ge as I, ue as L, n as M, Z as N, X as O, le as P, ce as R, F as S, S as T, pe as V, P as _, G as a, j as b, he as c, I as d, ne as f, E as g, N as h, t as i, fe as j, se as k, re as l, O as m, _ as n, ve as o, b as p, e as r, R as s, g as t, D as u, T as v, A as w, M as x, k as y, ie as z };
@@ -1,8 +1,8 @@
1
1
  import { Dt as e, Et as t, O as n, Ot as r, R as i, Y as a, _ as o, c as s, d as c, l, nt as u, s as d, u as f, w as p, z as m } from "./vue.runtime.esm-bundler-D1diBMsm.js";
2
2
  import { a as h, c as g, s as _ } from "./runtime-dom.esm-bundler-CepEmvwF.js";
3
- import { D as v, E as y, N as b, a as x } from "./dist-BvYvG5SQ.js";
3
+ import { D as v, E as y, N as b, a as x } from "./dist-B1kLn1rs.js";
4
4
  import { t as S } from "./useI18n-DoVKdCTH.js";
5
- import { t as C } from "./useMergeTag-B9xG9EJ7.js";
5
+ import { t as C } from "./useMergeTag-CYZk7dZD.js";
6
6
  import { gn as w, m as T, s as E, u as D, v as O } from "./dist-ChYLhoJ4.js";
7
7
  import { i as k, r as A, t as j } from "./MergeTagSuggestion-BJ43ihWR.js";
8
8
  import { n as M, t as N } from "./dist-Cl8J0IES.js";
@@ -195,10 +195,12 @@ var U = T.create({
195
195
  return {
196
196
  value: {
197
197
  default: "",
198
+ rendered: !1,
198
199
  parseHTML: (e) => e.getAttribute("data-logic-merge-tag") || ""
199
200
  },
200
201
  keyword: {
201
202
  default: "",
203
+ rendered: !1,
202
204
  parseHTML: (e) => e.getAttribute("data-keyword") || e.textContent || ""
203
205
  }
204
206
  };
@@ -356,10 +358,12 @@ var U = T.create({
356
358
  return {
357
359
  label: {
358
360
  default: "",
361
+ rendered: !1,
359
362
  parseHTML: (e) => e.getAttribute("data-label") || e.textContent || ""
360
363
  },
361
364
  value: {
362
365
  default: "",
366
+ rendered: !1,
363
367
  parseHTML: (e) => e.getAttribute("data-merge-tag") || ""
364
368
  }
365
369
  };
@@ -1,8 +1,8 @@
1
1
  import { A as e, Dt as t, Et as n, H as r, I as i, K as a, N as o, O as s, Ot as c, R as l, W as u, Y as d, _ as f, c as p, d as m, g as h, h as g, j as _, k as v, l as y, m as b, nt as x, q as S, r as C, s as w, u as T, w as E, x as D, y as O, z as k } from "./vue.runtime.esm-bundler-D1diBMsm.js";
2
2
  import { a as A, c as j, o as M, s as N, t as P } from "./runtime-dom.esm-bundler-CepEmvwF.js";
3
3
  import { t as F } from "./upload-sVqqppuv.js";
4
- import { A as ee, E as I, M as L, N as R, T as z, a as B, c as V, f as te, k as ne, l as re, s as ie } from "./dist-BvYvG5SQ.js";
5
- import { B as ae, F as oe, I as H, J as se, K as ce, L as le, N as ue, U as de, V as fe, _ as pe, a as me, b as he, c as ge, f as _e, g as ve, h as ye, i as be, k as xe, l as Se, m as Ce, n as we, o as Te, p as Ee, r as De, s as Oe, u as ke, v as Ae, w as je, y as Me, z as Ne } from "./useEditorCore-CbcmGpwp.js";
4
+ import { A as ee, E as I, M as L, N as R, T as z, a as B, c as V, f as te, k as ne, l as re, s as ie } from "./dist-B1kLn1rs.js";
5
+ import { B as ae, F as oe, I as H, J as se, K as ce, L as le, N as ue, U as de, V as fe, _ as pe, a as me, b as he, c as ge, f as _e, g as ve, h as ye, i as be, k as xe, l as Se, m as Ce, n as we, o as Te, p as Ee, r as De, s as Oe, u as ke, v as Ae, w as je, y as Me, z as Ne } from "./useEditorCore-idmPLUeb.js";
6
6
  import { c as Pe, m as Fe } from "./dist-BpKxrUi2.js";
7
7
  import { a as Ie, n as Le } from "./usePopoverPosition-C0dPEF4X.js";
8
8
  import { A as Re, B as ze, G as Be, H as Ve, I as He, M as Ue, O as We, P as Ge, R as Ke, T as qe, U as Je, V as Ye, W as Xe, c as Ze, f as Qe, g as $e, h as et, k as tt, m as nt, n as rt, o as it, p as at, r as ot, s as st, u as ct, v as lt } from "./keys-fwF3qZax.js";
@@ -11,27 +11,27 @@ import { t as W } from "./createLucideIcon-C8WzBYCv.js";
11
11
  import { n as ut, t as dt } from "./scan-line-DwSVj25O.js";
12
12
  import { t as ft } from "./chevron-down-69EiBGoB.js";
13
13
  import { t as pt } from "./circle-alert-cilwzafX.js";
14
- import { i as mt, n as ht, r as gt, t as _t } from "./blockTypeIcons-BnCXsB2I.js";
14
+ import { i as mt, n as ht, r as gt, t as _t } from "./blockTypeIcons-2_85L_CL.js";
15
15
  import { n as vt, t as yt } from "./refresh-cw-CkOYVzK5.js";
16
16
  import { t as bt } from "./image-up-Ceggh_R3.js";
17
17
  import { t as xt } from "./info-DO5odBcZ.js";
18
18
  import { t as St } from "./list-checks-BSkPKbuI.js";
19
19
  import { t as Ct } from "./loader-circle-bO7o7_HD.js";
20
- import { i as wt, r as Tt } from "./MergeTagModeToggle-D0t5NHBZ.js";
20
+ import { i as wt, r as Tt } from "./MergeTagModeToggle-P-UguQHc.js";
21
21
  import { t as Et } from "./sparkles-DumaWRW-.js";
22
22
  import { n as Dt, r as Ot, t as kt } from "./text-align-start-Ir8Ah4mT.js";
23
23
  import { t as At } from "./trash-2-CklAFCmO.js";
24
24
  import { t as jt } from "./x-Mby7KlhS.js";
25
25
  import { t as Mt } from "./_plugin-vue_export-helper-B3ysoDQm.js";
26
26
  import { t as Nt } from "./useCloudI18n-DKVm6PCa.js";
27
- import { t as Pt } from "./useMergeTag-B9xG9EJ7.js";
27
+ import { t as Pt } from "./useMergeTag-CYZk7dZD.js";
28
28
  import { t as Ft } from "./useAliveFlag-cvyBxHp7.js";
29
29
  import { n as It, t as Lt } from "./emailFrameWidth-BmFCN2dp.js";
30
30
  import { t as Rt } from "./readableTextColor-f8Kykfnh.js";
31
31
  import { _ as zt, f as G, g as Bt, h as K, i as Vt, l as Ht, m as q, n as Ut, p as J, t as Y, u as Wt } from "./ColorPicker-ClETsjA3.js";
32
32
  import { n as Gt, r as Kt } from "./MergeTagSuggestion-BJ43ihWR.js";
33
33
  import { i as X, n as Z, r as Q, t as qt } from "./NumberWithSuffix-D37ZWiZh.js";
34
- import { t as Jt } from "./TplModal-Bym-Kf_i.js";
34
+ import { t as Jt } from "./TplModal-DoneXIj_.js";
35
35
  var Yt = W("circle", [["circle", {
36
36
  cx: "12",
37
37
  cy: "12",
@@ -1,10 +1,10 @@
1
1
  import { D as e, Dt as t, E as n, Et as r, O as i, Ot as a, R as o, Y as s, _ as c, c as l, d as u, g as d, h as f, l as p, m, nt as h, u as g, y as _, z as v } from "./vue.runtime.esm-bundler-D1diBMsm.js";
2
2
  import { c as y, n as b, o as x, t as ee } from "./runtime-dom.esm-bundler-CepEmvwF.js";
3
3
  import { i as S } from "./upload-sVqqppuv.js";
4
- import { p as C, z as w } from "./dist-BvYvG5SQ.js";
5
- import { G as T, T as E, q as te, t as ne, x as re } from "./useEditorCore-CbcmGpwp.js";
6
- import { a as ie, c as ae, d as oe, f as se, h as ce, i as le, l as ue, m as de, n as fe, o as pe, p as D, r as me, s as he, t as ge, u as _e } from "./styles-DbP2S8Z1.js";
7
- import { n as ve, t as ye } from "./MergeTagModeToggle-D0t5NHBZ.js";
4
+ import { p as C, z as w } from "./dist-B1kLn1rs.js";
5
+ import { G as T, T as E, q as te, t as ne, x as re } from "./useEditorCore-idmPLUeb.js";
6
+ import { a as ie, c as ae, d as oe, f as se, h as ce, i as le, l as ue, m as de, n as fe, o as pe, p as D, r as me, s as he, t as ge, u as _e } from "./styles-BK36D1sy.js";
7
+ import { n as ve, t as ye } from "./MergeTagModeToggle-P-UguQHc.js";
8
8
  import { t as be } from "./send-CWsWN8PQ.js";
9
9
  import { t as O } from "./_plugin-vue_export-helper-B3ysoDQm.js";
10
10
  //#region src/Editor.vue?vue&type=script&setup=true&lang.ts
@@ -31,12 +31,12 @@ var xe = ["data-tpl-theme"], k = {
31
31
  provider: b.config.savedBlocks,
32
32
  editor: S,
33
33
  onError: b.config.onError
34
- }) : null, T = d(() => import("./SavedBlocksPanels-B7pBiZcc.js")), E = b.config.testEmail ? se({
34
+ }) : null, T = d(() => import("./SavedBlocksPanels-CQsZvWO_.js")), E = b.config.testEmail ? se({
35
35
  provider: b.config.testEmail,
36
36
  getContent: () => S.content.value,
37
37
  renderMjml: P,
38
38
  onError: b.config.onError
39
- }) : null, O = d(() => import("./TestEmailPanel-B-SXSnRg.js")), N = ne({
39
+ }) : null, O = d(() => import("./TestEmailPanel-B6goIAxT.js")), N = ne({
40
40
  editor: S,
41
41
  containerEl: C,
42
42
  config: {
@@ -333,7 +333,7 @@ function $(e) {
333
333
  async function Ne(e) {
334
334
  let t = typeof e.container == "string" ? document.querySelector(e.container) : e.container;
335
335
  if (!t) throw Error(`[Templatical] Container element not found: ${e.container}`);
336
- let { default: n } = await import("./CloudEditor-DM3RRCVn.js"), [r, i] = await Promise.all([W(e.locale ?? "en"), Te(e.locale ?? "en")]), a = E(e.fonts);
336
+ let { default: n } = await import("./CloudEditor-DEnMNMbm.js"), [r, i] = await Promise.all([W(e.locale ?? "en"), Te(e.locale ?? "en")]), a = E(e.fonts);
337
337
  $(t);
338
338
  let o = q(t, e.shadowDom ?? !0), c = s(null);
339
339
  return await new Promise((s, l) => {
@@ -1,7 +1,7 @@
1
1
  import { $ as e, A as t, B as n, D as r, Dt as i, E as a, Et as o, H as s, I as c, J as l, K as u, N as d, O as f, Ot as p, R as m, T as h, W as g, Y as _, Z as v, _ as y, c as b, d as x, et as S, g as C, h as w, j as T, k as E, l as D, m as O, nt as k, q as A, r as j, rt as ee, s as M, tt as N, u as P, v as te, w as ne, x as F, y as re, z as ie } from "./vue.runtime.esm-bundler-D1diBMsm.js";
2
2
  import { c as I, o as ae, s as oe } from "./runtime-dom.esm-bundler-CepEmvwF.js";
3
3
  import { t as se } from "./upload-sVqqppuv.js";
4
- import { A as ce, B as le, C as ue, D as de, E as fe, F as pe, I as me, L as he, M as ge, N as _e, O as ve, P as ye, R as be, S as xe, T as Se, V as Ce, _ as we, a as Te, b as Ee, c as De, d as Oe, f as ke, g as Ae, h as je, i as Me, j as Ne, l as Pe, m as Fe, n as Ie, o as Le, p as Re, r as ze, t as Be, u as Ve, v as He, w as Ue, x as We, y as Ge, z as Ke } from "./dist-BvYvG5SQ.js";
4
+ import { A as ce, B as le, C as ue, D as de, E as fe, F as pe, I as me, L as he, M as ge, N as _e, O as ve, P as ye, R as be, S as xe, T as Se, V as Ce, _ as we, a as Te, b as Ee, c as De, d as Oe, f as ke, g as Ae, h as je, i as Me, j as Ne, l as Pe, m as Fe, n as Ie, o as Le, p as Re, r as ze, t as Be, u as Ve, v as He, w as Ue, x as We, y as Ge, z as Ke } from "./dist-B1kLn1rs.js";
5
5
  import { f as qe, g as Je, h as Ye, m as Xe } from "./dist-BpKxrUi2.js";
6
6
  import { a as Ze, c as Qe, d as $e, i as et, l as tt, o as nt, r as rt, t as it, u as at } from "./usePopoverPosition-C0dPEF4X.js";
7
7
  import { A as ot, B as st, C as ct, D as lt, E as ut, F as dt, G as ft, H as pt, I as mt, L as ht, M as gt, N as _t, O as vt, P as yt, S as bt, T as xt, U as St, V as Ct, W as wt, _ as Tt, a as Et, b as Dt, c as Ot, f as kt, g as At, h as jt, j as Mt, k as Nt, m as Pt, n as Ft, o as It, p as Lt, r as Rt, s as zt, u as Bt, v as Vt, w as Ht, x as Ut, y as Wt } from "./keys-fwF3qZax.js";
@@ -14,7 +14,7 @@ import { t as Yt } from "./triangle-alert-BBi4n93g.js";
14
14
  import { t as Xt } from "./LoadingTrack-BexpNuTV.js";
15
15
  import { t as Zt } from "./_plugin-vue_export-helper-B3ysoDQm.js";
16
16
  import "./useCloudI18n-DKVm6PCa.js";
17
- import { t as Qt } from "./useMergeTag-B9xG9EJ7.js";
17
+ import { t as Qt } from "./useMergeTag-CYZk7dZD.js";
18
18
  import { t as $t } from "./useAliveFlag-cvyBxHp7.js";
19
19
  //#region ../core/dist/index.js
20
20
  function en(e) {
@@ -2411,7 +2411,7 @@ var wi = ["innerHTML"], Ti = /* @__PURE__ */ y({
2411
2411
  viewport: {}
2412
2412
  },
2413
2413
  setup(e) {
2414
- let t = e, n = C(() => import("./ParagraphEditor-B-CYrQMY.js")), { isEditing: r, blockRef: i, toolbarPosition: a, resolvedContent: o, handleDoubleClick: s, handleEditorDone: c } = Ci(() => t.block.content);
2414
+ let t = e, n = C(() => import("./ParagraphEditor-CLvv5Ija.js")), { isEditing: r, blockRef: i, toolbarPosition: a, resolvedContent: o, handleDoubleClick: s, handleEditorDone: c } = Ci(() => t.block.content);
2415
2415
  return (t, l) => (f(), x("div", {
2416
2416
  ref_key: "blockRef",
2417
2417
  ref: i,
@@ -2651,7 +2651,7 @@ var Wi = /* @__PURE__ */ y({
2651
2651
  viewport: {}
2652
2652
  },
2653
2653
  setup(e) {
2654
- let t = e, n = C(() => import("./TitleEditor-DmoaKooA.js")), { isEditing: r, blockRef: a, toolbarPosition: o, resolvedContent: s, handleDoubleClick: c, handleEditorDone: l } = Ci(() => t.block.content), u = M(() => {
2654
+ let t = e, n = C(() => import("./TitleEditor-JEaP9jVF.js")), { isEditing: r, blockRef: a, toolbarPosition: o, resolvedContent: s, handleDoubleClick: c, handleEditorDone: l } = Ci(() => t.block.content), u = M(() => {
2655
2655
  let e = {
2656
2656
  fontSize: `${ze[t.block.level]}px`,
2657
2657
  textAlign: t.block.textAlign
@@ -1,5 +1,5 @@
1
1
  import { Y as e, x as t } from "./vue.runtime.esm-bundler-D1diBMsm.js";
2
- import { D as n, P as r, a as i } from "./dist-BvYvG5SQ.js";
2
+ import { D as n, P as r, a as i } from "./dist-B1kLn1rs.js";
3
3
  import { A as a, D as o, E as s, N as c, O as l } from "./keys-fwF3qZax.js";
4
4
  //#region src/composables/useMergeTag.ts
5
5
  function u() {
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@templatical/editor",
3
3
  "description": "Vue 3 visual drag-and-drop email editor powered by Templatical",
4
- "version": "0.26.1",
4
+ "version": "0.26.2",
5
5
  "bugs": "https://github.com/templatical/sdk/issues",
6
6
  "devDependencies": {
7
7
  "@lucide/vue": "^1.31.0",
@@ -32,9 +32,9 @@
32
32
  "vue": "^3.5.41",
33
33
  "vue-draggable-plus": "^0.6.1",
34
34
  "vue-tsc": "^3.3.10",
35
- "@templatical/core": "0.26.1",
36
- "@templatical/types": "0.26.1",
37
- "@templatical/quality": "0.26.1"
35
+ "@templatical/core": "0.26.2",
36
+ "@templatical/quality": "0.26.2",
37
+ "@templatical/types": "0.26.2"
38
38
  },
39
39
  "exports": {
40
40
  ".": {
@@ -62,9 +62,9 @@
62
62
  "license": "SEE LICENSE IN LICENSE",
63
63
  "module": "./dist/templatical-editor.js",
64
64
  "peerDependencies": {
65
- "@templatical/media-library": "0.26.1",
66
- "@templatical/renderer": "0.26.1",
67
- "@templatical/quality": "0.26.1"
65
+ "@templatical/media-library": "0.26.2",
66
+ "@templatical/quality": "0.26.2",
67
+ "@templatical/renderer": "0.26.2"
68
68
  },
69
69
  "peerDependenciesMeta": {
70
70
  "@templatical/renderer": {
@@ -1 +0,0 @@
1
- {"version":3,"file":"extensions-CZAB08kD.js","names":[],"sources":["../../../src/extensions/FontSize.ts","../../../src/extensions/LetterSpacing.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"],"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\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 hover:tpl: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 hover:tpl: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 value: {\n default: \"\",\n parseHTML: (element) =>\n element.getAttribute(\"data-logic-merge-tag\") || \"\",\n },\n keyword: {\n default: \"\",\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, 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 { getMergeTagLabel } = useMergeTag();\nconst { t } = useI18n();\n\nconst displayLabel = computed(() => getMergeTagLabel(props.node.attrs.value));\n\nconst isEditing = ref(false);\nconst editValue = ref(\"\");\nconst inputRef = ref<HTMLInputElement | null>(null);\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\nfunction finishEditing(): void {\n const newValue = editValue.value.trim();\n if (newValue && newValue !== props.node.attrs.value) {\n // Update with new value and derive label from it\n props.updateAttributes({\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 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 class=\"tpl:w-32 tpl:rounded tpl:border-none 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 @blur=\"finishEditing\"\n @keydown=\"handleKeydown\"\n />\n <!-- Display mode -->\n <span\n v-else\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 {{ 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 hover:tpl: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, 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 { getMergeTagLabel } = useMergeTag();\nconst { t } = useI18n();\n\nconst displayLabel = computed(() => getMergeTagLabel(props.node.attrs.value));\n\nconst isEditing = ref(false);\nconst editValue = ref(\"\");\nconst inputRef = ref<HTMLInputElement | null>(null);\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\nfunction finishEditing(): void {\n const newValue = editValue.value.trim();\n if (newValue && newValue !== props.node.attrs.value) {\n // Update with new value and derive label from it\n props.updateAttributes({\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 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 class=\"tpl:w-32 tpl:rounded tpl:border-none 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 @blur=\"finishEditing\"\n @keydown=\"handleKeydown\"\n />\n <!-- Display mode -->\n <span\n v-else\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 {{ 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 hover:tpl: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 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 label: {\n default: \"\",\n parseHTML: (element) =>\n element.getAttribute(\"data-label\") || element.textContent || \"\",\n },\n value: {\n default: \"\",\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"],"mappings":"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"}