@useinsider/guido 3.2.0-beta.c3bc14c → 3.2.0-beta.caa22bf

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 (91) hide show
  1. package/README.md +92 -0
  2. package/dist/@types/config/schemas.js +150 -94
  3. package/dist/components/Guido.vue.js +1 -1
  4. package/dist/components/Guido.vue2.js +88 -87
  5. package/dist/components/organisms/onboarding/AMPOnboarding.vue2.js +51 -31
  6. package/dist/components/organisms/onboarding/GenericOnboarding.vue.js +1 -1
  7. package/dist/components/organisms/onboarding/GenericOnboarding.vue2.js +23 -22
  8. package/dist/components/organisms/onboarding/ItemsOnboarding.vue.js +1 -1
  9. package/dist/components/organisms/onboarding/ItemsOnboarding.vue2.js +37 -39
  10. package/dist/components/organisms/onboarding/TextBlockOnboarding.vue.js +3 -3
  11. package/dist/components/organisms/onboarding/TextBlockOnboarding.vue2.js +30 -41
  12. package/dist/components/organisms/onboarding/VersionHistoryOnboarding.vue2.js +15 -14
  13. package/dist/composables/useRecommendation.js +46 -26
  14. package/dist/composables/useRibbonOffset.js +21 -0
  15. package/dist/composables/useStripo.js +14 -16
  16. package/dist/composables/validators/useCouponBlockValidator.js +6 -6
  17. package/dist/config/compiler/recommendationCompilerRules.js +27 -27
  18. package/dist/config/migrator/index.js +9 -9
  19. package/dist/config/migrator/radioButtonMigrator.js +64 -44
  20. package/dist/config/migrator/recommendation/compositionMapper.js +98 -0
  21. package/dist/config/migrator/recommendation/extractors.js +27 -0
  22. package/dist/config/migrator/recommendation/htmlBuilder.js +496 -0
  23. package/dist/config/migrator/recommendation/parseLegacyConfig.js +33 -0
  24. package/dist/config/migrator/recommendation/settingsMapper.js +70 -0
  25. package/dist/config/migrator/recommendation/themeMapper.js +93 -0
  26. package/dist/config/migrator/recommendationMigrator.js +74 -290
  27. package/dist/enums/extensions/recommendationBlock.js +2 -1
  28. package/dist/enums/onboarding.js +7 -2
  29. package/dist/extensions/Blocks/RadioButton/template.js +1 -1
  30. package/dist/extensions/Blocks/Recommendation/block.js +35 -32
  31. package/dist/extensions/Blocks/Recommendation/constants/defaultConfig.js +5 -5
  32. package/dist/extensions/Blocks/Recommendation/controls/main/algorithm.js +25 -24
  33. package/dist/extensions/Blocks/Recommendation/controls/main/utils.js +228 -181
  34. package/dist/extensions/Blocks/Recommendation/services/configService.js +65 -29
  35. package/dist/extensions/Blocks/Recommendation/store/recommendation.js +130 -90
  36. package/dist/extensions/Blocks/Recommendation/templates/grid/template.js +8 -8
  37. package/dist/extensions/Blocks/Recommendation/templates/utils.js +1 -1
  38. package/dist/extensions/Blocks/Recommendation/utils/legacyStrategyMap.js +21 -0
  39. package/dist/extensions/Blocks/Recommendation/utils/preserveTextStyles.js +13 -22
  40. package/dist/guido.css +1 -1
  41. package/dist/node_modules/@stripoinc/ui-editor-extensions/dist/esm/index.js +258 -235
  42. package/dist/node_modules/valibot/dist/index.js +450 -235
  43. package/dist/package.json.js +1 -1
  44. package/dist/services/templateLibraryApi.js +5 -4
  45. package/dist/src/@types/config/defaults.d.ts +5 -1
  46. package/dist/src/@types/config/index.d.ts +3 -3
  47. package/dist/src/@types/config/schemas.d.ts +213 -0
  48. package/dist/src/@types/config/types.d.ts +9 -1
  49. package/dist/src/components/wrappers/WpModal.vue.d.ts +1 -1
  50. package/dist/src/composables/useConfig.d.ts +56 -0
  51. package/dist/src/composables/useRecommendation.d.ts +10 -1
  52. package/dist/src/composables/useRecommendation.test.d.ts +1 -0
  53. package/dist/src/composables/useRibbonOffset.d.ts +4 -0
  54. package/dist/src/config/migrator/index.d.ts +2 -1
  55. package/dist/src/config/migrator/recommendation/compositionMapper.d.ts +2 -0
  56. package/dist/src/config/migrator/recommendation/compositionMapper.test.d.ts +1 -0
  57. package/dist/src/config/migrator/recommendation/extractors.d.ts +7 -0
  58. package/dist/src/config/migrator/recommendation/extractors.test.d.ts +1 -0
  59. package/dist/src/config/migrator/recommendation/htmlBuilder.d.ts +11 -0
  60. package/dist/src/config/migrator/recommendation/parseLegacyConfig.d.ts +15 -0
  61. package/dist/src/config/migrator/recommendation/parseLegacyConfig.test.d.ts +1 -0
  62. package/dist/src/config/migrator/recommendation/settingsMapper.d.ts +7 -0
  63. package/dist/src/config/migrator/recommendation/settingsMapper.test.d.ts +1 -0
  64. package/dist/src/config/migrator/recommendation/themeMapper.d.ts +5 -0
  65. package/dist/src/config/migrator/recommendation/themeMapper.test.d.ts +1 -0
  66. package/dist/src/config/migrator/recommendation/types.d.ts +205 -0
  67. package/dist/src/config/migrator/recommendationMigrator.d.ts +13 -1
  68. package/dist/src/config/migrator/recommendationMigrator.test.d.ts +1 -0
  69. package/dist/src/enums/onboarding.d.ts +6 -0
  70. package/dist/src/extensions/Blocks/RadioButton/template.d.ts +1 -1
  71. package/dist/src/extensions/Blocks/Recommendation/controls/main/utils.test.d.ts +1 -0
  72. package/dist/src/extensions/Blocks/Recommendation/services/configService.d.ts +10 -0
  73. package/dist/src/extensions/Blocks/Recommendation/services/configService.test.d.ts +1 -0
  74. package/dist/src/extensions/Blocks/Recommendation/store/recommendation.d.ts +34 -0
  75. package/dist/src/extensions/Blocks/Recommendation/types/nodeConfig.d.ts +1 -1
  76. package/dist/src/extensions/Blocks/Recommendation/utils/legacyStrategyMap.d.ts +21 -0
  77. package/dist/src/extensions/Blocks/Recommendation/utils/legacyStrategyMap.test.d.ts +1 -0
  78. package/dist/src/extensions/Blocks/Recommendation/utils/preserveTextStyles.d.ts +0 -3
  79. package/dist/src/library.d.ts +1 -1
  80. package/dist/src/stores/config.d.ts +504 -0
  81. package/dist/src/stores/onboarding.d.ts +4 -0
  82. package/dist/src/utils/htmlEscape.d.ts +5 -0
  83. package/dist/src/utils/htmlEscape.test.d.ts +1 -0
  84. package/dist/stores/onboarding.js +4 -0
  85. package/dist/utils/htmlEscape.js +13 -0
  86. package/dist/utils/pairProductVariables.js +89 -88
  87. package/dist/utils/templatePreparation.js +72 -32
  88. package/package.json +7 -3
  89. package/dist/enums/displayConditions.js +0 -80
  90. package/dist/extensions/Blocks/Recommendation/templates/grid/migration.js +0 -251
  91. package/dist/src/enums/displayConditions.d.ts +0 -2
