@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
@@ -0,0 +1,358 @@
1
+ import { mount } from '@vue/test-utils';
2
+ import { computed, reactive } from 'vue';
3
+ import { describe, it, expect } from 'vitest';
4
+ import TextWrapper from './TextWrapper.vue';
5
+ import { TEXT_ROLE_OPTIONS_KEY } from '@brand-page/utils/text-role-css.util';
6
+
7
+ /**
8
+ * BP-5969 (role-var model) — the page-scoped role class only DEFINES the role vars
9
+ * (`--role-*`); it applies none of them. Plain-text fields have no runs, so the element
10
+ * applies the four role refs (`font-family: var(--role-font-family)`, …); an override is a
11
+ * literal that beats the ref. (RTE applies via its run marks instead — not covered here.)
12
+ * These tests pin the plain-text render seam; full pixel-identity is the visual-regression gate.
13
+ */
14
+
15
+ // The resolved (view-model) style a linked heading1 with NO override carries — role
16
+ // typography filled in, since the view-model still resolves.
17
+ const HEADING1_ROLE = {
18
+ fontFamily: 'Lato',
19
+ fontSize: '2.5em',
20
+ fontWeight: '700',
21
+ lineHeight: '1.2',
22
+ };
23
+
24
+ const roleOptions = { heading1: { style: HEADING1_ROLE } };
25
+
26
+ const mountWrapper = (
27
+ textStyle: Record<string, unknown>,
28
+ text: unknown,
29
+ { withPage = true } = {},
30
+ ) =>
31
+ mount(TextWrapper, {
32
+ props: { textStyle, text, element: 'p' },
33
+ global: withPage
34
+ ? { provide: { [TEXT_ROLE_OPTIONS_KEY]: computed(() => roleOptions) } }
35
+ : {},
36
+ });
37
+
38
+ const rteDocWithOverride = {
39
+ type: 'doc',
40
+ content: [
41
+ {
42
+ type: 'paragraph',
43
+ content: [
44
+ {
45
+ type: 'text',
46
+ text: 'Mission',
47
+ marks: [{ type: 'textStyle', attrs: { fontSize: '3em' } }],
48
+ },
49
+ ],
50
+ },
51
+ ],
52
+ };
53
+
54
+ const roleEl = (wrapper: ReturnType<typeof mountWrapper>) =>
55
+ wrapper.get('.bp-text-role-heading1');
56
+
57
+ describe('TextWrapper — role-var plain-text typography (BP-5969)', () => {
58
+ it('applies the role vars on the plain-text element when the block matches its role', () => {
59
+ const el = roleEl(
60
+ mountWrapper(
61
+ { ...HEADING1_ROLE, textStyleType: 'heading1' },
62
+ 'Our mission',
63
+ ),
64
+ );
65
+
66
+ // the class DEFINES the vars; the plain-text element APPLIES them (no runs to carry them)
67
+ expect(el.attributes('style')).toMatch(
68
+ /font-family:\s*var\(--role-font-family\)/,
69
+ );
70
+ expect(el.attributes('style')).toMatch(
71
+ /font-size:\s*var\(--role-font-size\)/,
72
+ );
73
+ // BP-5969 D4: weight is var-backed too, not baked as a literal copy of the role's value.
74
+ expect(el.attributes('style')).toMatch(
75
+ /font-weight:\s*var\(--role-font-weight\)/,
76
+ );
77
+ });
78
+
79
+ it('inlines an override literal; the rest stay role var refs', () => {
80
+ const el = roleEl(
81
+ mountWrapper(
82
+ { ...HEADING1_ROLE, fontSize: '3em', textStyleType: 'heading1' },
83
+ 'Our mission',
84
+ ),
85
+ );
86
+
87
+ expect(el.attributes('style')).toMatch(/font-size:\s*3em/);
88
+ // family equals the role → stays a var ref (the override only replaces font-size)
89
+ expect(el.attributes('style')).toMatch(
90
+ /font-family:\s*var\(--role-font-family\)/,
91
+ );
92
+ });
93
+
94
+ it('carries NO inline typography on the RTE element — overrides ride the run marks', () => {
95
+ const el = roleEl(
96
+ mountWrapper({ textStyleType: 'heading1' }, rteDocWithOverride),
97
+ );
98
+
99
+ // the element has only the role class (var declarations); the size override is on the run span,
100
+ // not baked onto the element (a second level would double-em the run's size).
101
+ expect(el.attributes('style') ?? '').not.toMatch(/font-size/);
102
+ expect(el.html()).toMatch(/font-size:\s*3em/);
103
+ });
104
+
105
+ it('bakes the full resolved typography inline when no Page role options are provided', () => {
106
+ const el = roleEl(
107
+ mountWrapper(
108
+ { ...HEADING1_ROLE, textStyleType: 'heading1' },
109
+ 'Our mission',
110
+ {
111
+ withPage: false,
112
+ },
113
+ ),
114
+ );
115
+
116
+ // fallback = pre-token render: every prop inline, pixel-identical
117
+ expect(el.attributes('style')).toMatch(/font-size:\s*2\.5em/);
118
+ expect(el.attributes('style')).toMatch(/font-family/);
119
+ });
120
+ });
121
+
122
+ describe('TextWrapper — plain-text typography property rules (BP-5969 Brief 3)', () => {
123
+ const heading2Role = {
124
+ heading2: {
125
+ style: {
126
+ fontFamily: 'Lato',
127
+ fontSize: '5.25em',
128
+ fontWeight: 'bold',
129
+ lineHeight: '1.2',
130
+ },
131
+ },
132
+ };
133
+
134
+ const mountHeading2 = (
135
+ textStyle: Record<string, unknown>,
136
+ roleOverride = heading2Role,
137
+ ) =>
138
+ mount(TextWrapper, {
139
+ props: {
140
+ textStyle: { ...textStyle, textStyleType: 'heading2' },
141
+ text: 'Our mission',
142
+ element: 'p',
143
+ },
144
+ global: {
145
+ provide: { [TEXT_ROLE_OPTIONS_KEY]: computed(() => roleOverride) },
146
+ },
147
+ });
148
+
149
+ const heading2El = (wrapper: ReturnType<typeof mountHeading2>) =>
150
+ wrapper.get('.bp-text-role-heading2');
151
+
152
+ it('plain text carries only role references', () => {
153
+ const style = heading2El(mountHeading2({})).attributes('style');
154
+
155
+ expect(style).toMatch(/font-family:\s*var\(--role-font-family\)/);
156
+ expect(style).toMatch(/font-size:\s*var\(--role-font-size\)/);
157
+ expect(style).toMatch(/line-height:\s*var\(--role-line-height\)/);
158
+ expect(style).toMatch(/font-weight:\s*var\(--role-font-weight\)/);
159
+ // the role sets none of these — no supplier, so no property at all (not even a literal
160
+ // CSS-neutral default): nothing else applies letter-spacing near a TextWrapper.
161
+ expect(style).not.toMatch(/letter-spacing/);
162
+ expect(style).not.toMatch(/font-style/);
163
+ expect(style).not.toMatch(/text-decoration/);
164
+ });
165
+
166
+ it('plain override is the only literal', () => {
167
+ const style = heading2El(mountHeading2({ fontFamily: 'Exo 2' })).attributes(
168
+ 'style',
169
+ );
170
+
171
+ expect(style).toMatch(/font-family:\s*"Exo 2"/);
172
+ expect(style).toMatch(/font-size:\s*var\(--role-font-size\)/);
173
+ expect(style).toMatch(/font-weight:\s*var\(--role-font-weight\)/);
174
+ });
175
+
176
+ it('plain honours a stored off value', () => {
177
+ const style = heading2El(
178
+ mountHeading2({ fontWeight: 'normal' }),
179
+ ).attributes('style');
180
+
181
+ // D3: a bold role with an explicit "not bold" override stays a literal, not the role ref.
182
+ expect(style).toMatch(/font-weight:\s*normal/);
183
+ expect(style).not.toMatch(/font-weight:\s*var/);
184
+ });
185
+
186
+ it('plain and rich text paint the same', () => {
187
+ const rteDoc = {
188
+ type: 'doc',
189
+ content: [
190
+ {
191
+ type: 'paragraph',
192
+ content: [{ type: 'text', text: 'Our mission' }],
193
+ },
194
+ ],
195
+ };
196
+
197
+ const mountRte = (textStyle: Record<string, unknown>) =>
198
+ mount(TextWrapper, {
199
+ props: {
200
+ textStyle: { ...textStyle, textStyleType: 'heading2' },
201
+ text: rteDoc,
202
+ element: 'p',
203
+ },
204
+ global: {
205
+ provide: { [TEXT_ROLE_OPTIONS_KEY]: computed(() => heading2Role) },
206
+ },
207
+ });
208
+
209
+ // A genuine override (D3): both paint the literal, not the role ref.
210
+ expect(heading2El(mountHeading2({ fontWeight: 'normal' })).html()).toMatch(
211
+ /font-weight:\s*normal/,
212
+ );
213
+ expect(mountRte({ fontWeight: 'normal' }).html()).toMatch(
214
+ /font-weight:\s*normal/,
215
+ );
216
+
217
+ // No override: both follow the role via its var.
218
+ expect(heading2El(mountHeading2({})).attributes('style')).toMatch(
219
+ /font-weight:\s*var\(--role-font-weight\)/,
220
+ );
221
+ expect(mountRte({}).html()).toMatch(
222
+ /font-weight:\s*var\(--role-font-weight\)/,
223
+ );
224
+ });
225
+
226
+ it('renders a local RTE strike as a role-aware class so a global underline can compose', async () => {
227
+ const rteDoc = {
228
+ type: 'doc',
229
+ content: [
230
+ {
231
+ type: 'paragraph',
232
+ content: [
233
+ {
234
+ type: 'text',
235
+ text: 'Our mission',
236
+ marks: [
237
+ {
238
+ type: 'textStyle',
239
+ attrs: { textDecoration: 'line-through' },
240
+ },
241
+ ],
242
+ },
243
+ ],
244
+ },
245
+ ],
246
+ };
247
+ const roleWithUnderline = {
248
+ heading2: {
249
+ style: { ...heading2Role.heading2.style, textDecoration: 'underline' },
250
+ },
251
+ };
252
+
253
+ const wrapper = mountHeading2({}, roleWithUnderline);
254
+
255
+ await wrapper.setProps({ text: rteDoc });
256
+
257
+ expect(wrapper.html()).toContain('bp-rte-text-decoration-linethrough');
258
+ });
259
+
260
+ it('keeps a local RTE decoration inline without Page role CSS', () => {
261
+ const wrapper = mount(TextWrapper, {
262
+ props: {
263
+ textStyle: { textStyleType: 'heading2' },
264
+ text: {
265
+ type: 'doc',
266
+ content: [
267
+ {
268
+ type: 'paragraph',
269
+ content: [
270
+ {
271
+ type: 'text',
272
+ text: 'Our mission',
273
+ marks: [
274
+ {
275
+ type: 'textStyle',
276
+ attrs: { textDecoration: 'line-through' },
277
+ },
278
+ ],
279
+ },
280
+ ],
281
+ },
282
+ ],
283
+ },
284
+ element: 'p',
285
+ },
286
+ });
287
+
288
+ expect(wrapper.html()).toContain('text-decoration: line-through');
289
+ expect(wrapper.html()).not.toContain('bp-rte-text-decoration-');
290
+ });
291
+
292
+ it('a role edit reaches plain text', async () => {
293
+ const role = reactive(JSON.parse(JSON.stringify(heading2Role)));
294
+ const wrapper = mount(TextWrapper, {
295
+ props: {
296
+ textStyle: { textStyleType: 'heading2' },
297
+ text: 'Our mission',
298
+ element: 'p',
299
+ },
300
+ global: {
301
+ provide: {
302
+ [TEXT_ROLE_OPTIONS_KEY]: computed(() => role),
303
+ },
304
+ },
305
+ });
306
+
307
+ expect(heading2El(wrapper).attributes('style')).not.toMatch(
308
+ /font-style|text-decoration/,
309
+ );
310
+
311
+ role.heading2.style.fontStyle = 'italic';
312
+ role.heading2.style.textDecoration = 'underline';
313
+ await wrapper.vm.$nextTick();
314
+
315
+ const style = heading2El(wrapper).attributes('style');
316
+
317
+ expect(style).toMatch(/font-style:\s*var\(--role-font-style\)/);
318
+ expect(style).toMatch(/text-decoration:\s*var\(--role-text-decoration\)/);
319
+ });
320
+
321
+ it('autoscale uses the role size', async () => {
322
+ const container = document.createElement('div');
323
+
324
+ container.setAttribute(
325
+ 'data-fluid-text',
326
+ JSON.stringify({ default: 1200 }),
327
+ );
328
+ Object.defineProperty(container, 'clientWidth', {
329
+ value: 600,
330
+ configurable: true,
331
+ });
332
+ document.body.appendChild(container);
333
+
334
+ const wrapper = mount(TextWrapper, {
335
+ props: {
336
+ textStyle: { textStyleType: 'heading2', applyAutoScale: true },
337
+ text: 'Our mission',
338
+ element: 'p',
339
+ },
340
+ global: {
341
+ provide: { [TEXT_ROLE_OPTIONS_KEY]: computed(() => heading2Role) },
342
+ },
343
+ attachTo: container,
344
+ });
345
+
346
+ await wrapper.vm.$nextTick();
347
+
348
+ const fontSize = parseFloat(
349
+ (wrapper.element as HTMLElement).style.fontSize,
350
+ );
351
+
352
+ expect(fontSize).toBeGreaterThan(0);
353
+ expect(fontSize).toBeLessThan(100);
354
+
355
+ wrapper.unmount();
356
+ container.remove();
357
+ });
358
+ });
@@ -8,13 +8,13 @@
8
8
  >
