@useinsider/guido 3.13.1 → 3.14.0-beta.1e474dd

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 (29) hide show
  1. package/dist/components/organisms/header/ViewOptions.vue.js +1 -1
  2. package/dist/components/organisms/header/version-history/ViewOptions.vue.js +1 -1
  3. package/dist/composables/useHtmlValidator.js +50 -50
  4. package/dist/config/i18n/en/labels.json.js +7 -3
  5. package/dist/config/migrator/recommendation/compositionMapper.js +26 -23
  6. package/dist/config/migrator/recommendation/htmlBuilder.js +156 -155
  7. package/dist/extensions/Blocks/Recommendation/constants/selectors.js +15 -13
  8. package/dist/extensions/Blocks/Recommendation/controls/cardComposition/index.js +346 -314
  9. package/dist/extensions/Blocks/Recommendation/controls/main/utils.js +44 -43
  10. package/dist/extensions/Blocks/Recommendation/templates/grid/template.js +16 -16
  11. package/dist/extensions/Blocks/Recommendation/templates/list/template.js +16 -16
  12. package/dist/extensions/Blocks/Recommendation/templates/utils.js +120 -120
  13. package/dist/extensions/Blocks/Recommendation/utils/captureStyleTemplates.js +55 -54
  14. package/dist/extensions/Blocks/Recommendation/utils/compositionKeys.js +89 -0
  15. package/dist/extensions/Blocks/common-control.js +42 -35
  16. package/dist/guido.css +1 -1
  17. package/dist/node_modules/@stripoinc/ui-editor-extensions/dist/esm/index.js +12 -12
  18. package/dist/package.json.js +1 -1
  19. package/dist/src/composables/useHtmlValidator.d.ts +3 -2
  20. package/dist/src/config/migrator/recommendation/types.d.ts +1 -0
  21. package/dist/src/extensions/Blocks/Recommendation/constants/index.d.ts +1 -1
  22. package/dist/src/extensions/Blocks/Recommendation/constants/selectors.d.ts +4 -0
  23. package/dist/src/extensions/Blocks/Recommendation/controls/cardComposition/index.d.ts +22 -5
  24. package/dist/src/extensions/Blocks/Recommendation/templates/utils.d.ts +12 -11
  25. package/dist/src/extensions/Blocks/Recommendation/utils/compositionKeys.d.ts +52 -0
  26. package/dist/src/extensions/Blocks/common-control.d.ts +3 -1
  27. package/dist/static/styles/components/wide-panel.css.js +7 -0
  28. package/dist/static/styles/customEditorStyle.css.js +8 -0
  29. package/package.json +4 -4
@@ -0,0 +1,89 @@
1
+ import { ATTR_CUSTOM_PREFIX as i, ATTR_PRODUCT_ATTR as c, PRODUCT_ATTRIBUTE_PREFIX as l, ATTR_DATA_ATTRIBUTE_TYPE as f, SELECTOR_ATTRIBUTE_ROW as R } from "../constants/selectors.js";
2
+ function d(t) {
3
+ return !t.startsWith(l);
4
+ }
5
+ function y(t) {
6
+ return t.startsWith(l) ? t.substring(l.length) : t;
7
+ }
8
+ function T(t) {
9
+ return t.startsWith(i) ? t.substring(i.length) : t;
10
+ }
11
+ function A(t) {
12
+ return `${i}${t}`;
13
+ }
14
+ function P(t) {
15
+ return t.type === "defaultAttribute" ? t.attributeName : `${l}${t.attributeName}`;
16
+ }
17
+ function _(t, r) {
18
+ const n = Object.values(r).filter((e) => e.attributeName === t);
19
+ return n.find((e) => e.type === "defaultAttribute") ?? n[0];
20
+ }
21
+ function o(t, r) {
22
+ return t && "getAttribute" in t ? t.getAttribute(r) : null;
23
+ }
24
+ function m(t, r, n = {}) {
25
+ const e = `${i}${t}`, u = r == null ? void 0 : r.querySelector(
26
+ `${R}[${f}="${e}"]`
27
+ ), a = o(u, c) ?? o(u == null ? void 0 : u.querySelector(`[${c}]`), c);
28
+ if (a)
29
+ return a;
30
+ const s = _(t, n);
31
+ return s ? P(s) : t;
32
+ }
33
+ function g(t, r, n = {}) {
34
+ return t.startsWith(l) ? t : m(t, r, n);
35
+ }
36
+ function C(t, r, n = {}) {
37
+ return t.map((e) => {
38
+ if (!e.startsWith(i))
39
+ return e;
40
+ const u = T(e);
41
+ return A(g(u, r, n));
42
+ });
43
+ }
44
+ function E(t, r, n = {}) {
45
+ return t.map((e) => g(e, r, n));
46
+ }
47
+ function S(t) {
48
+ const r = o(t, f);
49
+ if (!(r != null && r.startsWith(i)))
50
+ return r;
51
+ const n = "querySelector" in t ? t.querySelector(`[${c}]`) : void 0, e = o(n, c);
52
+ return e ? A(e) : r;
53
+ }
54
+ function $(t, r) {
55
+ const n = o(t, c), e = o(t.querySelector(`[${c}]`), c), u = n ?? e;
56
+ return u === null || u === r;
57
+ }
58
+ function W(t, r) {
59
+ const n = (h) => t.querySelector(
60
+ `${R}[${f}="${h}"]`
61
+ );
62
+ if (!r.startsWith(i))
63
+ return n(r) ?? null;
64
+ const e = T(r), u = n(r);
65
+ if (u && $(u, e))
66
+ return u;
67
+ const a = A(y(e)), s = a === r ? void 0 : n(a);
68
+ return s && $(s, e) ? s : null;
69
+ }
70
+ function q(t, r) {
71
+ const n = T(r), e = A(y(n));
72
+ return e === r ? t : t.replace(
73
+ `${f}="${e}"`,
74
+ `${f}="${r}"`
75
+ );
76
+ }
77
+ export {
78
+ y as bareAttributeName,
79
+ T as compositionKeyToProductAttr,
80
+ P as filterToProductAttrValue,
81
+ W as findAttributeRow,
82
+ _ as findFilterByBareName,
83
+ d as isDefaultProductAttr,
84
+ C as normalizeCompositionKeys,
85
+ E as normalizeCustomAttrValues,
86
+ A as productAttrToCompositionKey,
87
+ S as resolveRowCompositionKey,
88
+ q as rewriteLegacyRowKeyHtml
89
+ };
@@ -47,15 +47,15 @@ class d extends I {
47
47
  const t = this.getBlockInstanceId();
48
48
  if (!t)
49
49
  return !1;
50
- const o = t !== this.lastBlockInstanceId;
51
- return e(), o && (this.lastBlockInstanceId = t), o;
50
+ const E = t !== this.lastBlockInstanceId;
51
+ return e(), E && (this.lastBlockInstanceId = t), E;
52
52
  }
