@useinsider/guido 3.8.2 → 3.9.0-beta.10a70b8

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 (61) hide show
  1. package/dist/@types/config/schemas.js +70 -66
  2. package/dist/composables/usePreviewMode.js +15 -14
  3. package/dist/composables/useRecommendationPreview.js +111 -0
  4. package/dist/config/compiler/recommendationCompilerRules.js +1 -1
  5. package/dist/config/compiler/utils/recommendationCompilerUtils.js +122 -106
  6. package/dist/config/migrator/recommendation/htmlBuilder.js +53 -52
  7. package/dist/config/migrator/recommendation/settingsMapper.js +38 -33
  8. package/dist/enums/html-validator.js +6 -5
  9. package/dist/extensions/Blocks/Items/block.js +48 -29
  10. package/dist/extensions/Blocks/Items/utils/nodeConfigUtils.js +62 -45
  11. package/dist/extensions/Blocks/Recommendation/block.js +64 -42
  12. package/dist/extensions/Blocks/Recommendation/canvasPreview.css.js +16 -0
  13. package/dist/extensions/Blocks/Recommendation/constants/defaultConfig.js +41 -32
  14. package/dist/extensions/Blocks/Recommendation/controls/cardComposition/index.js +461 -363
  15. package/dist/extensions/Blocks/Recommendation/controls/main/algorithm.js +33 -25
  16. package/dist/extensions/Blocks/Recommendation/controls/main/index.js +99 -87
  17. package/dist/extensions/Blocks/Recommendation/controls/main/pricePlacement.js +133 -0
  18. package/dist/extensions/Blocks/Recommendation/controls/main/utils.js +162 -160
  19. package/dist/extensions/Blocks/Recommendation/extension.js +30 -29
  20. package/dist/extensions/Blocks/Recommendation/iconsRegistry.js +21 -7
  21. package/dist/extensions/Blocks/Recommendation/recommendation.css.js +126 -8
  22. package/dist/extensions/Blocks/Recommendation/store/recommendation.js +3 -1
  23. package/dist/extensions/Blocks/Recommendation/templates/grid/elementRenderer.js +130 -96
  24. package/dist/extensions/Blocks/Recommendation/templates/grid/template.js +43 -54
  25. package/dist/extensions/Blocks/Recommendation/templates/index.js +17 -14
  26. package/dist/extensions/Blocks/Recommendation/templates/list/elementRenderer.js +86 -80
  27. package/dist/extensions/Blocks/Recommendation/templates/list/template.js +30 -39
  28. package/dist/extensions/Blocks/Recommendation/templates/utils.js +155 -102
  29. package/dist/extensions/Blocks/common-control.js +58 -45
  30. package/dist/extensions/Blocks/controlFactories.js +76 -57
  31. package/dist/src/@types/config/schemas.d.ts +16 -0
  32. package/dist/src/composables/useConfig.d.ts +4 -0
  33. package/dist/src/composables/useRecommendationPreview.d.ts +10 -0
  34. package/dist/src/config/migrator/recommendation/settingsMapper.d.ts +1 -1
  35. package/dist/src/extensions/Blocks/CouponBlock/controls/index.d.ts +1 -1
  36. package/dist/src/extensions/Blocks/Items/block.d.ts +8 -0
  37. package/dist/src/extensions/Blocks/Items/controls/index.d.ts +3 -3
  38. package/dist/src/extensions/Blocks/Items/utils/nodeConfigUtils.d.ts +1 -1
  39. package/dist/src/extensions/Blocks/Recommendation/block.d.ts +10 -0
  40. package/dist/src/extensions/Blocks/Recommendation/controls/cardComposition/index.d.ts +29 -3
  41. package/dist/src/extensions/Blocks/Recommendation/controls/index.d.ts +1 -1
  42. package/dist/src/extensions/Blocks/Recommendation/controls/main/algorithm.d.ts +2 -1
  43. package/dist/src/extensions/Blocks/Recommendation/controls/main/index.d.ts +3 -1
  44. package/dist/src/extensions/Blocks/Recommendation/controls/main/pricePlacement.d.ts +59 -0
  45. package/dist/src/extensions/Blocks/Recommendation/controls/name/index.d.ts +1 -1
  46. package/dist/src/extensions/Blocks/Recommendation/controls/oldPrice/index.d.ts +1 -1
  47. package/dist/src/extensions/Blocks/Recommendation/controls/omnibusDiscount/index.d.ts +1 -1
  48. package/dist/src/extensions/Blocks/Recommendation/controls/omnibusPrice/index.d.ts +1 -1
  49. package/dist/src/extensions/Blocks/Recommendation/controls/price/index.d.ts +1 -1
  50. package/dist/src/extensions/Blocks/Recommendation/store/recommendation.d.ts +2 -0
  51. package/dist/src/extensions/Blocks/Recommendation/templates/grid/elementRenderer.d.ts +13 -1
  52. package/dist/src/extensions/Blocks/Recommendation/templates/grid/template.d.ts +4 -4
  53. package/dist/src/extensions/Blocks/Recommendation/templates/index.d.ts +1 -1
  54. package/dist/src/extensions/Blocks/Recommendation/templates/list/elementRenderer.d.ts +10 -1
  55. package/dist/src/extensions/Blocks/Recommendation/templates/list/template.d.ts +3 -3
  56. package/dist/src/extensions/Blocks/Recommendation/templates/utils.d.ts +51 -1
  57. package/dist/src/extensions/Blocks/Recommendation/types/nodeConfig.d.ts +15 -0
  58. package/dist/src/extensions/Blocks/common-control.d.ts +7 -0
  59. package/dist/src/extensions/Blocks/controlFactories.d.ts +10 -1
  60. package/dist/src/stores/config.d.ts +36 -0
  61. package/package.json +1 -1
