@useinsider/guido 2.1.0-beta.e13d291 → 2.1.0-beta.e2153c2

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 (138) hide show
  1. package/README.md +36 -0
  2. package/dist/@types/config/schemas.js +70 -65
  3. package/dist/components/Guido.vue.js +1 -1
  4. package/dist/components/Guido.vue2.js +69 -58
  5. package/dist/components/organisms/extensions/recommendation/FilterSelectionDrawer.vue2.js +15 -14
  6. package/dist/components/organisms/header/HeaderWrapper.vue.js +9 -9
  7. package/dist/components/organisms/unsubscribe/UnsubscribePageSelection.vue.js +1 -1
  8. package/dist/components/organisms/unsubscribe/UnsubscribePageSelection.vue2.js +19 -19
  9. package/dist/composables/useActionsApi.js +15 -13
  10. package/dist/composables/useBlocksConfig.js +26 -16
  11. package/dist/composables/useHtmlValidator.js +114 -104
  12. package/dist/composables/useRecommendation.js +54 -21
  13. package/dist/composables/useStripo.js +25 -23
  14. package/dist/composables/useVersionHistoryApi.js +1 -1
  15. package/dist/config/compiler/recommendationCompilerRules.js +45 -39
  16. package/dist/config/compiler/utils/recommendationCompilerUtils.js +121 -0
  17. package/dist/config/i18n/en/index.js +11 -0
  18. package/dist/config/i18n/en/labels.json.js +7 -0
  19. package/dist/config/i18n/en/toasters.json.js +56 -0
  20. package/dist/config/i18n/en/tooltips.json.js +82 -0
  21. package/dist/config/i18n/index.js +7 -0
  22. package/dist/config/migrator/itemsBlockMigrator.js +142 -120
  23. package/dist/enums/defaults.js +8 -4
  24. package/dist/enums/extensions/recommendationBlock.js +1 -1
  25. package/dist/enums/recommendation.js +16 -15
  26. package/dist/extensions/Blocks/Items/block.js +19 -28
  27. package/dist/extensions/Blocks/Items/controls/button/link.js +19 -31
  28. package/dist/extensions/Blocks/Items/controls/cardComposition.js +124 -85
  29. package/dist/extensions/Blocks/Items/controls/image/link.js +19 -31
  30. package/dist/extensions/Blocks/Items/controls/name/trimming.js +28 -40
  31. package/dist/extensions/Blocks/Items/controls/price/currencyLocation.js +35 -47
  32. package/dist/extensions/Blocks/Items/controls/price/currencySymbol.js +49 -54
  33. package/dist/extensions/Blocks/Items/controls/price/formattedPrice.js +42 -51
  34. package/dist/extensions/Blocks/Items/controls/price/hideDiscount.js +23 -36
  35. package/dist/extensions/Blocks/Items/controls/price/priceOrientation.js +45 -57
  36. package/dist/extensions/Blocks/Items/controls/price/singlePrice.js +42 -60
  37. package/dist/extensions/Blocks/Items/controls/settingsControl.js +189 -196
  38. package/dist/extensions/Blocks/Items/enums/settingsEnums.js +0 -2
  39. package/dist/extensions/Blocks/Items/extension.js +8 -9
  40. package/dist/extensions/Blocks/Items/settingsPanel.js +10 -15
  41. package/dist/extensions/Blocks/Items/template.js +181 -175
  42. package/dist/extensions/Blocks/Items/utils/nodeConfigUtils.js +65 -65
  43. package/dist/extensions/Blocks/Recommendation/block.js +117 -27
  44. package/dist/extensions/Blocks/Recommendation/constants/defaultConfig.js +33 -31
  45. package/dist/extensions/Blocks/Recommendation/constants/layout.js +6 -4
  46. package/dist/extensions/Blocks/Recommendation/constants/selectors.js +12 -10
  47. package/dist/extensions/Blocks/Recommendation/controls/layout/index.js +10 -14
  48. package/dist/extensions/Blocks/Recommendation/controls/main/algorithm.js +19 -27
  49. package/dist/extensions/Blocks/Recommendation/controls/main/currency.js +49 -44
  50. package/dist/extensions/Blocks/Recommendation/controls/main/filters.js +1 -3
  51. package/dist/extensions/Blocks/Recommendation/controls/main/index.js +147 -102
  52. package/dist/extensions/Blocks/Recommendation/controls/main/locale.js +1 -5
  53. package/dist/extensions/Blocks/Recommendation/controls/main/productLayout.js +85 -43
  54. package/dist/extensions/Blocks/Recommendation/controls/main/shuffle.js +9 -13
  55. package/dist/extensions/Blocks/Recommendation/controls/main/utils.js +138 -117
  56. package/dist/extensions/Blocks/Recommendation/controls/mobileLayout/cssRules.js +21 -0
  57. package/dist/extensions/Blocks/Recommendation/controls/name/textTrim.js +66 -34
  58. package/dist/extensions/Blocks/Recommendation/controls/spacing/index.js +2 -2
  59. package/dist/extensions/Blocks/Recommendation/services/configService.js +2 -1
  60. package/dist/extensions/Blocks/Recommendation/store/recommendation.js +248 -206
  61. package/dist/extensions/Blocks/Recommendation/templates/grid/elementRenderer.js +26 -31
  62. package/dist/extensions/Blocks/Recommendation/templates/grid/migration.js +1 -1
  63. package/dist/extensions/Blocks/Recommendation/templates/grid/template.js +31 -34
  64. package/dist/extensions/Blocks/Recommendation/templates/list/elementRenderer.js +20 -25
  65. package/dist/extensions/Blocks/Recommendation/templates/list/template.js +22 -22
  66. package/dist/extensions/Blocks/Recommendation/templates/utils.js +52 -39
  67. package/dist/extensions/Blocks/Recommendation/utils/preserveTextStyles.js +10 -10
  68. package/dist/extensions/Blocks/Unsubscribe/block.js +29 -29
  69. package/dist/extensions/Blocks/Unsubscribe/control.js +12 -9
  70. package/dist/extensions/Blocks/Unsubscribe/elements/preview.js +13 -11
  71. package/dist/extensions/Blocks/Unsubscribe/styles.css.js +31 -1
  72. package/dist/extensions/Blocks/common-control.js +91 -92
  73. package/dist/extensions/ModulesTabIcons/extension.js +17 -0
  74. package/dist/guido.css +1 -1
  75. package/dist/node_modules/@stripoinc/ui-editor-extensions/dist/esm/index.js +257 -187
  76. package/dist/package.json.js +1 -1
  77. package/dist/services/recommendationApi.js +11 -9
  78. package/dist/services/stripoApi.js +20 -17
  79. package/dist/services/templateLibraryApi.js +16 -13
  80. package/dist/src/@types/config/schemas.d.ts +8 -0
  81. package/dist/src/composables/useConfig.d.ts +4 -0
  82. package/dist/src/composables/useRecommendation.d.ts +1 -0
  83. package/dist/src/config/compiler/utils/recommendationCompilerUtils.d.ts +17 -0
  84. package/dist/src/config/i18n/en/index.d.ts +1 -0
  85. package/dist/src/config/i18n/index.d.ts +16 -0
  86. package/dist/src/enums/defaults.d.ts +4 -0
  87. package/dist/src/extensions/Blocks/Items/block.d.ts +0 -1
  88. package/dist/src/extensions/Blocks/Items/controls/button/link.d.ts +0 -1
  89. package/dist/src/extensions/Blocks/Items/controls/cardComposition.d.ts +5 -5
  90. package/dist/src/extensions/Blocks/Items/controls/image/link.d.ts +0 -1
  91. package/dist/src/extensions/Blocks/Items/controls/name/trimming.d.ts +0 -1
  92. package/dist/src/extensions/Blocks/Items/controls/price/currencyLocation.d.ts +0 -1
  93. package/dist/src/extensions/Blocks/Items/controls/price/currencySymbol.d.ts +0 -1
  94. package/dist/src/extensions/Blocks/Items/controls/price/formattedPrice.d.ts +0 -1
  95. package/dist/src/extensions/Blocks/Items/controls/price/hideDiscount.d.ts +0 -1
  96. package/dist/src/extensions/Blocks/Items/controls/price/priceOrientation.d.ts +0 -1
  97. package/dist/src/extensions/Blocks/Items/controls/price/singlePrice.d.ts +0 -5
  98. package/dist/src/extensions/Blocks/Items/controls/settingsControl.d.ts +10 -12
  99. package/dist/src/extensions/Blocks/Items/utils/nodeConfigUtils.d.ts +2 -1
  100. package/dist/src/extensions/Blocks/Recommendation/block.d.ts +44 -11
  101. package/dist/src/extensions/Blocks/Recommendation/constants/index.d.ts +2 -2
  102. package/dist/src/extensions/Blocks/Recommendation/constants/layout.d.ts +6 -0
  103. package/dist/src/extensions/Blocks/Recommendation/constants/selectors.d.ts +4 -0
  104. package/dist/src/extensions/Blocks/Recommendation/controls/main/currency.d.ts +8 -1
  105. package/dist/src/extensions/Blocks/Recommendation/controls/main/index.d.ts +27 -5
  106. package/dist/src/extensions/Blocks/Recommendation/controls/main/productLayout.d.ts +22 -4
  107. package/dist/src/extensions/Blocks/Recommendation/controls/main/utils.d.ts +9 -2
  108. package/dist/src/extensions/Blocks/Recommendation/controls/mobileLayout/cssRules.d.ts +29 -0
  109. package/dist/src/extensions/Blocks/Recommendation/controls/name/textTrim.d.ts +19 -1
  110. package/dist/src/extensions/Blocks/Recommendation/controls/spacing/index.d.ts +2 -2
  111. package/dist/src/extensions/Blocks/Recommendation/store/recommendation.d.ts +138 -469
  112. package/dist/src/extensions/Blocks/Recommendation/templates/grid/elementRenderer.d.ts +2 -2
  113. package/dist/src/extensions/Blocks/Recommendation/templates/grid/template.d.ts +4 -4
  114. package/dist/src/extensions/Blocks/Recommendation/templates/index.d.ts +2 -0
  115. package/dist/src/extensions/Blocks/Recommendation/templates/list/elementRenderer.d.ts +2 -2
  116. package/dist/src/extensions/Blocks/Recommendation/templates/list/template.d.ts +2 -2
  117. package/dist/src/extensions/Blocks/Recommendation/templates/utils.d.ts +16 -4
  118. package/dist/src/extensions/Blocks/Recommendation/types/nodeConfig.d.ts +14 -2
  119. package/dist/src/extensions/Blocks/Recommendation/utils/stylePreserver.d.ts +1 -1
  120. package/dist/src/extensions/Blocks/Unsubscribe/control.d.ts +1 -0
  121. package/dist/src/extensions/Blocks/common-control.d.ts +4 -5
  122. package/dist/src/extensions/ModulesTabIcons/extension.d.ts +2 -0
  123. package/dist/src/stores/config.d.ts +36 -0
  124. package/dist/static/styles/components/notification.css.js +19 -0
  125. package/dist/static/styles/components/tools.css.js +6 -2
  126. package/dist/static/styles/components/version-history.css.js +10 -2
  127. package/dist/static/styles/components/wide-panel.css.js +18 -2
  128. package/dist/static/styles/customEditorStyle.css.js +10 -9
  129. package/dist/static/styles/variables.css.js +2 -0
  130. package/dist/static/templates/empty/index.html.js +74 -0
  131. package/dist/static/templates/empty/style.css.js +779 -0
  132. package/dist/stores/unsubscribe.js +37 -34
  133. package/dist/utils/pairProductVariables.js +57 -56
  134. package/dist/utils/templatePreparation.js +15 -14
  135. package/package.json +2 -2
  136. package/dist/extensions/Blocks/Items/store/items-block.js +0 -79
  137. package/dist/src/extensions/Blocks/Items/store/items-block.d.ts +0 -45
  138. package/dist/src/extensions/Blocks/Recommendation/controls/nameTextTrimControl.d.ts +0 -16
