@designcrowd/library.brand-page 6.2.11 → 6.2.12

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 (576) hide show
  1. package/lib/src/{CreatedOnBrandCrowd-de-de-DDcraD5S.js → CreatedOnBrandCrowd-de-de-BtVKllNQ.js} +1 -1
  2. package/lib/src/{CreatedOnBrandCrowd-en-us-DtOeaisf.js → CreatedOnBrandCrowd-en-us-CX5V0v8u.js} +1 -1
  3. package/lib/src/{CreatedOnBrandCrowd-es-es-BZpmJPew.js → CreatedOnBrandCrowd-es-es-CbA02PCL.js} +1 -1
  4. package/lib/src/{CreatedOnBrandCrowd-fr-fr-CqRwC4e7.js → CreatedOnBrandCrowd-fr-ca-BQAKruBF.js} +1 -1
  5. package/lib/src/{CreatedOnBrandCrowd-fr-ca-CqRwC4e7.js → CreatedOnBrandCrowd-fr-fr-BQAKruBF.js} +1 -1
  6. package/lib/src/{CreatedOnBrandCrowd-pt-pt-DId9Dfjh.js → CreatedOnBrandCrowd-pt-br-Yk_yzB3s.js} +1 -1
  7. package/lib/src/{CreatedOnBrandCrowd-pt-br-DId9Dfjh.js → CreatedOnBrandCrowd-pt-pt-Yk_yzB3s.js} +1 -1
  8. package/lib/src/{CreatedOnDcom-de-de-BTDfmOcm.js → CreatedOnDcom-de-de-DJZQbPSD.js} +1 -1
  9. package/lib/src/{CreatedOnDcom-en-us-CeAu9Ayx.js → CreatedOnDcom-en-us-BJvNAa4l.js} +1 -1
  10. package/lib/src/{CreatedOnDcom-es-es-WCv0K41H.js → CreatedOnDcom-es-es-CUwB1FRY.js} +1 -1
  11. package/lib/src/{CreatedOnDcom-fr-ca-BlfevQDY.js → CreatedOnDcom-fr-ca-CK54U4oh.js} +1 -1
  12. package/lib/src/{CreatedOnDcom-fr-fr-Cvt7MHPZ.js → CreatedOnDcom-fr-fr-DuUNBGrM.js} +1 -1
  13. package/lib/src/{CreatedOnDcom-pt-br-DipZuylv.js → CreatedOnDcom-pt-br-BfODpFNV.js} +1 -1
  14. package/lib/src/{CreatedOnDcom-pt-pt-BCw4lcKN.js → CreatedOnDcom-pt-pt-Cf6u2GCg.js} +1 -1
  15. package/lib/src/brand-page/__fixtures__/production-text-style-resolver.fixture.d.ts +16 -0
  16. package/lib/src/brand-page/__fixtures__/production-text-style-resolver.fixture.js +35 -0
  17. package/lib/src/brand-page/components/contact-form/ContactForm.mixin.d.ts +3 -0
  18. package/lib/src/brand-page/components/contact-form/ContactForm.mixin.js +19 -13
  19. package/lib/src/brand-page/components/mailing-list/MailingList.mixin.d.ts +3 -1
  20. package/lib/src/brand-page/components/mailing-list/MailingList.mixin.js +17 -2
  21. package/lib/src/brand-page/components/navigation/button-carousel/ButtonCarouselNavigation.mixin.d.ts +11 -3
  22. package/lib/src/brand-page/components/navigation/button-carousel/ButtonCarouselNavigation.mixin.js +35 -1
  23. package/lib/src/brand-page/components/navigation/navigation-side-menu/NavigationSideMenu.mixin.d.ts +8 -2
  24. package/lib/src/brand-page/components/navigation/navigation-side-menu/NavigationSideMenu.mixin.js +27 -3
  25. package/lib/src/brand-page/components/page/Page.mixin.d.ts +5 -2
  26. package/lib/src/brand-page/components/page/Page.mixin.js +33 -27
  27. package/lib/src/brand-page/components/page-footer/PageFooter.mixin.d.ts +7 -2
  28. package/lib/src/brand-page/components/page-footer/PageFooter.mixin.js +21 -1
  29. package/lib/src/brand-page/components/payment/Payment.mixin.d.ts +5 -2
  30. package/lib/src/brand-page/components/payment/Payment.mixin.js +22 -2
  31. package/lib/src/brand-page/components/payment/support-me/SupportMe.mixin.d.ts +6 -2
  32. package/lib/src/brand-page/components/payment/support-me/SupportMe.mixin.js +32 -1
  33. package/lib/src/brand-page/components/social-links/SocialLinks.stories.js +0 -3
  34. package/lib/src/brand-page/components/testimonial-section/__fixtures__/data.js +0 -3
  35. package/lib/src/brand-page/components/text/Text.stories.js +0 -17
  36. package/lib/src/brand-page/constants/font.constants.d.ts +62 -0
  37. package/lib/src/brand-page/constants/font.constants.js +35 -0
  38. package/lib/src/brand-page/models/index.d.ts +23 -24
  39. package/lib/src/brand-page/models/index.js +20 -7
  40. package/lib/src/brand-page/models/navigation-styles.model.d.ts +1 -1
  41. package/lib/src/brand-page/models/navigation-styles.model.js +17 -8
  42. package/lib/src/brand-page/models/payment.model.d.ts +11 -6
  43. package/lib/src/brand-page/models/styles.model.d.ts +53 -7
  44. package/lib/src/brand-page/models/styles.model.js +115 -27
  45. package/lib/src/brand-page/utils/color-palette.util.d.ts +43 -23
  46. package/lib/src/brand-page/utils/color-palette.util.js +65 -27
  47. package/lib/src/brand-page/utils/color.util.d.ts +13 -9
  48. package/lib/src/brand-page/utils/color.util.js +56 -15
  49. package/lib/src/brand-page/utils/container-text-color.util.d.ts +46 -13
  50. package/lib/src/brand-page/utils/container-text-color.util.js +321 -41
  51. package/lib/src/brand-page/utils/index.d.ts +1 -0
  52. package/lib/src/brand-page/utils/index.js +1 -0
  53. package/lib/src/brand-page/utils/migration/migration-20.js +6 -2
  54. package/lib/src/brand-page/utils/migration/migration-21.js +34 -6
  55. package/lib/src/brand-page/utils/migration/migration-22.d.ts +99 -0
  56. package/lib/src/brand-page/utils/migration/migration-22.js +909 -0
  57. package/lib/src/brand-page/utils/migration.util.js +17 -0
  58. package/lib/src/brand-page/utils/model.util.d.ts +4 -0
  59. package/lib/src/brand-page/utils/model.util.js +4 -0
  60. package/lib/src/brand-page/utils/personalisation.util.js +9 -1
  61. package/lib/src/brand-page/utils/rte-role-lift.util.d.ts +72 -0
  62. package/lib/src/brand-page/utils/rte-role-lift.util.js +275 -0
  63. package/lib/src/brand-page/utils/style.util.d.ts +5 -1
  64. package/lib/src/brand-page/utils/style.util.js +34 -11
  65. package/lib/src/brand-page/utils/text-role-css.util.d.ts +19 -0
  66. package/lib/src/brand-page/utils/text-role-css.util.js +186 -0
  67. package/lib/src/brand-page/utils/text-role-reconnect.util.d.ts +90 -0
  68. package/lib/src/brand-page/utils/text-role-reconnect.util.js +434 -0
  69. package/lib/src/brand-page/utils/text-style.util.d.ts +53 -23
  70. package/lib/src/brand-page/utils/text-style.util.js +122 -22
  71. package/lib/src/brand-page/utils/view-model.util.d.ts +9 -1
  72. package/lib/src/brand-page/utils/view-model.util.js +124 -111
  73. package/lib/src/brand-page/view-models.d.ts +1 -0
  74. package/lib/src/brand-page-maker/components/action-bar/ActionBar.mixin.d.ts +4 -1
  75. package/lib/src/brand-page-maker/components/brand-page-maker/BrandPageMaker.mixin.d.ts +13 -2
  76. package/lib/src/brand-page-maker/components/brand-page-maker/BrandPageMaker.mixin.js +4 -4
  77. package/lib/src/brand-page-maker/components/brand-page-maker/BrandPageMakerTemplateSettings.mixin.d.ts +4 -1
  78. package/lib/src/brand-page-maker/components/brand-page-maker/__fixtures__/brand-page-examples.js +0 -10
  79. package/lib/src/brand-page-maker/components/brand-page-maker/__fixtures__/content-settings-items.fixture.js +0 -1
  80. package/lib/src/brand-page-maker/components/brandpage-maker-page/BrandPageMakerPage.mixin.d.ts +23 -138
  81. package/lib/src/brand-page-maker/components/brandpage-maker-page/BrandPageMakerPage.mixin.js +0 -28
  82. package/lib/src/brand-page-maker/components/brandpage-settings/ReplaceImageSettingsForBrandPageSettings.mixin.d.ts +4 -1
  83. package/lib/src/brand-page-maker/components/navigation/Navigation.mixin.d.ts +1 -1
  84. package/lib/src/brand-page-maker/components/seo-settings/SeoPageSettings.mixin.d.ts +5 -2
  85. package/lib/src/brand-page-maker/components/seo-settings/UrlSettings.mixin.d.ts +4 -1
  86. package/lib/src/brand-page-maker/components/social-share/SocialShare.mixin.d.ts +4 -1
  87. package/lib/src/brand-page-maker/components/template-preview/TemplatePreview.mixin.d.ts +4 -1
  88. package/lib/src/brand-page-maker/composables/ai-chat/useAiMetadataBuilder.d.ts +1 -0
  89. package/lib/src/brand-page-maker/composables/ai-chat/useAiMetadataBuilder.js +1 -0
  90. package/lib/src/brand-page-maker/composables/ai-chat/useAiWebsiteBuilderChat.js +1 -0
  91. package/lib/src/brand-page-maker/composables/rich-text-editor/extensions/RoleTypographyFill.d.ts +16 -0
  92. package/lib/src/brand-page-maker/composables/rich-text-editor/extensions/RoleTypographyFill.js +61 -0
  93. package/lib/src/brand-page-maker/composables/rich-text-editor/extensions/RteClipboard.d.ts +11 -0
  94. package/lib/src/brand-page-maker/composables/rich-text-editor/extensions/RteClipboard.js +236 -0
  95. package/lib/src/brand-page-maker/composables/rich-text-editor/font.d.ts +2 -1
  96. package/lib/src/brand-page-maker/composables/rich-text-editor/font.js +25 -6
  97. package/lib/src/brand-page-maker/composables/rich-text-editor/formatting.d.ts +17 -4
  98. package/lib/src/brand-page-maker/composables/rich-text-editor/formatting.js +204 -17
  99. package/lib/src/brand-page-maker/composables/rich-text-editor/hyperlink.d.ts +1 -1
  100. package/lib/src/brand-page-maker/composables/rich-text-editor/hyperlink.js +29 -31
  101. package/lib/src/brand-page-maker/composables/rich-text-editor/keepMarksOnEmpty.d.ts +20 -0
  102. package/lib/src/brand-page-maker/composables/rich-text-editor/keepMarksOnEmpty.js +60 -0
  103. package/lib/src/brand-page-maker/composables/rich-text-editor/spacing.d.ts +2 -1
  104. package/lib/src/brand-page-maker/composables/rich-text-editor/spacing.js +22 -6
  105. package/lib/src/brand-page-maker/composables/rich-text-editor/useRichTextEditor.d.ts +10 -4
  106. package/lib/src/brand-page-maker/composables/rich-text-editor/useRichTextEditor.js +319 -275
  107. package/lib/src/brand-page-maker/constants/config-settings-constant.js +1 -5
  108. package/lib/src/brand-page-maker/convertors/text-css-style-options.convertor.js +6 -2
  109. package/lib/src/brand-page-maker/convertors/text-size-value.convertor.d.ts +1 -1
  110. package/lib/src/brand-page-maker/convertors/text-size-value.convertor.js +3 -1
  111. package/lib/src/brand-page-maker/default-getters/payment-text-and-border-color.default-getter.js +7 -14
  112. package/lib/src/brand-page-maker/default-getters/text-color.default-getter.js +6 -13
  113. package/lib/src/brand-page-maker/models/content-settings.d.ts +8 -0
  114. package/lib/src/brand-page-maker/models/content-settings.js +112 -81
  115. package/lib/src/brand-page-maker/stores/admin-logo-settings/admin-logo-settings-store-utils.d.ts +2 -2
  116. package/lib/src/brand-page-maker/stores/admin-logo-settings/admin-logo-settings-store-utils.js +5 -2
  117. package/lib/src/brand-page-maker/stores/admin-logo-settings/admin-logo-settings-store.js +4 -3
  118. package/lib/src/brand-page-maker/stores/ai-checkpoint/ai-checkpoint-store.d.ts +1257 -117
  119. package/lib/src/brand-page-maker/stores/brandpage-maker/brandpage-maker-store.d.ts +6 -1
  120. package/lib/src/brand-page-maker/stores/brandpage-maker/brandpage-maker-store.js +17 -9
  121. package/lib/src/brand-page-maker/stores/history/history-store.d.ts +59 -5
  122. package/lib/src/brand-page-maker/stores/history/history-store.js +22 -2
  123. package/lib/src/brand-page-maker/utils/apply-color-strategy.js +26 -8
  124. package/lib/src/brand-page-maker/utils/index.d.ts +2 -1
  125. package/lib/src/brand-page-maker/utils/index.js +2 -1
  126. package/lib/src/brand-page-maker/utils/rich-text-editor.util.d.ts +117 -15
  127. package/lib/src/brand-page-maker/utils/rich-text-editor.util.js +435 -281
  128. package/lib/src/brand-page-maker/utils/rte-authoring.util.d.ts +4 -0
  129. package/lib/src/brand-page-maker/utils/rte-authoring.util.js +101 -0
  130. package/lib/src/brand-page-maker/utils/rte-clipboard.util.d.ts +126 -0
  131. package/lib/src/brand-page-maker/utils/rte-clipboard.util.js +307 -0
  132. package/lib/src/brand-page-maker/utils/rte-sanitize.util.js +13 -3
  133. package/lib/src/{bundled-translations-zfiA5Tsw.js → bundled-translations-yGrvPE5i.js} +17 -17
  134. package/lib/src/{bundled-translations.de-DE-ChsdSyAP.js → bundled-translations.de-DE-L4Znf8Hs.js} +17 -17
  135. package/lib/src/{bundled-translations.es-ES-DflsWQK0.js → bundled-translations.es-ES-D6iticrK.js} +15 -15
  136. package/lib/src/{bundled-translations.fr-CA-fpDRuZ52.js → bundled-translations.fr-CA-BgAVE-9k.js} +25 -25
  137. package/lib/src/{bundled-translations.fr-FR-Bub73Zt-.js → bundled-translations.fr-FR-B8GbyqxQ.js} +17 -17
  138. package/lib/src/{bundled-translations.pt-BR-BlnWE9TB.js → bundled-translations.pt-BR-DjPU3Db7.js} +25 -25
  139. package/lib/src/{bundled-translations.pt-PT-DmzXlnaS.js → bundled-translations.pt-PT-BaepaDpr.js} +23 -23
  140. package/lib/src/bundles/bundled-translations.de-DE.json +21 -2
  141. package/lib/src/bundles/bundled-translations.es-ES.json +21 -2
  142. package/lib/src/bundles/bundled-translations.fr-CA.json +21 -2
  143. package/lib/src/bundles/bundled-translations.fr-FR.json +21 -2
  144. package/lib/src/bundles/bundled-translations.json +21 -2
  145. package/lib/src/bundles/bundled-translations.pt-BR.json +21 -2
  146. package/lib/src/bundles/bundled-translations.pt-PT.json +21 -2
  147. package/lib/src/clients/ai-assistant-client.d.ts +1 -0
  148. package/lib/src/composables/useTranslate.d.ts +1 -1
  149. package/lib/src/composables/useTranslate.js +1 -1
  150. package/lib/src/css/library.brand-page-brandCrowd.min.css +303 -207
  151. package/lib/src/css/library.brand-page-brandPage.min.css +303 -207
  152. package/lib/src/css/library.brand-page-designCom.min.css +303 -207
  153. package/lib/src/css/library.brand-page-preview.min.css +303 -207
  154. package/lib/src/index.d.ts +2 -1
  155. package/lib/src/index.mjs +195 -191
  156. package/lib/src/{lib-1AqtEmvQ.js → lib-kGRlD3_P.js} +36855 -33893
  157. package/lib/src/lib.js +2 -1
  158. package/lib/src/metadata-builder/builders/footer-builder.js +4 -5
  159. package/lib/src/metadata-builder/builders/global-role-propagation.d.ts +58 -0
  160. package/lib/src/metadata-builder/builders/global-role-propagation.js +246 -0
  161. package/lib/src/metadata-builder/builders/global-styles-builder.d.ts +1 -0
  162. package/lib/src/metadata-builder/builders/global-styles-builder.js +116 -45
  163. package/lib/src/metadata-builder/builders/header-builder.js +13 -4
  164. package/lib/src/metadata-builder/builders/section-builders/about-section-builder.js +3 -3
  165. package/lib/src/metadata-builder/builders/section-builders/banner-section-builder.js +3 -3
  166. package/lib/src/metadata-builder/builders/section-builders/booking-section-builder.js +3 -3
  167. package/lib/src/metadata-builder/builders/section-builders/contact-form-builder.js +4 -4
  168. package/lib/src/metadata-builder/builders/section-builders/images-section-builder.js +3 -3
  169. package/lib/src/metadata-builder/builders/section-builders/mailing-list-builder.js +2 -2
  170. package/lib/src/metadata-builder/builders/section-builders/mailing-list-section-builder.js +2 -2
  171. package/lib/src/metadata-builder/builders/section-builders/profile-section-builder.js +4 -4
  172. package/lib/src/metadata-builder/builders/section-builders/shapes-section-builder.js +3 -3
  173. package/lib/src/metadata-builder/builders/section-builders/social-links-builder.js +8 -2
  174. package/lib/src/metadata-builder/builders/section-builders/testimonial-section-builder.js +2 -2
  175. package/lib/src/metadata-builder/builders/section-builders/text-section-builder.js +60 -29
  176. package/lib/src/metadata-builder/builders/section-field-maps.js +1 -0
  177. package/lib/src/metadata-builder/builders/section-field-utils.d.ts +48 -19
  178. package/lib/src/metadata-builder/builders/section-field-utils.js +128 -52
  179. package/lib/src/metadata-builder/builders/section-rules/global-styles.rules.d.ts +4 -2
  180. package/lib/src/metadata-builder/builders/section-rules/global-styles.rules.js +28 -12
  181. package/lib/src/metadata-builder/builders/section-rules/social-links.rules.js +5 -1
  182. package/lib/src/metadata-builder/helpers/rte.helpers.d.ts +1 -1
  183. package/lib/src/metadata-builder/helpers/rte.helpers.js +97 -40
  184. package/lib/src/metadata-builder/metadata-executor.js +23 -1
  185. package/lib/src/metadata-builder/models.d.ts +2 -0
  186. package/lib/src/metadata-builder/parsers/ai-toolcall-parser.d.ts +18 -19
  187. package/lib/src/metadata-builder/parsers/section-tool-arguments.d.ts +18 -1
  188. package/lib/src/metadata-builder/sanitizers/rte-schema-check.js +1 -1
  189. package/lib/src/metadata-builder/sanitizers/sanitizer-rules.d.ts +0 -1
  190. package/lib/src/metadata-builder/sanitizers/sanitizer-rules.js +5 -8
  191. package/lib/src/metadata-builder/sanitizers/section-args-validator.d.ts +7 -16
  192. package/lib/src/metadata-builder/sanitizers/section-args-validator.js +95 -22
  193. package/lib/src/shared/color-palette/section-color-matches.js +9 -25
  194. package/lib/src/shared/color-strategies/color-strategies.d.ts +15 -0
  195. package/lib/src/shared/color-strategies/color-strategies.js +31 -0
  196. package/lib/src/shared/color-strategies/rte-color.d.ts +8 -0
  197. package/lib/src/shared/color-strategies/rte-color.js +16 -0
  198. package/lib/src/shared/color-strategies/rte-field-pairs.d.ts +23 -0
  199. package/lib/src/shared/color-strategies/rte-field-pairs.js +28 -0
  200. package/lib/src/shared/content-settings/components/content-settings/ContentSettings.mixin.d.ts +9 -135
  201. package/lib/src/shared/content-settings/components/content-settings/ContentSettings.mixin.js +1 -27
  202. package/lib/src/shared/content-settings/components/content-settings/ReplaceImageSettingsForContent.mixin.d.ts +12 -2
  203. package/lib/src/shared/content-settings/components/content-settings-item/ContentSettingsItem.mixin.d.ts +7 -0
  204. package/lib/src/shared/content-settings/components/content-settings-item/ContentSettingsItemField.mixin.d.ts +75 -6
  205. package/lib/src/shared/content-settings/components/content-settings-item/ContentSettingsItemField.mixin.js +18 -7
  206. package/lib/src/shared/content-settings/components/focused-content-item-settings/FocusedContentItemSettings.mixin.d.ts +6 -1
  207. package/lib/src/shared/content-settings/components/focused-content-item-settings/FocusedContentItemSettings.mixin.js +0 -7
  208. package/lib/src/shared/content-settings/components/payment-config-field/PaymentConfigField.mixin.d.ts +1 -0
  209. package/lib/src/shared/content-settings/components/text-items-field/TextItemsField.mixin.js +8 -4
  210. package/lib/src/shared/content-settings/components/text-style-field/TextStyleField.mixin.d.ts +1255 -26
  211. package/lib/src/shared/content-settings/components/text-style-field/TextStyleField.mixin.js +203 -59
  212. package/lib/src/shared/content-settings/store/content-settings-store.d.ts +6 -0
  213. package/lib/src/shared/content-settings/store/content-settings-store.js +105 -8
  214. package/lib/src/shared/logo-settings/components/LogoSettings.mixin.d.ts +5 -1
  215. package/lib/src/shared/navigation-style-settings/store/index.d.ts +7 -3
  216. package/lib/src/shared/navigation-style-settings/store/index.js +40 -15
  217. package/lib/src/shared/page-settings/components/delete-page-modal/DeletePageModal.mixin.d.ts +1 -1
  218. package/lib/src/shared/page-settings/components/new-page-modal/NewPageModal.mixin.d.ts +1 -0
  219. package/lib/src/shared/page-settings/components/page-settings/PageSettings.mixin.d.ts +17 -5
  220. package/lib/src/shared/page-settings/components/page-settings-section-styles/PageSettingsSectionStyles.mixin.d.ts +70 -13
  221. package/lib/src/shared/page-settings/components/page-settings-section-styles/PageSettingsSectionStyles.mixin.js +10 -2
  222. package/lib/src/shared/page-settings/store/page-settings-store.d.ts +2 -1
  223. package/lib/src/shared/page-settings/store/page-settings-store.js +17 -0
  224. package/lib/src/shared/publish-brand-page-with-state/PublishBrandPageModalWithState.mixin.d.ts +4 -1
  225. package/lib/src/shared/rte-extensions/AutoLink.d.ts +17 -0
  226. package/lib/src/{brand-page-maker/composables/rich-text-editor/extensions → shared/rte-extensions}/AutoLink.js +67 -51
  227. package/lib/src/{brand-page-maker/composables/rich-text-editor/extensions → shared/rte-extensions}/MaxLength.js +4 -1
  228. package/lib/src/shared/rte-extensions/TextEffects.d.ts +28 -0
  229. package/lib/src/shared/rte-extensions/TextEffects.js +96 -0
  230. package/lib/src/shared/rte-extensions/ViewDomParser.d.ts +2 -0
  231. package/lib/src/shared/rte-extensions/ViewDomParser.js +21 -0
  232. package/lib/src/shared/rte-extensions.util.d.ts +25 -0
  233. package/lib/src/{brand-page-maker/composables/rich-text-editor/getRteExtensions.js → shared/rte-extensions.util.js} +62 -7
  234. package/lib/src/shared/rte-link.util.d.ts +1 -0
  235. package/lib/src/shared/rte-link.util.js +1 -0
  236. package/lib/src/shared/rte-render.util.d.ts +112 -0
  237. package/lib/src/shared/rte-render.util.js +255 -0
  238. package/lib/src/shared/rte-shape.util.d.ts +6 -0
  239. package/lib/src/shared/rte-shape.util.js +18 -0
  240. package/lib/src/shared/side-bar/components/SideBar.mixin.d.ts +2 -1
  241. package/lib/src/shared/side-bar/components/SideBarTabButton.mixin.d.ts +1 -0
  242. package/lib/src/shared/side-bar/store/side-bar-store.d.ts +2 -0
  243. package/lib/src/shared/side-bar/store/side-bar-store.js +9 -0
  244. package/lib/src/shared/style-settings/components/StyleSettings.mixin.d.ts +155 -15
  245. package/lib/src/shared/style-settings/components/StyleSettings.mixin.js +7 -1
  246. package/lib/src/shared/style-settings/store/style-settings-store.d.ts +1 -9
  247. package/lib/src/shared/style-settings/store/style-settings-store.js +3 -33
  248. package/lib/src/shared/style-settings/text-style-size-order.d.ts +2 -0
  249. package/lib/src/shared/style-settings/text-style-size-order.js +13 -0
  250. package/lib/src/shared/text-role-typography.util.d.ts +64 -0
  251. package/lib/src/shared/text-role-typography.util.js +183 -0
  252. package/lib/src/utils/minify-brand-page-metadata.d.ts +16 -1
  253. package/lib/src/utils/minify-brand-page-metadata.js +31 -9
  254. package/package.json +1 -1
  255. package/src/brand-page/__fixtures__/migration-22-v21/edited-brandsite-sections.v21.json +982 -0
  256. package/src/brand-page/__fixtures__/migration-22-v21/new-brandcontact-every-section.v21.json +1231 -0
  257. package/src/brand-page/__fixtures__/migration-22-v21/new-brandpage-every-section.v21.json +1231 -0
  258. package/src/brand-page/__fixtures__/migration-22-v21/new-brandsite-every-section.v21.json +1243 -0
  259. package/src/brand-page/__fixtures__/migration-22-v21/real-brandcontact.v21.json +755 -0
  260. package/src/brand-page/__fixtures__/migration-22-v21/real-brandpage-general-link.v21.json +527 -0
  261. package/src/brand-page/__fixtures__/migration-22-v21/real-brandpage-links.v21.json +755 -0
  262. package/src/brand-page/__fixtures__/migration-22-v21/real-brandpage-social-links.v21.json +514 -0
  263. package/src/brand-page/__fixtures__/migration-22-v21/real-brandsite-about.v21.json +459 -0
  264. package/src/brand-page/__fixtures__/migration-22-v21/real-brandsite-footer.v21.json +469 -0
  265. package/src/brand-page/__fixtures__/migration-22-v21/real-brandsite-header-banner.v21.json +481 -0
  266. package/src/brand-page/__fixtures__/migration-22-v21/real-brandsite-sections.v21.json +800 -0
  267. package/src/brand-page/__fixtures__/production-text-style-resolver.fixture.ts +52 -0
  268. package/src/brand-page/components/about-section/AboutSection.vue.test.ts +0 -10
  269. package/src/brand-page/components/contact-form/ContactForm.mixin.test.ts +127 -0
  270. package/src/brand-page/components/contact-form/ContactForm.mixin.ts +31 -14
  271. package/src/brand-page/components/contact-form/ContactForm.vue +26 -12
  272. package/src/brand-page/components/contact-form/ContactForm.vue.test.ts +60 -0
  273. package/src/brand-page/components/mailing-list/MailingList.mixin.test.ts +92 -0
  274. package/src/brand-page/components/mailing-list/MailingList.mixin.ts +28 -3
  275. package/src/brand-page/components/mailing-list/MailingList.vue +9 -4
  276. package/src/brand-page/components/mailing-list/MailingList.vue.test.ts +63 -0
  277. package/src/brand-page/components/navigation/button-carousel/ButtonCarouselNavigation.mixin.ts +51 -1
  278. package/src/brand-page/components/navigation/button-carousel/ButtonCarouselNavigation.test.ts +114 -0
  279. package/src/brand-page/components/navigation/button-carousel/ButtonCarouselNavigation.vue +8 -2
  280. package/src/brand-page/components/navigation/navigation-carousel/NavigationCarousel.test.ts +182 -0
  281. package/src/brand-page/components/navigation/navigation-carousel/NavigationCarousel.vue +59 -12
  282. package/src/brand-page/components/navigation/navigation-side-menu/NavigationSideMenu.mixin.ts +40 -3
  283. package/src/brand-page/components/navigation/navigation-side-menu/NavigationSideMenu.vue +15 -7
  284. package/src/brand-page/components/navigation/navigation-side-menu/NavigationSideMenu.vue.test.ts +133 -3
  285. package/src/brand-page/components/page/Page.mixin.ts +41 -34
  286. package/src/brand-page/components/page/Page.vue +17 -6
  287. package/src/brand-page/components/page/Page.vue.test.ts +91 -1
  288. package/src/brand-page/components/page-footer/PageFooter.mixin.ts +32 -2
  289. package/src/brand-page/components/page-footer/PageFooter.test.ts +79 -0
  290. package/src/brand-page/components/page-footer/PageFooter.vue +12 -4
  291. package/src/brand-page/components/payment/Payment.mixin.ts +34 -2
  292. package/src/brand-page/components/payment/Payment.test.ts +188 -0
  293. package/src/brand-page/components/payment/Payment.vue +12 -5
  294. package/src/brand-page/components/payment/RequestPaymentStripe.vue +1 -0
  295. package/src/brand-page/components/payment/support-me/SupportMe.mixin.ts +49 -2
  296. package/src/brand-page/components/payment/support-me/SupportMe.test.ts +100 -0
  297. package/src/brand-page/components/payment/support-me/SupportMe.vue +7 -1
  298. package/src/brand-page/components/payment/support-me/SupportMe.vue.test.ts +66 -0
  299. package/src/brand-page/components/save-contact/SaveContactWidget.test.ts +100 -0
  300. package/src/brand-page/components/save-contact/SaveContactWidget.vue +6 -3
  301. package/src/brand-page/components/shop/PaymentModal.vue +2 -6
  302. package/src/brand-page/components/shop/PaymentShippingAddress.vue +6 -0
  303. package/src/brand-page/components/shop/Shop.vue +15 -2
  304. package/src/brand-page/components/shop/Shop.vue.test.ts +74 -2
  305. package/src/brand-page/components/social-links/SocialLinks.stories.ts +0 -3
  306. package/src/brand-page/components/social-links/SocialLinks.vue.test.ts +0 -3
  307. package/src/brand-page/components/testimonial-section/__fixtures__/data.ts +0 -3
  308. package/src/brand-page/components/text/Text.stories.ts +0 -17
  309. package/src/brand-page/components/text-wrapper/TextWrapper.parity.test.ts +136 -0
  310. package/src/brand-page/components/text-wrapper/TextWrapper.test.ts +358 -0
  311. package/src/brand-page/components/text-wrapper/TextWrapper.vue +82 -22
  312. package/src/brand-page/constants/font.constants.ts +37 -0
  313. package/src/brand-page/models/footer-icon-color.test.ts +22 -0
  314. package/src/brand-page/models/index.ts +50 -28
  315. package/src/brand-page/models/navigation-styles.model.test.ts +77 -1
  316. package/src/brand-page/models/navigation-styles.model.ts +26 -9
  317. package/src/brand-page/models/payment.model.ts +15 -6
  318. package/src/brand-page/models/styles.model.test.ts +104 -0
  319. package/src/brand-page/models/styles.model.ts +181 -47
  320. package/src/brand-page/utils/__snapshots__/migration.util.test.ts.snap +619 -115
  321. package/src/brand-page/utils/__snapshots__/migration2.util.test.ts.snap +150 -9
  322. package/src/brand-page/utils/__snapshots__/model.util.test.ts.snap +300 -18
  323. package/src/brand-page/utils/color-palette.util.test.ts +126 -1
  324. package/src/brand-page/utils/color-palette.util.ts +92 -26
  325. package/src/brand-page/utils/color.util.test.ts +62 -29
  326. package/src/brand-page/utils/color.util.ts +77 -14
  327. package/src/brand-page/utils/container-text-color.util.test.ts +672 -26
  328. package/src/brand-page/utils/container-text-color.util.ts +472 -46
  329. package/src/brand-page/utils/index.ts +1 -0
  330. package/src/brand-page/utils/migration/__snapshots__/migration-22-output/edited-brandsite-sections.v22.json +1191 -0
  331. package/src/brand-page/utils/migration/__snapshots__/migration-22-output/new-brandcontact-every-section.v22.json +2026 -0
  332. package/src/brand-page/utils/migration/__snapshots__/migration-22-output/new-brandpage-every-section.v22.json +2017 -0
  333. package/src/brand-page/utils/migration/__snapshots__/migration-22-output/new-brandsite-every-section.v22.json +2031 -0
  334. package/src/brand-page/utils/migration/__snapshots__/migration-22-output/real-brandcontact.v22.json +1145 -0
  335. package/src/brand-page/utils/migration/__snapshots__/migration-22-output/real-brandpage-general-link.v22.json +645 -0
  336. package/src/brand-page/utils/migration/__snapshots__/migration-22-output/real-brandpage-links.v22.json +1136 -0
  337. package/src/brand-page/utils/migration/__snapshots__/migration-22-output/real-brandpage-social-links.v22.json +662 -0
  338. package/src/brand-page/utils/migration/__snapshots__/migration-22-output/real-brandsite-about.v22.json +638 -0
  339. package/src/brand-page/utils/migration/__snapshots__/migration-22-output/real-brandsite-footer.v22.json +610 -0
  340. package/src/brand-page/utils/migration/__snapshots__/migration-22-output/real-brandsite-header-banner.v22.json +660 -0
  341. package/src/brand-page/utils/migration/__snapshots__/migration-22-output/real-brandsite-sections.v22.json +1132 -0
  342. package/src/brand-page/utils/migration/migration-01.ts +293 -237
  343. package/src/brand-page/utils/migration/migration-02.ts +8 -1
  344. package/src/brand-page/utils/migration/migration-20.ts +6 -3
  345. package/src/brand-page/utils/migration/migration-20_5.test.ts +5 -2
  346. package/src/brand-page/utils/migration/migration-21.test.ts +34 -0
  347. package/src/brand-page/utils/migration/migration-21.ts +46 -10
  348. package/src/brand-page/utils/migration/migration-22.fixed-input.test.ts +43 -0
  349. package/src/brand-page/utils/migration/migration-22.test.ts +4103 -0
  350. package/src/brand-page/utils/migration/migration-22.text-font-family.test.ts +72 -0
  351. package/src/brand-page/utils/migration/migration-22.ts +1336 -0
  352. package/src/brand-page/utils/migration.util.test.ts +146 -32
  353. package/src/brand-page/utils/migration.util.ts +18 -0
  354. package/src/brand-page/utils/model.util.ts +4 -0
  355. package/src/brand-page/utils/personalisation.util.test.ts +148 -3
  356. package/src/brand-page/utils/personalisation.util.ts +9 -1
  357. package/src/brand-page/utils/rte-role-lift.util.ts +409 -0
  358. package/src/brand-page/utils/style.util.test.ts +35 -2
  359. package/src/brand-page/utils/style.util.ts +45 -11
  360. package/src/brand-page/utils/text-role-css.util.test.ts +525 -0
  361. package/src/brand-page/utils/text-role-css.util.ts +321 -0
  362. package/src/brand-page/utils/text-role-reconnect.util.test.ts +604 -0
  363. package/src/brand-page/utils/text-role-reconnect.util.ts +727 -0
  364. package/src/brand-page/utils/text-style.util.test.ts +305 -0
  365. package/src/brand-page/utils/text-style.util.ts +198 -24
  366. package/src/brand-page/utils/view-model.page-data.test.ts +232 -0
  367. package/src/brand-page/utils/view-model.util.test.ts +954 -133
  368. package/src/brand-page/utils/view-model.util.ts +187 -139
  369. package/src/brand-page/view-models.ts +4 -0
  370. package/src/brand-page-maker/components/brand-page-maker/BrandPageMaker.blank-site.test.ts +57 -0
  371. package/src/brand-page-maker/components/brand-page-maker/BrandPageMaker.mixin.ts +9 -5
  372. package/src/brand-page-maker/components/brand-page-maker/__fixtures__/brand-page-examples.ts +0 -10
  373. package/src/brand-page-maker/components/brand-page-maker/__fixtures__/content-settings-items.fixture.ts +0 -1
  374. package/src/brand-page-maker/components/brandpage-maker-page/BrandPageMakerPage.mixin.ts +0 -44
  375. package/src/brand-page-maker/components/rich-text-editor/RichTextEditor.vue +253 -200
  376. package/src/brand-page-maker/components/shop/AddOrEditProductContainer.vue +1 -0
  377. package/src/brand-page-maker/components/template-preview/TemplatePreview.vue +1 -0
  378. package/src/brand-page-maker/composables/ai-chat/useAiMetadataBuilder.ts +2 -0
  379. package/src/brand-page-maker/composables/ai-chat/useAiWebsiteBuilderChat.ts +1 -0
  380. package/src/brand-page-maker/composables/rich-text-editor/block-typography.test.ts +519 -0
  381. package/src/brand-page-maker/composables/rich-text-editor/extensions/FontFamily.test.ts +1 -1
  382. package/src/brand-page-maker/composables/rich-text-editor/extensions/MaxLength.test.ts +26 -1
  383. package/src/brand-page-maker/composables/rich-text-editor/extensions/RoleTypographyFill.test.ts +110 -0
  384. package/src/brand-page-maker/composables/rich-text-editor/extensions/RoleTypographyFill.ts +99 -0
  385. package/src/brand-page-maker/composables/rich-text-editor/extensions/RteClipboard.ts +397 -0
  386. package/src/brand-page-maker/composables/rich-text-editor/extensions/ViewDomParser.test.ts +139 -0
  387. package/src/brand-page-maker/composables/rich-text-editor/font.ts +36 -5
  388. package/src/brand-page-maker/composables/rich-text-editor/formatting.test.ts +375 -1
  389. package/src/brand-page-maker/composables/rich-text-editor/formatting.ts +301 -17
  390. package/src/brand-page-maker/composables/rich-text-editor/hyperlink.test.ts +82 -1
  391. package/src/brand-page-maker/composables/rich-text-editor/hyperlink.ts +28 -34
  392. package/src/brand-page-maker/composables/rich-text-editor/keepMarksOnEmpty.test.ts +80 -0
  393. package/src/brand-page-maker/composables/rich-text-editor/keepMarksOnEmpty.ts +75 -0
  394. package/src/brand-page-maker/composables/rich-text-editor/spacing.ts +31 -6
  395. package/src/brand-page-maker/composables/rich-text-editor/useRichTextEditor.test.ts +2485 -0
  396. package/src/brand-page-maker/composables/rich-text-editor/useRichTextEditor.ts +435 -337
  397. package/src/brand-page-maker/constants/config-settings-constant.ts +0 -6
  398. package/src/brand-page-maker/convertors/text-css-style-options.convertor.test.ts +43 -0
  399. package/src/brand-page-maker/convertors/text-css-style-options.convertor.ts +6 -2
  400. package/src/brand-page-maker/convertors/text-size-value.convertor.test.ts +24 -0
  401. package/src/brand-page-maker/convertors/text-size-value.convertor.ts +17 -13
  402. package/src/brand-page-maker/default-getters/payment-text-and-border-color.default-getter.ts +7 -22
  403. package/src/brand-page-maker/default-getters/text-color.default-getter.ts +5 -21
  404. package/src/brand-page-maker/models/content-settings.test.ts +708 -0
  405. package/src/brand-page-maker/models/content-settings.ts +133 -82
  406. package/src/brand-page-maker/stores/admin-logo-settings/admin-logo-settings-store-utils.test.ts +63 -1
  407. package/src/brand-page-maker/stores/admin-logo-settings/admin-logo-settings-store-utils.ts +16 -3
  408. package/src/brand-page-maker/stores/admin-logo-settings/admin-logo-settings-store.test.ts +34 -0
  409. package/src/brand-page-maker/stores/admin-logo-settings/admin-logo-settings-store.ts +4 -2
  410. package/src/brand-page-maker/stores/brandpage-maker/brandpage-maker-store.test.ts +185 -1
  411. package/src/brand-page-maker/stores/brandpage-maker/brandpage-maker-store.ts +22 -34
  412. package/src/brand-page-maker/stores/history/history-store.ts +35 -2
  413. package/src/brand-page-maker/utils/__snapshots__/apply-color-strategy.golden.test.ts.snap +528 -0
  414. package/src/brand-page-maker/utils/__snapshots__/rte-render-parity.test.ts.snap +12 -0
  415. package/src/brand-page-maker/utils/apply-color-strategy.golden.test.ts +2 -0
  416. package/src/brand-page-maker/utils/apply-color-strategy.test.ts +181 -3
  417. package/src/brand-page-maker/utils/apply-color-strategy.ts +36 -4
  418. package/src/brand-page-maker/utils/index.ts +2 -1
  419. package/src/brand-page-maker/utils/rich-text-editor.util.test.ts +447 -410
  420. package/src/brand-page-maker/utils/rich-text-editor.util.ts +610 -506
  421. package/src/brand-page-maker/utils/rte-authoring.util.test.ts +244 -0
  422. package/src/brand-page-maker/utils/rte-authoring.util.ts +175 -0
  423. package/src/brand-page-maker/utils/rte-clipboard.util.test.ts +558 -0
  424. package/src/brand-page-maker/utils/rte-clipboard.util.ts +473 -0
  425. package/src/brand-page-maker/utils/rte-features.test.ts +99 -3
  426. package/src/brand-page-maker/utils/rte-render-parity.test.ts +1 -1
  427. package/src/brand-page-maker/utils/rte-render.util.test.ts +230 -0
  428. package/src/brand-page-maker/utils/rte-sanitize-json.test.ts +1 -1
  429. package/src/brand-page-maker/utils/rte-sanitize.util.ts +14 -3
  430. package/src/brand-page-maker/utils/rte-schema-version.test.ts +102 -0
  431. package/src/bundles/bundled-translations.de-DE.json +21 -2
  432. package/src/bundles/bundled-translations.es-ES.json +21 -2
  433. package/src/bundles/bundled-translations.fr-CA.json +21 -2
  434. package/src/bundles/bundled-translations.fr-FR.json +21 -2
  435. package/src/bundles/bundled-translations.json +21 -2
  436. package/src/bundles/bundled-translations.pt-BR.json +21 -2
  437. package/src/bundles/bundled-translations.pt-PT.json +21 -2
  438. package/src/clients/ai-assistant-client.ts +1 -0
  439. package/src/composables/useTranslate.ts +2 -1
  440. package/src/lib.ts +2 -2
  441. package/src/metadata-builder/builders/footer-builder.test.ts +70 -45
  442. package/src/metadata-builder/builders/footer-builder.ts +4 -8
  443. package/src/metadata-builder/builders/global-role-propagation.test.ts +907 -0
  444. package/src/metadata-builder/builders/global-role-propagation.ts +430 -0
  445. package/src/metadata-builder/builders/global-styles-builder.test.ts +1020 -0
  446. package/src/metadata-builder/builders/global-styles-builder.ts +194 -48
  447. package/src/metadata-builder/builders/header-builder.test.ts +112 -40
  448. package/src/metadata-builder/builders/header-builder.ts +18 -8
  449. package/src/metadata-builder/builders/section-builders/about-section-builder.ts +5 -3
  450. package/src/metadata-builder/builders/section-builders/banner-section-builder.ts +5 -3
  451. package/src/metadata-builder/builders/section-builders/booking-section-builder.ts +5 -3
  452. package/src/metadata-builder/builders/section-builders/contact-form-builder.ts +7 -4
  453. package/src/metadata-builder/builders/section-builders/images-section-builder.ts +5 -3
  454. package/src/metadata-builder/builders/section-builders/mailing-list-builder.ts +3 -2
  455. package/src/metadata-builder/builders/section-builders/mailing-list-section-builder.ts +3 -2
  456. package/src/metadata-builder/builders/section-builders/profile-section-builder.ts +7 -7
  457. package/src/metadata-builder/builders/section-builders/shapes-section-builder.ts +5 -3
  458. package/src/metadata-builder/builders/section-builders/social-links-builder.test.ts +2 -2
  459. package/src/metadata-builder/builders/section-builders/social-links-builder.ts +21 -10
  460. package/src/metadata-builder/builders/section-builders/support-me-builder.test.ts +10 -0
  461. package/src/metadata-builder/builders/section-builders/testimonial-section-builder.ts +3 -2
  462. package/src/metadata-builder/builders/section-builders/text-section-builder.ts +111 -61
  463. package/src/metadata-builder/builders/section-field-maps.ts +1 -0
  464. package/src/metadata-builder/builders/section-field-utils.test.ts +545 -2
  465. package/src/metadata-builder/builders/section-field-utils.ts +202 -69
  466. package/src/metadata-builder/builders/section-rules/global-styles.rules.ts +38 -13
  467. package/src/metadata-builder/builders/section-rules/social-links.rules.ts +5 -0
  468. package/src/metadata-builder/helpers/rte.helpers.test.ts +101 -0
  469. package/src/metadata-builder/helpers/rte.helpers.ts +129 -43
  470. package/src/metadata-builder/metadata-executor.test.ts +167 -0
  471. package/src/metadata-builder/metadata-executor.ts +34 -1
  472. package/src/metadata-builder/models.ts +2 -0
  473. package/src/metadata-builder/parsers/ai-toolcall-parser.ts +23 -7
  474. package/src/metadata-builder/parsers/section-tool-arguments.ts +21 -1
  475. package/src/metadata-builder/sanitizers/__tests__/section-args-validator.test.ts +215 -0
  476. package/src/metadata-builder/sanitizers/rte-schema-check.ts +1 -1
  477. package/src/metadata-builder/sanitizers/sanitizer-rules.ts +4 -8
  478. package/src/metadata-builder/sanitizers/section-args-validator.ts +136 -53
  479. package/src/shared/color-palette/section-color-matches.test.ts +15 -11
  480. package/src/shared/color-palette/section-color-matches.ts +9 -28
  481. package/src/shared/color-strategies/color-strategies.ts +35 -0
  482. package/src/shared/color-strategies/rte-color.test.ts +1 -1
  483. package/src/shared/color-strategies/rte-color.ts +19 -0
  484. package/src/shared/color-strategies/rte-field-pairs.test.ts +26 -5
  485. package/src/shared/color-strategies/rte-field-pairs.ts +33 -0
  486. package/src/shared/content-settings/components/color-matches-panel/ColorMatchesPanel.test.ts +43 -66
  487. package/src/shared/content-settings/components/color-matches-panel/ColorMatchesPanel.vue +7 -1
  488. package/src/shared/content-settings/components/content-settings/ContentSettings.mixin.ts +1 -48
  489. package/src/shared/content-settings/components/content-settings-item/ContentSettingsItemField.mixin.ts +33 -7
  490. package/src/shared/content-settings/components/content-settings-item/ContentSettingsItemField.test.ts +128 -1
  491. package/src/shared/content-settings/components/draggable-item-list/DraggableItemList.vue +1 -0
  492. package/src/shared/content-settings/components/focused-content-item-settings/FocusedContentItemSettings.mixin.ts +0 -6
  493. package/src/shared/content-settings/components/logo-selection-field/LogoSelection.vue +3 -0
  494. package/src/shared/content-settings/components/logo-size-field/LogoSizeSlider.vue +3 -0
  495. package/src/shared/content-settings/components/logo-size-field/LogoSizeSliderField.vue +1 -0
  496. package/src/shared/content-settings/components/testimonial-items-field/TestimonialItemsField.vue +1 -0
  497. package/src/shared/content-settings/components/text-items-field/TextItemsField.mixin.test.ts +56 -3
  498. package/src/shared/content-settings/components/text-items-field/TextItemsField.mixin.ts +11 -4
  499. package/src/shared/content-settings/components/text-style-field/TextStyleField.mixin.test.ts +335 -25
  500. package/src/shared/content-settings/components/text-style-field/TextStyleField.mixin.ts +248 -70
  501. package/src/shared/content-settings/components/text-style-field/TextStyleField.vue +113 -25
  502. package/src/shared/content-settings/components/text-style-field/i18n/text-style-field.de-DE.json +17 -10
  503. package/src/shared/content-settings/components/text-style-field/i18n/text-style-field.es-ES.json +17 -10
  504. package/src/shared/content-settings/components/text-style-field/i18n/text-style-field.fr-CA.json +17 -10
  505. package/src/shared/content-settings/components/text-style-field/i18n/text-style-field.fr-FR.json +17 -10
  506. package/src/shared/content-settings/components/text-style-field/i18n/text-style-field.json +8 -1
  507. package/src/shared/content-settings/components/text-style-field/i18n/text-style-field.pt-BR.json +17 -10
  508. package/src/shared/content-settings/components/text-style-field/i18n/text-style-field.pt-PT.json +17 -10
  509. package/src/shared/content-settings/components/text-style-role-dropdown/TextStyleRoleDropdown.test.ts +141 -0
  510. package/src/shared/content-settings/components/text-style-role-dropdown/TextStyleRoleDropdown.vue +136 -0
  511. package/src/shared/content-settings/store/content-settings-store.test.ts +491 -6
  512. package/src/shared/content-settings/store/content-settings-store.ts +159 -17
  513. package/src/shared/logo-settings/components/EditLogoSettings.vue +1 -0
  514. package/src/shared/logo-settings/components/LogoVariations.vue +1 -0
  515. package/src/shared/navigation-style-settings/components/navigation-style-settings/NavigationStyleSettings.vue +1 -0
  516. package/src/shared/navigation-style-settings/store/index.test.ts +295 -0
  517. package/src/shared/navigation-style-settings/store/index.ts +65 -15
  518. package/src/shared/page-settings/components/header-settings-panel/HeaderSettingsPanel.vue +2 -0
  519. package/src/shared/page-settings/components/page-settings/PageElement.vue +1 -0
  520. package/src/shared/page-settings/components/page-settings-section-styles/HeaderButtonSettings.test.ts +44 -4
  521. package/src/shared/page-settings/components/page-settings-section-styles/HeaderButtonSettings.vue +13 -4
  522. package/src/shared/page-settings/components/page-settings-section-styles/PageSettingsSectionStyles.mixin.navigation.test.ts +89 -0
  523. package/src/shared/page-settings/components/page-settings-section-styles/PageSettingsSectionStyles.mixin.text-style.test.ts +91 -0
  524. package/src/shared/page-settings/components/page-settings-section-styles/PageSettingsSectionStyles.mixin.ts +14 -2
  525. package/src/shared/page-settings/components/page-settings-section-styles/PageSettingsSectionStyles.vue +2 -0
  526. package/src/shared/page-settings/store/page-settings-store.text-style.test.ts +84 -0
  527. package/src/shared/page-settings/store/page-settings-store.ts +30 -1
  528. package/src/shared/rte-extensions/AutoLink.test.ts +98 -0
  529. package/src/{brand-page-maker/composables/rich-text-editor/extensions → shared/rte-extensions}/AutoLink.ts +87 -58
  530. package/src/{brand-page-maker/composables/rich-text-editor/extensions → shared/rte-extensions}/MaxLength.ts +4 -1
  531. package/src/shared/rte-extensions/TextEffects.ts +151 -0
  532. package/src/shared/rte-extensions/ViewDomParser.ts +27 -0
  533. package/src/{brand-page-maker/composables/rich-text-editor/getRteExtensions.ts → shared/rte-extensions.util.ts} +66 -9
  534. package/src/shared/rte-link.util.ts +2 -0
  535. package/src/shared/rte-render.util.ts +385 -0
  536. package/src/shared/rte-shape.util.ts +29 -0
  537. package/src/shared/side-bar/store/side-bar-store.test.ts +27 -1
  538. package/src/shared/side-bar/store/side-bar-store.ts +11 -0
  539. package/src/shared/style-settings/components/StyleSettings.mixin.ts +7 -3
  540. package/src/shared/style-settings/components/StyleSettings.test.ts +116 -0
  541. package/src/shared/style-settings/components/StyleSettings.vue +75 -25
  542. package/src/shared/style-settings/components/i18n/style-settings.de-DE.json +32 -20
  543. package/src/shared/style-settings/components/i18n/style-settings.es-ES.json +32 -20
  544. package/src/shared/style-settings/components/i18n/style-settings.fr-CA.json +32 -20
  545. package/src/shared/style-settings/components/i18n/style-settings.fr-FR.json +32 -20
  546. package/src/shared/style-settings/components/i18n/style-settings.json +13 -3
  547. package/src/shared/style-settings/components/i18n/style-settings.pt-BR.json +32 -20
  548. package/src/shared/style-settings/components/i18n/style-settings.pt-PT.json +32 -20
  549. package/src/shared/style-settings/components/text-style-options-settings-with-state/TextStyleOptionsSettingsWithState.vue +14 -34
  550. package/src/shared/style-settings/store/style-settings-store.ts +3 -49
  551. package/src/shared/style-settings/text-style-size-order.test.ts +76 -0
  552. package/src/shared/style-settings/text-style-size-order.ts +28 -0
  553. package/src/shared/template-settings/components/TemplatesSettings.vue +4 -0
  554. package/src/shared/text-role-typography.util.ts +277 -0
  555. package/src/utils/minify-brand-page-metadata.test.ts +102 -7
  556. package/src/utils/minify-brand-page-metadata.ts +62 -8
  557. package/lib/src/brand-page-maker/composables/rich-text-editor/extensions/AutoLink.d.ts +0 -2
  558. package/lib/src/brand-page-maker/composables/rich-text-editor/getRteExtensions.d.ts +0 -28
  559. package/lib/src/brand-page-maker/utils/rte-render.util.d.ts +0 -63
  560. package/lib/src/brand-page-maker/utils/rte-render.util.js +0 -106
  561. package/lib/src/brand-page-maker/utils/rte-shape.d.ts +0 -18
  562. package/lib/src/brand-page-maker/utils/rte-shape.js +0 -21
  563. package/lib/src/metadata-builder/builders/global-font-propagation.d.ts +0 -41
  564. package/lib/src/metadata-builder/builders/global-font-propagation.js +0 -146
  565. package/src/brand-page-maker/utils/rte-render.util.ts +0 -179
  566. package/src/brand-page-maker/utils/rte-shape.ts +0 -29
  567. package/src/metadata-builder/builders/global-font-propagation.test.ts +0 -401
  568. package/src/metadata-builder/builders/global-font-propagation.ts +0 -238
  569. package/src/shared/style-settings/components/StyleSettingsSection.vue +0 -8
  570. /package/lib/src/{brand-page-maker/composables/rich-text-editor/extensions → shared/rte-extensions}/FontFamily.d.ts +0 -0
  571. /package/lib/src/{brand-page-maker/composables/rich-text-editor/extensions → shared/rte-extensions}/FontFamily.js +0 -0
  572. /package/lib/src/{brand-page-maker/composables/rich-text-editor/extensions → shared/rte-extensions}/LetterSpacing.d.ts +0 -0
  573. /package/lib/src/{brand-page-maker/composables/rich-text-editor/extensions → shared/rte-extensions}/LetterSpacing.js +0 -0
  574. /package/lib/src/{brand-page-maker/composables/rich-text-editor/extensions → shared/rte-extensions}/MaxLength.d.ts +0 -0
  575. /package/src/{brand-page-maker/composables/rich-text-editor/extensions → shared/rte-extensions}/FontFamily.ts +0 -0
  576. /package/src/{brand-page-maker/composables/rich-text-editor/extensions → shared/rte-extensions}/LetterSpacing.ts +0 -0