@@ -72,11 +72,11 @@ export declare const OldPriceControls: {
72
72
  new (): {
73
73
  getId(): string;
74
74
  getTargetNodes(root: import("@stripoinc/ui-editor-extensions").ImmutableHtmlNode): import("@stripoinc/ui-editor-extensions").ImmutableHtmlNode[];
75
+ getAdditionalModifications(root: import("@stripoinc/ui-editor-extensions").ImmutableHtmlNode): import("@stripoinc/ui-editor-extensions").TemplateModifier<import("@stripoinc/ui-editor-extensions").HtmlNodeModifier, import("@stripoinc/ui-editor-extensions").CssNodeModifier> | undefined;
75
76
  getParentControlId(): string;
76
77
  api: import("@stripoinc/ui-editor-extensions").ControlApi;
77
78
  getLabels(): import("@stripoinc/ui-editor-extensions").ControlLabels | undefined;
78
79
  getModificationDescription(): import("@stripoinc/ui-editor-extensions").ModificationDescription | undefined;
79
- getAdditionalModifications(_root: import("@stripoinc/ui-editor-extensions").ImmutableHtmlNode): import("@stripoinc/ui-editor-extensions").TemplateModifier<import("@stripoinc/ui-editor-extensions").HtmlNodeModifier, import("@stripoinc/ui-editor-extensions").CssNodeModifier> | undefined;
80
80
  isVisible(_node: import("@stripoinc/ui-editor-extensions").ImmutableHtmlNode): boolean;
81
81
  };
82
82
  };
@@ -75,11 +75,11 @@ export declare const OmnibusDiscountControls: {
75
75
  new (): {
76
76
  getId(): string;
77
77
  getTargetNodes(root: import("@stripoinc/ui-editor-extensions").ImmutableHtmlNode): import("@stripoinc/ui-editor-extensions").ImmutableHtmlNode[];
78
+ getAdditionalModifications(root: import("@stripoinc/ui-editor-extensions").ImmutableHtmlNode): import("@stripoinc/ui-editor-extensions").TemplateModifier<import("@stripoinc/ui-editor-extensions").HtmlNodeModifier, import("@stripoinc/ui-editor-extensions").CssNodeModifier> | undefined;
78
79
  getParentControlId(): string;
79
80
  api: import("@stripoinc/ui-editor-extensions").ControlApi;
80
81
  getLabels(): import("@stripoinc/ui-editor-extensions").ControlLabels | undefined;
81
82
  getModificationDescription(): import("@stripoinc/ui-editor-extensions").ModificationDescription | undefined;
82
- getAdditionalModifications(_root: import("@stripoinc/ui-editor-extensions").ImmutableHtmlNode): import("@stripoinc/ui-editor-extensions").TemplateModifier<import("@stripoinc/ui-editor-extensions").HtmlNodeModifier, import("@stripoinc/ui-editor-extensions").CssNodeModifier> | undefined;
83
83
  isVisible(_node: import("@stripoinc/ui-editor-extensions").ImmutableHtmlNode): boolean;
84
84
  };
85
85
  };
@@ -75,11 +75,11 @@ export declare const OmnibusPriceControls: {
75
75
  new (): {
76
76
  getId(): string;
77
77
  getTargetNodes(root: import("@stripoinc/ui-editor-extensions").ImmutableHtmlNode): import("@stripoinc/ui-editor-extensions").ImmutableHtmlNode[];
78
+ getAdditionalModifications(root: import("@stripoinc/ui-editor-extensions").ImmutableHtmlNode): import("@stripoinc/ui-editor-extensions").TemplateModifier<import("@stripoinc/ui-editor-extensions").HtmlNodeModifier, import("@stripoinc/ui-editor-extensions").CssNodeModifier> | undefined;
78
79
  getParentControlId(): string;
79
80
  api: import("@stripoinc/ui-editor-extensions").ControlApi;
80
81
  getLabels(): import("@stripoinc/ui-editor-extensions").ControlLabels | undefined;
81
82
  getModificationDescription(): import("@stripoinc/ui-editor-extensions").ModificationDescription | undefined;
82
- getAdditionalModifications(_root: import("@stripoinc/ui-editor-extensions").ImmutableHtmlNode): import("@stripoinc/ui-editor-extensions").TemplateModifier<import("@stripoinc/ui-editor-extensions").HtmlNodeModifier, import("@stripoinc/ui-editor-extensions").CssNodeModifier> | undefined;
83
83
  isVisible(_node: import("@stripoinc/ui-editor-extensions").ImmutableHtmlNode): boolean;
84
84
  };
85
85
  };
