@useinsider/guido 2.2.0-beta.fa4cec8 → 3.0.0-beta.fd7cee3

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 (93) hide show
  1. package/README.md +41 -2
  2. package/dist/@types/config/schemas.js +1 -1
  3. package/dist/components/Guido.vue.js +1 -1
  4. package/dist/components/Guido.vue2.js +66 -66
  5. package/dist/components/organisms/base/Toaster.vue.js +4 -4
  6. package/dist/components/organisms/base/Toaster.vue2.js +12 -9
  7. package/dist/components/organisms/email-preview/desktop-preview/EmailSizeIndicator.vue.js +5 -5
  8. package/dist/components/organisms/email-preview/desktop-preview/EmailSizeIndicator.vue2.js +2 -2
  9. package/dist/components/organisms/extensions/recommendation/FilterItem.vue.js +11 -13
  10. package/dist/components/organisms/extensions/recommendation/FilterItem.vue2.js +54 -23
  11. package/dist/components/organisms/extensions/recommendation/FilterSelectionDrawer.vue.js +7 -5
  12. package/dist/components/organisms/extensions/recommendation/FilterSelectionDrawer.vue2.js +34 -21
  13. package/dist/components/organisms/extensions/recommendation/Filters.vue.js +11 -11
  14. package/dist/components/organisms/extensions/recommendation/Filters.vue2.js +48 -36
  15. package/dist/components/organisms/extensions/recommendation/LogicAdapter.vue2.js +11 -9
  16. package/dist/composables/useRecommendation.js +9 -9
  17. package/dist/composables/useSave.js +16 -12
  18. package/dist/composables/useStripo.js +66 -62
  19. package/dist/composables/useStripoEventHandler.js +27 -12
  20. package/dist/composables/useSyncModuleExtractor.js +45 -0
  21. package/dist/config/compiler/utils/recommendationCompilerUtils.js +1 -1
  22. package/dist/config/migrator/recommendationMigrator.js +1 -1
  23. package/dist/enums/unsubscribe.js +25 -21
  24. package/dist/extensions/Blocks/Recommendation/block.js +1 -1
  25. package/dist/extensions/Blocks/Recommendation/constants/defaultConfig.js +36 -33
  26. package/dist/extensions/Blocks/Recommendation/constants/layout.js +16 -14
  27. package/dist/extensions/Blocks/Recommendation/constants/selectors.js +15 -13
  28. package/dist/extensions/Blocks/Recommendation/controls/button/index.js +9 -9
  29. package/dist/extensions/Blocks/Recommendation/controls/image/index.js +1 -1
  30. package/dist/extensions/Blocks/Recommendation/controls/layout/index.js +41 -29
  31. package/dist/extensions/Blocks/Recommendation/controls/main/algorithm.js +16 -16
  32. package/dist/extensions/Blocks/Recommendation/controls/main/currency.js +30 -32
  33. package/dist/extensions/Blocks/Recommendation/controls/main/index.js +194 -104
  34. package/dist/extensions/Blocks/Recommendation/controls/main/locale.js +9 -9
  35. package/dist/extensions/Blocks/Recommendation/controls/main/productLayout.js +46 -38
  36. package/dist/extensions/Blocks/Recommendation/controls/main/shuffle.js +16 -16
  37. package/dist/extensions/Blocks/Recommendation/controls/main/utils.js +291 -217
  38. package/dist/extensions/Blocks/Recommendation/controls/mobileLayout/cssRules.js +14 -14
  39. package/dist/extensions/Blocks/Recommendation/controls/name/index.js +10 -10
  40. package/dist/extensions/Blocks/Recommendation/controls/name/textTrim.js +5 -5
  41. package/dist/extensions/Blocks/Recommendation/controls/oldPrice/index.js +14 -14
  42. package/dist/extensions/Blocks/Recommendation/controls/omnibusDiscount/index.js +9 -9
  43. package/dist/extensions/Blocks/Recommendation/controls/omnibusDiscount/textAfter.js +3 -3
  44. package/dist/extensions/Blocks/Recommendation/controls/omnibusDiscount/textBefore.js +1 -1
  45. package/dist/extensions/Blocks/Recommendation/controls/omnibusPrice/index.js +9 -9
  46. package/dist/extensions/Blocks/Recommendation/controls/omnibusPrice/textAfter.js +3 -3
  47. package/dist/extensions/Blocks/Recommendation/controls/omnibusPrice/textBefore.js +13 -13
  48. package/dist/extensions/Blocks/Recommendation/controls/price/index.js +3 -3
  49. package/dist/extensions/Blocks/Recommendation/controls/spacing/index.js +223 -99
  50. package/dist/extensions/Blocks/Recommendation/store/recommendation.js +172 -85
  51. package/dist/extensions/Blocks/Recommendation/templates/grid/elementRenderer.js +2 -2
  52. package/dist/extensions/Blocks/Recommendation/templates/grid/migration.js +1 -1
  53. package/dist/extensions/Blocks/Recommendation/templates/list/elementRenderer.js +2 -2
  54. package/dist/extensions/Blocks/Recommendation/templates/utils.js +32 -32
  55. package/dist/extensions/Blocks/Recommendation/utils/filterUtil.js +8 -8
  56. package/dist/extensions/Blocks/Recommendation/validation/filterSchema.js +29 -0
  57. package/dist/guido.css +1 -1
  58. package/dist/services/stripoApi.js +55 -19
  59. package/dist/src/@types/config/schemas.d.ts +1 -1
  60. package/dist/src/@types/events.d.ts +38 -2
  61. package/dist/src/components/Guido.vue.d.ts +2 -2
  62. package/dist/src/components/organisms/extensions/recommendation/FilterItem.vue.d.ts +1 -0
  63. package/dist/src/components/organisms/extensions/recommendation/Filters.vue.d.ts +17 -1
  64. package/dist/src/components/organisms/header/EditorActions.vue.d.ts +1 -1
  65. package/dist/src/components/organisms/header/HeaderWrapper.vue.d.ts +1 -1
  66. package/dist/src/components/organisms/header/RightSlot.vue.d.ts +1 -1
  67. package/dist/src/composables/useGuidoActions.d.ts +1 -1
  68. package/dist/src/composables/useSave.d.ts +2 -2
  69. package/dist/src/composables/useStripo.d.ts +2 -2
  70. package/dist/src/composables/useSyncModuleExtractor.d.ts +4 -0
  71. package/dist/src/enums/unsubscribe.d.ts +3 -0
  72. package/dist/src/extensions/Blocks/Recommendation/constants/defaultConfig.d.ts +6 -0
  73. package/dist/src/extensions/Blocks/Recommendation/constants/index.d.ts +3 -3
  74. package/dist/src/extensions/Blocks/Recommendation/constants/layout.d.ts +6 -2
  75. package/dist/src/extensions/Blocks/Recommendation/constants/selectors.d.ts +8 -1
  76. package/dist/src/extensions/Blocks/Recommendation/controls/main/index.d.ts +38 -10
  77. package/dist/src/extensions/Blocks/Recommendation/controls/main/utils.d.ts +27 -14
  78. package/dist/src/extensions/Blocks/Recommendation/controls/spacing/index.d.ts +50 -17
  79. package/dist/src/extensions/Blocks/Recommendation/store/recommendation.d.ts +19 -2
  80. package/dist/src/extensions/Blocks/Recommendation/templates/grid/migration.d.ts +1 -1
  81. package/dist/src/extensions/Blocks/Recommendation/templates/index.d.ts +4 -2
  82. package/dist/src/extensions/Blocks/Recommendation/templates/list/migration.d.ts +1 -1
  83. package/dist/src/extensions/Blocks/Recommendation/templates/utils.d.ts +1 -1
  84. package/dist/src/extensions/Blocks/Recommendation/types/nodeConfig.d.ts +8 -0
  85. package/dist/src/extensions/Blocks/Recommendation/validation/filterSchema.d.ts +15 -0
  86. package/dist/src/mock/api/settings.d.ts +2 -0
  87. package/dist/src/services/stripoApi.d.ts +5 -0
  88. package/dist/src/stores/editor.d.ts +23 -0
  89. package/dist/src/utils/templatePreparation.d.ts +1 -1
  90. package/dist/static/styles/customEditorStyle.css.js +50 -23
  91. package/dist/stores/editor.js +2 -1
  92. package/dist/utils/templatePreparation.js +1 -1
  93. package/package.json +2 -2