@@ -9,17 +9,122 @@ import type {
9
9
  TextStyleOptionStyle,
10
10
  } from '../parsers/ai-toolcall-parser';
11
11
  import type { Logger } from '../logger';
12
- import type { GlobalTextStyleDeclaration } from '../../brand-page/models/styles.model';
12
+ import {
13
+ CANONICAL_TEXT_STYLE_TYPES,
14
+ LEGACY_TEXT_STYLE_TYPES,
15
+ type CanonicalTextStyleType,
16
+ type GlobalTextStyleDeclaration,
17
+ type LegacyTextStyleType,
18
+ type TextStyleOptions,
19
+ } from '../../brand-page/models/styles.model';
20
+ import {
21
+ computeLegacyTargets,
22
+ HEADING_TIERS,
23
+ PARAGRAPH_TIERS,
24
+ } from '../../brand-page/utils/text-role-reconnect.util';
25
+ import {
26
+ TEXT_STYLE_CASCADE_PROPS,
27
+ type CascadeTypographyProp,
28
+ } from '../../brand-page/utils/text-style.util';
29
+ import { NEUTRAL_TYPOGRAPHY_VALUE } from '@shared/text-role-typography.util';
13
30
  import {
14
31
  GLOBAL_STYLE_CHECKS,
15
- TEXT_STYLE_OPTION_KEYS,
32
+ normalizeGlobalTextStyleOption,
16
33
  } from './section-rules/global-styles.rules';