@@ -72,11 +72,11 @@ export declare const PriceControls: {
72
72
  new (): {
73
73
  getId(): string;
74
74
  getTargetNodes(root: import("@stripoinc/ui-editor-extensions").ImmutableHtmlNode): import("@stripoinc/ui-editor-extensions").ImmutableHtmlNode[];
75
+ getAdditionalModifications(root: import("@stripoinc/ui-editor-extensions").ImmutableHtmlNode): import("@stripoinc/ui-editor-extensions").TemplateModifier<import("@stripoinc/ui-editor-extensions").HtmlNodeModifier, import("@stripoinc/ui-editor-extensions").CssNodeModifier> | undefined;
75
76
  getParentControlId(): string;
76
77
  api: import("@stripoinc/ui-editor-extensions").ControlApi;
77
78
  getLabels(): import("@stripoinc/ui-editor-extensions").ControlLabels | undefined;
78
79
  getModificationDescription(): import("@stripoinc/ui-editor-extensions").ModificationDescription | undefined;
79
- getAdditionalModifications(_root: import("@stripoinc/ui-editor-extensions").ImmutableHtmlNode): import("@stripoinc/ui-editor-extensions").TemplateModifier<import("@stripoinc/ui-editor-extensions").HtmlNodeModifier, import("@stripoinc/ui-editor-extensions").CssNodeModifier> | undefined;
80
80
  isVisible(_node: import("@stripoinc/ui-editor-extensions").ImmutableHtmlNode): boolean;
81
81
  };
82
82
  };
@@ -25,6 +25,8 @@ export interface PerBlockConfigs {
25
25
  unresponsive: boolean;
26
26
  size: string;
27
27
  customAttributes: string[];
28
+ priceMovedToNextLine: boolean;
29
+ priceHideIfSameAsDiscounted: boolean;
28
30
  }