53
- _GuLabel({ text: e, name: t = "", hint: o }) {
53
+ _GuLabel({ text: e, name: t = "", hint: E }) {
54
54
  return `
55
55
  <${n.LABEL}
56
56
  ${$.LABEL.text}="${e}"
57
57
  ${$.LABEL.name}="${t || `${e} Label`}"
58
- ${o ? `${$.LABEL.hint}="${o}"` : ""}>
58
+ ${E ? `${$.LABEL.hint}="${E}"` : ""}>
59
59
  </${n.LABEL}>
60
60
  `;
61
61
  }
@@ -73,7 +73,7 @@ class d extends I {
73
73
  * Use in getTemplate() — the icon is registered in a hidden store so Stripo initializes it.
74
74
  * Pair with _setInfoMessageValue() in onRender() to set the text content.
75
75
  */
76
- _GuOnPageMessage({ name: e, icon: t = "not-found", type: o = "info" }) {
76
+ _GuOnPageMessage({ name: e, icon: t = "not-found", type: E = "info" }) {
77
77
  return `
78
78
  <div data-info-message="${e}" style="display: none; padding: 16px 16px 0;">
79
79
  <div class="icon-store" style="display: none;">
@@ -81,7 +81,7 @@ class d extends I {
81
81
  ${this._GuIcon({ src: t, className: "icon" })}
82
82
  </div>
83
83
  </div>
84
- ${this._GuMessage({ name: e, type: o })}
84
+ ${this._GuMessage({ name: e, type: E })}
85
85
  </div>
86
86
  `;
87
87
  }
@@ -91,7 +91,7 @@ class d extends I {
91
91
  * and combines it with the text in Stripo's alert-message layout.
92
92
  */
93
93
  _setInfoMessageValue(e, t) {
94
- const o = this.getContainer(), E = o.querySelector(`[data-icon-key="${e}"]`), a = E == null ? void 0 : E.querySelector("ue-icon-component"), l = (a == null ? void 0 : a.outerHTML) ?? "";
94
+ const E = this.getContainer(), o = E.querySelector(`[data-icon-key="${e}"]`), a = o == null ? void 0 : o.querySelector("ue-icon-component"), l = (a == null ? void 0 : a.outerHTML) ?? "";
95
95
  this.api.setUIEAttribute(
96
96
  e,
97
97
  "value",
@@ -104,7 +104,7 @@ class d extends I {
104
104
  </div>
105
105
  `
106
106
  );
107
- const T = o.querySelector(`[data-info-message="${e}"]`);
107
+ const T = E.querySelector(`[data-info-message="${e}"]`);
108
108
  T && (T.style.display = "");
109
109
  }
110
110
  _GuToggle(e) {
@@ -121,59 +121,66 @@ class d extends I {
121
121
  ${$.SELECT_ITEM.value}="${t}">
122
122
  </${n.SELECT_ITEM}>`;
123
123
  }
124
- _GuSelect({ name: e, placeholder: t, options: o, className: E = "es-180w" }) {
124
+ _GuSelect({
125
+ name: e,
126
+ placeholder: t,
127
+ options: E,
128
+ className: o = "es-180w",
129
+ searchable: a = !1
130
+ }) {
125
131
  return `
126
132
  <${n.SELECTPICKER}
127
- class="${E}"
133
+ class="${o}"
128
134
  ${$.SELECTPICKER.name}="${e}"
135
+ ${a ? `${$.SELECTPICKER.searchable}="true"` : ""}
129
136
  ${$.SELECTPICKER.placeholder}="${t}">
130
- ${o.map((a) => this._GuSelectItem(a)).join("")}
137
+ ${E.map((l) => this._GuSelectItem(l)).join("")}
131
138
  </${n.SELECTPICKER}>
132
139
  `;
133
140
  }
134
- _GuTextInput({ name: e, placeholder: t, className: o = "", disabled: E = !1 }) {
141
+ _GuTextInput({ name: e, placeholder: t, className: E = "", disabled: o = !1 }) {
135
142
  return `
136
143
  <${n.TEXT}
137
- class=${o}
144
+ class=${E}
138
145
  ${$.TEXT.name}="${e}"
139
146
  placeholder="${t || e}"
140
- ${E ? `${$.TEXT.disabled}="true"` : ""}>
147
+ ${o ? `${$.TEXT.disabled}="true"` : ""}>
141
148
  </${n.TEXT}>
142
149
  `;
143
150
  }
144
- _GuCounter({ name: e, maxValue: t, minValue: o = 1, step: E = 1 }) {
151
+ _GuCounter({ name: e, maxValue: t, minValue: E = 1, step: o = 1 }) {
145
152
  return `
146
153
  <${n.COUNTER}
147
154
  ${$.COUNTER.name}="${e}"
148
- ${$.COUNTER.minValue}="${o}"
155
+ ${$.COUNTER.minValue}="${E}"
149
156
  ${$.COUNTER.maxValue}="${t}"
150
- ${$.COUNTER.step}="${E}">
157
+ ${$.COUNTER.step}="${o}">
151
158
  </${n.COUNTER}>
152
159
  `;
153
160
  }
154
- _GuRadioButtonItem({ text: e, value: t, icon: o }) {
161
+ _GuRadioButtonItem({ text: e, value: t, icon: E }) {
155
162
  return `
156
163
  <${n.RADIO_ITEM}
157
164
  ${$.RADIO_ITEM.value}="${t}"
158
165
  ${e ? `${$.RADIO_ITEM.text}="${e}"` : ""}
159
- ${o ? `${$.RADIO_ITEM.icon}="${o}"` : ""}>
166
+ ${E ? `${$.RADIO_ITEM.icon}="${E}"` : ""}>
160
167
  </${n.RADIO_ITEM}>
161
168
  `;
162
169
  }
163
- _GuRadioButton({ name: e, buttons: t, id: o = "" }) {
170
+ _GuRadioButton({ name: e, buttons: t, id: E = "" }) {
164
171
  return `
165
172
  <${n.RADIO_BUTTONS}
166
- ${o ? `id="${o}"` : ""}
173
+ ${E ? `id="${E}"` : ""}
167
174
  ${$.RADIO_BUTTONS.name}="${e}">
168
- ${t.map((E) => this._GuRadioButtonItem(E)).join("")}
175
+ ${t.map((o) => this._GuRadioButtonItem(o)).join("")}
169
176
  </${n.RADIO_BUTTONS}>
170
177
  `;
171
178
  }
172
- _GuButton({ name: e, label: t, id: o = "" }) {
179
+ _GuButton({ name: e, label: t, id: E = "" }) {
173
180
  return `
174
181
  <${n.BUTTON}
175
182
  ${$.BUTTON.name}="${e}"
176
- ${o ? `id="${o}"` : ""}
183
+ ${E ? `id="${E}"` : ""}
177
184
  ${$.BUTTON.caption}="${t}"}>
178
185
  </${n.BUTTON}>
179
186
  `;
@@ -191,10 +198,10 @@ class d extends I {
191
198
  * @param param0
192
199
  * @returns It returns a button with an icon.
193
200
  */
194
- _GuIconButton({ name: e, icon: t, className: o = "" }) {
201
+ _GuIconButton({ name: e, icon: t, className: E = "" }) {
195
202
  return `
196
203
  <${n.BUTTON}
197
- class="${o}"
204
+ class="${E}"
198
205
  ${$.BUTTON.name}="${e}"
199
206
  ${$.BUTTON.icon}="${t}">
200
207
  </${n.BUTTON}>
@@ -222,19 +229,19 @@ class d extends I {
222
229
  * @returns HTML string for the orderable control
223
230
  */
224
231
  _GuOrderable(e, t) {
225
- let o = "";
232
+ let E = "";
226
233
  t.forEach((a) => {
227
234
  const l = $.ORDERABLE_ITEM && "name" in $.ORDERABLE_ITEM ? $.ORDERABLE_ITEM.name : "name";
228
- o += `
235
+ E += `
229
236
  <${n.ORDERABLE_ITEM} ${l}="${a.key}">
230
237
  ${a.content}
231
238
  </${n.ORDERABLE_ITEM}>
232
239
  `;
233
240
  });
234
- const E = $.ORDERABLE && "name" in $.ORDERABLE ? $.ORDERABLE.name : "name";
241
+ const o = $.ORDERABLE && "name" in $.ORDERABLE ? $.ORDERABLE.name : "name";
235
242
  return `
236
- <${n.ORDERABLE} ${E}="${e}">
237
- ${o}
243
+ <${n.ORDERABLE} ${o}="${e}">
244
+ ${E}
238
245
  </${n.ORDERABLE}>
239
246
  `;
240
247
  }
@@ -275,16 +282,16 @@ class d extends I {
275
282
  `;
276
283
  }
277
284
  _GuRadioButtons(e, t) {
278
- const o = t.map((E) => `
285
+ const E = t.map((o) => `
279
286
  <${n.RADIO_ITEM}
280
- ${$.RADIO_ITEM.text}="${E.text}"
281
- ${$.RADIO_ITEM.value}="${E.value}">
287
+ ${$.RADIO_ITEM.text}="${o.text}"
288
+ ${$.RADIO_ITEM.value}="${o.value}">
282
289
  </${n.RADIO_ITEM}>
283
290
  `).join("");
284
291
  return `
285
292
  <${n.RADIO_BUTTONS}
286
293
  ${$.RADIO_BUTTONS.name}="${e}">
287
- ${o}
294
+ ${E}
288
295
  </${n.RADIO_BUTTONS}>
289
296
  `;
290
297
  }
package/dist/guido.css CHANGED
@@ -1 +1 @@
1
- .gap-16[data-v-5553d071],.gap-16[data-v-0e1b0c54]{gap:16px}[data-v-73199fa4] .in-button-v2__wrapper{line-height:0}[data-v-22226124] .in-segments-wrapper__button_selected,[data-v-22226124] .in-segments-wrapper__button_selected:hover{background-color:#dae1fb;color:#0010ac;border-color:#0010ac}[data-v-2cb418af] .in-progress-wrapper__progress p span:last-child{display:none!important}[data-v-2cb418af] .in-progress-description-status{display:none!important}.view-options-wrapper[data-v-195ab6d4]{position:relative;display:inline-block}.new-tag[data-v-195ab6d4]{position:absolute;top:-8px;right:-16px;z-index:10}[data-v-195ab6d4] .guido__view-option-selection-desktop svg,[data-v-195ab6d4] .guido__view-option-selection-mobile svg{margin:0 0 0 2px}[data-v-195ab6d4] .in-segments-wrapper__button_selected,[data-v-195ab6d4] .in-segments-wrapper__button_selected:hover{background-color:#dae1fb}[data-v-195ab6d4] .in-tooltip-wrapper__icon{cursor:pointer}.editor-toolbar[data-v-173c3a40]{gap:4px}.version-history-item[data-v-ee4b9c3f]{flex-basis:200px}.version-history[data-v-fad98586]{gap:8px}.version-history__toolbar[data-v-fad98586]{gap:4px}.view-options-wrapper[data-v-d405ca59]{position:relative;display:inline-block}.new-tag[data-v-d405ca59]{position:absolute;top:-8px;right:-16px;z-index:10}[data-v-d405ca59] .guido__verion-history-view-option-selection-desktop svg,[data-v-d405ca59] .guido__verion-history-view-option-selection-mobile svg{margin:0 0 0 2px}[data-v-d405ca59] .in-segments-wrapper__button_selected,[data-v-d405ca59] .in-segments-wrapper__button_selected:hover{background-color:#dae1fb}[data-v-d405ca59] .in-tooltip-wrapper__icon{cursor:pointer}.auto-save-toggle[data-v-2c964af4]{position:relative}.auto-save-toggle__info-box[data-v-2c964af4]{position:absolute;top:100%;left:0;z-index:10;width:280px}.editor-actions[data-v-6e711fd7]{gap:4px}.header-wrapper[data-v-d11dd577]{min-width:1000px}.guido-loading__wrapper[data-v-07c4b2d8]{height:100%;top:75px!important;bottom:0!important}.guido-editor__wrapper[data-v-5079a1c8]{--ribbon-offset: 0px;position:relative;width:100%;height:calc(100vh - 128px - var(--ribbon-offset))}.guido-editor__container[data-v-5079a1c8]{width:100%;height:calc(100vh - 128px - var(--ribbon-offset))}.guido-editor__no-header[data-v-5079a1c8]{height:calc(100vh - 75px - var(--ribbon-offset))}[data-v-293f1c47] .in-breadcrumb-wrapper__links{cursor:pointer}.templates-wrapper[data-v-91a26acd]{gap:16px;grid-template-columns:repeat(3,1fr)}.templates-wrapper .template-wrapper[data-v-91a26acd]{cursor:pointer}.templates-wrapper .template-wrapper .template-container[data-v-91a26acd]{height:274px;padding:2px;transition:none}.templates-wrapper .template-wrapper .template-container.selected[data-v-91a26acd]{padding:1px}.templates-wrapper .template-wrapper .template-container .thumbnail[data-v-91a26acd]{object-fit:cover;transform:scale(1)}[data-v-b9a93c6e] .guido__verion-history-view-option-selection-desktop svg,[data-v-b9a93c6e] .guido__verion-history-view-option-selection-mobile svg{margin:0 0 0 2px}[data-v-b9a93c6e] .in-segments-wrapper__button_selected,[data-v-b9a93c6e] .in-segments-wrapper__button_selected:hover{background-color:#dae1fb}.error-list[data-v-c3fd5d4b]{gap:16px}.desktop-browser-header[data-v-d86c5af5]{height:79px;min-height:79px}.desktop-browser-header__left[data-v-d86c5af5]{-webkit-user-drag:none;height:79px;width:378px}.desktop-browser-header__center[data-v-d86c5af5]{height:79px;background-repeat:repeat-x;background-size:auto 100%;background-position:left top}.desktop-browser-header__right[data-v-d86c5af5]{-webkit-user-drag:none;height:79px;width:112px}.desktop-preview[data-v-cf946232]{min-width:602px;height:70vh;min-height:583px;border-radius:10px}.desktop-preview iframe[data-v-cf946232]{min-height:504px}.iframe-wrapper[data-v-f255b2bb]{width:258px}.iframe-scaled[data-v-f255b2bb]{width:320px;height:124.0310077519%;transform:scale(.80625);transform-origin:top left}.cropped-text[data-v-eb3d05d7]{width:220px;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.mobile-preview-wrapper__phone[data-v-3f472f96]{width:282px}.mobile-preview-wrapper__phone img[data-v-3f472f96]{object-fit:cover;border-radius:44px}.mobile-preview-wrapper__content[data-v-3f472f96]{width:258px;height:450px;left:12px}[data-v-6bcaca8a] .vueperslides__parallax-wrapper{padding-bottom:110px!important}[data-v-f16f20f8] .vueperslides__bullets{pointer-events:none!important}[data-v-f16f20f8] .vueperslides__parallax-wrapper{padding-bottom:110px!important}[data-v-bb3cca55] .vueperslides__bullets{pointer-events:none!important}[data-v-bb3cca55] .vueperslides__parallax-wrapper{height:110px!important;padding-bottom:110px!important}[data-v-b09e80c4] .vueperslides__bullets{pointer-events:none!important}[data-v-b09e80c4] .vueperslides__parallax-wrapper{height:110px!important;padding-bottom:110px!important}[data-v-9bdef600] .vueperslides__parallax-wrapper{padding-bottom:110px!important}
1
+ .gap-16[data-v-5553d071],.gap-16[data-v-0e1b0c54]{gap:16px}[data-v-73199fa4] .in-button-v2__wrapper{line-height:0}[data-v-22226124] .in-segments-wrapper__button_selected,[data-v-22226124] .in-segments-wrapper__button_selected:hover{background-color:#dae1fb;color:#0010ac;border-color:#0010ac}[data-v-2cb418af] .in-progress-wrapper__progress p span:last-child{display:none!important}[data-v-2cb418af] .in-progress-description-status{display:none!important}.view-options-wrapper[data-v-87033101]{position:relative;display:inline-block}.new-tag[data-v-87033101]{position:absolute;top:-8px;right:-16px;z-index:10}[data-v-87033101] .guido__view-option-selection-desktop svg,[data-v-87033101] .guido__view-option-selection-mobile svg{margin:0 0 0 2px}[data-v-87033101] .in-segments-wrapper__button_selected,[data-v-87033101] .in-segments-wrapper__button_selected:hover{background-color:#dae1fb}[data-v-87033101] .in-tooltip-wrapper-v2__icon{cursor:pointer}.editor-toolbar[data-v-173c3a40]{gap:4px}.version-history-item[data-v-ee4b9c3f]{flex-basis:200px}.version-history[data-v-fad98586]{gap:8px}.version-history__toolbar[data-v-fad98586]{gap:4px}.view-options-wrapper[data-v-6ebabfe4]{position:relative;display:inline-block}.new-tag[data-v-6ebabfe4]{position:absolute;top:-8px;right:-16px;z-index:10}[data-v-6ebabfe4] .guido__verion-history-view-option-selection-desktop svg,[data-v-6ebabfe4] .guido__verion-history-view-option-selection-mobile svg{margin:0 0 0 2px}[data-v-6ebabfe4] .in-segments-wrapper__button_selected,[data-v-6ebabfe4] .in-segments-wrapper__button_selected:hover{background-color:#dae1fb}[data-v-6ebabfe4] .in-tooltip-wrapper-v2__icon{cursor:pointer}.auto-save-toggle[data-v-2c964af4]{position:relative}.auto-save-toggle__info-box[data-v-2c964af4]{position:absolute;top:100%;left:0;z-index:10;width:280px}.editor-actions[data-v-6e711fd7]{gap:4px}.header-wrapper[data-v-d11dd577]{min-width:1000px}.guido-loading__wrapper[data-v-07c4b2d8]{height:100%;top:75px!important;bottom:0!important}.guido-editor__wrapper[data-v-5079a1c8]{--ribbon-offset: 0px;position:relative;width:100%;height:calc(100vh - 128px - var(--ribbon-offset))}.guido-editor__container[data-v-5079a1c8]{width:100%;height:calc(100vh - 128px - var(--ribbon-offset))}.guido-editor__no-header[data-v-5079a1c8]{height:calc(100vh - 75px - var(--ribbon-offset))}[data-v-293f1c47] .in-breadcrumb-wrapper__links{cursor:pointer}.templates-wrapper[data-v-91a26acd]{gap:16px;grid-template-columns:repeat(3,1fr)}.templates-wrapper .template-wrapper[data-v-91a26acd]{cursor:pointer}.templates-wrapper .template-wrapper .template-container[data-v-91a26acd]{height:274px;padding:2px;transition:none}.templates-wrapper .template-wrapper .template-container.selected[data-v-91a26acd]{padding:1px}.templates-wrapper .template-wrapper .template-container .thumbnail[data-v-91a26acd]{object-fit:cover;transform:scale(1)}[data-v-b9a93c6e] .guido__verion-history-view-option-selection-desktop svg,[data-v-b9a93c6e] .guido__verion-history-view-option-selection-mobile svg{margin:0 0 0 2px}[data-v-b9a93c6e] .in-segments-wrapper__button_selected,[data-v-b9a93c6e] .in-segments-wrapper__button_selected:hover{background-color:#dae1fb}.error-list[data-v-c3fd5d4b]{gap:16px}.desktop-browser-header[data-v-d86c5af5]{height:79px;min-height:79px}.desktop-browser-header__left[data-v-d86c5af5]{-webkit-user-drag:none;height:79px;width:378px}.desktop-browser-header__center[data-v-d86c5af5]{height:79px;background-repeat:repeat-x;background-size:auto 100%;background-position:left top}.desktop-browser-header__right[data-v-d86c5af5]{-webkit-user-drag:none;height:79px;width:112px}.desktop-preview[data-v-cf946232]{min-width:602px;height:70vh;min-height:583px;border-radius:10px}.desktop-preview iframe[data-v-cf946232]{min-height:504px}.iframe-wrapper[data-v-f255b2bb]{width:258px}.iframe-scaled[data-v-f255b2bb]{width:320px;height:124.0310077519%;transform:scale(.80625);transform-origin:top left}.cropped-text[data-v-eb3d05d7]{width:220px;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.mobile-preview-wrapper__phone[data-v-3f472f96]{width:282px}.mobile-preview-wrapper__phone img[data-v-3f472f96]{object-fit:cover;border-radius:44px}.mobile-preview-wrapper__content[data-v-3f472f96]{width:258px;height:450px;left:12px}[data-v-6bcaca8a] .vueperslides__parallax-wrapper{padding-bottom:110px!important}[data-v-f16f20f8] .vueperslides__bullets{pointer-events:none!important}[data-v-f16f20f8] .vueperslides__parallax-wrapper{padding-bottom:110px!important}[data-v-bb3cca55] .vueperslides__bullets{pointer-events:none!important}[data-v-bb3cca55] .vueperslides__parallax-wrapper{height:110px!important;padding-bottom:110px!important}[data-v-b09e80c4] .vueperslides__bullets{pointer-events:none!important}[data-v-b09e80c4] .vueperslides__parallax-wrapper{height:110px!important;padding-bottom:110px!important}[data-v-9bdef600] .vueperslides__parallax-wrapper{padding-bottom:110px!important}
@@ -41,9 +41,9 @@ ${s.map((o) => ` - ${o}`).join(`
41
41
  };
42
42
  v.validatedClasses = /* @__PURE__ */ new Set();
43
43
  v.validationErrors = /* @__PURE__ */ new Map();
44
- var i = v, z = /* @__PURE__ */ ((e) => (e.BLOCK = "BLOCK", e.CONTAINER = "CONTAINER", e.STRUCTURE = "STRUCTURE", e.STRIPE = "STRIPE", e))(z || {}), P = class c extends i {
44
+ var i = v, z = /* @__PURE__ */ ((e) => (e.BLOCK = "BLOCK", e.CONTAINER = "CONTAINER", e.STRUCTURE = "STRUCTURE", e.STRIPE = "STRIPE", e))(z || {}), P = class T extends i {
45
45
  constructor() {
46
- super(c.REQUIRED_METHODS, c);
46
+ super(T.REQUIRED_METHODS, T);
47
47
  }
48
48
  /**
49
49
  * Determines if the block should be available for use in the editor.
@@ -222,9 +222,9 @@ var i = v, z = /* @__PURE__ */ ((e) => (e.BLOCK = "BLOCK", e.CONTAINER = "CONTAI
222
222
  }
223
223
  };
224
224
  P.REQUIRED_METHODS = ["getId", "getTemplate", "getIcon", "getName", "getDescription"];
225
- var qe = P, Z = class T extends i {
225
+ var qe = P, Z = class c extends i {
226
226
  constructor() {
227
- super(T.REQUIRED_METHODS, T);
227
+ super(c.REQUIRED_METHODS, c);
228
228
  }
229
229
  /**
230
230
  * @deprecated - use {@link getPreviewInnerHtml} instead
@@ -339,12 +339,12 @@ var j = {
339
339
  height: "height"
340
340
  }, Je = {
341
341
  BLOCK_IMAGE: j
342
- }, U = "esd-block-button", w = "esd-block-text", K = "esd-block-image", J = "esd-structure", ee = "esd-block-video", te = "esd-block-social", re = "esd-block-banner", ae = "esd-block-timer", ne = "esd-block-menu", se = "esd-block-html", ie = "esd-block-spacer", le = "esd-container-frame", Ee = "esd-stripe", oe = "esd-amp-form", I = ((e) => (e.BUTTON = `.${U}`, e.TEXT = `.${w}`, e.IMAGE = `.${K}`, e.STRUCTURE = `.${J}`, e.VIDEO = `.${ee}`, e.SOCIAL = `.${te}`, e.BANNER = `.${re}`, e.TIMER = `.${ae}`, e.MENU = `.${ne}`, e.HTML = `.${se}`, e.SPACER = `.${ie}`, e.CONTAINER = `.${le}`, e.STRIPE = `.${Ee}`, e.FORM = `.${oe}`, e))(I || {}), de = /* @__PURE__ */ ((e) => (e.BLOCK_IMAGE = "BLOCK_IMAGE", e.BLOCK_TEXT = "BLOCK_TEXT", e.BLOCK_BUTTON = "BLOCK_BUTTON", e.BLOCK_SPACER = "BLOCK_SPACER", e.BLOCK_VIDEO = "BLOCK_VIDEO", e.BLOCK_SOCIAL = "BLOCK_SOCIAL", e.BLOCK_BANNER = "BLOCK_BANNER", e.BLOCK_TIMER = "BLOCK_TIMER", e.BLOCK_MENU = "BLOCK_MENU", e.BLOCK_MENU_ITEM = "BLOCK_MENU_ITEM", e.BLOCK_HTML = "BLOCK_HTML", e.BLOCK_AMP_CAROUSEL = "BLOCK_AMP_CAROUSEL", e.BLOCK_AMP_ACCORDION = "BLOCK_AMP_ACCORDION", e.BLOCK_AMP_FORM = "BLOCK_AMP_FORM", e.CONTAINER = "CONTAINER", e.FORM_CONTAINER = "FORM_CONTAINER", e.STRUCTURE = "STRUCTURE", e.STRIPE = "STRIPE", e.EMPTY_CONTAINER = "EMPTY_CONTAINER", e.CUSTOM_BLOCK_LINK = "CUSTOM_BLOCK_LINK", e.CUSTOM_BLOCK_IMAGE = "CUSTOM_BLOCK_IMAGE", e.CUSTOM_BLOCK_TEXT = "CUSTOM_BLOCK_TEXT", e))(de || {}), F = /* @__PURE__ */ ((e) => (e.ANCHOR_LINK_CONTAINER = "anchorLinkFormContainer", e.APPLY_CONDITION = "applyCondition", e.APPLY_CONDITION_SWITCHER = "applyConditionSwitcher", e.BACKGROUND_COLOR = "backgroundColor", e.BACKGROUND_IMAGE = "generalImageContainer", e.TEXT_COLOR = "textColor", e.TEXT_STYLE = "textStyle", e.TEXT_SIZE = "textSize", e.TEXT_LINE_SPACING = "textLineSpacing", e.TEXT_ALIGN = "textAlign", e.FIXED_HEIGHT_SWITCHER = "fixedHeightSwitcherForm", e.HIDDEN_NODE = "hiddenNode", e.SMART_BLOCK = "smartBlock", e.SYNCHRONIZED_MODULE = "synchronizedModuleForm", e.FONT_FAMILY = "generalFontFamilyForm", e.BLOCK_INTERNAL_INDENTS = "generalBlockInternalIndents", e.STRUCTURE_INTERNAL_INDENTS = "generalStructureInternalIndents", e))(F || {}), H = /* @__PURE__ */ ((e) => (e.ADJUST_TO_WIDTH = "adjustToWidth", e.ALIGNMENT = "buttonAlignment", e.BORDER = "buttonBorder", e.BORDER_RADIUS = "buttonBorderRadius", e.COLOR = "buttonColor", e.BUTTON_BLOCK_BACKGROUND_COLOR = "buttonBlockBackgroundColor", e.EXTERNAL_INDENTS = "buttonExternalIndents", e.FIXED_HEIGHT = "buttonFixedHeightForm", e.FONT_COLOR = "buttonFontColor", e.FONT_FAMILY = "buttonFontFamily", e.FONT_SIZE = "buttonFontSize", e.ICON = "buttonIconContainer", e.ICON_ALIGN = "buttonIconAlign", e.ICON_INDENT = "buttonIconIndent", e.ICON_WIDTH = "buttonIconWidth", e.IMAGE = "buttonImageForm", e.INTERNAL_INDENTS = "buttonInternalIndents", e.LINK = "buttonLink", e.MIME_TYPE = "buttonMimeTypeForm", e.SWITCHER_HOVERED_STYLES = "buttonSwitcherHoveredStylesForm", e.TEXT = "buttonText", e.TEXT_STYLE_AND_COLOR = "buttonTextStyleAndColorForm", e.HOVERED_BORDER_COLOR = "hoveredStyleBorderButtonForm", e.HOVERED_COLOR = "hoveredButtonColorForm", e.HOVERED_TEXT_COLOR = "hoveredButtonTextColorForm", e))(H || {}), k = /* @__PURE__ */ ((e) => (e.HIDDEN_NODE = "hiddenNodeText", e.PARAGRAPH_STYLE = "paragraphStyleForm", e.ALIGN = "textAlignmentForm", e.ANCHOR_CONTAINER = "textAnchorForm", e.FONT_BACKGROUND_COLOR = "textBlockFontBackgroundColor", e.TEXT_BLOCK_BACKGROUND_COLOR = "textBlockBackgroundColor", e.FONT_COLOR = "textBlockFontColor", e.TEXT_BLOCK_FONT_FAMILY = "textBlockFontFamily", e.FONT_FAMILY = "textFontFamily", e.FONT_SIZE = "textBlockFontSize", e.FONT_WEIGHT = "textBlockFontWeight", e.DIRECTION = "textBlockDirectionForm", e.INSERT_FORM = "textBlockInsertForm", e.LINK_DATA = "textBlockLinkDataForm", e.FORMAT = "textBlockTextFormatForm", e.FIXED_HEIGHT = "textFixedHeightForm", e.INTERNAL_INDENTS = "textInternalIndents", e.LINE_HEIGHT = "textLineHeightForm", e.MIME_TYPE = "textMimeTypeForm", e.NO_LINE_WRAPS = "textNoLineWrapsForm", e))(k || {}), p = /* @__PURE__ */ ((e) => (e.ALT_TEXT = "altText", e.LINK = "blockLink", e.ALIGNMENT = "imageAlignment", e.ANCHOR_LINK_CONTAINER = "imageAnchorLinkContainerForm", e.BORDER_RADIUS = "imageBorderRadiusForm", e.IMAGE = "imageImageForm", e.EXTERNAL_INDENTS = "imageExternalIndents", e.MIME_TYPE = "imageMimeTypeForm", e.RESPONSIVE = "imageResponsive", e.ROLLOVER_IMAGE = "imageRolloverImageForm", e.ROLLOVER_SWITCHER = "imageRolloverSwitcherForm", e.SIZE = "imageSizeContainer", e))(p || {}), ue = /* @__PURE__ */ ((e) => (e.BACKGROUND_COLOR = "containerBackgroundColorForm", e.BORDER_FORM = "containerBorderForm", e.BORDER_RADIUS = "containerBorderRadiusForm", e.EXTERNAL_INDENTS = "containerExternalIndentsForm", e.IMAGE_CONTAINER = "containerImageContainerForm", e.MIME_TYPE = "containerMimeTypeForm", e.DISPLAY_CONDITIONS = "displayConditions", e.HIDDEN_NODE = "containerHiddenNodeForm", e))(ue || {}), n = {
342
+ }, U = "esd-block-button", w = "esd-block-text", K = "esd-block-image", J = "esd-structure", ee = "esd-block-video", te = "esd-block-social", re = "esd-block-banner", ae = "esd-block-timer", ne = "esd-block-menu", se = "esd-block-html", ie = "esd-block-spacer", le = "esd-container-frame", Ee = "esd-stripe", oe = "esd-amp-form", I = ((e) => (e.BUTTON = `.${U}`, e.TEXT = `.${w}`, e.IMAGE = `.${K}`, e.STRUCTURE = `.${J}`, e.VIDEO = `.${ee}`, e.SOCIAL = `.${te}`, e.BANNER = `.${re}`, e.TIMER = `.${ae}`, e.MENU = `.${ne}`, e.HTML = `.${se}`, e.SPACER = `.${ie}`, e.CONTAINER = `.${le}`, e.STRIPE = `.${Ee}`, e.FORM = `.${oe}`, e))(I || {}), de = /* @__PURE__ */ ((e) => (e.BLOCK_IMAGE = "BLOCK_IMAGE", e.BLOCK_TEXT = "BLOCK_TEXT", e.BLOCK_BUTTON = "BLOCK_BUTTON", e.BLOCK_SPACER = "BLOCK_SPACER", e.BLOCK_VIDEO = "BLOCK_VIDEO", e.BLOCK_SOCIAL = "BLOCK_SOCIAL", e.BLOCK_BANNER = "BLOCK_BANNER", e.BLOCK_TIMER = "BLOCK_TIMER", e.BLOCK_MENU = "BLOCK_MENU", e.BLOCK_MENU_ITEM = "BLOCK_MENU_ITEM", e.BLOCK_HTML = "BLOCK_HTML", e.BLOCK_AMP_CAROUSEL = "BLOCK_AMP_CAROUSEL", e.BLOCK_AMP_ACCORDION = "BLOCK_AMP_ACCORDION", e.BLOCK_AMP_FORM = "BLOCK_AMP_FORM", e.CONTAINER = "CONTAINER", e.FORM_CONTAINER = "FORM_CONTAINER", e.STRUCTURE = "STRUCTURE", e.STRIPE = "STRIPE", e.EMPTY_CONTAINER = "EMPTY_CONTAINER", e.CUSTOM_BLOCK_LINK = "CUSTOM_BLOCK_LINK", e.CUSTOM_BLOCK_IMAGE = "CUSTOM_BLOCK_IMAGE", e.CUSTOM_BLOCK_TEXT = "CUSTOM_BLOCK_TEXT", e))(de || {}), F = /* @__PURE__ */ ((e) => (e.ANCHOR_LINK_CONTAINER = "anchorLinkFormContainer", e.APPLY_CONDITION = "applyCondition", e.APPLY_CONDITION_SWITCHER = "applyConditionSwitcher", e.BACKGROUND_COLOR = "backgroundColor", e.BACKGROUND_IMAGE = "generalImageContainer", e.TEXT_COLOR = "textColor", e.TEXT_STYLE = "textStyle", e.TEXT_SIZE = "textSize", e.TEXT_LINE_SPACING = "textLineSpacing", e.TEXT_ALIGN = "textAlign", e.FIXED_HEIGHT_SWITCHER = "fixedHeightSwitcherForm", e.HIDDEN_NODE = "hiddenNode", e.SMART_BLOCK = "smartBlock", e.SYNCHRONIZED_MODULE = "synchronizedModuleForm", e.FONT_FAMILY = "generalFontFamilyForm", e.BLOCK_INTERNAL_INDENTS = "generalBlockInternalIndents", e.STRUCTURE_INTERNAL_INDENTS = "generalStructureInternalIndents", e))(F || {}), H = /* @__PURE__ */ ((e) => (e.ADJUST_TO_WIDTH = "adjustToWidth", e.ALIGNMENT = "buttonAlignment", e.BORDER = "buttonBorder", e.BORDER_RADIUS = "buttonBorderRadius", e.COLOR = "buttonColor", e.BUTTON_BLOCK_BACKGROUND_COLOR = "buttonBlockBackgroundColor", e.EXTERNAL_INDENTS = "buttonExternalIndents", e.FIXED_HEIGHT = "buttonFixedHeightForm", e.FONT_COLOR = "buttonFontColor", e.FONT_FAMILY = "buttonFontFamily", e.FONT_SIZE = "buttonFontSize", e.FONT_WEIGHT = "buttonFontWeight", e.ICON = "buttonIconContainer", e.ICON_ALIGN = "buttonIconAlign", e.ICON_INDENT = "buttonIconIndent", e.ICON_WIDTH = "buttonIconWidth", e.IMAGE = "buttonImageForm", e.INTERNAL_INDENTS = "buttonInternalIndents", e.LINK = "buttonLink", e.MIME_TYPE = "buttonMimeTypeForm", e.SWITCHER_HOVERED_STYLES = "buttonSwitcherHoveredStylesForm", e.TEXT = "buttonText", e.TEXT_STYLE_AND_COLOR = "buttonTextStyleAndColorForm", e.HOVERED_BORDER_COLOR = "hoveredStyleBorderButtonForm", e.HOVERED_COLOR = "hoveredButtonColorForm", e.HOVERED_TEXT_COLOR = "hoveredButtonTextColorForm", e))(H || {}), k = /* @__PURE__ */ ((e) => (e.HIDDEN_NODE = "hiddenNodeText", e.PARAGRAPH_STYLE = "paragraphStyleForm", e.ALIGN = "textAlignmentForm", e.ANCHOR_CONTAINER = "textAnchorForm", e.FONT_BACKGROUND_COLOR = "textBlockFontBackgroundColor", e.TEXT_BLOCK_BACKGROUND_COLOR = "textBlockBackgroundColor", e.FONT_COLOR = "textBlockFontColor", e.TEXT_BLOCK_FONT_FAMILY = "textBlockFontFamily", e.FONT_FAMILY = "textFontFamily", e.FONT_SIZE = "textBlockFontSize", e.FONT_WEIGHT = "textBlockFontWeight", e.DIRECTION = "textBlockDirectionForm", e.INSERT_FORM = "textBlockInsertForm", e.LINK_DATA = "textBlockLinkDataForm", e.FORMAT = "textBlockTextFormatForm", e.FIXED_HEIGHT = "textFixedHeightForm", e.INTERNAL_INDENTS = "textInternalIndents", e.LINE_HEIGHT = "textLineHeightForm", e.MIME_TYPE = "textMimeTypeForm", e.NO_LINE_WRAPS = "textNoLineWrapsForm", e))(k || {}), p = /* @__PURE__ */ ((e) => (e.ALT_TEXT = "altText", e.LINK = "blockLink", e.ALIGNMENT = "imageAlignment", e.ANCHOR_LINK_CONTAINER = "imageAnchorLinkContainerForm", e.BORDER_RADIUS = "imageBorderRadiusForm", e.IMAGE = "imageImageForm", e.EXTERNAL_INDENTS = "imageExternalIndents", e.MIME_TYPE = "imageMimeTypeForm", e.RESPONSIVE = "imageResponsive", e.ROLLOVER_IMAGE = "imageRolloverImageForm", e.ROLLOVER_SWITCHER = "imageRolloverSwitcherForm", e.SIZE = "imageSizeContainer", e))(p || {}), ue = /* @__PURE__ */ ((e) => (e.BACKGROUND_COLOR = "containerBackgroundColorForm", e.BORDER_FORM = "containerBorderForm", e.BORDER_RADIUS = "containerBorderRadiusForm", e.EXTERNAL_INDENTS = "containerExternalIndentsForm", e.IMAGE_CONTAINER = "containerImageContainerForm", e.MIME_TYPE = "containerMimeTypeForm", e.DISPLAY_CONDITIONS = "displayConditions", e.HIDDEN_NODE = "containerHiddenNodeForm", e))(ue || {}), n = {
343
343
  BLOCK_BUTTON: H,
344
344
  BLOCK_TEXT: k,
345
345
  BLOCK_IMAGE: p,
346
346
  GENERAL: F
347
- }, Ie = /* @__PURE__ */ ((e) => (e.SAVE_AS_MODULE = "saveAsModule", e.IMPROVE_WITH_AI = "improveWithAI", e.MOVE = "move", e.COPY = "copy", e.REMOVE = "remove", e.CLEAR_CONTAINER = "clearContainer", e.EXTERNAL_DISPLAY_CONDITION = "externalDisplayCondition", e))(Ie || {}), ce = /* @__PURE__ */ ((e) => (e.previewDeviceMode = "previewDeviceMode", e.panelPosition = "panelPosition", e.themeMode = "themeMode", e))(ce || {}), Te = /* @__PURE__ */ ((e) => (e.DESKTOP = "DESKTOP", e.MOBILE = "MOBILE", e))(Te || {}), be = /* @__PURE__ */ ((e) => (e.SETTINGS = "settings", e.STYLES = "styles", e.DATA = "data", e))(be || {}), a = {
347
+ }, Ie = /* @__PURE__ */ ((e) => (e.SAVE_AS_MODULE = "saveAsModule", e.IMPROVE_WITH_AI = "improveWithAI", e.MOVE = "move", e.COPY = "copy", e.REMOVE = "remove", e.CLEAR_CONTAINER = "clearContainer", e.EXTERNAL_DISPLAY_CONDITION = "externalDisplayCondition", e))(Ie || {}), Te = /* @__PURE__ */ ((e) => (e.previewDeviceMode = "previewDeviceMode", e.panelPosition = "panelPosition", e.themeMode = "themeMode", e))(Te || {}), ce = /* @__PURE__ */ ((e) => (e.DESKTOP = "DESKTOP", e.MOBILE = "MOBILE", e))(ce || {}), be = /* @__PURE__ */ ((e) => (e.SETTINGS = "settings", e.STYLES = "styles", e.DATA = "data", e))(be || {}), a = {
348
348
  name: "name",
349
349
  disabled: "disabled"
350
350
  }, he = {
@@ -619,7 +619,7 @@ var j = {
619
619
  }
620
620
  };
621
621
  G.REQUIRED_METHODS = ["getId", "getTemplate"];
622
- var ct = G, Xe = class m extends i {
622
+ var Tt = G, Xe = class m extends i {
623
623
  constructor() {
624
624
  super(m.REQUIRED_METHODS, m);
625
625
  }
@@ -694,7 +694,7 @@ var V = class extends x {
694
694
  const t = e.querySelectorAll(I.IMAGE), r = e.asElement().hasClass(K) ? [e] : [];
695
695
  return t.length ? t : r;
696
696
  }
697
- }, Tt = class extends V {
697
+ }, ct = class extends V {
698
698
  getParentControlId() {
699
699
  return n.BLOCK_IMAGE.EXTERNAL_INDENTS;
700
700
  }
@@ -1215,17 +1215,17 @@ export {
1215
1215
  It as ButtonTextStyleAndFontColorBuiltInControl,
1216
1216
  ue as ContainerControls,
1217
1217
  Ie as ContextActionType,
1218
- ct as Control,
1219
- ce as EditorStatePropertyType,
1218
+ Tt as Control,
1219
+ Te as EditorStatePropertyType,
1220
1220
  Ve as Extension,
1221
1221
  Nt as ExtensionBuilder,
1222
1222
  F as GeneralControls,
1223
1223
  Dt as IconsRegistry,
1224
1224
  p as ImageControls,
1225
- Tt as ImageMarginsBuiltInControl,
1225
+ ct as ImageMarginsBuiltInControl,
1226
1226
  bt as ImageSizeBuiltInControl,
1227
1227
  St as ModificationDescription,
1228
- Te as PreviewDeviceMode,
1228
+ ce as PreviewDeviceMode,
1229
1229
  ht as SettingsPanelRegistry,
1230
1230
  mt as SettingsPanelTab,
1231
1231
  be as SettingsTab,
@@ -1,4 +1,4 @@
1
- const o = { stripo: { version: "2.69.1" } }, s = {
1
+ const o = { stripo: { version: "2.72.1" } }, s = {
2
2
  guido: o
3
3
  };
4
4
  export {
@@ -14,8 +14,9 @@ export declare function parseRecommendationVariable(field: string): {
14
14
  * `{{recoId_index_attribute}}` variables: the built-in compiler attributes plus
15
15
  * each account attribute in its canonical token form — bare for
16
16
  * `defaultAttribute`, `product_attribute.<name>` for `productAttribute`. Using
17
- * `resolveProductAttrValue` (the same producer the block builder uses) keeps the
18
- * validator's notion of "valid form" identical to what is actually emitted.
17
+ * `filterToProductAttrValue` (the same producer the block builder uses) keeps the
18
+ * validator's notion of "valid form" identical to what is actually emitted, and
19
+ * admits both forms when a default and a custom attribute share a name.
19
20
  */
20
21
  export declare function buildPartnerAttributeNameSet(filterList: FiltersResponse): Set<string>;
21
22
  /**
@@ -193,6 +193,7 @@ export type PerElementStyles = Record<string, MappedTextStyle | MappedButtonStyl
193
193
  export interface MappedComposition {
194
194
  composition: string[];
195
195
  visibility: Record<string, boolean>;
196
+ /** Canonical `product-attr` values, mirrored into `data-custom-attributes`. */
196
197
  customAttributes: string[];
197
198
  /** Mapping of customAttr key → full `product-attr` value. */
198
199
  customAttrValues: Record<string, string>;
@@ -8,6 +8,6 @@
8
8
  */
9
9
  export { RecommendationBlockId } from './blockIds';
10
10
  export { RecommendationControlId } from './controlIds';
11
- export { BLOCK_ROOT_SELECTOR, CONTAINER_SELECTOR, DESKTOP_CONTAINER_SELECTOR, MOBILE_CONTAINER_SELECTOR, MOBILE_ROW_SELECTOR, CSS_CLASS_RECO_BUTTON, CSS_CLASS_SKIP_COMPILE, RECOMMENDATION_VARIABLE_BUILTIN_ATTRIBUTES, CURRENCY_ATTR, ATTR_PRODUCT_IMAGE, ATTR_PRODUCT_NAME, ATTR_PRODUCT_PRICE, ATTR_PRODUCT_OLD_PRICE, ATTR_PRODUCT_OMNIBUS_PRICE, ATTR_PRODUCT_OMNIBUS_DISCOUNT, ATTR_PRODUCT_BUTTON, ATTR_CUSTOM_PREFIX, ATTR_DATA_CUSTOM_ATTRIBUTES, ATTR_PRODUCT_ATTR, PRODUCT_ATTRIBUTE_PREFIX, BUILT_IN_DEFAULT_ATTRIBUTES, } from './selectors';
11
+ export { BLOCK_ROOT_SELECTOR, CONTAINER_SELECTOR, DESKTOP_CONTAINER_SELECTOR, MOBILE_CONTAINER_SELECTOR, MOBILE_ROW_SELECTOR, CSS_CLASS_RECO_BUTTON, CSS_CLASS_SKIP_COMPILE, RECOMMENDATION_VARIABLE_BUILTIN_ATTRIBUTES, CURRENCY_ATTR, ATTR_PRODUCT_IMAGE, ATTR_PRODUCT_NAME, ATTR_PRODUCT_PRICE, ATTR_PRODUCT_OLD_PRICE, ATTR_PRODUCT_OMNIBUS_PRICE, ATTR_PRODUCT_OMNIBUS_DISCOUNT, ATTR_PRODUCT_BUTTON, ATTR_CUSTOM_PREFIX, ATTR_DATA_CUSTOM_ATTRIBUTES, ATTR_PRODUCT_ATTR, SELECTOR_ATTRIBUTE_ROW, ATTR_DATA_ATTRIBUTE_TYPE, PRODUCT_ATTRIBUTE_PREFIX, BUILT_IN_DEFAULT_ATTRIBUTES, } from './selectors';
12
12
  export { LAYOUT_VALUES, LAYOUT_OPTIONS, DEFAULT_PRODUCTS_PER_ROW, DEFAULT_CARDS_IN_ROW, DEFAULT_MOBILE_CARDS_IN_ROW, MAX_PRODUCT_COUNT, MIN_PRODUCT_COUNT, MAX_PRODUCTS_PER_ROW, MIN_PRODUCTS_PER_ROW, MAX_MOBILE_PRODUCTS_PER_ROW, MIN_MOBILE_PRODUCTS_PER_ROW, DEFAULT_COLUMN_SPACING, DEFAULT_ROW_SPACING, DEFAULT_MOBILE_COLUMN_SPACING, DEFAULT_MOBILE_ROW_SPACING, MIN_SPACING, MAX_SPACING, SPACING_STEP, } from './layout';
13
13
  export { DEFAULT_NODE_CONFIG, DEFAULT_CURRENCY, DEFAULT_COMPOSITION, DEFAULT_VISIBILITY, CURRENT_CONFIG_VERSION, EXCLUDED_ALGORITHM_IDS, } from './defaultConfig';
@@ -68,6 +68,10 @@ export declare const ATTR_CUSTOM_PREFIX = "customAttr:";
68
68
  export declare const ATTR_DATA_CUSTOM_ATTRIBUTES = "data-custom-attributes";
69
69
  /** HTML attribute on <td> elements identifying the product attribute for compiler template variable generation */
70
70
  export declare const ATTR_PRODUCT_ATTR = "product-attr";
71
+ /** Row wrapper of one composition entry inside a product card */
72
+ export declare const SELECTOR_ATTRIBUTE_ROW = ".recommendation-attribute-row";
73
+ /** HTML attribute on an attribute row holding its composition key */
74
+ export declare const ATTR_DATA_ATTRIBUTE_TYPE = "data-attribute-type";
71
75
  /** Prefix `resolveProductAttrValue` puts on custom (non-default) product attributes in `product-attr` values */
72
76
  export declare const PRODUCT_ATTRIBUTE_PREFIX = "product_attribute.";
73
77
  /**
@@ -29,6 +29,8 @@ export declare class RecommendationCardCompositionControl extends CommonControl
29
29
  private _initializeComposition;
30
30
  private _registerValueChangeListeners;
31
31
  private _readCompositionFromNode;
32
+ /** Upgrades legacy bare-name custom keys to the canonical form. (SD-147101) */
33
+ private _normalizeComposition;
32
34
  private _readCustomAttributesFromNode;
33
35
  private _readVisibilityFromRows;
34
36
  private _getDefaultVisibilities;
@@ -61,7 +63,15 @@ export declare class RecommendationCardCompositionControl extends CommonControl
61
63
  private _createPriceGroupItemHtml;
62
64
  private _createCustomItemHtml;
63
65
  /**
64
- * Builds select options from the store's filterList.
66
+ * Dropdown label of an attribute. A partner can own a default and a custom
67
+ * attribute under the same name; the type is spelled out only then, so partners
68
+ * without a collision keep clean labels. (SD-147101)
69
+ */
70
+ private _toOptionLabel;
71
+ /**
72
+ * Builds select options from the store's filterList. Option values are
73
+ * `product-attr` values, so a default attribute and a same-named custom one
74
+ * never collapse onto a single option. (SD-147101)
65
75
  * Falls back to a single option for the currently selected attribute.
66
76
  */
67
77
  private _getSelectOptions;
@@ -144,6 +154,12 @@ export declare class RecommendationCardCompositionControl extends CommonControl
144
154
  */
145
155
  private _onCustomAttributeChanged;
146
156
  private _onReorder;
157
+ /**
158
+ * Outer HTML of an existing attribute row, rewritten to the canonical key when
159
+ * the row still carries a legacy bare-name one. Copying rows this way lets the
160
+ * DOM converge on the next composition change without writing on open.
161
+ */
162
+ private _getExistingRowHtml;
147
163
  private _injectCustomAttributeHtml;
148
164
  private _injectGridAttributeRow;
149
165
  private _injectListAttributeRow;
@@ -204,13 +220,14 @@ export declare class RecommendationCardCompositionControl extends CommonControl
204
220
  */
205
221
  private _subscribeToStoreChanges;
206
222
  /**
207
- * Returns filters eligible for the custom attribute dropdown,
208
- * excluding default attributes already covered by built-in toggle items.
223
+ * Returns filters eligible for the custom attribute dropdown, excluding default
224
+ * attributes already covered by built-in toggle items.
209
225
  */
210
226
  private _getAddableFilters;
211
227
  /**
212
- * Looks up the display name for an attribute from the store's filterList.
213
- * Falls back to Title Case conversion of the snake_case attribute name.
228
+ * Looks up the display name for a `product-attr` value from the store's filterList.
229
+ * Matches on the canonical value, so a default and a same-named custom attribute
230
+ * resolve to their own entry. Falls back to Title Case of the bare name.
214
231
  */
215
232
  private _getDisplayNameForAttribute;
216
233
  /**
@@ -43,22 +43,23 @@ export declare function resolveInlinePriceOrder(composition: string[]): {
43
43
  */
44
44
  export declare function toDisplayableAttributeValue(value: unknown): string | undefined;
45
45
  /**
46
- * Checks whether an attribute is a default (top-level) product attribute
47
- * vs a custom product attribute (nested under `product_attributes`).
48
- * Returns false when filterList is empty or the attribute is not found.
46
+ * Name-only type lookup **legacy fallback only**; the canonical path uses
47
+ * `isDefaultProductAttr` on the `product-attr` value. A bare name is the canonical
48
+ * form of a default attribute, so a duplicated name resolves to the default rather
49
+ * than to whichever entry the filter list happens to enumerate first. (SD-147101)
49
50
  */
50
51
  export declare function isDefaultAttribute(attrName: string, filterList: FiltersResponse): boolean;
51
52
  /**
52
- * Resolves the `product-attr` HTML attribute value based on attribute type from the filter list.
53
- * - Default attributes attribute name directly (e.g., "brand") → compiles to `{{1_0_brand}}`
54
- * - Product attributes → "product_attribute.<name>" (e.g., "product_attribute.rating_star")
53
+ * Name-only `product-attr` resolution **legacy fallback only**, see
54
+ * `isDefaultAttribute`. Prefer `filterToProductAttrValue`, which reads the type off
55
+ * the filter entry itself.
55
56
  */
56
57
  export declare function resolveProductAttrValue(attrName: string, filterList: FiltersResponse): string;
57
58
  /**
58
- * Reverse of `resolveProductAttrValue`: maps a cell's `product-attr` value back to its
59
- * `customAttr:<name>` composition key. The resolver only ever emits `<name>` (default
60
- * attribute) or `product_attribute.<name>` (custom product attribute), so stripping the
61
- * prefix recovers the attribute name without needing the store's filter list.
59
+ * Maps a cell's `product-attr` value to its composition key. The value is the
60
+ * canonical identity, so it is carried into the key verbatim — stripping the
61
+ * `product_attribute.` prefix here would collapse a default and a same-named
62
+ * custom attribute onto one key.
62
63
  */
63
64
  export declare function toCustomCompositionKey(productAttrValue: string): string;
64
65
  /**
@@ -184,7 +185,7 @@ export interface RenderOptions {
184
185
  * `RenderOptions`. Single source for both the stacked per-cell options and the two inline
185
186
  * (price + old-price) option sets, so style capture → re-bake stays consistent across layouts.
186
187
  */
187
- export declare function buildCellOptions(attrType: string, renderOptions: RenderOptions): CellRenderOptions;
188
+ export declare function buildCellOptions(attrType: string, renderOptions: RenderOptions, composition?: string[]): CellRenderOptions;
188
189
  /**
189
190
  * Options for prepareProductRows unified function
190
191
  */
@@ -0,0 +1,52 @@
1
+ import type { FiltersResponse } from '@@/Types/recommendation';
2
+ import type { ImmutableHtmlNode } from '@stripoinc/ui-editor-extensions';
3
+ /**
4
+ * Canonical identity of a card-composition custom attribute is its `product-attr`
5
+ * value — `brand` for a default attribute, `product_attribute.brand` for a custom
6
+ * one. A partner can own both under the same name, and only this form tells them
7
+ * apart. (SD-147101)
8
+ */
9
+ type FilterEntry = FiltersResponse[string];
10
+ /** True when a `product-attr` value refers to a top-level (default) product field. */
11
+ export declare function isDefaultProductAttr(productAttrValue: string): boolean;
12
+ /** The bare attribute name behind a `product-attr` value (`product_attribute.brand` → `brand`). */
13
+ export declare function bareAttributeName(productAttrValue: string): string;
14
+ /** `customAttr:product_attribute.brand` → `product_attribute.brand`. */
15
+ export declare function compositionKeyToProductAttr(compositionKey: string): string;
16
+ /** `product_attribute.brand` → `customAttr:product_attribute.brand`. */
17
+ export declare function productAttrToCompositionKey(productAttrValue: string): string;
18
+ /**
19
+ * Canonical identity of a filter entry. Reads the type off the entry itself, so
20
+ * two same-named filters never collapse onto one value.
21
+ */
22
+ export declare function filterToProductAttrValue(filter: FilterEntry): string;
23
+ /**
24
+ * Filter entry behind a bare attribute name. A bare name is the canonical form of a
25
+ * DEFAULT attribute, so the default wins a name collision; the custom entry is only
26
+ * reached when it is the sole match (a genuinely legacy key). (SD-147101)
27
+ */
28
+ export declare function findFilterByBareName(bareName: string, filterList: FiltersResponse): FilterEntry | undefined;
29
+ /** Composition array with every `customAttr:*` key upgraded to the canonical form. */
30
+ export declare function normalizeCompositionKeys(composition: string[], blockNode?: ImmutableHtmlNode | null, filterList?: FiltersResponse): string[];
31
+ /**
32
+ * `data-custom-attributes` upgraded to canonical values. Index-preserving: the
33
+ * Nth entry must keep mapping to the Nth `customAttr:*` composition key.
34
+ */
35
+ export declare function normalizeCustomAttrValues(values: string[], blockNode?: ImmutableHtmlNode | null, filterList?: FiltersResponse): string[];
36
+ /**
37
+ * Composition key of an attribute row. Custom rows are keyed by their `product-attr`
38
+ * value, which stays correct on rows still tagged with a legacy bare name.
39
+ */
40
+ export declare function resolveRowCompositionKey(row: ImmutableHtmlNode): string | null;
41
+ /**
42
+ * Finds an attribute row by composition key, tolerating rows still tagged with the
43
+ * legacy bare-name key. Custom candidates are validated against their `product-attr`,
44
+ * so a legacy custom `brand` row is never mistaken for the default `brand`.
45
+ */
46
+ export declare function findAttributeRow(container: ImmutableHtmlNode, compositionKey: string): ImmutableHtmlNode | null;
47
+ /**
48
+ * Rewrites a copied row's legacy `data-attribute-type` to the canonical key so the
49
+ * DOM converges on the user's next composition change (no write on mere open).
50
+ */
51
+ export declare function rewriteLegacyRowKeyHtml(rowHtml: string, compositionKey: string): string;
52
+ export {};
@@ -34,6 +34,8 @@ interface SelectProps {
34
34
  placeholder: string;
35
35
  options: TextValueObject[];
36
36
  className?: string;
37
+ /** Adds the picker's built-in search box. Worth it once the list gets long. */
38
+ searchable?: boolean;
37
39
  }
38
40
  interface CounterProps {
39
41
  name: string;
@@ -105,7 +107,7 @@ export declare abstract class CommonControl extends Control {
105
107
  text: string;
106
108
  value: string;
107
109
  }): string;
108
- _GuSelect({ name, placeholder, options, className }: SelectProps): string;
110
+ _GuSelect({ name, placeholder, options, className, searchable, }: SelectProps): string;
109
111
  _GuTextInput({ name, placeholder, className, disabled }: TextInputProps): string;
110
112
  _GuCounter({ name, maxValue, minValue, step }: CounterProps): string;
111
113
  _GuRadioButtonItem({ text, value, icon }: {