@useinsider/guido 3.8.1-beta.2ee94c2 → 3.8.1-beta.6c0ee3f

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 (43) hide show
  1. package/dist/composables/useHtmlValidator.js +180 -133
  2. package/dist/config/compiler/utils/recommendationCompilerUtils.js +58 -57
  3. package/dist/config/compiler/utils/recommendationIgnoreUtils.js +15 -0
  4. package/dist/config/migrator/recommendation/extractors.js +44 -22
  5. package/dist/config/migrator/recommendation/htmlBuilder.js +175 -169
  6. package/dist/config/migrator/recommendationMigrator.js +30 -31
  7. package/dist/extensions/Blocks/Recommendation/block.js +4 -1
  8. package/dist/extensions/Blocks/Recommendation/constants/selectors.js +26 -20
  9. package/dist/extensions/Blocks/Recommendation/controls/cardComposition/index.js +176 -145
  10. package/dist/extensions/Blocks/Recommendation/controls/main/index.js +58 -57
  11. package/dist/extensions/Blocks/Recommendation/controls/main/layoutOrientation.js +43 -31
  12. package/dist/extensions/Blocks/Recommendation/controls/main/productCount.js +3 -2
  13. package/dist/extensions/Blocks/Recommendation/controls/main/productLayout.js +55 -45
  14. package/dist/extensions/Blocks/Recommendation/controls/main/utils.js +63 -56
  15. package/dist/extensions/Blocks/Recommendation/controls/syncInfoMessage.js +7 -6
  16. package/dist/extensions/Blocks/Recommendation/extension.js +3 -2
  17. package/dist/extensions/Blocks/Recommendation/settingsPanel.js +3 -2
  18. package/dist/extensions/Blocks/Recommendation/store/recommendation.js +3 -2
  19. package/dist/extensions/Blocks/Recommendation/templates/grid/template.js +13 -12
  20. package/dist/extensions/Blocks/Recommendation/templates/index.js +7 -6
  21. package/dist/extensions/Blocks/Recommendation/templates/utils.js +1 -1
  22. package/dist/extensions/Blocks/controlFactories.js +76 -57
  23. package/dist/src/composables/useHtmlValidator.d.ts +27 -0
  24. package/dist/src/composables/useHtmlValidator.test.d.ts +1 -0
  25. package/dist/src/config/compiler/utils/recommendationIgnoreUtils.d.ts +17 -0
  26. package/dist/src/config/compiler/utils/recommendationIgnoreUtils.test.d.ts +1 -0
  27. package/dist/src/config/migrator/recommendation/extractors.d.ts +15 -0
  28. package/dist/src/config/migrator/recommendation/htmlBuilder.d.ts +8 -0
  29. package/dist/src/extensions/Blocks/CouponBlock/controls/index.d.ts +1 -1
  30. package/dist/src/extensions/Blocks/Items/controls/index.d.ts +3 -3
  31. package/dist/src/extensions/Blocks/Recommendation/constants/index.d.ts +1 -1
  32. package/dist/src/extensions/Blocks/Recommendation/constants/selectors.d.ts +21 -0
  33. package/dist/src/extensions/Blocks/Recommendation/controls/cardComposition/index.d.ts +7 -0
  34. package/dist/src/extensions/Blocks/Recommendation/controls/main/layoutOrientation.d.ts +5 -0
  35. package/dist/src/extensions/Blocks/Recommendation/controls/main/productLayout.d.ts +6 -0
  36. package/dist/src/extensions/Blocks/Recommendation/controls/main/utils.d.ts +9 -0
  37. package/dist/src/extensions/Blocks/Recommendation/controls/name/index.d.ts +1 -1
  38. package/dist/src/extensions/Blocks/Recommendation/controls/oldPrice/index.d.ts +1 -1
  39. package/dist/src/extensions/Blocks/Recommendation/controls/omnibusDiscount/index.d.ts +1 -1
  40. package/dist/src/extensions/Blocks/Recommendation/controls/omnibusPrice/index.d.ts +1 -1
  41. package/dist/src/extensions/Blocks/Recommendation/controls/price/index.d.ts +1 -1
  42. package/dist/src/extensions/Blocks/controlFactories.d.ts +10 -1
  43. package/package.json +1 -1
@@ -1,42 +1,42 @@
1
- var J = Object.defineProperty;
2
- var Q = (p, _, t) => _ in p ? J(p, _, { enumerable: !0, configurable: !0, writable: !0, value: t }) : p[_] = t;
3
- var S = (p, _, t) => Q(p, typeof _ != "symbol" ? _ + "" : _, t);
4
- import { UIElementType as f, UEAttr as I, ModificationDescription as A } from "../../../../../node_modules/@stripoinc/ui-editor-extensions/dist/esm/index.js";
5
- import { CommonControl as Z } from "../../../common-control.js";
6
- import { ATTR_PRODUCT_IMAGE as D, ATTR_PRODUCT_NAME as tt, ATTR_PRODUCT_PRICE as et, ATTR_PRODUCT_OLD_PRICE as rt, ATTR_PRODUCT_OMNIBUS_PRICE as ot, ATTR_PRODUCT_OMNIBUS_DISCOUNT as st, ATTR_PRODUCT_BUTTON as U, ATTR_DATA_CUSTOM_ATTRIBUTES as q, ATTR_CUSTOM_PREFIX as m, BUILT_IN_DEFAULT_ATTRIBUTES as it } from "../../constants/selectors.js";
7
- import { DEFAULT_COMPOSITION as P, DEFAULT_VISIBILITY as F } from "../../constants/defaultConfig.js";
8
- import { RecommendationConfigService as nt } from "../../services/configService.js";
1
+ var Q = Object.defineProperty;
2
+ var Z = (p, g, t) => g in p ? Q(p, g, { enumerable: !0, configurable: !0, writable: !0, value: t }) : p[g] = t;
3
+ var T = (p, g, t) => Z(p, typeof g != "symbol" ? g + "" : g, t);
4
+ import { UIElementType as f, UEAttr as v, ModificationDescription as C } from "../../../../../node_modules/@stripoinc/ui-editor-extensions/dist/esm/index.js";
5
+ import { CommonControl as tt } from "../../../common-control.js";
6
+ import { ATTR_PRODUCT_IMAGE as B, ATTR_PRODUCT_NAME as et, ATTR_PRODUCT_PRICE as rt, ATTR_PRODUCT_OLD_PRICE as ot, ATTR_PRODUCT_OMNIBUS_PRICE as st, ATTR_PRODUCT_OMNIBUS_DISCOUNT as it, ATTR_PRODUCT_BUTTON as H, ATTR_DATA_CUSTOM_ATTRIBUTES as F, ATTR_CUSTOM_PREFIX as d, BUILT_IN_DEFAULT_ATTRIBUTES as nt } from "../../constants/selectors.js";
7
+ import { DEFAULT_COMPOSITION as P, DEFAULT_VISIBILITY as w } from "../../constants/defaultConfig.js";
8
+ import { RecommendationConfigService as $ } from "../../services/configService.js";
9
9
  import { useRecommendationExtensionStore as lt } from "../../store/recommendation.js";
