@useinsider/guido 2.0.0 → 2.1.0-beta.e6bf76b

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 (134) hide show
  1. package/README.md +2 -0
  2. package/dist/@types/config/schemas.js +57 -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 +6 -6
  7. package/dist/components/organisms/email-preview/amp/AmpErrorModal.vue2.js +17 -13
  8. package/dist/components/organisms/email-preview/amp/AmpToggle.vue.js +6 -6
  9. package/dist/components/organisms/email-preview/amp/AmpToggle.vue2.js +14 -12
  10. package/dist/components/organisms/email-preview/desktop-preview/DesktopBrowserHeader.vue.js +18 -0
  11. package/dist/components/organisms/email-preview/desktop-preview/DesktopBrowserHeader.vue2.js +15 -0
  12. package/dist/components/organisms/email-preview/desktop-preview/DesktopPreview.vue.js +16 -15
  13. package/dist/components/organisms/email-preview/desktop-preview/DesktopPreview.vue2.js +14 -22
  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 +12 -11
  16. package/dist/components/organisms/email-preview/mobile-preview/InboxView.vue.js +12 -10
  17. package/dist/components/organisms/email-preview/mobile-preview/MobilePreview.vue.js +11 -10
  18. package/dist/components/organisms/email-preview/mobile-preview/MobilePreview.vue2.js +15 -14
  19. package/dist/components/organisms/header/EditorActions.vue.js +21 -0
  20. package/dist/components/organisms/header/EditorActions.vue2.js +41 -0
  21. package/dist/components/organisms/header/EditorToolbar.vue.js +18 -0
  22. package/dist/components/organisms/header/EditorToolbar.vue2.js +17 -0
  23. package/dist/components/organisms/header/HeaderWrapper.vue.js +6 -5
  24. package/dist/components/organisms/header/LeftSlot.vue.js +9 -9
  25. package/dist/components/organisms/header/LeftSlot.vue2.js +12 -13
  26. package/dist/components/organisms/header/MiddleSlot.vue.js +7 -7
  27. package/dist/components/organisms/header/MiddleSlot.vue2.js +11 -15
  28. package/dist/components/organisms/header/RightSlot.vue.js +11 -14
  29. package/dist/components/organisms/header/RightSlot.vue2.js +13 -30
  30. package/dist/components/organisms/header/version-history/VersionHistory.vue.js +5 -5
  31. package/dist/components/organisms/onboarding/NewVersionPopup.vue2.js +15 -15
  32. package/dist/components/organisms/unsubscribe/UnsubscribeTypeSelection.vue.js +1 -1
  33. package/dist/components/organisms/unsubscribe/UnsubscribeTypeSelection.vue2.js +20 -19
  34. package/dist/composables/useActionsApi.js +33 -30
  35. package/dist/composables/useConfig.js +29 -27
  36. package/dist/composables/useSave.js +13 -11
  37. package/dist/composables/useStripo.js +57 -56
  38. package/dist/config/migrator/index.js +9 -8
  39. package/dist/config/migrator/itemsBlockMigrator.js +334 -0
  40. package/dist/enums/academy.js +8 -0
  41. package/dist/enums/onboarding.js +1 -2
  42. package/dist/enums/unsubscribe.js +20 -21
  43. package/dist/extensions/Blocks/CouponBlock/constants.js +4 -0
  44. package/dist/extensions/Blocks/CouponBlock/controls/index.js +29 -0
  45. package/dist/extensions/Blocks/CouponBlock/extension.js +5 -4
  46. package/dist/extensions/Blocks/CouponBlock/settingsPanel.js +20 -14
  47. package/dist/extensions/Blocks/CouponBlock/template.js +22 -11
  48. package/dist/extensions/Blocks/Items/block.js +36 -40
  49. package/dist/extensions/Blocks/Items/controls/button/link.js +22 -29
  50. package/dist/extensions/Blocks/Items/controls/cardComposition.js +66 -46
  51. package/dist/extensions/Blocks/Items/controls/image/link.js +23 -30
  52. package/dist/extensions/Blocks/Items/controls/name/trimming.js +25 -25
  53. package/dist/extensions/Blocks/Items/controls/price/currencyLocation.js +19 -17
  54. package/dist/extensions/Blocks/Items/controls/price/currencySymbol.js +31 -29
  55. package/dist/extensions/Blocks/Items/controls/price/formattedPrice.js +44 -38
  56. package/dist/extensions/Blocks/Items/controls/price/hideDiscount.js +21 -19
  57. package/dist/extensions/Blocks/Items/controls/price/priceOrientation.js +29 -27
  58. package/dist/extensions/Blocks/Items/controls/price/singlePrice.js +93 -0
  59. package/dist/extensions/Blocks/Items/controls/settingsControl.js +146 -131
  60. package/dist/extensions/Blocks/Items/enums/controlEnums.js +2 -2
  61. package/dist/extensions/Blocks/Items/enums/productEnums.js +43 -45
  62. package/dist/extensions/Blocks/Items/enums/settingsEnums.js +4 -5
  63. package/dist/extensions/Blocks/Items/extension.js +11 -9
  64. package/dist/extensions/Blocks/Items/layouts/horizontal.html.js +58 -49
  65. package/dist/extensions/Blocks/Items/layouts/vertical.html.js +48 -59
  66. package/dist/extensions/Blocks/Items/settingsPanel.js +27 -26
  67. package/dist/extensions/Blocks/Items/store/items-block.js +11 -7
  68. package/dist/extensions/Blocks/Items/template.js +389 -141
  69. package/dist/extensions/Blocks/Items/utils/nodeConfigUtils.js +176 -0
  70. package/dist/extensions/Blocks/Recommendation/control.js +1 -1
  71. package/dist/extensions/Blocks/Unsubscribe/extension.js +9 -9
  72. package/dist/extensions/Blocks/common-control.js +30 -32
  73. package/dist/extensions/Blocks/controlFactories.js +139 -118
  74. package/dist/guido.css +1 -1
  75. package/dist/node_modules/@stripoinc/ui-editor-extensions/dist/esm/index.js +370 -286
  76. package/dist/package.json.js +1 -1
  77. package/dist/services/stripoApi.js +6 -10
  78. package/dist/src/@types/config/index.d.ts +2 -2
  79. package/dist/src/@types/config/schemas.d.ts +34 -0
  80. package/dist/src/@types/config/types.d.ts +7 -1
  81. package/dist/src/components/organisms/email-preview/desktop-preview/DesktopBrowserHeader.vue.d.ts +2 -0
  82. package/dist/src/components/organisms/header/EditorActions.vue.d.ts +4 -0
  83. package/dist/src/components/organisms/header/EditorToolbar.vue.d.ts +2 -0
  84. package/dist/src/components/organisms/header/RightSlot.vue.d.ts +1 -1
  85. package/dist/src/composables/useActionsApi.d.ts +1 -0
  86. package/dist/src/composables/useConfig.d.ts +10 -0
  87. package/dist/src/config/migrator/itemsBlockMigrator.d.ts +6 -0
  88. package/dist/src/enums/academy.d.ts +12 -0
  89. package/dist/src/enums/onboarding.d.ts +0 -1
  90. package/dist/src/enums/unsubscribe.d.ts +0 -1
  91. package/dist/src/extensions/Blocks/CouponBlock/constants.d.ts +14 -0
  92. package/dist/src/extensions/Blocks/CouponBlock/controls/index.d.ts +108 -0
  93. package/dist/src/extensions/Blocks/CouponBlock/template.d.ts +1 -1
  94. package/dist/src/extensions/Blocks/Items/controls/button/link.d.ts +0 -2
  95. package/dist/src/extensions/Blocks/Items/controls/cardComposition.d.ts +9 -0
  96. package/dist/src/extensions/Blocks/Items/controls/image/link.d.ts +0 -2
  97. package/dist/src/extensions/Blocks/Items/controls/price/priceOrientation.d.ts +1 -1
  98. package/dist/src/extensions/Blocks/Items/controls/price/singlePrice.d.ts +18 -0
  99. package/dist/src/extensions/Blocks/Items/controls/settingsControl.d.ts +0 -4
  100. package/dist/src/extensions/Blocks/Items/enums/controlEnums.d.ts +1 -0
  101. package/dist/src/extensions/Blocks/Items/enums/productEnums.d.ts +24 -26
  102. package/dist/src/extensions/Blocks/Items/enums/settingsEnums.d.ts +1 -2
  103. package/dist/src/extensions/Blocks/Items/store/items-block.d.ts +2 -0
  104. package/dist/src/extensions/Blocks/Items/template.d.ts +22 -1
  105. package/dist/src/extensions/Blocks/Items/utils/nodeConfigUtils.d.ts +76 -0
  106. package/dist/src/extensions/Blocks/common-control.d.ts +10 -11
  107. package/dist/src/extensions/Blocks/controlFactories.d.ts +30 -7
  108. package/dist/src/stores/config.d.ts +181 -1
  109. package/dist/src/stores/editor.d.ts +21 -0
  110. package/dist/static/assets/desktop/desktop-mockup-center.svg.js +4 -0
  111. package/dist/static/assets/desktop/desktop-mockup-left.svg.js +4 -0
  112. package/dist/static/assets/desktop/desktop-mockup-right.svg.js +4 -0
  113. package/dist/static/assets/mobile/email-mockup.svg.js +4 -0
  114. package/dist/static/assets/mobile/inbox-mockup.svg.js +4 -0
  115. package/dist/static/styles/components/button.css.js +1 -1
  116. package/dist/static/styles/components/narrow-panel.css.js +0 -10
  117. package/dist/static/styles/components/wide-panel.css.js +1 -1
  118. package/dist/stores/config.js +7 -0
  119. package/dist/stores/editor.js +1 -0
  120. package/dist/utils/pairProductVariables.js +61 -58
  121. package/dist/utils/templatePreparation.js +17 -17
  122. package/package.json +3 -3
  123. package/dist/components/organisms/email-preview/desktop-preview/EmailHeaderInfo.vue.js +0 -17
  124. package/dist/components/organisms/email-preview/desktop-preview/EmailHeaderInfo.vue2.js +0 -20
  125. package/dist/extensions/Blocks/Items/utils/configBlockUtils.js +0 -17
  126. package/dist/extensions/Blocks/Items/utils/syncAttributeFromConfigBlock.js +0 -28
  127. package/dist/extensions/Blocks/Items/utils/syncAttributesFromConfigBlock.js +0 -76
  128. package/dist/extensions/Blocks/Items/utils/updateAttributes.js +0 -46
  129. package/dist/src/extensions/Blocks/Items/utils/configBlockUtils.d.ts +0 -23
  130. package/dist/src/extensions/Blocks/Items/utils/syncAttributeFromConfigBlock.d.ts +0 -32
  131. package/dist/src/extensions/Blocks/Items/utils/syncAttributesFromConfigBlock.d.ts +0 -50
  132. package/dist/src/extensions/Blocks/Items/utils/updateAttributes.d.ts +0 -8
  133. package/dist/static/assets/inbox-mockup.svg.js +0 -4
  134. package/dist/static/assets/phone-mockup.svg.js +0 -4
