@useinsider/guido 3.11.0-beta.b9b7d29 → 3.11.0-beta.c237b25

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 (34) hide show
  1. package/dist/@types/config/schemas.js +49 -40
  2. package/dist/components/Guido.vue.js +3 -3
  3. package/dist/components/Guido.vue2.js +41 -41
  4. package/dist/components/organisms/header/EditorActions.vue.js +1 -1
  5. package/dist/components/organisms/header/HeaderWrapper.vue.js +3 -3
  6. package/dist/components/organisms/header/HeaderWrapper.vue2.js +2 -0
  7. package/dist/components/organisms/header/version-history/VersionHistory.vue.js +1 -1
  8. package/dist/components/organisms/onboarding/NewVersionPopup.vue2.js +23 -20
  9. package/dist/components/organisms/onboarding/OnboardingWrapper.vue2.js +11 -12
  10. package/dist/components/organisms/unsubscribe/UnsubscribePageSelection.vue.js +5 -5
  11. package/dist/components/organisms/unsubscribe/UnsubscribePageSelection.vue2.js +2 -2
  12. package/dist/components/organisms/unsubscribe/UnsubscribeTypeSelection.vue.js +3 -3
  13. package/dist/components/organisms/unsubscribe/UnsubscribeTypeSelection.vue2.js +9 -9
  14. package/dist/composables/useModuleDynamicContentRepair.js +36 -0
  15. package/dist/composables/useStripo.js +62 -59
  16. package/dist/enums/academy.js +1 -1
  17. package/dist/enums/date.js +4 -3
  18. package/dist/enums/onboarding.js +12 -21
  19. package/dist/guido.css +1 -1
  20. package/dist/src/@types/config/schemas.d.ts +36 -0
  21. package/dist/src/composables/useConfig.d.ts +18 -0
  22. package/dist/src/composables/useModuleDynamicContentRepair.d.ts +18 -0
  23. package/dist/src/enums/academy.d.ts +3 -3
  24. package/dist/src/enums/onboarding.d.ts +0 -3
  25. package/dist/src/stores/config.d.ts +162 -0
  26. package/dist/src/utils/dynamicContentConverter.d.ts +27 -0
  27. package/dist/src/utils/genericUtil.d.ts +7 -0
  28. package/dist/stores/onboarding.js +11 -14
  29. package/dist/utils/dateUtil.js +23 -10
  30. package/dist/utils/dynamicContentConverter.js +31 -0
  31. package/dist/utils/genericUtil.js +26 -19
  32. package/package.json +10 -1
  33. package/dist/src/composables/useHtmlValidator.test.d.ts +0 -1
  34. package/dist/src/config/compiler/utils/recommendationIgnoreUtils.test.d.ts +0 -1
@@ -2,15 +2,15 @@ import n from "./UnsubscribeTypeSelection.vue2.js";
2
2
  /* empty css */
3
3
  import o from "../../../_virtual/_plugin-vue2_normalizer.js";
4
4
  var i = function() {
5
- var e = this, s = e._self._c, t = e._self._setupProxy;
6
- return s(t.WpDrawer, { attrs: { id: "unsubscribe-modal", "description-status": "", "description-text": t.descriptionText, "footer-button-group-options": t.footerButtonGroupOptions, status: t.unsubscribeStore.typeSelectionDrawerStatus, "title-text": t.trans("unsubscription-preference.select-unsubscribe-page-title") }, on: { cancelOrBackButtonEvent: t.closeModal, onCloseEvent: t.closeModal, primaryButtonEvent: t.selectCollection } }, [s(t.InSegments, { staticClass: "w-1", attrs: { "with-icon": "", align: "vertical", disable: t.isSelecting, "segment-list": t.segmentList, selected: t.selectedCollection, "skeleton-sizing": { width: 495, height: 180 }, "skeleton-status": t.skeletonStatus }, on: { click: t.changeCollection } })], 1);
5
+ var t = this, s = t._self._c, e = t._self._setupProxy;
6
+ return s(e.WpDrawer, { attrs: { id: "unsubscribe-modal", "description-status": "", "description-text": e.descriptionText, "footer-button-group-options": e.footerButtonGroupOptions, status: e.unsubscribeStore.typeSelectionDrawerStatus, "title-text": e.trans("unsubscription-preference.select-unsubscribe-page-title") }, on: { cancelOrBackButtonEvent: e.closeModal, onCloseEvent: e.closeModal, primaryButtonEvent: e.selectCollection } }, [s(e.InSegments, { staticClass: "w-1", attrs: { "with-icon": "", align: "vertical", disable: e.isSelecting, "segment-list": e.segmentList, selected: e.selectedCollection, "skeleton-sizing": { width: 495, height: 180 }, "skeleton-status": e.skeletonStatus }, on: { click: e.changeCollection } })], 1);
7
7
  }, r = [], c = /* @__PURE__ */ o(
8
8
  n,
9
9
  i,
10
10
  r,
11
11
  !1,
12
12
  null,
13
- "7a305bb2"
13
+ "b9a93c6e"
14
14
  );