9
9
  <div
10
10
  class="tw-w-full empty-para"
11
- :style="isRTEContent ? textStyleRTE : style"
11
+ :style="isRTEContent ? textStyleRTE : wrapperStyle"
12
12
  >
13
13
  <component
14
14
  :is="element"
15
- :class="[padding, { 'tw-inline': !isRTEContent }]"
15
+ :class="[padding, roleClass, { 'tw-inline': !isRTEContent }]"
16
16
  class="tw-box-decoration-clone"
17
- :style="isRTEContent ? {} : textStyles"
17
+ :style="innerStyle"
18
18
  v-html="sanitizeText"
19
19
  />
20
20
  </div>
@@ -31,19 +31,28 @@ import {
31
31
  import {
32
32
  type FluidTextData,
33
33
  type TextStyleDeclaration,
34
+ CANONICAL_TEXT_STYLE_TYPES,
35
+ type CanonicalTextStyleType,
34
36
  } from '@brand-page/models';
37
+ import {
38
+ textRoleClassName,
39
+ fillRteRunTypography,
40
+ roleTypographyStyle,
41
+ TEXT_ROLE_OPTIONS_KEY,
42
+ } from '@brand-page/utils/text-role-css.util';
43
+ import { TEXT_STYLE_CASCADE_PROPS } from '@brand-page/utils/text-style.util';
35
44
  import {
36
45
  computed,
37
46
  reactive,
38
47
  onMounted,
39
48
  onUnmounted,
40
49
  getCurrentInstance,
50
+ inject,
41
51
  watch,
42
52
  } from 'vue';
43
53
 
44
54
  interface Props {
45
55
  textStyle: TextStyleDeclaration | undefined;
46
- // BP-5787: an RTE field is a legacy inline-HTML string or a Tiptap JSON doc.
47
56
  text: RichTextValue;
48
57
  element?: string;
49
58
  slug?: string;
@@ -86,9 +95,45 @@ const textStyleRTE = computed(() => {
86
95
  };
87
96
  });
88
97
 
89
- // Render either form (legacy HTML string or Tiptap JSON) to final HTML.
90
- // For a string this returns it unchanged, so the legacy path is unaffected.
91
- const renderedHtml = computed(() => renderRteToHtml(props.text));
98
+ const canonicalRoleType = computed<CanonicalTextStyleType | undefined>(() => {
99
+ const type = props.textStyle?.textStyleType;
100
+
101
+ return type &&
102
+ (CANONICAL_TEXT_STYLE_TYPES as readonly string[]).includes(type)
103
+ ? (type as CanonicalTextStyleType)
104
+ : undefined;
105
+ });
106
+
107
+ const roleClass = computed(() =>
108
+ canonicalRoleType.value
109
+ ? textRoleClassName(canonicalRoleType.value)
110
+ : undefined,
111
+ );
112
+
113
+ const roleOptions = inject(TEXT_ROLE_OPTIONS_KEY, undefined);
114
+
115
+ const roleStyle = computed(() =>
116
+ canonicalRoleType.value
117
+ ? roleOptions?.value?.[canonicalRoleType.value]?.style
118
+ : undefined,
119
+ );
120
+
121
+ const renderedHtml = computed(() => {
122
+ const text = props.text;
123
+
124
+ if (canonicalRoleType.value && isTiptapDocument(text)) {
125
+ return renderRteToHtml(
126
+ fillRteRunTypography(
127
+ text,
128
+ roleStyle.value as Record<string, string> | undefined,
129
+ props.textStyle as unknown as Record<string, string> | undefined,
130
+ ),
131
+ { textDecorationClasses: roleStyle.value !== undefined },
132
+ );
133
+ }
134
+
135
+ return renderRteToHtml(text);
136
+ });
92
137
 
93
138
  const isRTEContent = computed(() => {
94
139
  return isTiptapDocument(props.text) || hasRTEContent(renderedHtml.value);
@@ -102,7 +147,9 @@ const sanitizeText = computed(() => {
102
147
  return renderedHtml.value;
103
148
  });
104
149
 
105
- const fontSize = computed<any>(() => props.textStyle.fontSize);
150
+ const fontSize = computed<any>(
151
+ () => props.textStyle.fontSize || roleStyle.value?.fontSize,
152
+ );
106
153
 
107
154
  watch(fontSize, () => {
108
155
  applyScale();
@@ -120,6 +167,24 @@ const padding = computed(() =>
120
167
  : '',
121
168
  );
122
169
 
170
+ const wrapperStyle = computed(() => {
171
+ const stripped: Record<string, unknown> = { ...style.value };
172
+
173
+ for (const prop of TEXT_STYLE_CASCADE_PROPS) delete stripped[prop];
174
+
175
+ return stripped;
176
+ });
177
+
178
+ const innerStyle = computed(() => ({
179
+ ...textStyles.value,
180
+ ...(isRTEContent.value
181
+ ? {}
182
+ : roleTypographyStyle(
183
+ props.textStyle as unknown as Record<string, string>,
184
+ roleStyle.value as Record<string, string> | undefined,
185
+ )),
186
+ }));
187
+
123
188
  onMounted(() => {
124
189
  if (props.textStyle.applyAutoScale) {
125
190
  setTargetContainer();
@@ -142,8 +207,8 @@ const applyScaleWithDelay = () => {
142
207
  }, 350);
143
208
  };
144
209
 
145
- // Traversing back up the node tree to find the correct container element
146
- // There can be more than one due to template setting side bar if we use document selector
210
+ // Walk up from this node, not a document-wide query: the template settings sidebar can render a
211
+ // second matching container.
147
212
  const setTargetContainer = () => {
148
213
  let p = (currentInstance as any).vnode.el.parentNode;
149
214
  while (p) {
@@ -159,10 +224,8 @@ const setTargetContainer = () => {
159
224
  }
160
225
  };
161
226
 
162
- // minimum font size that will apply the scale
163
227
  const minFontSizeInPxToDisableScale = 14;
164
228
 
165
- // Controlled rate that we can apply to baseChangeRate to control the strength of scale,
166
229
  const customStrengthRate = 0.3;
167
230
 
168
231
  const applyScale = () => {
@@ -174,14 +237,15 @@ const applyScale = () => {
174
237
  ...renderedHtml.value.matchAll(
175
238
  /style="(?:[^"]*?)\bfont-size\s*:\s*(?<fontSize>[^;"']+)[^"]*?"/gm,
176
239
  ),
177
- ].map((x) => parseFloat(x.groups?.fontSize || '1em'));
240
+ ]
241
+ .map((x) => parseFloat(x.groups?.fontSize || '1em'))
242
+ .filter((size) => !Number.isNaN(size));
178
243
 
179
- const currentFontSize =
180
- fontSizeMatchInRTEText.length > 0
181
- ? Math.max(...fontSizeMatchInRTEText)
182
- : props.textStyle.fontSize || '1em';
244
+ const baseFontSize = parseFloat(
245
+ `${props.textStyle.fontSize || roleStyle.value?.fontSize || '1em'}`,
246
+ );
183
247
 
184
- const fontSizeValue = parseFloat(`${currentFontSize}`);
248
+ const fontSizeValue = Math.max(baseFontSize, ...fontSizeMatchInRTEText);
185
249
  const fontSizeValueInPx = fontSizeValue * 16;
186
250
  if (fontSizeValueInPx < minFontSizeInPxToDisableScale) {
187
251
  data.wrapperStyle.fontSize = '100%';
@@ -193,18 +257,14 @@ const applyScale = () => {
193
257
  const targetMaxWidth = data.targetContainerData.default;
194
258
 
195
259
  if (currentTargetContainerWidth < targetMaxWidth) {
196
- // Base change rate which is rate of container size change
197
260
  const baseChangeRate = currentTargetContainerWidth / targetMaxWidth;
198
261
 
199
- // Controlled rate that we can apply to baseChangeRate to control the strength of scale,
200
262
  const controlledChangeRate =
201
263
  baseChangeRate + (1 - baseChangeRate) * customStrengthRate;
202
264
 
203
- // VariableRate that determines the how much windowSizeChangeRate to actually apply
204
265
  const variableFontRate = minFontSizeInPxToDisableScale / fontSizeValueInPx;
205
266
  const variableRate = 1 - variableFontRate;
206
267
 
207
- // using math power to apply variable factor
208
268
  const finalChangeRate = Math.pow(controlledChangeRate, variableRate);
209
269
 
210
270
  const scaledPercentage = Math.min(finalChangeRate * 100, 100);
@@ -5,6 +5,19 @@ export const DISPLAY_TEXT_HEADINGS = 'Headings';
5
5
  export const DISPLAY_TEXT_BODY = 'Paragraphs';
6
6
  export const DISPlAY_TEXT_BUTTONS = 'Button Texts';
7
7
 
8
+ // BP-5969 — display names for the 10 global text roles (English fallback; the
9
+ // panel/picker use i18n `styleSettingsTr(<role>)`, these back it up).
10
+ export const DISPLAY_TEXT_HEADING_1 = 'Heading 1';
11
+ export const DISPLAY_TEXT_HEADING_2 = 'Heading 2';
12
+ export const DISPLAY_TEXT_HEADING_3 = 'Heading 3';
13
+ export const DISPLAY_TEXT_HEADING_4 = 'Heading 4';
14
+ export const DISPLAY_TEXT_HEADING_5 = 'Heading 5';
15
+ export const DISPLAY_TEXT_HEADING_6 = 'Heading 6';
16
+ export const DISPLAY_TEXT_PARAGRAPH_1 = 'Paragraph 1';
17
+ export const DISPLAY_TEXT_PARAGRAPH_2 = 'Paragraph 2';
18
+ export const DISPLAY_TEXT_PARAGRAPH_3 = 'Paragraph 3';
19
+ export const DISPLAY_TEXT_BUTTON = 'Button';
20
+
8
21
  export const DEFAULT_TEXT_DECORATION = undefined;
9
22
  export const DEFAULT_FONT_STYLE = undefined;
10
23
 
@@ -20,6 +33,30 @@ export const LINE_HEIGHT_TITLE = '1.3';
20
33
  export const LINE_HEIGHT_HEADINGS = '1.4';
21
34
  export const LINE_HEIGHT_BODY = '1.5';
22
35
 
36
+ // BP-5969 — §4 default typography for the 10 global text roles. Sizes in `em`
37
+ // (relative to the 16px root). Weights/letter-spacing are new: the legacy 4
38
+ // roles carried none, so these apply to new sites only — existing sites keep
39
+ // their persisted role definitions (migration-22 preserves appearance).
40
+ // Weight is strictly binary (BP-5969): headings default `bold`, body + button
41
+ // `normal`. No semibold tier — the RTE exposes only a normal/bold toggle, so the
42
+ // role defaults use the same `bold`/`normal` keywords that toggle (and every weight
43
+ // reader) speaks, not numeric weights.
44
+ //
45
+ // Sizes are a display scale in em @ 16px root; the px each em resolves to is noted
46
+ // inline. Headings anchor H1 110px → H6 16px; body runs 22/18/14; button stays 16px.
47
+ export const TEXT_ROLE_STYLE_DEFAULTS = {
48
+ heading1: { fontSize: '6.875em', fontWeight: 'bold', lineHeight: '1.2' }, // 110px
49
+ heading2: { fontSize: '5.25em', fontWeight: 'bold', lineHeight: '1.2' }, // 84px
50
+ heading3: { fontSize: '3.1875em', fontWeight: 'bold', lineHeight: '1.25' }, // 51px
51
+ heading4: { fontSize: '2.1875em', fontWeight: 'bold', lineHeight: '1.3' }, // 35px
52
+ heading5: { fontSize: '1.4375em', fontWeight: 'bold', lineHeight: '1.35' }, // 23px
53
+ heading6: { fontSize: '1em', fontWeight: 'bold', lineHeight: '1.4' }, // 16px
54
+ paragraph1: { fontSize: '1.375em', fontWeight: 'normal', lineHeight: '1.5' }, // 22px
55
+ paragraph2: { fontSize: '1.125em', fontWeight: 'normal', lineHeight: '1.5' }, // 18px
56
+ paragraph3: { fontSize: '0.875em', fontWeight: 'normal', lineHeight: '1.6' }, // 14px
57
+ button: { fontSize: '1em', fontWeight: 'normal', lineHeight: '1.2' }, // 16px
58
+ } as const;
59
+
23
60
  export const DEFAULT_FONT_SIZE = 12;
24
61
 
25
62
  export const MIN_TEXT_SIZE_PX = 12;
@@ -23,6 +23,28 @@ describe('footer icon colour fallback', () => {
23
23
  .fill,
24
24
  ).toBe('#abcdef');
25
25
  });
26
+
27
+ test('does not mint a legacy copyright role once migration-22 has run', () => {
28
+ const model = new BrandPageModel({ v: GetLatestModelVersion() });
29
+
30
+ expect(model.pageFooterDesktop.copyrightStyle).toEqual({
31
+ textAlign: 'center',
32
+ });
33
+ expect(model.pageFooterMobile.copyrightStyle).toEqual({
34
+ textAlign: 'center',
35
+ });
36
+ });
37
+
38
+ test('keeps the legacy copyright role for pre-v22 migration input', () => {
39
+ const model = new BrandPageModel({ v: 21 });
40
+
41
+ expect(model.pageFooterDesktop.copyrightStyle.textStyleType).toBe(
42
+ 'paragraphs',
43
+ );
44
+ expect(model.pageFooterMobile.copyrightStyle.textStyleType).toBe(
45
+ 'paragraphs',
46
+ );
47
+ });
26
48
  });
27
49
 
28
50
  describe('through migration', () => {