17
34
  import {
18
- collectChangedFontFamilies,
19
- propagateFontFamiliesToContents,
20
- } from './global-font-propagation';
35
+ collectChangedRoleProps,
36
+ propagateRolePropsToContents,
37
+ } from './global-role-propagation';
21
38
  import { buttonStylePresetCss } from '../../shared/style-settings/button-style-preset';
22
39
 
40
+ type ResolvedTextStyleOptionArgs = {
41
+ style?: TextStyleOptionStyle;
42
+ isModified?: boolean;
43
+ };
44
+
45
+ const retiredKeyFamilyTiers = (
46
+ key: LegacyTextStyleType,
47
+ ): readonly CanonicalTextStyleType[] => {
48
+ switch (key) {
49
+ case 'headings':
50
+ return HEADING_TIERS.filter((tier) => tier !== 'heading1');
51
+ case 'paragraphs':
52
+ return PARAGRAPH_TIERS;
53
+ case 'titles':
54
+ case 'buttons':
55
+ return [];
56
+ }
57
+ };
58
+
59
+ const retiredKeySingleTarget = (
60
+ key: LegacyTextStyleType,
61
+ existingOptions: TextStyleOptions,
62
+ ): CanonicalTextStyleType => computeLegacyTargets(existingOptions)[key];
63
+
64
+ const resolveCanonicalTextStyleOptions = (
65
+ textStyleOptions: NonNullable<
66
+ UpdateGlobalStylesArguments['textStyles']
67
+ >['textStyleOptions'],
68
+ existingOptions: TextStyleOptions,
69
+ ): Partial<Record<CanonicalTextStyleType, ResolvedTextStyleOptionArgs>> => {
70
+ const resolved: Partial<
71
+ Record<CanonicalTextStyleType, ResolvedTextStyleOptionArgs>
72
+ > = {};
73
+
74
+ if (!textStyleOptions) return resolved;
75
+
76
+ const mergeInto = (
77
+ role: CanonicalTextStyleType,
78
+ optionArgs: ResolvedTextStyleOptionArgs,
79
+ ): void => {
80
+ resolved[role] = {
81
+ style: {
82
+ ...resolved[role]?.style,
83
+ ...(optionArgs.style
84
+ ? normalizeGlobalTextStyleOption(optionArgs.style)
85
+ : undefined),
86
+ },
87
+ isModified: optionArgs.isModified ?? resolved[role]?.isModified,
88
+ };
89
+ };
90
+
91
+ for (const role of CANONICAL_TEXT_STYLE_TYPES) {
92
+ const optionArgs = textStyleOptions[role];
93
+
94
+ if (optionArgs) mergeInto(role, optionArgs);
95
+ }
96
+
97
+ for (const key of LEGACY_TEXT_STYLE_TYPES) {
98
+ const optionArgs = textStyleOptions[key];
99
+
100
+ if (!optionArgs) continue;
101
+
102
+ const singleTarget = retiredKeySingleTarget(key, existingOptions);
103
+ const familyTiers = retiredKeyFamilyTiers(key);
104
+ const style = (optionArgs.style ?? {}) as Record<string, unknown>;
105
+ const { fontFamily, ...rest } = style;
106
+ const hasRest = Object.keys(rest).length > 0;
107
+
108
+ if (hasRest || !familyTiers.length || optionArgs.isModified !== undefined) {
109
+ mergeInto(singleTarget, {
110
+ style: (familyTiers.length ? rest : style) as TextStyleOptionStyle,
111
+ isModified: optionArgs.isModified,
112
+ });
113
+ }
114
+
115
+ if (fontFamily !== undefined && familyTiers.length) {
116
+ familyTiers.forEach((role) =>
117
+ mergeInto(role, {
118
+ style: { fontFamily } as TextStyleOptionStyle,
119
+ isModified: optionArgs.isModified,
120
+ }),
121
+ );
122
+ }
123
+ }
124
+
125
+ return resolved;
126
+ };
127
+
23
128
  export class GlobalStylesBuilder extends BaseMetadataBuilder<UpdateGlobalStylesArguments> {
24
129
  constructor(
25
130
  request: MetadataBuilderRequest<UpdateGlobalStylesArguments>,
@@ -40,38 +145,53 @@ export class GlobalStylesBuilder extends BaseMetadataBuilder<UpdateGlobalStylesA
40
145
 
41
146
  return { errors };
42
147
  } catch (error) {
148
+ // Fail closed: a throwing check must block the call, not pass it as clean with every
149
+ // check skipped.
43
150
  this.log({
44
- message: 'Global styles validation failed unexpectedly — skipping',
151
+ message:
152
+ 'Global styles validation failed unexpectedly — rejecting the call',
45
153
  error,
46
154
  });
47
155
 
48
- return { errors: [] };
156
+ return { errors: ['Global styles validation failed unexpectedly'] };
49
157
  }
50
158
  }