29
31
  interface PerBlockState {
30
32
  recommendationConfigs: PerBlockConfigs;
@@ -1,4 +1,5 @@
1
- import { type ElementRenderer } from '../utils';
1
+ import type { RecommendationProduct } from '@@/Types/recommendation';
2
+ import { type ElementRenderer, type CellRenderOptions } from '../utils';
2
3
  /**
3
4
  * Grid element renderer
4
5
  * Each element returns a `<td>` containing a nested table structure:
@@ -24,4 +25,15 @@ export declare const ATTRIBUTE_CELL_CLASS = "attribute-cell";
24
25
  * card-composition control so both render identical filler markup.
25
26
  */
26
27
  export declare function buildFillerCell(columnWidth: string, padding?: string): string;
28
+ /**
29
+ * Renders the inline price cell used when "Move to next line" is OFF: the sale
30
+ * price and original price sit side by side in a single attribute cell, each
31
+ * keeping its own `esd-extension-block-id` + `product-*` class so the per-element
32
+ * style controls and the compiler keep working.
33
+ *
34
+ * `originalFirst` preserves the card-composition order (original before sale when
35
+ * `productOldPrice` precedes `productPrice` in the composition) so the side-by-side
36
+ * order matches the stacked order.
37
+ */
38
+ export declare function renderInlineGridPriceCell(product: RecommendationProduct, originalFirst?: boolean, priceOptions?: CellRenderOptions, oldPriceOptions?: CellRenderOptions, cardBackgroundColor?: string): string;
27
39
  export declare const gridElementRenderer: ElementRenderer;
@@ -1,5 +1,5 @@
1
1
  import type { FiltersResponse, RecommendationProduct } from '@@/Types/recommendation';
2
- import { type ElementRenderer, type RenderOptions } from '../utils';
2
+ import { type ElementRenderer, type PricePlacementFlags, type RenderOptions } from '../utils';
3
3
  /**
4
4
  * Generates attribute-aligned product rows for grid layout.
5
5
  * Creates rows where each row contains one attribute type from all products.
@@ -9,7 +9,7 @@ import { type ElementRenderer, type RenderOptions } from '../utils';
9
9
  * @param composition - Array defining order of card elements
10
10
  * @returns HTML string for attribute-aligned rows
11
11
  */
12
- export declare function prepareGridAttributeRows(products: RecommendationProduct[], productsPerRow: number, elementRenderer: ElementRenderer, composition?: string[], filterList?: FiltersResponse, renderOptions?: RenderOptions): string;
12
+ export declare function prepareGridAttributeRows(products: RecommendationProduct[], productsPerRow: number, elementRenderer: ElementRenderer, composition?: string[], filterList?: FiltersResponse, renderOptions?: RenderOptions & PricePlacementFlags): string;
13
13
  /**
14
14
  * Prepares grid product rows with attribute-aligned structure
15
15
  * Groups products into rows, then generates attribute-aligned HTML for each group
@@ -19,7 +19,7 @@ export declare function prepareGridAttributeRows(products: RecommendationProduct
19
19
  * @param composition - Array defining order of card elements
20
20
  * @returns HTML string for all product rows
21
21
  */
22
- export declare function prepareGridProductRows(products: RecommendationProduct[], productsPerRow: number, elementRenderer: ElementRenderer, composition?: string[], filterList?: FiltersResponse, renderOptions?: RenderOptions): string;
22
+ export declare function prepareGridProductRows(products: RecommendationProduct[], productsPerRow: number, elementRenderer: ElementRenderer, composition?: string[], filterList?: FiltersResponse, renderOptions?: RenderOptions & PricePlacementFlags): string;
23
23
  /**
24
24
  * Prepares grid product rows with attribute-aligned structure.
25
25
  * Uses row-based rendering where each attribute type forms a single row across all products.
@@ -28,6 +28,6 @@ export declare function prepareGridProductRows(products: RecommendationProduct[]
28
28
  * @param composition - Array defining element order
29
29
  * @returns HTML string for product rows
30
30
  */
31
- export declare function prepareProductRows(products: RecommendationProduct[], productsPerRow: number, composition?: string[], filterList?: FiltersResponse, renderOptions?: RenderOptions): string;
31
+ export declare function prepareProductRows(products: RecommendationProduct[], productsPerRow: number, composition?: string[], filterList?: FiltersResponse, renderOptions?: RenderOptions & PricePlacementFlags): string;
32
32
  export declare function getDefaultTemplate(recommendationId?: number): string;
33
33
  export declare function generateBlockTemplate(products: RecommendationProduct[], productsPerRow: number, title?: string, composition?: string[], mobileProductsPerRow?: number): string;
@@ -6,7 +6,7 @@
6
6
  */
7
7
  import type { RecommendationProduct } from '@@/Types/recommendation';
8
8
  import { type Orientation, type PrepareProductRowsOptions } from './utils';
9
- export { DEFAULTS, DEFAULT_CARD_COMPOSITION, DEFAULT_CARD_VISIBILITY, getDefaultProducts, spacer, sanitizeImageUrl, createBlockTemplate, toDisplayableAttributeValue, type Orientation, type PrepareProductRowsOptions, type ElementRenderer, type ProductCardGetter, type AttributeStyleTemplate, type AttributeStyleTemplates, type CellBackgroundColors, type CellAlignments, type CellClasses, type OmnibusTexts, } from './utils';
9
+ export { DEFAULTS, DEFAULT_CARD_COMPOSITION, DEFAULT_CARD_VISIBILITY, getDefaultProducts, isSamePrice, spacer, sanitizeImageUrl, createBlockTemplate, toDisplayableAttributeValue, type Orientation, type PrepareProductRowsOptions, type ElementRenderer, type ProductCardGetter, type AttributeStyleTemplate, type AttributeStyleTemplates, type CellBackgroundColors, type CellAlignments, type CellClasses, type OmnibusTexts, } from './utils';
10
10
  /**
11
11
  * Unified function to prepare product rows for any layout.
12
12
  * Delegates to the appropriate layout-specific implementation.
@@ -1,8 +1,17 @@
1
- import { type ElementRenderer } from '../utils';
1
+ import type { RecommendationProduct } from '@@/Types/recommendation';
2
+ import { type ElementRenderer, type CellRenderOptions } from '../utils';
2
3
  /**
3
4
  * List element renderer
4
5
  * - Image and Button return `<td>` cells for the 3-column layout
5
6
  * - Name and Prices return `<tr><td>` rows for the info cell table
6
7
  * All elements have esd-block-* classes for Stripo selection
7
8
  */
9
+ /**
10
+ * Inline price info row used when "Move to next line" is OFF: the sale price and
11
+ * original price sit in two cells of one row. Each keeps its block id + class so
12
+ * style controls and the compiler keep working. `originalFirst` preserves the
13
+ * card-composition order (original before sale by default) so it matches the
14
+ * stacked order.
15
+ */
16
+ export declare function renderInlineListPriceRow(product: RecommendationProduct, originalFirst?: boolean, priceOptions?: CellRenderOptions, oldPriceOptions?: CellRenderOptions): string;
8
17
  export declare const listElementRenderer: ElementRenderer;
@@ -1,5 +1,5 @@
1
1
  import type { FiltersResponse, RecommendationProduct } from '@@/Types/recommendation';
2
- import { type RenderOptions } from '../utils';
2
+ import { type PricePlacementFlags, type RenderOptions } from '../utils';
3
3
  /**
4
4
  * Generates a list product card with 3-column layout
5
5
  * Uses buildElementRenderer to render Image, Info content, and Button
@@ -12,7 +12,7 @@ import { type RenderOptions } from '../utils';
12
12
  * @param composition - Array defining order of card elements
13
13
  * @returns HTML string for a single product card row
14
14
  */
15
- export declare function getListProductCard(product: RecommendationProduct, composition?: string[], filterList?: FiltersResponse, renderOptions?: RenderOptions): string;
15
+ export declare function getListProductCard(product: RecommendationProduct, composition?: string[], filterList?: FiltersResponse, renderOptions?: RenderOptions & PricePlacementFlags): string;
16
16
  /**
17
17
  * Prepares list product rows
18
18
  * Each product is a full-width row with 3-column layout
@@ -20,6 +20,6 @@ export declare function getListProductCard(product: RecommendationProduct, compo
20
20
  * @param composition - Array defining order of card elements
21
21
  * @returns HTML string for product rows
22
22
  */
23
- export declare function prepareProductRows(products: RecommendationProduct[], composition?: string[], filterList?: FiltersResponse, renderOptions?: RenderOptions): string;
23
+ export declare function prepareProductRows(products: RecommendationProduct[], composition?: string[], filterList?: FiltersResponse, renderOptions?: RenderOptions & PricePlacementFlags): string;
24
24
  export declare function getDefaultTemplate(): string;
25
25
  export declare function generateBlockTemplate(products: RecommendationProduct[], title?: string, composition?: string[]): string;
@@ -1,10 +1,39 @@
1
+ import type { CurrencyConfig } from '../types/nodeConfig';
1
2
  import type { FiltersResponse, RecommendationProduct } from '@@/Types/recommendation';
2
3
  import { 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 '../constants';
4
+ type PriceKey = 'price' | 'original_price' | 'discount';
5
+ /**
6
+ * Current currency configuration from the store, in CurrencyConfig shape.
7
+ */
8
+ export declare function getCurrentCurrencyConfig(): CurrencyConfig;
9
+ /**
10
+ * Formats a product price using current currency settings. Falls back to the
11
+ * first available currency, then 0, when the active currency has no value.
12
+ */
13
+ export declare function formatProductPrice(product: RecommendationProduct, priceKey?: PriceKey): string;
14
+ /**
15
+ * True when the formatted sale price equals the formatted original price.
16
+ * Mirrors the email-service / preview hide-if-same comparison semantics
17
+ * (formatted-string equality, same currency fallback chain).
18
+ */
19
+ export declare function isSamePrice(product: RecommendationProduct): boolean;
3
20
  /**
4
21
  * Converts a snake_case attribute name to Title Case display name.
5
22
  * e.g., "rating_star" → "Rating Star"
6
23
  */
7
24
  export declare function toDisplayName(attrName: string): string;
25
+ /**
26
+ * Resolves the inline (side-by-side) price layout from the composition order so
27
+ * it matches the stacked order. `anchor` is whichever of price / original price
28
+ * comes first in the composition (the merged cell renders there); `skip` is the
29
+ * other (dropped, since it's merged in); `originalFirst` puts the original price
30
+ * on the left when it precedes the sale price (the default composition order).
31
+ */
32
+ export declare function resolveInlinePriceOrder(composition: string[]): {
33
+ originalFirst: boolean;
34
+ anchor: string;
35
+ skip: string;
36
+ };
8
37
  /**
9
38
  * Reduces a raw product-attribute value to a displayable scalar string.
10
39
  * Array-type attributes (filter types `Strings`/`Numbers`) are substituted with
@@ -150,10 +179,24 @@ export interface RenderOptions {
150
179
  /** Per-attribute visibility (show/hide) re-applied across regeneration; falls back to defaults. */
151
180
  visibility?: AttributeVisibility;
152
181
  }
182
+ /**
183
+ * Builds the per-attribute `CellRenderOptions` for one composition key from the block-level
184
+ * `RenderOptions`. Single source for both the stacked per-cell options and the two inline
185
+ * (price + old-price) option sets, so style capture → re-bake stays consistent across layouts.
186
+ */
187
+ export declare function buildCellOptions(attrType: string, renderOptions: RenderOptions): CellRenderOptions;
153
188
  /**
154
189
  * Options for prepareProductRows unified function
155
190
  */
156
- export interface PrepareProductRowsOptions extends RenderOptions {
191
+ /**
192
+ * Block-level price placement flags threaded into the row builders.
193
+ * - `priceInline`: render sale + original price on one line (skip the standalone
194
+ * original-price row).
195
+ */
196
+ export interface PricePlacementFlags {
197
+ priceInline?: boolean;
198
+ }
199
+ export interface PrepareProductRowsOptions extends PricePlacementFlags, RenderOptions {
157
200
  /** Number of products per row (only for grid layout, defaults to 3) */
158
201
  productsPerRow?: number;
159
202
  /** Number of products per row on mobile (only for grid layout, defaults to 1) */
@@ -223,6 +266,12 @@ export declare function renderStyledParagraph(text: string, defaults: {
223
266
  * base style. Returns '' when there is nothing to set.
224
267
  */
225
268
  export declare function resolveSegmentBgStyle(baseStyle: string, cardBackgroundColor?: string): string;
269
+ /**
270
+ * The ` background-color: …;` CSS fragment for a captured "Block Background Color", or ''.
271
+ * Use this when merging into an existing `style="…"` attribute; use `cellBgStyleAttr` when the
272
+ * cell has no other inline style and needs the whole attribute.
273
+ */
274
+ export declare function bgColorFragment(color?: string): string;
226
275
  /**
227
276
  * Builds the ` style="background-color: …"` attribute for a text attribute's
228
277
  * `[esd-extension-block-id]` cell, baking in the captured "Block Background Color".
@@ -278,3 +327,4 @@ export declare function getDefaultProducts(count?: number): RecommendationProduc
278
327
  * @returns HTML template string with {-{-TITLE-}-}, {-{-PRODUCT_ROWS-}-}, and {-{-MOBILE_PRODUCT_ROWS-}-} (grid only) placeholders
279
328
  */
280
329
  export declare function createBlockTemplate(layout?: Orientation, instanceClass?: string): string;
330
+ export {};
@@ -152,6 +152,21 @@ export interface RecommendationNodeConfig {
152
152
  * Whether to trim long product names with ellipsis
153
153
  */
154
154
  textTrimming: boolean;
155
+ /**
156
+ * Whether the price and original price render on separate stacked lines.
157
+ * - true (default): each on its own attribute row (current Guido look)
158
+ * - false: both rendered inline on the same line, and Card Composition
159
+ * collapses them into a single "Product Prices" entry
160
+ * Ported from the legacy product block's `isPriceMovedToNextLine`.
161
+ */
162
+ priceMovedToNextLine: boolean;
163
+ /**
164
+ * Whether to hide the redundant original price when it equals the sale
165
+ * price (no real discount). Enforced in the real email via a liquid
166
+ * condition and mirrored in the editor on mock data.
167
+ * Ported from the legacy product block's `isPriceDeletedForZeroSale`.
168
+ */
169
+ priceHideIfSameAsDiscounted: boolean;
155
170
  /**
156
171
  * Configuration version for future migrations
157
172
  * Increment when making breaking changes to schema
@@ -6,6 +6,12 @@ interface TextInputProps {
6
6
  className?: string;
7
7
  disabled?: boolean;
8
8
  }
9
+ interface MultiSelectProps {
10
+ name: string;
11
+ placeholder?: string;
12
+ className?: string;
13
+ disabled?: boolean;
14
+ }
9
15
  interface LabelProps {
10
16
  text: string;
11
17
  name?: string;
@@ -145,5 +151,6 @@ export declare abstract class CommonControl extends Control {
145
151
  value: string;
146
152
  }[]): string;
147
153
  _GuCheckbox(name: string, caption: string): string;
154
+ _GuMultiSelect({ name, placeholder, className, disabled }: MultiSelectProps): string;
148
155
  }
149
156
  export {};
@@ -98,11 +98,20 @@ export declare function createTextBackgroundColorControl(controlId: string, targ
98
98
  new (): {
99
99
  getId(): string;
100
100
  getTargetNodes(root: ImmutableHtmlNode): ImmutableHtmlNode[];
101
+ /**
102
+ * Mirrors the picked background onto each target cell as an INLINE style.
103
+ *
104
+ * Stripo's built-in applies the background as a stylesheet rule, not inline. On
105
+ * regeneration we re-bake the captured color inline (cellBgStyleAttr); inline then
106
+ * outranks Stripo's rule in the cascade, so a later re-edit silently has no effect
107
+ * (SD-143023). Writing the inline here keeps it the single source of truth and in
108
+ * sync on every edit. Merged into the parent control's single patch (no extra apply).
109
+ */
110
+ getAdditionalModifications(root: ImmutableHtmlNode): import("@stripoinc/ui-editor-extensions").TemplateModifier<import("@stripoinc/ui-editor-extensions").HtmlNodeModifier, import("@stripoinc/ui-editor-extensions").CssNodeModifier> | undefined;
101
111
  getParentControlId(): string;
102
112
  api: import("@stripoinc/ui-editor-extensions").ControlApi;
103
113
  getLabels(): import("@stripoinc/ui-editor-extensions").ControlLabels | undefined;
104
114
  getModificationDescription(): import("@stripoinc/ui-editor-extensions").ModificationDescription | undefined;
105
- getAdditionalModifications(_root: ImmutableHtmlNode): import("@stripoinc/ui-editor-extensions").TemplateModifier<import("@stripoinc/ui-editor-extensions").HtmlNodeModifier, import("@stripoinc/ui-editor-extensions").CssNodeModifier> | undefined;
106
115
  isVisible(_node: ImmutableHtmlNode): boolean;
107
116
  };
108
117
  };
@@ -65,6 +65,8 @@ export declare const useConfigStore: import("pinia").StoreDefinition<"guido-conf
65
65
  blockType?: string | undefined;
66
66
  size?: string | number | undefined;
67
67
  verticalResponsiveness?: boolean | undefined;
68
+ isPriceMovedToNextLine?: boolean | undefined;
69
+ isPriceDeletedForZeroSale?: boolean | undefined;
68
70
  } & {
69
71
  [key: string]: unknown;
70
72
  };
@@ -197,6 +199,8 @@ export declare const useConfigStore: import("pinia").StoreDefinition<"guido-conf
197
199
  blockType?: string | undefined;
198
200
  size?: string | number | undefined;
199
201
  verticalResponsiveness?: boolean | undefined;
202
+ isPriceMovedToNextLine?: boolean | undefined;
203
+ isPriceDeletedForZeroSale?: boolean | undefined;
200
204
  } & {
201
205
  [key: string]: unknown;
202
206
  };
@@ -329,6 +333,8 @@ export declare const useConfigStore: import("pinia").StoreDefinition<"guido-conf
329
333
  blockType?: string | undefined;
330
334
  size?: string | number | undefined;
331
335
  verticalResponsiveness?: boolean | undefined;
336
+ isPriceMovedToNextLine?: boolean | undefined;
337
+ isPriceDeletedForZeroSale?: boolean | undefined;
332
338
  } & {
333
339
  [key: string]: unknown;
334
340
  };
@@ -461,6 +467,8 @@ export declare const useConfigStore: import("pinia").StoreDefinition<"guido-conf
461
467
  blockType?: string | undefined;
462
468
  size?: string | number | undefined;
463
469
  verticalResponsiveness?: boolean | undefined;
470
+ isPriceMovedToNextLine?: boolean | undefined;
471
+ isPriceDeletedForZeroSale?: boolean | undefined;
464
472
  } & {
465
473
  [key: string]: unknown;
466
474
  };