@@ -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
+ };
@@ -0,0 +1,8 @@
1
+ const e = "https://academy.insiderone.com/", o = {
2
+ EMAIL_EDITOR: `${e}/docs/email-drag-and-drop-editor`,
3
+ GLOBAL_UNSUBSCRIBE: `${e}/docs/global-unsubscribe-preference-center`,
4
+ AMP_FOR_EMAILS: `${e}/docs/amp-for-emails`
5
+ };
6
+ export {
7
+ o as ACADEMY_LINKS
8
+ };
@@ -2,9 +2,8 @@ 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", a = "https://academy.useinsider.com/docs/email-drag-drop-editor";
5
+ ], t = "ui-editor", n = 'button[role="tab"][aria-label="Card Composition"]', s = 'button[role="tab"][aria-label="Settings"]', o = ".in-ribbons-wrapper";
6
6
  export {
7
- a as ACADEMY_LINK,
8
7
  n as CARD_COMPOSITION_TAB_SELECTOR,
9
8
  o as RIBBON_SELECTOR,
10
9
  e as SERVICE_HOVER_SELECTORS,
@@ -1,26 +1,26 @@
1
- import { useTranslations as n } from "../composables/useTranslations.js";
1
+ import { useTranslations as e } from "../composables/useTranslations.js";
2
2
  import { getEnvironmentPrefix as R } from "../utils/environmentUtil.js";
3
- const N = {
3
+ const I = {
4
4
  UNSUBSCRIBE_LINK_TYPE: 1,
5
5
  PREFERENCES_LINK_TYPE: 3
6
- }, I = {
6
+ }, r = {
7
7
  UNSUBSCRIBE_LINK_REGEX: /{{ins-unsubscribe-link}}/g,
8
8
  DATA_OGSB_BUTTON_CSS_REGEX: "\\[data-ogsb\\]\\s*\\.es-button\\.es-button-[0-9]+\\s*\\{(?:[^\\}]*)\\}",
9
9
  GLOBAL_UNSUBSCRIBE_LINK_REGEX: /{{ins-global-unsubscribe-link}}/g,
10
10
  PREFERENCES_UNSUBSCRIBE_LINK_REGEX: /{{ins-preferences-unsubscribe-link}}/g
11
- }, s = R(), i = {
11
+ }, s = R(), _ = {
12
12
  UNSUBSCRIBE_URL: `https://mail.${s}.com/user/v1/unsub`,
13
13
  PREFERENCES_URL: `https://mail.${s}.com/user/v1/prefs`
14
- }, _ = "iid", B = {
14
+ }, i = "iid", B = {
15
15
  name: "Global Unsubscribe",
16
16
  sendGridId: "G"
17
- }, t = "https://academy.useinsider.com/docs/global-unsubscribe-preference-center", C = "/email/unsubscribe-pages", E = {
17
+ }, C = "/email/unsubscribe-pages", E = {
18
18
  GLOBAL_UNSUBSCRIBE: 1,
19
19
  GLOBAL_UNSUBSCRIBE_CONFIRMATION_PAGE: 2,
20
20
  SUBSCRIPTION_PREFERENCE_CENTER: 3,
21
21
  SUBSCRIPTION_PREFERENCE_CONFIRMATION: 4,
22
22
  RESUBSCRIBE: 5
23
- }, c = {
23
+ }, t = {
24
24
  [E.GLOBAL_UNSUBSCRIBE]: [
25
25
  E.GLOBAL_UNSUBSCRIBE,
26
26
  E.GLOBAL_UNSUBSCRIBE_CONFIRMATION_PAGE,
@@ -31,29 +31,28 @@ const N = {
31
31
  E.SUBSCRIPTION_PREFERENCE_CONFIRMATION
32
32
  ]
33
33
  }, U = () => {
34
- const e = n();
34
+ const n = e();
35
35
  return {
36
- [E.GLOBAL_UNSUBSCRIBE]: e("unsubscription-preference.type-global-unsubscribe"),
37
- [E.GLOBAL_UNSUBSCRIBE_CONFIRMATION_PAGE]: e("unsubscription-preference.type-global-unsubscription-confirmation"),
38
- [E.RESUBSCRIBE]: e("unsubscription-preference.type-resubscribe"),
39
- [E.SUBSCRIPTION_PREFERENCE_CENTER]: e("unsubscription-preference.type-subscription-preferences-center"),
40
- [E.SUBSCRIPTION_PREFERENCE_CONFIRMATION]: e("unsubscription-preference.type-subscription-preferences-confirmation")
36
+ [E.GLOBAL_UNSUBSCRIBE]: n("unsubscription-preference.type-global-unsubscribe"),
37
+ [E.GLOBAL_UNSUBSCRIBE_CONFIRMATION_PAGE]: n("unsubscription-preference.type-global-unsubscription-confirmation"),
38
+ [E.RESUBSCRIBE]: n("unsubscription-preference.type-resubscribe"),
39
+ [E.SUBSCRIPTION_PREFERENCE_CENTER]: n("unsubscription-preference.type-subscription-preferences-center"),
40
+ [E.SUBSCRIPTION_PREFERENCE_CONFIRMATION]: n("unsubscription-preference.type-subscription-preferences-confirmation")
41
41
  };
42
- }, o = {
42
+ }, c = {
43
43
  default: "{{ins-unsubscribe-link}}",
44
44
  [E.GLOBAL_UNSUBSCRIBE]: "{{ins-global-unsubscribe-link}}",
45
45
  [E.SUBSCRIPTION_PREFERENCE_CENTER]: "{{ins-preferences-unsubscribe-link}}"
46
46
  };
47
47
  export {
48
- t as ACADEMY_LINK,
49
48
  B as DEFAULT_UNSUBSCRIBE_GROUP,
50
- _ as INSIDER_ID,
51
- I as LINK_REGEXES,
52
- N as LINK_TYPES,
53
- o as MERGE_TAGS,
49
+ i as INSIDER_ID,
50
+ r as LINK_REGEXES,
51
+ I as LINK_TYPES,
52
+ c as MERGE_TAGS,
54
53
  E as PAGE_TYPES,
55
- c as TYPE_COLLECTIONS,
54
+ t as TYPE_COLLECTIONS,
56
55
  C as UNSUBSCRIBE_PAGES_LINK,
57
- i as URLS,
56
+ _ as URLS,
58
57
  U as getTypeTranslations
59
58
  };
@@ -0,0 +1,4 @@
1
+ var t = /* @__PURE__ */ ((c) => (c.TEXT_ALIGN = "coupon-block-text-align-control", c.TEXT_COLOR = "coupon-block-text-color-control", c.TEXT_SIZE = "coupon-block-text-size-control", c.TEXT_STYLE = "coupon-block-text-style-control", c.TEXT_FONT_FAMILY = "coupon-block-text-font-family-control", c.TEXT_BACKGROUND = "coupon-block-text-background-control", c.TEXT_PADDINGS = "coupon-block-text-paddings-control", c.TEXT_LINE_SPACING = "coupon-block-text-line-spacing-control", c))(t || {});
2
+ export {
3
+ t as CouponControlId
4
+ };
@@ -0,0 +1,29 @@
1
+ import { createTextAlignControl as t, createTextColorControl as e, createTextSizeControl as n, createTextStyleControl as r, createTextFontFamilyControl as T, createTextBackgroundColorControl as l, createPaddingsControl as C, createTextLineSpacingControl as c } from "../../controlFactories.js";
2
+ import { CouponControlId as o } from "../constants.js";
3
+ const i = t(
4
+ o.TEXT_ALIGN
5
+ ), E = e(
6
+ o.TEXT_COLOR
7
+ ), s = n(
8
+ o.TEXT_SIZE
9
+ ), S = r(
10
+ o.TEXT_STYLE
11
+ ), _ = T(
12
+ o.TEXT_FONT_FAMILY
13
+ ), g = l(
14
+ o.TEXT_BACKGROUND
15
+ ), X = C(
16
+ o.TEXT_PADDINGS
17
+ ), d = c(
18
+ o.TEXT_LINE_SPACING
19
+ );
20
+ export {
21
+ i as TextAlignControl,
22
+ g as TextBackgroundControl,
23
+ E as TextColorControl,
24
+ _ as TextFontFamilyControl,
25
+ d as TextLineSpacingControl,
26
+ X as TextPaddingsControl,
27
+ s as TextSizeControl,
28
+ S as TextStyleControl
29
+ };
@@ -1,8 +1,9 @@
1
1
  import { ExtensionBuilder as o } from "../../../node_modules/@stripoinc/ui-editor-extensions/dist/esm/index.js";
2
2
  import { CouponBlock as t } from "./block.js";
3
- import { CouponIconsRegistry as i } from "./iconsRegistry.js";
4
- import { CouponBlockSettings as n } from "./settingsPanel.js";
5
- const p = new o().addBlock(t).withSettingsPanelRegistry(n).withIconsRegistry(i).build();
3
+ import { TextAlignControl as n, TextColorControl as r, TextSizeControl as l, TextStyleControl as d, TextFontFamilyControl as e, TextBackgroundControl as i, TextPaddingsControl as C, TextLineSpacingControl as a } from "./controls/index.js";
4
+ import { CouponIconsRegistry as s } from "./iconsRegistry.js";
5
+ import { CouponBlockSettings as m } from "./settingsPanel.js";
6
+ const u = new o().addBlock(t).withSettingsPanelRegistry(m).addControl(n).addControl(r).addControl(l).addControl(d).addControl(e).addControl(i).addControl(C).addControl(a).withIconsRegistry(s).build();
6
7
  export {
7
- p as default
8
+ u as default
8
9
  };
@@ -1,24 +1,30 @@
1
- import { SettingsPanelRegistry as T, SettingsPanelTab as o, SettingsTab as O, TextControls as t } from "../../../node_modules/@stripoinc/ui-editor-extensions/dist/esm/index.js";
2
- import { COUPON_BLOCK_ID as N } from "./block.js";
3
- class _ extends T {
1
+ import { SettingsPanelRegistry as n, SettingsPanelTab as o, SettingsTab as t } from "../../../node_modules/@stripoinc/ui-editor-extensions/dist/esm/index.js";
2
+ import { COUPON_BLOCK_ID as E } from "./block.js";
3
+ import { CouponControlId as T } from "./constants.js";
4
+ class i extends n {
4
5
  registerBlockControls(e) {
5
- e[N] = [
6
+ e[E] = [
6
7
  new o(
7
- O.SETTINGS,
8
+ t.SETTINGS,
8
9
  [
9
- t.FONT_FAMILY,
10
- t.FONT_SIZE,
11
- t.FORMAT,
12
- t.FONT_COLOR,
13
- t.TEXT_BLOCK_BACKGROUND_COLOR,
14
- t.ALIGN,
15
- t.LINE_HEIGHT,
16
- t.INTERNAL_INDENTS
10
+ T.TEXT_STYLE,
11
+ T.TEXT_ALIGN,
12
+ T.TEXT_PADDINGS
13
+ ]
14
+ ),
15
+ new o(
16
+ t.STYLES,
17
+ [
18
+ T.TEXT_BACKGROUND,
19
+ T.TEXT_FONT_FAMILY,
20
+ T.TEXT_LINE_SPACING,
21
+ T.TEXT_SIZE,
22
+ T.TEXT_COLOR
17
23
  ]
18
24
  )
19
25
  ];
20
26
  }
21
27
  }
22
28
  export {
23
- _ as CouponBlockSettings
29
+ i as CouponBlockSettings
24
30
  };
@@ -1,18 +1,29 @@
1
- const o = `
2
- <td class="coupon-block ins-coupon-code esd-block-text coupon-block-v2">
3
- <p class="ins-title" contenteditable="false">{@COUPON_CODE}</p>
4
- </td>`, e = `
5
- <td
6
- class="coupon-block coupon-block-v2 ins-coupon-code esd-block-text esd-extension-block"
7
- esd-extension-block-id="coupon-block"
1
+ import { BlockType as o } from "../../../node_modules/@stripoinc/ui-editor-extensions/dist/esm/index.js";
2
+ import { COUPON_BLOCK_ID as e } from "./block.js";
3
+ const t = `
4
+ <${o.BLOCK_TEXT}
5
+ class="coupon-block ins-coupon-code coupon-block-v2 es-p10"
6
+ align="center"
7
+ esd-extension-block-id="${e}">
8
+ <p
9
+ path="1"
10
+ contenteditable="false"
11
+ style="font-size: 16px; color: #333333;">
12
+ <strong path="1,0">{@COUPON_CODE}</strong>
13
+ </p>
14
+ </${o.BLOCK_TEXT}>
15
+ `, l = `
16
+ <td
17
+ class="coupon-block coupon-block-v2 ins-coupon-code esd-block-text esd-extension-block"
18
+ esd-extension-block-id="${e}"
8
19
  >
9
20
  <p class="ins-title" contenteditable="false">{@COUPON_CODE}</p>
10
21
  </td>
11
22
  `;
12
- function t() {
13
- return o;
23
+ function s() {
24
+ return t;
14
25
  }
15
26
  export {
16
- e as default,
17
- t as getDefaultTemplate
27
+ l as default,
28
+ s as getDefaultTemplate
18
29
  };