@useinsider/guido 3.18.2-beta.dfce34a → 3.18.2-beta.ec1fd57

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 (51) hide show
  1. package/dist/components/Guido.vue.js +3 -3
  2. package/dist/components/Guido.vue2.js +30 -30
  3. package/dist/components/organisms/extensions/recommendation/AssignStrategyDrawer.vue.js +11 -13
  4. package/dist/components/organisms/extensions/recommendation/AssignStrategyDrawer.vue2.js +52 -76
  5. package/dist/components/organisms/extensions/recommendation/RemoveStrategyModal.vue2.js +37 -23
  6. package/dist/components/organisms/onboarding/OnboardingWrapper.vue2.js +18 -20
  7. package/dist/composables/useCustomInterfaceAppearance.js +46 -56
  8. package/dist/composables/useHtmlValidator.js +82 -87
  9. package/dist/composables/useRecommendation.js +35 -40
  10. package/dist/composables/useStripo.js +30 -30
  11. package/dist/config/migrator/itemsBlockMigrator.js +257 -167
  12. package/dist/enums/extensions/recommendationBlock.js +31 -38
  13. package/dist/extensions/Blocks/Items/constants/cardLayout.js +20 -0
  14. package/dist/extensions/Blocks/Items/controls/name/trimming.js +18 -17
  15. package/dist/extensions/Blocks/Items/controls/settingsControl.js +114 -105
  16. package/dist/extensions/Blocks/Items/enums/productEnums.js +14 -9
  17. package/dist/extensions/Blocks/Items/layouts/horizontal.html.js +11 -9
  18. package/dist/extensions/Blocks/Items/template.js +219 -204
  19. package/dist/extensions/Blocks/Recommendation/block.js +42 -61
  20. package/dist/extensions/Blocks/Recommendation/constants/defaultConfig.js +20 -21
  21. package/dist/extensions/Blocks/Recommendation/controls/main/index.js +35 -40
  22. package/dist/extensions/Blocks/Recommendation/controls/main/strategy.js +52 -84
  23. package/dist/extensions/Blocks/Recommendation/controls/main/utils.js +74 -74
  24. package/dist/extensions/Blocks/Recommendation/store/recommendation.js +140 -254
  25. package/dist/extensions/Blocks/Recommendation/utils/nodeConfigWriter.js +16 -26
  26. package/dist/extensions/Blocks/Recommendation/validation/requiredFields.js +12 -21
  27. package/dist/guido.css +1 -1
  28. package/dist/src/enums/extensions/recommendationBlock.d.ts +0 -2
  29. package/dist/src/extensions/Blocks/Items/constants/cardLayout.d.ts +44 -0
  30. package/dist/src/extensions/Blocks/Items/enums/productEnums.d.ts +3 -0
  31. package/dist/src/extensions/Blocks/Items/template.d.ts +19 -0
  32. package/dist/src/extensions/Blocks/Recommendation/block.d.ts +0 -10
  33. package/dist/src/extensions/Blocks/Recommendation/constants/defaultConfig.d.ts +0 -1
  34. package/dist/src/extensions/Blocks/Recommendation/constants/index.d.ts +1 -1
  35. package/dist/src/extensions/Blocks/Recommendation/controls/main/index.d.ts +0 -2
  36. package/dist/src/extensions/Blocks/Recommendation/controls/main/strategy.d.ts +0 -9
  37. package/dist/src/extensions/Blocks/Recommendation/controls/main/utils.d.ts +2 -7
  38. package/dist/src/extensions/Blocks/Recommendation/store/recommendation.d.ts +0 -86
  39. package/dist/src/extensions/Blocks/Recommendation/validation/requiredFields.d.ts +0 -4
  40. package/dist/src/stores/onboarding.d.ts +0 -377
  41. package/dist/static/styles/components/recommendation-strategy.css.js +4 -34
  42. package/dist/stores/onboarding.js +36 -41
  43. package/dist/utils/pairProductVariables.js +71 -71
  44. package/dist/utils/templatePreparation.js +55 -55
  45. package/package.json +1 -1
  46. package/dist/components/organisms/onboarding/RecommendationStrategyOnboarding.vue.js +0 -21
  47. package/dist/components/organisms/onboarding/RecommendationStrategyOnboarding.vue2.js +0 -47
  48. package/dist/extensions/Blocks/Recommendation/utils/strategyCommit.js +0 -24
  49. package/dist/src/components/organisms/onboarding/RecommendationStrategyOnboarding.vue.d.ts +0 -2
  50. package/dist/src/extensions/Blocks/Recommendation/utils/strategyCommit.d.ts +0 -14
  51. package/dist/static/styles/components/skeleton.css.js +0 -23