@@ -593,6 +601,8 @@ export declare const useConfigStore: import("pinia").StoreDefinition<"guido-conf
593
601
  blockType?: string | undefined;
594
602
  size?: string | number | undefined;
595
603
  verticalResponsiveness?: boolean | undefined;
604
+ isPriceMovedToNextLine?: boolean | undefined;
605
+ isPriceDeletedForZeroSale?: boolean | undefined;
596
606
  } & {
597
607
  [key: string]: unknown;
598
608
  };
@@ -725,6 +735,8 @@ export declare const useConfigStore: import("pinia").StoreDefinition<"guido-conf
725
735
  blockType?: string | undefined;
726
736
  size?: string | number | undefined;
727
737
  verticalResponsiveness?: boolean | undefined;
738
+ isPriceMovedToNextLine?: boolean | undefined;
739
+ isPriceDeletedForZeroSale?: boolean | undefined;
728
740
  } & {
729
741
  [key: string]: unknown;
730
742
  };
@@ -857,6 +869,8 @@ export declare const useConfigStore: import("pinia").StoreDefinition<"guido-conf
857
869
  blockType?: string | undefined;
858
870
  size?: string | number | undefined;
859
871
  verticalResponsiveness?: boolean | undefined;
872
+ isPriceMovedToNextLine?: boolean | undefined;
873
+ isPriceDeletedForZeroSale?: boolean | undefined;
860
874
  } & {
861
875
  [key: string]: unknown;
862
876
  };