@@ -31,6 +31,8 @@ interface PerBlockState {
31
31
  filterGroup: number;
32
32
  /** Whether initial API data (filters, algorithms, products) has been fetched for this block */
33
33
  isInitialized: boolean;
34
+ /** Snapshot of filters taken when the drawer opens, used to revert on cancel */
35
+ filterSnapshot: Filter[] | null;
34
36
  }
35
37
  interface StoreState {
36
38
  recommendationCampaignUrls: Record<string, string>;
@@ -125,7 +127,9 @@ export declare const useRecommendationExtensionStore: import("pinia").StoreDefin
125
127
  configVersion: number;
126
128
  } & import("pinia").PiniaCustomStateProperties<StoreState>): number;
127
129
  hasFilters(): boolean;
130
+ hasValidFilters(): boolean;
128
131
  getFilterGroupCount(): number;
132
+ getUniqueFilterGroups(): number[];
129
133
  getActivePredictiveAlgorithms: (state: {
130
134
  recommendationCampaignUrls: Record<string, string>;
131
135
  activePredictiveAlgorithms: number[];
@@ -203,23 +207,36 @@ export declare const useRecommendationExtensionStore: import("pinia").StoreDefin
203
207
  patchCurrentBlockConfig(updates: Partial<PerBlockConfigs>, options?: {
204
208
  triggerRefetch?: boolean;
205
209
  }): void;
210
+ /**
211
+ * Creates a filter with the first available attribute and operator pre-selected.
212
+ */
213
+ createDefaultFilter(filterGroup: number, filterNumber: number): Filter;
206
214
  /**
207
215
  * Opens the filter selection drawer for the current block.
208
- * If no filters exist, initializes with a default empty filter
216
+ * Saves a snapshot of current filters for cancel/revert.
217
+ * If no filters exist, initializes with a default filter
209
218
  * so the user has a starting point for input.
210
219
  */
211
220
  openFilterDrawer(): void;
212
221
  /**
213
- * Closes the filter selection drawer for the current block
222
+ * Closes the filter selection drawer for the current block.
223
+ * Called after successful apply — discards the snapshot.
214
224
  */
215
225
  closeFilterDrawer(): void;
226
+ /**
227
+ * Cancels the filter selection drawer and reverts filters
228
+ * to the snapshot taken when the drawer was opened.
229
+ */
230
+ cancelFilterDrawer(): void;
216
231
  fetchRecommendationCreateData(): Promise<void>;
217
232
  fetchRecommendationFilters(): Promise<void>;
218
233
  addFilterGroup(filterGroup: number): void;
234
+ deleteFilterGroup(groupId: number): void;
219
235
  updateFilter(updatedFilter: Filter): void;
220
236
  deleteFilter(filter: Filter): void;
221
237
  addFilter(filter: Filter): void;
222
238
  generateFilterQuery(): string;
223
239
  fetchRecommendationProducts(): Promise<void>;
240
+ _doFetchProducts(): Promise<void>;
224
241
  }>;
225
242
  export {};
@@ -1,6 +1,6 @@
1
1
  import type { RecommendationProduct } from '@@/Types/recommendation';
2
2
  import { DEFAULTS, getDefaultProducts, DEFAULT_CARD_COMPOSITION, DEFAULT_CARD_VISIBILITY } from '../utils';
3
- declare const migrationTemplate = "\n <td\n align=\"left\"\n esd-extension-block-id=\"recommendation-block\"\n esd-handler-name=\"esd-extension-RecommendationBlock\"\n class=\"ins-recommendation-v3-block-v2 esd-block-recommendation-v3-block esd-extension-block es-p20\"\n >\n <table width=\"100%\" cellpadding=\"0\" cellspacing=\"0\" border=\"0\">\n <tr>\n <td align=\"center\">\n <table\n class=\"container\"\n width=\"100%\"\n cellpadding=\"0\"\n cellspacing=\"0\"\n border=\"0\">\n <tbody>\n <tr>\n <td>\n <table\n width=\"100%\"\n cellpadding=\"0\"\n cellspacing=\"0\"\n border=\"0\">\n <tbody>\n <tr>\n {-{-TITLE-}-}\n </tr>\n </tbody>\n </table>\n </td>\n </tr>\n <tr>\n <td class=\"spacer\" style=\"height: 20px;\"></td>\n </tr>\n <tr>\n <td>\n <table\n class=\"ins-recommendation-product-container\"\n width=\"100%\"\n cellpadding=\"0\"\n cellspacing=\"0\"\n border=\"0\"\n >\n {-{-PRODUCT_ROWS-}-}\n </table>\n </td>\n </tr>\n </tbody>\n </table>\n </td>\n </tr>\n </table>\n </td>\n";
3
+ declare const migrationTemplate = "\n <td\n align=\"left\"\n esd-extension-block-id=\"recommendation-block\"\n esd-handler-name=\"esd-extension-RecommendationBlock\"\n class=\"recommendation-block-v2 esd-block-recommendation-v3-block esd-extension-block es-p20\"\n >\n <table width=\"100%\" cellpadding=\"0\" cellspacing=\"0\" border=\"0\">\n <tr>\n <td align=\"center\">\n <table\n class=\"container\"\n width=\"100%\"\n cellpadding=\"0\"\n cellspacing=\"0\"\n border=\"0\">\n <tbody>\n <tr>\n <td>\n <table\n width=\"100%\"\n cellpadding=\"0\"\n cellspacing=\"0\"\n border=\"0\">\n <tbody>\n <tr>\n {-{-TITLE-}-}\n </tr>\n </tbody>\n </table>\n </td>\n </tr>\n <tr>\n <td class=\"spacer\" style=\"height: 20px;\"></td>\n </tr>\n <tr>\n <td>\n <table\n class=\"ins-recommendation-product-container\"\n width=\"100%\"\n cellpadding=\"0\"\n cellspacing=\"0\"\n border=\"0\"\n >\n {-{-PRODUCT_ROWS-}-}\n </table>\n </td>\n </tr>\n </tbody>\n </table>\n </td>\n </tr>\n </table>\n </td>\n";
4
4
  /**
5
5
  * Prepares migration product rows with attribute-aligned structure.
6
6
  * @param products - Array of products to display
@@ -24,14 +24,16 @@ export { DEFAULTS, DEFAULT_CARD_COMPOSITION, DEFAULT_CARD_VISIBILITY, getDefault
24
24
  export declare function prepareProductRows(products: RecommendationProduct[], layout: Orientation, options?: PrepareProductRowsOptions): string;
25
25
  /**
26
26
  * Generates the default template for a given layout.
27
- * Includes both desktop and mobile product containers for grid layouts.
27
+ * Grid layout includes both desktop and mobile product containers.
28
+ * List layout only populates the desktop container (list rows are responsive).
28
29
  * @param layout - The layout orientation ('list' or 'grid')
29
30
  * @returns Complete HTML template with default products
30
31
  */
31
32
  export declare function getDefaultTemplate(layout?: Orientation): string;
32
33
  /**
33
34
  * Generates a complete block template with custom products.
34
- * Includes both desktop and mobile product containers for grid layouts.
35
+ * Grid layout includes both desktop and mobile product containers.
36
+ * List layout only populates the desktop container (list rows are responsive).
35
37
  * @param products - Array of products to display
36
38
  * @param layout - The layout orientation ('list' or 'grid')
37
39
  * @param title - Title for the block
@@ -4,7 +4,7 @@ import { DEFAULTS, getDefaultProducts } from '../utils';
4
4
  * Migration template for list layout
5
5
  * Used when migrating old recommendation blocks to list format
6
6
  */
7
- declare const migrationTemplate = "\n <td\n align=\"left\"\n esd-extension-block-id=\"recommendation-block\"\n esd-handler-name=\"esd-extension-RecommendationBlock\"\n class=\"ins-recommendation-v3-block-v2 esd-block-recommendation-v3-block esd-extension-block es-p20\"\n data-layout=\"list\"\n >\n <table width=\"100%\" cellpadding=\"0\" cellspacing=\"0\" border=\"0\">\n <tr>\n <td align=\"center\">\n <table\n class=\"container\"\n width=\"100%\"\n cellpadding=\"0\"\n cellspacing=\"0\"\n border=\"0\">\n <tbody>\n <tr>\n <td>\n <table\n width=\"100%\"\n cellpadding=\"0\"\n cellspacing=\"0\"\n border=\"0\">\n <tbody>\n <tr>\n {-{-TITLE-}-}\n </tr>\n </tbody>\n </table>\n </td>\n </tr>\n <tr>\n <td class=\"spacer\" style=\"height: 20px;\"></td>\n </tr>\n <tr>\n <td>\n <table\n class=\"ins-recommendation-product-container\"\n width=\"100%\"\n cellpadding=\"0\"\n cellspacing=\"0\"\n border=\"0\"\n >\n {-{-PRODUCT_ROWS-}-}\n </table>\n </td>\n </tr>\n </tbody>\n </table>\n </td>\n </tr>\n </table>\n </td>\n";
7
+ declare const migrationTemplate = "\n <td\n align=\"left\"\n esd-extension-block-id=\"recommendation-block\"\n esd-handler-name=\"esd-extension-RecommendationBlock\"\n class=\"recommendation-block-v2 esd-block-recommendation-v3-block\n esd-extension-block es-p20 es-m-p0 ins-recommendation-list-layout\"\n data-layout=\"list\"\n >\n <table width=\"100%\" cellpadding=\"0\" cellspacing=\"0\" border=\"0\">\n <tr>\n <td align=\"center\">\n <table\n class=\"container\"\n width=\"100%\"\n cellpadding=\"0\"\n cellspacing=\"0\"\n border=\"0\">\n <tbody>\n <tr>\n <td>\n <table\n width=\"100%\"\n cellpadding=\"0\"\n cellspacing=\"0\"\n border=\"0\">\n <tbody>\n <tr>\n {-{-TITLE-}-}\n </tr>\n </tbody>\n </table>\n </td>\n </tr>\n <tr>\n <td class=\"spacer\" style=\"height: 20px;\"></td>\n </tr>\n <tr>\n <td>\n <table\n class=\"ins-recommendation-product-container\"\n width=\"100%\"\n cellpadding=\"0\"\n cellspacing=\"0\"\n border=\"0\"\n >\n {-{-PRODUCT_ROWS-}-}\n </table>\n </td>\n </tr>\n </tbody>\n </table>\n </td>\n </tr>\n </table>\n </td>\n";
8
8
  export declare function getMigrationTemplate(): string;
9
9
  /**
10
10
  * Generates a custom list migration template with specified products
@@ -61,6 +61,6 @@ export declare function getDefaultProducts(count?: number): RecommendationProduc
61
61
  * @param instanceClass - Optional instance-specific class (e.g., 'ins-recommendation-v3-block-1')
62
62
  * for CSS scoping per block instance. Must be included in the initial template HTML because
63
63
  * Stripo's Angular rendering manages the class attribute and overwrites dynamic setAttribute changes.
64
- * @returns HTML template string with {-{-TITLE-}-}, {-{-PRODUCT_ROWS-}-}, and {-{-MOBILE_PRODUCT_ROWS-}-} placeholders
64
+ * @returns HTML template string with {-{-TITLE-}-}, {-{-PRODUCT_ROWS-}-}, and {-{-MOBILE_PRODUCT_ROWS-}-} (grid only) placeholders
65
65
  */
66
66
  export declare function createBlockTemplate(layout?: Orientation, instanceClass?: string): string;
@@ -106,6 +106,14 @@ export interface RecommendationNodeConfig {
106
106
  * Vertical spacing between product rows in pixels
107
107
  */
108
108
  rowSpacing: number;
109
+ /**
110
+ * Horizontal spacing between product cards on mobile in pixels (grid layout only)
111
+ */
112
+ mobileColumnSpacing: number;
113
+ /**
114
+ * Vertical spacing between product rows on mobile in pixels
115
+ */
116
+ mobileRowSpacing: number;
109
117
  /**
110
118
  * Order of card elements from top to bottom
111
119
  * Array of ATTR_PRODUCT_* constants
@@ -0,0 +1,15 @@
1
+ import type { Filter } from '@@/Types/recommendation';
2
+ import * as v from 'valibot';
3
+ export declare const FilterSchema: v.ObjectSchema<{
4
+ readonly type: v.SchemaWithPipe<readonly [v.StringSchema<undefined>, v.MinLengthAction<string, 1, undefined>]>;
5
+ readonly attribute: v.SchemaWithPipe<readonly [v.StringSchema<undefined>, v.MinLengthAction<string, 1, undefined>]>;
6
+ readonly operator: v.SchemaWithPipe<readonly [v.StringSchema<undefined>, v.MinLengthAction<string, 1, undefined>]>;
7
+ readonly innerGroupOperator: v.SchemaWithPipe<readonly [v.StringSchema<undefined>, v.MinLengthAction<string, 1, undefined>]>;
8
+ readonly outerGroupOperator: v.SchemaWithPipe<readonly [v.StringSchema<undefined>, v.MinLengthAction<string, 1, undefined>]>;
9
+ readonly value: v.SchemaWithPipe<readonly [v.StringSchema<undefined>, v.MinLengthAction<string, 1, undefined>]>;
10
+ readonly filterGroup: v.NumberSchema<undefined>;
11
+ readonly filterNumber: v.NumberSchema<undefined>;
12
+ readonly isValid: v.BooleanSchema<undefined>;
13
+ }, undefined>;
14
+ export declare function isFilterValid(filter: Filter): boolean;
15
+ export declare function getInvalidFilterFields(filter: Filter): Set<string>;
@@ -0,0 +1,2 @@
1
+ declare const _default: import("msw").HttpHandler[];
2
+ export default _default;
@@ -1,3 +1,4 @@
1
+ import type { ModuleUpdatedParams, SyncModuleResponse, SyncModuleUnsubscribePayload } from '@@/Types/events';
1
2
  import type { CustomFont, Template } from '@@/Types/stripo';
2
3
  export declare const useStripoApi: () => {
3
4
  getToken: () => Promise<string>;
@@ -5,4 +6,8 @@ export declare const useStripoApi: () => {
5
6
  active: boolean;
6
7
  })[]>;
7
8
  getDefaultTemplate: () => Promise<Template>;
9
+ getSyncModulesStatus: () => Promise<boolean>;
10
+ updateSyncModule: (params: ModuleUpdatedParams) => Promise<boolean>;
11
+ getSyncModule: (moduleId: number) => Promise<SyncModuleResponse>;
12
+ setSyncModuleUnsubscriptionPages: (payload: SyncModuleUnsubscribePayload[]) => Promise<boolean>;
8
13
  };
@@ -8,6 +8,7 @@ export declare const useEditorStore: import("pinia").StoreDefinition<"guidoEdito
8
8
  hasChanges: boolean;
9
9
  isStripoInitialized: boolean;
10
10
  templateId: string;
11
+ syncModulesEnabled: boolean;
11
12
  }, {
12
13
  isEditorToolbarVisible: (state: {
13
14
  loadingStatus: boolean;
@@ -19,6 +20,7 @@ export declare const useEditorStore: import("pinia").StoreDefinition<"guidoEdito
19
20
  hasChanges: boolean;
20
21
  isStripoInitialized: boolean;
21
22
  templateId: string;
23
+ syncModulesEnabled: boolean;
22
24
  } & import("pinia").PiniaCustomStateProperties<{
23
25
  loadingStatus: boolean;
24
26
  isCodeEditorOpen: boolean;
@@ -29,6 +31,7 @@ export declare const useEditorStore: import("pinia").StoreDefinition<"guidoEdito
29
31
  hasChanges: boolean;
30
32
  isStripoInitialized: boolean;
31
33
  templateId: string;
34
+ syncModulesEnabled: boolean;
32
35
  }>) => boolean;
33
36
  isUndoButtonDisabled: (state: {
34
37
  loadingStatus: boolean;
@@ -40,6 +43,7 @@ export declare const useEditorStore: import("pinia").StoreDefinition<"guidoEdito
40
43
  hasChanges: boolean;
41
44
  isStripoInitialized: boolean;
42
45
  templateId: string;
46
+ syncModulesEnabled: boolean;
43
47
  } & import("pinia").PiniaCustomStateProperties<{
44
48
  loadingStatus: boolean;
45
49
  isCodeEditorOpen: boolean;
@@ -50,6 +54,7 @@ export declare const useEditorStore: import("pinia").StoreDefinition<"guidoEdito
50
54
  hasChanges: boolean;
51
55
  isStripoInitialized: boolean;
52
56
  templateId: string;
57
+ syncModulesEnabled: boolean;
53
58
  }>) => boolean;
54
59
  isRedoButtonDisabled: (state: {
55
60
  loadingStatus: boolean;
@@ -61,6 +66,7 @@ export declare const useEditorStore: import("pinia").StoreDefinition<"guidoEdito
61
66
  hasChanges: boolean;
62
67
  isStripoInitialized: boolean;
63
68
  templateId: string;
69
+ syncModulesEnabled: boolean;
64
70
  } & import("pinia").PiniaCustomStateProperties<{
65
71
  loadingStatus: boolean;
66
72
  isCodeEditorOpen: boolean;
@@ -71,6 +77,7 @@ export declare const useEditorStore: import("pinia").StoreDefinition<"guidoEdito
71
77
  hasChanges: boolean;
72
78
  isStripoInitialized: boolean;
73
79
  templateId: string;
80
+ syncModulesEnabled: boolean;
74
81
  }>) => boolean;
75
82
  isCodeEditorButtonDisabled: (state: {
76
83
  loadingStatus: boolean;
@@ -82,6 +89,7 @@ export declare const useEditorStore: import("pinia").StoreDefinition<"guidoEdito
82
89
  hasChanges: boolean;
83
90
  isStripoInitialized: boolean;
84
91
  templateId: string;
92
+ syncModulesEnabled: boolean;
85
93
  } & import("pinia").PiniaCustomStateProperties<{
86
94
  loadingStatus: boolean;
87
95
  isCodeEditorOpen: boolean;
@@ -92,6 +100,7 @@ export declare const useEditorStore: import("pinia").StoreDefinition<"guidoEdito
92
100
  hasChanges: boolean;
93
101
  isStripoInitialized: boolean;
94
102
  templateId: string;
103
+ syncModulesEnabled: boolean;
95
104
  }>) => boolean;
96
105
  isPreviewButtonDisabled: (state: {
97
106
  loadingStatus: boolean;
@@ -103,6 +112,7 @@ export declare const useEditorStore: import("pinia").StoreDefinition<"guidoEdito
103
112
  hasChanges: boolean;
104
113
  isStripoInitialized: boolean;
105
114
  templateId: string;
115
+ syncModulesEnabled: boolean;
106
116
  } & import("pinia").PiniaCustomStateProperties<{
107
117
  loadingStatus: boolean;
108
118
  isCodeEditorOpen: boolean;
@@ -113,6 +123,7 @@ export declare const useEditorStore: import("pinia").StoreDefinition<"guidoEdito
113
123
  hasChanges: boolean;
114
124
  isStripoInitialized: boolean;
115
125
  templateId: string;
126
+ syncModulesEnabled: boolean;
116
127
  }>) => boolean;
117
128
  isViewOptionsDisabled: (state: {
118
129
  loadingStatus: boolean;
@@ -124,6 +135,7 @@ export declare const useEditorStore: import("pinia").StoreDefinition<"guidoEdito
124
135
  hasChanges: boolean;
125
136
  isStripoInitialized: boolean;
126
137
  templateId: string;
138
+ syncModulesEnabled: boolean;
127
139
  } & import("pinia").PiniaCustomStateProperties<{
128
140
  loadingStatus: boolean;
129
141
  isCodeEditorOpen: boolean;
@@ -134,6 +146,7 @@ export declare const useEditorStore: import("pinia").StoreDefinition<"guidoEdito
134
146
  hasChanges: boolean;
135
147
  isStripoInitialized: boolean;
136
148
  templateId: string;
149
+ syncModulesEnabled: boolean;
137
150
  }>) => boolean;
138
151
  isVersionHistoryButtonDisabled: (state: {
139
152
  loadingStatus: boolean;
@@ -145,6 +158,7 @@ export declare const useEditorStore: import("pinia").StoreDefinition<"guidoEdito
145
158
  hasChanges: boolean;
146
159
  isStripoInitialized: boolean;
147
160
  templateId: string;
161
+ syncModulesEnabled: boolean;
148
162
  } & import("pinia").PiniaCustomStateProperties<{
149
163
  loadingStatus: boolean;
150
164
  isCodeEditorOpen: boolean;
@@ -155,6 +169,7 @@ export declare const useEditorStore: import("pinia").StoreDefinition<"guidoEdito
155
169
  hasChanges: boolean;
156
170
  isStripoInitialized: boolean;
157
171
  templateId: string;
172
+ syncModulesEnabled: boolean;
158
173
  }>) => boolean;
159
174
  isExportButtonDisabled: (state: {
160
175
  loadingStatus: boolean;
@@ -166,6 +181,7 @@ export declare const useEditorStore: import("pinia").StoreDefinition<"guidoEdito
166
181
  hasChanges: boolean;
167
182
  isStripoInitialized: boolean;
168
183
  templateId: string;
184
+ syncModulesEnabled: boolean;
169
185
  } & import("pinia").PiniaCustomStateProperties<{
170
186
  loadingStatus: boolean;
171
187
  isCodeEditorOpen: boolean;
@@ -176,6 +192,7 @@ export declare const useEditorStore: import("pinia").StoreDefinition<"guidoEdito
176
192
  hasChanges: boolean;
177
193
  isStripoInitialized: boolean;
178
194
  templateId: string;
195
+ syncModulesEnabled: boolean;
179
196
  }>) => boolean;
180
197
  isSaveAsButtonDisabled: (state: {
181
198
  loadingStatus: boolean;
@@ -187,6 +204,7 @@ export declare const useEditorStore: import("pinia").StoreDefinition<"guidoEdito
187
204
  hasChanges: boolean;
188
205
  isStripoInitialized: boolean;
189
206
  templateId: string;
207
+ syncModulesEnabled: boolean;
190
208
  } & import("pinia").PiniaCustomStateProperties<{
191
209
  loadingStatus: boolean;
192
210
  isCodeEditorOpen: boolean;
@@ -197,6 +215,7 @@ export declare const useEditorStore: import("pinia").StoreDefinition<"guidoEdito
197
215
  hasChanges: boolean;
198
216
  isStripoInitialized: boolean;
199
217
  templateId: string;
218
+ syncModulesEnabled: boolean;
200
219
  }>) => boolean;
201
220
  isTestButtonDisabled: (state: {
202
221
  loadingStatus: boolean;
@@ -208,6 +227,7 @@ export declare const useEditorStore: import("pinia").StoreDefinition<"guidoEdito
208
227
  hasChanges: boolean;
209
228
  isStripoInitialized: boolean;
210
229
  templateId: string;
230
+ syncModulesEnabled: boolean;
211
231
  } & import("pinia").PiniaCustomStateProperties<{
212
232
  loadingStatus: boolean;
213
233
  isCodeEditorOpen: boolean;
@@ -218,6 +238,7 @@ export declare const useEditorStore: import("pinia").StoreDefinition<"guidoEdito
218
238
  hasChanges: boolean;
219
239
  isStripoInitialized: boolean;
220
240
  templateId: string;
241
+ syncModulesEnabled: boolean;
221
242
  }>) => boolean;
222
243
  isSaveButtonDisabled: (state: {
223
244
  loadingStatus: boolean;
@@ -229,6 +250,7 @@ export declare const useEditorStore: import("pinia").StoreDefinition<"guidoEdito
229
250
  hasChanges: boolean;
230
251
  isStripoInitialized: boolean;
231
252
  templateId: string;
253
+ syncModulesEnabled: boolean;
232
254
  } & import("pinia").PiniaCustomStateProperties<{
233
255
  loadingStatus: boolean;
234
256
  isCodeEditorOpen: boolean;
@@ -239,5 +261,6 @@ export declare const useEditorStore: import("pinia").StoreDefinition<"guidoEdito
239
261
  hasChanges: boolean;
240
262
  isStripoInitialized: boolean;
241
263
  templateId: string;
264
+ syncModulesEnabled: boolean;
242
265
  }>) => boolean;
243
266
  }, {}>;
@@ -1,4 +1,4 @@
1
1
  import type { SavedTemplateDetails } from '@@/Types/stripo';
2
2
  export declare const useTemplatePreparation: () => {
3
- prepareTemplateDetails: () => Promise<SavedTemplateDetails>;
3
+ prepareTemplateDetails: () => Promise<Omit<SavedTemplateDetails, "metadata">>;
4
4
  };
@@ -20,30 +20,30 @@ const n = `.esd-x,
20
20
  }
21
21
  .ins-product-cart ue-node-actions,
22
22
  /* Horizontal layout - hide for info, image, and button cells */
23
- .ins-recommendation-v3-block-v2 .product-info-cell ue-node-actions,
24
- .ins-recommendation-v3-block-v2 .product-info-cell ue-node-panel,
25
- .ins-recommendation-v3-block-v2 .product-image-cell ue-node-actions,
26
- .ins-recommendation-v3-block-v2 .product-image-cell ue-node-panel,
27
- .ins-recommendation-v3-block-v2 .button-cell ue-node-actions,
28
- .ins-recommendation-v3-block-v2 .button-cell ue-node-panel,
23
+ .recommendation-block-v2 .product-info-cell ue-node-actions,
24
+ .recommendation-block-v2 .product-info-cell ue-node-panel,
25
+ .recommendation-block-v2 .product-image-cell ue-node-actions,
26
+ .recommendation-block-v2 .product-image-cell ue-node-panel,
27
+ .recommendation-block-v2 .button-cell ue-node-actions,
28
+ .recommendation-block-v2 .button-cell ue-node-panel,
29
29
  /* Vertical layout - hide for product-card-segment inner cells */
30
- .ins-recommendation-v3-block-v2 .product-card-segment ue-node-actions,
31
- .ins-recommendation-v3-block-v2 .product-card-segment ue-node-panel,
30
+ .recommendation-block-v2 .product-card-segment ue-node-actions,
31
+ .recommendation-block-v2 .product-card-segment ue-node-panel,
32
32
  /* Hide for specific product attribute cells in both layouts */
33
- .ins-recommendation-v3-block-v2 .product-image ue-node-actions,
34
- .ins-recommendation-v3-block-v2 .product-image ue-node-panel,
35
- .ins-recommendation-v3-block-v2 .product-name ue-node-actions,
36
- .ins-recommendation-v3-block-v2 .product-name ue-node-panel,
37
- .ins-recommendation-v3-block-v2 .product-price ue-node-actions,
38
- .ins-recommendation-v3-block-v2 .product-price ue-node-panel,
39
- .ins-recommendation-v3-block-v2 .product-old-price ue-node-actions,
40
- .ins-recommendation-v3-block-v2 .product-old-price ue-node-panel,
41
- .ins-recommendation-v3-block-v2 .product-omnibus-price ue-node-actions,
42
- .ins-recommendation-v3-block-v2 .product-omnibus-price ue-node-panel,
43
- .ins-recommendation-v3-block-v2 .product-omnibus-discount ue-node-actions,
44
- .ins-recommendation-v3-block-v2 .product-omnibus-discount ue-node-panel,
45
- .ins-recommendation-v3-block-v2 .product-button ue-node-actions,
46
- .ins-recommendation-v3-block-v2 .product-button ue-node-panel {
33
+ .recommendation-block-v2 .product-image ue-node-actions,
34
+ .recommendation-block-v2 .product-image ue-node-panel,
35
+ .recommendation-block-v2 .product-name ue-node-actions,
36
+ .recommendation-block-v2 .product-name ue-node-panel,
37
+ .recommendation-block-v2 .product-price ue-node-actions,
38
+ .recommendation-block-v2 .product-price ue-node-panel,
39
+ .recommendation-block-v2 .product-old-price ue-node-actions,
40
+ .recommendation-block-v2 .product-old-price ue-node-panel,
41
+ .recommendation-block-v2 .product-omnibus-price ue-node-actions,
42
+ .recommendation-block-v2 .product-omnibus-price ue-node-panel,
43
+ .recommendation-block-v2 .product-omnibus-discount ue-node-actions,
44
+ .recommendation-block-v2 .product-omnibus-discount ue-node-panel,
45
+ .recommendation-block-v2 .product-button ue-node-actions,
46
+ .recommendation-block-v2 .product-button ue-node-panel {
47
47
  display: none !important;
48
48
  }
49
49
 
@@ -52,7 +52,7 @@ const n = `.esd-x,
52
52
  display: none;
53
53
  }
54
54
 
55
- /* Mobile layout: when Stripo mobile mode is active, swap containers */
55
+ /* Mobile layout: when Stripo mobile mode is active, swap containers (grid layout only) */
56
56
  .ue-mobile-mode .ins-recommendation-desktop-container {
57
57
  display: none !important;
58
58
  }
@@ -60,6 +60,33 @@ const n = `.esd-x,
60
60
  .ue-mobile-mode .ins-recommendation-mobile-container {
61
61
  display: table !important;
62
62
  }
63
+
64
+ /* List layout: keep desktop container visible in mobile mode (list rows are inherently responsive)
65
+ Uses class selector instead of [data-layout="list"] for Gmail compatibility */
66
+ .ue-mobile-mode .ins-recommendation-list-layout .ins-recommendation-desktop-container {
67
+ display: table !important;
68
+ }
69
+
70
+ .ue-mobile-mode .ins-recommendation-list-layout .ins-recommendation-mobile-container {
71
+ display: none !important;
72
+ }
73
+
74
+ /* List layout mobile: reduce image and button width for better text readability */
75
+ .ue-mobile-mode .ins-recommendation-list-layout .product-image-cell {
76
+ width: 80px !important;
77
+ }
78
+
79
+ .ue-mobile-mode .ins-recommendation-list-layout .product-image-cell img {
80
+ max-width: 80px !important;
81
+ }
82
+
83
+ .ue-mobile-mode .ins-recommendation-list-layout .button-cell {
84
+ width: 80px !important;
85
+ }
86
+
87
+ .ue-mobile-mode .ins-recommendation-list-layout .product-info-cell {
88
+ padding: 5px 8px !important;
89
+ }
63
90
  `;
64
91
  export {
65
92
  n as default
@@ -9,7 +9,8 @@ const o = e("guidoEditor", {
9
9
  editorVisualMode: "desktop",
10
10
  hasChanges: !1,
11
11
  isStripoInitialized: !1,
12
- templateId: ""
12
+ templateId: "",
13
+ syncModulesEnabled: !1
13
14
  }),
14
15
  getters: {
15
16
  // Middle Slot
@@ -24,7 +24,7 @@ const E = () => {
24
24
  css: p,
25
25
  ampHtml: r,
26
26
  ampErrors: c,
27
- modules: u,
27
+ modules: u.map(Number),
28
28
  recommendation: {
29
29
  campaignUrls: b.recommendationCampaignUrls,
30
30
  configs: {}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@useinsider/guido",
3
- "version": "2.2.0-beta.fa4cec8",
3
+ "version": "3.0.0-beta.fd7cee3",
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",
@@ -32,7 +32,7 @@
32
32
  "license": "ISC",
33
33
  "dependencies": {
34
34
  "@stripoinc/ui-editor-extensions": "3.5.0",
35
- "@useinsider/design-system-vue": "0.14.20",
35
+ "@useinsider/design-system-vue": "0.14.28",
36
36
  "@vueuse/core": "11.3.0",
37
37
  "lodash-es": "4.17.21",
38
38
  "pinia": "2.3.1",