@useinsider/guido 3.0.0-beta.e99f1c8 → 3.0.0-beta.f195a1b
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.
- package/dist/components/organisms/header/EditorActions.vue.js +10 -8
- package/dist/components/organisms/header/EditorActions.vue2.js +40 -30
- package/dist/components/organisms/header/MigrationConfirmModal.vue.js +17 -0
- package/dist/components/organisms/header/MigrationConfirmModal.vue2.js +39 -0
- package/dist/config/compiler/utils/recommendationCompilerUtils.js +29 -18
- package/dist/config/i18n/en/labels.json.js +8 -3
- package/dist/config/migrator/itemsBlockMigrator.js +135 -131
- package/dist/config/migrator/recommendationMigrator.js +58 -54
- package/dist/enums/block.js +4 -0
- package/dist/extensions/Blocks/Items/block.js +30 -21
- package/dist/extensions/Blocks/Items/iconsRegistry.js +7 -6
- package/dist/extensions/Blocks/Items/items.css.js +48 -0
- package/dist/extensions/Blocks/Recommendation/block.js +22 -13
- package/dist/extensions/Blocks/Recommendation/constants/blockIds.js +1 -1
- package/dist/extensions/Blocks/Recommendation/constants/controlIds.js +1 -1
- package/dist/extensions/Blocks/Recommendation/constants/selectors.js +15 -12
- package/dist/extensions/Blocks/Recommendation/controls/cardComposition/index.js +693 -144
- package/dist/extensions/Blocks/Recommendation/controls/customAttribute/index.js +78 -0
- package/dist/extensions/Blocks/Recommendation/controls/layout/index.js +27 -24
- package/dist/extensions/Blocks/Recommendation/controls/main/utils.js +134 -126
- package/dist/extensions/Blocks/Recommendation/extension.js +18 -16
- package/dist/extensions/Blocks/Recommendation/iconsRegistry.js +5 -4
- package/dist/extensions/Blocks/Recommendation/recommendation.css.js +174 -2
- package/dist/extensions/Blocks/Recommendation/settingsPanel.js +124 -106
- package/dist/extensions/Blocks/Recommendation/store/recommendation.js +8 -7
- package/dist/extensions/Blocks/Recommendation/templates/grid/elementRenderer.js +63 -34
- package/dist/extensions/Blocks/Recommendation/templates/grid/template.js +30 -33
- package/dist/extensions/Blocks/Recommendation/templates/index.js +8 -8
- package/dist/extensions/Blocks/Recommendation/templates/list/elementRenderer.js +28 -13
- package/dist/extensions/Blocks/Recommendation/templates/list/template.js +25 -44
- package/dist/extensions/Blocks/Recommendation/templates/utils.js +62 -38
- package/dist/extensions/Blocks/common-control.js +12 -4
- package/dist/guido.css +1 -1
- package/dist/src/@types/extensions/block.d.ts +2 -0
- package/dist/src/App.vue.d.ts +3 -1
- package/dist/src/components/Guido.vue.d.ts +1 -1
- package/dist/src/components/organisms/header/EditorActions.vue.d.ts +1 -1
- package/dist/src/components/organisms/header/HeaderWrapper.vue.d.ts +1 -1
- package/dist/src/components/organisms/header/MigrationConfirmModal.vue.d.ts +6 -0
- package/dist/src/components/organisms/header/RightSlot.vue.d.ts +1 -1
- package/dist/src/components/wrappers/WpModal.vue.d.ts +2 -2
- package/dist/src/enums/block.d.ts +4 -0
- package/dist/src/extensions/Blocks/Items/block.d.ts +3 -1
- package/dist/src/extensions/Blocks/Recommendation/block.d.ts +3 -1
- package/dist/src/extensions/Blocks/Recommendation/constants/blockIds.d.ts +2 -1
- package/dist/src/extensions/Blocks/Recommendation/constants/controlIds.d.ts +8 -1
- package/dist/src/extensions/Blocks/Recommendation/constants/index.d.ts +1 -1
- package/dist/src/extensions/Blocks/Recommendation/constants/selectors.d.ts +10 -0
- package/dist/src/extensions/Blocks/Recommendation/controls/cardComposition/index.d.ts +134 -44
- package/dist/src/extensions/Blocks/Recommendation/controls/customAttribute/index.d.ts +105 -0
- package/dist/src/extensions/Blocks/Recommendation/controls/index.d.ts +1 -0
- package/dist/src/extensions/Blocks/Recommendation/controls/main/utils.d.ts +2 -0
- package/dist/src/extensions/Blocks/Recommendation/store/recommendation.d.ts +1 -0
- package/dist/src/extensions/Blocks/Recommendation/templates/grid/elementRenderer.d.ts +1 -1
- package/dist/src/extensions/Blocks/Recommendation/templates/list/elementRenderer.d.ts +1 -1
- package/dist/src/extensions/Blocks/Recommendation/templates/list/template.d.ts +10 -4
- package/dist/src/extensions/Blocks/Recommendation/templates/utils.d.ts +37 -2
- package/dist/src/extensions/Blocks/common-control.d.ts +5 -0
- package/dist/src/stores/template.d.ts +29 -0
- package/dist/src/utils/migrationBannerHtml.d.ts +2 -0
- package/dist/static/assets/info.svg.js +5 -0
- package/dist/static/styles/variables.css.js +3 -0
- package/dist/stores/template.js +15 -0
- package/dist/utils/migrationBannerHtml.js +21 -0
- package/package.json +3 -2
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
var
|
|
2
|
-
var O = (T, r, e) => r in T ?
|
|
1
|
+
var l = Object.defineProperty;
|
|
2
|
+
var O = (T, r, e) => r in T ? l(T, r, { enumerable: !0, configurable: !0, writable: !0, value: e }) : T[r] = e;
|
|
3
3
|
var u = (T, r, e) => O(T, typeof r != "symbol" ? r + "" : r, e);
|
|
4
4
|
import { Control as c, UIElementType as n, UEAttr as $ } from "../../node_modules/@stripoinc/ui-editor-extensions/dist/esm/index.js";
|
|
5
5
|
class _ extends c {
|
|
@@ -129,6 +129,14 @@ class _ extends c {
|
|
|
129
129
|
</${n.BUTTON}>
|
|
130
130
|
`;
|
|
131
131
|
}
|
|
132
|
+
_GuIcon({ src: e, className: t = "" }) {
|
|
133
|
+
return `
|
|
134
|
+
<${n.ICON}
|
|
135
|
+
${$.ICON.src}="${e}"
|
|
136
|
+
${t ? `class="${t}"` : ""}>
|
|
137
|
+
</${n.ICON}>
|
|
138
|
+
`;
|
|
139
|
+
}
|
|
132
140
|
/**
|
|
133
141
|
*
|
|
134
142
|
* @param param0
|
|
@@ -167,9 +175,9 @@ class _ extends c {
|
|
|
167
175
|
_GuOrderable(e, t) {
|
|
168
176
|
let E = "";
|
|
169
177
|
t.forEach((a) => {
|
|
170
|
-
const
|
|
178
|
+
const I = $.ORDERABLE_ITEM && "name" in $.ORDERABLE_ITEM ? $.ORDERABLE_ITEM.name : "name";
|
|
171
179
|
E += `
|
|
172
|
-
<${n.ORDERABLE_ITEM} ${
|
|
180
|
+
<${n.ORDERABLE_ITEM} ${I}="${a.key}">
|
|
173
181
|
${a.content}
|
|
174
182
|
</${n.ORDERABLE_ITEM}>
|
|
175
183
|
`;
|
package/dist/guido.css
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
.gap-16[data-v-3b53a736],.gap-16[data-v-0e1b0c54]{gap:16px}[data-v-cd76c125] .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-079d2bf7] .in-progress-wrapper__progress p span:last-child{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-64c52560]{gap:8px}.version-history__toolbar[data-v-64c52560]{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}.editor-actions[data-v-
|
|
1
|
+
.gap-16[data-v-3b53a736],.gap-16[data-v-0e1b0c54]{gap:16px}[data-v-cd76c125] .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-079d2bf7] .in-progress-wrapper__progress p span:last-child{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-64c52560]{gap:8px}.version-history__toolbar[data-v-64c52560]{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}.editor-actions[data-v-a289b9e9]{gap:4px}.header-wrapper[data-v-5c02dcc7]{min-width:1000px}.guido-loading__wrapper[data-v-07c4b2d8]{height:100%;top:75px!important;bottom:0!important}.guido-editor__wrapper[data-v-a26d7792]{position:relative;width:100%;height:calc(100vh - 128px)}.guido-editor__container[data-v-a26d7792]{width:100%;height:calc(100vh - 128px)}.guido-editor__no-header[data-v-a26d7792]{height:calc(100vh - 75px)}[data-v-293f1c47] .in-breadcrumb-wrapper__links{cursor:pointer}.templates-wrapper[data-v-df672485]{gap:16px;grid-template-columns:repeat(3,1fr)}.templates-wrapper .template-wrapper[data-v-df672485]{cursor:pointer}.templates-wrapper .template-wrapper .template-container[data-v-df672485]{height:274px;padding:2px;transition:none}.templates-wrapper .template-wrapper .template-container.selected[data-v-df672485]{padding:1px}.templates-wrapper .template-wrapper .template-container .thumbnail[data-v-df672485]{object-fit:cover;transform:scale(1)}[data-v-43c617a7] .guido__verion-history-view-option-selection-desktop svg,[data-v-43c617a7] .guido__verion-history-view-option-selection-mobile svg{margin:0 0 0 2px}[data-v-43c617a7] .in-segments-wrapper__button_selected,[data-v-43c617a7] .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-988f8da6]{min-width:602px;height:70vh;min-height:583px;border-radius:10px}.desktop-preview iframe[data-v-988f8da6]{min-height:504px}.iframe-wrapper[data-v-e0424e99]{width:258px}.iframe-scaled[data-v-e0424e99]{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-29b9af29] .vueperslides__bullets,[data-v-dd1a237a] .vueperslides__bullets{pointer-events:none!important}[data-v-dd1a237a] .vueperslides__parallax-wrapper{height:110px!important}[data-v-d073b1dc] .vueperslides__bullets{pointer-events:none!important}[data-v-d073b1dc] .vueperslides__parallax-wrapper{height:110px!important}
|
package/dist/src/App.vue.d.ts
CHANGED
|
@@ -1,3 +1,5 @@
|
|
|
1
|
-
import '
|
|
1
|
+
import '@useinsider/design-system-vue/style';
|
|
2
|
+
import '@useinsider/design-system-vue/fonts.css';
|
|
3
|
+
import '@useinsider/design-system-vue/utilities.css';
|
|
2
4
|
declare const _default: import("vue").DefineComponent<{}, {}, {}, {}, {}, import("vue/types/v3-component-options.js").ComponentOptionsMixin, import("vue/types/v3-component-options.js").ComponentOptionsMixin, {}, string, Readonly<import("vue").ExtractPropTypes<{}>>, {}>;
|
|
3
5
|
export default _default;
|
|
@@ -11,7 +11,7 @@ declare const _default: import("vue").DefineComponent<__VLS_TypePropsToOption<__
|
|
|
11
11
|
close: () => void;
|
|
12
12
|
};
|
|
13
13
|
hasChanges: import("vue").ComputedRef<boolean>;
|
|
14
|
-
saveSilent: () =>
|
|
14
|
+
saveSilent: () => void | undefined;
|
|
15
15
|
}, {}, {}, {}, import("vue/types/v3-component-options.js").ComponentOptionsMixin, import("vue/types/v3-component-options.js").ComponentOptionsMixin, {
|
|
16
16
|
"dynamic-content:open": (detail: {
|
|
17
17
|
text: string;
|
|
@@ -1,4 +1,4 @@
|
|
|
1
1
|
declare const _default: import("vue").DefineComponent<{}, {
|
|
2
|
-
handleSave: (isSilent: boolean) =>
|
|
2
|
+
handleSave: (isSilent: boolean) => void;
|
|
3
3
|
}, {}, {}, {}, import("vue/types/v3-component-options.js").ComponentOptionsMixin, import("vue/types/v3-component-options.js").ComponentOptionsMixin, {}, string, Readonly<import("vue").ExtractPropTypes<{}>>, {}>;
|
|
4
4
|
export default _default;
|
|
@@ -1,4 +1,4 @@
|
|
|
1
1
|
declare const _default: import("vue").DefineComponent<{}, {
|
|
2
|
-
handleSave: (isSilent: boolean) =>
|
|
2
|
+
handleSave: (isSilent: boolean) => void | undefined;
|
|
3
3
|
}, {}, {}, {}, import("vue/types/v3-component-options.js").ComponentOptionsMixin, import("vue/types/v3-component-options.js").ComponentOptionsMixin, {}, string, Readonly<import("vue").ExtractPropTypes<{}>>, {}>;
|
|
4
4
|
export default _default;
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
declare const _default: import("vue").DefineComponent<{}, {
|
|
2
|
+
open: () => void;
|
|
3
|
+
}, {}, {}, {}, import("vue/types/v3-component-options.js").ComponentOptionsMixin, import("vue/types/v3-component-options.js").ComponentOptionsMixin, {
|
|
4
|
+
confirm: () => void;
|
|
5
|
+
}, string, Readonly<import("vue").ExtractPropTypes<{}>>, {}>;
|
|
6
|
+
export default _default;
|
|
@@ -1,4 +1,4 @@
|
|
|
1
1
|
declare const _default: import("vue").DefineComponent<{}, {
|
|
2
|
-
handleSave: (isSilent: boolean) =>
|
|
2
|
+
handleSave: (isSilent: boolean) => void | undefined;
|
|
3
3
|
}, {}, {}, {}, import("vue/types/v3-component-options.js").ComponentOptionsMixin, import("vue/types/v3-component-options.js").ComponentOptionsMixin, {}, string, Readonly<import("vue").ExtractPropTypes<{}>>, {}>;
|
|
4
4
|
export default _default;
|
|
@@ -3,7 +3,7 @@ type __VLS_Props = {
|
|
|
3
3
|
id: string;
|
|
4
4
|
title: string;
|
|
5
5
|
description?: string;
|
|
6
|
-
size?: 'small' | 'medium' | 'large';
|
|
6
|
+
size?: 'X-small' | 'small' | 'medium' | 'large';
|
|
7
7
|
footerButtonOptions?: FooterButtonGroup;
|
|
8
8
|
closeButtonStatus?: boolean;
|
|
9
9
|
closeOnOutsideClick?: boolean;
|
|
@@ -33,7 +33,7 @@ declare const __VLS_component: import("vue").DefineComponent<__VLS_WithDefaults<
|
|
|
33
33
|
footerStatus: boolean;
|
|
34
34
|
}>>>, {
|
|
35
35
|
description: string;
|
|
36
|
-
size: "small" | "medium" | "large";
|
|
36
|
+
size: "X-small" | "small" | "medium" | "large";
|
|
37
37
|
closeOnOutsideClick: boolean;
|
|
38
38
|
footerButtonOptions: FooterButtonGroup;
|
|
39
39
|
closeButtonStatus: boolean;
|
|
@@ -1,5 +1,6 @@
|
|
|
1
|
+
import type { BlockId } from '@@/Types/extensions/block';
|
|
1
2
|
import { Block, BlockCompositionType, ImmutableHtmlNode } from '@stripoinc/ui-editor-extensions';
|
|
2
|
-
export declare const BLOCK_ID
|
|
3
|
+
export declare const BLOCK_ID: BlockId;
|
|
3
4
|
/**
|
|
4
5
|
* Items Block extension for Stripo email editor.
|
|
5
6
|
*
|
|
@@ -20,6 +21,7 @@ export declare class ItemsBlock extends Block {
|
|
|
20
21
|
getBlockCompositionType(): BlockCompositionType;
|
|
21
22
|
getName(): string;
|
|
22
23
|
getDescription(): string;
|
|
24
|
+
getSettingsPanelTitleHtml(): string;
|
|
23
25
|
getTemplate(): string;
|
|
24
26
|
allowInnerBlocksDND(): boolean;
|
|
25
27
|
onCreated(node: ImmutableHtmlNode): void;
|
|
@@ -5,9 +5,10 @@
|
|
|
5
5
|
* Handles block lifecycle including configuration initialization and migration.
|
|
6
6
|
* Supports multiple block instances with unique recommendation-id attributes.
|
|
7
7
|
*/
|
|
8
|
+
import type { BlockId } from '@@/Types/extensions/block';
|
|
8
9
|
import type { ImmutableHtmlNode } from '@stripoinc/ui-editor-extensions';
|
|
9
10
|
import { Block, BlockCompositionType } from '@stripoinc/ui-editor-extensions';
|
|
10
|
-
export declare const BLOCK_ID
|
|
11
|
+
export declare const BLOCK_ID: BlockId;
|
|
11
12
|
export declare class RecommendationBlock extends Block {
|
|
12
13
|
/**
|
|
13
14
|
* Stores the ID generated in getTemplate() so onCreated() can reuse it.
|
|
@@ -20,6 +21,7 @@ export declare class RecommendationBlock extends Block {
|
|
|
20
21
|
getBlockCompositionType(): BlockCompositionType;
|
|
21
22
|
getName(): string;
|
|
22
23
|
getDescription(): string;
|
|
24
|
+
getSettingsPanelTitleHtml(): string;
|
|
23
25
|
/**
|
|
24
26
|
* Returns the template HTML for a new recommendation block.
|
|
25
27
|
* Generates a unique recommendation ID and embeds the instance class
|
|
@@ -9,5 +9,6 @@ export declare enum RecommendationBlockId {
|
|
|
9
9
|
OLD_PRICE = "recommendation-block-old-price",
|
|
10
10
|
OMNIBUS_PRICE = "recommendation-block-omnibus-price",
|
|
11
11
|
OMNIBUS_DISCOUNT = "recommendation-block-omnibus-discount",
|
|
12
|
-
IMAGE = "recommendation-block-image"
|
|
12
|
+
IMAGE = "recommendation-block-image",
|
|
13
|
+
CUSTOM_ATTRIBUTE = "recommendation-block-custom-attribute"
|
|
13
14
|
}
|
|
@@ -55,5 +55,12 @@ export declare enum RecommendationControlId {
|
|
|
55
55
|
OMNIBUS_DISCOUNT_TEXT_BEFORE = "recommendation-block-omnibus-discount-text-before-control",
|
|
56
56
|
OMNIBUS_DISCOUNT_TEXT_AFTER = "recommendation-block-omnibus-discount-text-after-control",
|
|
57
57
|
IMAGE_SIZE = "recommendation-block-image-size-control",
|
|
58
|
-
IMAGE_MARGINS = "recommendation-block-image-margins-control"
|
|
58
|
+
IMAGE_MARGINS = "recommendation-block-image-margins-control",
|
|
59
|
+
CUSTOM_ATTR_ALIGN = "recommendation-block-custom-attr-align-control",
|
|
60
|
+
CUSTOM_ATTR_BACKGROUND = "recommendation-block-custom-attr-background-control",
|
|
61
|
+
CUSTOM_ATTR_COLOR = "recommendation-block-custom-attr-color-control",
|
|
62
|
+
CUSTOM_ATTR_FONT_FAMILY = "recommendation-block-custom-attr-font-family-control",
|
|
63
|
+
CUSTOM_ATTR_PADDINGS = "recommendation-block-custom-attr-paddings-control",
|
|
64
|
+
CUSTOM_ATTR_SIZE = "recommendation-block-custom-attr-size-control",
|
|
65
|
+
CUSTOM_ATTR_STYLE = "recommendation-block-custom-attr-style-control"
|
|
59
66
|
}
|
|
@@ -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, 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, } from './selectors';
|
|
11
|
+
export { BLOCK_ROOT_SELECTOR, CONTAINER_SELECTOR, DESKTOP_CONTAINER_SELECTOR, MOBILE_CONTAINER_SELECTOR, MOBILE_ROW_SELECTOR, 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, } 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';
|
|
@@ -40,3 +40,13 @@ export declare const ATTR_PRODUCT_OLD_PRICE = "productOldPrice";
|
|
|
40
40
|
export declare const ATTR_PRODUCT_OMNIBUS_PRICE = "productOmnibusPrice";
|
|
41
41
|
export declare const ATTR_PRODUCT_OMNIBUS_DISCOUNT = "productOmnibusDiscount";
|
|
42
42
|
export declare const ATTR_PRODUCT_BUTTON = "productButton";
|
|
43
|
+
/**
|
|
44
|
+
* Custom attribute constants
|
|
45
|
+
* Used for dynamically added product attributes in Card Composition
|
|
46
|
+
*/
|
|
47
|
+
/** Prefix for custom attribute keys in composition arrays (e.g., "customAttr:rating_star") */
|
|
48
|
+
export declare const ATTR_CUSTOM_PREFIX = "customAttr:";
|
|
49
|
+
/** HTML data attribute storing JSON array of added custom attribute names */
|
|
50
|
+
export declare const ATTR_DATA_CUSTOM_ATTRIBUTES = "data-custom-attributes";
|
|
51
|
+
/** HTML attribute on <td> elements identifying the product attribute for compiler template variable generation */
|
|
52
|
+
export declare const ATTR_PRODUCT_ATTR = "product-attr";
|
|
@@ -4,92 +4,182 @@ export declare const COMPOSITION_CONTROL_BLOCK_ID = "ui-elements-recommendation-
|
|
|
4
4
|
export interface CardCompositionItem {
|
|
5
5
|
key: string;
|
|
6
6
|
label: string;
|
|
7
|
-
visible: boolean;
|
|
8
7
|
}
|
|
9
8
|
export declare class RecommendationCardCompositionControl extends CommonControl {
|
|
10
9
|
private store;
|
|
11
|
-
private
|
|
10
|
+
private unsubscribeStore;
|
|
11
|
+
private eventController;
|
|
12
|
+
/**
|
|
13
|
+
* Guard flag: when true, onTemplateNodeUpdated skips _initializeComposition.
|
|
14
|
+
* Used during _onReorder to prevent multiple intermediate rebuilds.
|
|
15
|
+
*/
|
|
16
|
+
private reorderInProgress;
|
|
12
17
|
getId(): string;
|
|
13
18
|
getTemplate(): string;
|
|
14
19
|
onRender(): void;
|
|
15
20
|
onTemplateNodeUpdated(node: ImmutableHtmlNode): void;
|
|
21
|
+
onDestroy(): void;
|
|
22
|
+
private _initializeComposition;
|
|
23
|
+
private _registerValueChangeListeners;
|
|
24
|
+
private _readCompositionFromNode;
|
|
25
|
+
private _readCustomAttributesFromNode;
|
|
26
|
+
private _readVisibilityFromRows;
|
|
27
|
+
private _getDefaultVisibilities;
|
|
28
|
+
private _extractVisibilityFromRows;
|
|
29
|
+
private _parseVisibilityValue;
|
|
30
|
+
private _mergeWithDefaults;
|
|
31
|
+
private _buildVisibilityValues;
|
|
16
32
|
/**
|
|
17
|
-
*
|
|
33
|
+
* Renders orderable items into the composition list.
|
|
34
|
+
* Returns `true` if a full DOM rebuild occurred, `false` if existing
|
|
35
|
+
* elements were reordered in-place (preserving UE-SELECT state).
|
|
18
36
|
*/
|
|
19
|
-
private
|
|
37
|
+
private _renderOrderableItems;
|
|
20
38
|
/**
|
|
21
|
-
*
|
|
39
|
+
* Attempts to reorder existing orderable-item elements to match the composition order.
|
|
40
|
+
* If the list already contains the same set of items (possibly in a different order),
|
|
41
|
+
* performs a lightweight DOM reorder instead of a full innerHTML rebuild.
|
|
42
|
+
* Returns true if reorder was performed, false if a full rebuild is needed.
|
|
22
43
|
*/
|
|
23
|
-
private
|
|
44
|
+
private _tryReorderInPlace;
|
|
45
|
+
private _createBuiltInItemHtml;
|
|
46
|
+
private _createCustomItemHtml;
|
|
24
47
|
/**
|
|
25
|
-
*
|
|
48
|
+
* Builds select options from the store's filterList.
|
|
49
|
+
* Falls back to a single option for the currently selected attribute.
|
|
26
50
|
*/
|
|
27
|
-
private
|
|
51
|
+
private _getSelectOptions;
|
|
28
52
|
/**
|
|
29
|
-
*
|
|
30
|
-
*
|
|
53
|
+
* Initializes custom attribute selects: sets their options and current value.
|
|
54
|
+
* Selects are pre-allocated in getTemplate() and moved into items by
|
|
55
|
+
* _moveSelectsIntoItems — this method only updates their data.
|
|
31
56
|
*/
|
|
32
|
-
private
|
|
57
|
+
private _initializeCustomSelects;
|
|
33
58
|
/**
|
|
34
|
-
*
|
|
59
|
+
* Moves UE-SWITCHER elements from the hidden toggle store into orderable items.
|
|
60
|
+
* Stripo initializes toggles at template parse time; moving the DOM node preserves bindings.
|
|
35
61
|
*/
|
|
36
|
-
private
|
|
62
|
+
private _moveTogglesIntoItems;
|
|
37
63
|
/**
|
|
38
|
-
*
|
|
39
|
-
*
|
|
64
|
+
* Moves pre-allocated UE-SELECT elements from the hidden custom-select-store
|
|
65
|
+
* into orderable item slots. Same pattern as _moveTogglesIntoItems.
|
|
40
66
|
*/
|
|
41
|
-
private
|
|
67
|
+
private _moveSelectsIntoItems;
|
|
42
68
|
/**
|
|
43
|
-
*
|
|
69
|
+
* Rescues UE-SWITCHER elements from orderable items back to the hidden toggle store.
|
|
70
|
+
* Must be called before re-rendering the list with innerHTML to prevent toggle destruction.
|
|
71
|
+
* Without this, onTemplateNodeUpdated → _renderOrderableItems → innerHTML would destroy
|
|
72
|
+
* previously-moved toggles, making them permanently lost.
|
|
44
73
|
*/
|
|
45
|
-
private
|
|
74
|
+
private _rescueTogglesToStore;
|
|
46
75
|
/**
|
|
47
|
-
*
|
|
76
|
+
* Rescues UE-SELECT elements from orderable items back to the hidden custom-select-store.
|
|
77
|
+
* Same rescue pattern as _rescueTogglesToStore — prevents innerHTML from destroying them.
|
|
48
78
|
*/
|
|
49
|
-
private
|
|
79
|
+
private _rescueSelectsToStore;
|
|
50
80
|
/**
|
|
51
|
-
*
|
|
52
|
-
*
|
|
81
|
+
* Moves pre-allocated UE-BUTTON delete elements from the hidden custom-delete-store
|
|
82
|
+
* into orderable item slots. Same pattern as _moveSelectsIntoItems.
|
|
53
83
|
*/
|
|
54
|
-
private
|
|
84
|
+
private _moveDeleteButtonsIntoItems;
|
|
55
85
|
/**
|
|
56
|
-
*
|
|
86
|
+
* Rescues UE-BUTTON delete elements from orderable items back to the hidden custom-delete-store.
|
|
87
|
+
* Same rescue pattern as _rescueSelectsToStore — prevents innerHTML from destroying them.
|
|
57
88
|
*/
|
|
58
|
-
private
|
|
89
|
+
private _rescueDeleteButtonsToStore;
|
|
59
90
|
/**
|
|
60
|
-
*
|
|
61
|
-
*
|
|
62
|
-
* Note: Reordering is only applied for grid layout
|
|
91
|
+
* Moves pre-allocated reorder icon UE-BUTTON elements from the hidden reorder-icon-store
|
|
92
|
+
* into orderable item drag-handle slots. Same pattern as _moveDeleteButtonsIntoItems.
|
|
63
93
|
*/
|
|
64
|
-
private
|
|
94
|
+
private _moveReorderIconsIntoItems;
|
|
65
95
|
/**
|
|
66
|
-
*
|
|
67
|
-
*
|
|
96
|
+
* Rescues reorder icon UE-BUTTON elements from orderable items back to the hidden reorder-icon-store.
|
|
97
|
+
* Same rescue pattern as _rescueDeleteButtonsToStore — prevents innerHTML from destroying them.
|
|
68
98
|
*/
|
|
69
|
-
private
|
|
99
|
+
private _rescueReorderIconsToStore;
|
|
100
|
+
private _setupEventListeners;
|
|
101
|
+
private _setupDragAndDrop;
|
|
102
|
+
private _setupDeleteHandler;
|
|
103
|
+
private _onAddAttribute;
|
|
70
104
|
/**
|
|
71
|
-
*
|
|
105
|
+
* Removes a single custom attribute by its index in the customAttrs array.
|
|
106
|
+
* Index-based to correctly handle duplicate attributes.
|
|
72
107
|
*/
|
|
73
|
-
private
|
|
108
|
+
private _onDeleteCustomAttribute;
|
|
109
|
+
/**
|
|
110
|
+
* Handles changing a custom attribute's selection via its inline _GuSelect.
|
|
111
|
+
* Uses the customIndex to target only the specific instance, supporting duplicates.
|
|
112
|
+
*/
|
|
113
|
+
private _onCustomAttributeChanged;
|
|
114
|
+
private _onReorder;
|
|
115
|
+
private _injectCustomAttributeHtml;
|
|
116
|
+
private _injectGridAttributeRow;
|
|
117
|
+
private _injectListAttributeRow;
|
|
118
|
+
/**
|
|
119
|
+
* Removes a custom attribute by rebuilding product card content without it.
|
|
120
|
+
* The composition parameter should already have the deleted key removed.
|
|
121
|
+
*/
|
|
122
|
+
private _removeCustomAttributeHtml;
|
|
123
|
+
/**
|
|
124
|
+
* Atomically updates both composition and custom-attributes in a single apply()
|
|
125
|
+
* so that onTemplateNodeUpdated fires only once with fully consistent state.
|
|
126
|
+
* Two separate apply() calls would cause an intermediate onTemplateNodeUpdated
|
|
127
|
+
* where composition is updated but customAttributes still has the old order,
|
|
128
|
+
* producing a flicker on the custom attribute dropdowns.
|
|
129
|
+
*/
|
|
130
|
+
private _updateBothAttributes;
|
|
131
|
+
/**
|
|
132
|
+
* Reorders attribute rows within each product card based on composition order.
|
|
133
|
+
* Only used for grid layout (list layout has fixed 3-column structure).
|
|
134
|
+
*/
|
|
135
|
+
private _reorderProductAttributes;
|
|
74
136
|
/**
|
|
75
|
-
*
|
|
76
|
-
*
|
|
77
|
-
* - <tr> elements: use display: none / table-row
|
|
78
|
-
* - <td> elements: use display: none / table-cell
|
|
137
|
+
* Builds HTML string with attributes ordered according to composition.
|
|
138
|
+
* Queries existing rows from the container by data-attribute-type.
|
|
79
139
|
*/
|
|
140
|
+
private _buildCompositionHtml;
|
|
80
141
|
private _applyVisibilityToBlock;
|
|
81
142
|
/**
|
|
82
|
-
*
|
|
143
|
+
* Finds the composition array index for the Nth custom attribute (0-based).
|
|
144
|
+
* Scans left-to-right, counting only entries with the custom prefix.
|
|
145
|
+
* The customIndex maps 1:1 with the customAttrs array order.
|
|
83
146
|
*/
|
|
147
|
+
private _findNthCustomKeyIndex;
|
|
84
148
|
private _getCurrentLayout;
|
|
85
149
|
/**
|
|
86
|
-
*
|
|
87
|
-
*
|
|
150
|
+
* Extracts background color properties from existing card elements.
|
|
151
|
+
* Checks both `.product-card-segment` (where applyCardBackgroundColor sets bg for grid)
|
|
152
|
+
* and `.product-card-wrapper` (where CardBackgroundColorControl sets bg).
|
|
153
|
+
* Used when injecting new attribute cells to match the card's current background.
|
|
154
|
+
*/
|
|
155
|
+
private _extractSegmentBgFromCard;
|
|
156
|
+
private _getControlContainer;
|
|
157
|
+
/**
|
|
158
|
+
* Adds/removes orderable-disabled class based on layout orientation.
|
|
159
|
+
* List layout hides drag handles via CSS and disables draggable attribute
|
|
160
|
+
* to prevent native browser drag-and-drop from working without the handle.
|
|
88
161
|
*/
|
|
89
162
|
private _updateOrderableState;
|
|
90
163
|
/**
|
|
91
|
-
*
|
|
92
|
-
*
|
|
164
|
+
* Disables the "Add Attribute" button when the custom attribute limit is reached
|
|
165
|
+
* or when all available filters have already been added (no unused attributes left).
|
|
166
|
+
*/
|
|
167
|
+
private _updateAddButtonState;
|
|
168
|
+
/**
|
|
169
|
+
* Subscribes to store changes for orientation and filterList updates.
|
|
170
|
+
* When filterList changes (e.g. after async fetch), re-renders dropdowns with new options.
|
|
171
|
+
*/
|
|
172
|
+
private _subscribeToStoreChanges;
|
|
173
|
+
/**
|
|
174
|
+
* Looks up the display name for an attribute from the store's filterList.
|
|
175
|
+
* Falls back to Title Case conversion of the snake_case attribute name.
|
|
176
|
+
*/
|
|
177
|
+
private _getDisplayNameForAttribute;
|
|
178
|
+
/**
|
|
179
|
+
* Resolves the display content for a custom attribute cell.
|
|
180
|
+
* Uses the real product value from the store when available, falls back to displayName.
|
|
93
181
|
*/
|
|
94
|
-
private
|
|
182
|
+
private _resolveAttributeContent;
|
|
183
|
+
private _getGridCellHtml;
|
|
184
|
+
private _getListRowHtml;
|
|
95
185
|
}
|
|
@@ -0,0 +1,105 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Custom Attribute Element Controls
|
|
3
|
+
*
|
|
4
|
+
* Controls for styling custom product attribute elements in recommendation cards.
|
|
5
|
+
*
|
|
6
|
+
* Unlike built-in elements (Name, Price, etc.) where all instances share a single
|
|
7
|
+
* block ID and should be styled uniformly, custom attributes are conceptually
|
|
8
|
+
* different elements (e.g., "brand" vs "rating_star") that need independent styling.
|
|
9
|
+
*
|
|
10
|
+
* Each custom attribute element carries a unique `product-attr` HTML attribute
|
|
11
|
+
* (e.g., `product-attr="product_attribute.brand"`). The controls below use this
|
|
12
|
+
* attribute to scope style changes to only the same attribute type across all
|
|
13
|
+
* product cards — changing "brand" color won't affect "rating_star" color.
|
|
14
|
+
*/
|
|
15
|
+
import { ImmutableHtmlNode } from '@stripoinc/ui-editor-extensions';
|
|
16
|
+
/**
|
|
17
|
+
* Grouped Custom Attribute Controls
|
|
18
|
+
* Use this object for cleaner imports in extension.ts
|
|
19
|
+
*/
|
|
20
|
+
export declare const CustomAttributeControls: {
|
|
21
|
+
readonly align: {
|
|
22
|
+
new (): {
|
|
23
|
+
getId(): string;
|
|
24
|
+
getTargetNodes(root: ImmutableHtmlNode): ImmutableHtmlNode[];
|
|
25
|
+
getParentControlId(): string;
|
|
26
|
+
api: import("@stripoinc/ui-editor-extensions").ControlApi;
|
|
27
|
+
getLabels(): import("@stripoinc/ui-editor-extensions").ControlLabels | undefined;
|
|
28
|
+
getModificationDescription(): import("@stripoinc/ui-editor-extensions").ModificationDescription | undefined;
|
|
29
|
+
getAdditionalModifications(_root: ImmutableHtmlNode): import("@stripoinc/ui-editor-extensions").TemplateModifier<import("@stripoinc/ui-editor-extensions").HtmlNodeModifier, import("@stripoinc/ui-editor-extensions").CssNodeModifier> | undefined;
|
|
30
|
+
isVisible(_node: ImmutableHtmlNode): boolean;
|
|
31
|
+
};
|
|
32
|
+
};
|
|
33
|
+
readonly color: {
|
|
34
|
+
new (): {
|
|
35
|
+
getId(): string;
|
|
36
|
+
getTargetNodes(root: ImmutableHtmlNode): ImmutableHtmlNode[];
|
|
37
|
+
getParentControlId(): string;
|
|
38
|
+
api: import("@stripoinc/ui-editor-extensions").ControlApi;
|
|
39
|
+
getLabels(): import("@stripoinc/ui-editor-extensions").ControlLabels | undefined;
|
|
40
|
+
getModificationDescription(): import("@stripoinc/ui-editor-extensions").ModificationDescription | undefined;
|
|
41
|
+
getAdditionalModifications(_root: ImmutableHtmlNode): import("@stripoinc/ui-editor-extensions").TemplateModifier<import("@stripoinc/ui-editor-extensions").HtmlNodeModifier, import("@stripoinc/ui-editor-extensions").CssNodeModifier> | undefined;
|
|
42
|
+
isVisible(_node: ImmutableHtmlNode): boolean;
|
|
43
|
+
};
|
|
44
|
+
};
|
|
45
|
+
readonly size: {
|
|
46
|
+
new (): {
|
|
47
|
+
getId(): string;
|
|
48
|
+
getTargetNodes(root: ImmutableHtmlNode): ImmutableHtmlNode[];
|
|
49
|
+
getParentControlId(): string;
|
|
50
|
+
api: import("@stripoinc/ui-editor-extensions").ControlApi;
|
|
51
|
+
getLabels(): import("@stripoinc/ui-editor-extensions").ControlLabels | undefined;
|
|
52
|
+
getModificationDescription(): import("@stripoinc/ui-editor-extensions").ModificationDescription | undefined;
|
|
53
|
+
getAdditionalModifications(_root: ImmutableHtmlNode): import("@stripoinc/ui-editor-extensions").TemplateModifier<import("@stripoinc/ui-editor-extensions").HtmlNodeModifier, import("@stripoinc/ui-editor-extensions").CssNodeModifier> | undefined;
|
|
54
|
+
isVisible(_node: ImmutableHtmlNode): boolean;
|
|
55
|
+
};
|
|
56
|
+
};
|
|
57
|
+
readonly style: {
|
|
58
|
+
new (): {
|
|
59
|
+
getId(): string;
|
|
60
|
+
getTargetNodes(root: ImmutableHtmlNode): ImmutableHtmlNode[];
|
|
61
|
+
getParentControlId(): string;
|
|
62
|
+
api: import("@stripoinc/ui-editor-extensions").ControlApi;
|
|
63
|
+
getLabels(): import("@stripoinc/ui-editor-extensions").ControlLabels | undefined;
|
|
64
|
+
getModificationDescription(): import("@stripoinc/ui-editor-extensions").ModificationDescription | undefined;
|
|
65
|
+
getAdditionalModifications(_root: ImmutableHtmlNode): import("@stripoinc/ui-editor-extensions").TemplateModifier<import("@stripoinc/ui-editor-extensions").HtmlNodeModifier, import("@stripoinc/ui-editor-extensions").CssNodeModifier> | undefined;
|
|
66
|
+
isVisible(_node: ImmutableHtmlNode): boolean;
|
|
67
|
+
};
|
|
68
|
+
};
|
|
69
|
+
readonly fontFamily: {
|
|
70
|
+
new (): {
|
|
71
|
+
getId(): string;
|
|
72
|
+
getTargetNodes(root: ImmutableHtmlNode): ImmutableHtmlNode[];
|
|
73
|
+
getParentControlId(): string;
|
|
74
|
+
api: import("@stripoinc/ui-editor-extensions").ControlApi;
|
|
75
|
+
getLabels(): import("@stripoinc/ui-editor-extensions").ControlLabels | undefined;
|
|
76
|
+
getModificationDescription(): import("@stripoinc/ui-editor-extensions").ModificationDescription | undefined;
|
|
77
|
+
getAdditionalModifications(_root: ImmutableHtmlNode): import("@stripoinc/ui-editor-extensions").TemplateModifier<import("@stripoinc/ui-editor-extensions").HtmlNodeModifier, import("@stripoinc/ui-editor-extensions").CssNodeModifier> | undefined;
|
|
78
|
+
isVisible(_node: ImmutableHtmlNode): boolean;
|
|
79
|
+
};
|
|
80
|
+
};
|
|
81
|
+
readonly background: {
|
|
82
|
+
new (): {
|
|
83
|
+
getId(): string;
|
|
84
|
+
getTargetNodes(root: ImmutableHtmlNode): ImmutableHtmlNode[];
|
|
85
|
+
getParentControlId(): string;
|
|
86
|
+
api: import("@stripoinc/ui-editor-extensions").ControlApi;
|
|
87
|
+
getLabels(): import("@stripoinc/ui-editor-extensions").ControlLabels | undefined;
|
|
88
|
+
getModificationDescription(): import("@stripoinc/ui-editor-extensions").ModificationDescription | undefined;
|
|
89
|
+
getAdditionalModifications(_root: ImmutableHtmlNode): import("@stripoinc/ui-editor-extensions").TemplateModifier<import("@stripoinc/ui-editor-extensions").HtmlNodeModifier, import("@stripoinc/ui-editor-extensions").CssNodeModifier> | undefined;
|
|
90
|
+
isVisible(_node: ImmutableHtmlNode): boolean;
|
|
91
|
+
};
|
|
92
|
+
};
|
|
93
|
+
readonly paddings: {
|
|
94
|
+
new (): {
|
|
95
|
+
getId(): string;
|
|
96
|
+
getTargetNodes(root: ImmutableHtmlNode): ImmutableHtmlNode[];
|
|
97
|
+
getParentControlId(): string;
|
|
98
|
+
api: import("@stripoinc/ui-editor-extensions").ControlApi;
|
|
99
|
+
getLabels(): import("@stripoinc/ui-editor-extensions").ControlLabels | undefined;
|
|
100
|
+
getModificationDescription(): import("@stripoinc/ui-editor-extensions").ModificationDescription | undefined;
|
|
101
|
+
getAdditionalModifications(_root: ImmutableHtmlNode): import("@stripoinc/ui-editor-extensions").TemplateModifier<import("@stripoinc/ui-editor-extensions").HtmlNodeModifier, import("@stripoinc/ui-editor-extensions").CssNodeModifier> | undefined;
|
|
102
|
+
isVisible(_node: ImmutableHtmlNode): boolean;
|
|
103
|
+
};
|
|
104
|
+
};
|
|
105
|
+
};
|
|
@@ -18,6 +18,7 @@ export { OmnibusPriceControls } from './omnibusPrice';
|
|
|
18
18
|
export { OmnibusDiscountControls } from './omnibusDiscount';
|
|
19
19
|
export { ButtonControls } from './button';
|
|
20
20
|
export { ImageControls } from './image';
|
|
21
|
+
export { CustomAttributeControls } from './customAttribute';
|
|
21
22
|
export { SpacingControl, SPACING_CONTROL_ID } from './spacing';
|
|
22
23
|
export { CardBackgroundColorControl, CARD_BACKGROUND_COLOR_CONTROL_ID } from './cardBackground';
|
|
23
24
|
export { LayoutControl, LAYOUT_CONTROL_ID } from './layout';
|
|
@@ -56,6 +56,8 @@ export interface RegenerateProductRowsOptions {
|
|
|
56
56
|
products?: RecommendationProduct[];
|
|
57
57
|
/** Optional: pass layout directly to avoid stale DOM reads after setAttribute */
|
|
58
58
|
layout?: Orientation;
|
|
59
|
+
/** Optional: pass composition directly to avoid stale DOM reads after setAttribute */
|
|
60
|
+
composition?: string[];
|
|
59
61
|
}
|
|
60
62
|
/**
|
|
61
63
|
* Regenerates only the mobile product container rows.
|