@@ -989,6 +1003,8 @@ export declare const useConfigStore: import("pinia").StoreDefinition<"guido-conf
989
1003
  blockType?: string | undefined;
990
1004
  size?: string | number | undefined;
991
1005
  verticalResponsiveness?: boolean | undefined;
1006
+ isPriceMovedToNextLine?: boolean | undefined;
1007
+ isPriceDeletedForZeroSale?: boolean | undefined;
992
1008
  } & {
993
1009
  [key: string]: unknown;
994
1010
  };
@@ -1121,6 +1137,8 @@ export declare const useConfigStore: import("pinia").StoreDefinition<"guido-conf
1121
1137
  blockType?: string | undefined;
1122
1138
  size?: string | number | undefined;
1123
1139
  verticalResponsiveness?: boolean | undefined;
1140
+ isPriceMovedToNextLine?: boolean | undefined;
1141
+ isPriceDeletedForZeroSale?: boolean | undefined;
1124
1142
  } & {
1125
1143
  [key: string]: unknown;
1126
1144
  };
@@ -1253,6 +1271,8 @@ export declare const useConfigStore: import("pinia").StoreDefinition<"guido-conf
1253
1271
  blockType?: string | undefined;
1254
1272
  size?: string | number | undefined;
1255
1273
  verticalResponsiveness?: boolean | undefined;
