@useinsider/guido 3.2.0-beta.4aabac5 → 3.2.0-beta.51b7991

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 (83) hide show
  1. package/README.md +1 -0
  2. package/dist/components/organisms/header/EditorActions.vue.js +2 -2
  3. package/dist/components/organisms/header/EditorActions.vue2.js +51 -36
  4. package/dist/components/organisms/header/RightSlot.vue.js +10 -10
  5. package/dist/components/organisms/header/RightSlot.vue2.js +16 -13
  6. package/dist/components/organisms/onboarding/AMPOnboarding.vue2.js +51 -31
  7. package/dist/components/organisms/onboarding/GenericOnboarding.vue.js +1 -1
  8. package/dist/components/organisms/onboarding/GenericOnboarding.vue2.js +23 -22
  9. package/dist/components/organisms/onboarding/ItemsOnboarding.vue.js +1 -1
  10. package/dist/components/organisms/onboarding/ItemsOnboarding.vue2.js +37 -39
  11. package/dist/components/organisms/onboarding/TextBlockOnboarding.vue.js +3 -3
  12. package/dist/components/organisms/onboarding/TextBlockOnboarding.vue2.js +30 -41
  13. package/dist/components/organisms/onboarding/VersionHistoryOnboarding.vue2.js +15 -14
  14. package/dist/components/organisms/save-as-template/SaveAsTemplateDrawer.vue2.js +18 -17
  15. package/dist/composables/useActionsApi.js +4 -4
  16. package/dist/composables/useFullStoryBridge.js +14 -0
  17. package/dist/composables/useHtmlCompiler.js +18 -16
  18. package/dist/composables/useRibbonOffset.js +21 -0
  19. package/dist/composables/useSave.js +26 -17
  20. package/dist/composables/useStripo.js +48 -45
  21. package/dist/composables/validators/useCouponBlockValidator.js +24 -0
  22. package/dist/composables/validators/useLiquidValidator.js +42 -0
  23. package/dist/config/compiler/liquidCompilerRules.js +15 -0
  24. package/dist/config/compiler/recommendationCompilerRules.js +77 -72
  25. package/dist/config/compiler/unsubscribeCompilerRules.js +40 -37
  26. package/dist/config/compiler/utils/recommendationCompilerUtils.js +33 -30
  27. package/dist/config/migrator/radioButtonMigrator.js +64 -44
  28. package/dist/config/migrator/recommendationMigrator.js +1 -1
  29. package/dist/enums/onboarding.js +7 -2
  30. package/dist/enums/unsubscribe.js +34 -27
  31. package/dist/extensions/Blocks/CouponBlock/template.js +24 -13
  32. package/dist/extensions/Blocks/Items/controls/price/singlePrice.js +38 -38
  33. package/dist/extensions/Blocks/Items/enums/productEnums.js +19 -7
  34. package/dist/extensions/Blocks/RadioButton/template.js +1 -1
  35. package/dist/extensions/Blocks/Recommendation/block.js +35 -28
  36. package/dist/extensions/Blocks/Recommendation/constants/controlIds.js +1 -1
  37. package/dist/extensions/Blocks/Recommendation/controls/customAttribute/index.js +21 -18
  38. package/dist/extensions/Blocks/Recommendation/controls/customAttribute/textTrim.js +99 -0
  39. package/dist/extensions/Blocks/Recommendation/controls/main/algorithm.js +6 -6
  40. package/dist/extensions/Blocks/Recommendation/controls/main/index.js +3 -1
  41. package/dist/extensions/Blocks/Recommendation/controls/name/textTrim.js +27 -57
  42. package/dist/extensions/Blocks/Recommendation/controls/shared/textTrimCssRules.js +14 -0
  43. package/dist/extensions/Blocks/Recommendation/services/configService.js +11 -4
  44. package/dist/extensions/Blocks/Recommendation/settingsPanel.js +18 -17
  45. package/dist/extensions/Blocks/Recommendation/store/recommendation.js +29 -25
  46. package/dist/extensions/Blocks/Recommendation/templates/list/template.js +11 -11
  47. package/dist/extensions/Blocks/Recommendation/utils/filterUtil.js +17 -14
  48. package/dist/extensions/Blocks/Unsubscribe/block.js +11 -11
  49. package/dist/extensions/DynamicContent/dynamic-content.js +17 -12
  50. package/dist/guido.css +1 -1
  51. package/dist/node_modules/@stripoinc/ui-editor-extensions/dist/esm/index.js +393 -264
  52. package/dist/package.json.js +1 -1
  53. package/dist/services/stripoApi.js +9 -9
  54. package/dist/services/templateLibraryApi.js +49 -46
  55. package/dist/src/@types/save-as-template.d.ts +1 -0
  56. package/dist/src/composables/useActionsApi.d.ts +1 -1
  57. package/dist/src/composables/useFullStoryBridge.d.ts +11 -0
  58. package/dist/src/composables/useRibbonOffset.d.ts +4 -0
  59. package/dist/src/composables/validators/useCouponBlockValidator.d.ts +3 -0
  60. package/dist/src/composables/validators/useLiquidValidator.d.ts +3 -0
  61. package/dist/src/config/compiler/liquidCompilerRules.d.ts +2 -0
  62. package/dist/src/enums/onboarding.d.ts +6 -0
  63. package/dist/src/enums/unsubscribe.d.ts +5 -0
  64. package/dist/src/extensions/Blocks/CouponBlock/template.d.ts +2 -0
  65. package/dist/src/extensions/Blocks/RadioButton/template.d.ts +1 -1
  66. package/dist/src/extensions/Blocks/Recommendation/constants/controlIds.d.ts +1 -0
  67. package/dist/src/extensions/Blocks/Recommendation/controls/customAttribute/index.d.ts +3 -0
  68. package/dist/src/extensions/Blocks/Recommendation/controls/customAttribute/textTrim.d.ts +35 -0
  69. package/dist/src/extensions/Blocks/Recommendation/controls/name/textTrim.d.ts +3 -20
  70. package/dist/src/extensions/Blocks/Recommendation/controls/shared/textTrimCssRules.d.ts +29 -0
  71. package/dist/src/extensions/Blocks/Recommendation/services/configService.d.ts +11 -3
  72. package/dist/src/services/templateLibraryApi.d.ts +1 -1
  73. package/dist/src/stores/onboarding.d.ts +4 -0
  74. package/dist/src/utils/genericUtil.d.ts +1 -1
  75. package/dist/static/styles/components/button.css.js +16 -9
  76. package/dist/static/styles/components/loader.css.js +4 -0
  77. package/dist/static/styles/components/narrow-panel.css.js +52 -0
  78. package/dist/stores/onboarding.js +4 -0
  79. package/dist/utils/genericUtil.js +42 -20
  80. package/dist/utils/pairProductVariables.js +89 -88
  81. package/package.json +3 -3
  82. package/dist/enums/displayConditions.js +0 -80
  83. package/dist/src/enums/displayConditions.d.ts +0 -2
