@useinsider/guido 2.0.0-beta.d170da6 → 2.0.0-beta.da696d5

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 (113) hide show
  1. package/README.md +2 -0
  2. package/dist/@types/config/schemas.js +3 -1
  3. package/dist/components/Guido.vue.js +1 -1
  4. package/dist/components/Guido.vue2.js +15 -17
  5. package/dist/composables/useStripo.js +40 -40
  6. package/dist/extensions/Blocks/Recommendation/cardCompositionControl.js +69 -153
  7. package/dist/extensions/Blocks/Recommendation/constants.js +1 -9
  8. package/dist/extensions/Blocks/Recommendation/control.js +59 -74
  9. package/dist/extensions/Blocks/Recommendation/controls/button/align.js +13 -0
  10. package/dist/extensions/Blocks/Recommendation/controls/button/border.js +13 -0
  11. package/dist/extensions/Blocks/Recommendation/controls/button/borderRadius.js +13 -0
  12. package/dist/extensions/Blocks/Recommendation/controls/button/color.js +13 -0
  13. package/dist/extensions/Blocks/Recommendation/controls/button/fitToContent.js +13 -0
  14. package/dist/extensions/Blocks/Recommendation/controls/button/fontFamily.js +13 -0
  15. package/dist/extensions/Blocks/Recommendation/controls/button/margins.js +13 -0
  16. package/dist/extensions/Blocks/Recommendation/controls/button/paddings.js +13 -0
  17. package/dist/extensions/Blocks/Recommendation/controls/button/text.js +13 -0
  18. package/dist/extensions/Blocks/Recommendation/controls/button/textSize.js +13 -0
  19. package/dist/extensions/Blocks/Recommendation/controls/button/textStyleAndFontColor.js +13 -0
  20. package/dist/extensions/Blocks/Recommendation/controls/image/margins.js +13 -0
  21. package/dist/extensions/Blocks/Recommendation/controls/image/size.js +13 -0
  22. package/dist/extensions/Blocks/Recommendation/controls/name/align.js +13 -0
  23. package/dist/extensions/Blocks/Recommendation/controls/name/background.js +13 -0
  24. package/dist/extensions/Blocks/Recommendation/controls/name/color.js +13 -0
  25. package/dist/extensions/Blocks/Recommendation/controls/name/fontFamily.js +13 -0
  26. package/dist/extensions/Blocks/Recommendation/controls/name/paddings.js +13 -0
  27. package/dist/extensions/Blocks/Recommendation/controls/name/size.js +13 -0
  28. package/dist/extensions/Blocks/Recommendation/controls/name/style.js +13 -0
  29. package/dist/extensions/Blocks/Recommendation/controls/oldPrice/align.js +13 -0
  30. package/dist/extensions/Blocks/Recommendation/controls/oldPrice/background.js +13 -0
  31. package/dist/extensions/Blocks/Recommendation/controls/oldPrice/color.js +13 -0
  32. package/dist/extensions/Blocks/Recommendation/controls/oldPrice/fontFamily.js +13 -0
  33. package/dist/extensions/Blocks/Recommendation/controls/oldPrice/paddings.js +13 -0
  34. package/dist/extensions/Blocks/Recommendation/controls/oldPrice/size.js +13 -0
  35. package/dist/extensions/Blocks/Recommendation/controls/oldPrice/style.js +13 -0
  36. package/dist/extensions/Blocks/Recommendation/controls/price/align.js +13 -0
  37. package/dist/extensions/Blocks/Recommendation/controls/price/background.js +13 -0
  38. package/dist/extensions/Blocks/Recommendation/controls/price/color.js +13 -0
  39. package/dist/extensions/Blocks/Recommendation/controls/price/fontFamily.js +13 -0
  40. package/dist/extensions/Blocks/Recommendation/controls/price/paddings.js +13 -0
  41. package/dist/extensions/Blocks/Recommendation/controls/price/size.js +13 -0
  42. package/dist/extensions/Blocks/Recommendation/controls/price/style.js +13 -0
  43. package/dist/extensions/Blocks/Recommendation/extension.js +42 -16
  44. package/dist/extensions/Blocks/Recommendation/settingsPanel.js +72 -117
  45. package/dist/extensions/Blocks/Recommendation/templates/blockTemplate.js +64 -85
  46. package/dist/extensions/Blocks/Recommendation/templates/migrationTemplate.js +17 -54
  47. package/dist/extensions/Blocks/Recommendation/templates/templateUtils.js +45 -74
  48. package/dist/guido.css +1 -1
  49. package/dist/node_modules/@stripoinc/ui-editor-extensions/dist/esm/index.js +52 -47
  50. package/dist/services/stripoApi.js +6 -10
  51. package/dist/src/@types/config/schemas.d.ts +4 -0
  52. package/dist/src/composables/useConfig.d.ts +2 -0
  53. package/dist/src/extensions/Blocks/Recommendation/cardCompositionControl.d.ts +3 -50
  54. package/dist/src/extensions/Blocks/Recommendation/constants.d.ts +0 -32
  55. package/dist/src/extensions/Blocks/Recommendation/control.d.ts +2 -5
  56. package/dist/src/extensions/Blocks/Recommendation/controls/button/align.d.ts +5 -0
  57. package/dist/src/extensions/Blocks/Recommendation/controls/button/border.d.ts +5 -0
  58. package/dist/src/extensions/Blocks/Recommendation/controls/button/borderRadius.d.ts +5 -0
  59. package/dist/src/extensions/Blocks/Recommendation/controls/button/color.d.ts +5 -0
  60. package/dist/src/extensions/Blocks/Recommendation/controls/button/fitToContent.d.ts +5 -0
  61. package/dist/src/extensions/Blocks/Recommendation/controls/button/fontFamily.d.ts +5 -0
  62. package/dist/src/extensions/Blocks/Recommendation/controls/button/margins.d.ts +5 -0
  63. package/dist/src/extensions/Blocks/Recommendation/controls/button/paddings.d.ts +5 -0
  64. package/dist/src/extensions/Blocks/Recommendation/controls/button/text.d.ts +5 -0
  65. package/dist/src/extensions/Blocks/Recommendation/controls/button/textSize.d.ts +5 -0
  66. package/dist/src/extensions/Blocks/Recommendation/controls/button/textStyleAndFontColor.d.ts +5 -0
  67. package/dist/src/extensions/Blocks/Recommendation/controls/image/margins.d.ts +5 -0
  68. package/dist/src/extensions/Blocks/Recommendation/controls/image/size.d.ts +5 -0
  69. package/dist/src/extensions/Blocks/Recommendation/controls/name/align.d.ts +5 -0
  70. package/dist/src/extensions/Blocks/Recommendation/controls/name/background.d.ts +5 -0
  71. package/dist/src/extensions/Blocks/Recommendation/controls/name/color.d.ts +5 -0
  72. package/dist/src/extensions/Blocks/Recommendation/controls/name/fontFamily.d.ts +5 -0
  73. package/dist/src/extensions/Blocks/Recommendation/controls/name/paddings.d.ts +5 -0
  74. package/dist/src/extensions/Blocks/Recommendation/controls/name/size.d.ts +5 -0
  75. package/dist/src/extensions/Blocks/Recommendation/controls/name/style.d.ts +5 -0
  76. package/dist/src/extensions/Blocks/Recommendation/controls/oldPrice/align.d.ts +5 -0
  77. package/dist/src/extensions/Blocks/Recommendation/controls/oldPrice/background.d.ts +5 -0
  78. package/dist/src/extensions/Blocks/Recommendation/controls/oldPrice/color.d.ts +5 -0
  79. package/dist/src/extensions/Blocks/Recommendation/controls/oldPrice/fontFamily.d.ts +5 -0
  80. package/dist/src/extensions/Blocks/Recommendation/controls/oldPrice/paddings.d.ts +5 -0
  81. package/dist/src/extensions/Blocks/Recommendation/controls/oldPrice/size.d.ts +5 -0
  82. package/dist/src/extensions/Blocks/Recommendation/controls/oldPrice/style.d.ts +5 -0
  83. package/dist/src/extensions/Blocks/Recommendation/controls/price/align.d.ts +5 -0
  84. package/dist/src/extensions/Blocks/Recommendation/controls/price/background.d.ts +5 -0
  85. package/dist/src/extensions/Blocks/Recommendation/controls/price/color.d.ts +5 -0
  86. package/dist/src/extensions/Blocks/Recommendation/controls/price/fontFamily.d.ts +5 -0
  87. package/dist/src/extensions/Blocks/Recommendation/controls/price/paddings.d.ts +5 -0
  88. package/dist/src/extensions/Blocks/Recommendation/controls/price/size.d.ts +5 -0
  89. package/dist/src/extensions/Blocks/Recommendation/controls/price/style.d.ts +5 -0
  90. package/dist/src/extensions/Blocks/Recommendation/templates/blockTemplate.d.ts +3 -3
  91. package/dist/src/extensions/Blocks/Recommendation/templates/templateUtils.d.ts +7 -15
  92. package/dist/src/stores/config.d.ts +17 -0
  93. package/dist/static/styles/components/wide-panel.css.js +4 -0
  94. package/dist/static/styles/customEditorStyle.css.js +0 -13
  95. package/package.json +1 -1
  96. package/dist/extensions/Blocks/Recommendation/controls/cardBackgroundColorControl.js +0 -68
  97. package/dist/extensions/Blocks/Recommendation/controls/index.js +0 -245
  98. package/dist/extensions/Blocks/Recommendation/controls/nameTextTrimControl.js +0 -74
  99. package/dist/extensions/Blocks/Recommendation/controls/omnibusDiscountTextAfterControl.js +0 -71
  100. package/dist/extensions/Blocks/Recommendation/controls/omnibusDiscountTextBeforeControl.js +0 -71
  101. package/dist/extensions/Blocks/Recommendation/controls/omnibusPriceTextAfterControl.js +0 -71
  102. package/dist/extensions/Blocks/Recommendation/controls/omnibusPriceTextBeforeControl.js +0 -71
  103. package/dist/extensions/Blocks/Recommendation/controls/spacingControl.js +0 -188
  104. package/dist/extensions/Blocks/Recommendation/utils/preserveTextStyles.js +0 -25
  105. package/dist/src/extensions/Blocks/Recommendation/controls/cardBackgroundColorControl.d.ts +0 -25
  106. package/dist/src/extensions/Blocks/Recommendation/controls/index.d.ts +0 -592
  107. package/dist/src/extensions/Blocks/Recommendation/controls/nameTextTrimControl.d.ts +0 -16
  108. package/dist/src/extensions/Blocks/Recommendation/controls/omnibusDiscountTextAfterControl.d.ts +0 -15
  109. package/dist/src/extensions/Blocks/Recommendation/controls/omnibusDiscountTextBeforeControl.d.ts +0 -15
  110. package/dist/src/extensions/Blocks/Recommendation/controls/omnibusPriceTextAfterControl.d.ts +0 -15
  111. package/dist/src/extensions/Blocks/Recommendation/controls/omnibusPriceTextBeforeControl.d.ts +0 -15
  112. package/dist/src/extensions/Blocks/Recommendation/controls/spacingControl.d.ts +0 -60
  113. package/dist/src/extensions/Blocks/Recommendation/utils/preserveTextStyles.d.ts +0 -19