15
15
  const _ = c.exports;
16
16
  export {
@@ -10,10 +10,10 @@ import { InSegments as L } from "@useinsider/design-system-vue";
10
10
  const W = /* @__PURE__ */ _({
11
11
  __name: "UnsubscribeTypeSelection",
12
12
  setup(k) {
13
- const t = N(), { showToaster: d } = w(), e = G(), n = b(!1), o = b(!0), r = b(l.GLOBAL_UNSUBSCRIBE), T = t(
13
+ const t = N(), { showToaster: d } = w(), e = G(), n = b(!1), o = b(!0), r = b(l.GLOBAL_UNSUBSCRIBE), y = t(
14
14
  "unsubscription-preference.select-unsubscribe-page-description",
15
15
  { action: `<a href="${D.GLOBAL_UNSUBSCRIBE}" target="_blank">${t("ds-rules.visit-academy")}</a>` }
16
- ), y = f(() => [
16
+ ), T = f(() => [
17
17
  {
18
18
  description: t("unsubscription-preference.type-global-unsubscribe-description"),
19
19
  icon: "line-contact-global-unsub-page",
@@ -31,7 +31,7 @@ const W = /* @__PURE__ */ _({
31
31
  disable: e.isSubscriptionPreferencesCenterDisabled,
32
32
  tooltipText: e.isSubscriptionPreferencesCenterDisabled ? t("unsubscription-preference.pref-center-added") : ""
33
33
  }
34
- ]), g = f(
34
+ ]), S = f(
35
35
  () => e.isGlobalUnsubscribeDisabled && e.isSubscriptionPreferencesCenterDisabled
36
36
  ), C = f(() => ({
37
37
  primaryButton: {
@@ -41,7 +41,7 @@ const W = /* @__PURE__ */ _({
41
41
  n.value ? "unsubscription-preference.selecting-type" : "products.select-and-continue"
42
42
  ),
43
43
  loadingStatus: n.value,
44
- disabledStatus: g.value,
44
+ disabledStatus: S.value,
45
45
  skeletonStatus: o.value,
46
46
  skeletonSizing: { width: 168, height: 40 }
47
47
  },
@@ -53,12 +53,12 @@ const W = /* @__PURE__ */ _({
53
53
  skeletonStatus: o.value,
54
54
  skeletonSizing: { width: 78, height: 40 }
55
55
  }
56
- })), S = (s) => {
57
- e.typeSelectionDrawerStatus = !1, document.dispatchEvent(new CustomEvent("unsubscribe:cancel", {
56
+ })), g = (s) => {
57
+ e.typeSelectionDrawerStatus && (e.typeSelectionDrawerStatus = !1, document.dispatchEvent(new CustomEvent("unsubscribe:cancel", {
58
58
  detail: { blockId: e.pendingBlockId }
59
59
  })), s && setTimeout(() => {
60
60
  s();
61
- }, 500);
61
+ }, 500));
62
62
  }, E = (s) => {
63
63
  r.value = s;
64
64
  }, m = () => {
@@ -98,14 +98,14 @@ const W = /* @__PURE__ */ _({
98
98
  }), !1;
99
99
  }, B = async () => {
100
100
  if (n.value = !0, await e.fetchTemplates(!0), e.setCollection(r.value), !m()) {
101
- n.value = !1, S();
101
+ n.value = !1, g();
102
102
  return;
103
103
  }
104
104
  n.value = !1, e.typeSelectionDrawerStatus = !1, e.pageSelectionDrawerStatus = !0;
105
105
  };
106
106
  return v(() => e.typeSelectionDrawerStatus, (s) => {
107
107
  s && (o.value = !0, r.value = l.GLOBAL_UNSUBSCRIBE, e.isGlobalUnsubscribeDisabled && (r.value = e.isSubscriptionPreferencesCenterDisabled ? 0 : l.SUBSCRIPTION_PREFERENCE_CENTER), o.value = !1);
108
- }), { __sfc: !0, trans: t, showToaster: d, unsubscribeStore: e, isSelecting: n, skeletonStatus: o, selectedCollection: r, descriptionText: T, segmentList: y, hasNoSelectableType: g, footerButtonGroupOptions: C, closeModal: S, changeCollection: E, validateTemplates: m, selectCollection: B, WpDrawer: U, InSegments: L };
108
+ }), { __sfc: !0, trans: t, showToaster: d, unsubscribeStore: e, isSelecting: n, skeletonStatus: o, selectedCollection: r, descriptionText: y, segmentList: T, hasNoSelectableType: S, footerButtonGroupOptions: C, closeModal: g, changeCollection: E, validateTemplates: m, selectCollection: B, WpDrawer: U, InSegments: L };
109
109
  }
110
110
  });
111
111
  export {
@@ -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
  };
@@ -1,4 +1,4 @@
1
- const e = "https://academy.insiderone.com", o = {
1
+ const e = "https://academy.insiderone.com/", o = {
2
2
  EMAIL_EDITOR: `${e}/docs/email-drag-and-drop-editor`,
3
3
  GLOBAL_UNSUBSCRIBE: `${e}/docs/global-unsubscribe-preference-center`,
4
4
  AMP_FOR_EMAILS: `${e}/docs/amp-for-emails`
@@ -1,5 +1,6 @@
1
- const t = "tr-TR", L = "default";
1
+ const t = "tr-TR", T = "default", L = "UTC";
2
2
  export {
3
- L as DEFAULT,
4
- t as DEFAULT_LOCALE
3
+ T as DEFAULT,
4
+ t as DEFAULT_LOCALE,
5
+ L as DEFAULT_TZ
5
6
  };
@@ -1,26 +1,17 @@
1
- const e = "insidethekube.com", t = typeof window < "u" && window.location.hostname.endsWith(e), n = [
2
- "newVersionPopup",
3
- "genericOnboarding",
4
- "textBlockOnboarding",
5
- "versionHistoryOnboarding",
6
- "ampOnboarding",
7
- "itemsOnboarding"
8
- ], o = [
1
+ const e = [
9
2
  ".service-element.stacked-panel-item.ng-tns-c1014751574-3.level-bottom-0.ng-star-inserted",
10
3
  ".service-element.stacked-panel-item.ng-tns-c1014751574-3.level-bottom-1.ng-star-inserted",
11
4
  ".service-element.stacked-panel-item.ng-tns-c1014751574-3.level-bottom-2.ng-star-inserted"
12
- ], s = "ui-editor", i = 'button[role="tab"][aria-label="Card Composition"]', E = 'button[role="tab"][aria-label="Settings"]', O = ".in-ribbons-wrapper", a = ".guido__amp-toggle-html", r = ".in-segments-wrapper", _ = '[data-testid="guido-header"]', c = 158, T = 10;
5
+ ], t = "ui-editor", n = 'button[role="tab"][aria-label="Card Composition"]', s = 'button[role="tab"][aria-label="Settings"]', E = ".in-ribbons-wrapper", o = ".guido__amp-toggle-html", a = ".in-segments-wrapper", O = '[data-testid="guido-header"]', _ = 158, i = 10;
13
6
  export {
14
- a as AMP_TOGGLE_BUTTON_SELECTOR,
15
- r as AMP_TOGGLE_WRAPPER_SELECTOR,
16
- i as CARD_COMPOSITION_TAB_SELECTOR,
17
- n as FORCED_ONBOARDING_TYPES,
18
- t as FORCE_ONBOARDING_FOR_TESTING,
19
- _ as HEADER_SELECTOR,
20
- c as POPOVER_LEFT_OFFSET,
21
- T as POPOVER_TOP_GAP,
22
- O as RIBBON_SELECTOR,
23
- o as SERVICE_HOVER_SELECTORS,
24
- E as SETTINGS_TAB_SELECTOR,
25
- s as UI_EDITOR_SELECTOR
7
+ o as AMP_TOGGLE_BUTTON_SELECTOR,
8
+ a as AMP_TOGGLE_WRAPPER_SELECTOR,
9
+ n as CARD_COMPOSITION_TAB_SELECTOR,
10
+ O as HEADER_SELECTOR,
11
+ _ as POPOVER_LEFT_OFFSET,
12
+ i as POPOVER_TOP_GAP,
13
+ E as RIBBON_SELECTOR,
14
+ e as SERVICE_HOVER_SELECTORS,
15
+ s as SETTINGS_TAB_SELECTOR,
16
+ t as UI_EDITOR_SELECTOR
26
17
  };
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}.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-57d338df]{--ribbon-offset: 0px;position:relative;width:100%;height:calc(100vh - 128px - var(--ribbon-offset))}.guido-editor__container[data-v-57d338df]{width:100%;height:calc(100vh - 128px - var(--ribbon-offset))}.guido-editor__no-header[data-v-57d338df]{height:calc(100vh - 75px - var(--ribbon-offset))}[data-v-293f1c47] .in-breadcrumb-wrapper__links{cursor:pointer}.templates-wrapper[data-v-669fe7cf]{gap:16px;grid-template-columns:repeat(3,1fr)}.templates-wrapper .template-wrapper[data-v-669fe7cf]{cursor:pointer}.templates-wrapper .template-wrapper .template-container[data-v-669fe7cf]{height:274px;padding:2px;transition:none}.templates-wrapper .template-wrapper .template-container.selected[data-v-669fe7cf]{padding:1px}.templates-wrapper .template-wrapper .template-container .thumbnail[data-v-669fe7cf]{object-fit:cover;transform:scale(1)}[data-v-7a305bb2] .guido__verion-history-view-option-selection-desktop svg,[data-v-7a305bb2] .guido__verion-history-view-option-selection-mobile svg{margin:0 0 0 2px}[data-v-7a305bb2] .in-segments-wrapper__button_selected,[data-v-7a305bb2] .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-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}.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-6e711fd7]{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}
@@ -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 */
@@ -622,6 +640,24 @@ export declare const GuidoConfigSchema: v.ObjectSchema<{
622
640
  readonly value: v.StringSchema<undefined>;
623
641
  }, undefined>, undefined>;
624
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 []>;
625
661
  /** Valid custom field attribute names from the partner's categorized fields */
626
662
  readonly customFieldAttributes: v.OptionalSchema<v.ArraySchema<v.StringSchema<undefined>, undefined>, readonly []>;
627
663
  /** Selected unsubscribe page IDs */
@@ -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;
@@ -162,6 +171,15 @@ export declare const useConfig: () => {
162
171
  value: string;
163
172
  } | undefined;
164
173
  }[];
