@designcrowd/library.brand-page 6.2.3 → 6.2.4

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 (112) hide show
  1. package/lib/src/{CreatedOnBrandCrowd-de-de-Cn0M-eZ1.js → CreatedOnBrandCrowd-de-de-ystrO2LW.js} +1 -1
  2. package/lib/src/{CreatedOnBrandCrowd-en-us-DRLMSDZr.js → CreatedOnBrandCrowd-en-us-BU7hNzTZ.js} +1 -1
  3. package/lib/src/{CreatedOnBrandCrowd-es-es-BglTu73U.js → CreatedOnBrandCrowd-es-es-CbuxneQ3.js} +1 -1
  4. package/lib/src/{CreatedOnBrandCrowd-fr-fr-Bj6YZ_el.js → CreatedOnBrandCrowd-fr-ca-BuNUGOFr.js} +1 -1
  5. package/lib/src/{CreatedOnBrandCrowd-fr-ca-Bj6YZ_el.js → CreatedOnBrandCrowd-fr-fr-BuNUGOFr.js} +1 -1
  6. package/lib/src/{CreatedOnBrandCrowd-pt-pt-DEoOmQ1F.js → CreatedOnBrandCrowd-pt-br-BehL88mc.js} +1 -1
  7. package/lib/src/{CreatedOnBrandCrowd-pt-br-DEoOmQ1F.js → CreatedOnBrandCrowd-pt-pt-BehL88mc.js} +1 -1
  8. package/lib/src/{CreatedOnDcom-de-de-BZ7gTt4Z.js → CreatedOnDcom-de-de-CMxjFZt9.js} +1 -1
  9. package/lib/src/{CreatedOnDcom-en-us-CD6Km5sH.js → CreatedOnDcom-en-us-2Cf6WBvx.js} +1 -1
  10. package/lib/src/{CreatedOnDcom-es-es-CNpZHvEl.js → CreatedOnDcom-es-es-CATNnbTq.js} +1 -1
  11. package/lib/src/{CreatedOnDcom-fr-ca-URS-ydJ1.js → CreatedOnDcom-fr-ca-DQtMfB-a.js} +1 -1
  12. package/lib/src/{CreatedOnDcom-fr-fr-D2AVeA3H.js → CreatedOnDcom-fr-fr-C1_FWOQf.js} +1 -1
  13. package/lib/src/{CreatedOnDcom-pt-br-C32frnFs.js → CreatedOnDcom-pt-br-C0QOCW0L.js} +1 -1
  14. package/lib/src/{CreatedOnDcom-pt-pt-TDYGjRXS.js → CreatedOnDcom-pt-pt-lHD-p6o4.js} +1 -1
  15. package/lib/src/brand-page/models/brand-page-context.model.d.ts +5 -0
  16. package/lib/src/brand-page/models/brand-page-context.model.js +8 -1
  17. package/lib/src/brand-page-maker/components/brand-page-maker/BrandPageMaker.mixin.d.ts +21 -0
  18. package/lib/src/brand-page-maker/components/brandpage-maker-page/BrandPageMakerPage.mixin.d.ts +21 -0
  19. package/lib/src/brand-page-maker/components/preview/Preview.mixin.d.ts +7 -0
  20. package/lib/src/brand-page-maker/components/quick-link-bar/QuickLinkBar.mixin.d.ts +21 -0
  21. package/lib/src/brand-page-maker/components/seo-settings/SeoPageSettings.mixin.d.ts +22 -1
  22. package/lib/src/brand-page-maker/components/seo-settings/UrlSettings.mixin.d.ts +21 -0
  23. package/lib/src/brand-page-maker/components/seo-settings/UseExistingDomainModal.mixin.d.ts +21 -0
  24. package/lib/src/brand-page-maker/components/template-preview/TemplatePreview.mixin.d.ts +21 -0
  25. package/lib/src/brand-page-maker/components/upgrade-to-premium-button/UpgradeToPremiumButton.mixin.d.ts +21 -0
  26. package/lib/src/brand-page-maker/composables/ai-chat/ai-builder-experiment.d.ts +10 -0
  27. package/lib/src/brand-page-maker/composables/ai-chat/ai-builder-experiment.js +11 -0
  28. package/lib/src/brand-page-maker/composables/ai-chat/useAiWebsiteBuilderChat.js +14 -4
  29. package/lib/src/brand-page-maker/stores/ai-thread/ai-website-builder-thread-store.d.ts +9 -2
  30. package/lib/src/brand-page-maker/stores/ai-thread/ai-website-builder-thread-store.js +20 -0
  31. package/lib/src/brand-page-maker/stores/brandpage-container/brand-page-container-store.d.ts +21 -0
  32. package/lib/src/clients/ai-assistant-client.d.ts +1 -0
  33. package/lib/src/clients/ai-assistant-client.js +1 -0
  34. package/lib/src/index.mjs +224 -223
  35. package/lib/src/{lib-Dm9AuOJL.js → lib-CqHUUPUW.js} +21920 -21691
  36. package/lib/src/metadata-builder/builders/global-font-propagation.d.ts +41 -0
  37. package/lib/src/metadata-builder/builders/global-font-propagation.js +146 -0
  38. package/lib/src/metadata-builder/builders/global-styles-builder.js +29 -1
  39. package/lib/src/metadata-builder/builders/header-builder.js +8 -0
  40. package/lib/src/metadata-builder/builders/reorder-pages-builder.d.ts +13 -0
  41. package/lib/src/metadata-builder/builders/reorder-pages-builder.js +49 -0
  42. package/lib/src/metadata-builder/builders/section-builders/index.d.ts +1 -0
  43. package/lib/src/metadata-builder/builders/section-builders/index.js +1 -0
  44. package/lib/src/metadata-builder/builders/section-builders/support-me-builder.d.ts +8 -0
  45. package/lib/src/metadata-builder/builders/section-builders/support-me-builder.js +25 -0
  46. package/lib/src/metadata-builder/builders/section-builders/text-section-builder.js +5 -2
  47. package/lib/src/metadata-builder/builders/section-field-maps.js +15 -0
  48. package/lib/src/metadata-builder/builders/section-field-utils.d.ts +6 -1
  49. package/lib/src/metadata-builder/builders/section-field-utils.js +48 -12
  50. package/lib/src/metadata-builder/builders/section-rules/support-me.rules.d.ts +2 -0
  51. package/lib/src/metadata-builder/builders/section-rules/support-me.rules.js +17 -0
  52. package/lib/src/metadata-builder/helpers/rte.helpers.d.ts +9 -0
  53. package/lib/src/metadata-builder/helpers/rte.helpers.js +60 -1
  54. package/lib/src/metadata-builder/metadata-executor.js +3 -1
  55. package/lib/src/metadata-builder/models.d.ts +2 -0
  56. package/lib/src/metadata-builder/models.js +2 -0
  57. package/lib/src/metadata-builder/parsers/ai-toolcall-parser.d.ts +1 -0
  58. package/lib/src/metadata-builder/parsers/ai-toolcall-parser.js +4 -0
  59. package/lib/src/metadata-builder/parsers/section-tool-arguments.d.ts +14 -2
  60. package/lib/src/shared/content-settings/components/GenericTextInput.mixin.d.ts +1 -1
  61. package/lib/src/shared/content-settings/components/email-field/EmailField.mixin.d.ts +1 -1
  62. package/lib/src/shared/content-settings/components/payment-config-field/PaymentConfigField.mixin.d.ts +21 -0
  63. package/lib/src/shared/content-settings/components/tel-field/TelField.mixin.d.ts +1 -1
  64. package/lib/src/shared/content-settings/components/text-field/TextField.mixin.d.ts +1 -1
  65. package/lib/src/shared/content-settings/components/textarea-field/TextareaField.mixin.d.ts +1 -1
  66. package/lib/src/shared/content-settings/components/url-field/UrlField.mixin.d.ts +1 -1
  67. package/lib/src/shared/content-settings/components/youtube-video-field/YoutubeVideoField.mixin.d.ts +1 -1
  68. package/lib/src/shared/logo-settings/components/LogoSettings.mixin.d.ts +21 -0
  69. package/lib/src/shared/page-settings/components/delete-page-modal/DeletePageModal.mixin.d.ts +1 -1
  70. package/lib/src/shared/page-settings/components/page-settings/PageSettings.mixin.d.ts +21 -0
  71. package/lib/src/shared/page-settings/components/page-settings-section-styles/PageSettingsSectionStyles.mixin.d.ts +21 -0
  72. package/lib/src/shared/publish-brand-page-with-state/PublishBrandPageModalWithState.mixin.d.ts +28 -0
  73. package/lib/src/shared/side-bar/components/SideBar.mixin.d.ts +21 -0
  74. package/lib/src/shared/style-settings/button-style-preset.d.ts +12 -0
  75. package/lib/src/shared/style-settings/button-style-preset.js +39 -0
  76. package/lib/src/shared/style-settings/components/StyleSettings.mixin.d.ts +21 -0
  77. package/lib/src/shared/style-settings/store/style-settings-store.js +6 -32
  78. package/lib/src/utils/minify-brand-page-metadata.d.ts +9 -0
  79. package/lib/src/utils/minify-brand-page-metadata.js +23 -1
  80. package/package.json +1 -12
  81. package/src/brand-page/models/brand-page-context.model.ts +14 -1
  82. package/src/brand-page-maker/components/ai-website-builder/AiWebsiteBuilder.vue +1 -1
  83. package/src/brand-page-maker/composables/ai-chat/ai-builder-experiment.test.ts +82 -0
  84. package/src/brand-page-maker/composables/ai-chat/ai-builder-experiment.ts +19 -0
  85. package/src/brand-page-maker/composables/ai-chat/useAiWebsiteBuilderChat.ts +18 -4
  86. package/src/brand-page-maker/stores/ai-thread/ai-website-builder-thread-store.ts +30 -0
  87. package/src/clients/ai-assistant-client.ts +1 -0
  88. package/src/metadata-builder/builders/global-font-propagation.test.ts +401 -0
  89. package/src/metadata-builder/builders/global-font-propagation.ts +238 -0
  90. package/src/metadata-builder/builders/global-styles-builder.test.ts +107 -0
  91. package/src/metadata-builder/builders/global-styles-builder.ts +38 -1
  92. package/src/metadata-builder/builders/header-builder.test.ts +45 -0
  93. package/src/metadata-builder/builders/header-builder.ts +20 -0
  94. package/src/metadata-builder/builders/reorder-pages-builder.ts +80 -0
  95. package/src/metadata-builder/builders/section-builders/index.ts +1 -0
  96. package/src/metadata-builder/builders/section-builders/support-me-builder.test.ts +177 -0
  97. package/src/metadata-builder/builders/section-builders/support-me-builder.ts +43 -0
  98. package/src/metadata-builder/builders/section-builders/text-section-builder.ts +5 -2
  99. package/src/metadata-builder/builders/section-field-maps.ts +18 -0
  100. package/src/metadata-builder/builders/section-field-utils.test.ts +83 -0
  101. package/src/metadata-builder/builders/section-field-utils.ts +69 -18
  102. package/src/metadata-builder/builders/section-rules/support-me.rules.ts +39 -0
  103. package/src/metadata-builder/helpers/rte.helpers.ts +82 -1
  104. package/src/metadata-builder/metadata-executor.ts +3 -0
  105. package/src/metadata-builder/models.ts +2 -0
  106. package/src/metadata-builder/parsers/ai-toolcall-parser.ts +4 -0
  107. package/src/metadata-builder/parsers/section-tool-arguments.ts +14 -1
  108. package/src/shared/style-settings/button-style-preset.test.ts +67 -0
  109. package/src/shared/style-settings/button-style-preset.ts +56 -0
  110. package/src/shared/style-settings/store/style-settings-store.ts +9 -38
  111. package/src/utils/minify-brand-page-metadata.test.ts +166 -1
  112. package/src/utils/minify-brand-page-metadata.ts +31 -1