1274
+ isPriceMovedToNextLine?: boolean | undefined;
1275
+ isPriceDeletedForZeroSale?: boolean | undefined;
1256
1276
  } & {
1257
1277
  [key: string]: unknown;
1258
1278
  };
@@ -1385,6 +1405,8 @@ export declare const useConfigStore: import("pinia").StoreDefinition<"guido-conf
1385
1405
  blockType?: string | undefined;
1386
1406
  size?: string | number | undefined;
1387
1407
  verticalResponsiveness?: boolean | undefined;
1408
+ isPriceMovedToNextLine?: boolean | undefined;
1409
+ isPriceDeletedForZeroSale?: boolean | undefined;
1388
1410
  } & {
1389
1411
  [key: string]: unknown;
1390
1412
  };
@@ -1517,6 +1539,8 @@ export declare const useConfigStore: import("pinia").StoreDefinition<"guido-conf
1517
1539
  blockType?: string | undefined;
1518
1540
  size?: string | number | undefined;
1519
1541
  verticalResponsiveness?: boolean | undefined;
1542
+ isPriceMovedToNextLine?: boolean | undefined;
1543
+ isPriceDeletedForZeroSale?: boolean | undefined;
1520
1544
  } & {
1521
1545
  [key: string]: unknown;
1522
1546
  };