@@ -1,12 +1,12 @@
1
- var v = Object.defineProperty;
2
- var U = (o, t, r) => t in o ? v(o, t, { enumerable: !0, configurable: !0, writable: !0, value: r }) : o[t] = r;
3
- var M = (o, t, r) => U(o, typeof t != "symbol" ? t + "" : t, r);
4
- import { BLOCK_ID as w } from "../../extensions/Blocks/Items/block.js";
5
- import { productPairs as K } from "../../extensions/Blocks/Items/enums/productEnums.js";
6
- import { ItemInCartOptions as I, DefaultConfigValues as g, SETTINGS_ENUMS as p } from "../../extensions/Blocks/Items/enums/settingsEnums.js";
1
+ var k = Object.defineProperty;
2
+ var B = (c, t, e) => t in c ? k(c, t, { enumerable: !0, configurable: !0, writable: !0, value: e }) : c[t] = e;
3
+ var D = (c, t, e) => B(c, typeof t != "symbol" ? t + "" : t, e);
4
+ import { BLOCK_ID as q } from "../../extensions/Blocks/Items/block.js";
5
+ import { productPairs as v } from "../../extensions/Blocks/Items/enums/productEnums.js";
6
+ import { ItemInCartOptions as E, DefaultConfigValues as I, SETTINGS_ENUMS as _ } from "../../extensions/Blocks/Items/enums/settingsEnums.js";
7
7
  import { getDefaultTemplate as F } from "../../extensions/Blocks/Items/template.js";
