@useinsider/guido 3.11.0-beta.181af4d → 3.11.0-beta.1fde696

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 (49) hide show
  1. package/dist/@types/config/schemas.js +59 -52
  2. package/dist/components/organisms/header/AutoSaveToggle.vue.js +22 -0
  3. package/dist/components/organisms/header/AutoSaveToggle.vue2.js +19 -0
  4. package/dist/components/organisms/header/EditorActions.vue.js +11 -11
  5. package/dist/components/organisms/header/EditorActions.vue2.js +50 -34
  6. package/dist/components/organisms/header/HeaderWrapper.vue.js +3 -3
  7. package/dist/components/organisms/header/HeaderWrapper.vue2.js +0 -2
  8. package/dist/components/organisms/header/MiddleSlot.vue.js +4 -4
  9. package/dist/components/organisms/header/MiddleSlot.vue2.js +7 -8
  10. package/dist/components/organisms/header/RightSlot.vue.js +8 -8
  11. package/dist/components/organisms/header/RightSlot.vue2.js +15 -15
  12. package/dist/components/organisms/header/version-history/VersionHistory.vue.js +1 -1
  13. package/dist/composables/useModuleDynamicContentRepair.js +36 -0
  14. package/dist/composables/useStripo.js +62 -59
  15. package/dist/config/i18n/en/labels.json.js +0 -17
  16. package/dist/guido.css +1 -1
  17. package/dist/node_modules/@vueuse/shared/index.js +28 -40
  18. package/dist/src/@types/config/schemas.d.ts +36 -4
  19. package/dist/src/composables/useActionsApi.d.ts +2 -2
  20. package/dist/src/composables/useConfig.d.ts +18 -2
  21. package/dist/src/composables/useHtmlValidator.test.d.ts +1 -0
  22. package/dist/src/composables/useModuleDynamicContentRepair.d.ts +18 -0
  23. package/dist/src/config/compiler/utils/recommendationIgnoreUtils.test.d.ts +1 -0
  24. package/dist/src/stores/config.d.ts +162 -18
  25. package/dist/src/stores/editor.d.ts +0 -105
  26. package/dist/src/stores/version-history.d.ts +1 -1
  27. package/dist/src/utils/dynamicContentConverter.d.ts +31 -0
  28. package/dist/src/utils/genericUtil.d.ts +7 -0
  29. package/dist/src/utils/timeUtil.d.ts +0 -10
  30. package/dist/stores/editor.js +1 -5
  31. package/dist/utils/dynamicContentConverter.js +33 -0
  32. package/dist/utils/genericUtil.js +26 -19
  33. package/dist/utils/timeUtil.js +17 -6
  34. package/package.json +1 -5
  35. package/dist/components/organisms/header/AutoSaveStatus.vue.js +0 -17
  36. package/dist/components/organisms/header/AutoSaveStatus.vue2.js +0 -21
  37. package/dist/components/organisms/header/EditorActionsMenu.vue.js +0 -20
  38. package/dist/components/organisms/header/EditorActionsMenu.vue2.js +0 -39
  39. package/dist/components/organisms/header/accessibility/AccessibilityToolbar.vue.js +0 -18
  40. package/dist/components/organisms/header/accessibility/AccessibilityToolbar.vue2.js +0 -37
  41. package/dist/components/organisms/header/accessibility/ColorVisionSelect.vue.js +0 -24
  42. package/dist/components/organisms/header/accessibility/ColorVisionSelect.vue2.js +0 -48
  43. package/dist/composables/useAccessibilityApi.js +0 -31
  44. package/dist/node_modules/@vueuse/core/index.js +0 -102
  45. package/dist/src/components/organisms/header/EditorActionsMenu.vue.d.ts +0 -2
  46. package/dist/src/components/organisms/header/accessibility/AccessibilityToolbar.vue.d.ts +0 -2
  47. package/dist/src/components/organisms/header/accessibility/ColorVisionSelect.vue.d.ts +0 -2
  48. package/dist/src/composables/useAccessibilityApi.d.ts +0 -15
  49. /package/dist/src/components/organisms/header/{AutoSaveStatus.vue.d.ts → AutoSaveToggle.vue.d.ts} +0 -0