@@ -1,4 +1,4 @@
1
- import { describe, test, expect } from 'vitest';
1
+ import { describe, it, test, expect } from 'vitest';
2
2
  import { BRAND_SITE } from '@brand-page-maker/components/brand-page-maker/__fixtures__';
3
3
  import { BrandPageModel, PageHeaderDesktop } from '@brand-page';
4
4
  import { minifyBrandPageMetadata } from './minify-brand-page-metadata';
@@ -71,6 +71,64 @@ describe('minifyBrandPageMetadata — header backgroundOpacity (BP-5851)', () =>
71
71
  });
72
72
  });
73
73
 
74
+ /**
75
+ * The AI builder can now create/update `support-me` sections, so the minified
76
+ * model it reads on update must surface the fields it can edit — otherwise it
77
+ * can't see the current `displayStyle` / `successMessage` when deciding what to
78
+ * change. `request-payment` (not AI-editable) must keep its original shape.
79
+ */
80
+
81
+ const makeModel = (contents: unknown[]): BrandPageModel =>
82
+ ({
83
+ brandPageType: 'brandSite',
84
+ v: 1,
85
+ styles: {},
86
+ nav: { routes: [{ pageId: 'page-1', pageSlug: 'home' }] },
87
+ pages: [{ id: 'page-1', title: 'Home', contents }],
88
+ }) as unknown as BrandPageModel;
89
+
90
+ const supportMe = {
91
+ id: 'sm-1',
92
+ type: 'support-me',
93
+ title: 'Buy me a coffee',
94
+ description: 'Support my work',
95
+ successMessage: 'Thanks so much!',
96
+ displayStyle: 'collapsed',
97
+ };
98
+
99
+ const requestPayment = {
100
+ id: 'rp-1',
101
+ type: 'request-payment',
102
+ title: 'Pay now',
103
+ description: 'Invoice',
104
+ successMessage: 'Paid',
105
+ displayStyle: 'preview',
106
+ };
107
+
108
+ describe('minifyBrandPageMetadata — support-me', () => {
109
+ it('surfaces title, description, successMessage and displayStyle', () => {
110
+ const out = minifyBrandPageMetadata(makeModel([supportMe]));
111
+ const minified = out.pages[0].contents[0];
112
+
113
+ expect(minified.type).toBe('support-me');
114
+ expect(minified.title).toBe('Buy me a coffee');
115
+ expect(minified.description).toBe('Support my work');
116
+ expect(minified.successMessage).toBe('Thanks so much!');
117
+ expect(minified.displayStyle).toBe('collapsed');
118
+ });
119
+
120
+ it('leaves request-payment shape unchanged (no successMessage / displayStyle)', () => {
121
+ const out = minifyBrandPageMetadata(makeModel([requestPayment]));
122
+ const minified = out.pages[0].contents[0];
123
+
124
+ expect(minified.type).toBe('request-payment');
125
+ expect(minified.title).toBe('Pay now');
126
+ expect(minified.description).toBe('Invoice');
127
+ expect(minified.successMessage).toBeUndefined();
128
+ expect(minified.displayStyle).toBeUndefined();
129
+ });
130
+ });
131
+
74
132
  /**
75
133
  * BP-5886 — the outbound half of the AI colour bridge (review blocker B8).
76
134
  *
@@ -169,3 +227,110 @@ describe('minifyBrandPageMetadata — palette resolution', () => {
169
227
  expect(sut.styles.colors).toHaveLength(3);
170
228
  });
171
229
  });
230
+
231
+ /**
232
+ * BP-6081: the AI reads colours as values and floors text against the band it
233
+ * sits on. The footer shipped with no colours at all and a text section's band
234
+ * lives on the flat `backgroundColor` key, so both bands were invisible to it.
235
+ */
236
+ describe('minifyBrandPageMetadata — bands the AI must see (BP-6081)', () => {
237
+ const withFooter = (footer: Record<string, unknown>): BrandPageModel =>
238
+ ({
239
+ ...makeModel([]),
240
+ pageFooterDesktop: footer,
241
+ pageFooterMobile: footer,
242
+ }) as unknown as BrandPageModel;
243
+
244
+ it('surfaces the footer band, copyright ink and icon fill', () => {
245
+ const out = minifyBrandPageMetadata(
246
+ withFooter({
247
+ displayStyle: 'centered-menu',
248
+ copyrightText: '© 2026',
249
+ backgroundStyle: { backgroundColor: '#24749c' },
250
+ copyrightStyle: { color: '#e4f0f5', fontSize: '1.1em' },
251
+ iconStyle: { fill: '#e4f0f5' },
252
+ }),
253
+ );
254
+
255
+ expect(out.footer?.desktop?.backgroundStyle).toEqual({
256
+ backgroundColor: '#24749c',
257
+ });
258
+ expect(out.footer?.desktop?.copyrightStyle).toEqual({ color: '#e4f0f5' });
259
+ expect(out.footer?.desktop?.iconStyle).toEqual({ fill: '#e4f0f5' });
260
+ expect(out.footer?.mobile?.backgroundStyle).toEqual({
261
+ backgroundColor: '#24749c',
262
+ });
263
+ });
264
+
265
+ it('omits footer colour keys that are absent or empty', () => {
266
+ const out = minifyBrandPageMetadata(
267
+ withFooter({
268
+ displayStyle: 'centered-menu',
269
+ backgroundStyle: { backgroundColor: '' },
270
+ }),
271
+ );
272
+
273
+ expect(out.footer?.desktop?.backgroundStyle).toBeUndefined();
274
+ expect(out.footer?.desktop?.copyrightStyle).toBeUndefined();
275
+ expect(out.footer?.desktop?.iconStyle).toBeUndefined();
276
+ });
277
+
278
+ it('surfaces a text section band stored as a flat backgroundColor object', () => {
279
+ const out = minifyBrandPageMetadata(
280
+ makeModel([
281
+ {
282
+ id: 't-1',
283
+ type: 'text',
284
+ text: 'Hours',
285
+ textItems: [],
286
+ backgroundColor: { backgroundColor: '#254250' },
287
+ },
288
+ ]),
289
+ );
290
+
291
+ expect(out.pages[0].contents[0].backgroundStyle).toEqual({
292
+ backgroundColor: '#254250',
293
+ });
294
+ });
295
+
296
+ it('surfaces a text section band stored as a bare string', () => {
297
+ const out = minifyBrandPageMetadata(
298
+ makeModel([
299
+ {
300
+ id: 't-2',
301
+ type: 'text',
302
+ text: 'Hours',
303
+ textItems: [],
304
+ backgroundColor: '#254250',
305
+ },
306
+ ]),
307
+ );
308
+
309
+ expect(out.pages[0].contents[0].backgroundStyle).toEqual({
310
+ backgroundColor: '#254250',
311
+ });
312
+ });
313
+
314
+ it('emits no band for a text section without one', () => {
315
+ const out = minifyBrandPageMetadata(
316
+ makeModel([{ id: 't-3', type: 'text', text: 'Hours', textItems: [] }]),
317
+ );
318
+
319
+ expect(out.pages[0].contents[0].backgroundStyle).toBeUndefined();
320
+ });
321
+
322
+ it('resolves a palette reference on the footer band to its value', () => {
323
+ const model = withFooter({
324
+ backgroundStyle: { backgroundColor: 'var(--palette-1)' },
325
+ });
326
+
327
+ (model as any).styles = {
328
+ colors: [{ id: 'palette-1', value: '#24749c', type: 'brand' }],
329
+ };
330
+ const out = minifyBrandPageMetadata(model);
331
+
332
+ expect(out.footer?.desktop?.backgroundStyle).toEqual({
333
+ backgroundColor: '#24749c',
334
+ });
335
+ });
336
+ });
@@ -35,6 +35,11 @@ type MinifiedFooter = {
35
35
  logoImageWidth?: string;
36
36
  logoAssetKey?: string;
37
37
  socialLinks?: MinifiedFooterSocialLink[];
38
+ // BP-6081: the footer's colours, so the AI can judge and recolour the copyright
39
+ // line and icons against the band they sit on (the header already carries its bg).
40
+ backgroundStyle?: { backgroundColor?: string };
41
+ copyrightStyle?: { color?: string };
42
+ iconStyle?: { fill?: string };
38
43
  };