8
- import { useTemplateStore as q } from "../../stores/template.js";
9
- const x = {
8
+ import { useTemplateStore as U } from "../../stores/template.js";
9
+ const K = {
10
10
  img: {
11
11
  pairsKey: "imageSrc",
12
12
  defaultKey: "DEFAULT",
@@ -73,126 +73,129 @@ const x = {
73
73
  isArray: !1
74
74
  }
75
75
  };
76
- function O() {
76
+ function x() {
77
77
  return String(Date.now() + Math.floor(Math.random() * 1e3));
78
78
  }
79
- function k(o) {
80
- return o ? {
81
- CartItems: p.ITEMS_TYPE.CART_ITEMS,
82
- BrowsedItems: p.ITEMS_TYPE.BROWSED_ITEMS,
83
- PurchasedItems: p.ITEMS_TYPE.PURCHASED_ITEMS,
84
- CART_ITEMS: p.ITEMS_TYPE.CART_ITEMS,
85
- BROWSED_ITEMS: p.ITEMS_TYPE.BROWSED_ITEMS,
86
- PURCHASED_ITEMS: p.ITEMS_TYPE.PURCHASED_ITEMS
87
- }[o] || p.ITEMS_TYPE.CART_ITEMS : p.ITEMS_TYPE.CART_ITEMS;
79
+ function M(c) {
80
+ return c ? {
81
+ CartItems: _.ITEMS_TYPE.CART_ITEMS,
82
+ BrowsedItems: _.ITEMS_TYPE.BROWSED_ITEMS,
83
+ PurchasedItems: _.ITEMS_TYPE.PURCHASED_ITEMS,
84
+ CART_ITEMS: _.ITEMS_TYPE.CART_ITEMS,
85
+ BROWSED_ITEMS: _.ITEMS_TYPE.BROWSED_ITEMS,
86
+ PURCHASED_ITEMS: _.ITEMS_TYPE.PURCHASED_ITEMS
87
+ }[c] || _.ITEMS_TYPE.CART_ITEMS : _.ITEMS_TYPE.CART_ITEMS;
88
88
  }
89
- function h(o) {
90
- var e;
91
- const t = (l, u) => l == null ? u : l === "1" || l === "true", r = (l, u) => l || u, c = o["data-type"] || o["data-source"], a = k(c), i = I[a];
92
- let n = o["data-cart_items_select_control_value"] || ((e = i == null ? void 0 : i[0]) == null ? void 0 : e.value) || g.cartItemsSelectControlValue;
93
- if (n && !n.includes("{{") && /^\d+$/.test(n)) {
94
- const l = parseInt(n) - 1, u = I[a];
95
- u && u[l] && (n = u[l].value);
89
+ function O(c) {
90
+ return c.classList.contains("esd-browsed-items-block") ? _.ITEMS_TYPE.BROWSED_ITEMS : c.classList.contains("esd-purchased-items-block") ? _.ITEMS_TYPE.PURCHASED_ITEMS : _.ITEMS_TYPE.CART_ITEMS;
91
+ }
92
+ function P(c) {
93
+ var o;
94
+ const t = (u, n) => u == null ? n : u === "1" || u === "true", e = (u, n) => u || n, a = c["data-type"] || c["data-source"], r = M(a), l = E[r];
95
+ let i = c["data-cart_items_select_control_value"] || ((o = l == null ? void 0 : l[0]) == null ? void 0 : o.value) || I.cartItemsSelectControlValue;
96
+ if (i && !i.includes("{{") && /^\d+$/.test(i)) {
97
+ const u = parseInt(i) - 1, n = E[r];
98
+ n && n[u] && (i = n[u].value);
96
99
  }
97
100
  return {
98
101
  initialized: !0,
99
- blockInstanceId: r(o["data-block-instance-id"], O()),
100
- source: a,
101
- type: a,
102
- itemsSelectValue: n,
103
- orientation: o["data-card_orientation_control_value"] || p.ORIENTATION.VERTICAL,
104
- nameTrimming: t(o["data-product_name_control_trim"], !0),
105
- priceHideDiscount: t(o["data-product_price_control_nodup"], !0),
106
- priceFormatted: t(o["data-product_price_control_formated"], !0),
107
- priceSinglePrice: t(o["data-product_price_control_single_price"], !1),
108
- priceCurrencySymbol: r(
109
- o["data-product_price_control_currency_symbol"],
110
- g.productPriceCurrencySymbolControlValue
102
+ blockInstanceId: e(c["data-block-instance-id"], x()),
103
+ source: r,
104
+ type: r,
105
+ itemsSelectValue: i,
106
+ orientation: c["data-card_orientation_control_value"] || _.ORIENTATION.VERTICAL,
107
+ nameTrimming: t(c["data-product_name_control_trim"], !0),
108
+ priceHideDiscount: t(c["data-product_price_control_nodup"], !0),
109
+ priceFormatted: t(c["data-product_price_control_formated"], !0),
110
+ priceSinglePrice: t(c["data-product_price_control_single_price"], !1),
111
+ priceCurrencySymbol: e(
112
+ c["data-product_price_control_currency_symbol"],
113
+ I.productPriceCurrencySymbolControlValue
111
114
  ),
112
- priceCurrencyLocation: r(
113
- o["data-product_price_currency_location"],
114
- g.productPriceCurrencyLocationControlValue
115
+ priceCurrencyLocation: e(
116
+ c["data-product_price_currency_location"],
117
+ I.productPriceCurrencyLocationControlValue
115
118
  ),
116
- priceOrientation: o["data-product_original_price_control_orientation"] || "horizontal",
117
- quantityControlEnabled: t(o["data-product_quantity_control_enabled"], !0),
118
- buttonLink: r(o["data-product_button_link"], g.productButtonLinkControlValue),
119
- imageLink: r(o["data-product_image_link"], g.productImageLinkControlValue),
120
- buttonLabel: r(o["data-product_button_control_label"], "Buy"),
121
- buttonFullWidth: t(o["data-product_button_control_atw"], !0),
122
- imageVisible: t(o["data-product_image_control_enabled"], !0),
123
- nameVisible: t(o["data-product_name_control_enabled"], !0),
124
- quantityVisible: t(o["data-product_quantity_control_enabled"], !0),
125
- priceVisible: t(o["data-product_price_control_enabled"], !0),
126
- originalPriceVisible: t(o["data-product_original_price_control_enabled"], !0),
127
- buttonVisible: t(o["data-product_button_control_enabled"], !0)
119
+ priceOrientation: c["data-product_original_price_control_orientation"] || "horizontal",
120
+ quantityControlEnabled: t(c["data-product_quantity_control_enabled"], !0),
121
+ buttonLink: e(c["data-product_button_link"], I.productButtonLinkControlValue),
122
+ imageLink: e(c["data-product_image_link"], I.productImageLinkControlValue),
123
+ buttonLabel: e(c["data-product_button_control_label"], "Buy"),
124
+ buttonFullWidth: t(c["data-product_button_control_atw"], !0),
125
+ imageVisible: t(c["data-product_image_control_enabled"], !0),
126
+ nameVisible: t(c["data-product_name_control_enabled"], !0),
127
+ quantityVisible: t(c["data-product_quantity_control_enabled"], !0),
128
+ priceVisible: t(c["data-product_price_control_enabled"], !0),
129
+ originalPriceVisible: t(c["data-product_original_price_control_enabled"], !0),
130
+ buttonVisible: t(c["data-product_button_control_enabled"], !0)
128
131
  };
129
132
  }
130
- const V = {
133
+ const $ = {
131
134
  ins_apr: "CART_ITEMS",
132
135
  browsed_item: "BROWSED_ITEMS",
133
136
  purchased_item: "PURCHASED_ITEMS"
134
137
  };
135
- function $(o, t) {
136
- const r = {
138
+ function V(c, t) {
139
+ const e = {
137
140
  CART_ITEMS: `{{Abandoned Cart Item (${t}) Image}}`,
138
141
  BROWSED_ITEMS: `{{Browsed Item (${t}) Image}}`,
139
142
  PURCHASED_ITEMS: `{{Purchased Item (${t}) Image}}`
140
143
  };
141
- return r[o] || r.CART_ITEMS;
144
+ return e[c] || e.CART_ITEMS;
142
145
  }
143
- function N(o, t) {
144
- const r = {
146
+ function H(c, t) {
147
+ const e = {
145
148
  CART_ITEMS: `{{Abandoned Cart Item (${t}) Url}}`,
146
149
  BROWSED_ITEMS: `{{Browsed Item (${t}) Url}}`,
147
150
  PURCHASED_ITEMS: `{{Purchased Item (${t}) Url}}`
148
151
  };
149
- return r[o] || r.CART_ITEMS;
152
+ return e[c] || e.CART_ITEMS;
150
153
  }
151
- class H {
154
+ class N {
152
155
  constructor() {
153
- M(this, "parser");
156
+ D(this, "parser");
154
157
  this.parser = new DOMParser();
155
158
  }
156
159
  migrate(t) {
157
160
  try {
158
161
  if (!this.containsItemsBlock(t))
159
162
  return this.backfillV2ProductTdAttributes(t);
160
- let r = this.removeJinjaConditionals(t);
161
- r = this.replaceTemplateVariables(r);
162
- const c = this.parser.parseFromString(r, "text/html"), a = c.querySelectorAll(
163
+ let e = this.removeJinjaConditionals(t);
164
+ e = this.replaceTemplateVariables(e);
165
+ const a = this.parser.parseFromString(e, "text/html"), r = a.querySelectorAll(
163
166
  "td.esd-cart-items-block, td.esd-browsed-items-block, td.esd-purchased-items-block"
164
167
  );
165
- return q().$patch((n) => {
166
- n.migrations = { ...n.migrations, [w]: a.length };
167
- }), a.length === 0 ? (console.warn("ItemsBlockMigrator: No blocks found with items block selectors"), r) : (a.forEach((n) => {
168
- const e = this.extractConfiguration(n), l = F({
169
- orientation: e.orientation,
170
- itemsType: e.itemsType,
171
- itemId: e.itemId,
172
- currencySymbol: e.currencySymbol,
173
- currencyLocation: e.currencyLocation,
174
- formattedPrice: e.formattedPrice,
175
- configBlockAttributes: e.configBlockAttributes,
168
+ return U().$patch((i) => {
169
+ i.migrations = { ...i.migrations, [q]: r.length };
170
+ }), r.length === 0 ? (console.warn("ItemsBlockMigrator: No blocks found with items block selectors"), e) : (r.forEach((i) => {
171
+ const o = this.extractConfiguration(i), u = F({
172
+ orientation: o.orientation,
173
+ itemsType: o.itemsType,
174
+ itemId: o.itemId,
175
+ currencySymbol: o.currencySymbol,
176
+ currencyLocation: o.currencyLocation,
177
+ formattedPrice: o.formattedPrice,
178
+ configBlockAttributes: o.configBlockAttributes,
176
179
  migrate: !0,
177
- nameStyles: e.nameStyles,
178
- buttonStyles: e.buttonStyles,
179
- priceStyles: e.priceStyles,
180
- originalPriceStyles: e.originalPriceStyles,
181
- quantityStyles: e.quantityStyles,
182
- nodeConfig: h(e.configBlockAttributes)
183
- }), s = this.parser.parseFromString(
184
- `<table><tbody><tr>${l}</tr></tbody></table>`,
180
+ nameStyles: o.nameStyles,
181
+ buttonStyles: o.buttonStyles,
182
+ priceStyles: o.priceStyles,
183
+ originalPriceStyles: o.originalPriceStyles,
184
+ quantityStyles: o.quantityStyles,
185
+ nodeConfig: P(o.configBlockAttributes)
186
+ }), d = this.parser.parseFromString(
187
+ `<table><tbody><tr>${u}</tr></tbody></table>`,
185
188
  "text/html"
186
189
  ).querySelector("td");
187
- if (s && n.parentNode) {
188
- const _ = h(e.configBlockAttributes);
189
- s.setAttribute("esd-ext-config", JSON.stringify(_)), s.setAttribute("data-type", _.type);
190
- const d = s.querySelector("esd-config-block");
191
- d && d.remove(), n.parentNode.replaceChild(s, n);
190
+ if (d && i.parentNode) {
191
+ const s = P(o.configBlockAttributes);
192
+ d.setAttribute("esd-ext-config", JSON.stringify(s)), d.setAttribute("data-type", s.type);
193
+ const p = d.querySelector("esd-config-block");
194
+ p && p.remove(), i.parentNode.replaceChild(d, i);
192
195
  }
193
- }), c.documentElement.outerHTML);
194
- } catch (r) {
195
- return console.error("ItemsBlockMigrator failed:", r), t;
196
+ }), a.documentElement.outerHTML);
197
+ } catch (e) {
198
+ return console.error("ItemsBlockMigrator failed:", e), t;
196
199
  }
197
200
  }
198
201
  /**
@@ -202,28 +205,113 @@ class H {
202
205
  * - UI styles from product elements (name, price, button, quantity, etc.)
203
206
  */
204
207
  extractConfiguration(t) {
205
- var C, D, P;
206
- const r = k(
207
- ((C = t.querySelector("[data-type]")) == null ? void 0 : C.getAttribute("data-type")) ?? null
208
- ), c = ((D = t.querySelector("[data-number]")) == null ? void 0 : D.getAttribute("data-number")) || "1", a = parseInt(c) - 1, i = I[r], n = ((P = i == null ? void 0 : i[a]) == null ? void 0 : P.value) || i[0].value, e = t.querySelector('[product-attr="price"]'), l = (e == null ? void 0 : e.getAttribute("data-currency_symbol")) || "USD", s = ((e == null ? void 0 : e.getAttribute("data-curency")) || "before") === "after" ? "1" : "0", _ = (e == null ? void 0 : e.getAttribute("data-formated")) !== "false", d = this.extractConfigBlockAttributes(t, r, c), b = d["data-card_orientation_control_value"];
209
- let S;
210
- b ? S = b === "horizontal" ? "horizontal" : "vertical" : S = t.querySelector('[colspan="2"]') !== null ? "vertical" : "horizontal";
211
- const y = t.querySelector('a[product-attr="name"]'), A = (y == null ? void 0 : y.getAttribute("style")) || void 0, f = t.querySelector('a[product-attr="button"]'), m = (f == null ? void 0 : f.getAttribute("style")) || void 0, R = (e == null ? void 0 : e.getAttribute("style")) || void 0, E = t.querySelector("p.original-price"), L = (E == null ? void 0 : E.getAttribute("style")) || void 0, T = t.querySelector('[product-attr="quantity"]'), B = (T == null ? void 0 : T.getAttribute("style")) || void 0;
208
+ var C;
209
+ const e = M(
210
+ this.readSelfOrDescendantAttribute(t, "data-type") || O(t)
211
+ ), a = this.readSelfOrDescendantAttribute(t, "data-number") || "1", r = parseInt(a) - 1, l = E[e], i = ((C = l == null ? void 0 : l[r]) == null ? void 0 : C.value) || l[0].value, o = this.extractConfigBlockAttributes(t, e, a);
212
+ this.applyDomFallbacks(t, o);
213
+ const u = t.querySelector('[product-attr="price"]'), n = o["data-product_price_control_currency_symbol"], d = o["data-product_price_currency_location"] || "0", s = o["data-product_price_control_formated"], p = s !== "false" && s !== "0", S = o["data-card_orientation_control_value"] === "horizontal" ? "horizontal" : "vertical", y = t.querySelector('a[product-attr="name"]'), f = (y == null ? void 0 : y.getAttribute("style")) || void 0, m = t.querySelector('a[product-attr="button"]') ?? t.querySelector('[product-attr="button"]'), A = (m == null ? void 0 : m.getAttribute("style")) || void 0, R = (u == null ? void 0 : u.getAttribute("style")) || void 0, g = t.querySelector("p.original-price") ?? t.querySelector('[product-attr="originalPrice"]'), T = g != null && g.getAttribute("style") ? g : (g == null ? void 0 : g.closest("p")) ?? g, w = (T == null ? void 0 : T.getAttribute("style")) || void 0, h = t.querySelector('[product-attr="quantity"]'), L = (h == null ? void 0 : h.getAttribute("style")) || void 0;
212
214
  return {
213
215
  orientation: S,
214
- itemsType: r,
215
- itemId: n,
216
- currencySymbol: l,
217
- currencyLocation: s,
218
- formattedPrice: _,
219
- configBlockAttributes: d,
220
- nameStyles: A,
221
- buttonStyles: m,
216
+ itemsType: e,
217
+ itemId: i,
218
+ currencySymbol: n,
219
+ currencyLocation: d,
220
+ formattedPrice: p,
221
+ configBlockAttributes: o,
222
+ nameStyles: f,
223
+ buttonStyles: A,
222
224
  priceStyles: R,
223
- originalPriceStyles: L,
224
- quantityStyles: B
225
+ originalPriceStyles: w,
226
+ quantityStyles: L
227
+ };
228
+ }
229
+ /**
230
+ * DOM fallback for hand-edited templates. The esd-config-block is authoritative only for
231
+ * the keys it ACTUALLY carries — every other key follows the live markup, whether the block
232
+ * was deleted outright or (far more common) survives carrying only a couple of `_opened`
233
+ * attributes. Without the per-key split, one such stub block shadows the whole DOM and the
234
+ * card migrates with the boilerplate defaults: caption "Buy", USD, full-width button.
235
+ */
236
+ applyDomFallbacks(t, e) {
237
+ var b, S;
238
+ const a = t.querySelector("esd-config-block"), r = (...y) => !a || y.every((f) => !(a.getAttribute(f) ?? "").trim());
239
+ Object.entries({
240
+ image: '[product-attr="imageSrc"]',
241
+ name: '[product-attr="name"]',
242
+ price: '[product-attr="price"]',
243
+ original_price: '[product-attr="originalPrice"], p.original-price',
244
+ quantity: '[product-attr="quantity"]',
245
+ button: '[product-attr="button"]'
246
+ }).forEach(([y, f]) => {
247
+ const m = `data-product_${y}_control_enabled`;
248
+ r(m) && (e[m] = t.querySelector(f) ? "true" : "false");
249
+ }), r("data-card_orientation_control_value") && (e["data-card_orientation_control_value"] = t.querySelector('[colspan="2"]') ? "vertical" : "horizontal");
250
+ const i = t.querySelector('a[product-attr="button"]') ?? t.querySelector('[product-attr="button"]'), o = (b = i == null ? void 0 : i.textContent) == null ? void 0 : b.replace(/\s+/g, " ").trim();
251
+ o && r("data-product_button_control_label") && (e["data-product_button_control_label"] = o), r("data-product_button_control_atw") && /display:\s*inline/.test((i == null ? void 0 : i.getAttribute("style")) || "") && (e["data-product_button_control_atw"] = "false");
252
+ const u = t.querySelector('[product-attr="imageSrc"]'), n = u ? this.readImageSize(u) : null, d = (n == null ? void 0 : n.height) ?? (n == null ? void 0 : n.width), s = (n == null ? void 0 : n.width) ?? (n == null ? void 0 : n.height);
253
+ d && r("data-product_image_control_image-height") && (e["data-product_image_control_image-height"] = d), s && r("data-product_image_control_image-width") && (e["data-product_image_control_image-width"] = s), this.applyPriceDomFallbacks(t, e, r);
254
+ const p = ((S = t.querySelector('[product-attr="name"]')) == null ? void 0 : S.getAttribute("style")) || "";
255
+ r("data-product_name_control_trim") && /white-space:\s*normal/.test(p) && (e["data-product_name_control_trim"] = "0");
256
+ }
257
+ /**
258
+ * Carries the price cell's own currency/format attributes into the config attributes when
259
+ * the config block omits them. extractConfiguration used to read the cell separately for the
260
+ * rendered markup while nodeConfig kept the defaults — so a ₺/after card migrated rendering
261
+ * ₺ but reporting USD/before to the settings panel, and the first unrelated price edit wrote
262
+ * the default back over the real value.
263
+ */
264
+ applyPriceDomFallbacks(t, e, a) {
265
+ var n;
266
+ const r = t.querySelector('[product-attr="price"]') ?? t.querySelector('[product-attr="originalPrice"]');
267
+ if (!r)
268
+ return;
269
+ const l = (n = r.getAttribute("data-currency_symbol")) == null ? void 0 : n.trim();
270
+ l && a("data-product_price_control_currency_symbol") && (e["data-product_price_control_currency_symbol"] = l);
271
+ const i = r.getAttribute("data-curency");
272
+ if (i && a("data-product_price_currency_location", "data-product_price_control_curency")) {
273
+ const d = i === "after" ? "1" : "0";
274
+ e["data-product_price_currency_location"] = d, e["data-product_price_control_curency"] = d;
275
+ }
276
+ const o = r.getAttribute("data-formated");
277
+ o && a("data-product_price_control_formated") && (e["data-product_price_control_formated"] = o);
278
+ const u = r.getAttribute("data-single_price");
279
+ u && a("data-product_price_control_single_price") && (e["data-product_price_control_single_price"] = u);
280
+ }
281
+ /**
282
+ * Reads an attribute from the block element itself before falling back to a descendant.
283
+ * Real legacy markup carries data-type/data-number on the `.ins-product-td` AND on the
284
+ * esd-config-block; when an author deletes the config block only the td's copy survives.
285
+ */
286
+ readSelfOrDescendantAttribute(t, e) {
287
+ var a;
288
+ return t.getAttribute(e) || ((a = t.querySelector(`[${e}]`)) == null ? void 0 : a.getAttribute(e)) || null;
289
+ }
290
+ /**
291
+ * Reads the product image's pixel size — `width`/`height` attributes first, then px values
292
+ * in the inline style. An explicit `width`/`height` wins over `max-*`, which is only an
293
+ * upper bound; `max-*` still covers the common `width: 100%` case, where no pixel size can
294
+ * be read from the property itself. Each side is null when it carries no pixel size.
295
+ */
296
+ readImageSize(t) {
297
+ return {
298
+ width: this.readImageDimension(t, "width"),
299
+ height: this.readImageDimension(t, "height")
225
300
  };
226
301
  }
302
+ /**
303
+ * One side of readImageSize. `width="0"` is not a size — authors who override the real
304
+ * dimensions in CSS zero out the attributes, and taking the 0 collapses the migrated image
305
+ * to nothing, so only a positive integer counts as an answer.
306
+ */
307
+ readImageDimension(t, e) {
308
+ var n;
309
+ const a = (d) => !!d && /^\d+$/.test(d ?? "") && parseInt(d ?? "") > 0 ? d : null, r = a((n = t.getAttribute(e)) == null ? void 0 : n.trim());
310
+ if (r)
311
+ return r;
312
+ const l = t.getAttribute("style") || "", i = new RegExp(`(?:^|;)\\s*${e}:\\s*(\\d+)px`), o = new RegExp(`max-${e}:\\s*(\\d+)px`), u = l.match(i) || l.match(o);
313
+ return a(u == null ? void 0 : u[1]);
314
+ }
227
315
  /**
228
316
  * Extracts all data-* attributes from the esd-config-block element
229
317
  * Returns a key-value mapping of all configuration attributes
@@ -231,27 +319,27 @@ class H {
231
319
  * @param itemsType - The type of items (CART_ITEMS, BROWSED_ITEMS, PURCHASED_ITEMS)
232
320
  * @param itemNumber - The item number (1-based index)
233
321
  */
234
- extractConfigBlockAttributes(t, r, c) {
235
- const a = t.querySelector("esd-config-block"), i = {};
236
- if (!a)
237
- return this.getDefaultConfigBlockAttributes();
238
- if (Array.from(a.attributes).forEach((e) => {
239
- e.name.startsWith("data-") && (i[e.name] = e.value);
240
- }), i["data-cart_items_select_control_value"]) {
241
- const e = i["data-cart_items_select_control_value"];
242
- if (/^\d+$/.test(e)) {
243
- const l = parseInt(e) - 1, u = I[r];
244
- u && u[l] && (i["data-cart_items_select_control_value"] = u[l].value);
322
+ extractConfigBlockAttributes(t, e, a) {
323
+ const r = t.querySelector("esd-config-block"), l = {};
324
+ if (r) {
325
+ if (Array.from(r.attributes).forEach((o) => {
326
+ o.name.startsWith("data-") && (l[o.name] = o.value);
327
+ }), l["data-cart_items_select_control_value"]) {
328
+ const o = l["data-cart_items_select_control_value"];
329
+ if (/^\d+$/.test(o)) {
330
+ const u = parseInt(o) - 1, n = E[e];
331
+ n && n[u] && (l["data-cart_items_select_control_value"] = n[u].value);
332
+ }
245
333
  }
334
+ if (l["data-product_price_control_curency"]) {
335
+ const o = l["data-product_price_control_curency"];
336
+ let u = o;
337
+ o === "before" ? u = "0" : o === "after" && (u = "1"), l["data-product_price_control_curency"] = u, l["data-product_price_currency_location"] = u;
338
+ }
339
+ (!l["data-product_price_control_currency_symbol"] || l["data-product_price_control_currency_symbol"].trim() === "") && (l["data-product_price_control_currency_symbol"] = "USD");
246
340
  }
247
- if (i["data-product_price_control_curency"]) {
248
- const e = i["data-product_price_control_curency"];
249
- let l = e;
250
- e === "before" ? l = "0" : e === "after" && (l = "1"), i["data-product_price_control_curency"] = l, i["data-product_price_currency_location"] = l;
251
- }
252
- (!i["data-product_price_control_currency_symbol"] || i["data-product_price_control_currency_symbol"].trim() === "") && (i["data-product_price_control_currency_symbol"] = "USD");
253
- const n = { ...this.getDefaultConfigBlockAttributes(), ...i };
254
- return n["data-type"] = r, n["data-source"] = r, n["data-product_image_link"] = $(r, c), n["data-product_button_link"] = N(r, c), n;
341
+ const i = { ...this.getDefaultConfigBlockAttributes(), ...l };
342
+ return i["data-type"] = e, i["data-source"] = e, i["data-product_image_link"] = V(e, a), i["data-product_button_link"] = H(e, a), i;
255
343
  }
256
344
  /**
257
345
  * Returns default esd-config-block attributes based on the old template structure
@@ -325,25 +413,27 @@ class H {
325
413
  backfillV2ProductTdAttributes(t) {
326
414
  if (!t.includes("ins-product-td") || !t.includes("esd-ext-config"))
327
415
  return t;
328
- const r = this.parser.parseFromString(t, "text/html");
329
- let c = !1;
330
- return r.querySelectorAll(".ins-product-td").forEach((a) => {
331
- a.hasAttribute("width") && (a.removeAttribute("width"), c = !0);
332
- const i = a.getAttribute("esd-ext-config");
333
- let n = null;
416
+ const e = this.parser.parseFromString(t, "text/html");
417
+ let a = !1;
418
+ return e.querySelectorAll(".ins-product-td").forEach((r) => {
419
+ r.hasAttribute("width") && (r.removeAttribute("width"), a = !0), r.classList.contains("esd-container-frame") && (r.classList.remove("esd-container-frame"), a = !0);
420
+ const l = r.querySelector("table.ins-product-wrapper");
421
+ l != null && l.hasAttribute("width") && l.getAttribute("width") !== "100%" && (l.setAttribute("width", "100%"), a = !0);
422
+ const i = r.getAttribute("esd-ext-config");
423
+ let o = null;
334
424
  try {
335
- n = i ? JSON.parse(i) : null;
425
+ o = i ? JSON.parse(i) : null;
336
426
  } catch {
337
427
  }
338
- if (!n || (!a.getAttribute("data-nodup") && typeof n.priceHideDiscount == "boolean" && (a.setAttribute("data-nodup", String(n.priceHideDiscount)), c = !0), a.getAttribute("data-type")))
428
+ if (!o || (!r.getAttribute("data-nodup") && typeof o.priceHideDiscount == "boolean" && (r.setAttribute("data-nodup", String(o.priceHideDiscount)), a = !0), r.getAttribute("data-type")))
339
429
  return;
340
- const e = n.type || n.source;
341
- if (!e)
430
+ const u = o.type || o.source;
431
+ if (!u)
342
432
  return;
343
- a.setAttribute("data-type", e), c = !0;
344
- const l = typeof n.itemsSelectValue == "string" ? n.itemsSelectValue.match(/\((\d+)\)/) : null;
345
- l && a.getAttribute("data-number") !== l[1] && a.setAttribute("data-number", l[1]);
346
- }), c ? r.documentElement.outerHTML : t;
433
+ r.setAttribute("data-type", u), a = !0;
434
+ const n = typeof o.itemsSelectValue == "string" ? o.itemsSelectValue.match(/\((\d+)\)/) : null;
435
+ n && r.getAttribute("data-number") !== n[1] && r.setAttribute("data-number", n[1]);
436
+ }), a ? e.documentElement.outerHTML : t;
347
437
  }
348
438
  /**
349
439
  * Fast check for the presence of any items block (cart / browsed / purchased)
@@ -364,17 +454,17 @@ class H {
364
454
  * contains display condition Jinja scripts that should NOT be removed.
365
455
  */
366
456
  removeJinjaConditionals(t) {
367
- const r = "__ESD_DISPLAY_CONDITIONS_PLACEHOLDER__", c = t.match(/esd-custom-display-conditions="[^"]*"/);
368
- let a = c ? t.replace(c[0], r) : t;
369
- return a = a.replace(
457
+ const e = "__ESD_DISPLAY_CONDITIONS_PLACEHOLDER__", a = t.match(/esd-custom-display-conditions="[^"]*"/);
458
+ let r = a ? t.replace(a[0], e) : t;
459
+ return r = r.replace(
370
460
  /\{%\s*if\s+(ins_apr|browsed_item|purchased_item)_total_product_kind\s*(&gt;|>)\s*\d+\s*%\}/g,
371
461
  ""
372
- ), a = a.replace(
462
+ ), r = r.replace(
373
463
  /\{%\s*if\s+(ins_apr|browsed_item|purchased_item)_price_\d+\s*(!&#61;|!=)\s*\1_originalprice_\d+\s*%\}/g,
374
464
  ""
375
- ), a = a.replace(/\{%\s*endif\s*%\}/g, ""), c && (a = a.replace(r, c[0])), a = a.replace(/\n\s*\n\s*\n/g, `
465
+ ), r = r.replace(/\{%\s*endif\s*%\}/g, ""), a && (r = r.replace(e, a[0])), r = r.replace(/\n\s*\n\s*\n/g, `
376
466
 
377
- `), a;
467
+ `), r;
378
468
  }
379
469
  /**
380
470
  * Replaces template variables with default values from productPairs
@@ -386,32 +476,32 @@ class H {
386
476
  * - {{purchased_item_formattedprice_5}} → '1,490.49' (PURCHASED_ITEMS)
387
477
  */
388
478
  replaceTemplateVariables(t) {
389
- const { PAIRS_FOR_EXTENSION: r } = K;
390
- return t.replace(/{{([^}]+)}}/g, (c, a) => {
391
- const i = a.match(/^(ins_apr|browsed_item|purchased_item)_([a-z_]+)_(\d+)$/);
392
- if (!i)
393
- return c;
394
- const [, n, e, l] = i, u = V[n];
395
- if (!u)
396
- return console.warn(`Unknown variable prefix: ${n}`), c;
397
- const s = x[e];
398
- if (!s)
399
- return console.warn(`Unknown variable suffix mapping for: ${e}`), c;
400
- const { pairsKey: _, defaultKey: d, isArray: b } = s, y = r[_][u];
479
+ const { PAIRS_FOR_EXTENSION: e } = v;
480
+ return t.replace(/{{([^}]+)}}/g, (a, r) => {
481
+ const l = r.match(/^(ins_apr|browsed_item|purchased_item)_([a-z_]+)_(\d+)$/);
482
+ if (!l)
483
+ return a;
484
+ const [, i, o, u] = l, n = $[i];
485
+ if (!n)
486
+ return console.warn(`Unknown variable prefix: ${i}`), a;
487
+ const d = K[o];
488
+ if (!d)
489
+ return console.warn(`Unknown variable suffix mapping for: ${o}`), a;
490
+ const { pairsKey: s, defaultKey: p, isArray: b } = d, y = e[s][n];
401
491
  if (!y)
402
- return console.warn(`No data found for: ${_}.${u}`), c;
492
+ return console.warn(`No data found for: ${s}.${n}`), a;
403
493
  if (b) {
404
- const f = parseInt(l) - 1, m = y[d];
405
- return Array.isArray(m) && m[f] ? m[f] : (console.warn(`Array value not found: ${_}.${u}.${d}[${f}]`), c);
494
+ const m = parseInt(u) - 1, A = y[p];
495
+ return Array.isArray(A) && A[m] ? A[m] : (console.warn(`Array value not found: ${s}.${n}.${p}[${m}]`), a);
406
496
  }
407
- const A = y[d];
408
- return A !== void 0 ? String(A) : (console.warn(`Default value not found: ${_}.${u}.${d}`), c);
497
+ const f = y[p];
498
+ return f !== void 0 ? String(f) : (console.warn(`Default value not found: ${s}.${n}.${p}`), a);
409
499
  });
410
500
  }
411
501
  }
412
- function Q(o) {
413
- return new H().migrate(o);
502
+ function X(c) {
503
+ return new N().migrate(c);
414
504
  }
415
505
  export {
416
- Q as migrateItemsBlock
506
+ X as migrateItemsBlock
417
507
  };