@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.
- package/dist/{AiChatSidebar-B_fwa6zc.js → AiChatSidebar-CMBz6Wix.js} +1 -1
- package/dist/{AiFeatureMenu-BBBKsYD4.js → AiFeatureMenu-BY6mubnR.js} +1 -1
- package/dist/{BlockPreviewCanvas-zyyq2de0.js → BlockPreviewCanvas-DbNOqSI1.js} +1 -1
- package/dist/{CloudEditor-DM3RRCVn.js → CloudEditor-DEnMNMbm.js} +8 -8
- package/dist/{CollaboratorBar-Coj8Ebwf.js → CollaboratorBar-zvfvE7f-.js} +1 -1
- package/dist/{DesignReferenceSidebar-hDXOvGoV.js → DesignReferenceSidebar-Bx96XFmK.js} +1 -1
- package/dist/{MergeTagModeToggle-D0t5NHBZ.js → MergeTagModeToggle-P-UguQHc.js} +1 -1
- package/dist/{ParagraphEditor-B-CYrQMY.js → ParagraphEditor-CLvv5Ija.js} +2 -2
- package/dist/{SaveBlockDialog-CoVPZfUv.js → SaveBlockDialog-fVp_PwZi.js} +3 -3
- package/dist/{SavedBlocksBrowserModal-DX13xw0O.js → SavedBlocksBrowserModal-KWlaiLlr.js} +4 -4
- package/dist/{SavedBlocksPanels-B7pBiZcc.js → SavedBlocksPanels-CQsZvWO_.js} +1 -1
- package/dist/{SavedBlocksPickBar-ZfqXByph.js → SavedBlocksPickBar-C3h8oL3r.js} +1 -1
- package/dist/{SnapshotHistory-BxABntv5.js → SnapshotHistory-DjA3Ej_i.js} +1 -1
- package/dist/{TestEmailModal-Db4qheuy.js → TestEmailModal-EM0RP_9L.js} +5 -5
- package/dist/{TestEmailPanel-B-SXSnRg.js → TestEmailPanel-B6goIAxT.js} +1 -1
- package/dist/{TitleEditor-DmoaKooA.js → TitleEditor-JEaP9jVF.js} +2 -2
- package/dist/{TplModal-Bym-Kf_i.js → TplModal-DoneXIj_.js} +1 -1
- package/dist/{blockTypeIcons-BnCXsB2I.js → blockTypeIcons-2_85L_CL.js} +1 -1
- package/dist/bundle-stats.json +6 -6
- package/dist/cdn/chunks/{AiChatSidebar-CFvS4-EZ.js → AiChatSidebar-CQ8KUmNB.js} +2 -2
- package/dist/cdn/chunks/{AiChatSidebar-CFvS4-EZ.js.map → AiChatSidebar-CQ8KUmNB.js.map} +1 -1
- package/dist/cdn/chunks/{AiFeatureMenu-a0gBZiJ9.js → AiFeatureMenu-Cwj8afsi.js} +2 -2
- package/dist/cdn/chunks/{AiFeatureMenu-a0gBZiJ9.js.map → AiFeatureMenu-Cwj8afsi.js.map} +1 -1
- package/dist/cdn/chunks/{BlockPreviewCanvas-C27XK2q0.js → BlockPreviewCanvas-DPtiMsVz.js} +2 -2
- package/dist/cdn/chunks/{BlockPreviewCanvas-C27XK2q0.js.map → BlockPreviewCanvas-DPtiMsVz.js.map} +1 -1
- package/dist/cdn/chunks/{CloudEditor-Ddnatfuw.js → CloudEditor-CQ830jJt.js} +11 -11
- package/dist/cdn/chunks/{CloudEditor-Ddnatfuw.js.map → CloudEditor-CQ830jJt.js.map} +1 -1
- package/dist/cdn/chunks/{CollaboratorBar-C5Xf6Mz9.js → CollaboratorBar-BF469_AN.js} +2 -2
- package/dist/cdn/chunks/{CollaboratorBar-C5Xf6Mz9.js.map → CollaboratorBar-BF469_AN.js.map} +1 -1
- package/dist/cdn/chunks/{DesignReferenceSidebar-CZiP00JN.js → DesignReferenceSidebar-B-HFXV0W.js} +2 -2
- package/dist/cdn/chunks/{DesignReferenceSidebar-CZiP00JN.js.map → DesignReferenceSidebar-B-HFXV0W.js.map} +1 -1
- package/dist/cdn/chunks/{MergeTagModeToggle-ClGdRNpZ.js → MergeTagModeToggle-DQ79SqQc.js} +2 -2
- package/dist/cdn/chunks/{MergeTagModeToggle-ClGdRNpZ.js.map → MergeTagModeToggle-DQ79SqQc.js.map} +1 -1
- package/dist/cdn/chunks/{ParagraphEditor-BNc146Pp.js → ParagraphEditor-Bzcma_Lm.js} +3 -3
- package/dist/cdn/chunks/{ParagraphEditor-BNc146Pp.js.map → ParagraphEditor-Bzcma_Lm.js.map} +1 -1
- package/dist/cdn/chunks/{SaveBlockDialog-ogieDQp7.js → SaveBlockDialog-BfNVeXXV.js} +4 -4
- package/dist/cdn/chunks/{SaveBlockDialog-ogieDQp7.js.map → SaveBlockDialog-BfNVeXXV.js.map} +1 -1
- package/dist/cdn/chunks/{SavedBlocksBrowserModal-DSpZcT_T.js → SavedBlocksBrowserModal-C59D4G5C.js} +4 -4
- package/dist/cdn/chunks/{SavedBlocksBrowserModal-DSpZcT_T.js.map → SavedBlocksBrowserModal-C59D4G5C.js.map} +1 -1
- package/dist/cdn/chunks/{SavedBlocksPanels-WYrSyf-l.js → SavedBlocksPanels-e4HyTZ8v.js} +2 -2
- package/dist/cdn/chunks/{SavedBlocksPanels-WYrSyf-l.js.map → SavedBlocksPanels-e4HyTZ8v.js.map} +1 -1
- package/dist/cdn/chunks/{SavedBlocksPickBar-DGbLBG5P.js → SavedBlocksPickBar-DMHxPCM4.js} +2 -2
- package/dist/cdn/chunks/{SavedBlocksPickBar-DGbLBG5P.js.map → SavedBlocksPickBar-DMHxPCM4.js.map} +1 -1
- package/dist/cdn/chunks/{SnapshotHistory-VyL4tJwn.js → SnapshotHistory-80tAU_VX.js} +2 -2
- package/dist/cdn/chunks/{SnapshotHistory-VyL4tJwn.js.map → SnapshotHistory-80tAU_VX.js.map} +1 -1
- package/dist/cdn/chunks/{TestEmailModal-DRte11oT.js → TestEmailModal-DdWfAGNe.js} +6 -6
- package/dist/cdn/chunks/{TestEmailModal-DRte11oT.js.map → TestEmailModal-DdWfAGNe.js.map} +1 -1
- package/dist/cdn/chunks/{TestEmailPanel-CpK5t4E3.js → TestEmailPanel-CZAG1gQE.js} +2 -2
- package/dist/cdn/chunks/{TestEmailPanel-CpK5t4E3.js.map → TestEmailPanel-CZAG1gQE.js.map} +1 -1
- package/dist/cdn/chunks/{TitleEditor-EkDchueW.js → TitleEditor-D0_LY2Ex.js} +3 -3
- package/dist/cdn/chunks/{TitleEditor-EkDchueW.js.map → TitleEditor-D0_LY2Ex.js.map} +1 -1
- package/dist/cdn/chunks/{TplModal-BGLstO3F.js → TplModal-iCmoKB2k.js} +2 -2
- package/dist/cdn/chunks/{TplModal-BGLstO3F.js.map → TplModal-iCmoKB2k.js.map} +1 -1
- package/dist/cdn/chunks/{cloud-CNpvDuv7.js → cloud-DcC8bPwn.js} +2 -2
- package/dist/cdn/chunks/{cloud-CNpvDuv7.js.map → cloud-DcC8bPwn.js.map} +1 -1
- package/dist/cdn/chunks/{extensions-CZAB08kD.js → extensions-C7h52yuk.js} +7 -3
- package/dist/cdn/chunks/extensions-C7h52yuk.js.map +1 -0
- package/dist/cdn/chunks/{src-DsvVSm7Z.js → src-B_QJduQD.js} +162 -145
- package/dist/cdn/chunks/{src-DsvVSm7Z.js.map → src-B_QJduQD.js.map} +1 -1
- package/dist/cdn/chunks/{src-COnW7gMq.js → src-CUKUsRzX.js} +3 -3
- package/dist/cdn/chunks/{src-COnW7gMq.js.map → src-CUKUsRzX.js.map} +1 -1
- package/dist/cdn/chunks/{src-DzH5U9Vm.js → src-Cx70q30o.js} +2 -2
- package/dist/cdn/chunks/{src-DzH5U9Vm.js.map → src-Cx70q30o.js.map} +1 -1
- package/dist/cdn/chunks/{src-BRRRFqXr.js → src-xkGep9eN.js} +2 -2
- package/dist/cdn/chunks/{src-BRRRFqXr.js.map → src-xkGep9eN.js.map} +1 -1
- package/dist/cdn/chunks/{styles-DEU_sn3k.js → styles-CND3ey2g.js} +6 -6
- package/dist/cdn/chunks/{styles-DEU_sn3k.js.map → styles-CND3ey2g.js.map} +1 -1
- package/dist/cdn/chunks/{useEditorCore-fyFmWS3D.js → useEditorCore-CKQ9gmoo.js} +6 -6
- package/dist/cdn/chunks/{useEditorCore-fyFmWS3D.js.map → useEditorCore-CKQ9gmoo.js.map} +1 -1
- package/dist/cdn/chunks/{useMergeTag-DjQoCGEz.js → useMergeTag-JmXOtpln.js} +2 -2
- package/dist/cdn/chunks/{useMergeTag-DjQoCGEz.js.map → useMergeTag-JmXOtpln.js.map} +1 -1
- package/dist/cdn/editor.js +7 -7
- package/dist/{cloud-4SuOLNTK.js → cloud-qINCmQbn.js} +1 -1
- package/dist/{dist-BvYvG5SQ.js → dist-B1kLn1rs.js} +55 -38
- package/dist/{extensions-Dz5jj0wf.js → extensions-DzKNPITR.js} +6 -2
- package/dist/{styles-DbP2S8Z1.js → styles-BK36D1sy.js} +6 -6
- package/dist/templatical-editor.js +7 -7
- package/dist/{useEditorCore-CbcmGpwp.js → useEditorCore-idmPLUeb.js} +4 -4
- package/dist/{useMergeTag-B9xG9EJ7.js → useMergeTag-CYZk7dZD.js} +1 -1
- package/package.json +7 -7
- 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-
|
|
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-
|
|
46
|
+
//# sourceMappingURL=useMergeTag-JmXOtpln.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"useMergeTag-
|
|
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"}
|
package/dist/cdn/editor.js
CHANGED
|
@@ -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-
|
|
4
|
-
import { F as T, R as E, b as te, t as ne, w as D } from "./chunks/useEditorCore-
|
|
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-
|
|
8
|
-
import { n as ve, t as ye } from "./chunks/MergeTagModeToggle-
|
|
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-
|
|
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-
|
|
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-
|
|
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-
|
|
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
|
|
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
|
|
332
|
+
function ne(e) {
|
|
333
333
|
let t = {};
|
|
334
|
-
for (let n of e.fields) t[n.key] =
|
|
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
|
|
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
|
|
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) =>
|
|
365
|
+
return t.id = S(), t.type === "section" && (t.children = t.children.map((e) => e.map((e) => R(e)))), t;
|
|
366
366
|
}
|
|
367
|
-
function
|
|
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
|
|
378
|
-
function
|
|
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 (
|
|
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
|
-
|
|
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 (
|
|
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
|
|
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
|
-
},
|
|
463
|
+
}, K = {
|
|
447
464
|
liquid: "{{",
|
|
448
465
|
handlebars: "{{",
|
|
449
466
|
mailchimp: "*|",
|
|
450
467
|
ampscript: "%%="
|
|
451
|
-
},
|
|
468
|
+
}, q = {
|
|
452
469
|
liquid: "}}",
|
|
453
470
|
handlebars: "}}",
|
|
454
471
|
mailchimp: "|*",
|
|
455
472
|
ampscript: "=%%"
|
|
456
473
|
};
|
|
457
|
-
function
|
|
458
|
-
for (let t of Object.keys(
|
|
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
|
|
462
|
-
for (let t of Object.keys(
|
|
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
|
|
466
|
-
return e ? typeof e == "string" ?
|
|
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
|
|
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
|
|
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
|
|
487
|
-
return $(e, "data-merge-tag", (e) =>
|
|
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
|
|
506
|
+
function fe(e) {
|
|
490
507
|
return e.some((e) => e.sample !== void 0);
|
|
491
508
|
}
|
|
492
|
-
function
|
|
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
|
|
515
|
+
function me(e) {
|
|
499
516
|
return e.replace(/&/g, "&").replace(/</g, "<").replace(/>/g, ">").replace(/"/g, """);
|
|
500
517
|
}
|
|
501
|
-
function
|
|
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
|
|
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
|
|
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 =
|
|
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 =
|
|
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
|
|
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
|
|
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 {
|
|
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-
|
|
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-
|
|
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-
|
|
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-
|
|
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-
|
|
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-
|
|
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-
|
|
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-
|
|
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-
|
|
5
|
-
import { G as T, T as E, q as te, t as ne, x as re } from "./useEditorCore-
|
|
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-
|
|
7
|
-
import { n as ve, t as ye } from "./MergeTagModeToggle-
|
|
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-
|
|
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-
|
|
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-
|
|
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-
|
|
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-
|
|
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-
|
|
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-
|
|
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-
|
|
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.
|
|
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.
|
|
36
|
-
"@templatical/
|
|
37
|
-
"@templatical/
|
|
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.
|
|
66
|
-
"@templatical/
|
|
67
|
-
"@templatical/
|
|
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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"}
|