@useinsider/guido 2.0.0-beta.c312ab3 → 2.0.0-beta.c6d6ca6

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 (107) hide show
  1. package/README.md +2 -0
  2. package/dist/@types/config/schemas.js +55 -39
  3. package/dist/components/Guido.vue.js +1 -1
  4. package/dist/components/Guido.vue2.js +15 -17
  5. package/dist/components/organisms/email-preview/PreviewContainer.vue.js +3 -3
  6. package/dist/components/organisms/email-preview/amp/AmpErrorModal.vue.js +8 -8
  7. package/dist/components/organisms/email-preview/amp/AmpErrorModal.vue2.js +13 -17
  8. package/dist/components/organisms/email-preview/amp/AmpToggle.vue.js +8 -7
  9. package/dist/components/organisms/email-preview/amp/AmpToggle.vue2.js +12 -14
  10. package/dist/components/organisms/email-preview/desktop-preview/DesktopPreview.vue.js +14 -10
  11. package/dist/components/organisms/email-preview/desktop-preview/DesktopPreview.vue2.js +22 -18
  12. package/dist/components/organisms/email-preview/desktop-preview/EmailHeaderInfo.vue.js +17 -0
  13. package/dist/components/organisms/email-preview/desktop-preview/EmailHeaderInfo.vue2.js +20 -0
  14. package/dist/components/organisms/email-preview/desktop-preview/EmailSizeIndicator.vue.js +3 -3
  15. package/dist/components/organisms/email-preview/mobile-preview/ContentView.vue.js +11 -12
  16. package/dist/components/organisms/email-preview/mobile-preview/InboxView.vue.js +10 -12
  17. package/dist/components/organisms/email-preview/mobile-preview/MobilePreview.vue.js +10 -11
  18. package/dist/components/organisms/email-preview/mobile-preview/MobilePreview.vue2.js +14 -15
  19. package/dist/components/organisms/header/LeftSlot.vue.js +9 -9
  20. package/dist/components/organisms/header/LeftSlot.vue2.js +14 -13
  21. package/dist/components/organisms/header/MiddleSlot.vue.js +4 -5
  22. package/dist/components/organisms/header/MiddleSlot.vue2.js +13 -14
  23. package/dist/components/organisms/header/RightSlot.vue.js +12 -12
  24. package/dist/components/organisms/header/RightSlot.vue2.js +20 -26
  25. package/dist/components/organisms/onboarding/NewVersionPopup.vue2.js +15 -15
  26. package/dist/components/organisms/unsubscribe/UnsubscribeTypeSelection.vue.js +1 -1
  27. package/dist/components/organisms/unsubscribe/UnsubscribeTypeSelection.vue2.js +19 -20
  28. package/dist/composables/useConfig.js +29 -27
  29. package/dist/composables/useSave.js +13 -11
  30. package/dist/composables/useStripo.js +40 -40
  31. package/dist/config/migrator/index.js +9 -8
  32. package/dist/config/migrator/itemsBlockMigrator.js +334 -0
  33. package/dist/enums/onboarding.js +2 -1
  34. package/dist/enums/unsubscribe.js +21 -20
  35. package/dist/extensions/Blocks/Items/block.js +36 -40
  36. package/dist/extensions/Blocks/Items/controls/button/link.js +22 -29
  37. package/dist/extensions/Blocks/Items/controls/cardComposition.js +66 -46
  38. package/dist/extensions/Blocks/Items/controls/image/link.js +23 -30
  39. package/dist/extensions/Blocks/Items/controls/name/trimming.js +25 -25
  40. package/dist/extensions/Blocks/Items/controls/price/currencyLocation.js +19 -17
  41. package/dist/extensions/Blocks/Items/controls/price/currencySymbol.js +31 -29
  42. package/dist/extensions/Blocks/Items/controls/price/formattedPrice.js +36 -36
  43. package/dist/extensions/Blocks/Items/controls/price/hideDiscount.js +21 -19
  44. package/dist/extensions/Blocks/Items/controls/price/priceOrientation.js +29 -27
  45. package/dist/extensions/Blocks/Items/controls/price/singlePrice.js +93 -0
  46. package/dist/extensions/Blocks/Items/controls/settingsControl.js +176 -162
  47. package/dist/extensions/Blocks/Items/enums/controlEnums.js +2 -2
  48. package/dist/extensions/Blocks/Items/enums/productEnums.js +43 -45
  49. package/dist/extensions/Blocks/Items/enums/settingsEnums.js +4 -5
  50. package/dist/extensions/Blocks/Items/extension.js +11 -9
  51. package/dist/extensions/Blocks/Items/layouts/horizontal.html.js +58 -49
  52. package/dist/extensions/Blocks/Items/layouts/vertical.html.js +48 -59
  53. package/dist/extensions/Blocks/Items/settingsPanel.js +27 -26
  54. package/dist/extensions/Blocks/Items/store/items-block.js +11 -7
  55. package/dist/extensions/Blocks/Items/template.js +387 -140
  56. package/dist/extensions/Blocks/Items/utils/nodeConfigUtils.js +174 -0
  57. package/dist/extensions/Blocks/Recommendation/control.js +1 -1
  58. package/dist/extensions/Blocks/Unsubscribe/extension.js +9 -9
  59. package/dist/extensions/Blocks/common-control.js +30 -32
  60. package/dist/extensions/Blocks/controlFactories.js +55 -45
  61. package/dist/guido.css +1 -1
  62. package/dist/node_modules/@stripoinc/ui-editor-extensions/dist/esm/index.js +364 -285
  63. package/dist/package.json.js +1 -1
  64. package/dist/services/stripoApi.js +6 -10
  65. package/dist/src/@types/config/index.d.ts +2 -2
  66. package/dist/src/@types/config/schemas.d.ts +30 -0
  67. package/dist/src/@types/config/types.d.ts +7 -1
  68. package/dist/src/components/organisms/header/RightSlot.vue.d.ts +1 -1
  69. package/dist/src/composables/useConfig.d.ts +8 -0
  70. package/dist/src/config/migrator/itemsBlockMigrator.d.ts +6 -0
  71. package/dist/src/enums/onboarding.d.ts +1 -0
  72. package/dist/src/enums/unsubscribe.d.ts +1 -0
  73. package/dist/src/extensions/Blocks/Items/controls/button/link.d.ts +0 -2
  74. package/dist/src/extensions/Blocks/Items/controls/cardComposition.d.ts +9 -0
  75. package/dist/src/extensions/Blocks/Items/controls/image/link.d.ts +0 -2
  76. package/dist/src/extensions/Blocks/Items/controls/price/priceOrientation.d.ts +1 -1
  77. package/dist/src/extensions/Blocks/Items/controls/price/singlePrice.d.ts +18 -0
  78. package/dist/src/extensions/Blocks/Items/controls/settingsControl.d.ts +0 -4
  79. package/dist/src/extensions/Blocks/Items/enums/controlEnums.d.ts +1 -0
  80. package/dist/src/extensions/Blocks/Items/enums/productEnums.d.ts +24 -26
  81. package/dist/src/extensions/Blocks/Items/enums/settingsEnums.d.ts +1 -2
  82. package/dist/src/extensions/Blocks/Items/store/items-block.d.ts +2 -0
  83. package/dist/src/extensions/Blocks/Items/template.d.ts +22 -1
  84. package/dist/src/extensions/Blocks/Items/utils/nodeConfigUtils.d.ts +71 -0
  85. package/dist/src/extensions/Blocks/common-control.d.ts +10 -11
  86. package/dist/src/stores/config.d.ts +164 -1
  87. package/dist/static/assets/inbox-mockup.svg.js +4 -0
  88. package/dist/static/assets/phone-mockup.svg.js +4 -0
  89. package/dist/static/styles/components/button.css.js +1 -1
  90. package/dist/stores/config.js +7 -0
  91. package/dist/utils/pairProductVariables.js +61 -58
  92. package/package.json +3 -3
  93. package/dist/enums/academy.js +0 -8
  94. package/dist/extensions/Blocks/Items/utils/configBlockUtils.js +0 -17
  95. package/dist/extensions/Blocks/Items/utils/syncAttributeFromConfigBlock.js +0 -28
  96. package/dist/extensions/Blocks/Items/utils/syncAttributesFromConfigBlock.js +0 -76
  97. package/dist/extensions/Blocks/Items/utils/updateAttributes.js +0 -46
  98. package/dist/src/enums/academy.d.ts +0 -12
  99. package/dist/src/extensions/Blocks/Items/utils/configBlockUtils.d.ts +0 -23
  100. package/dist/src/extensions/Blocks/Items/utils/syncAttributeFromConfigBlock.d.ts +0 -32
  101. package/dist/src/extensions/Blocks/Items/utils/syncAttributesFromConfigBlock.d.ts +0 -50
  102. package/dist/src/extensions/Blocks/Items/utils/updateAttributes.d.ts +0 -8
  103. package/dist/static/assets/desktop/desktop-mockup-center.svg.js +0 -4
  104. package/dist/static/assets/desktop/desktop-mockup-left.svg.js +0 -4
  105. package/dist/static/assets/desktop/desktop-mockup-right.svg.js +0 -4
  106. package/dist/static/assets/mobile/email-mockup.svg.js +0 -4
  107. package/dist/static/assets/mobile/inbox-mockup.svg.js +0 -4