174
+ availableDynamicContent: {
175
+ text: string;
176
+ value: string;
177
+ fallback?: string | undefined;
178
+ format?: {
179
+ key: string;
180
+ value: string;
181
+ } | undefined;
182
+ }[];
165
183
  customFieldAttributes: string[];
166
184
  selectedUnsubscribePages: number[];
167
185
  forceRecreate: boolean;
@@ -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
+ };
@@ -5,8 +5,8 @@
5
5
  * for easy maintenance and domain migration.
6
6
  */
7
7
  export declare const ACADEMY_LINKS: {
8
- readonly EMAIL_EDITOR: "https://academy.insiderone.com/docs/email-drag-and-drop-editor";
9
- readonly GLOBAL_UNSUBSCRIBE: "https://academy.insiderone.com/docs/global-unsubscribe-preference-center";
10
- readonly AMP_FOR_EMAILS: "https://academy.insiderone.com/docs/amp-for-emails";
8
+ readonly EMAIL_EDITOR: "https://academy.insiderone.com//docs/email-drag-and-drop-editor";
9
+ readonly GLOBAL_UNSUBSCRIBE: "https://academy.insiderone.com//docs/global-unsubscribe-preference-center";
10
+ readonly AMP_FOR_EMAILS: "https://academy.insiderone.com//docs/amp-for-emails";
11
11
  };
12
12
  export type AcademyLinkKey = keyof typeof ACADEMY_LINKS;
@@ -1,6 +1,3 @@
1
- import type { OnboardingType } from '@@/Types/onboarding';
2
- export declare const FORCE_ONBOARDING_FOR_TESTING: boolean;
3
- export declare const FORCED_ONBOARDING_TYPES: OnboardingType[];
4
1
  export declare const SERVICE_HOVER_SELECTORS: string[];
5
2
  export declare const UI_EDITOR_SELECTOR = "ui-editor";
6
3
  export declare const CARD_COMPOSITION_TAB_SELECTOR = "button[role=\"tab\"][aria-label=\"Card Composition\"]";