10
10
  import { ATTRIBUTE_CELL_CLASS as at, gridElementRenderer as ct, DEFAULT_CELL_PADDING as ut, buildFillerCell as dt } from "../../templates/grid/elementRenderer.js";
11
11
  import { listElementRenderer as mt } from "../../templates/list/elementRenderer.js";
12
- import { toDisplayName as ht, isDefaultAttribute as pt, toDisplayableAttributeValue as _t, buildElementRenderer as w } from "../../templates/utils.js";
12
+ import { toDisplayName as ht, isDefaultAttribute as pt, toDisplayableAttributeValue as gt, buildElementRenderer as M } from "../../templates/utils.js";
13
13
  import { getTableDisplayValue as ft } from "../../utils/tagName.js";
14
- import { getCurrentLayout as gt } from "../main/utils.js";
15
- const bt = "ui-elements-recommendation-card-composition", C = ".recommendation-attribute-row", L = ".product-card-wrapper > tbody", M = ".product-info-cell > table > tbody", V = "data-card-composition", y = "data-attribute-type", v = "data-visibility", x = {
14
+ import { isPartnerManagedBlock as _t, getCurrentLayout as bt } from "../main/utils.js";
15
+ const yt = "ui-elements-recommendation-card-composition", A = ".recommendation-attribute-row", L = ".product-card-wrapper > tbody", V = ".product-info-cell > table > tbody", x = "data-card-composition", y = "data-attribute-type", N = "data-visibility", j = {
16
16
  ADD_ATTRIBUTE: "addAttribute"
17
- }, g = 5, E = "reorderIcon_", h = [
18
- { key: D, label: "Product Image" },
19
- { key: tt, label: "Product Name" },
20
- { key: et, label: "Product Price" },
21
- { key: rt, label: "Product Original Price" },
22
- { key: ot, label: "Omnibus Price" },
23
- { key: st, label: "Omnibus Discount" },
24
- { key: U, label: "Product Button" }
25
- ], yt = new Set(h.map((p) => p.key)), T = "customAttr_", R = "deleteAttr_";
26
- class Ut extends Z {
17
+ }, _ = 5, E = "reorderIcon_", h = [
18
+ { key: B, label: "Product Image" },
19
+ { key: et, label: "Product Name" },
20
+ { key: rt, label: "Product Price" },
21
+ { key: ot, label: "Product Original Price" },
22
+ { key: st, label: "Omnibus Price" },
23
+ { key: it, label: "Omnibus Discount" },
24
+ { key: H, label: "Product Button" }
25
+ ], Ct = new Set(h.map((p) => p.key)), S = "customAttr_", R = "deleteAttr_";
26
+ class Ht extends tt {
27
27
  constructor() {
28
28
  super(...arguments);
29
- S(this, "store", lt());
30
- S(this, "unsubscribeStore", null);
31
- S(this, "eventController", null);
29
+ T(this, "store", lt());
30
+ T(this, "unsubscribeStore", null);
31
+ T(this, "eventController", null);
32
32
  /**
33
33
  * Guard flag: when true, onTemplateNodeUpdated skips _initializeComposition.
34
34
  * Used during _onReorder to prevent multiple intermediate rebuilds.
35
35
  */
36
- S(this, "reorderInProgress", !1);
36
+ T(this, "reorderInProgress", !1);
37
37
  }
38
38
  getId() {
39
- return bt;
39
+ return yt;
40
40
  }
41
41
  // ========================================================================
42
42
  // Lifecycle
@@ -47,23 +47,23 @@ class Ut extends Z {
47
47
  ${this._GuToggle(`visibility_${l.key}`)}
48
48
  </div>
49
49
  `).join(""), r = Array.from(
50
- { length: g },
50
+ { length: _ },
51
51
  (l, u) => `
52
- <div data-custom-select-key="${T}${u}" style="display: none;">
52
+ <div data-custom-select-key="${S}${u}" style="display: none;">
53
53
  ${this._GuSelect({
54
- name: `${T}${u}`,
54
+ name: `${S}${u}`,
55
55
  placeholder: this.api.translate("Select Attribute"),
56
56
  options: []
57
57
  })}
58
58
  </div>
59
59
  `
60
- ).join(""), e = h.length + g, o = Array.from(
60
+ ).join(""), e = h.length + _, o = Array.from(
61
61
  { length: e },
62
62
  (l, u) => `
63
63
  <div data-reorder-icon-key="${E}${u}" style="display: none;">
64
64
  <${f.BUTTON}
65
65
  class="drag-handle-btn flat-inline flat-white"
66
- ${I.BUTTON.name}="${E}${u}"
66
+ ${v.BUTTON.name}="${E}${u}"
67
67
  >
68
68
  <${f.ICON}
69
69
  src="reorder"
@@ -73,12 +73,12 @@ class Ut extends Z {
73
73
  </div>
74
74
  `
75
75
  ).join(""), s = Array.from(
76
- { length: g },
76
+ { length: _ },
77
77
  (l, u) => `
78
78
  <div data-custom-delete-key="${R}${u}" style="display: none;">
79
79
  <${f.BUTTON}
80
80
  class="custom-attr-delete flat-inline flat-white"
81
- ${I.BUTTON.name}="${R}${u}"
81
+ ${v.BUTTON.name}="${R}${u}"
82
82
  >
83
83
  <${f.ICON}
84
84
  src="delete"
@@ -89,15 +89,15 @@ class Ut extends Z {
89
89
  `
90
90
  ).join(""), i = "https://academy.insiderone.com/docs/new-editor-email-recommendation-block", n = this.api.translate(
91
91
  "Drag and drop the card elements to reorder them, adjust their visibility or add new attributes up to 5."
92
- ), a = this.api.translate("For more information, you can"), c = this.api.translate("visit Academy");
92
+ ), c = this.api.translate("For more information, you can"), a = this.api.translate("visit Academy");
93
93
  return `
94
94
  <div class="recommendation-controls-container" data-card-composition-control>
95
95
  <div class="container">
96
96
  <p class="card-composition-description">
97
97
  ${n}
98
- ${a}
98
+ ${c}
99
99
  <!-- cspell:disable-next-line -->
100
- <a href="${i}" target="_blank" rel="noopener noreferrer">${c}</a>.
100
+ <a href="${i}" target="_blank" rel="noopener noreferrer">${a}</a>.
101
101
  </p>
102
102
  </div>
103
103
 
@@ -120,7 +120,7 @@ class Ut extends Z {
120
120
  <div class="orderable-list" data-composition-list></div>
121
121
 
122
122
  ${this._GuButton({
123
- name: x.ADD_ATTRIBUTE,
123
+ name: j.ADD_ATTRIBUTE,
124
124
  label: this.api.translate("Add Attribute"),
125
125
  id: "guido__btn-add-attribute"
126
126
  })}
@@ -128,10 +128,24 @@ class Ut extends Z {
128
128
  `;
129
129
  }
130
130
  onRender() {
131
- this._initializeComposition(), this._registerValueChangeListeners(), this._setupEventListeners(), this._updateOrderableState(), this._subscribeToStoreChanges();
131
+ this._initializeComposition(), this._registerValueChangeListeners(), this._setupEventListeners(), this._updateOrderableState(), this._subscribeToStoreChanges(), this._syncDisabledState();
132
+ }
133
+ /**
134
+ * Card composition restructures the block (toggles/reorders/adds attribute
135
+ * cells), which would corrupt a partner-managed (`ins-skip-compile`) block's
136
+ * preserved markup. There is no native tab-disable API, so the whole control
137
+ * container is rendered inert (greyed + non-interactive) instead.
138
+ */
139
+ _syncDisabledState() {
140
+ var e;
141
+ const t = (e = this.getContainer()) == null ? void 0 : e.querySelector("[data-card-composition-control]");
142
+ if (!t)
143
+ return;
144
+ const r = _t(this.currentNode);
145
+ t.style.pointerEvents = r ? "none" : "", t.style.opacity = r ? "0.5" : "";
132
146
  }
133
147
  onTemplateNodeUpdated(t) {
134
- super.onTemplateNodeUpdated(t), !this.reorderInProgress && (this._initializeComposition(), this._updateOrderableState());
148
+ super.onTemplateNodeUpdated(t), !this.reorderInProgress && (this._initializeComposition(), this._updateOrderableState(), this._syncDisabledState());
135
149
  }
136
150
  onDestroy() {
137
151
  super.onDestroy(), this.eventController && (this.eventController.abort(), this.eventController = null), this.unsubscribeStore && (this.unsubscribeStore(), this.unsubscribeStore = null);
@@ -149,8 +163,8 @@ class Ut extends Z {
149
163
  this._applyVisibilityToBlock(t.key, r);
150
164
  });
151
165
  });
152
- for (let t = 0; t < g; t++) {
153
- const r = `${T}${t}`, e = t;
166
+ for (let t = 0; t < _; t++) {
167
+ const r = `${S}${t}`, e = t;
154
168
  this.api.onValueChanged(r, (o) => {
155
169
  this._onCustomAttributeChanged(e, o);
156
170
  });
@@ -162,36 +176,42 @@ class Ut extends Z {
162
176
  _readCompositionFromNode() {
163
177
  if (!this.currentNode || !("getAttribute" in this.currentNode))
164
178
  return [...P];
165
- const t = this.currentNode.getAttribute(V);
166
- return t ? t.split(",").filter(Boolean) : [...P];
179
+ const t = this.currentNode.getAttribute(x);
180
+ if (t)
181
+ return t.split(",").filter(Boolean);
182
+ const { composition: r } = $.getConfig(this.currentNode);
183
+ return r != null && r.length ? [...r] : [...P];
167
184
  }
168
185
  _readCustomAttributesFromNode() {
169
186
  if (!this.currentNode || !("getAttribute" in this.currentNode))
170
187
  return [];
171
- const t = this.currentNode.getAttribute(q);
172
- if (!t)
173
- return [];
174
- try {
175
- return JSON.parse(t);
176
- } catch {
177
- return [];
178
- }
188
+ const t = this.currentNode.getAttribute(F);
189
+ if (t)
190
+ try {
191
+ return JSON.parse(t);
192
+ } catch {
193
+ return [];
194
+ }
195
+ return this._readCompositionFromNode().filter((r) => r.startsWith(d)).map((r) => r.substring(d.length));
179
196
  }
180
197
  _readVisibilityFromRows() {
181
198
  if (!this.currentNode)
182
199
  return this._getDefaultVisibilities();
183
- const t = Array.from(this.currentNode.querySelectorAll(C)), r = this._extractVisibilityFromRows(t);
184
- return this._mergeWithDefaults(r);
200
+ const t = Array.from(this.currentNode.querySelectorAll(A)), r = this._extractVisibilityFromRows(t);
201
+ if (Object.keys(r).length > 0)
202
+ return this._mergeWithDefaults(r);
203
+ const e = $.getConfig(this.currentNode).visibility;
204
+ return this._mergeWithDefaults({ ...e });
185
205
  }
186
206
  _getDefaultVisibilities() {
187
- return { ...F };
207
+ return { ...w };
188
208
  }
189
209
  _extractVisibilityFromRows(t) {
190
210
  const r = {};
191
211
  return t.forEach((e) => {
192
212
  if (!("getAttribute" in e))
193
213
  return;
194
- const o = e.getAttribute(y), s = e.getAttribute(v);
214
+ const o = e.getAttribute(y), s = e.getAttribute(N);
195
215
  o && s !== null && (r[o] = this._parseVisibilityValue(s));
196
216
  }), r;
197
217
  }
@@ -199,7 +219,7 @@ class Ut extends Z {
199
219
  return t === "1" || t === "true";
200
220
  }
201
221
  _mergeWithDefaults(t) {
202
- return Object.entries(F).forEach(([r, e]) => {
222
+ return Object.entries(w).forEach(([r, e]) => {
203
223
  r in t || (t[r] = e);
204
224
  }), t;
205
225
  }
@@ -223,19 +243,19 @@ class Ut extends Z {
223
243
  return !1;
224
244
  const s = new Set(r);
225
245
  let i = 0, n = 0;
226
- const a = t.map((c) => {
227
- if (yt.has(c)) {
228
- const l = h.find((u) => u.key === c);
246
+ const c = t.map((a) => {
247
+ if (Ct.has(a)) {
248
+ const l = h.find((u) => u.key === a);
229
249
  return this._createBuiltInItemHtml(l, n++);
230
250
  }
231
- if (c.startsWith(m)) {
232
- const l = c.substring(m.length);
251
+ if (a.startsWith(d)) {
252
+ const l = a.substring(d.length);
233
253
  if (s.has(l))
234
- return this._createCustomItemHtml(c, i++, n++);
254
+ return this._createCustomItemHtml(a, i++, n++);
235
255
  }
236
256
  return "";
237
257
  }).join("");
238
- return this._rescueTogglesToStore(e), this._rescueSelectsToStore(e), this._rescueDeleteButtonsToStore(e), this._rescueReorderIconsToStore(e), o.innerHTML = a, this._moveTogglesIntoItems(e), this._moveSelectsIntoItems(e, r.length), this._moveDeleteButtonsIntoItems(e, r.length), this._moveReorderIconsIntoItems(e, n), !0;
258
+ return this._rescueTogglesToStore(e), this._rescueSelectsToStore(e), this._rescueDeleteButtonsToStore(e), this._rescueReorderIconsToStore(e), o.innerHTML = c, this._moveTogglesIntoItems(e), this._moveSelectsIntoItems(e, r.length), this._moveDeleteButtonsIntoItems(e, r.length), this._moveReorderIconsIntoItems(e, n), !0;
239
259
  }
240
260
  /**
241
261
  * Attempts to reorder existing orderable-item elements to match the composition order.
@@ -247,27 +267,27 @@ class Ut extends Z {
247
267
  const e = Array.from(t.querySelectorAll(".orderable-item"));
248
268
  if (e.length !== r.length)
249
269
  return !1;
250
- const o = e.map((c) => c.dataset.key).filter(Boolean);
270
+ const o = e.map((a) => a.dataset.key).filter(Boolean);
251
271
  if (o.length !== r.length)
252
272
  return !1;
253
273
  const s = [...o].sort().join(","), i = [...r].sort().join(",");
254
- if (s !== i || r.some((c) => c.startsWith(m)))
274
+ if (s !== i || r.some((a) => a.startsWith(d)))
255
275
  return !1;
256
276
  const n = /* @__PURE__ */ new Map();
257
- e.forEach((c) => {
258
- const { key: l } = c.dataset;
277
+ e.forEach((a) => {
278
+ const { key: l } = a.dataset;
259
279
  if (l) {
260
280
  const u = n.get(l) || [];
261
- u.push(c), n.set(l, u);
281
+ u.push(a), n.set(l, u);
262
282
  }
263
283
  });
264
- const a = /* @__PURE__ */ new Map();
265
- return r.forEach((c) => {
266
- const l = n.get(c);
284
+ const c = /* @__PURE__ */ new Map();
285
+ return r.forEach((a) => {
286
+ const l = n.get(a);
267
287
  if (!l)
268
288
  return;
269
- const u = a.get(c) || 0;
270
- a.set(c, u + 1), l[u] && t.appendChild(l[u]);
289
+ const u = c.get(a) || 0;
290
+ c.set(a, u + 1), l[u] && t.appendChild(l[u]);
271
291
  }), !0;
272
292
  }
273
293
  _createBuiltInItemHtml(t, r) {
@@ -315,8 +335,8 @@ class Ut extends Z {
315
335
  _initializeCustomSelects(t) {
316
336
  t.length !== 0 && setTimeout(() => {
317
337
  t.forEach((r, e) => {
318
- const o = `${T}${e}`, s = this._getSelectOptions(r, t);
319
- this.api.setUIEAttribute(o, I.SELECTPICKER.items, s), this.api.updateValues({ [o]: r });
338
+ const o = `${S}${e}`, s = this._getSelectOptions(r, t);
339
+ this.api.setUIEAttribute(o, v.SELECTPICKER.items, s), this.api.updateValues({ [o]: r });
320
340
  });
321
341
  }, 0);
322
342
  }
@@ -339,7 +359,7 @@ class Ut extends Z {
339
359
  */
340
360
  _moveSelectsIntoItems(t, r) {
341
361
  for (let e = 0; e < r; e++) {
342
- const o = `${T}${e}`, s = t.querySelector(`[data-custom-select-key="${o}"]`), i = t.querySelector(`[data-custom-select-slot="${e}"]`);
362
+ const o = `${S}${e}`, s = t.querySelector(`[data-custom-select-key="${o}"]`), i = t.querySelector(`[data-custom-select-slot="${e}"]`);
343
363
  if (s && i) {
344
364
  const n = s.querySelector("ue-select");
345
365
  n && i.appendChild(n);
@@ -366,8 +386,8 @@ class Ut extends Z {
366
386
  * Same rescue pattern as _rescueTogglesToStore — prevents innerHTML from destroying them.
367
387
  */
368
388
  _rescueSelectsToStore(t) {
369
- for (let r = 0; r < g; r++) {
370
- const e = `${T}${r}`, o = t.querySelector(`[data-custom-select-key="${e}"]`), s = t.querySelector(`[data-custom-select-slot="${r}"]`);
389
+ for (let r = 0; r < _; r++) {
390
+ const e = `${S}${r}`, o = t.querySelector(`[data-custom-select-key="${e}"]`), s = t.querySelector(`[data-custom-select-slot="${r}"]`);
371
391
  if (s) {
372
392
  const i = s.querySelector("ue-select");
373
393
  i && o && o.appendChild(i);
@@ -392,7 +412,7 @@ class Ut extends Z {
392
412
  * Same rescue pattern as _rescueSelectsToStore — prevents innerHTML from destroying them.
393
413
  */
394
414
  _rescueDeleteButtonsToStore(t) {
395
- for (let r = 0; r < g; r++) {
415
+ for (let r = 0; r < _; r++) {
396
416
  const e = `${R}${r}`, o = t.querySelector(`[data-custom-delete-key="${e}"]`), s = t.querySelector(`[data-custom-delete-slot="${r}"]`);
397
417
  if (s) {
398
418
  const i = s.querySelector("ue-button");
@@ -418,7 +438,7 @@ class Ut extends Z {
418
438
  * Same rescue pattern as _rescueDeleteButtonsToStore — prevents innerHTML from destroying them.
419
439
  */
420
440
  _rescueReorderIconsToStore(t) {
421
- const r = h.length + g;
441
+ const r = h.length + _;
422
442
  for (let e = 0; e < r; e++) {
423
443
  const o = `${E}${e}`, s = t.querySelector(`[data-reorder-icon-key="${o}"]`), i = t.querySelector(`[data-reorder-icon-slot="${e}"]`);
424
444
  if (i) {
@@ -444,24 +464,24 @@ class Ut extends Z {
444
464
  _setupDragAndDrop(t, r) {
445
465
  let e = null, o = null;
446
466
  t.addEventListener("dragstart", (s) => {
447
- var a;
467
+ var c;
448
468
  const n = s.target.closest(".orderable-item");
449
- n && (e = n, n.classList.add("dragging"), (a = s.dataTransfer) == null || a.setData("text/plain", n.dataset.key || ""));
469
+ n && (e = n, n.classList.add("dragging"), (c = s.dataTransfer) == null || c.setData("text/plain", n.dataset.key || ""));
450
470
  }, { signal: r }), t.addEventListener("dragend", () => {
451
471
  e && e.classList.remove("dragging"), e = null, o == null || o.classList.remove("drag-over"), o = null;
452
472
  }, { signal: r }), t.addEventListener("dragover", (s) => {
453
473
  s.preventDefault();
454
- const n = s.target.closest(".orderable-item"), a = n && n !== e ? n : null;
455
- a !== o && (o == null || o.classList.remove("drag-over"), o = a, o == null || o.classList.add("drag-over"));
474
+ const n = s.target.closest(".orderable-item"), c = n && n !== e ? n : null;
475
+ c !== o && (o == null || o.classList.remove("drag-over"), o = c, o == null || o.classList.add("drag-over"));
456
476
  }, { signal: r }), t.addEventListener("drop", (s) => {
457
477
  s.preventDefault();
458
478
  const n = s.target.closest(".orderable-item");
459
479
  if (!n || !e || n === e)
460
480
  return;
461
- const a = n.getBoundingClientRect(), c = a.top + a.height / 2;
462
- s.clientY < c ? t.insertBefore(e, n) : t.insertBefore(e, n.nextSibling), o == null || o.classList.remove("drag-over"), o = null, e.classList.remove("dragging");
463
- const u = t.querySelectorAll(".orderable-item"), d = Array.from(u).map((b) => b.dataset.key).filter(Boolean);
464
- this._onReorder(d), e = null;
481
+ const c = n.getBoundingClientRect(), a = c.top + c.height / 2;
482
+ s.clientY < a ? t.insertBefore(e, n) : t.insertBefore(e, n.nextSibling), o == null || o.classList.remove("drag-over"), o = null, e.classList.remove("dragging");
483
+ const u = t.querySelectorAll(".orderable-item"), m = Array.from(u).map((b) => b.dataset.key).filter(Boolean);
484
+ this._onReorder(m), e = null;
465
485
  }, { signal: r });
466
486
  }
467
487
  _setupDeleteHandler(t, r) {
@@ -477,7 +497,7 @@ class Ut extends Z {
477
497
  // Actions (Add, Delete, Reorder)
478
498
  // ========================================================================
479
499
  _onAddAttribute(t, r) {
480
- const e = `${m}${t}`, o = this._readCompositionFromNode();
500
+ const e = `${d}${t}`, o = this._readCompositionFromNode();
481
501
  o.push(e);
482
502
  const s = [...this._readCustomAttributesFromNode(), t];
483
503
  this._updateBothAttributes(o, s), this._injectCustomAttributeHtml(t, r, e, o), this._renderOrderableItems(o, s), this._initializeCustomSelects(s), this._updateAddButtonState();
@@ -490,7 +510,7 @@ class Ut extends Z {
490
510
  const r = this._readCustomAttributesFromNode();
491
511
  if (r[t] === void 0)
492
512
  return;
493
- const o = this._readCompositionFromNode(), s = this._findNthCustomKeyIndex(o, t), i = o.filter((a, c) => c !== s), n = r.filter((a, c) => c !== t);
513
+ const o = this._readCompositionFromNode(), s = this._findNthCustomKeyIndex(o, t), i = o.filter((c, a) => a !== s), n = r.filter((c, a) => a !== t);
494
514
  this._updateBothAttributes(i, n), this._removeCustomAttributeHtml(i), this._renderOrderableItems(i, n), this._initializeCustomSelects(n), this._updateAddButtonState();
495
515
  }
496
516
  /**
@@ -501,13 +521,13 @@ class Ut extends Z {
501
521
  const e = this._readCustomAttributesFromNode(), o = e[t];
502
522
  if (o === void 0 || o === r)
503
523
  return;
504
- const s = `${m}${r}`, i = this._readCompositionFromNode(), n = this._findNthCustomKeyIndex(i, t);
524
+ const s = `${d}${r}`, i = this._readCompositionFromNode(), n = this._findNthCustomKeyIndex(i, t);
505
525
  n !== -1 && (i[n] = s), e[t] = r;
506
- const a = this._getDisplayNameForAttribute(r);
507
- this._updateBothAttributes(i, e), this._injectCustomAttributeHtml(r, a, s, i), this._renderOrderableItems(i, e), this._initializeCustomSelects(e);
526
+ const c = this._getDisplayNameForAttribute(r);
527
+ this._updateBothAttributes(i, e), this._injectCustomAttributeHtml(r, c, s, i), this._renderOrderableItems(i, e), this._initializeCustomSelects(e);
508
528
  }
509
529
  _onReorder(t) {
510
- const r = t.filter((e) => e.startsWith(m)).map((e) => e.substring(m.length));
530
+ const r = t.filter((e) => e.startsWith(d)).map((e) => e.substring(d.length));
511
531
  this.reorderInProgress = !0;
512
532
  try {
513
533
  this._updateBothAttributes(t, r), this._getCurrentLayout() === "grid" && this._reorderProductAttributes(t);
@@ -528,58 +548,58 @@ class Ut extends Z {
528
548
  const s = this.currentNode.querySelectorAll(L);
529
549
  if (!(s != null && s.length))
530
550
  return;
531
- const i = nt.getConfig(this.currentNode), a = `0 ${Math.floor(i.columnSpacing / 2)}px`, c = this.api.getDocumentModifier(), l = this.store.recommendationProducts.length;
551
+ const i = $.getConfig(this.currentNode), c = `0 ${Math.floor(i.columnSpacing / 2)}px`, a = this.api.getDocumentModifier(), l = this.store.recommendationProducts.length;
532
552
  let u = 0;
533
- s.forEach((d) => {
534
- var H;
535
- const b = d.querySelector(C), $ = ((H = b == null ? void 0 : b.querySelectorAll(`.${at}`)) == null ? void 0 : H.length) || 1, B = (100 / $).toFixed(2), { bgStyle: j, bgAttr: W } = this._extractSegmentBgFromCard(d), O = l > 0 ? Math.min($, l - u) : $, K = o.map((k) => {
536
- if (k === e) {
537
- const z = Array.from(
553
+ s.forEach((m) => {
554
+ var k;
555
+ const b = m.querySelector(A), I = ((k = b == null ? void 0 : b.querySelectorAll(`.${at}`)) == null ? void 0 : k.length) || 1, U = (100 / I).toFixed(2), { bgStyle: W, bgAttr: K } = this._extractSegmentBgFromCard(m), O = l > 0 ? Math.min(I, l - u) : I, z = o.map((q) => {
556
+ if (q === e) {
557
+ const G = Array.from(
538
558
  { length: O },
539
- (At, Y) => {
540
- const X = this._resolveAttributeContent(
559
+ (At, X) => {
560
+ const J = this._resolveAttributeContent(
541
561
  t,
542
562
  r,
543
- u + Y
563
+ u + X
544
564
  );
545
565
  return this._getGridCellHtml(
546
566
  t,
547
- X,
548
- B,
549
- j,
567
+ J,
568
+ U,
550
569
  W,
551
- a
570
+ K,
571
+ c
552
572
  );
553
573
  }
554
- ).join(""), G = dt(B, a).repeat($ - O);
555
- return `<tr class="recommendation-attribute-row" ${y}="${e}" ${v}="1">${z}${G}</tr>`;
574
+ ).join(""), Y = dt(U, c).repeat(I - O);
575
+ return `<tr class="recommendation-attribute-row" ${y}="${e}" ${N}="1">${G}${Y}</tr>`;
556
576
  }
557
- const N = d.querySelector(
558
- `${C}[${y}="${k}"]`
577
+ const D = m.querySelector(
578
+ `${A}[${y}="${q}"]`
559
579
  );
560
- return N && "getOuterHTML" in N ? N.getOuterHTML() : "";
580
+ return D && "getOuterHTML" in D ? D.getOuterHTML() : "";
561
581
  }).join("");
562
- u += O, l > 0 && u >= l && (u = 0), c.modifyHtml(d).setInnerHtml(K);
563
- }), c.apply(new A(`${this.api.translate("Add custom attribute")}: ${r}`));
582
+ u += O, l > 0 && u >= l && (u = 0), a.modifyHtml(m).setInnerHtml(z);
583
+ }), a.apply(new C(`${this.api.translate("Add custom attribute")}: ${r}`));
564
584
  }
565
585
  _injectListAttributeRow(t, r, e, o) {
566
- const s = this.currentNode.querySelectorAll(M);
586
+ const s = this.currentNode.querySelectorAll(V);
567
587
  if (!(s != null && s.length))
568
588
  return;
569
- const i = o.filter((a) => a !== D && a !== U), n = this.api.getDocumentModifier();
570
- s.forEach((a, c) => {
589
+ const i = o.filter((c) => c !== B && c !== H), n = this.api.getDocumentModifier();
590
+ s.forEach((c, a) => {
571
591
  const l = i.map((u) => {
572
592
  if (u === e) {
573
- const b = this._resolveAttributeContent(t, r, c);
593
+ const b = this._resolveAttributeContent(t, r, a);
574
594
  return this._getListRowHtml(t, b, e);
575
595
  }
576
- const d = a.querySelector(
577
- `${C}[${y}="${u}"]`
596
+ const m = c.querySelector(
597
+ `${A}[${y}="${u}"]`
578
598
  );
579
- return d && "getOuterHTML" in d ? d.getOuterHTML() : "";
599
+ return m && "getOuterHTML" in m ? m.getOuterHTML() : "";
580
600
  }).join("");
581
- n.modifyHtml(a).setInnerHtml(l);
582
- }), n.apply(new A(`${this.api.translate("Add custom attribute")}: ${r}`));
601
+ n.modifyHtml(c).setInnerHtml(l);
602
+ }), n.apply(new C(`${this.api.translate("Add custom attribute")}: ${r}`));
583
603
  }
584
604
  /**
585
605
  * Removes a custom attribute by rebuilding product card content without it.
@@ -596,13 +616,13 @@ class Ut extends Z {
596
616
  e.modifyHtml(s).setInnerHtml(i);
597
617
  });
598
618
  } else {
599
- const o = t.filter((i) => i !== D && i !== U), s = this.currentNode.querySelectorAll(M);
619
+ const o = t.filter((i) => i !== B && i !== H), s = this.currentNode.querySelectorAll(V);
600
620
  s == null || s.forEach((i) => {
601
621
  const n = this._buildCompositionHtml(i, o);
602
622
  e.modifyHtml(i).setInnerHtml(n);
603
623
  });
604
624
  }
605
- e.apply(new A(this.api.translate("Remove custom attribute")));
625
+ e.apply(new C(this.api.translate("Remove custom attribute")));
606
626
  }
607
627
  // ========================================================================
608
628
  // DOM Mutation (Block Root Attributes, Reorder)
@@ -615,7 +635,13 @@ class Ut extends Z {
615
635
  * producing a flicker on the custom attribute dropdowns.
616
636
  */
617
637
  _updateBothAttributes(t, r) {
618
- this.currentNode && this.api.getDocumentModifier().modifyHtml(this.currentNode).setAttribute(V, t.join(",")).setAttribute(q, JSON.stringify(r)).apply(new A(this.api.translate("Update card composition")));
638
+ if (!this.currentNode)
639
+ return;
640
+ const e = {
641
+ ...$.getConfig(this.currentNode),
642
+ composition: t
643
+ };
644
+ this.api.getDocumentModifier().modifyHtml(this.currentNode).setAttribute(x, t.join(",")).setAttribute(F, JSON.stringify(r)).setNodeConfig(e).apply(new C(this.api.translate("Update card composition")));
619
645
  }
620
646
  /**
621
647
  * Reorders attribute rows within each product card based on composition order.
@@ -631,7 +657,7 @@ class Ut extends Z {
631
657
  r.forEach((o) => {
632
658
  const s = this._buildCompositionHtml(o, t);
633
659
  e.modifyHtml(o).setInnerHtml(s);
634
- }), e.apply(new A(this.api.translate("Reorder product attributes")));
660
+ }), e.apply(new C(this.api.translate("Reorder product attributes")));
635
661
  }
636
662
  /**
637
663
  * Builds HTML string with attributes ordered according to composition.
@@ -639,7 +665,7 @@ class Ut extends Z {
639
665
  */
640
666
  _buildCompositionHtml(t, r) {
641
667
  return r.reduce((e, o) => {
642
- const s = t.querySelector(`${C}[${y}="${o}"]`);
668
+ const s = t.querySelector(`${A}[${y}="${o}"]`);
643
669
  return s && "getOuterHTML" in s ? e + s.getOuterHTML() : e;
644
670
  }, "");
645
671
  }
@@ -649,14 +675,19 @@ class Ut extends Z {
649
675
  _applyVisibilityToBlock(t, r) {
650
676
  if (!this.currentNode)
651
677
  return;
652
- const e = this.currentNode.querySelectorAll(`${C}[${y}="${t}"]`);
678
+ const e = this.currentNode.querySelectorAll(`${A}[${y}="${t}"]`);
653
679
  if (!(e != null && e.length))
654
680
  return;
655
681
  const o = r ? "1" : "0", s = r ? this.api.translate("visible") : this.api.translate("hidden"), i = `${this.api.translate("Set visibility")}: ${t} → ${s}`, n = this.api.getDocumentModifier();
656
682
  e.forEach((a) => {
657
- const c = ft(a), l = r ? c : "none";
658
- n.modifyHtml(a).setStyle("display", l).setAttribute(v, o);
659
- }), n.apply(new A(i));
683
+ const l = ft(a), u = r ? l : "none";
684
+ n.modifyHtml(a).setStyle("display", u).setAttribute(N, o);
685
+ });
686
+ const c = {
687
+ ...$.getConfig(this.currentNode),
688
+ visibility: { ...this._readVisibilityFromRows(), [t]: r }
689
+ };
690
+ n.modifyHtml(this.currentNode).setNodeConfig(c), n.apply(new C(i));
660
691
  }
661
692
  // ========================================================================
662
693
  // Utilities
@@ -669,7 +700,7 @@ class Ut extends Z {
669
700
  _findNthCustomKeyIndex(t, r) {
670
701
  let e = 0;
671
702
  for (let o = 0; o < t.length; o++)
672
- if (t[o].startsWith(m)) {
703
+ if (t[o].startsWith(d)) {
673
704
  if (e === r)
674
705
  return o;
675
706
  e++;
@@ -677,7 +708,7 @@ class Ut extends Z {
677
708
  return -1;
678
709
  }
679
710
  _getCurrentLayout() {
680
- return this.store.recommendationConfigs.orientation || gt(this.currentNode);
711
+ return this.store.recommendationConfigs.orientation || bt(this.currentNode);
681
712
  }
682
713
  /**
683
714
  * Extracts background color properties from existing card elements.
@@ -728,10 +759,10 @@ class Ut extends Z {
728
759
  * or when all available filters have already been added (no unused attributes left).
729
760
  */
730
761
  _updateAddButtonState() {
731
- const t = this._readCustomAttributesFromNode(), r = t.length >= g, e = new Set(t), o = this._getAddableFilters(), s = o.length > 0 && o.every((i) => e.has(i.attributeName));
762
+ const t = this._readCustomAttributesFromNode(), r = t.length >= _, e = new Set(t), o = this._getAddableFilters(), s = o.length > 0 && o.every((i) => e.has(i.attributeName));
732
763
  this.api.setUIEAttribute(
733
- x.ADD_ATTRIBUTE,
734
- I.BUTTON.disabled,
764
+ j.ADD_ATTRIBUTE,
765
+ v.BUTTON.disabled,
735
766
  r || s ? "true" : "false"
736
767
  );
737
768
  }
@@ -754,7 +785,7 @@ class Ut extends Z {
754
785
  * excluding default attributes already covered by built-in toggle items.
755
786
  */
756
787
  _getAddableFilters() {
757
- return Object.values(this.store.filterList).filter((t) => !(t.type === "defaultAttribute" && it.has(t.attributeName)));
788
+ return Object.values(this.store.filterList).filter((t) => !(t.type === "defaultAttribute" && nt.has(t.attributeName)));
758
789
  }
759
790
  /**
760
791
  * Looks up the display name for an attribute from the store's filterList.
@@ -771,28 +802,28 @@ class Ut extends Z {
771
802
  _resolveAttributeContent(t, r, e) {
772
803
  var n;
773
804
  const s = this.store.recommendationProducts[e], i = pt(t, this.store.filterList) ? s == null ? void 0 : s[t] : (n = s == null ? void 0 : s.product_attributes) == null ? void 0 : n[t];
774
- return _t(i) ?? r;
805
+ return gt(i) ?? r;
775
806
  }
776
807
  _getGridCellHtml(t, r, e, o = "", s = "", i = "") {
777
- const n = `${m}${t}`, a = w(ct, [n], this.store.filterList), c = {
808
+ const n = `${d}${t}`, c = M(ct, [n], this.store.filterList), a = {
778
809
  [t]: r,
779
810
  product_attributes: { [t]: r }
780
811
  };
781
- let l = a[n](c);
812
+ let l = c[n](a);
782
813
  return l = l.replace("<td", `<td width="${e}%"`), i && (l = l.replace(
783
814
  `padding: ${ut}`,
784
815
  `padding: ${i}`
785
816
  )), o && (l = l.replace(/style="table-layout: fixed;"/, `style="table-layout: fixed; ${o}"`)), s && (l = l.replace(/border="0"/, `border="0" bgcolor="${s}"`)), l;
786
817
  }
787
818
  _getListRowHtml(t, r, e) {
788
- const o = w(mt, [e], this.store.filterList), s = {
819
+ const o = M(mt, [e], this.store.filterList), s = {
789
820
  [t]: r,
790
821
  product_attributes: { [t]: r }
791
822
  }, n = o[e](s).replace(/<tr>/, "").replace(/<\/tr>/, "");
792
- return `<tr class="recommendation-attribute-row" ${y}="${e}" ${v}="1">${n}</tr>`;
823
+ return `<tr class="recommendation-attribute-row" ${y}="${e}" ${N}="1">${n}</tr>`;
793
824
  }
794
825
  }
795
826
  export {
796
- bt as COMPOSITION_CONTROL_BLOCK_ID,
797
- Ut as RecommendationCardCompositionControl
827
+ yt as COMPOSITION_CONTROL_BLOCK_ID,
828
+ Ht as RecommendationCardCompositionControl
798
829
  };