51
159
 
52
160
  async buildAsync(model: BrandPageModel): Promise<BuilderResult> {
53
161
  this.log('Build called');
162
+
163
+ const validation = await this.validateAsync();
164
+
165
+ if (validation.errors.length) {
166
+ return { request: this.request, model, errors: validation.errors };
167
+ }
168
+
54
169
  const args = this.request.payload ?? {};
170
+ let builderWarnings: string[] | undefined;
55
171
 
56
172
  if (args.backgroundStyles) {
57
173
  this.applyBackgroundStyles(model, args.backgroundStyles);
58
174
  }
59
175
 
60
176
  if (args.textStyles) {
61
- this.applyTextStyles(model, args.textStyles);
177
+ const { changedRoleProps, warnings } = this.applyTextStyles(
178
+ model,
179
+ args.textStyles,
180
+ );
62
181
 
63
- // A category font change only reaches preset-bound content by itself;
64
- // detached section styles and inline RTE font marks would still render
65
- // the old family. Propagate so the change is actually visible (BP-5780).
66
- const changedFamilies = collectChangedFontFamilies(args.textStyles);
182
+ builderWarnings = warnings.length ? warnings : undefined;
67
183
 
68
- if (Object.keys(changedFamilies).length) {
184
+ if (Object.keys(changedRoleProps).length) {
69
185
  try {
70
- propagateFontFamiliesToContents(model, changedFamilies);
186
+ propagateRolePropsToContents(
187
+ model,
188
+ changedRoleProps,
189
+ args.textStyles.keepRuns,
190
+ );
71
191
  } catch (error) {
72
192
  this.log({
73
193
  message:
74
- 'Global font propagation to existing contents failed — presets still updated',
194
+ 'Global role propagation to existing contents failed — presets still updated',
75
195
  error,
76
196
  });
77
197
  }
@@ -82,45 +202,66 @@ export class GlobalStylesBuilder extends BaseMetadataBuilder<UpdateGlobalStylesA
82
202
  this.applyButtonStyles(model, args.buttonStyles);
83
203
  }
84
204
 
85
- return { request: this.request, model };
205
+ return { request: this.request, model, warnings: builderWarnings };
86
206
  }
87
207
 
88
208
  private applyTextStyles(
89
209
  model: BrandPageModel,
90
210
  textStyles: NonNullable<UpdateGlobalStylesArguments['textStyles']>,
91
- ): void {
211
+ ): {
212
+ changedRoleProps: ReturnType<typeof collectChangedRoleProps>;
213
+ warnings: string[];
214
+ } {
92
215
  const ts = model.styles.textStyles;
93
216
 
94
- // A `textStyles.style` arg is ignored — the property is retired. Schema cleanup
95
- // in service.ai-pipelines is a follow-up.
96
-
97
- // Merge textFontFamily
98
- if (textStyles.textFontFamily !== undefined) {
99
- ts.textFontFamily = textStyles.textFontFamily as typeof ts.textFontFamily;
100
- }
217
+ const resolved = resolveCanonicalTextStyleOptions(
218
+ textStyles.textStyleOptions,
219
+ ts.textStyleOptions,
220
+ );
221
+ const changedRoleProps = collectChangedRoleProps(
222
+ resolved,
223
+ ts.textStyleOptions,
224
+ );
101
225
 
102
- // Deep-merge textStyleOptions per category
103
- if (textStyles.textStyleOptions) {
104
- for (const key of TEXT_STYLE_OPTION_KEYS) {
105
- const optionArgs = textStyles.textStyleOptions[key];
226
+ for (const role of CANONICAL_TEXT_STYLE_TYPES) {
227
+ const optionArgs = resolved[role];
106
228
 
107
- if (!optionArgs) continue;
229
+ if (!optionArgs) continue;
108
230
 
109
- const existing = ts.textStyleOptions[key];
231
+ const existing = ts.textStyleOptions[role];
110
232
 
111
- if (!existing) continue;
233
+ if (!existing) continue;
112
234
 
113
- if (optionArgs.style) {
114
- this.mergeStyleOptionStyle(existing.style, optionArgs.style);
115
- // Mark as modified when style properties change
116
- existing.isModified = true;
117
- }
235
+ if (optionArgs.style) {
236
+ this.mergeStyleOptionStyle(existing.style, optionArgs.style);
237
+ existing.isModified = true;
238
+ }
118
239
 
119
- if (optionArgs.isModified !== undefined) {
120
- existing.isModified = optionArgs.isModified;
121
- }
240
+ if (optionArgs.isModified !== undefined) {
241
+ existing.isModified = optionArgs.isModified;
122
242
  }
123
243
  }
244
+
245
+ return {
246
+ changedRoleProps,
247
+ warnings: this.applyTextStylesWarnings(textStyles),
248
+ };
249
+ }
250
+
251
+ private applyTextStylesWarnings(
252
+ textStyles: NonNullable<UpdateGlobalStylesArguments['textStyles']>,
253
+ ): string[] {
254
+ const droppedRoles = Object.entries(textStyles.textStyleOptions ?? {})
255
+ .filter(([, option]) => option?.style?.color)
256
+ .map(([role]) => role);
257
+
258
+ return droppedRoles.length
259
+ ? [
260
+ `Ignored role color for ${droppedRoles.join(
261
+ ', ',
262
+ )}; apply colour to the affected sections instead.`,
263
+ ]
264
+ : [];
124
265
  }
125
266
 
126
267
  private applyButtonStyles(
@@ -129,19 +270,14 @@ export class GlobalStylesBuilder extends BaseMetadataBuilder<UpdateGlobalStylesA
129
270
  ): void {
130
271
  const bs = model.styles.buttonStyles;
131
272
 
132
- // Deep-merge style (color, borderColor, backgroundColor)
133
273
  if (buttonStyles.style) {
134
274
  bs.style = { ...bs.style, ...buttonStyles.style };
135
275
  }
136
276
 
137
- // Deep-merge iconStyle (fill)
138
277
  if (buttonStyles.iconStyle) {
139
278
  bs.iconStyle = { ...bs.iconStyle, ...buttonStyles.iconStyle };
140
279
  }
141
280
 
142
- // Merge selectedButtonStyleId and apply that preset's shape and shadow the way the
143
- // editor's picker does: the site renders buttons from `style`, so the id alone is
144
- // invisible (BP-6082). The preset owns the shape keys; colours from `style` stay.
145
281
  if (buttonStyles.selectedButtonStyleId !== undefined) {
146
282
  bs.selectedButtonStyleId = buttonStyles.selectedButtonStyleId;
147
283
 
@@ -198,14 +334,12 @@ export class GlobalStylesBuilder extends BaseMetadataBuilder<UpdateGlobalStylesA
198
334
  if (backgroundStyles.backgroundShapeUrl === '') {
199
335
  bs.backgroundShapes = [];
200
336
  } else if (bs.backgroundShapes?.length) {
201
- // Only update when shapes already exist — never add shapes to a site that has none.
202
- // Update ALL shapes so every positional instance switches to the new shape type.
337
+ // Retype only the shapes a site already has: a site with none never gains one.
203
338
  bs.backgroundShapes = bs.backgroundShapes.map((shape) => ({
204
339
  ...shape,
205
340
  name: backgroundStyles.backgroundShapeUrl!,
206
341
  }));
207
342
  }
208
- // If backgroundShapes is empty/absent: intentional no-op
209
343
  }
210
344
  }
211
345
 
@@ -214,8 +348,20 @@ export class GlobalStylesBuilder extends BaseMetadataBuilder<UpdateGlobalStylesA
214
348
  incoming: TextStyleOptionStyle,
215
349
  ): void {
216
350
  for (const [key, value] of Object.entries(incoming)) {
217
- if (value !== undefined) {
351
+ if (!TEXT_STYLE_CASCADE_PROPS.includes(key as CascadeTypographyProp)) {
352
+ continue;
353
+ }
354
+
355
+ if (value !== undefined && value !== null && value !== '') {
218
356
  (existing as unknown as Record<string, unknown>)[key] = value;
357
+ } else if (
358
+ (value === null || value === '') &&
359
+ Object.prototype.hasOwnProperty.call(NEUTRAL_TYPOGRAPHY_VALUE, key)
360
+ ) {
361
+ (existing as unknown as Record<string, unknown>)[key] =
362
+ NEUTRAL_TYPOGRAPHY_VALUE[
363
+ key as keyof typeof NEUTRAL_TYPOGRAPHY_VALUE
364
+ ];
219
365
  }
220
366
  }
221
367
  }
@@ -1,41 +1,36 @@
1
1
  import { describe, it, expect } from 'vitest';
2
- import type { BrandPageModel } from '../../brand-page/models';
2
+ import type {
3
+ BrandPageModel,
4
+ TextStyleDeclaration,
5
+ } from '../../brand-page/models';
6
+ import { TextStyles } from '../../brand-page/models';
3
7
  import type { TextStyleOptions } from '../../brand-page/models/styles.model';
8
+ import {
9
+ resolveTextStyle,
10
+ TEXT_STYLE_CASCADE_PROPS,
11
+ } from '../../brand-page/utils/text-style.util';
4
12
  import type { UpdateHeaderArguments } from '../parsers/ai-toolcall-parser';
5
13
  import { BUILDER_TYPES } from '../models';
6
14
  import { HeaderBuilder } from './header-builder';
7
15
 
8
16
  /**
9
- * BP-5420: changing the nav menu font had no effect when the nav button style
10
- * was bound to the global `buttons` preset (`textStyleType: 'buttons'`). The
11
- * renderer (`getTextStyleByContentTextStyle`) overlays the preset font over the
12
- * per-element style, discarding the font the builder wrote.
13
- *
14
- * The fix routes nav button style writes through `applyDetachedStyleOverride`,
15
- * which resolves the preset in and clears `textStyleType`.
17
+ * BP-5420: changing the nav menu font had no effect when the nav button style was bound to a
18
+ * global preset, because the renderer overlaid the preset font. With per-property resolution the
19
+ * nav keeps its role and the font is stored as a sparse override, which wins over the role.
16
20
  */
17
21
 
18
- const textStyleOptions = {
19
- titles: { type: 'titles', title: 'Titles', style: { fontFamily: 'Poppins' } },
20
- headings: {
21
- type: 'headings',
22
- title: 'Headings',
23
- style: { fontFamily: 'Poppins' },
24
- },
25
- paragraphs: {
26
- type: 'paragraphs',
27
- title: 'Paragraphs',
28
- style: { fontFamily: 'Inter' },
29
- },
30
- buttons: {
31
- type: 'buttons',
32
- title: 'Buttons',
33
- style: { fontFamily: 'Poppins', fontSize: '1em', color: '#ffffff' },
34
- },
35
- } as unknown as TextStyleOptions;
22
+ const makeOptions = (): TextStyleOptions => {
23
+ const options = TextStyles.GetDefaultTextStyle().textStyleOptions;
24
+
25
+ options.paragraph1.style.fontFamily = 'Poppins';
26
+ options.button.style.fontFamily = 'Poppins';
27
+
28
+ return options;
29
+ };
36
30
 
37
31
  const makeModel = (
38
32
  defaultButtonStyle: Record<string, unknown>,
33
+ textStyleOptions: TextStyleOptions = makeOptions(),
39
34
  ): BrandPageModel =>
40
35
  ({
41
36
  styles: { textStyles: { textStyleOptions } },
@@ -54,9 +49,17 @@ const run = (args: UpdateHeaderArguments, model: BrandPageModel) =>
54
49
  payload: args,
55
50
  }).buildAsync(model);
56
51
 
52
+ // Only the font is stored; every other typography property is left to the role.
53
+ const expectOnlyFontOverride = (style: Record<string, unknown>): void => {
54
+ for (const prop of TEXT_STYLE_CASCADE_PROPS) {
55
+ if (prop !== 'fontFamily') expect(style[prop]).toBeUndefined();
56
+ }
57
+ };
58
+
57
59
  describe('HeaderBuilder — nav menu font vs global style', () => {
58
- it('clears textStyleType so the new menu font sticks when bound to a preset', async () => {
59
- const model = makeModel({ textStyleType: 'buttons' });
60
+ it('link_text_font keeps the nav tabs on their role; the font is a sparse override that sticks', async () => {
61
+ const options = makeOptions();
62
+ const model = makeModel({ textStyleType: 'paragraph1' }, options);
60
63
 
61
64
  const { model: out, errors } = await run(
62
65
  { desktop: { link_text_font: 'Oswald' } },
@@ -67,11 +70,28 @@ describe('HeaderBuilder — nav menu font vs global style', () => {
67
70
  .defaultButtonStyle as Record<string, unknown>;
68
71
 
69
72
  expect(errors ?? []).toEqual([]);
73
+ expect(style.textStyleType).toBe('paragraph1');
74
+ expect(style.fontFamily).toBe('Oswald');
75
+ expectOnlyFontOverride(style);
76
+ expect(
77
+ resolveTextStyle(style as TextStyleDeclaration, options.paragraph1.style)
78
+ .fontFamily,
79
+ ).toBe('Oswald');
80
+ });
81
+
82
+ it('link_text_font reconnects nav tabs on a retired role to their starting role, Paragraph 1', async () => {
83
+ const model = makeModel({ textStyleType: 'buttons' });
84
+
85
+ const { model: out } = await run(
86
+ { desktop: { link_text_font: 'Oswald' } },
87
+ model,
88
+ );
89
+
90
+ const style = out.pageHeaderDesktop!.navigation
91
+ .defaultButtonStyle as Record<string, unknown>;
92
+
93
+ expect(style.textStyleType).toBe('paragraph1');
70
94
  expect(style.fontFamily).toBe('Oswald');
71
- expect(style.textStyleType).toBeUndefined();
72
- // preset values resolved in; only the font is overridden
73
- expect(style.fontSize).toBe('1em');
74
- expect(style.color).toBe('#ffffff');
75
95
  });
76
96
 
77
97
  it('applies the override to the targeted viewport only', async () => {
@@ -106,20 +126,71 @@ describe('HeaderBuilder — nav menu font vs global style', () => {
106
126
  });
107
127
 
108
128
  describe('HeaderBuilder — nav menu font reaches the hamburger overlay (BP-6079)', () => {
109
- it('applies link_text_font to the hamburger default and selected button styles', async () => {
110
- const model = makeModel({ textStyleType: 'buttons' });
129
+ it.each([[{ textStyleType: 'button' }], [{}]])(
130
+ 'applies link_text_font to the hamburger default (%j → Button text); the selected link follows it (BP-5969 R12)',
131
+ async (hamburgerRole) => {
132
+ const options = makeOptions();
133
+ const model = makeModel({ textStyleType: 'paragraph1' }, options);
134
+ const nav = model.pageHeaderMobile!.navigation as unknown as Record<
135
+ string,
136
+ unknown
137
+ >;
138
+
139
+ nav.hamburgerMenuStyle = {
140
+ defaultButtonStyle: { ...hamburgerRole, color: '#111111' },
141
+ selectedButtonStyle: { color: '#222222' },
142
+ };
143
+
144
+ const { model: out, errors } = await run(
145
+ { mobile: { link_text_font: 'Oswald' } },
146
+ model,
147
+ );
148
+
149
+ const menu = (
150
+ out.pageHeaderMobile!.navigation as unknown as Record<string, unknown>
151
+ ).hamburgerMenuStyle as Record<string, Record<string, unknown>>;
152
+
153
+ expect(errors ?? []).toEqual([]);
154
+ expect(menu.defaultButtonStyle.textStyleType).toBe('button');
155
+ expect(menu.defaultButtonStyle.fontFamily).toBe('Oswald');
156
+ expect(menu.defaultButtonStyle.color).toBe('#111111');
157
+ expect(
158
+ resolveTextStyle(
159
+ menu.defaultButtonStyle as TextStyleDeclaration,
160
+ options.button.style,
161
+ ).fontFamily,
162
+ ).toBe('Oswald');
163
+ // The selected style mirrors the default's RESULTING sparse typography (B4; R12, R20)
164
+ // instead of being independently reconnected onto its own role — it carries no role of
165
+ // its own (no maker path sets one, no migration adds one; global-role-propagation's
166
+ // sibling drop is what reaches it on a later site-wide change, not a textStyleType match).
167
+ expect(menu.selectedButtonStyle.textStyleType).toBeUndefined();
168
+ expect(menu.selectedButtonStyle.fontFamily).toBe('Oswald');
169
+ expect(menu.selectedButtonStyle.color).toBe('#222222');
170
+ expect(
171
+ resolveTextStyle(
172
+ menu.selectedButtonStyle as TextStyleDeclaration,
173
+ options.button.style,
174
+ ).fontFamily,
175
+ ).toBe('Oswald');
176
+ },
177
+ );
178
+
179
+ it('selected link follows its default sibling: a family equal to the menu role is sparse on both', async () => {
180
+ const options = makeOptions(); // options.button.style.fontFamily === 'Poppins'
181
+ const model = makeModel({ textStyleType: 'paragraph1' }, options);
111
182
  const nav = model.pageHeaderMobile!.navigation as unknown as Record<
112
183
  string,
113
184
  unknown
114
185
  >;
115
186
 
116
187
  nav.hamburgerMenuStyle = {
117
- defaultButtonStyle: { fontFamily: 'Lato', color: '#111111' },
118
- selectedButtonStyle: { textStyleType: 'buttons' },
188
+ defaultButtonStyle: { textStyleType: 'button', color: '#111111' },
189
+ selectedButtonStyle: { color: '#222222' },
119
190
  };
120
191
 
121
192
  const { model: out, errors } = await run(
122
- { mobile: { link_text_font: 'Oswald' } },
193
+ { mobile: { link_text_font: 'Poppins' } },
123
194
  model,
124
195
  );
125
196
 
@@ -128,10 +199,11 @@ describe('HeaderBuilder — nav menu font reaches the hamburger overlay (BP-6079
128
199
  ).hamburgerMenuStyle as Record<string, Record<string, unknown>>;
129
200
 
130
201
  expect(errors ?? []).toEqual([]);
131
- expect(menu.defaultButtonStyle.fontFamily).toBe('Oswald');
132
- expect(menu.defaultButtonStyle.color).toBe('#111111');
133
- expect(menu.selectedButtonStyle.fontFamily).toBe('Oswald');
202
+ expect(menu.defaultButtonStyle.fontFamily).toBeUndefined();
203
+ expect(menu.selectedButtonStyle.fontFamily).toBeUndefined();
134
204
  expect(menu.selectedButtonStyle.textStyleType).toBeUndefined();
205
+ expect(menu.defaultButtonStyle.color).toBe('#111111');
206
+ expect(menu.selectedButtonStyle.color).toBe('#222222');
135
207
  });
136
208
 
137
209
  it('a header without a hamburger menu style is left alone', async () => {
@@ -16,7 +16,11 @@ import type { Logger } from '../logger';
16
16
  import type { TextStyleOptions } from '../../brand-page/models/styles.model';
17
17
  import { getPageSlugFromPageTitle } from '../../brand-page-maker/utils/slug.util';
18
18
  import { HEADER_CHECKS } from './section-rules/header.rules';
19
- import { applyDetachedStyleOverride } from './section-field-utils';
19
+ import { applyAiStyle } from './section-field-utils';
20
+ import {
21
+ omitTypography,
22
+ pickTypography,
23
+ } from '../../brand-page/utils/text-style.util';
20
24
 
21
25
  const applyViewportHeaderChanges = (
22
26
  header: AbstractPageHeaderStyles,
@@ -58,10 +62,11 @@ const applyViewportHeaderChanges = (
58
62
  }
59
63
 
60
64
  if (overrides.link_text_font !== undefined && header.navigation) {
61
- header.navigation.defaultButtonStyle = applyDetachedStyleOverride(
65
+ header.navigation.defaultButtonStyle = applyAiStyle(
62
66
  header.navigation.defaultButtonStyle,
63
67
  { fontFamily: overrides.link_text_font },
64
68
  textStyleOptions,
69
+ { startingRole: 'paragraph1' },
65
70
  );
66
71
  }
67
72
 
@@ -73,16 +78,21 @@ const applyViewportHeaderChanges = (
73
78
  ) {
74
79
  const menu = header.navigation.hamburgerMenuStyle;
75
80
 
76
- menu.defaultButtonStyle = applyDetachedStyleOverride(
81
+ menu.defaultButtonStyle = applyAiStyle(
77
82
  menu.defaultButtonStyle,
78
83
  { fontFamily: overrides.link_text_font },
79
84
  textStyleOptions,
85
+ { startingRole: 'button' },
80
86
  );
81
- menu.selectedButtonStyle = applyDetachedStyleOverride(
82
- menu.selectedButtonStyle,
83
- { fontFamily: overrides.link_text_font },
84
- textStyleOptions,
85
- );
87
+ // The selected style mirrors the default's RESULTING sparse typography rather than being
88
+ // independently reconnected: it carries no role of its own (no maker path
89
+ // sets one, no migration adds one), so reconnecting it on its own path could resolve a
90
+ // different override shape than its sibling for the same ask. `global-role-propagation.ts`
91
+ // mirrors a later site-wide change onto it the same way (the default/selected sibling drop).
92
+ menu.selectedButtonStyle = {
93
+ ...omitTypography(menu.selectedButtonStyle ?? {}),
94
+ ...pickTypography(menu.defaultButtonStyle),
95
+ };
86
96
  }
87
97
 
88
98
  if (overrides.link_bg_color !== undefined && header.navigation) {
@@ -11,7 +11,7 @@ import {
11
11
  import {
12
12
  applyScalarFields,
13
13
  applyStyleFields,
14
- resolveGlobalPresetIntoStyle,
14
+ applyAiStyle,
15
15
  } from '../section-field-utils';
16
16
  import {
17
17
  applyColorThemeToReplacements,
@@ -54,8 +54,9 @@ export class AboutSectionBuilder extends BaseSectionBuilder<AboutSectionContent>
54
54
  if (aboutArgs.title !== undefined) {
55
55
  if (isTiptapDocument(aboutArgs.title)) {
56
56
  resolved.content.title = aboutArgs.title;
57
- resolved.content.titleStyle = resolveGlobalPresetIntoStyle(
57
+ resolved.content.titleStyle = applyAiStyle(
58
58
  resolved.content.titleStyle,
59
+ {},
59
60
  textStyleOptions,
60
61
  ) as TextStyleDeclaration;
61
62
  } else {
@@ -66,8 +67,9 @@ export class AboutSectionBuilder extends BaseSectionBuilder<AboutSectionContent>
66
67
  if (aboutArgs.paragraph !== undefined) {
67
68
  if (isTiptapDocument(aboutArgs.paragraph)) {
68
69
  resolved.content.paragraph = aboutArgs.paragraph;
69
- resolved.content.paragraphStyle = resolveGlobalPresetIntoStyle(
70
+ resolved.content.paragraphStyle = applyAiStyle(
70
71
  resolved.content.paragraphStyle,
72
+ {},
71
73
  textStyleOptions,
72
74
  ) as TextStyleDeclaration;
73
75
  } else {
@@ -12,7 +12,7 @@ import {
12
12
  applyButtonLink,
13
13
  applyScalarFields,
14
14
  applyStyleFields,
15
- resolveGlobalPresetIntoStyle,
15
+ applyAiStyle,
16
16
  } from '../section-field-utils';
17
17
  import {
18
18
  applyColorThemeToReplacements,
@@ -91,8 +91,9 @@ export class BannerSectionBuilder extends BaseSectionBuilder<BannerSectionConten
91
91
  if (bannerArgs.title !== undefined) {
92
92
  if (isTiptapDocument(bannerArgs.title)) {
93
93
  resolved.content.title = bannerArgs.title;
94
- resolved.content.titleStyle = resolveGlobalPresetIntoStyle(
94
+ resolved.content.titleStyle = applyAiStyle(
95
95
  resolved.content.titleStyle,
96
+ {},
96
97
  textStyleOptions,
97
98
  ) as TextStyleDeclaration;
98
99
  } else {
@@ -103,8 +104,9 @@ export class BannerSectionBuilder extends BaseSectionBuilder<BannerSectionConten
103
104
  if (bannerArgs.description !== undefined) {
104
105
  if (isTiptapDocument(bannerArgs.description)) {
105
106
  resolved.content.description = bannerArgs.description;
106
- resolved.content.descriptionStyle = resolveGlobalPresetIntoStyle(
107
+ resolved.content.descriptionStyle = applyAiStyle(
107
108
  resolved.content.descriptionStyle,
109
+ {},
108
110
  textStyleOptions,
109
111
  ) as TextStyleDeclaration;
110
112
  } else {