39
44
 
40
45
  type MinifiedHeader = {
@@ -364,7 +369,15 @@ const minifyContent = (
364
369
  })),
365
370
  }),
366
371
  ...(includeStyle(c.textStyle) && { textStyle: c.textStyle }),
367
- ...includeBackgroundStyle(c.backgroundStyle),
372
+ // A text section keeps its band on the flat `backgroundColor` key — as a
373
+ // `{ backgroundColor }` object or a bare string — not on `backgroundStyle`,
374
+ // so the shared helper saw nothing and the AI never knew the band (BP-6081).
375
+ ...includeBackgroundStyle(
376
+ c.backgroundStyle ??
377
+ (typeof c.backgroundColor === 'string'
378
+ ? { backgroundColor: c.backgroundColor }
379
+ : c.backgroundColor),
380
+ ),
368
381
  };
369
382
 
370
383
  case 'profile':
@@ -516,11 +529,19 @@ const minifyContent = (
516
529
  return base;
517
530
 
518
531
  case 'request-payment':
532
+ return {
533
+ ...base,
534
+ ...st('title', c.title, editor),
535
+ ...st('description', c.description, editor),
536
+ };
537
+
519
538
  case 'support-me':
520
539
  return {
521
540
  ...base,
522
541
  ...st('title', c.title, editor),
523
542
  ...st('description', c.description, editor),
543
+ ...st('successMessage', c.successMessage, editor),
544
+ ...(includeString(c.displayStyle) && { displayStyle: c.displayStyle }),
524
545
  };
525
546
 
526
547
  default:
@@ -549,6 +570,15 @@ const minifyFooter = (
549
570
  url: l.url || '',
550
571
  }))
551
572
  : undefined,
573
+ backgroundStyle: footer.backgroundStyle?.backgroundColor
574
+ ? { backgroundColor: footer.backgroundStyle.backgroundColor as string }
575
+ : undefined,
576
+ copyrightStyle: footer.copyrightStyle?.color
577
+ ? { color: footer.copyrightStyle.color }
578
+ : undefined,
579
+ iconStyle: (footer.iconStyle as { fill?: string } | undefined)?.fill
580
+ ? { fill: (footer.iconStyle as { fill?: string }).fill as string }
581
+ : undefined,
552
582
  };
553
583
  };
554
584