package/README.md CHANGED
@@ -113,6 +113,12 @@ const config: GuidoConfigInput = {
113
113
  preselectedDynamicContent?: DynamicContent[],
114
114
  selectedUnsubscribePages?: number[],
115
115
  forceRecreate?: boolean, // Default: false - Force recreate template in Stripo storage
116
+ migration?: {
117
+ // Legacy block configs keyed by block ID. Consumed once by the migrator
118
+ // when upgrading templates authored with v1 block formats. See the
119
+ // "Template Migration" section below.
120
+ recommendationConfigs?: Record<string, LegacyRecommendationConfig>,
121
+ },
116
122
  },
117
123
 
118
124
  // Optional: Editor settings
@@ -327,6 +333,90 @@ const config: GuidoConfigInput = {
327
333
 
328
334
  ---
329
335
 
336
+ ## Template Migration
337
+
338
+ When a template was authored with **v1 block formats** (notably the legacy recommendation block), Guido needs additional context that cannot be recovered from the saved HTML alone — things like filter rules, recommendation strategies, currency settings, locale, and pinned product IDs.
339
+
340
+ Pass that context once via `template.migration` when loading the template. The migrator consumes it during initial render to upgrade legacy blocks to the current format. After migration, the field has no effect on editor behavior — you can keep passing it (it's idempotent on already-migrated templates) or omit it.
341
+
342
+ > **When to provide this:** Only when loading templates created before the v2 recommendation block was rolled out. New templates do not need it.
343
+
344
+ ### `recommendationConfigs`
345
+
346
+ A dictionary keyed by the legacy block's element ID. Each entry preserves the v1 block's runtime config so the migrator can hydrate the upgraded block.
347
+
348
+ ```typescript
349
+ const config: GuidoConfigInput = {
350
+ identity: { templateId: 'tpl-123', userId: 'user-456' },
351
+ partner: { name: 'acme' },
352
+ template: {
353
+ html: legacyHtml,
354
+ css: legacyCss,
355
+ migration: {
356
+ recommendationConfigs: {
357
+ // Key = legacy block element id (also present as `id` in the entry)
358
+ 'recommendation-1700000000000': {
359
+ id: 1700000000000,
360
+ // Filter-driven block — productIds is empty, filters/strategy drive selection
361
+ productIds: [],
362
+ filters: [{ field: 'category', op: 'eq', value: 'shoes' }],
363
+ strategy: 'newArrivals',
364
+ shuffleProducts: false,
365
+ sendProductRequestFlag: true,
366
+
367
+ // Display & locale
368
+ currency: 'EUR',
369
+ currencySettings: { decimal: ',', thousand: '.', alignment: 'left' },
370
+ language: 'nl_NL',
371
+ decimalCount: 2,
372
+
373
+ // Layout
374
+ cardsInRow: 2,
375
+ orientation: 'vertical',
376
+ textTrimming: true,
377
+ unresponsive: false,
378
+ mobileLeftPadding: 0,
379
+ mobileRightPadding: 0,
380
+
381
+ // Snapshot of products as they were rendered in the legacy email
382
+ recommendedProducts: [/* ...legacy product objects... */],
383
+ },
384
+ },
385
+ },
386
+ },
387
+ };
388
+ ```
389
+
390
+ All fields on a `LegacyRecommendationConfig` entry are optional — pass whatever your storage layer has for that block. Unknown keys are preserved and forwarded to the migrator unchanged, so partner-specific extensions continue to round-trip.
391
+
392
+ ### Field reference
393
+
394
+ | Field | Type | Purpose |
395
+ |-------|------|---------|
396
+ | `id` | `number` | Block ID (matches the dictionary key and legacy HTML element id) |
397
+ | `productIds` | `unknown[]` | Pinned product IDs — empty when filter-driven |
398
+ | `filters` | `unknown[]` | Filter rules driving product selection |
399
+ | `strategy` | `string` | Recommendation strategy key (e.g. `'newArrivals'`) |
400
+ | `shuffleProducts` | `boolean` | Whether to randomize product order |
401
+ | `sendProductRequestFlag` | `boolean` | Whether the block requested live products at send time |
402
+ | `currency` | `string` | Currency code (e.g. `'EUR'`) |
403
+ | `currencySettings` | `unknown` | Separators, alignment, decimals |
404
+ | `language` | `string` | Locale (e.g. `'nl_NL'`) |
405
+ | `decimalCount` | `string \| number` | Decimal places for price display |
406
+ | `cardsInRow` | `number` | Product cards per row |
407
+ | `orientation` | `'vertical' \| 'horizontal'` | Layout orientation |
408
+ | `size` | `string \| number` | Size variant marker (legacy) |
409
+ | `verticalResponsiveness` | `boolean` | Vertical responsiveness flag (legacy `size=1` variants) |
410
+ | `blockType` | `string` | Block type marker used by some legacy variants |
411
+ | `textTrimming` | `boolean` | Whether long text is trimmed |
412
+ | `unresponsive` | `boolean` | Disable responsive scaling |
413
+ | `mobileLeftPadding` / `mobileRightPadding` | `number` | Mobile-only horizontal padding |
414
+ | `recommendedProducts` | `unknown[]` | Snapshot of products rendered by the legacy block |
415
+
416
+ > **Note on data shape:** The schema uses `looseObject` because v1 partner data shapes vary across deployments. Some entries carry `verticalResponsiveness`, others carry `blockType` / `orientation` / `size`. Pass whatever you have — the migrator will use what it recognizes and preserve the rest.
417
+
418
+ ---
419
+
330
420
  ## HTML Compiler Rules
331
421
 
332
422
  Add custom rules to transform HTML during export:
@@ -382,6 +472,8 @@ import type {
382
472
  IdentityConfig,
383
473
  PartnerConfig,
384
474
  TemplateConfig,
475
+ TemplateMigrationConfig,
476
+ LegacyRecommendationConfig,
385
477
  EditorConfig,
386
478
  UIConfig,
387
479
  FeaturesConfig,
@@ -1,59 +1,59 @@
1
- import { ModuleFolderDefaults as b } from "../../enums/defaults.js";
2
- import { object as o, number as p, optional as e, string as t, pipe as u, picklist as n, minLength as d, custom as S, boolean as a, array as c, literal as l, variant as k } from "../../node_modules/valibot/dist/index.js";
3
- const m = {
1
+ import { ModuleFolderDefaults as S } from "../../enums/defaults.js";
2
+ import { object as o, number as n, optional as e, string as t, pipe as p, picklist as l, minLength as b, custom as h, boolean as a, array as c, record as k, looseObject as y, literal as i, variant as g, union as f, unknown as s } from "../../node_modules/valibot/dist/index.js";
3
+ const d = {
4
4
  /** Promotional/marketing emails */
5
5
  PROMOTIONAL: 1,
6
6
  /** Transactional/system emails */
7
7
  TRANSACTIONAL: 2
8
- }, s = {
8
+ }, r = {
9
9
  /** Standard email campaigns */
10
10
  EMAIL: 60,
11
11
  /** Architect journey builder */
12
12
  ARCHITECT: 49,
13
13
  /** Unsubscribe page builder */
14
14
  UNSUBSCRIBE_PAGES: 97
15
- }, h = o({
15
+ }, R = o({
16
16
  /** Unique identifier for the template being edited */
17
- templateId: u(
17
+ templateId: p(
18
18
  t(),
19
- d(1, "templateId is required")
19
+ b(1, "templateId is required")
20
20
  ),
21
21
  /** Unique identifier for the user editing the template */
22
- userId: u(
22
+ userId: p(
23
23
  t(),
24
- d(1, "userId is required")
24
+ b(1, "userId is required")
25
25
  ),
26
26
  /** Optional variation ID for A/B testing */
27
27
  variationId: e(t())
28
- }), y = o({
28
+ }), C = o({
29
29
  /** Fallback font name (e.g., "Georgia") */
30
30
  name: t(),
31
31
  /** Fallback font family (e.g., "serif" or "sans-serif") */
32
32
  family: t()
33
- }), f = o({
33
+ }), T = o({
34
34
  /** Partner/organization name (required) */
35
- name: u(
35
+ name: p(
36
36
  t(),
37
- d(1, "partner.name is required")
37
+ b(1, "partner.name is required")
38
38
  ),
39
39
  /** Product type identifier */
40
40
  productType: e(
41
- n([
42
- s.EMAIL,
43
- s.ARCHITECT,
44
- s.UNSUBSCRIBE_PAGES
41
+ l([
42
+ r.EMAIL,
43
+ r.ARCHITECT,
44
+ r.UNSUBSCRIBE_PAGES
45
45
  ]),
46
- s.EMAIL
46
+ r.EMAIL
47
47
  ),
48
48
  /** Message type (promotional or transactional) */
49
49
  messageType: e(
50
- n([m.PROMOTIONAL, m.TRANSACTIONAL]),
51
- m.PROMOTIONAL
50
+ l([d.PROMOTIONAL, d.TRANSACTIONAL]),
51
+ d.PROMOTIONAL
52
52
  ),
53
53
  /** Display name for the current user */
54
54
  username: e(t(), "Guido User"),
55
55
  /** Fallback font settings from partner settings — used to match backend size calculation */
56
- fallbackFont: e(y)
56
+ fallbackFont: e(C)
57
57
  }), A = o({
58
58
  /** Display text for the dynamic content */
59
59
  text: t(),
@@ -68,7 +68,59 @@ const m = {
68
68
  value: t()
69
69
  })
70
70
  )
71
- }), R = o({
71
+ }), I = y({
72
+ /** Block ID (matches the dictionary key and the legacy HTML element id) */
73
+ id: e(n()),
74
+ /** Decimal places for price display (legacy data may use string or number) */
75
+ decimalCount: e(f([t(), n()])),
76
+ /** Pinned product IDs (empty array when filter-driven) */
77
+ productIds: e(c(s())),
78
+ /** Whether the block requested live products at send time */
79
+ sendProductRequestFlag: e(a()),
80
+ /** Whether to randomize product order */
81
+ shuffleProducts: e(a()),
82
+ /** Filter rules driving product selection */
83
+ filters: e(c(s())),
84
+ /** Currency code (e.g. 'EUR') — sometimes absent in legacy data */
85
+ currency: e(t()),
86
+ /** Currency display settings (separators, alignment, decimals) */
87
+ currencySettings: e(s()),
88
+ /** Locale (e.g. 'nl_NL') */
89
+ language: e(t()),
90
+ /** Recommendation strategy key (e.g. 'newArrivals') */
91
+ strategy: e(t()),
92
+ /** Snapshot of products as rendered by the legacy block */
93
+ recommendedProducts: e(c(s())),
94
+ /** Number of product cards per row */
95
+ cardsInRow: e(n()),
96
+ /** Mobile-only padding (right) */
97
+ mobileRightPadding: e(n()),
98
+ /** Mobile-only padding (left) */
99
+ mobileLeftPadding: e(n()),
100
+ /** Disable responsive scaling */
101
+ unresponsive: e(a()),
102
+ /** Layout orientation ('vertical' | 'horizontal') */
103
+ orientation: e(t()),
104
+ /** Whether long text is trimmed */
105
+ textTrimming: e(a()),
106
+ /** Block type marker used by some legacy variants */
107
+ blockType: e(t()),
108
+ /** Size variant marker (legacy data may use string or number) */
109
+ size: e(f([t(), n()])),
110
+ /** Vertical responsiveness flag (legacy size=1 variants) */
111
+ verticalResponsiveness: e(a())
112
+ }), E = o({
113
+ /**
114
+ * Legacy recommendation block configs keyed by block ID.
115
+ * Pass this when loading a template authored with the v1
116
+ * recommendation block so the migrator can preserve filters,
117
+ * strategy, currency, locale, and layout data.
118
+ */
119
+ recommendationConfigs: e(
120
+ k(t(), I),
121
+ {}
122
+ )
123
+ }), L = o({
72
124
  /** Initial HTML content */
73
125
  html: e(t(), ""),
74
126
  /** Initial CSS content */
@@ -81,33 +133,35 @@ const m = {
81
133
  /** Valid custom field attribute names from the partner's categorized fields */
82
134
  customFieldAttributes: e(c(t()), []),
83
135
  /** Selected unsubscribe page IDs */
84
- selectedUnsubscribePages: e(c(p()), []),
136
+ selectedUnsubscribePages: e(c(n()), []),
85
137
  /** Force recreate template in Stripo storage (use true when updating externally modified templates) */
86
- forceRecreate: e(a(), !1)
87
- }), C = o({
138
+ forceRecreate: e(a(), !1),
139
+ /** Migration-only inputs (legacy block configs) */
140
+ migration: e(E, {})
141
+ }), O = o({
88
142
  /** Sender display name */
89
143
  senderName: e(t(), ""),
90
144
  /** Email subject line */
91
145
  subject: e(t(), "")
92
- }), T = o({
146
+ }), M = o({
93
147
  /** Locale for the editor UI */
94
148
  locale: e(t(), "en"),
95
149
  /** Path to translations object */
96
150
  translationsPath: e(t(), "window.trans[Object.keys(window.trans)[0]]"),
97
151
  /** Migration date for template compatibility */
98
- migrationDate: e(p(), 1759696858),
152
+ migrationDate: e(n(), 1759696858),
99
153
  /** Email header settings */
100
- emailHeader: e(C, { senderName: "", subject: "" }),
154
+ emailHeader: e(O, { senderName: "", subject: "" }),
101
155
  /** Folder name for user-saved modules (used by Stripo plugin panel for path construction) */
102
- savedModulesFolderName: e(t(), b.SAVED_MODULES),
156
+ savedModulesFolderName: e(t(), S.SAVED_MODULES),
103
157
  /** Folder name for default/prebuilt modules (used by Stripo plugin panel for path construction) */
104
- defaultModulesFolderName: e(t(), b.DEFAULT_MODULES)
105
- }), I = o({
158
+ defaultModulesFolderName: e(t(), S.DEFAULT_MODULES)
159
+ }), P = o({
106
160
  /** Whether to show the header bar */
107
161
  showHeader: e(a(), !0),
108
162
  /** Custom label for back button (if shown) */
109
163
  backButtonLabel: e(t())
110
- }), E = o({
164
+ }), v = o({
111
165
  /** Enable dynamic content insertion */
112
166
  dynamicContent: e(a(), !0),
113
167
  /** Enable save as template functionality */
@@ -124,7 +178,7 @@ const m = {
124
178
  modulesDisabled: e(a(), !1),
125
179
  /** Enable Liquid template syntax */
126
180
  liquidSyntax: e(a(), !1)
127
- }), g = n([
181
+ }), N = l([
128
182
  "amp-accordion",
129
183
  "amp-carousel",
130
184
  "amp-form-controls",
@@ -138,7 +192,7 @@ const m = {
138
192
  "text-block",
139
193
  "timer-block",
140
194
  "video-block"
141
- ]), O = n([
195
+ ]), D = l([
142
196
  "dynamic-content",
143
197
  "checkbox-block",
144
198
  "radio-button-block",
@@ -146,119 +200,121 @@ const m = {
146
200
  "unsubscribe-block",
147
201
  "coupon-block",
148
202
  "items-block"
149
- ]), L = o({
203
+ ]), x = o({
150
204
  /** Default blocks to exclude from the editor */
151
205
  excludeDefaults: e(
152
- c(g),
206
+ c(N),
153
207
  []
154
208
  ),
155
209
  /** Custom blocks to include in the editor */
156
210
  includeCustoms: e(
157
- c(O),
211
+ c(D),
158
212
  []
159
213
  )
160
- }), r = o({
214
+ }), m = o({
161
215
  /** Unique identifier for the rule */
162
216
  id: t(),
163
217
  /** Human-readable description */
164
218
  description: e(t()),
165
219
  /** Priority for rule ordering (lower = earlier) */
166
- priority: p()
167
- }), M = o({
168
- ...r.entries,
169
- type: l("replace"),
220
+ priority: n()
221
+ }), F = o({
222
+ ...m.entries,
223
+ type: i("replace"),
170
224
  /** String to search for */
171
225
  search: t(),
172
226
  /** Replacement string */
173
227
  replacement: t(),
174
228
  /** Replace all occurrences (default: false) */
175
229
  replaceAll: e(a())
176
- }), N = o({
177
- ...r.entries,
178
- type: l("regex"),
230
+ }), U = o({
231
+ ...m.entries,
232
+ type: i("regex"),
179
233
  /** Regex pattern string */
180
234
  pattern: t(),
181
235
  /** Replacement string (supports $1, $2, etc.) */
182
236
  replacement: t(),
183
237
  /** Regex flags (e.g., 'gi') */
184
238
  flags: e(t())
185
- }), D = o({
186
- ...r.entries,
187
- type: l("remove"),
239
+ }), B = o({
240
+ ...m.entries,
241
+ type: i("remove"),
188
242
  /** Strings or patterns to remove */
189
243
  targets: c(t())
190
- }), v = o({
191
- ...r.entries,
192
- type: l("custom"),
244
+ }), w = o({
245
+ ...m.entries,
246
+ type: i("custom"),
193
247
  /** Custom processor function */
194
- processor: S(
195
- (i) => typeof i == "function",
248
+ processor: h(
249
+ (u) => typeof u == "function",
196
250
  "processor must be a function"
197
251
  )
198
- }), x = k("type", [
199
- M,
200
- N,
201
- D,
202
- v
203
- ]), U = o({
252
+ }), H = g("type", [
253
+ F,
254
+ U,
255
+ B,
256
+ w
257
+ ]), j = o({
204
258
  /** Custom compiler rules to apply */
205
- customRules: e(c(x), []),
259
+ customRules: e(c(H), []),
206
260
  /** Skip default compiler rules */
207
261
  ignoreDefaultRules: e(a(), !1)
208
- }), B = o({
262
+ }), q = o({
209
263
  /**
210
264
  * External validation handler called before save completes.
211
265
  * Return false to cancel the save operation.
212
266
  */
213
267
  externalValidation: e(
214
- S(
215
- (i) => typeof i == "function",
268
+ h(
269
+ (u) => typeof u == "function",
216
270
  "externalValidation must be a function"
217
271
  )
218
272
  )
219
- }), H = o({
273
+ }), V = o({
220
274
  // Required sections
221
275
  /** Identity configuration (required) */
222
- identity: h,
276
+ identity: R,
223
277
  /** Partner configuration (required) */
224
- partner: f,
278
+ partner: T,
225
279
  // Optional sections (with defaults)
226
280
  /** Template content and presets */
227
- template: e(R, {}),
281
+ template: e(L, {}),
228
282
  /** Editor settings */
229
- editor: e(T, {}),
283
+ editor: e(M, {}),
230
284
  /** UI configuration */
231
- ui: e(I, {}),
285
+ ui: e(P, {}),
232
286
  /** Feature toggles */
233
- features: e(E, {}),
287
+ features: e(v, {}),
234
288
  /** Block configuration */
235
- blocks: e(L, {}),
289
+ blocks: e(x, {}),
236
290
  /** Compiler configuration */
237
- compiler: e(U, {}),
291
+ compiler: e(j, {}),
238
292
  /** Callbacks and event handlers */
239
- callbacks: e(B, {})
293
+ callbacks: e(q, {})
240
294
  });
241
295
  export {
242
- L as BlocksSchema,
243
- B as CallbacksSchema,
244
- x as CompilerRuleSchema,
245
- U as CompilerSchema,
246
- O as CustomBlockTypeSchema,
247
- v as CustomRuleSchema,
248
- g as DefaultBlockTypeSchema,
296
+ x as BlocksSchema,
297
+ q as CallbacksSchema,
298
+ H as CompilerRuleSchema,
299
+ j as CompilerSchema,
300
+ D as CustomBlockTypeSchema,
301
+ w as CustomRuleSchema,
302
+ N as DefaultBlockTypeSchema,
249
303
  A as DynamicContentSchema,
250
- T as EditorSchema,
251
- C as EmailHeaderSchema,
252
- y as FallbackFontSchema,
253
- E as FeaturesSchema,
254
- H as GuidoConfigSchema,
255
- h as IdentitySchema,
256
- m as MessageType,
257
- f as PartnerSchema,
258
- s as ProductType,
259
- N as RegexRuleSchema,
260
- D as RemoveRuleSchema,
261
- M as ReplaceRuleSchema,
262
- R as TemplateSchema,
263
- I as UISchema
304
+ M as EditorSchema,
305
+ O as EmailHeaderSchema,
306
+ C as FallbackFontSchema,
307
+ v as FeaturesSchema,
308
+ V as GuidoConfigSchema,
309
+ R as IdentitySchema,
310
+ I as LegacyRecommendationConfigSchema,
311
+ d as MessageType,
312
+ T as PartnerSchema,
313
+ r as ProductType,
314
+ U as RegexRuleSchema,
315
+ B as RemoveRuleSchema,
316
+ F as ReplaceRuleSchema,
317
+ E as TemplateMigrationSchema,
318
+ L as TemplateSchema,
319
+ P as UISchema
264
320
  };
@@ -12,7 +12,7 @@ var t = function() {
12
12
  n,
13
13
  !1,
14
14
  null,
15
- "25780af6"
15
+ "428c209a"
16
16
  );
17
17
  const u = s.exports;
18
18
  export {