@@ -1,26 +1,27 @@
1
- import { useConfigStore as F } from "../stores/config.js";
2
- import { storeToRefs as I } from "pinia";
3
- const k = () => {
4
- const e = F(), {
1
+ import { useConfigStore as I } from "../stores/config.js";
2
+ import { storeToRefs as T } from "pinia";
3
+ const w = () => {
4
+ const e = I(), {
5
5
  config: t,
6
6
  initialized: o,
7
7
  identity: r,
8
8
  partner: i,
9
- template: n,
10
- editor: a,
9
+ template: a,
10
+ editor: n,
11
11
  ui: s,
12
- features: u,
13
- blocks: d,
14
- compiler: p,
15
- templateId: c,
12
+ features: c,
13
+ blocks: u,
14
+ compiler: d,
15
+ callbacks: l,
16
+ templateId: p,
16
17
  userId: f,
17
18
  variationId: m,
18
19
  partnerName: g,
19
- productType: l,
20
- messageType: b,
21
- username: C,
22
- showHeader: y
23
- } = I(e);
20
+ productType: b,
21
+ messageType: C,
22
+ username: y,
23
+ showHeader: E
24
+ } = T(e);
24
25
  return {
25
26
  // State refs
26
27
  config: t,
@@ -28,26 +29,27 @@ const k = () => {
28
29
  // Section refs
29
30
  identity: r,
30
31
  partner: i,
31
- template: n,
32
- editor: a,
32
+ template: a,
33
+ editor: n,
33
34
  ui: s,
34
- features: u,
35
- blocks: d,
36
- compiler: p,
35
+ features: c,
36
+ blocks: u,
37
+ compiler: d,
38
+ callbacks: l,
37
39
  // Convenience refs
38
- templateId: c,
40
+ templateId: p,
39
41
  userId: f,
40
42
  variationId: m,
41
43
  partnerName: g,
42
- productType: l,
43
- messageType: b,
44
- username: C,
45
- showHeader: y,
44
+ productType: b,
45
+ messageType: C,
46
+ username: y,
47
+ showHeader: E,
46
48
  // Methods
47
49
  getConfig: () => t.value,
48
- isFeatureEnabled: (E) => e.isFeatureEnabled(E)
50
+ isFeatureEnabled: (F) => e.isFeatureEnabled(F)
49
51
  };
50
52
  };
51
53
  export {
52
- k as useConfig
54
+ w as useConfig
53
55
  };
@@ -1,15 +1,17 @@
1
- import { useSaveStart as i, useSaveComplete as m } from "./useGuidoActions.js";
2
- import { useTemplatePreparation as n } from "../utils/templatePreparation.js";
3
- import { useHtmlValidator as l } from "./useHtmlValidator.js";
4
- const f = () => {
5
- const e = i(), a = m(), { validateHtml: s } = l();
6
- return { save: async (o = !1) => {
7
- e();
8
- const { prepareTemplateDetails: r } = n(), t = await r();
9
- if (await s(t.compiledHtml, t.dynamicContentList, !0))
10
- return o || a(t), t;
1
+ import { useConfig as l } from "./useConfig.js";
2
+ import { useSaveStart as m, useSaveComplete as c } from "./useGuidoActions.js";
3
+ import { useTemplatePreparation as d } from "../utils/templatePreparation.js";
4
+ import { useHtmlValidator as p } from "./useHtmlValidator.js";
5
+ const w = () => {
6
+ const i = m(), s = c(), { validateHtml: o } = p(), { callbacks: a } = l();
7
+ return { save: async (r = !1) => {
8
+ var e;
9
+ i();
10
+ const { prepareTemplateDetails: n } = d(), t = await n();
11
+ if (await o(t.compiledHtml, t.dynamicContentList, !0) && !((e = a.value) != null && e.externalValidation && !await a.value.externalValidation(t)))
12
+ return r || s(t), t;
11
13
  } };
12
14
  };
13
15
  export {
14
- f as useSave
16
+ w as useSave
15
17
  };
@@ -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,12 +1,13 @@
1
- import { migrateCheckbox as m } from "./checkboxMigrator.js";
1
+ import { migrateCheckbox as t } from "./checkboxMigrator.js";
2
2
  import { migrateCouponBlock as o } from "./couponBlockMigrator.js";
3
- import { migrateRadioButton as i } from "./radioButtonMigrator.js";
4
- import { migrateRecommendation as e } from "./recommendationMigrator.js";
5
- import { migrateUnsubscribe as a } from "./unsubscribeMigrator.js";
6
- const s = async (t) => {
7
- let r = t;
8
- return r = m(r), r = i(r), r = await a(r), r = o(r), r = e(r), r;
3
+ import { migrateItemsBlock as i } from "./itemsBlockMigrator.js";
4
+ import { migrateRadioButton as e } from "./radioButtonMigrator.js";
5
+ import { migrateRecommendation as a } from "./recommendationMigrator.js";
6
+ import { migrateUnsubscribe as g } from "./unsubscribeMigrator.js";
7
+ const u = async (r) => {
8
+ let m = r;
9
+ return m = t(m), m = e(m), m = await g(m), m = o(m), m = a(m), m = i(m), m;
9
10
  };
10
11
  export {
11
- s as migrate
12
+ u as migrate
12
13
  };
@@ -0,0 +1,334 @@
1
+ var L = Object.defineProperty;
2
+ var K = (o, t, r) => t in o ? L(o, t, { enumerable: !0, configurable: !0, writable: !0, value: r }) : o[t] = r;
3
+ var R = (o, t, r) => K(o, typeof t != "symbol" ? t + "" : t, r);
4
+ import { productPairs as B } from "../../extensions/Blocks/Items/enums/productEnums.js";
5
+ import { ItemInCartOptions as E, DefaultConfigValues as g, SETTINGS_ENUMS as _ } from "../../extensions/Blocks/Items/enums/settingsEnums.js";
6
+ import { getDefaultTemplate as U } from "../../extensions/Blocks/Items/template.js";
7
+ const w = {
8
+ img: {
9
+ pairsKey: "imageSrc",
10
+ defaultKey: "DEFAULT",
11
+ isArray: !0
12
+ },
13
+ name: {
14
+ pairsKey: "name",
15
+ defaultKey: "DEFAULT",
16
+ isArray: !0
17
+ },
18
+ url: {
19
+ pairsKey: "button",
20
+ defaultKey: "DEFAULT_HREF",
21
+ isArray: !1
22
+ },
23
+ formattedprice: {
24
+ pairsKey: "price",
25
+ defaultKey: "DEFAULT_PRICE_FORMATTED",
26
+ isArray: !1
27
+ },
28
+ productcurrency: {
29
+ pairsKey: "price",
30
+ defaultKey: "DEFAULT_CURRENCY",
31
+ isArray: !1
32
+ },
33
+ quantity: {
34
+ pairsKey: "quantity",
35
+ defaultKey: "DEFAULT",
36
+ isArray: !1
37
+ },
38
+ price: {
39
+ pairsKey: "price",
40
+ defaultKey: "DEFAULT_PRICE",
41
+ isArray: !1
42
+ },
43
+ originalprice: {
44
+ pairsKey: "originalPrice",
45
+ defaultKey: "DEFAULT_PRICE",
46
+ isArray: !1
47
+ },
48
+ originalformattedprice: {
49
+ pairsKey: "originalPrice",
50
+ defaultKey: "DEFAULT_PRICE_FORMATTED",
51
+ isArray: !1
52
+ },
53
+ single_price: {
54
+ pairsKey: "price",
55
+ defaultKey: "DEFAULT_SINGLE_PRICE",
56
+ isArray: !1
57
+ },
58
+ single_formattedprice: {
59
+ pairsKey: "price",
60
+ defaultKey: "DEFAULT_SINGLE_PRICE_FORMATTED",
61
+ isArray: !1
62
+ },
63
+ single_originalprice: {
64
+ pairsKey: "originalPrice",
65
+ defaultKey: "DEFAULT_SINGLE_PRICE",
66
+ isArray: !1
67
+ },
68
+ single_originalformattedprice: {
69
+ pairsKey: "originalPrice",
70
+ defaultKey: "DEFAULT_SINGLE_PRICE_FORMATTED",
71
+ isArray: !1
72
+ }
73
+ };
74
+ function F() {
75
+ return String(Date.now() + Math.floor(Math.random() * 1e3));
76
+ }
77
+ function q(o) {
78
+ return o ? {
79
+ CartItems: _.ITEMS_TYPE.CART_ITEMS,
80
+ BrowsedItems: _.ITEMS_TYPE.BROWSED_ITEMS,
81
+ PurchasedItems: _.ITEMS_TYPE.PURCHASED_ITEMS,
82
+ CART_ITEMS: _.ITEMS_TYPE.CART_ITEMS,
83
+ BROWSED_ITEMS: _.ITEMS_TYPE.BROWSED_ITEMS,
84
+ PURCHASED_ITEMS: _.ITEMS_TYPE.PURCHASED_ITEMS
85
+ }[o] || _.ITEMS_TYPE.CART_ITEMS : _.ITEMS_TYPE.CART_ITEMS;
86
+ }
87
+ function M(o) {
88
+ const t = (e, a) => e == null ? a : e === "1" || e === "true", r = (e, a) => e || a, c = o["data-type"] || o["data-source"], n = q(c);
89
+ let i = o["data-cart_items_select_control_value"] || g.cartItemsSelectControlValue;
90
+ if (i && !i.includes("{{") && /^\d+$/.test(i)) {
91
+ const e = parseInt(i) - 1, a = E[n];
92
+ a && a[e] && (i = a[e].value);
93
+ }
94
+ return {
95
+ initialized: !0,
96
+ blockInstanceId: r(o["data-block-instance-id"], F()),
97
+ source: n,
98
+ type: n,
99
+ itemsSelectValue: i,
100
+ orientation: o["data-card_orientation_control_value"] || _.ORIENTATION.VERTICAL,
101
+ nameTrimming: t(o["data-product_name_control_trim"], !0),
102
+ priceHideDiscount: t(o["data-product_price_control_nodup"], !0),
103
+ priceFormatted: t(o["data-product_price_control_formated"], !0),
104
+ priceSinglePrice: t(o["data-product_price_control_single_price"], !1),
105
+ priceCurrencySymbol: r(
106
+ o["data-product_price_currency_symbol"],
107
+ g.productPriceCurrencySymbolControlValue
108
+ ),
109
+ priceCurrencyLocation: r(
110
+ o["data-product_price_currency_location"],
111
+ g.productPriceCurrencyLocationControlValue
112
+ ),
113
+ priceOrientation: o["data-product_original_price_control_orientation"] || "horizontal",
114
+ quantityControlEnabled: t(o["data-product_quantity_control_enabled"], !0),
115
+ buttonLink: r(o["data-product_button_link"], g.productButtonLinkControlValue),
116
+ imageLink: r(o["data-product_image_link"], g.productImageLinkControlValue),
117
+ buttonLabel: r(o["data-product_button_control_label"], "Buy"),
118
+ buttonFullWidth: t(o["data-product_button_control_atw"], !0),
119
+ imageVisible: t(o["data-product_image_control_enabled"], !0),
120
+ nameVisible: t(o["data-product_name_control_enabled"], !0),
121
+ quantityVisible: t(o["data-product_quantity_control_enabled"], !0),
122
+ priceVisible: t(o["data-product_price_control_enabled"], !0),
123
+ originalPriceVisible: t(o["data-product_original_price_control_enabled"], !0),
124
+ buttonVisible: t(o["data-product_button_control_enabled"], !0)
125
+ };
126
+ }
127
+ const x = {
128
+ ins_apr: "CART_ITEMS",
129
+ browsed_item: "BROWSED_ITEMS",
130
+ purchased_item: "PURCHASED_ITEMS"
131
+ };
132
+ class N {
133
+ constructor() {
134
+ R(this, "parser");
135
+ this.parser = new DOMParser();
136
+ }
137
+ migrate(t) {
138
+ try {
139
+ let r = this.removeJinjaConditionals(t);
140
+ r = this.replaceTemplateVariables(r);
141
+ const c = this.parser.parseFromString(r, "text/html"), n = c.querySelectorAll(
142
+ "td.esd-cart-items-block, td.esd-browsed-items-block, td.esd-purchased-items-block"
143
+ );
144
+ return n.length === 0 ? (console.warn("ItemsBlockMigrator: No blocks found with items block selectors"), r) : (n.forEach((i) => {
145
+ const e = this.extractConfiguration(i), a = U({
146
+ orientation: e.orientation,
147
+ itemsType: e.itemsType,
148
+ itemId: e.itemId,
149
+ currencySymbol: e.currencySymbol,
150
+ currencyLocation: e.currencyLocation,
151
+ formattedPrice: e.formattedPrice,
152
+ configBlockAttributes: e.configBlockAttributes,
153
+ migrate: !0,
154
+ nameStyles: e.nameStyles,
155
+ buttonStyles: e.buttonStyles,
156
+ priceStyles: e.priceStyles,
157
+ originalPriceStyles: e.originalPriceStyles,
158
+ quantityStyles: e.quantityStyles,
159
+ nodeConfig: M(e.configBlockAttributes)
160
+ }), l = this.parser.parseFromString(
161
+ `<table><tbody><tr>${a}</tr></tbody></table>`,
162
+ "text/html"
163
+ ).querySelector("td");
164
+ if (l && i.parentNode) {
165
+ const f = M(e.configBlockAttributes);
166
+ l.setAttribute("esd-ext-config", JSON.stringify(f));
167
+ const u = l.querySelector("esd-config-block");
168
+ u && u.remove(), i.parentNode.replaceChild(l, i);
169
+ }
170
+ }), c.documentElement.outerHTML);
171
+ } catch (r) {
172
+ return console.error("ItemsBlockMigrator failed:", r), t;
173
+ }
174
+ }
175
+ /**
176
+ * Extracts configuration from legacy HTML block
177
+ * Parses data attributes and structure to determine:
178
+ * - orientation, itemsType, itemNumber, currency settings, esd-config-block attributes
179
+ * - UI styles from product elements (name, price, button, quantity, etc.)
180
+ */
181
+ extractConfiguration(t) {
182
+ var C, D, P;
183
+ const r = ((C = t.querySelector("[data-type]")) == null ? void 0 : C.getAttribute("data-type")) || "CART_ITEMS", c = ((D = t.querySelector("[data-number]")) == null ? void 0 : D.getAttribute("data-number")) || "1", n = parseInt(c) - 1, i = E[r], e = ((P = i == null ? void 0 : i[n]) == null ? void 0 : P.value) || i[0].value, a = t.querySelector('[product-attr="price"]'), d = (a == null ? void 0 : a.getAttribute("data-currency_symbol")) || "USD", f = ((a == null ? void 0 : a.getAttribute("data-curency")) || "before") === "after" ? "1" : "0", u = (a == null ? void 0 : a.getAttribute("data-formated")) !== "false", s = this.extractConfigBlockAttributes(t, r), b = s["data-card_orientation_control_value"];
184
+ let S;
185
+ b ? S = b === "horizontal" ? "horizontal" : "vertical" : S = t.querySelector('[colspan="2"]') !== null ? "vertical" : "horizontal";
186
+ const p = t.querySelector('a[product-attr="name"]'), T = (p == null ? void 0 : p.getAttribute("style")) || void 0, y = t.querySelector('a[product-attr="button"]'), m = (y == null ? void 0 : y.getAttribute("style")) || void 0, h = (a == null ? void 0 : a.getAttribute("style")) || void 0, A = t.querySelector("p.original-price"), k = (A == null ? void 0 : A.getAttribute("style")) || void 0, I = t.querySelector('[product-attr="quantity"]'), v = (I == null ? void 0 : I.getAttribute("style")) || void 0;
187
+ return {
188
+ orientation: S,
189
+ itemsType: r,
190
+ itemId: e,
191
+ currencySymbol: d,
192
+ currencyLocation: f,
193
+ formattedPrice: u,
194
+ configBlockAttributes: s,
195
+ nameStyles: T,
196
+ buttonStyles: m,
197
+ priceStyles: h,
198
+ originalPriceStyles: k,
199
+ quantityStyles: v
200
+ };
201
+ }
202
+ /**
203
+ * Extracts all data-* attributes from the esd-config-block element
204
+ * Returns a key-value mapping of all configuration attributes
205
+ * @param block - The block element containing the esd-config-block
206
+ * @param itemsType - The type of items (CART_ITEMS, BROWSED_ITEMS, PURCHASED_ITEMS)
207
+ */
208
+ extractConfigBlockAttributes(t, r) {
209
+ const c = t.querySelector("esd-config-block"), n = {};
210
+ if (!c)
211
+ return this.getDefaultConfigBlockAttributes();
212
+ if (Array.from(c.attributes).forEach((e) => {
213
+ e.name.startsWith("data-") && (n[e.name] = e.value);
214
+ }), n["data-cart_items_select_control_value"]) {
215
+ const e = n["data-cart_items_select_control_value"];
216
+ if (/^\d+$/.test(e)) {
217
+ const a = parseInt(e) - 1, d = E[r];
218
+ d && d[a] && (n["data-cart_items_select_control_value"] = d[a].value);
219
+ }
220
+ }
221
+ if (n["data-product_price_control_curency"]) {
222
+ const e = n["data-product_price_control_curency"];
223
+ let a = e;
224
+ e === "before" ? a = "0" : e === "after" && (a = "1"), n["data-product_price_control_curency"] = a, n["data-product_price_currency_location"] = a;
225
+ }
226
+ (!n["data-product_price_currency_symbol"] || n["data-product_price_currency_symbol"].trim() === "") && (n["data-product_price_currency_symbol"] = "USD");
227
+ const i = { ...this.getDefaultConfigBlockAttributes(), ...n };
228
+ return i["data-type"] = r, i["data-source"] = r, i;
229
+ }
230
+ /**
231
+ * Returns default esd-config-block attributes based on the old template structure
232
+ * These serve as fallbacks when attributes are missing
233
+ */
234
+ getDefaultConfigBlockAttributes() {
235
+ return {
236
+ // Core settings
237
+ "data-type": "CART_ITEMS",
238
+ "data-card_orientation_control_value": "vertical",
239
+ // Image settings
240
+ "data-product_image_control_image-width": "70",
241
+ "data-product_image_control_image-height": "70",
242
+ "data-product_image_control_align_button": "true",
243
+ "data-product_image_control_padding_mobile": "true",
244
+ "data-product_image_link": "{{Abandoned Cart Item (1) Image}}",
245
+ "data-product_image_control_enabled": "true",
246
+ // Name settings
247
+ "data-product_name_control_enabled": "true",
248
+ "data-product_name_control_font_font_size": "20",
249
+ "data-product_name_control_trim": "1",
250
+ // Quantity settings
251
+ "data-product_quantity_control_enabled": "true",
252
+ // Price settings
253
+ "data-product_price_control_font_font_size": "20",
254
+ "data-product_price_control_color": "#060606",
255
+ "data-product_price_control_curency": "0",
256
+ "data-product_price_currency_location": "0",
257
+ "data-product_price_currency_symbol": "USD",
258
+ "data-product_price_control_formated": "1",
259
+ "data-product_price_control_nodup": "1",
260
+ "data-product_price_control_single_price": "false",
261
+ "data-product_price_control_enabled": "true",
262
+ // Original price settings
263
+ "data-product_original_price_control_font_font_size": "19",
264
+ "data-product_original_price_control_align_align_desktop": "center",
265
+ "data-product_original_price_control_orientation": "horizontal",
266
+ "data-product_original_price_control_enabled": "true",
267
+ // Button settings
268
+ "data-product_button_control_enabled": "true",
269
+ "data-product_button_control_label": "Buy",
270
+ "data-product_button_control_font_font_size": "17",
271
+ "data-product_button_control_color": "#ffffff",
272
+ "data-product_button_control_background": "#010101",
273
+ "data-product_button_control_atw": "true",
274
+ "data-product_button_link": "{{Abandoned Cart Item (1) Url}}"
275
+ };
276
+ }
277
+ /**
278
+ * Removes Jinja2 conditional statements from HTML
279
+ * Handles all items block types:
280
+ * - Cart Items: ins_apr_total_product_kind, ins_apr_price_N, ins_apr_originalprice_N
281
+ * - Browsed Items: browsed_item_total_product_kind, browsed_item_price_N, browsed_item_originalprice_N
282
+ * - Purchased Items: purchased_item_total_product_kind, purchased_item_price_N, purchased_item_originalprice_N
283
+ */
284
+ removeJinjaConditionals(t) {
285
+ let r = t.replace(
286
+ /\{%\s*if\s+(ins_apr|browsed_item|purchased_item)_total_product_kind\s*(&gt;|>)\s*\d+\s*%\}/g,
287
+ ""
288
+ );
289
+ return r = r.replace(
290
+ /\{%\s*if\s+(ins_apr|browsed_item|purchased_item)_price_\d+\s*(!&#61;|!=)\s*\1_originalprice_\d+\s*%\}/g,
291
+ ""
292
+ ), r = r.replace(/\{%\s*endif\s*%\}/g, ""), r = r.replace(/\n\s*\n\s*\n/g, `
293
+
294
+ `), r;
295
+ }
296
+ /**
297
+ * Replaces template variables with default values from productPairs
298
+ * Supports all block types by detecting prefix and using appropriate type:
299
+ *
300
+ * Examples:
301
+ * - {{ins_apr_img_1}} → https://s3.../img_1.jpeg (CART_ITEMS)
302
+ * - {{browsed_item_name_2}} → 'Set of Sprite Yoga Straps' (BROWSED_ITEMS)
303
+ * - {{purchased_item_formattedprice_5}} → '1,490.49' (PURCHASED_ITEMS)
304
+ */
305
+ replaceTemplateVariables(t) {
306
+ const { PAIRS_FOR_EXTENSION: r } = B;
307
+ return t.replace(/{{([^}]+)}}/g, (c, n) => {
308
+ const i = n.match(/^(ins_apr|browsed_item|purchased_item)_([a-z_]+)_(\d+)$/);
309
+ if (!i)
310
+ return c;
311
+ const [, e, a, d] = i, l = x[e];
312
+ if (!l)
313
+ return console.warn(`Unknown variable prefix: ${e}`), c;
314
+ const f = w[a];
315
+ if (!f)
316
+ return console.warn(`Unknown variable suffix mapping for: ${a}`), c;
317
+ const { pairsKey: u, defaultKey: s, isArray: b } = f, p = r[u][l];
318
+ if (!p)
319
+ return console.warn(`No data found for: ${u}.${l}`), c;
320
+ if (b) {
321
+ const y = parseInt(d) - 1, m = p[s];
322
+ return Array.isArray(m) && m[y] ? m[y] : (console.warn(`Array value not found: ${u}.${l}.${s}[${y}]`), c);
323
+ }
324
+ const T = p[s];
325
+ return T !== void 0 ? String(T) : (console.warn(`Default value not found: ${u}.${l}.${s}`), c);
326
+ });
327
+ }
328
+ }
329
+ function Y(o) {
330
+ return new N().migrate(o);
331
+ }
332
+ export {
333
+ Y as migrateItemsBlock
334
+ };
@@ -2,8 +2,9 @@ const e = [
2
2
  ".service-element.stacked-panel-item.ng-tns-c1014751574-3.level-bottom-0.ng-star-inserted",
3
3
  ".service-element.stacked-panel-item.ng-tns-c1014751574-3.level-bottom-1.ng-star-inserted",
4
4
  ".service-element.stacked-panel-item.ng-tns-c1014751574-3.level-bottom-2.ng-star-inserted"
5
- ], t = "ui-editor", n = 'button[role="tab"][aria-label="Card Composition"]', s = 'button[role="tab"][aria-label="Settings"]', o = ".in-ribbons-wrapper";
5
+ ], t = "ui-editor", n = 'button[role="tab"][aria-label="Card Composition"]', s = 'button[role="tab"][aria-label="Settings"]', o = ".in-ribbons-wrapper", a = "https://academy.useinsider.com/docs/email-drag-drop-editor";
6
6
  export {
7
+ a as ACADEMY_LINK,
7
8
  n as CARD_COMPOSITION_TAB_SELECTOR,
8
9
  o as RIBBON_SELECTOR,
9
10
  e as SERVICE_HOVER_SELECTORS,