package/README.md CHANGED
@@ -110,6 +110,7 @@ const config: GuidoConfigInput = {
110
110
  css?: string,
111
111
  preselectedDynamicContent?: DynamicContent[],
112
112
  selectedUnsubscribePages?: number[],
113
+ forceRecreate?: boolean, // Default: false - Force recreate template in Stripo storage
113
114
  },
114
115
 
115
116
  // Optional: Editor settings
@@ -137,6 +138,7 @@ const config: GuidoConfigInput = {
137
138
  testMessage?: boolean, // Default: true
138
139
  displayConditions?: boolean, // Default: true
139
140
  unsubscribe?: boolean, // Default: true
141
+ modulesDisabled?: boolean, // Default: false - Disable modules panel
140
142
  },
141
143
 
142
144
  // Optional: Block configuration
@@ -71,7 +71,9 @@ const i = {
71
71
  []
72
72
  ),
73
73
  /** Selected unsubscribe page IDs */
74
- selectedUnsubscribePages: e(a(p()), [])
74
+ selectedUnsubscribePages: e(a(p()), []),
75
+ /** Force recreate template in Stripo storage (use true when updating externally modified templates) */
76
+ forceRecreate: e(c(), !1)
75
77
  }), C = o({
76
78
  /** Sender display name */
77
79
  senderName: e(t(), ""),
@@ -12,7 +12,7 @@ var t = function() {
12
12
  n,
13
13
  !1,
14
14
  null,
15
- "282ca4d1"
15
+ "890b5336"
16
16
  );
17
17
  const v = s.exports;
18
18
  export {
@@ -1,4 +1,4 @@
1
- import { defineComponent as x, defineAsyncComponent as P, ref as B, computed as U, watch as N, onMounted as z, onUnmounted as K } from "vue";
1
+ import { defineComponent as B, defineAsyncComponent as P, ref as N, computed as U, watch as R, onMounted as z, onUnmounted as K } from "vue";
2
2
  import { provideGuidoActions as M } from "../composables/useGuidoActions.js";
3
3
  import { usePartner as j } from "../composables/usePartner.js";
4
4
  import { useStripo as q } from "../composables/useStripo.js";
@@ -15,8 +15,8 @@ import { useConfigStore as oe } from "../stores/config.js";
15
15
  import { useDynamicContentStore as te } from "../stores/dynamic-content.js";
16
16
  import { useEditorStore as ne } from "../stores/editor.js";
17
17
  import { usePreviewStore as re } from "../stores/preview.js";
18
- import { useUnsubscribeStore as ce } from "../stores/unsubscribe.js";
19
- const Ee = /* @__PURE__ */ x({
18
+ import { useUnsubscribeStore as se } from "../stores/unsubscribe.js";
19
+ const Ee = /* @__PURE__ */ B({
20
20
  __name: "Guido",
21
21
  props: {
22
22
  config: null
@@ -27,19 +27,19 @@ const Ee = /* @__PURE__ */ x({
27
27
  () => import("./organisms/email-preview/PreviewContainer.vue.js")
28
28
  ), A = P(
29
29
  () => import("./organisms/onboarding/OnboardingWrapper.vue.js")
30
- ), p = B(), s = te(), u = ce(), n = oe();
30
+ ), p = N(), c = te(), u = se(), n = oe();
31
31
  n.init(l.config);
32
32
  const i = ne(), F = re(), r = U(() => i.hasChanges), { isTestPartner: G } = j(), v = () => {
33
33
  var e;
34
34
  return (e = p.value) == null ? void 0 : e.handleSave(!0);
35
- }, { templateId: a, userId: y, partnerName: h, productType: f, username: b, template: o } = n, c = (o == null ? void 0 : o.html) || "", g = (o == null ? void 0 : o.css) || "", m = (o == null ? void 0 : o.preselectedDynamicContent) || [];
35
+ }, { templateId: a, userId: y, partnerName: h, productType: b, username: f, template: o } = n, s = (o == null ? void 0 : o.html) || "", g = (o == null ? void 0 : o.css) || "", m = (o == null ? void 0 : o.preselectedDynamicContent) || [];
36
36
  i.templateId = a;
37
37
  const { initPlugin: S } = q({
38
38
  emailId: a,
39
39
  userId: y,
40
- username: b,
40
+ username: f,
41
41
  partnerName: h,
42
- productType: f,
42
+ productType: b,
43
43
  preselectedDynamicContentList: m,
44
44
  onReady: () => {
45
45
  console.debug("guido:ready"), t("ready");
@@ -63,28 +63,26 @@ const Ee = /* @__PURE__ */ x({
63
63
  }
64
64
  });
65
65
  const E = (e) => {
66
- console.debug("dynamic-content:close", e), s.setSelectedDynamicContent(e), document.dispatchEvent(new CustomEvent("dynamic-content:close", { detail: e }));
66
+ console.debug("dynamic-content:close", e), c.setSelectedDynamicContent(e), document.dispatchEvent(new CustomEvent("dynamic-content:close", { detail: e }));
67
67
  }, k = () => {
68
68
  console.debug("dynamic-content:close", "Without Data"), document.dispatchEvent(new CustomEvent("dynamic-content:close", { detail: { text: "", value: "" } }));
69
69
  };
70
- N(() => r.value, () => {
70
+ R(() => r.value, () => {
71
71
  t("on-change", r.value);
72
72
  });
73
73
  const d = (e) => {
74
- const T = e, { attribute: O, position: R } = T.detail;
75
- console.debug("dynamic-content:open", T.detail), t("dynamic-content:open", O, R);
74
+ const T = e, { attribute: O, position: x } = T.detail;
75
+ console.debug("dynamic-content:open", T.detail), t("dynamic-content:open", O, x);
76
76
  };
77
77
  return z(async () => {
78
78
  console.debug("Guido says happy coding 🎉"), console.debug("🚗 Ka-Chow");
79
79
  try {
80
80
  u.selectedUnsubscribePages = (o == null ? void 0 : o.selectedUnsubscribePages) || [];
81
81
  let e = {
82
- html: c && await W(c),
83
- css: g,
84
- forceRecreate: !0
85
- // TODO: It should be false for old templates. We will communicate with Stripo
82
+ html: s && await W(s),
83
+ css: g
86
84
  };
87
- e.html || (e = await w(), e.html = await W(e.html)), D(e.html) && (e.html = await C(e.html)), await S(e), s.selectedDynamicContentList = m;
85
+ e.html || (e = await w(), e.html = await W(e.html)), D(e.html) && (e.html = await C(e.html)), await S(e), c.selectedDynamicContentList = m;
88
86
  } catch (e) {
89
87
  console.error("Failed to initialize Stripo editor:", e);
90
88
  }
@@ -104,7 +102,7 @@ const Ee = /* @__PURE__ */ x({
104
102
  },
105
103
  hasChanges: r,
106
104
  saveSilent: v
107
- }), { __sfc: !0, PreviewContainer: L, OnboardingWrapper: A, headerWrapperRef: p, dynamicContentStore: s, unsubscribeStore: u, props: l, configStore: n, editorStore: i, previewStore: F, hasChanges: r, isTestPartner: G, saveSilent: v, templateId: a, userId: y, partnerName: h, productType: f, username: b, templateConfig: o, html: c, css: g, preselectedDynamicContentList: m, emit: t, initPlugin: S, getDefaultTemplate: w, cloneTimersOnSave: C, hasTimerBlocks: D, noHeader: H, insertDynamicContent: E, closeDynamicContent: k, handleDynamicContentOpen: d, Toaster: Q, FilterSelectionDrawer: V, HeaderWrapper: X, LoadingWrapper: Y, SaveAsTemplateDrawer: Z, UnsubscribeWrapper: $ };
105
+ }), { __sfc: !0, PreviewContainer: L, OnboardingWrapper: A, headerWrapperRef: p, dynamicContentStore: c, unsubscribeStore: u, props: l, configStore: n, editorStore: i, previewStore: F, hasChanges: r, isTestPartner: G, saveSilent: v, templateId: a, userId: y, partnerName: h, productType: b, username: f, templateConfig: o, html: s, css: g, preselectedDynamicContentList: m, emit: t, initPlugin: S, getDefaultTemplate: w, cloneTimersOnSave: C, hasTimerBlocks: D, noHeader: H, insertDynamicContent: E, closeDynamicContent: k, handleDynamicContentOpen: d, Toaster: Q, FilterSelectionDrawer: V, HeaderWrapper: X, LoadingWrapper: Y, SaveAsTemplateDrawer: Z, UnsubscribeWrapper: $ };
108
106
  }
109
107
  });
110
108
  export {
@@ -1,26 +1,26 @@
1
- import { useActionsApi as T } from "./useActionsApi.js";
2
- import { useBlocksConfig as V } from "./useBlocksConfig.js";
3
- import { useConfig as _ } from "./useConfig.js";
4
- import { useCustomInterfaceAppearance as B } from "./useCustomInterfaceAppearance.js";
5
- import { useStripoEventHandler as v } from "./useStripoEventHandler.js";
6
- import { useToaster as A } from "./useToaster.js";
7
- import { displayConditions as F } from "../enums/displayConditions.js";
8
- import { useStripoApi as D } from "../services/stripoApi.js";
9
- import I from "../static/styles/customEditorStyle.css.js";
10
- import { useEditorStore as M } from "../stores/editor.js";
11
- import { dynamicContentToMergeTags as U } from "../utils/genericUtil.js";
12
- import P from "../package.json.js";
13
- const K = (c) => {
14
- const { features: l } = _(), { handleError: u } = A(), { getToken: y, getCustomFonts: S } = D(), { handleEvent: C } = v(), { getStripoBlocksConfig: E } = V(), h = async (i, n = []) => {
15
- var g, f;
16
- const o = M(), { html: r, css: p, forceRecreate: a } = i, { baseBlocks: t, extensions: d } = await E(), m = ((g = l.value) == null ? void 0 : g.displayConditions) ?? !0, b = ((f = l.value) == null ? void 0 : f.modulesDisabled) ?? !1;
1
+ import { useActionsApi as _ } from "./useActionsApi.js";
2
+ import { useBlocksConfig as B } from "./useBlocksConfig.js";
3
+ import { useConfig as v } from "./useConfig.js";
4
+ import { useCustomInterfaceAppearance as A } from "./useCustomInterfaceAppearance.js";
5
+ import { useStripoEventHandler as F } from "./useStripoEventHandler.js";
6
+ import { useToaster as D } from "./useToaster.js";
7
+ import { displayConditions as I } from "../enums/displayConditions.js";
8
+ import { useStripoApi as M } from "../services/stripoApi.js";
9
+ import U from "../static/styles/customEditorStyle.css.js";
10
+ import { useEditorStore as P } from "../stores/editor.js";
11
+ import { dynamicContentToMergeTags as R } from "../utils/genericUtil.js";
12
+ import H from "../package.json.js";
13
+ const W = (c) => {
14
+ const { features: l, template: y } = v(), { handleError: u } = D(), { getToken: C, getCustomFonts: S } = M(), { handleEvent: E } = F(), { getStripoBlocksConfig: h } = B(), w = async (i, n = []) => {
15
+ var m, g, f;
16
+ const o = P(), { html: r, css: p } = i, { baseBlocks: s, extensions: t } = await h(), a = ((m = l.value) == null ? void 0 : m.displayConditions) ?? !0, k = ((g = l.value) == null ? void 0 : g.modulesDisabled) ?? !1, T = ((f = y.value) == null ? void 0 : f.forceRecreate) ?? !1;
17
17
  window.UIEditor.initEditor(
18
18
  document.querySelector("#guido-editor"),
19
19
  {
20
20
  metadata: c,
21
21
  html: r,
22
22
  css: p,
23
- forceRecreate: a,
23
+ forceRecreate: T,
24
24
  locale: "en",
25
25
  undoButtonSelector: "#guido__undo-button",
26
26
  redoButtonSelector: "#guido__redo-button",
@@ -30,19 +30,19 @@ const K = (c) => {
30
30
  customAppearanceMergetags: !0,
31
31
  customAppearanceMergetagsBorderColor: "#f1f3fe",
32
32
  customAppearanceMergetagsBackgroundColor: "#f1f3fe",
33
- customViewStyles: I,
34
- conditionsEnabled: m,
35
- customConditionsEnabled: m,
36
- conditionCategories: F,
33
+ customViewStyles: U,
34
+ conditionsEnabled: a,
35
+ customConditionsEnabled: a,
36
+ conditionCategories: I,
37
37
  enableXSSSecurity: !0,
38
- modulesDisabled: b,
38
+ modulesDisabled: k,
39
39
  messageSettingsEnabled: !0,
40
40
  displayGmailAnnotations: !0,
41
41
  displayHiddenPreheader: !1,
42
42
  displayTitle: !1,
43
43
  displayUTM: !1,
44
44
  selectElementAfterDrop: !0,
45
- ...t ? { baseBlocks: t } : {},
45
+ ...s ? { baseBlocks: s } : {},
46
46
  editorFonts: {
47
47
  showDefaultStandardFonts: !0,
48
48
  showDefaultNotStandardFonts: !0,
@@ -50,21 +50,21 @@ const K = (c) => {
50
50
  },
51
51
  mergeTags: [
52
52
  {
53
- entries: U(c.preselectedDynamicContentList)
53
+ entries: R(c.preselectedDynamicContentList)
54
54
  }
55
55
  ],
56
56
  async onTokenRefreshRequest(e) {
57
57
  try {
58
- const s = await y();
59
- e(s);
60
- } catch (s) {
61
- u(s, "Failed to refresh token");
58
+ const d = await C();
59
+ e(d);
60
+ } catch (d) {
61
+ u(d, "Failed to refresh token");
62
62
  }
63
63
  },
64
64
  onTemplateLoaded() {
65
65
  try {
66
- const { importCss: e } = B(), { activateCustomViewStyles: s, updateTimerInClonedTemplate: k } = T();
67
- e(), s(), k(), c.onReady(), o.isStripoInitialized = !0, o.loadingStatus = !1, setTimeout(() => {
66
+ const { importCss: e } = A(), { activateCustomViewStyles: d, updateTimerInClonedTemplate: V } = _();
67
+ e(), d(), V(), c.onReady(), o.isStripoInitialized = !0, o.loadingStatus = !1, setTimeout(() => {
68
68
  o.hasChanges = !1;
69
69
  }, 1e3);
70
70
  } catch (e) {
@@ -83,35 +83,35 @@ const K = (c) => {
83
83
  onDataChanged() {
84
84
  o.hasChanges = !0;
85
85
  },
86
- onEvent: C,
86
+ onEvent: E,
87
87
  ignoreClickOutsideSelectors: [
88
88
  "#guido-dynamic-content-modal",
89
89
  ".in-on-board-wrapper",
90
90
  ".in-drawer__container"
91
91
  ],
92
- extensions: d
92
+ extensions: t
93
93
  }
94
94
  );
95
- }, w = (i) => new Promise((n, o) => {
96
- var d;
95
+ }, b = (i) => new Promise((n, o) => {
96
+ var a;
97
97
  if (document.getElementById("UiEditorScript")) {
98
98
  i(), n();
99
99
  return;
100
100
  }
101
- const r = P.guido, a = `https://email-static.useinsider.com/guido/${(d = r == null ? void 0 : r.stripo) == null ? void 0 : d.version}/UIEditor.js`, t = document.createElement("script");
102
- t.id = "UiEditorScript", t.type = "module", t.src = a, t.onload = () => {
101
+ const r = H.guido, s = `https://email-static.useinsider.com/guido/${(a = r == null ? void 0 : r.stripo) == null ? void 0 : a.version}/UIEditor.js`, t = document.createElement("script");
102
+ t.id = "UiEditorScript", t.type = "module", t.src = s, t.onload = () => {
103
103
  i(), n();
104
104
  }, t.onerror = () => {
105
- o(new Error(`Failed to load Stripo UIEditor script from S3: ${a}`));
105
+ o(new Error(`Failed to load Stripo UIEditor script from S3: ${s}`));
106
106
  }, document.body.appendChild(t);
107
107
  });
108
108
  return { initPlugin: async (i) => {
109
- await w(async () => {
109
+ await b(async () => {
110
110
  const n = await S();
111
- await h(i, n);
111
+ await w(i, n);
112
112
  });
113
113
  } };
114
114
  };
115
115
  export {
116
- K as useStripo
116
+ W as useStripo
117
117
  };
@@ -1,187 +1,103 @@
1
- import { ModificationDescription as n } from "../../../node_modules/@stripoinc/ui-editor-extensions/dist/esm/index.js";
2
- import { CommonControl as _ } from "../common-control.js";
3
- import { ATTR_PRODUCT_IMAGE as m, ATTR_PRODUCT_NAME as y, ATTR_PRODUCT_PRICE as T, ATTR_PRODUCT_OLD_PRICE as h, ATTR_PRODUCT_OMNIBUS_PRICE as C, ATTR_PRODUCT_OMNIBUS_DISCOUNT as f, ATTR_PRODUCT_BUTTON as g } from "./constants.js";
4
- const R = "ui-elements-recommendation-card-composition", l = ".recommendation-attribute-row", A = "tr.recommendation-product-row", c = "data-card-composition", a = "data-attribute-type", d = "data-visibility", s = [
5
- { key: m, label: "Product Image", visible: !0 },
6
- { key: y, label: "Product Name", visible: !0 },
7
- { key: T, label: "Product Price", visible: !0 },
8
- { key: h, label: "Product Original Price", visible: !0 },
9
- { key: C, label: "Omnibus Price", visible: !1 },
10
- { key: f, label: "Omnibus Discount", visible: !1 },
11
- { key: g, label: "Product Button", visible: !0 }
1
+ var m = Object.defineProperty;
2
+ var y = (n, o, i) => o in n ? m(n, o, { enumerable: !0, configurable: !0, writable: !0, value: i }) : n[o] = i;
3
+ var a = (n, o, i) => y(n, typeof o != "symbol" ? o + "" : o, i);
4
+ import { ModificationDescription as u } from "../../../node_modules/@stripoinc/ui-editor-extensions/dist/esm/index.js";
5
+ import { CommonControl as b } from "../common-control.js";
6
+ const h = "ui-elements-recommendation-card-composition", s = [
7
+ { key: "productImage", label: "Product Image", visible: !0 },
8
+ { key: "productName", label: "Product Name", visible: !0 },
9
+ { key: "productPrice", label: "Product Price", visible: !0 },
10
+ { key: "productOriginalPrice", label: "Product Original Price", visible: !0 },
11
+ { key: "productButton", label: "Product Button", visible: !0 }
12
12
  ];
13
- class N extends _ {
13
+ class g extends b {
14
+ constructor() {
15
+ super(...arguments);
16
+ a(this, "currentComposition", []);
17
+ a(this, "currentVisibility", {});
18
+ }
14
19
  getId() {
15
- return R;
20
+ return h;
16
21
  }
17
22
  getTemplate() {
18
- const t = s.map((i) => ({
19
- key: i.key,
20
- label: i.label,
21
- content: this._createItemContent(i.label, i.key)
23
+ const i = s.map((e) => ({
24
+ key: e.key,
25
+ label: e.label,
26
+ content: `
27
+ <div style="display: flex; align-items: center; justify-content: space-between;
28
+ padding: 8px; gap: 8px;">
29
+ <span style="flex: 1;">${e.label}</span>
30
+ ${this._GuToggle(`visibility_${e.key}`)}
31
+ </div>
32
+ `
22
33
  }));
23
34
  return `
24
35
  <div class="container">
25
36
  ${this._GuLabel({ text: "Card Element Order & Visibility" })}
26
- ${this._GuOrderable("cardComposition", t)}
37
+ ${this._GuOrderable("cardComposition", i)}
27
38
  </div>
28
39
  `;
29
40
  }
30
41
  onRender() {
31
- this._initializeComposition(), this._registerValueChangeListeners();
32
- }
33
- onTemplateNodeUpdated(t) {
34
- super.onTemplateNodeUpdated(t), this._initializeComposition();
35
- }
36
- /**
37
- * Creates the HTML content for an orderable item with label and toggle
38
- */
39
- _createItemContent(t, i) {
40
- return `
41
- <div style="display: flex; align-items: center; justify-content: space-between;
42
- padding: 8px; gap: 8px;">
43
- <span style="flex: 1;">${t}</span>
44
- ${this._GuToggle(`visibility_${i}`)}
45
- </div>
46
- `;
47
- }
48
- /**
49
- * Registers event listeners for composition and visibility changes
50
- */
51
- _registerValueChangeListeners() {
52
- this.api.onValueChanged("cardComposition", (t) => {
53
- this._applyCompositionToBlock(t);
54
- }), s.forEach((t) => {
55
- this.api.onValueChanged(`visibility_${t.key}`, (i) => {
56
- this._applyVisibilityToBlock(t.key, i);
42
+ this._initializeComposition(), this.api.onValueChanged("cardComposition", (i) => {
43
+ this.currentComposition = i, this._applyCompositionToBlock(i);
44
+ }), s.forEach((i) => {
45
+ this.api.onValueChanged(`visibility_${i.key}`, (e) => {
46
+ this.currentVisibility[i.key] = e, this._applyVisibilityToBlock();
57
47
  });
58
48
  });
59
49
  }
50
+ onTemplateNodeUpdated(i) {
51
+ super.onTemplateNodeUpdated(i), this._initializeComposition();
52
+ }
60
53
  /**
61
- * Initializes composition order and visibility state from the current node
54
+ * Initialize the composition order and visibility from the block or use defaults
62
55
  */
63
56
  _initializeComposition() {
64
- const t = this._readCompositionFromNode(), i = this._readVisibilityFromRows(), e = {
65
- cardComposition: t,
66
- ...this._buildVisibilityValues(i)
57
+ var p;
58
+ const i = (p = this.currentNode) == null ? void 0 : p.querySelector(".ins-recommendation-v3-block-v2");
59
+ let e = null, l = null;
60
+ if (i && "getAttribute" in i && (e = i.getAttribute("data-card-composition"), l = i.getAttribute("data-card-visibility")), e) {
61
+ const t = e.split(",").filter(Boolean), r = s.map((c) => c.key);
62
+ t.every((c) => r.includes(c)) && t.length > 0 ? this.currentComposition = t : this.currentComposition = r;
63
+ } else
64
+ this.currentComposition = s.map((t) => t.key);
65
+ if (l)
66
+ try {
67
+ const t = JSON.parse(l);
68
+ this.currentVisibility = t;
69
+ } catch {
70
+ this.currentVisibility = s.reduce((t, r) => (t[r.key] = r.visible, t), {});
71
+ }
72
+ else
73
+ this.currentVisibility = s.reduce((t, r) => (t[r.key] = r.visible, t), {});
74
+ const d = {
75
+ cardComposition: this.currentComposition
67
76
  };
68
- this.api.updateValues(e);
69
- }
70
- /**
71
- * Reads composition order from node's data-card-composition attribute
72
- * Falls back to default order if attribute is not present
73
- */
74
- _readCompositionFromNode() {
75
- if (!this.currentNode || !("getAttribute" in this.currentNode))
76
- return s.map((i) => i.key);
77
- const t = this.currentNode.getAttribute(c);
78
- return t ? t.split(",").filter(Boolean) : s.map((i) => i.key);
79
- }
80
- /**
81
- * Builds visibility values object from the visibility map
82
- */
83
- _buildVisibilityValues(t) {
84
- return s.reduce((i, e) => (i[`visibility_${e.key}`] = t[e.key] ?? !0, i), {});
85
- }
86
- /**
87
- * Read visibility state from individual row elements' data-visibility attributes
88
- * This ensures toggles reflect the actual DOM state
89
- */
90
- _readVisibilityFromRows() {
91
- if (!this.currentNode)
92
- return this._getDefaultVisibilities();
93
- const t = Array.from(this.currentNode.querySelectorAll(l));
94
- console.debug("_readVisibilityFromRows - found attribute rows:", t.length);
95
- const i = this._extractVisibilityFromRows(t);
96
- return this._mergeWithDefaults(i);
97
- }
98
- /**
99
- * Returns default visibility values for all items
100
- */
101
- _getDefaultVisibilities() {
102
- return s.reduce((t, i) => (t[i.key] = i.visible, t), {});
103
- }
104
- /**
105
- * Extracts visibility values from DOM nodes
106
- */
107
- _extractVisibilityFromRows(t) {
108
- const i = {};
109
- return t.forEach((e) => {
110
- if (!("getAttribute" in e))
111
- return;
112
- const o = e.getAttribute(a), r = e.getAttribute(d);
113
- o && r !== null && (i[o] = this._parseVisibilityValue(r), console.debug(
114
- `_readVisibilityFromRows - ${o}: ${i[o]} (raw: ${r})`
115
- ));
116
- }), i;
117
- }
118
- /**
119
- * Parses visibility value from string to boolean
120
- * Accepts "1", "true" as true, everything else as false
121
- */
122
- _parseVisibilityValue(t) {
123
- return t === "1" || t === "true";
124
- }
125
- /**
126
- * Merges extracted visibilities with default values for missing keys
127
- */
128
- _mergeWithDefaults(t) {
129
- return s.forEach((i) => {
130
- i.key in t || (t[i.key] = i.visible, console.debug(`_readVisibilityFromRows - ${i.key}: using default ${i.visible}`));
131
- }), t;
77
+ s.forEach((t) => {
78
+ d[`visibility_${t.key}`] = this.currentVisibility[t.key] ?? !0;
79
+ }), this.api.updateValues(d);
132
80
  }
133
81
  /**
134
82
  * Apply the reordered composition to the block's HTML structure
135
- * Updates the data-card-composition attribute and reorders product attributes
136
- */
137
- _applyCompositionToBlock(t) {
138
- if (console.debug("_applyCompositionToBlock - composition:", t), !this.currentNode) {
139
- console.debug("_applyCompositionToBlock - no current node");
140
- return;
141
- }
142
- this.api.getDocumentModifier().modifyHtml(this.currentNode).setAttribute(c, t.join(",")).apply(new n("Update card composition")), this._reorderProductAttributes(t);
143
- }
144
- /**
145
- * Reorders attribute rows within each product row based on composition order
146
83
  */
147
- _reorderProductAttributes(t) {
84
+ _applyCompositionToBlock(i) {
148
85
  if (!this.currentNode)
149
86
  return;
150
- const i = this.currentNode.querySelectorAll(A);
151
- if (!(i != null && i.length))
152
- return;
153
- const e = this.api.getDocumentModifier();
154
- i.forEach((o) => {
155
- const r = this._buildCompositionHtml(o, t);
156
- e.modifyHtml(o).setInnerHtml(r);
157
- }), e.apply(new n("Reorder product attributes"));
158
- }
159
- /**
160
- * Builds HTML string with attributes ordered according to composition
161
- */
162
- _buildCompositionHtml(t, i) {
163
- return i.reduce((e, o) => {
164
- const r = t.querySelector(`${l}[${a}="${o}"]`);
165
- return r && "getOuterHTML" in r ? e + r.getOuterHTML() : e;
166
- }, "");
87
+ const e = this.currentNode.querySelector(".ins-recommendation-v3-block-v2");
88
+ e && this.api.getDocumentModifier().modifyHtml(e).setAttribute("data-card-composition", i.join(",")).apply(new u("Stored card composition order"));
167
89
  }
168
90
  /**
169
91
  * Apply visibility changes to the block's HTML structure
170
- * Updates display style and data-visibility attribute for all matching rows
171
92
  */
172
- _applyVisibilityToBlock(t, i) {
173
- if (console.debug("_applyVisibilityToBlock", t, i), !this.currentNode)
174
- return;
175
- const e = this.currentNode.querySelectorAll(`${l}[${a}="${t}"]`);
176
- if (!(e != null && e.length))
93
+ _applyVisibilityToBlock() {
94
+ if (!this.currentNode)
177
95
  return;
178
- const o = i ? "table-row" : "none", r = i ? "1" : "0", p = `Set ${t} visibility to ${i ? "visible" : "hidden"}`, u = this.api.getDocumentModifier();
179
- e.forEach((b) => {
180
- u.modifyHtml(b).setStyle("display", o).setAttribute(d, r);
181
- }), u.apply(new n(p));
96
+ const i = this.currentNode.querySelector(".ins-recommendation-v3-block-v2");
97
+ i && this.api.getDocumentModifier().modifyHtml(i).setAttribute("data-card-visibility", JSON.stringify(this.currentVisibility)).apply(new u("Stored card visibility settings"));
182
98
  }
183
99
  }
184
100
  export {
185
- R as COMPOSITION_CONTROL_BLOCK_ID,
186
- N as RecommendationCardCompositionControl
101
+ h as COMPOSITION_CONTROL_BLOCK_ID,
102
+ g as RecommendationCardCompositionControl
187
103
  };
@@ -1,13 +1,5 @@
1
- const _ = "productImage", b = "productName", n = "productPrice", i = "productOldPrice", O = "productOmnibusPrice", T = "productOmnibusDiscount", t = "productButton";
2
- var o = /* @__PURE__ */ ((c) => (c.BUTTON = "recommendation-block-button", c.NAME = "recommendation-block-name", c.PRICE = "recommendation-block-price", c.OLD_PRICE = "recommendation-block-old-price", c.OMNIBUS_PRICE = "recommendation-block-omnibus-price", c.OMNIBUS_DISCOUNT = "recommendation-block-omnibus-discount", c.IMAGE = "recommendation-block-image", c))(o || {}), r = /* @__PURE__ */ ((c) => (c.BUTTON_ALIGN = "recommendation-block-button-align-control", c.BUTTON_BORDER = "recommendation-block-button-border-control", c.BUTTON_BORDER_RADIUS = "recommendation-block-button-border-radius-control", c.BUTTON_COLOR = "recommendation-block-button-color-control", c.BUTTON_FIT_TO_CONTENT = "recommendation-block-button-fit-to-content-control", c.BUTTON_FONT_FAMILY = "recommendation-block-button-font-family-control", c.BUTTON_MARGINS = "recommendation-block-button-margins-control", c.BUTTON_PADDINGS = "recommendation-block-button-paddings-control", c.BUTTON_TEXT = "recommendation-block-button-text-control", c.BUTTON_TEXT_SIZE = "recommendation-block-button-text-size-control", c.BUTTON_TEXT_STYLE_AND_FONT_COLOR = "recommendation-block-button-text-style-and-font-color-control", c.NAME_ALIGN = "recommendation-block-name-align-control", c.NAME_BACKGROUND = "recommendation-block-name-background-control", c.NAME_COLOR = "recommendation-block-name-color-control", c.NAME_FONT_FAMILY = "recommendation-block-name-font-family-control", c.NAME_PADDINGS = "recommendation-block-name-paddings-control", c.NAME_SIZE = "recommendation-block-name-size-control", c.NAME_STYLE = "recommendation-block-name-style-control", c.NAME_TEXT_TRIM = "recommendation-block-name-text-trim-control", c.PRICE_ALIGN = "recommendation-block-price-align-control", c.PRICE_BACKGROUND = "recommendation-block-price-background-control", c.PRICE_COLOR = "recommendation-block-price-color-control", c.PRICE_FONT_FAMILY = "recommendation-block-price-font-family-control", c.PRICE_PADDINGS = "recommendation-block-price-paddings-control", c.PRICE_SIZE = "recommendation-block-price-size-control", c.PRICE_STYLE = "recommendation-block-price-style-control", c.OLD_PRICE_ALIGN = "recommendation-block-old-price-align-control", c.OLD_PRICE_BACKGROUND = "recommendation-block-old-price-background-control", c.OLD_PRICE_COLOR = "recommendation-block-old-price-color-control", c.OLD_PRICE_FONT_FAMILY = "recommendation-block-old-price-font-family-control", c.OLD_PRICE_PADDINGS = "recommendation-block-old-price-paddings-control", c.OLD_PRICE_SIZE = "recommendation-block-old-price-size-control", c.OLD_PRICE_STYLE = "recommendation-block-old-price-style-control", c.OMNIBUS_PRICE_ALIGN = "recommendation-block-omnibus-price-align-control", c.OMNIBUS_PRICE_BACKGROUND = "recommendation-block-omnibus-price-background-control", c.OMNIBUS_PRICE_COLOR = "recommendation-block-omnibus-price-color-control", c.OMNIBUS_PRICE_FONT_FAMILY = "recommendation-block-omnibus-price-font-family-control", c.OMNIBUS_PRICE_PADDINGS = "recommendation-block-omnibus-price-paddings-control", c.OMNIBUS_PRICE_SIZE = "recommendation-block-omnibus-price-size-control", c.OMNIBUS_PRICE_STYLE = "recommendation-block-omnibus-price-style-control", c.OMNIBUS_PRICE_TEXT_BEFORE = "recommendation-block-omnibus-price-text-before-control", c.OMNIBUS_PRICE_TEXT_AFTER = "recommendation-block-omnibus-price-text-after-control", c.OMNIBUS_DISCOUNT_ALIGN = "recommendation-block-omnibus-discount-align-control", c.OMNIBUS_DISCOUNT_BACKGROUND = "recommendation-block-omnibus-discount-background-control", c.OMNIBUS_DISCOUNT_COLOR = "recommendation-block-omnibus-discount-color-control", c.OMNIBUS_DISCOUNT_FONT_FAMILY = "recommendation-block-omnibus-discount-font-family-control", c.OMNIBUS_DISCOUNT_PADDINGS = "recommendation-block-omnibus-discount-paddings-control", c.OMNIBUS_DISCOUNT_SIZE = "recommendation-block-omnibus-discount-size-control", c.OMNIBUS_DISCOUNT_STYLE = "recommendation-block-omnibus-discount-style-control", c.OMNIBUS_DISCOUNT_TEXT_BEFORE = "recommendation-block-omnibus-discount-text-before-control", c.OMNIBUS_DISCOUNT_TEXT_AFTER = "recommendation-block-omnibus-discount-text-after-control", c.IMAGE_SIZE = "recommendation-block-image-size-control", c.IMAGE_MARGINS = "recommendation-block-image-margins-control", c))(r || {});
1
+ var o = /* @__PURE__ */ ((c) => (c.BUTTON = "recommendation-block-button", c.NAME = "recommendation-block-name", c.PRICE = "recommendation-block-price", c.OLD_PRICE = "recommendation-block-old-price", c.IMAGE = "recommendation-block-image", c))(o || {}), r = /* @__PURE__ */ ((c) => (c.BUTTON_ALIGN = "recommendation-block-button-align-control", c.BUTTON_BORDER = "recommendation-block-button-border-control", c.BUTTON_BORDER_RADIUS = "recommendation-block-button-border-radius-control", c.BUTTON_COLOR = "recommendation-block-button-color-control", c.BUTTON_FIT_TO_CONTENT = "recommendation-block-button-fit-to-content-control", c.BUTTON_FONT_FAMILY = "recommendation-block-button-font-family-control", c.BUTTON_MARGINS = "recommendation-block-button-margins-control", c.BUTTON_PADDINGS = "recommendation-block-button-paddings-control", c.BUTTON_TEXT = "recommendation-block-button-text-control", c.BUTTON_TEXT_SIZE = "recommendation-block-button-text-size-control", c.BUTTON_TEXT_STYLE_AND_FONT_COLOR = "recommendation-block-button-text-style-and-font-color-control", c.NAME_ALIGN = "recommendation-block-name-align-control", c.NAME_BACKGROUND = "recommendation-block-name-background-control", c.NAME_COLOR = "recommendation-block-name-color-control", c.NAME_FONT_FAMILY = "recommendation-block-name-font-family-control", c.NAME_PADDINGS = "recommendation-block-name-paddings-control", c.NAME_SIZE = "recommendation-block-name-size-control", c.NAME_STYLE = "recommendation-block-name-style-control", c.PRICE_ALIGN = "recommendation-block-price-align-control", c.PRICE_BACKGROUND = "recommendation-block-price-background-control", c.PRICE_COLOR = "recommendation-block-price-color-control", c.PRICE_FONT_FAMILY = "recommendation-block-price-font-family-control", c.PRICE_PADDINGS = "recommendation-block-price-paddings-control", c.PRICE_SIZE = "recommendation-block-price-size-control", c.PRICE_STYLE = "recommendation-block-price-style-control", c.OLD_PRICE_ALIGN = "recommendation-block-old-price-align-control", c.OLD_PRICE_BACKGROUND = "recommendation-block-old-price-background-control", c.OLD_PRICE_COLOR = "recommendation-block-old-price-color-control", c.OLD_PRICE_FONT_FAMILY = "recommendation-block-old-price-font-family-control", c.OLD_PRICE_PADDINGS = "recommendation-block-old-price-paddings-control", c.OLD_PRICE_SIZE = "recommendation-block-old-price-size-control", c.OLD_PRICE_STYLE = "recommendation-block-old-price-style-control", c.IMAGE_SIZE = "recommendation-block-image-size-control", c.IMAGE_MARGINS = "recommendation-block-image-margins-control", c))(r || {});
3
2
  export {
4
- t as ATTR_PRODUCT_BUTTON,
5
- _ as ATTR_PRODUCT_IMAGE,
6
- b as ATTR_PRODUCT_NAME,
7
- i as ATTR_PRODUCT_OLD_PRICE,
8
- T as ATTR_PRODUCT_OMNIBUS_DISCOUNT,
9
- O as ATTR_PRODUCT_OMNIBUS_PRICE,
10
- n as ATTR_PRODUCT_PRICE,
11
3
  o as RecommendationBlockId,
12
4
  r as RecommendationControlId
13
5
  };