@@ -1,74 +1,63 @@
1
- import { defineComponent as u, computed as a, watch as b } from "vue";
2
- import { useTranslations as m } from "../../../composables/useTranslations.js";
3
- import { useOnboardingStore as k } from "../../../stores/onboarding.js";
4
- import { InOnboard as B } from "@useinsider/design-system-vue";
5
- const y = /* @__PURE__ */ u({
1
+ import { defineComponent as l, computed as c, watch as g } from "vue";
2
+ import { useRibbonOffset as b } from "../../../composables/useRibbonOffset.js";
3
+ import { useTranslations as x } from "../../../composables/useTranslations.js";
4
+ import { useOnboardingStore as u } from "../../../stores/onboarding.js";
5
+ import { InOnboard as p } from "@useinsider/design-system-vue";
6
+ const O = /* @__PURE__ */ l({
6
7
  __name: "TextBlockOnboarding",
7
- setup(h) {
8
- const i = m(), o = k(), e = a(() => {
9
- const n = window.innerHeight - 128, r = Math.max(90, n * 0.15), s = Math.max(490, n * 0.71), d = 200, g = 40;
10
- return {
11
- settings: {
12
- top: `${r}px`,
13
- position: r + d + g > n ? "Right Bottom" : "Right Top"
14
- },
15
- dynamic: {
16
- top: `${s}px`,
17
- position: s + d + g > n ? "Right Bottom" : "Right Top"
18
- }
19
- };
20
- }), c = a(() => [
8
+ setup(k) {
9
+ const n = x(), o = u(), { getTopPosition: i } = b(), r = c(() => [
21
10
  {
22
11
  classes: "guido-text-block-onboarding-settings",
23
12
  right: "426px",
24
- top: e.value.settings.top,
25
- position: e.value.settings.position,
26
- title: i("email-editor.onboarding-text-block-title"),
27
- description: i("email-editor.onboarding-text-block-description"),
13
+ top: i(90),
14
+ position: "Right Top",
15
+ title: n("email-editor.onboarding-text-block-title"),
16
+ description: n("email-editor.onboarding-text-block-description"),
28
17
  imageSource: "",
29
18
  backButtonClick: () => {
30
19
  },
31
20
  nextButtonType: "text",
32
- nextButtonText: i("products.next"),
21
+ nextButtonText: n("products.next"),
33
22
  nextButtonClick: () => {
34
23
  o.next("textBlockOnboarding");
35
24
  }
36
25
  },
37
26
  {
38
27
  classes: "guido-text-block-onboarding-dynamic",
39
- right: "426px",
40
- top: e.value.dynamic.top,
41
- position: e.value.dynamic.position,
42
- title: i("email-editor.onboarding-dynamic-content-title"),
43
- description: i("email-editor.onboarding-dynamic-content-description"),
28
+ right: "409px",
29
+ top: i(607),
30
+ position: "Right Top",
31
+ title: n("email-editor.onboarding-dynamic-content-title"),
32
+ description: n("email-editor.onboarding-dynamic-content-description"),
44
33
  imageSource: "",
45
34
  backButtonType: "text",
46
- backButtonText: i("ds-steps.back"),
35
+ backButtonText: n("ds-steps.back"),
47
36
  backButtonClick: () => {
48
37
  o.previous("textBlockOnboarding");
49
38
  },
50
39
  nextButtonType: "text",
51
- nextButtonText: i("action-builder.ok"),
40
+ nextButtonText: n("action-builder.ok"),
52
41
  nextButtonClick: () => {
53
42
  o.close("textBlockOnboarding");
54
43
  }
55
44
  }
56
- ]), l = a(() => o.onboardings.textBlockOnboarding.config.length > 0 && o.onboardings.textBlockOnboarding.isActive), p = () => {
57
- var t, n;
58
- (n = (t = o.getTextBlockCurrentCard) == null ? void 0 : t.nextButtonClick) == null || n.call(t);
59
- }, x = () => {
60
- var t, n;
61
- (n = (t = o.getTextBlockCurrentCard) == null ? void 0 : t.backButtonClick) == null || n.call(t);
45
+ ]), a = c(() => o.onboardings.textBlockOnboarding.config.length > 0 && o.onboardings.textBlockOnboarding.isActive), s = () => {
46
+ var t, e;
47
+ (e = (t = o.getTextBlockCurrentCard) == null ? void 0 : t.nextButtonClick) == null || e.call(t);
48
+ }, d = () => {
49
+ var t, e;
50
+ (e = (t = o.getTextBlockCurrentCard) == null ? void 0 : t.backButtonClick) == null || e.call(t);
62
51
  };
63
- return b(
52
+ return g(
64
53
  () => o.isActive("textBlockOnboarding"),
65
54
  (t) => {
66
- t && o.setConfig("textBlockOnboarding", c.value);
55
+ t && o.setConfig("textBlockOnboarding", r.value);
67
56
  },
68
57
  { immediate: !0 }
69
- ), { __sfc: !0, trans: i, onboardingStore: o, dynamicPosition: e, onboardingCardsConfig: c, isVisible: l, handleNext: p, handleBack: x, InOnboard: B };
58
+ ), { __sfc: !0, trans: n, onboardingStore: o, getTopPosition: i, onboardingCardsConfig: r, isVisible: a, handleNext: s, handleBack: d, InOnboard: p };
70
59
  }
71
60
  });
72
61
  export {
73
- y as default
62
+ O as default
74
63
  };
@@ -1,15 +1,16 @@
1
- import { defineComponent as c, computed as e, watch as g } from "vue";
2
- import { useTranslations as b } from "../../../composables/useTranslations.js";
3
- import { useOnboardingStore as u } from "../../../stores/onboarding.js";
4
- import { InOnboard as l } from "@useinsider/design-system-vue";
5
- const C = /* @__PURE__ */ c({
1
+ import { defineComponent as g, computed as s, watch as b } from "vue";
2
+ import { useRibbonOffset as u } from "../../../composables/useRibbonOffset.js";
3
+ import { useTranslations as l } from "../../../composables/useTranslations.js";
4
+ import { useOnboardingStore as m } from "../../../stores/onboarding.js";
5
+ import { InOnboard as p } from "@useinsider/design-system-vue";
6
+ const k = /* @__PURE__ */ g({
6
7
  __name: "VersionHistoryOnboarding",
7
- setup(p) {
8
- const t = b(), n = u(), r = e(() => [
8
+ setup(f) {
9
+ const t = l(), n = m(), { getTopPosition: r } = u(), e = s(() => [
9
10
  {
10
11
  classes: "guido-version-history-onboarding",
11
12
  left: "409px",
12
- top: "192px",
13
+ top: r(192),
13
14
  position: "Left Top",
14
15
  title: t("email-editor.onboarding-version-history-title"),
15
16
  description: t("email-editor.onboarding-version-history-description"),
@@ -20,18 +21,18 @@ const C = /* @__PURE__ */ c({
20
21
  nextButtonText: t("action-builder.ok"),
21
22
  nextButtonClick: () => void n.close("versionHistoryOnboarding")
22
23
  }
23
- ]), s = e(() => n.onboardings.versionHistoryOnboarding.config.length > 0 && n.onboardings.versionHistoryOnboarding.isActive), a = () => {
24
+ ]), a = s(() => n.onboardings.versionHistoryOnboarding.config.length > 0 && n.onboardings.versionHistoryOnboarding.isActive), d = () => {
24
25
  var o, i;
25
26
  (i = (o = n.getVersionHistoryCurrentCard) == null ? void 0 : o.nextButtonClick) == null || i.call(o);
26
- }, d = () => {
27
+ }, c = () => {
27
28
  var o, i;
28
29
  (i = (o = n.getVersionHistoryCurrentCard) == null ? void 0 : o.backButtonClick) == null || i.call(o);
29
30
  };
30
- return g(() => n.onboardings.versionHistoryOnboarding.isActive, (o) => {
31
- o && n.setConfig("versionHistoryOnboarding", r.value);
32
- }, { immediate: !0 }), { __sfc: !0, trans: t, onboardingStore: n, onboardingCardsConfig: r, isVisible: s, handleNext: a, handleBack: d, InOnboard: l };
31
+ return b(() => n.onboardings.versionHistoryOnboarding.isActive, (o) => {
32
+ o && n.setConfig("versionHistoryOnboarding", e.value);
33
+ }, { immediate: !0 }), { __sfc: !0, trans: t, onboardingStore: n, getTopPosition: r, onboardingCardsConfig: e, isVisible: a, handleNext: d, handleBack: c, InOnboard: p };
33
34
  }
34
35
  });
35
36
  export {
36
- C as default
37
+ k as default
37
38
  };
@@ -10,29 +10,29 @@ import { useDebounceFn as V } from "../../../node_modules/@vueuse/shared/index.j
10
10
  const H = /* @__PURE__ */ A({
11
11
  __name: "SaveAsTemplateDrawer",
12
12
  setup(E) {
13
- const s = O(), o = D(), t = k(), { createTemplate: m } = B(), a = c(!1), n = c(!1), r = c(""), f = b(() => ({
13
+ const o = O(), n = D(), t = k(), { createTemplate: m } = B(), a = c(!1), r = c(!1), l = c(""), f = b(() => ({
14
14
  primaryButton: {
15
15
  styling: "solid",
16
16
  type: "primary",
17
- labelText: s(a.value ? "newsletter.saving" : "products.save"),
17
+ labelText: o(a.value ? "newsletter.saving" : "products.save"),
18
18
  loadingStatus: a.value,
19
19
  disabledStatus: t.skeletonStatus
20
20
  },
21
21
  cancelOrBackButton: {
22
22
  styling: "ghost",
23
23
  type: "secondary",
24
- labelText: s("products.cancel"),
24
+ labelText: o("products.cancel"),
25
25
  disabledStatus: a.value
26
26
  }
27
- })), p = () => {
28
- r.value = "", o.isSaveAsTemplateDrawerOpen = !1;
29
- }, l = async () => {
30
- const e = h(t, "templateName"), { success: i, errorMessage: _ } = await x(e).validate();
31
- return r.value = _, i;
27
+ })), u = () => {
28
+ l.value = "", n.isSaveAsTemplateDrawerOpen = !1;
29
+ }, i = async () => {
30
+ const e = h(t, "templateName"), { success: s, errorMessage: _ } = await x(e).validate();
31
+ return l.value = _, s;
32
32
  }, v = V(async (e) => {
33
- t.templateName = e, await l();
33
+ t.templateName = e, await i();
34
34
  }, 500), g = async (e) => {
35
- n.value = !0, await t.addCategory(e), n.value = !1;
35
+ r.value = !0, await t.addCategory(e), r.value = !1;
36
36
  }, y = (e) => {
37
37
  t.selectedCategories = e;
38
38
  }, S = (e) => {
@@ -40,22 +40,23 @@ const H = /* @__PURE__ */ A({
40
40
  }, T = () => {
41
41
  t.selectedCategories = [];
42
42
  }, w = async () => {
43
- if (a.value = !0, !await l()) {
43
+ if (a.value = !0, !await i()) {
44
44
  a.value = !1;
45
45
  return;
46
46
  }
47
- await m(), a.value = !1, p();
48
- }, u = () => {
47
+ const s = await m();
48
+ a.value = !1, s && u();
49
+ }, p = () => {
49
50
  C(() => {
50
51
  const e = document.querySelector("input#guido__template-name-input");
51
52
  e == null || e.focus();
52
53
  });
53
54
  }, d = async () => {
54
- t.$reset(), await t.fetchCategories(), t.skeletonStatus = !1, u();
55
+ t.$reset(), await t.fetchCategories(), t.skeletonStatus = !1, p();
55
56
  };
56
- return o.$subscribe((e, { isSaveAsTemplateDrawerOpen: i }) => {
57
- i && d();
58
- }), { __sfc: !0, trans: s, editorStore: o, saveAsTemplateStore: t, createTemplate: m, isSaving: a, isAddingOption: n, templateNameError: r, footerButtonGroupOptions: f, closeModal: p, validateTemplateName: l, handleTemplateName: v, handleAddOption: g, handleCategoryChange: y, handleSelectAllOptions: S, handleResetAllOptions: T, saveTemplate: w, focusToInput: u, initializeDrawer: d, WpDrawer: N, InBasicTextInput: M, InMultiSelect: I };
57
+ return n.$subscribe((e, { isSaveAsTemplateDrawerOpen: s }) => {
58
+ s && d();
59
+ }), { __sfc: !0, trans: o, editorStore: n, saveAsTemplateStore: t, createTemplate: m, isSaving: a, isAddingOption: r, templateNameError: l, footerButtonGroupOptions: f, closeModal: u, validateTemplateName: i, handleTemplateName: v, handleAddOption: g, handleCategoryChange: y, handleSelectAllOptions: S, handleResetAllOptions: T, saveTemplate: w, focusToInput: p, initializeDrawer: d, WpDrawer: N, InBasicTextInput: M, InMultiSelect: I };
59
60
  }
60
61
  });
61
62
  export {
@@ -89,11 +89,11 @@ const v = () => {
89
89
  updateHtmlAndCss: (t, e) => {
90
90
  window.StripoEditorApi.actionsApi.updateHtmlAndCss(t, e);
91
91
  },
92
- editorSave: () => {
93
- window.StripoEditorApi.actionsApi.save((t) => {
94
- t && n(t, "Failed to save template");
92
+ editorSave: () => new Promise((t) => {
93
+ window.StripoEditorApi.actionsApi.save((e) => {
94
+ e && n(e, "Failed to save template"), t();
95
95
  });
96
- }
96
+ })
97
97
  };
98
98
  };
99
99
  export {
@@ -0,0 +1,14 @@
1
+ const c = "https://email-static.useinsider.com/guido/guido-fs.js", u = () => ({ injectFullStory: () => {
2
+ var n;
3
+ const s = window;
4
+ if (typeof s._fs_org != "string" || !s._fs_org)
5
+ return;
6
+ const r = document.querySelector("ui-editor"), o = (n = r == null ? void 0 : r.shadowRoot) == null ? void 0 : n.querySelector("iframe"), e = o == null ? void 0 : o.contentDocument;
7
+ if (!e || e.querySelector('script[data-fullstory-bridge="true"]'))
8
+ return;
9
+ const t = e.createElement("script");
10
+ t.src = c, t.async = !0, t.crossOrigin = "anonymous", t.dataset.fullstoryBridge = "true", e.head.appendChild(t);
11
+ } });
12
+ export {
13
+ u as useFullStoryBridge
14
+ };
@@ -1,28 +1,30 @@
1
- import { defaultHtmlCompilerRules as n } from "../config/compiler/htmlCompilerRules.js";
2
- import { itemsCompilerRules as a } from "../config/compiler/itemsCompilerRules.js";
3
- import { outlookCompilerRules as f } from "../config/compiler/outlookCompilerRules.js";
4
- import { recommendationCompilerRules as R } from "../config/compiler/recommendationCompilerRules.js";
5
- import { socialCompilerRules as C } from "../config/compiler/socialCompilerRules.js";
1
+ import { defaultHtmlCompilerRules as c } from "../config/compiler/htmlCompilerRules.js";
2
+ import { itemsCompilerRules as f } from "../config/compiler/itemsCompilerRules.js";
3
+ import { liquidCompilerRules as R } from "../config/compiler/liquidCompilerRules.js";
4
+ import { outlookCompilerRules as C } from "../config/compiler/outlookCompilerRules.js";
5
+ import { recommendationCompilerRules as d } from "../config/compiler/recommendationCompilerRules.js";
6
+ import { socialCompilerRules as b } from "../config/compiler/socialCompilerRules.js";
6
7
  import { unsubscribeCompilerRules as g } from "../config/compiler/unsubscribeCompilerRules.js";
7
8
  import { createHtmlCompiler as H } from "../utils/htmlCompiler.js";
8
- import { useConfig as b } from "./useConfig.js";
9
- const q = () => {
9
+ import { useConfig as v } from "./useConfig.js";
10
+ const w = () => {
10
11
  var l, m, r;
11
- const { compiler: e, partner: t } = b(), i = ((l = e.value) == null ? void 0 : l.customRules) || [], s = [
12
- ...!!((m = e.value) != null && m.ignoreDefaultRules) ? [] : n,
13
- ...R,
12
+ const { compiler: e, isFeatureEnabled: t, partner: i } = v(), s = ((l = e.value) == null ? void 0 : l.customRules) || [], u = [
13
+ ...!!((m = e.value) != null && m.ignoreDefaultRules) ? [] : c,
14
+ ...d,
14
15
  ...g,
15
- ...a,
16
16
  ...f,
17
17
  ...C,
18
- ...i.map((o, c) => ({
18
+ ...b,
19
+ ...t("liquidSyntax") ? R : [],
20
+ ...s.map((o, a) => ({
19
21
  ...o,
20
- priority: o.priority + 1e3 + c
22
+ priority: o.priority + 1e3 + a
21
23
  // Ensure additional rules run after default rules
22
24
  }))
23
- ], p = H(s), u = (r = t.value) == null ? void 0 : r.fallbackFont;
24
- return { compileHtml: (o) => p.compile(o, void 0, u) };
25
+ ], p = H(u), n = (r = i.value) == null ? void 0 : r.fallbackFont;
26
+ return { compileHtml: (o) => p.compile(o, void 0, n) };
25
27
  };
26
28
  export {
27
- q as useHtmlCompiler
29
+ w as useHtmlCompiler
28
30
  };
@@ -0,0 +1,21 @@
1
+ import { RIBBON_SELECTOR as r } from "../enums/onboarding.js";
2
+ import { ref as f, onMounted as c, onBeforeUnmount as i } from "vue";
3
+ const m = () => {
4
+ const o = f(0);
5
+ let e = null;
6
+ const n = () => {
7
+ const t = document.querySelector(r), s = (t == null ? void 0 : t.offsetHeight) ?? 0;
8
+ o.value !== s && (o.value = s);
9
+ }, u = (t) => `${t + o.value}px`;
10
+ return c(() => {
11
+ n(), e = new MutationObserver(n), e.observe(document.body, {
12
+ childList: !0,
13
+ subtree: !0
14
+ });
15
+ }), i(() => {
16
+ e == null || e.disconnect();
17
+ }), { ribbonOffset: o, getTopPosition: u };
18
+ };
19
+ export {
20
+ m as useRibbonOffset
21
+ };
@@ -1,23 +1,32 @@
1
- import { useActionsApi as d } from "./useActionsApi.js";
2
- import { useConfig as f } from "./useConfig.js";
3
- import { useSaveStart as v, useSaveComplete as S } from "./useGuidoActions.js";
4
- import { useSyncModuleExtractor as x } from "./useSyncModuleExtractor.js";
5
- import { useStripoApi as V } from "../services/stripoApi.js";
6
- import { useTemplatePreparation as y } from "../utils/templatePreparation.js";
7
- import { useHtmlValidator as w } from "./useHtmlValidator.js";
8
- const k = () => {
9
- const o = v(), s = S(), { validateHtml: i } = w(), { callbacks: a } = f(), { extractSyncModuleData: r } = x(), { setSyncModuleUnsubscriptionPages: n } = V(), { editorSave: l } = d();
10
- return { save: async (c = !1) => {
11
- var e;
1
+ import { useActionsApi as V } from "./useActionsApi.js";
2
+ import { useConfig as x } from "./useConfig.js";
3
+ import { useSaveStart as y, useSaveComplete as w } from "./useGuidoActions.js";
4
+ import { useSyncModuleExtractor as C } from "./useSyncModuleExtractor.js";
5
+ import { useStripoApi as H } from "../services/stripoApi.js";
6
+ import { useTemplatePreparation as b } from "../utils/templatePreparation.js";
7
+ import { useHtmlValidator as q } from "./useHtmlValidator.js";
8
+ import { useCouponBlockValidator as L } from "./validators/useCouponBlockValidator.js";
9
+ import { useLiquidValidator as P } from "./validators/useLiquidValidator.js";
10
+ const h = () => {
11
+ const o = y(), s = w(), { validateHtml: r } = q(), { validateLiquidSyntax: l } = P(), { validateCouponBlockTags: n } = L(), { callbacks: a, isFeatureEnabled: d } = x(), { extractSyncModuleData: u } = C(), { setSyncModuleUnsubscriptionPages: c } = H(), { editorSave: m } = V();
12
+ return { save: async (p = !1) => {
13
+ var i;
12
14
  o();
13
- const { prepareTemplateDetails: m } = y(), t = await m();
14
- if (!await i(t.compiledHtml, t.dynamicContentList, !0) || (e = a.value) != null && e.externalValidation && !await a.value.externalValidation(t))
15
+ const { prepareTemplateDetails: f } = b(), t = await f();
16
+ if (!n(t.compiledHtml))
15
17
  return;
16
- l();
17
- const { unsubscribePayload: u, stripoModules: p } = r(t.rawHtml);
18
- return await n(u), t.modules = p, c || s(t), t;
18
+ if (d("liquidSyntax")) {
19
+ if (!await l(t.compiledHtml))
20
+ return;
21
+ } else if (!await r(t.compiledHtml, t.dynamicContentList, !0))
22
+ return;
23
+ if ((i = a.value) != null && i.externalValidation && !await a.value.externalValidation(t))
24
+ return;
25
+ await m();
26
+ const { unsubscribePayload: v, stripoModules: S } = u(t.rawHtml);
27
+ return await c(v), t.modules = S, p || s(t), t;
19
28
  } };
20
29
  };
21
30
  export {
22
- k as useSave
31
+ h as useSave
23
32
  };
@@ -1,25 +1,25 @@
1
- import { useActionsApi as A } from "./useActionsApi.js";
2
- import { useBlocksConfig as F } from "./useBlocksConfig.js";
3
- import { useConfig as D } from "./useConfig.js";
4
- import { useCustomInterfaceAppearance as I } from "./useCustomInterfaceAppearance.js";
5
- import { useStripoEventHandler as P } from "./useStripoEventHandler.js";
6
- import { useToaster as U } from "./useToaster.js";
7
- import { localePatch as R } from "../config/i18n/index.js";
8
- import { displayConditions as H } from "../enums/displayConditions.js";
1
+ import { useActionsApi as D } from "./useActionsApi.js";
2
+ import { useBlocksConfig as I } from "./useBlocksConfig.js";
3
+ import { useConfig as P } from "./useConfig.js";
4
+ import { useCustomInterfaceAppearance as U } from "./useCustomInterfaceAppearance.js";
5
+ import { useFullStoryBridge as R } from "./useFullStoryBridge.js";
6
+ import { useStripoEventHandler as q } from "./useStripoEventHandler.js";
7
+ import { useToaster as x } from "./useToaster.js";
8
+ import { localePatch as H } from "../config/i18n/index.js";
9
9
  import { useStripoApi as O } from "../services/stripoApi.js";
10
- import q from "../static/styles/customEditorStyle.css.js";
11
- import { useEditorStore as S } from "../stores/editor.js";
12
- import { dynamicContentToMergeTags as x } from "../utils/genericUtil.js";
13
- import L from "../package.json.js";
14
- const oe = (C, c) => {
15
- const { features: l, template: E } = D(), { handleError: u } = U(), { getToken: h, getCustomFonts: w, getSyncModulesStatus: b } = O(), { handleEvent: k } = P(), { getStripoBlocksConfig: T } = F(), V = async (i, n = [], r = !1) => {
16
- var f, g, y;
17
- const e = S(), { html: m, css: a } = i, { baseBlocks: o, extensions: d } = await T(), p = ((f = l.value) == null ? void 0 : f.displayConditions) ?? !0, B = ((g = l.value) == null ? void 0 : g.modulesDisabled) ?? !1, v = ((y = E.value) == null ? void 0 : y.forceRecreate) ?? !1;
10
+ import j from "../static/styles/customEditorStyle.css.js";
11
+ import { useEditorStore as E } from "../stores/editor.js";
12
+ import { dynamicContentToMergeTags as L } from "../utils/genericUtil.js";
13
+ import $ from "../package.json.js";
14
+ const se = (C, l) => {
15
+ const { features: c, template: h, isFeatureEnabled: u } = P(), { handleError: m } = x(), { getToken: w, getCustomFonts: b, getSyncModulesStatus: k } = O(), { handleEvent: B } = q(), { getStripoBlocksConfig: T } = I(), V = async (i, r = [], s = !1) => {
16
+ var g, S, y;
17
+ const e = E(), { html: p, css: a } = i, { baseBlocks: o, extensions: d } = await T(), f = ((g = c.value) == null ? void 0 : g.displayConditions) ?? !0, F = ((S = c.value) == null ? void 0 : S.modulesDisabled) ?? !1, v = ((y = h.value) == null ? void 0 : y.forceRecreate) ?? !1;
18
18
  window.UIEditor.initEditor(
19
19
  document.querySelector("#guido-editor"),
20
20
  {
21
21
  metadata: C,
22
- html: m,
22
+ html: p,
23
23
  css: a,
24
24
  forceRecreate: v,
25
25
  locale: "en",
@@ -28,49 +28,52 @@ const oe = (C, c) => {
28
28
  mobileViewButtonSelector: ".guido__view-option-selection-mobile",
29
29
  desktopViewButtonSelector: ".guido__view-option-selection-desktop",
30
30
  codeEditorButtonSelector: "#guido__code-button",
31
- customAppearanceMergetags: !0,
31
+ customAppearanceMergetags: !u("liquidSyntax"),
32
32
  customAppearanceMergetagsBorderColor: "#f1f3fe",
33
33
  customAppearanceMergetagsBackgroundColor: "#f1f3fe",
34
- customViewStyles: q,
35
- conditionsEnabled: p,
36
- customConditionsEnabled: p,
37
- conditionCategories: H,
34
+ customViewStyles: j,
35
+ conditionsEnabled: f,
36
+ customConditionsEnabled: f,
38
37
  enableXSSSecurity: !0,
39
- modulesDisabled: B,
40
- syncModulesEnabled: r,
38
+ modulesDisabled: F,
39
+ syncModulesEnabled: s,
41
40
  messageSettingsEnabled: !0,
42
41
  displayGmailAnnotations: !0,
43
42
  displayHiddenPreheader: !1,
44
43
  displayTitle: !1,
45
44
  displayUTM: !1,
46
45
  selectElementAfterDrop: !0,
46
+ allowedScriptSourceDomains: "https://email-static.useinsider.com https://edge.fullstory.com https://rs.fullstory.com",
47
47
  ...o ? { baseBlocks: o } : {},
48
48
  editorFonts: {
49
49
  showDefaultStandardFonts: !0,
50
50
  showDefaultNotStandardFonts: !0,
51
- customFonts: n
51
+ customFonts: r
52
52
  },
53
53
  mergeTags: [
54
54
  {
55
- entries: x(c.preselectedDynamicContentList)
55
+ entries: L(
56
+ l.preselectedDynamicContentList,
57
+ u("liquidSyntax")
58
+ )
56
59
  }
57
60
  ],
58
61
  async onTokenRefreshRequest(t) {
59
62
  try {
60
- const s = await h();
61
- t(s);
62
- } catch (s) {
63
- u(s, "Failed to refresh token");
63
+ const n = await w();
64
+ t(n);
65
+ } catch (n) {
66
+ m(n, "Failed to refresh token");
64
67
  }
65
68
  },
66
69
  onTemplateLoaded() {
67
70
  try {
68
- const { importCss: t } = I(), { activateCustomViewStyles: s, updateTimerInClonedTemplate: M } = A();
69
- t(), s(), M(), c.onReady(), e.isStripoInitialized = !0, e.loadingStatus = !1, setTimeout(() => {
71
+ const { importCss: t } = U(), { activateCustomViewStyles: n, updateTimerInClonedTemplate: M } = D(), { injectFullStory: A } = R();
72
+ t(), n(), A(), M(), l.onReady(), e.isStripoInitialized = !0, e.loadingStatus = !1, setTimeout(() => {
70
73
  e.hasChanges = !1;
71
74
  }, 1e3);
72
75
  } catch (t) {
73
- u(t, "Failed to load custom interface appearance");
76
+ m(t, "Failed to load custom interface appearance");
74
77
  }
75
78
  },
76
79
  onCodeEditorVisibilityChanged(t) {
@@ -85,39 +88,39 @@ const oe = (C, c) => {
85
88
  onDataChanged() {
86
89
  e.hasChanges = !0;
87
90
  },
88
- onEvent: k,
91
+ onEvent: B,
89
92
  ignoreClickOutsideSelectors: [
90
93
  "#guido-dynamic-content-modal",
91
94
  ".in-on-board-wrapper",
92
95
  ".in-drawer__container"
93
96
  ],
94
97
  extensions: d,
95
- localePatch: R
98
+ localePatch: H
96
99
  }
97
100
  );
98
- }, _ = (i) => new Promise((n, r) => {
101
+ }, _ = (i) => new Promise((r, s) => {
99
102
  var d;
100
103
  if (document.getElementById("UiEditorScript")) {
101
- i(), n();
104
+ i(), r();
102
105
  return;
103
106
  }
104
- const e = L.guido, a = `https://email-static.useinsider.com/guido/${(d = e == null ? void 0 : e.stripo) == null ? void 0 : d.version}/UIEditor.js`, o = document.createElement("script");
107
+ const e = $.guido, a = `https://email-static.useinsider.com/guido/${(d = e == null ? void 0 : e.stripo) == null ? void 0 : d.version}/UIEditor.js`, o = document.createElement("script");
105
108
  o.id = "UiEditorScript", o.type = "module", o.src = a, o.onload = () => {
106
- i(), n();
109
+ i(), r();
107
110
  }, o.onerror = () => {
108
- r(new Error(`Failed to load Stripo UIEditor script from S3: ${a}`));
111
+ s(new Error(`Failed to load Stripo UIEditor script from S3: ${a}`));
109
112
  }, document.body.appendChild(o);
110
113
  });
111
114
  return { initPlugin: async (i) => {
112
115
  await _(async () => {
113
- const n = S(), [r, e] = await Promise.all([
114
- w(),
115
- b()
116
+ const r = E(), [s, e] = await Promise.all([
117
+ b(),
118
+ k()
116
119
  ]);
117
- n.syncModulesEnabled = e, await V(i, r, e);
120
+ r.syncModulesEnabled = e, await V(i, s, e);
118
121
  });
119
122
  } };
120
123
  };
121
124
  export {
122
- oe as useStripo
125
+ se as useStripo
123
126
  };
@@ -0,0 +1,24 @@
1
+ import { ToasterTypeOptions as c } from "../../enums/toaster.js";
2
+ import { COUPON_PLACEHOLDER_DEFAULT as i, COUPON_PLACEHOLDER_LIQUID as l } from "../../extensions/Blocks/CouponBlock/template.js";
3
+ import { useToaster as m } from "../useToaster.js";
4
+ import { useTranslations as p } from "../useTranslations.js";
5
+ const u = /* @__PURE__ */ new Set([
6
+ i,
7
+ l
8
+ ]), A = () => {
9
+ const { showToaster: t } = m(), r = p();
10
+ return { validateCouponBlockTags: (e) => {
11
+ const n = new DOMParser().parseFromString(e, "text/html");
12
+ return Array.from(n.querySelectorAll(".coupon-block")).find((s) => {
13
+ var o;
14
+ const a = ((o = s.textContent) == null ? void 0 : o.trim()) ?? "";
15
+ return !u.has(a);
16
+ }) ? (t({
17
+ type: c.Warning,
18
+ message: r("newsletter.coupon-tag-modified")
19
+ }), !1) : !0;
20
+ } };
21
+ };
22
+ export {
23
+ A as useCouponBlockValidator
24
+ };
@@ -0,0 +1,42 @@
1
+ import { ToasterTypeOptions as a } from "../../enums/toaster.js";
2
+ import { base64EncodeWithSpecialChars as u } from "../../utils/base64.js";
3
+ import { useHttp as d } from "../useHttp.js";
4
+ import { useToaster as c } from "../useToaster.js";
5
+ import { useTranslations as p } from "../useTranslations.js";
6
+ const v = () => {
7
+ const { post: i } = d(), { showToaster: e } = c(), s = p();
8
+ return { validateLiquidSyntax: async (o) => {
9
+ try {
10
+ const t = await i("/newsletter/contents/validate-syntax", [{
11
+ identifier: "default",
12
+ syntax: "liquid",
13
+ contents: {
14
+ subject: null,
15
+ preheader: null,
16
+ html: u(o),
17
+ ampHtml: null
18
+ }
19
+ }]);
20
+ if (!Array.isArray(t.data)) {
21
+ const l = t.data;
22
+ return e({
23
+ type: a.Warning,
24
+ message: l.message ?? s("journey-builder.liquid-validation-failed")
25
+ }), !1;
26
+ }
27
+ const [r] = t.data, n = Object.values((r == null ? void 0 : r.errors) ?? {});
28
+ return n.length ? (e({
29
+ type: a.Warning,
30
+ message: n[0].replace(/^line \d+:\s*/, "")
31
+ }), !1) : !0;
32
+ } catch {
33
+ return e({
34
+ type: a.Alert,
35
+ message: s("journey-builder.liquid-validation-failed")
36
+ }), !1;
37
+ }
38
+ } };
39
+ };
40
+ export {
41
+ v as useLiquidValidator
42
+ };
@@ -0,0 +1,15 @@
1
+ import { COUPON_PLACEHOLDER_LIQUID as e, COUPON_PLACEHOLDER_DEFAULT as i } from "../../extensions/Blocks/CouponBlock/template.js";
2
+ const o = [
3
+ {
4
+ id: "liquid-coupon-code",
5
+ description: "Replace legacy coupon placeholder with liquid syntax",
6
+ type: "replace",
7
+ search: i,
8
+ replacement: e,
9
+ replaceAll: !0,
10
+ priority: 50
11
+ }
12
+ ];
13
+ export {
14
+ o as liquidCompilerRules
15
+ };