@@ -0,0 +1,36 @@
1
+ import { useConfig as D } from "./useConfig.js";
2
+ import { useToaster as T } from "./useToaster.js";
3
+ import { useTranslations as g } from "./useTranslations.js";
4
+ import { ToasterTypeOptions as C } from "../enums/toaster.js";
5
+ import { buildDynamicContentLookup as h, convertModuleDynamicContent as O } from "../utils/dynamicContentConverter.js";
6
+ const M = "dynamic-content.unresolved-attributes-on-drop", A = () => {
7
+ const { template: i, isFeatureEnabled: p } = D(), { showToaster: a } = T(), m = g();
8
+ return { handleModuleAdd: (n, e) => {
9
+ var s, c, l;
10
+ try {
11
+ if ((n == null ? void 0 : n.action) !== "ADD" && (n == null ? void 0 : n.action) !== "COPY")
12
+ return;
13
+ const o = h(((s = i.value) == null ? void 0 : s.availableDynamicContent) ?? []);
14
+ if (o.size === 0)
15
+ return;
16
+ const t = (c = e == null ? void 0 : e.getTargetNode) == null ? void 0 : c.call(e), r = (l = t == null ? void 0 : t.getOuterHTML) == null ? void 0 : l.call(t);
17
+ if (!t || typeof r != "string")
18
+ return;
19
+ const { html: u, unresolved: y } = O(
20
+ r,
21
+ o,
22
+ p("liquidSyntax")
23
+ );
24
+ u !== r && e.modifyHtml(t).replaceWith(u), y.length > 0 && a({
25
+ type: C.Warning,
26
+ message: m(M)
27
+ });
28
+ } catch (o) {
29
+ console.error("Failed to repair dynamic content on module add:", o);
30
+ }
31
+ } };
32
+ };
33
+ export {
34
+ M as UNRESOLVED_DYNAMIC_CONTENT_ON_DROP_KEY,
35
+ A as useModuleDynamicContentRepair
36
+ };
@@ -1,44 +1,45 @@
1
- import { useActionsApi as U } from "./useActionsApi.js";
2
- import { useBlocksConfig as R } from "./useBlocksConfig.js";
3
- import { useConfig as x } from "./useConfig.js";
4
- import { useCustomInterfaceAppearance as O } from "./useCustomInterfaceAppearance.js";
5
- import { useFullStoryBridge as q } from "./useFullStoryBridge.js";
6
- import { useStripoEventHandler as H } from "./useStripoEventHandler.js";
7
- import { useStripoNotifications as N } from "./useStripoNotifications.js";
8
- import { useToaster as z } from "./useToaster.js";
9
- import { localePatch as L } from "../config/i18n/index.js";
10
- import { en as h } from "../config/i18n/en/index.js";
11
- import { ToasterTypeOptions as $ } from "../enums/toaster.js";
12
- import { useStripoApi as G } from "../services/stripoApi.js";
13
- import J from "../static/styles/customEditorStyle.css.js";
14
- import { useEditorStore as E } from "../stores/editor.js";
15
- import { dynamicContentToMergeTags as X } from "../utils/genericUtil.js";
16
- import j from "../package.json.js";
17
- const fo = (C, l) => {
18
- const { features: c, template: w, isFeatureEnabled: u } = x(), { handleError: m, showToaster: b } = z(), { getToken: T, getCustomFonts: k, getSyncModulesStatus: B } = G(), { handleEvent: F } = H(), { getStripoBlocksConfig: v } = R(), { getStripoNotifications: V } = N(), _ = async (s, i = [], r = !1) => {
19
- var g, S, y;
20
- const o = E(), { html: p, css: a } = s, { baseBlocks: t, extensions: d } = await v(), f = ((g = c.value) == null ? void 0 : g.displayConditions) ?? !0, M = ((S = c.value) == null ? void 0 : S.modulesDisabled) ?? !1, P = ((y = w.value) == null ? void 0 : y.forceRecreate) ?? !1;
1
+ import { useActionsApi as x } from "./useActionsApi.js";
2
+ import { useBlocksConfig as O } from "./useBlocksConfig.js";
3
+ import { useConfig as q } from "./useConfig.js";
4
+ import { useCustomInterfaceAppearance as H } from "./useCustomInterfaceAppearance.js";
5
+ import { useFullStoryBridge as N } from "./useFullStoryBridge.js";
6
+ import { useModuleDynamicContentRepair as z } from "./useModuleDynamicContentRepair.js";
7
+ import { useStripoEventHandler as L } from "./useStripoEventHandler.js";
8
+ import { useStripoNotifications as $ } from "./useStripoNotifications.js";
9
+ import { useToaster as G } from "./useToaster.js";
10
+ import { localePatch as J } from "../config/i18n/index.js";
11
+ import { en as C } from "../config/i18n/en/index.js";
12
+ import { ToasterTypeOptions as X } from "../enums/toaster.js";
13
+ import { useStripoApi as j } from "../services/stripoApi.js";
14
+ import K from "../static/styles/customEditorStyle.css.js";
15
+ import { useEditorStore as w } from "../stores/editor.js";
16
+ import { buildMergeTagEntries as Q } from "../utils/genericUtil.js";
17
+ import W from "../package.json.js";
18
+ const ye = (b, l) => {
19
+ const { features: c, template: u, isFeatureEnabled: m } = q(), { handleError: p, showToaster: k } = G(), { getToken: v, getCustomFonts: T, getSyncModulesStatus: B } = j(), { handleEvent: F } = L(), { handleModuleAdd: M } = z(), { getStripoBlocksConfig: A } = O(), { getStripoNotifications: V } = $(), _ = async (s, i = [], r = !1) => {
20
+ var S, y, h, E;
21
+ const e = w(), { html: f, css: a } = s, { baseBlocks: t, extensions: d } = await A(), g = ((S = c.value) == null ? void 0 : S.displayConditions) ?? !0, P = ((y = c.value) == null ? void 0 : y.modulesDisabled) ?? !1, I = ((h = u.value) == null ? void 0 : h.forceRecreate) ?? !1;
21
22
  await window.UIEditor.initEditor(
22
23
  document.querySelector("#guido-editor"),
23
24
  {
24
- metadata: C,
25
- html: p,
25
+ metadata: b,
26
+ html: f,
26
27
  css: a,
27
- forceRecreate: P,
28
+ forceRecreate: I,
28
29
  locale: "en",
29
30
  undoButtonSelector: "#guido__undo-button",
30
31
  redoButtonSelector: "#guido__redo-button",
31
32
  mobileViewButtonSelector: ".guido__view-option-selection-mobile",
32
33
  desktopViewButtonSelector: ".guido__view-option-selection-desktop",
33
34
  codeEditorButtonSelector: "#guido__code-button",
34
- customAppearanceMergetags: !u("liquidSyntax"),
35
+ customAppearanceMergetags: !m("liquidSyntax"),
35
36
  customAppearanceMergetagsBorderColor: "#f1f3fe",
36
37
  customAppearanceMergetagsBackgroundColor: "#f1f3fe",
37
- customViewStyles: J,
38
- conditionsEnabled: f,
39
- customConditionsEnabled: f,
38
+ customViewStyles: K,
39
+ conditionsEnabled: g,
40
+ customConditionsEnabled: g,
40
41
  enableXSSSecurity: !0,
41
- modulesDisabled: M,
42
+ modulesDisabled: P,
42
43
  syncModulesEnabled: r,
43
44
  messageSettingsEnabled: !0,
44
45
  displayGmailAnnotations: !0,
@@ -56,43 +57,45 @@ const fo = (C, l) => {
56
57
  },
57
58
  mergeTags: [
58
59
  {
59
- entries: X(
60
+ entries: Q(
60
61
  l.preselectedDynamicContentList,
61
- u("liquidSyntax")
62
+ ((E = u.value) == null ? void 0 : E.availableDynamicContent) ?? [],
63
+ m("liquidSyntax")
62
64
  )
63
65
  }
64
66
  ],
65
- async onTokenRefreshRequest(e) {
67
+ async onTokenRefreshRequest(o) {
66
68
  try {
67
- const n = await T();
68
- e(n);
69
+ const n = await v();
70
+ o(n);
69
71
  } catch (n) {
70
- m(n, "Failed to refresh token");
72
+ p(n, "Failed to refresh token");
71
73
  }
72
74
  },
73
75
  onTemplateLoaded() {
74
76
  try {
75
- const { importCss: e } = O(), { activateCustomViewStyles: n, updateTimerInClonedTemplate: D } = U(), { injectFullStory: I } = q();
76
- e(), n(), I(), D(), l.onReady(), o.isStripoInitialized = !0, o.loadingStatus = !1, setTimeout(() => {
77
- o.hasChanges = !1;
77
+ const { importCss: o } = H(), { activateCustomViewStyles: n, updateTimerInClonedTemplate: R } = x(), { injectFullStory: U } = N();
78
+ o(), n(), U(), R(), l.onReady(), e.isStripoInitialized = !0, e.loadingStatus = !1, setTimeout(() => {
79
+ e.hasChanges = !1;
78
80
  }, 1e3);
79
- } catch (e) {
80
- m(e, "Failed to load custom interface appearance");
81
+ } catch (o) {
82
+ p(o, "Failed to load custom interface appearance");
81
83
  }
82
84
  },
83
- onCodeEditorVisibilityChanged(e) {
84
- o.isCodeEditorOpen = e;
85
+ onCodeEditorVisibilityChanged(o) {
86
+ e.isCodeEditorOpen = o;
85
87
  },
86
- onEditorVisualModeChanged(e) {
87
- o.editorVisualMode = e.toLowerCase();
88
+ onEditorVisualModeChanged(o) {
89
+ e.editorVisualMode = o.toLowerCase();
88
90
  },
89
- onVersionHistoryVisibilityChanged(e) {
90
- o.isVersionHistoryOpen = e;
91
+ onVersionHistoryVisibilityChanged(o) {
92
+ e.isVersionHistoryOpen = o;
91
93
  },
92
94
  onDataChanged() {
93
- o.hasChanges = !0;
95
+ e.hasChanges = !0;
94
96
  },
95
97
  onEvent: F,
98
+ onModuleAdd: M,
96
99
  notifications: V(),
97
100
  ignoreClickOutsideSelectors: [
98
101
  "#guido-dynamic-content-modal",
@@ -100,16 +103,16 @@ const fo = (C, l) => {
100
103
  ".in-drawer__container"
101
104
  ],
102
105
  extensions: d,
103
- localePatch: L
106
+ localePatch: J
104
107
  }
105
108
  );
106
- }, A = (s) => new Promise((i, r) => {
109
+ }, D = (s) => new Promise((i, r) => {
107
110
  var d;
108
111
  if (document.getElementById("UiEditorScript")) {
109
112
  Promise.resolve(s()).then(i, r);
110
113
  return;
111
114
  }
112
- const o = j.guido, a = `https://email-static.useinsider.com/guido/${(d = o == null ? void 0 : o.stripo) == null ? void 0 : d.version}/UIEditor.js`, t = document.createElement("script");
115
+ const e = W.guido, a = `https://email-static.useinsider.com/guido/${(d = e == null ? void 0 : e.stripo) == null ? void 0 : d.version}/UIEditor.js`, t = document.createElement("script");
113
116
  t.id = "UiEditorScript", t.type = "module", t.src = a, t.onload = () => {
114
117
  Promise.resolve(s()).then(i, r);
115
118
  }, t.onerror = () => {
@@ -117,21 +120,21 @@ const fo = (C, l) => {
117
120
  }, document.body.appendChild(t);
118
121
  });
119
122
  return { initPlugin: async (s) => {
120
- const i = E();
123
+ const i = w();
121
124
  try {
122
- await A(async () => {
123
- const [r, o] = await Promise.all([
124
- k(),
125
+ await D(async () => {
126
+ const [r, e] = await Promise.all([
127
+ T(),
125
128
  B()
126
129
  ]);
127
- i.syncModulesEnabled = o, await _(s, r, o);
130
+ i.syncModulesEnabled = e, await _(s, r, e);
128
131
  });
129
132
  } catch {
130
- i.loadingStatus = !1, b({
131
- type: $.Error,
132
- message: h["An error has occurred. Please report the error code to support."],
133
+ i.loadingStatus = !1, k({
134
+ type: X.Error,
135
+ message: C["An error has occurred. Please report the error code to support."],
133
136
  actionButton: {
134
- text: h["Reload page"],
137
+ text: C["Reload page"],
135
138
  onClick: () => window.location.reload()
136
139
  }
137
140
  });
@@ -139,5 +142,5 @@ const fo = (C, l) => {
139
142
  } };
140
143
  };
141
144
  export {
142
- fo as useStripo
145
+ ye as useStripo
143
146
  };
@@ -5,23 +5,6 @@ const e = "Items", o = {
5
5
  Items: e,
6
6
  "This block is switched from the Old Version to the New Version. We recommend you check the Recommendation block and test your message to ensure it works properly.": "This block is switched from the Old Version to the New Version. We recommend you check the Recommendation block and test your message to ensure it works properly.",
7
7
  "This block is switched from the Old Version to the New Version. We recommend you check the Items block and test your message to ensure it works properly.": "This block is switched from the Old Version to the New Version. We recommend you check the Items block and test your message to ensure it works properly.",
8
- "email-editor.a11y-hide-images": "Hide images",
9
- "email-editor.a11y-show-images": "Show images",
10
- "email-editor.cvd-none": "No Color Deficiency",
11
- "email-editor.cvd-protanopia": "Protanopia",
12
- "email-editor.cvd-protanopia-description": "Causes red-green confusion and makes reds appear darker.",
13
- "email-editor.cvd-deuteranopia": "Deuteranopia",
14
- "email-editor.cvd-deuteranopia-description": "Causes red-green confusion.",
15
- "email-editor.cvd-tritanopia": "Tritanopia",
16
- "email-editor.cvd-tritanopia-description": "Causes blue-yellow confusion.",
17
- "email-editor.cvd-achromatopsia": "Achromatopsia",
18
- "email-editor.cvd-achromatopsia-description": "Causes complete color blindness.",
19
- "email-editor.more-actions": "More actions",
20
- "email-editor.preferences": "Preferences",
21
- "email-editor.actions": "Actions",
22
- "email-editor.accessibility-test": "Accessibility Test",
23
- "email-editor.autosaved-at-today": "Autosaved at {time}, Today",
24
- "email-editor.autosaved-at-date": "Autosaved at {date}",
25
8
  "Pixel Tracking Opt-in": "Pixel Tracking Opt-in",
26
9
  "OPT-IN SELECTION": "OPT-IN SELECTION",
27
10
  "UNSUBSCRIBE GROUPS": "UNSUBSCRIBE GROUPS"
package/dist/guido.css CHANGED
@@ -1 +1 @@
1
- .gap-16[data-v-5553d071],.gap-16[data-v-0e1b0c54]{gap:16px}[data-v-73199fa4] .in-button-v2__wrapper{line-height:0}[data-v-22226124] .in-segments-wrapper__button_selected,[data-v-22226124] .in-segments-wrapper__button_selected:hover{background-color:#dae1fb;color:#0010ac;border-color:#0010ac}[data-v-2cb418af] .in-progress-wrapper__progress p span:last-child{display:none!important}[data-v-2cb418af] .in-progress-description-status{display:none!important}.color-vision-select__trigger[data-v-383f6378]{height:32px;padding:0 8px;border:none;border-radius:6px;background-color:#f1f3fe;cursor:pointer}.color-vision-select__trigger[data-v-383f6378]:disabled{cursor:not-allowed;opacity:.6}.color-vision-select__label[data-v-383f6378]{white-space:nowrap}.color-vision-select__menu[data-v-383f6378]{top:calc(100% + 4px);left:0;z-index:20;width:320px;padding:8px;border-radius:8px;background-color:#fff;box-shadow:0 4px 16px #0000001f}.color-vision-select__option[data-v-383f6378]{width:100%;padding:8px;border:none;border-radius:6px;background-color:transparent;text-align:left;cursor:pointer}.color-vision-select__option[data-v-383f6378]:hover,.color-vision-select__option_selected[data-v-383f6378]{background-color:#f1f3fe}.color-vision-select__option-description[data-v-383f6378]{margin-top:2px}.accessibility-toolbar[data-v-e222d603]{gap:8px}.accessibility-toolbar__divider[data-v-e222d603]{width:1px;height:24px;background-color:#e5e7f0}.view-options-wrapper[data-v-195ab6d4]{position:relative;display:inline-block}.new-tag[data-v-195ab6d4]{position:absolute;top:-8px;right:-16px;z-index:10}[data-v-195ab6d4] .guido__view-option-selection-desktop svg,[data-v-195ab6d4] .guido__view-option-selection-mobile svg{margin:0 0 0 2px}[data-v-195ab6d4] .in-segments-wrapper__button_selected,[data-v-195ab6d4] .in-segments-wrapper__button_selected:hover{background-color:#dae1fb}[data-v-195ab6d4] .in-tooltip-wrapper__icon{cursor:pointer}.editor-toolbar[data-v-173c3a40]{gap:4px}.version-history-item[data-v-ee4b9c3f]{flex-basis:200px}.version-history[data-v-fad98586]{gap:8px}.version-history__toolbar[data-v-fad98586]{gap:4px}.view-options-wrapper[data-v-d405ca59]{position:relative;display:inline-block}.new-tag[data-v-d405ca59]{position:absolute;top:-8px;right:-16px;z-index:10}[data-v-d405ca59] .guido__verion-history-view-option-selection-desktop svg,[data-v-d405ca59] .guido__verion-history-view-option-selection-mobile svg{margin:0 0 0 2px}[data-v-d405ca59] .in-segments-wrapper__button_selected,[data-v-d405ca59] .in-segments-wrapper__button_selected:hover{background-color:#dae1fb}[data-v-d405ca59] .in-tooltip-wrapper__icon{cursor:pointer}.editor-actions-menu__panel[data-v-287a74e3]{top:calc(100% + 4px);right:0;z-index:20;width:222px;padding:8px;border-radius:8px;background-color:#fff;box-shadow:0 4px 16px #0000001f}.editor-actions-menu__section[data-v-287a74e3]{padding:8px 8px 4px;text-transform:uppercase;letter-spacing:.4px}.editor-actions-menu__row[data-v-287a74e3]{width:100%;padding:8px;border:none;border-radius:6px;background-color:transparent;text-align:left;cursor:pointer}.editor-actions-menu__row[data-v-287a74e3]:not(.editor-actions-menu__row_static):hover{background-color:#f1f3fe}.editor-actions-menu__row_static[data-v-287a74e3]{cursor:default}.editor-actions-menu__row[data-v-287a74e3]:disabled{cursor:not-allowed;opacity:.6}.editor-actions-menu__divider[data-v-287a74e3]{height:1px;margin:4px 0;background-color:#e5e7f0}.editor-actions[data-v-d51fb931]{gap:4px}.header-wrapper[data-v-d11dd577]{min-width:1000px}.guido-loading__wrapper[data-v-07c4b2d8]{height:100%;top:75px!important;bottom:0!important}.guido-editor__wrapper[data-v-50dac6de]{--ribbon-offset: 0px;position:relative;width:100%;height:calc(100vh - 128px - var(--ribbon-offset))}.guido-editor__container[data-v-50dac6de]{width:100%;height:calc(100vh - 128px - var(--ribbon-offset))}.guido-editor__no-header[data-v-50dac6de]{height:calc(100vh - 75px - var(--ribbon-offset))}[data-v-293f1c47] .in-breadcrumb-wrapper__links{cursor:pointer}.templates-wrapper[data-v-91a26acd]{gap:16px;grid-template-columns:repeat(3,1fr)}.templates-wrapper .template-wrapper[data-v-91a26acd]{cursor:pointer}.templates-wrapper .template-wrapper .template-container[data-v-91a26acd]{height:274px;padding:2px;transition:none}.templates-wrapper .template-wrapper .template-container.selected[data-v-91a26acd]{padding:1px}.templates-wrapper .template-wrapper .template-container .thumbnail[data-v-91a26acd]{object-fit:cover;transform:scale(1)}[data-v-b9a93c6e] .guido__verion-history-view-option-selection-desktop svg,[data-v-b9a93c6e] .guido__verion-history-view-option-selection-mobile svg{margin:0 0 0 2px}[data-v-b9a93c6e] .in-segments-wrapper__button_selected,[data-v-b9a93c6e] .in-segments-wrapper__button_selected:hover{background-color:#dae1fb}.error-list[data-v-c3fd5d4b]{gap:16px}.desktop-browser-header[data-v-d86c5af5]{height:79px;min-height:79px}.desktop-browser-header__left[data-v-d86c5af5]{-webkit-user-drag:none;height:79px;width:378px}.desktop-browser-header__center[data-v-d86c5af5]{height:79px;background-repeat:repeat-x;background-size:auto 100%;background-position:left top}.desktop-browser-header__right[data-v-d86c5af5]{-webkit-user-drag:none;height:79px;width:112px}.desktop-preview[data-v-06afaecb]{min-width:602px;height:70vh;min-height:583px;border-radius:10px}.desktop-preview iframe[data-v-06afaecb]{min-height:504px}.iframe-wrapper[data-v-cbafc185]{width:258px}.iframe-scaled[data-v-cbafc185]{width:320px;height:124.0310077519%;transform:scale(.80625);transform-origin:top left}.cropped-text[data-v-eb3d05d7]{width:220px;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.mobile-preview-wrapper__phone[data-v-3f472f96]{width:282px}.mobile-preview-wrapper__phone img[data-v-3f472f96]{object-fit:cover;border-radius:44px}.mobile-preview-wrapper__content[data-v-3f472f96]{width:258px;height:450px;left:12px}[data-v-7419ae06] .vueperslides__bullets,[data-v-796d193b] .vueperslides__bullets{pointer-events:none!important}[data-v-796d193b] .vueperslides__parallax-wrapper{height:110px!important}[data-v-cadfc82d] .vueperslides__bullets{pointer-events:none!important}[data-v-cadfc82d] .vueperslides__parallax-wrapper{height:110px!important}
1
+ .gap-16[data-v-5553d071],.gap-16[data-v-0e1b0c54]{gap:16px}[data-v-73199fa4] .in-button-v2__wrapper{line-height:0}[data-v-22226124] .in-segments-wrapper__button_selected,[data-v-22226124] .in-segments-wrapper__button_selected:hover{background-color:#dae1fb;color:#0010ac;border-color:#0010ac}[data-v-2cb418af] .in-progress-wrapper__progress p span:last-child{display:none!important}[data-v-2cb418af] .in-progress-description-status{display:none!important}.view-options-wrapper[data-v-195ab6d4]{position:relative;display:inline-block}.new-tag[data-v-195ab6d4]{position:absolute;top:-8px;right:-16px;z-index:10}[data-v-195ab6d4] .guido__view-option-selection-desktop svg,[data-v-195ab6d4] .guido__view-option-selection-mobile svg{margin:0 0 0 2px}[data-v-195ab6d4] .in-segments-wrapper__button_selected,[data-v-195ab6d4] .in-segments-wrapper__button_selected:hover{background-color:#dae1fb}[data-v-195ab6d4] .in-tooltip-wrapper__icon{cursor:pointer}.editor-toolbar[data-v-173c3a40]{gap:4px}.version-history-item[data-v-ee4b9c3f]{flex-basis:200px}.version-history[data-v-64c52560]{gap:8px}.version-history__toolbar[data-v-64c52560]{gap:4px}.view-options-wrapper[data-v-d405ca59]{position:relative;display:inline-block}.new-tag[data-v-d405ca59]{position:absolute;top:-8px;right:-16px;z-index:10}[data-v-d405ca59] .guido__verion-history-view-option-selection-desktop svg,[data-v-d405ca59] .guido__verion-history-view-option-selection-mobile svg{margin:0 0 0 2px}[data-v-d405ca59] .in-segments-wrapper__button_selected,[data-v-d405ca59] .in-segments-wrapper__button_selected:hover{background-color:#dae1fb}[data-v-d405ca59] .in-tooltip-wrapper__icon{cursor:pointer}.auto-save-toggle[data-v-2c964af4]{position:relative}.auto-save-toggle__info-box[data-v-2c964af4]{position:absolute;top:100%;left:0;z-index:10;width:280px}.editor-actions[data-v-82128f7d]{gap:4px}.header-wrapper[data-v-5c02dcc7]{min-width:1000px}.guido-loading__wrapper[data-v-07c4b2d8]{height:100%;top:75px!important;bottom:0!important}.guido-editor__wrapper[data-v-50dac6de]{--ribbon-offset: 0px;position:relative;width:100%;height:calc(100vh - 128px - var(--ribbon-offset))}.guido-editor__container[data-v-50dac6de]{width:100%;height:calc(100vh - 128px - var(--ribbon-offset))}.guido-editor__no-header[data-v-50dac6de]{height:calc(100vh - 75px - var(--ribbon-offset))}[data-v-293f1c47] .in-breadcrumb-wrapper__links{cursor:pointer}.templates-wrapper[data-v-91a26acd]{gap:16px;grid-template-columns:repeat(3,1fr)}.templates-wrapper .template-wrapper[data-v-91a26acd]{cursor:pointer}.templates-wrapper .template-wrapper .template-container[data-v-91a26acd]{height:274px;padding:2px;transition:none}.templates-wrapper .template-wrapper .template-container.selected[data-v-91a26acd]{padding:1px}.templates-wrapper .template-wrapper .template-container .thumbnail[data-v-91a26acd]{object-fit:cover;transform:scale(1)}[data-v-b9a93c6e] .guido__verion-history-view-option-selection-desktop svg,[data-v-b9a93c6e] .guido__verion-history-view-option-selection-mobile svg{margin:0 0 0 2px}[data-v-b9a93c6e] .in-segments-wrapper__button_selected,[data-v-b9a93c6e] .in-segments-wrapper__button_selected:hover{background-color:#dae1fb}.error-list[data-v-c3fd5d4b]{gap:16px}.desktop-browser-header[data-v-d86c5af5]{height:79px;min-height:79px}.desktop-browser-header__left[data-v-d86c5af5]{-webkit-user-drag:none;height:79px;width:378px}.desktop-browser-header__center[data-v-d86c5af5]{height:79px;background-repeat:repeat-x;background-size:auto 100%;background-position:left top}.desktop-browser-header__right[data-v-d86c5af5]{-webkit-user-drag:none;height:79px;width:112px}.desktop-preview[data-v-06afaecb]{min-width:602px;height:70vh;min-height:583px;border-radius:10px}.desktop-preview iframe[data-v-06afaecb]{min-height:504px}.iframe-wrapper[data-v-cbafc185]{width:258px}.iframe-scaled[data-v-cbafc185]{width:320px;height:124.0310077519%;transform:scale(.80625);transform-origin:top left}.cropped-text[data-v-eb3d05d7]{width:220px;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.mobile-preview-wrapper__phone[data-v-3f472f96]{width:282px}.mobile-preview-wrapper__phone img[data-v-3f472f96]{object-fit:cover;border-radius:44px}.mobile-preview-wrapper__content[data-v-3f472f96]{width:258px;height:450px;left:12px}[data-v-7419ae06] .vueperslides__bullets,[data-v-796d193b] .vueperslides__bullets{pointer-events:none!important}[data-v-796d193b] .vueperslides__parallax-wrapper{height:110px!important}[data-v-cadfc82d] .vueperslides__bullets{pointer-events:none!important}[data-v-cadfc82d] .vueperslides__parallax-wrapper{height:110px!important}
@@ -1,57 +1,45 @@
1
1
  import "../../vue-demi/lib/index.js";
2
- import { unref as p, getCurrentScope as w, onScopeDispose as m } from "vue";
3
- function T(t) {
4
- return w() ? (m(t), !0) : !1;
5
- }
6
- function a(t) {
2
+ import { unref as p } from "vue";
3
+ function f(t) {
7
4
  return typeof t == "function" ? t() : p(t);
8
5
  }
9
- const g = typeof window < "u" && typeof document < "u";
10
6
  typeof WorkerGlobalScope < "u" && globalThis instanceof WorkerGlobalScope;
11
- const b = Object.prototype.toString, j = (t) => b.call(t) === "[object Object]", f = () => {
12
- }, x = /* @__PURE__ */ h();
13
- function h() {
14
- var t, n;
15
- return g && ((t = window == null ? void 0 : window.navigator) == null ? void 0 : t.userAgent) && (/iP(?:ad|hone|od)/.test(window.navigator.userAgent) || ((n = window == null ? void 0 : window.navigator) == null ? void 0 : n.maxTouchPoints) > 2 && /iPad|Macintosh/.test(window == null ? void 0 : window.navigator.userAgent));
16
- }
17
- function v(t, n) {
18
- function o(...e) {
19
- return new Promise((r, i) => {
20
- Promise.resolve(t(() => n.apply(this, e), { fn: n, thisArg: this, args: e })).then(r).catch(i);
7
+ const m = () => {
8
+ };
9
+ function h(t, n) {
10
+ function r(...e) {
11
+ return new Promise((i, o) => {
12
+ Promise.resolve(t(() => n.apply(this, e), { fn: n, thisArg: this, args: e })).then(i).catch(o);
21
13
  });
22
14
  }
23
- return o;
15
+ return r;
24
16
  }
25
- function S(t, n = {}) {
26
- let o, e, r = f;
27
- const i = (u) => {
28
- clearTimeout(u), r(), r = f;
17
+ function T(t, n = {}) {
18
+ let r, e, i = m;
19
+ const o = (u) => {
20
+ clearTimeout(u), i(), i = m;
29
21
  };
30
22
  return (u) => {
31
- const s = a(t), c = a(n.maxWait);
32
- return o && i(o), s <= 0 || c !== void 0 && c <= 0 ? (e && (i(e), e = null), Promise.resolve(u())) : new Promise((l, d) => {
33
- r = n.rejectOnCancel ? d : l, c && !e && (e = setTimeout(() => {
34
- o && i(o), e = null, l(u());
35
- }, c)), o = setTimeout(() => {
36
- e && i(e), e = null, l(u());
37
- }, s);
23
+ const a = f(t), l = f(n.maxWait);
24
+ return r && o(r), a <= 0 || l !== void 0 && l <= 0 ? (e && (o(e), e = null), Promise.resolve(u())) : new Promise((c, s) => {
25
+ i = n.rejectOnCancel ? s : c, l && !e && (e = setTimeout(() => {
26
+ r && o(r), e = null, c(u());
27
+ }, l)), r = setTimeout(() => {
28
+ e && o(e), e = null, c(u());
29
+ }, a);
38
30
  });
39
31
  };
40
32
  }
41
- function A(t, n = 200, o = {}) {
42
- return v(
43
- S(n, o),
33
+ function P(t, n = 200, r = {}) {
34
+ return h(
35
+ T(n, r),
44
36
  t
45
37
  );
46
38
  }
47
39
  export {
48
- v as createFilterWrapper,
49
- S as debounceFilter,
50
- g as isClient,
51
- x as isIOS,
52
- j as isObject,
53
- f as noop,
54
- a as toValue,
55
- T as tryOnScopeDispose,
56
- A as useDebounceFn
40
+ h as createFilterWrapper,
41
+ T as debounceFilter,
42
+ m as noop,
43
+ f as toValue,
44
+ P as useDebounceFn
57
45
  };
@@ -227,6 +227,24 @@ export declare const TemplateSchema: v.ObjectSchema<{
227
227
  readonly value: v.StringSchema<undefined>;
228
228
  }, undefined>, undefined>;
229
229
  }, undefined>, undefined>, readonly []>;
230
+ /**
231
+ * Full set of dynamic-content items the account offers (label + token).
232
+ * Used as the label→token map that repairs label-form placeholders
233
+ * (e.g. `{{ Phone Number }}`) in dropped saved modules.
234
+ */
235
+ readonly availableDynamicContent: v.OptionalSchema<v.ArraySchema<v.ObjectSchema<{
236
+ /** Display text for the dynamic content */
237
+ readonly text: v.StringSchema<undefined>;
238
+ /** Template variable value (e.g., {{username}}) */
239
+ readonly value: v.StringSchema<undefined>;
240
+ /** Fallback value if variable is empty */
241
+ readonly fallback: v.OptionalSchema<v.StringSchema<undefined>, undefined>;
242
+ /** Optional formatting options */
243
+ readonly format: v.OptionalSchema<v.ObjectSchema<{
244
+ readonly key: v.StringSchema<undefined>;
245
+ readonly value: v.StringSchema<undefined>;
246
+ }, undefined>, undefined>;
247
+ }, undefined>, undefined>, readonly []>;
230
248
  /** Valid custom field attribute names from the partner's categorized fields */
231
249
  readonly customFieldAttributes: v.OptionalSchema<v.ArraySchema<v.StringSchema<undefined>, undefined>, readonly []>;
232
250
  /** Selected unsubscribe page IDs */
@@ -354,8 +372,6 @@ export declare const FeaturesSchema: v.ObjectSchema<{
354
372
  readonly liquidSyntax: v.OptionalSchema<v.BooleanSchema<undefined>, false>;
355
373
  /** Enable autosave (3-min interval + tab-hide). User toggles on/off from the header. */
356
374
  readonly autosave: v.OptionalSchema<v.BooleanSchema<undefined>, false>;
357
- /** Enable the Stripo Accessibility Checker control in the editor toolbar. */
358
- readonly accessibilityTesting: v.OptionalSchema<v.BooleanSchema<undefined>, false>;
359
375
  }, undefined>;
360
376
  /**
361
377
  * Default block types available in Stripo
@@ -624,6 +640,24 @@ export declare const GuidoConfigSchema: v.ObjectSchema<{
624
640
  readonly value: v.StringSchema<undefined>;
625
641
  }, undefined>, undefined>;
626
642
  }, undefined>, undefined>, readonly []>;
643
+ /**
644
+ * Full set of dynamic-content items the account offers (label + token).
645
+ * Used as the label→token map that repairs label-form placeholders
646
+ * (e.g. `{{ Phone Number }}`) in dropped saved modules.
647
+ */
648
+ readonly availableDynamicContent: v.OptionalSchema<v.ArraySchema<v.ObjectSchema<{
649
+ /** Display text for the dynamic content */
650
+ readonly text: v.StringSchema<undefined>;
651
+ /** Template variable value (e.g., {{username}}) */
652
+ readonly value: v.StringSchema<undefined>;
653
+ /** Fallback value if variable is empty */
654
+ readonly fallback: v.OptionalSchema<v.StringSchema<undefined>, undefined>;
655
+ /** Optional formatting options */
656
+ readonly format: v.OptionalSchema<v.ObjectSchema<{
657
+ readonly key: v.StringSchema<undefined>;
658
+ readonly value: v.StringSchema<undefined>;
659
+ }, undefined>, undefined>;
660
+ }, undefined>, undefined>, readonly []>;
627
661
  /** Valid custom field attribute names from the partner's categorized fields */
628
662
  readonly customFieldAttributes: v.OptionalSchema<v.ArraySchema<v.StringSchema<undefined>, undefined>, readonly []>;
629
663
  /** Selected unsubscribe page IDs */
@@ -736,8 +770,6 @@ export declare const GuidoConfigSchema: v.ObjectSchema<{
736
770
  readonly liquidSyntax: v.OptionalSchema<v.BooleanSchema<undefined>, false>;
737
771
  /** Enable autosave (3-min interval + tab-hide). User toggles on/off from the header. */
738
772
  readonly autosave: v.OptionalSchema<v.BooleanSchema<undefined>, false>;
739
- /** Enable the Stripo Accessibility Checker control in the editor toolbar. */
740
- readonly accessibilityTesting: v.OptionalSchema<v.BooleanSchema<undefined>, false>;
741
773
  }, undefined>, {}>;
742
774
  /** Block configuration */
743
775
  readonly blocks: v.OptionalSchema<v.ObjectSchema<{
@@ -1,5 +1,5 @@
1
- import type { CompileEmailOptions } from '@@/Types/api/actions-api';
2
- import { GetCompiledEmailOptions, CompiledEmailResult, TemplateData } from '@@/Types/api/actions-api';
1
+ import type { CompileEmailOptions } from '@@/Types/actions-api';
2
+ import { GetCompiledEmailOptions, CompiledEmailResult, TemplateData } from '@@/Types/actions-api';
3
3
  export declare const useActionsApi: () => {
4
4
  getCompiledEmail: (options?: GetCompiledEmailOptions) => Promise<CompiledEmailResult>;
5
5
  getTemplateData: () => Promise<TemplateData>;
@@ -34,6 +34,15 @@ export declare const useConfig: () => {
34
34
  value: string;
35
35
  } | undefined;
36
36
  }[];
37
+ availableDynamicContent: {
38
+ text: string;
39
+ value: string;
40
+ fallback?: string | undefined;
41
+ format?: {
42
+ key: string;
43
+ value: string;
44
+ } | undefined;
45
+ }[];
37
46
  customFieldAttributes: string[];
38
47
  selectedUnsubscribePages: number[];
39
48
  forceRecreate: boolean;
@@ -93,7 +102,6 @@ export declare const useConfig: () => {
93
102
  modulesDisabled: boolean;
94
103
  liquidSyntax: boolean;
95
104
  autosave: boolean;
96
- accessibilityTesting: boolean;
97
105
  };
98
106
  blocks: {
99
107
  excludeDefaults: ("amp-accordion" | "amp-carousel" | "amp-form-controls" | "banner-block" | "button-block" | "html-block" | "image-block" | "menu-block" | "social-block" | "spacer-block" | "text-block" | "timer-block" | "video-block")[];
@@ -163,6 +171,15 @@ export declare const useConfig: () => {
163
171
  value: string;
164
172
  } | undefined;
165
173
  }[];
174
+ availableDynamicContent: {
175
+ text: string;
176
+ value: string;
177
+ fallback?: string | undefined;
178
+ format?: {
179
+ key: string;
180
+ value: string;
181
+ } | undefined;
182
+ }[];
166
183
  customFieldAttributes: string[];
167
184
  selectedUnsubscribePages: number[];
168
185
  forceRecreate: boolean;
@@ -222,7 +239,6 @@ export declare const useConfig: () => {
222
239
  modulesDisabled: boolean;
223
240
  liquidSyntax: boolean;
224
241
  autosave: boolean;
225
- accessibilityTesting: boolean;
226
242
  } | null>;
227
243
  blocks: import("vue").ComputedRef<{
228
244
  excludeDefaults: ("amp-accordion" | "amp-carousel" | "amp-form-controls" | "banner-block" | "button-block" | "html-block" | "image-block" | "menu-block" | "social-block" | "spacer-block" | "text-block" | "timer-block" | "video-block")[];
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,18 @@
1
+ import type { ModuleAddData, ModuleModifier } from '@@/Types/stripo';
2
+ /**
3
+ * Host-registered translation key for the "some attributes could not be
4
+ * converted" toaster. Guido resolves it against the host's `window.trans.en`;
5
+ * the copy is registered host-side.
6
+ */
7
+ export declare const UNRESOLVED_DYNAMIC_CONTENT_ON_DROP_KEY = "dynamic-content.unresolved-attributes-on-drop";
8
+ /**
9
+ * Repairs label-form dynamic-content tokens in saved modules as they are dropped
10
+ * or copied into the editor. Saved modules serialize merge-tag chips by their
11
+ * display label (`{{ Phone Number }}`); this maps them back to their canonical
12
+ * token (`{{phone_number}}`) using the account's dynamic-content list.
13
+ *
14
+ * Wired into Stripo via the `onModuleAdd` init callback (see `useStripo`).
15
+ */
16
+ export declare const useModuleDynamicContentRepair: () => {
17
+ handleModuleAdd: (data: ModuleAddData, modifier: ModuleModifier) => void;
18
+ };