@@ -1649,6 +1673,8 @@ export declare const useConfigStore: import("pinia").StoreDefinition<"guido-conf
1649
1673
  blockType?: string | undefined;
1650
1674
  size?: string | number | undefined;
1651
1675
  verticalResponsiveness?: boolean | undefined;
1676
+ isPriceMovedToNextLine?: boolean | undefined;
1677
+ isPriceDeletedForZeroSale?: boolean | undefined;
1652
1678
  } & {
1653
1679
  [key: string]: unknown;
1654
1680
  };
@@ -1781,6 +1807,8 @@ export declare const useConfigStore: import("pinia").StoreDefinition<"guido-conf
1781
1807
  blockType?: string | undefined;
1782
1808
  size?: string | number | undefined;
1783
1809
  verticalResponsiveness?: boolean | undefined;
1810
+ isPriceMovedToNextLine?: boolean | undefined;
1811
+ isPriceDeletedForZeroSale?: boolean | undefined;
1784
1812
  } & {
1785
1813
  [key: string]: unknown;
1786
1814
  };
@@ -1913,6 +1941,8 @@ export declare const useConfigStore: import("pinia").StoreDefinition<"guido-conf
1913
1941
  blockType?: string | undefined;
1914
1942
  size?: string | number | undefined;
1915
1943
  verticalResponsiveness?: boolean | undefined;
1944
+ isPriceMovedToNextLine?: boolean | undefined;
1945
+ isPriceDeletedForZeroSale?: boolean | undefined;
1916
1946
  } & {
1917
1947
  [key: string]: unknown;
1918
1948
  };
@@ -2045,6 +2075,8 @@ export declare const useConfigStore: import("pinia").StoreDefinition<"guido-conf
2045
2075
  blockType?: string | undefined;
2046
2076
  size?: string | number | undefined;
2047
2077
  verticalResponsiveness?: boolean | undefined;
2078
+ isPriceMovedToNextLine?: boolean | undefined;
2079
+ isPriceDeletedForZeroSale?: boolean | undefined;
2048
2080
  } & {
2049
2081
  [key: string]: unknown;
2050
2082
  };
@@ -2177,6 +2209,8 @@ export declare const useConfigStore: import("pinia").StoreDefinition<"guido-conf
2177
2209
  blockType?: string | undefined;
2178
2210
  size?: string | number | undefined;
2179
2211
  verticalResponsiveness?: boolean | undefined;
2212
+ isPriceMovedToNextLine?: boolean | undefined;
2213
+ isPriceDeletedForZeroSale?: boolean | undefined;
2180
2214
  } & {
2181
2215
  [key: string]: unknown;
2182
2216
  };
@@ -2309,6 +2343,8 @@ export declare const useConfigStore: import("pinia").StoreDefinition<"guido-conf
2309
2343
  blockType?: string | undefined;
2310
2344
  size?: string | number | undefined;
2311
2345
  verticalResponsiveness?: boolean | undefined;
2346
+ isPriceMovedToNextLine?: boolean | undefined;
2347
+ isPriceDeletedForZeroSale?: boolean | undefined;
2312
2348
  } & {
2313
2349
  [key: string]: unknown;
2314
2350
  };
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@useinsider/guido",
3
- "version": "3.8.2",
3
+ "version": "3.9.0-beta.10a70b8",
4
4
  "description": "Guido is a Vue + TypeScript wrapper for Email Plugin. Easily embed the email editor in your Vue applications.",
5
5
  "main": "./dist/guido.umd.cjs",
6
6
  "module": "./dist/library.js",