@@ -1,549 +1,218 @@
1
1
  import type { Orientation, Languages, Currency, NumericSeparator, FiltersResponse, Filter, RecommendationProduct } from '@@/Types/recommendation';
2
- interface StoreState {
3
- /** Maps campaign URLs for recommendation blocks. Used by templateLibraryApi when saving templates. */
4
- recommendationCampaignUrls: Record<string, string>;
5
- recommendationConfigs: {
6
- cardsInRow: number;
7
- currencySettings: {
8
- name: string;
9
- value: string;
10
- symbol: string;
11
- alignment: string;
12
- decimalCount: string;
13
- decimalSeparator: NumericSeparator;
14
- thousandSeparator: NumericSeparator;
15
- };
16
- filters: Filter[];
17
- id: number;
18
- language: string;
19
- orientation: Orientation;
20
- productIds: string[];
21
- recommendedProducts: [];
22
- sendProductRequestFlag: boolean;
23
- shuffleProducts: boolean;
24
- strategy: string;
25
- textTrimming: boolean;
26
- unresponsive: boolean;
27
- size: string;
2
+ interface PerBlockConfigs {
3
+ cardsInRow: number;
4
+ currencySettings: {
5
+ name: string;
6
+ value: string;
7
+ symbol: string;
8
+ alignment: string;
9
+ decimalCount: string;
10
+ decimalSeparator: NumericSeparator;
11
+ thousandSeparator: NumericSeparator;
28
12
  };
13
+ filters: Filter[];
14
+ id: number;
15
+ language: string;
16
+ orientation: Orientation;
17
+ productIds: string[];
18
+ recommendedProducts: [];
19
+ sendProductRequestFlag: boolean;
20
+ shuffleProducts: boolean;
21
+ strategy: string;
22
+ textTrimming: boolean;
23
+ unresponsive: boolean;
24
+ size: string;
25
+ }
26
+ interface PerBlockState {
27
+ recommendationConfigs: PerBlockConfigs;
29
28
  recommendationProducts: RecommendationProduct[];
29
+ filterStatus: boolean;
30
+ filterSelectionDrawerStatus: boolean;
31
+ filterGroup: number;
32
+ /** Whether initial API data (filters, algorithms, products) has been fetched for this block */
33
+ isInitialized: boolean;
34
+ }
35
+ interface StoreState {
36
+ recommendationCampaignUrls: Record<string, string>;
30
37
  activePredictiveAlgorithms: number[];
31
38
  languages: Languages;
32
39
  currencyList: Currency[];
33
- filterStatus: boolean;
34
- filterSelectionDrawerStatus: boolean;
35
40
  filterList: FiltersResponse;
36
- filterGroup: number;
41
+ blockStates: Record<number, PerBlockState>;
42
+ currentRecommendationId: number | null;
43
+ configVersion: number;
37
44
  }
38
45
  export declare const useRecommendationExtensionStore: import("pinia").StoreDefinition<"guidoRecommendationExtension", StoreState, {
39
- hasFilters: (state: {
46
+ /**
47
+ * Proxy getter: delegates to blockStates[currentRecommendationId].recommendationConfigs
48
+ * This allows all existing code that reads `store.recommendationConfigs` to work unchanged.
49
+ */
50
+ recommendationConfigs(state: {
40
51
  recommendationCampaignUrls: Record<string, string>;
41
- recommendationConfigs: {
42
- cardsInRow: number;
43
- currencySettings: {
44
- name: string;
45
- value: string;
46
- symbol: string;
47
- alignment: string;
48
- decimalCount: string;
49
- decimalSeparator: NumericSeparator;
50
- thousandSeparator: NumericSeparator;
51
- };
52
- filters: {
53
- type: string;
54
- attribute: string;
55
- operatorReplace: string;
56
- operator: string;
57
- innerGroupOperator: string;
58
- outerGroupOperator: string;
59
- value: string;
60
- filterGroup: number;
61
- filterNumber: number;
62
- isValid: boolean;
63
- }[];
64
- id: number;
65
- language: string;
66
- orientation: Orientation;
67
- productIds: string[];
68
- recommendedProducts: [];
69
- sendProductRequestFlag: boolean;
70
- shuffleProducts: boolean;
71
- strategy: string;
72
- textTrimming: boolean;
73
- unresponsive: boolean;
74
- size: string;
75
- };
76
- recommendationProducts: {
77
- image_url: string;
78
- name: string;
79
- item_id: string;
80
- url: string;
81
- in_stock: number;
82
- price: {
83
- [key: string]: number;
84
- };
85
- locale: string;
86
- product_attributes: {
87
- [key: string]: string;
88
- };
89
- category: string[];
90
- discount: {
91
- [key: string]: number;
92
- };
93
- original_price: {
94
- [key: string]: number;
95
- };
96
- }[];
97
52
  activePredictiveAlgorithms: number[];
98
53
  languages: Languages;
99
54
  currencyList: {
100
55
  text: string;
101
56
  value: string;
102
57
  }[];
103
- filterStatus: boolean;
104
- filterSelectionDrawerStatus: boolean;
105
58
  filterList: FiltersResponse;
106
- filterGroup: number;
107
- } & import("pinia").PiniaCustomStateProperties<StoreState>) => boolean;
108
- getFilterGroupCount: (state: {
59
+ blockStates: Record<number, PerBlockState>;
60
+ currentRecommendationId: number | null;
61
+ configVersion: number;
62
+ } & import("pinia").PiniaCustomStateProperties<StoreState>): PerBlockConfigs;
63
+ /**
64
+ * Proxy getter: delegates to blockStates[currentRecommendationId].recommendationProducts
65
+ */
66
+ recommendationProducts(state: {
109
67
  recommendationCampaignUrls: Record<string, string>;
110
- recommendationConfigs: {
111
- cardsInRow: number;
112
- currencySettings: {
113
- name: string;
114
- value: string;
115
- symbol: string;
116
- alignment: string;
117
- decimalCount: string;
118
- decimalSeparator: NumericSeparator;
119
- thousandSeparator: NumericSeparator;
120
- };
121
- filters: {
122
- type: string;
123
- attribute: string;
124
- operatorReplace: string;
125
- operator: string;
126
- innerGroupOperator: string;
127
- outerGroupOperator: string;
128
- value: string;
129
- filterGroup: number;
130
- filterNumber: number;
131
- isValid: boolean;
132
- }[];
133
- id: number;
134
- language: string;
135
- orientation: Orientation;
136
- productIds: string[];
137
- recommendedProducts: [];
138
- sendProductRequestFlag: boolean;
139
- shuffleProducts: boolean;
140
- strategy: string;
141
- textTrimming: boolean;
142
- unresponsive: boolean;
143
- size: string;
144
- };
145
- recommendationProducts: {
146
- image_url: string;
147
- name: string;
148
- item_id: string;
149
- url: string;
150
- in_stock: number;
151
- price: {
152
- [key: string]: number;
153
- };
154
- locale: string;
155
- product_attributes: {
156
- [key: string]: string;
157
- };
158
- category: string[];
159
- discount: {
160
- [key: string]: number;
161
- };
162
- original_price: {
163
- [key: string]: number;
164
- };
165
- }[];
166
68
  activePredictiveAlgorithms: number[];
167
69
  languages: Languages;
168
70
  currencyList: {
169
71
  text: string;
170
72
  value: string;
171
73
  }[];
172
- filterStatus: boolean;
173
- filterSelectionDrawerStatus: boolean;
174
74
  filterList: FiltersResponse;
175
- filterGroup: number;
176
- } & import("pinia").PiniaCustomStateProperties<StoreState>) => number;
177
- getActivePredictiveAlgorithms: (state: {
75
+ blockStates: Record<number, PerBlockState>;
76
+ currentRecommendationId: number | null;
77
+ configVersion: number;
78
+ } & import("pinia").PiniaCustomStateProperties<StoreState>): RecommendationProduct[];
79
+ /**
80
+ * Proxy getter: delegates to blockStates[currentRecommendationId].filterSelectionDrawerStatus
81
+ */
82
+ filterSelectionDrawerStatus(state: {
178
83
  recommendationCampaignUrls: Record<string, string>;
179
- recommendationConfigs: {
180
- cardsInRow: number;
181
- currencySettings: {
182
- name: string;
183
- value: string;
184
- symbol: string;
185
- alignment: string;
186
- decimalCount: string;
187
- decimalSeparator: NumericSeparator;
188
- thousandSeparator: NumericSeparator;
189
- };
190
- filters: {
191
- type: string;
192
- attribute: string;
193
- operatorReplace: string;
194
- operator: string;
195
- innerGroupOperator: string;
196
- outerGroupOperator: string;
197
- value: string;
198
- filterGroup: number;
199
- filterNumber: number;
200
- isValid: boolean;
201
- }[];
202
- id: number;
203
- language: string;
204
- orientation: Orientation;
205
- productIds: string[];
206
- recommendedProducts: [];
207
- sendProductRequestFlag: boolean;
208
- shuffleProducts: boolean;
209
- strategy: string;
210
- textTrimming: boolean;
211
- unresponsive: boolean;
212
- size: string;
213
- };
214
- recommendationProducts: {
215
- image_url: string;
216
- name: string;
217
- item_id: string;
218
- url: string;
219
- in_stock: number;
220
- price: {
221
- [key: string]: number;
222
- };
223
- locale: string;
224
- product_attributes: {
225
- [key: string]: string;
226
- };
227
- category: string[];
228
- discount: {
229
- [key: string]: number;
230
- };
231
- original_price: {
232
- [key: string]: number;
233
- };
234
- }[];
235
84
  activePredictiveAlgorithms: number[];
236
85
  languages: Languages;
237
86
  currencyList: {
238
87
  text: string;
239
88
  value: string;
240
89
  }[];
241
- filterStatus: boolean;
242
- filterSelectionDrawerStatus: boolean;
243
90
  filterList: FiltersResponse;
244
- filterGroup: number;
245
- } & import("pinia").PiniaCustomStateProperties<StoreState>) => {
246
- text: string;
247
- value: string;
248
- }[];
249
- getLanguages: (state: {
91
+ blockStates: Record<number, PerBlockState>;
92
+ currentRecommendationId: number | null;
93
+ configVersion: number;
94
+ } & import("pinia").PiniaCustomStateProperties<StoreState>): boolean;
95
+ /**
96
+ * Proxy getter: delegates to blockStates[currentRecommendationId].filterStatus
97
+ */
98
+ filterStatus(state: {
250
99
  recommendationCampaignUrls: Record<string, string>;
251
- recommendationConfigs: {
252
- cardsInRow: number;
253
- currencySettings: {
254
- name: string;
255
- value: string;
256
- symbol: string;
257
- alignment: string;
258
- decimalCount: string;
259
- decimalSeparator: NumericSeparator;
260
- thousandSeparator: NumericSeparator;
261
- };
262
- filters: {
263
- type: string;
264
- attribute: string;
265
- operatorReplace: string;
266
- operator: string;
267
- innerGroupOperator: string;
268
- outerGroupOperator: string;
269
- value: string;
270
- filterGroup: number;
271
- filterNumber: number;
272
- isValid: boolean;
273
- }[];
274
- id: number;
275
- language: string;
276
- orientation: Orientation;
277
- productIds: string[];
278
- recommendedProducts: [];
279
- sendProductRequestFlag: boolean;
280
- shuffleProducts: boolean;
281
- strategy: string;
282
- textTrimming: boolean;
283
- unresponsive: boolean;
284
- size: string;
285
- };
286
- recommendationProducts: {
287
- image_url: string;
288
- name: string;
289
- item_id: string;
290
- url: string;
291
- in_stock: number;
292
- price: {
293
- [key: string]: number;
294
- };
295
- locale: string;
296
- product_attributes: {
297
- [key: string]: string;
298
- };
299
- category: string[];
300
- discount: {
301
- [key: string]: number;
302
- };
303
- original_price: {
304
- [key: string]: number;
305
- };
306
- }[];
307
100
  activePredictiveAlgorithms: number[];
308
101
  languages: Languages;
309
102
  currencyList: {
310
103
  text: string;
311
104
  value: string;
312
105
  }[];
313
- filterStatus: boolean;
314
- filterSelectionDrawerStatus: boolean;
315
106
  filterList: FiltersResponse;
316
- filterGroup: number;
317
- } & import("pinia").PiniaCustomStateProperties<StoreState>) => {
318
- text: string;
319
- value: string;
320
- }[];
321
- getCurrencySymbolList: (state: {
107
+ blockStates: Record<number, PerBlockState>;
108
+ currentRecommendationId: number | null;
109
+ configVersion: number;
110
+ } & import("pinia").PiniaCustomStateProperties<StoreState>): boolean;
111
+ /**
112
+ * Proxy getter: delegates to blockStates[currentRecommendationId].filterGroup
113
+ */
114
+ filterGroup(state: {
322
115
  recommendationCampaignUrls: Record<string, string>;
323
- recommendationConfigs: {
324
- cardsInRow: number;
325
- currencySettings: {
326
- name: string;
327
- value: string;
328
- symbol: string;
329
- alignment: string;
330
- decimalCount: string;
331
- decimalSeparator: NumericSeparator;
332
- thousandSeparator: NumericSeparator;
333
- };
334
- filters: {
335
- type: string;
336
- attribute: string;
337
- operatorReplace: string;
338
- operator: string;
339
- innerGroupOperator: string;
340
- outerGroupOperator: string;
341
- value: string;
342
- filterGroup: number;
343
- filterNumber: number;
344
- isValid: boolean;
345
- }[];
346
- id: number;
347
- language: string;
348
- orientation: Orientation;
349
- productIds: string[];
350
- recommendedProducts: [];
351
- sendProductRequestFlag: boolean;
352
- shuffleProducts: boolean;
353
- strategy: string;
354
- textTrimming: boolean;
355
- unresponsive: boolean;
356
- size: string;
357
- };
358
- recommendationProducts: {
359
- image_url: string;
360
- name: string;
361
- item_id: string;
362
- url: string;
363
- in_stock: number;
364
- price: {
365
- [key: string]: number;
366
- };
367
- locale: string;
368
- product_attributes: {
369
- [key: string]: string;
370
- };
371
- category: string[];
372
- discount: {
373
- [key: string]: number;
374
- };
375
- original_price: {
376
- [key: string]: number;
377
- };
116
+ activePredictiveAlgorithms: number[];
117
+ languages: Languages;
118
+ currencyList: {
119
+ text: string;
120
+ value: string;
378
121
  }[];
122
+ filterList: FiltersResponse;
123
+ blockStates: Record<number, PerBlockState>;
124
+ currentRecommendationId: number | null;
125
+ configVersion: number;
126
+ } & import("pinia").PiniaCustomStateProperties<StoreState>): number;
127
+ hasFilters(): boolean;
128
+ getFilterGroupCount(): number;
129
+ getActivePredictiveAlgorithms: (state: {
130
+ recommendationCampaignUrls: Record<string, string>;
379
131
  activePredictiveAlgorithms: number[];
380
132
  languages: Languages;
381
133
  currencyList: {
382
134
  text: string;
383
135
  value: string;
384
136
  }[];
385
- filterStatus: boolean;
386
- filterSelectionDrawerStatus: boolean;
387
137
  filterList: FiltersResponse;
388
- filterGroup: number;
138
+ blockStates: Record<number, PerBlockState>;
139
+ currentRecommendationId: number | null;
140
+ configVersion: number;
389
141
  } & import("pinia").PiniaCustomStateProperties<StoreState>) => {
390
142
  text: string;
391
143
  value: string;
392
144
  }[];
393
- getFilterList: (state: {
145
+ getLanguages: (state: {
394
146
  recommendationCampaignUrls: Record<string, string>;
395
- recommendationConfigs: {
396
- cardsInRow: number;
397
- currencySettings: {
398
- name: string;
399
- value: string;
400
- symbol: string;
401
- alignment: string;
402
- decimalCount: string;
403
- decimalSeparator: NumericSeparator;
404
- thousandSeparator: NumericSeparator;
405
- };
406
- filters: {
407
- type: string;
408
- attribute: string;
409
- operatorReplace: string;
410
- operator: string;
411
- innerGroupOperator: string;
412
- outerGroupOperator: string;
413
- value: string;
414
- filterGroup: number;
415
- filterNumber: number;
416
- isValid: boolean;
417
- }[];
418
- id: number;
419
- language: string;
420
- orientation: Orientation;
421
- productIds: string[];
422
- recommendedProducts: [];
423
- sendProductRequestFlag: boolean;
424
- shuffleProducts: boolean;
425
- strategy: string;
426
- textTrimming: boolean;
427
- unresponsive: boolean;
428
- size: string;
429
- };
430
- recommendationProducts: {
431
- image_url: string;
432
- name: string;
433
- item_id: string;
434
- url: string;
435
- in_stock: number;
436
- price: {
437
- [key: string]: number;
438
- };
439
- locale: string;
440
- product_attributes: {
441
- [key: string]: string;
442
- };
443
- category: string[];
444
- discount: {
445
- [key: string]: number;
446
- };
447
- original_price: {
448
- [key: string]: number;
449
- };
450
- }[];
451
147
  activePredictiveAlgorithms: number[];
452
148
  languages: Languages;
453
149
  currencyList: {
454
150
  text: string;
455
151
  value: string;
456
152
  }[];
457
- filterStatus: boolean;
458
- filterSelectionDrawerStatus: boolean;
459
153
  filterList: FiltersResponse;
460
- filterGroup: number;
154
+ blockStates: Record<number, PerBlockState>;
155
+ currentRecommendationId: number | null;
156
+ configVersion: number;
461
157
  } & import("pinia").PiniaCustomStateProperties<StoreState>) => {
462
158
  text: string;
463
159
  value: string;
464
- type: string;
465
160
  }[];
466
- getSelectedFilterGroup: (state: {
161
+ getCurrencySymbolList: (state: {
467
162
  recommendationCampaignUrls: Record<string, string>;
468
- recommendationConfigs: {
469
- cardsInRow: number;
470
- currencySettings: {
471
- name: string;
472
- value: string;
473
- symbol: string;
474
- alignment: string;
475
- decimalCount: string;
476
- decimalSeparator: NumericSeparator;
477
- thousandSeparator: NumericSeparator;
478
- };
479
- filters: {
480
- type: string;
481
- attribute: string;
482
- operatorReplace: string;
483
- operator: string;
484
- innerGroupOperator: string;
485
- outerGroupOperator: string;
486
- value: string;
487
- filterGroup: number;
488
- filterNumber: number;
489
- isValid: boolean;
490
- }[];
491
- id: number;
492
- language: string;
493
- orientation: Orientation;
494
- productIds: string[];
495
- recommendedProducts: [];
496
- sendProductRequestFlag: boolean;
497
- shuffleProducts: boolean;
498
- strategy: string;
499
- textTrimming: boolean;
500
- unresponsive: boolean;
501
- size: string;
502
- };
503
- recommendationProducts: {
504
- image_url: string;
505
- name: string;
506
- item_id: string;
507
- url: string;
508
- in_stock: number;
509
- price: {
510
- [key: string]: number;
511
- };
512
- locale: string;
513
- product_attributes: {
514
- [key: string]: string;
515
- };
516
- category: string[];
517
- discount: {
518
- [key: string]: number;
519
- };
520
- original_price: {
521
- [key: string]: number;
522
- };
523
- }[];
524
163
  activePredictiveAlgorithms: number[];
525
164
  languages: Languages;
526
165
  currencyList: {
527
166
  text: string;
528
167
  value: string;
529
168
  }[];
530
- filterStatus: boolean;
531
- filterSelectionDrawerStatus: boolean;
532
169
  filterList: FiltersResponse;
533
- filterGroup: number;
534
- } & import("pinia").PiniaCustomStateProperties<StoreState>) => (groupId: number) => {
535
- type: string;
536
- attribute: string;
537
- operatorReplace: string;
538
- operator: string;
539
- innerGroupOperator: string;
540
- outerGroupOperator: string;
170
+ blockStates: Record<number, PerBlockState>;
171
+ currentRecommendationId: number | null;
172
+ configVersion: number;
173
+ } & import("pinia").PiniaCustomStateProperties<StoreState>) => {
174
+ text: string;
175
+ value: string;
176
+ }[];
177
+ getFilterList(): {
178
+ text: string;
541
179
  value: string;
542
- filterGroup: number;
543
- filterNumber: number;
544
- isValid: boolean;
180
+ type: string;
545
181
  }[];
182
+ getSelectedFilterGroup(): (groupId: number) => Filter[];
546
183
  }, {
184
+ /**
185
+ * Sets the currently active block ID.
186
+ * Creates a new entry in blockStates if one doesn't exist.
187
+ */
188
+ setCurrentBlock(id: number): void;
189
+ /**
190
+ * Removes a block's state from the store.
191
+ * Resets currentRecommendationId if it was the deleted block.
192
+ */
193
+ removeBlockState(id: number): void;
194
+ /**
195
+ * Marks a block as initialized (initial API data has been fetched).
196
+ * Automatically cleaned up when removeBlockState deletes the block entry.
197
+ */
198
+ markBlockInitialized(id: number): void;
199
+ /**
200
+ * Patches the current block's recommendationConfigs.
201
+ * Replaces `store.$patch({ recommendationConfigs: { ... } })` pattern.
202
+ */
203
+ patchCurrentBlockConfig(updates: Partial<PerBlockConfigs>, options?: {
204
+ triggerRefetch?: boolean;
205
+ }): void;
206
+ /**
207
+ * Opens the filter selection drawer for the current block.
208
+ * If no filters exist, initializes with a default empty filter
209
+ * so the user has a starting point for input.
210
+ */
211
+ openFilterDrawer(): void;
212
+ /**
213
+ * Closes the filter selection drawer for the current block
214
+ */
215
+ closeFilterDrawer(): void;
547
216
  fetchRecommendationCreateData(): Promise<void>;
548
217
  fetchRecommendationFilters(): Promise<void>;
549
218
  addFilterGroup(filterGroup: number): void;
@@ -1,6 +1,6 @@
1
1
  import type { ElementRenderer } from '../utils';
2
2
  /**
3
- * Vertical element renderer
3
+ * Grid element renderer
4
4
  * Each element returns a `<td>` containing a nested table structure:
5
5
  * - Outer `<td>` has padding for column spacing
6
6
  * - Inner `<table class="product-card-segment">` supports background color
@@ -17,4 +17,4 @@ export declare const DEFAULT_CELL_PADDING = "0 5px";
17
17
  * Used by controls to reliably select direct children for spacing adjustments
18
18
  */
19
19
  export declare const ATTRIBUTE_CELL_CLASS = "attribute-cell";
20
- export declare const verticalElementRenderer: ElementRenderer;
20
+ export declare const gridElementRenderer: ElementRenderer;