@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
@@ -5,39 +5,75 @@
5
5
  >
6
6
  <div>
7
7
  <div class="style-editor">
8
- <Dropdown
8
+ <TextStyleRoleDropdown
9
9
  ref="textStyleTypeDropdownRef"
10
10
  v-click-outside="(e: Event) => clickOutsideTextStyle(e)"
11
11
  data-test-tag="text-style-dropdown"
12
12
  class="style-editor-button style-editor-button-textstyle"
13
- :title="
14
- textStyleTypeOptions.find((option) => option.isSelected)?.label ??
15
- TEXT_STYLE_TYPES_DISPLAY_NAME_MAP().none
16
- "
17
- icon-size="xs"
18
13
  element-classes="text-dropdown-title"
19
- menu-element-classes="tw-min-w-[310px] tw-left-0"
20
- :force-down-position="true"
14
+ menu-element-classes="tw-min-w-[220px] tw-left-0"
15
+ :selected="selectedRoleType"
16
+ :has-override="hasTypographyOverride()"
17
+ @select="
18
+ onSelectTextStyleType({ value: $event } as ButtonGroupOption)
19
+ "
20
+ />
21
+ <!-- Style actions: shown only when this block overrides its role typography; otherwise
22
+ the slot collapses and the two pickers share its width. This relative anchor is the
23
+ popup's OWN positioning context, so `.style-editor` stays static and the
24
+ colour-picker popup keeps the tall drawer as its containing block. -->
25
+ <div
26
+ ref="styleModifiedAnchorRef"
27
+ class="style-modified-anchor"
28
+ data-test-tag="style-modified-anchor"
29
+ :class="{ 'style-modified-anchor--hidden': !hasTypographyOverride() }"
30
+ :aria-hidden="!hasTypographyOverride()"
21
31
  >
32
+ <button
33
+ type="button"
34
+ class="toolbar-editor-button style-modified-toggle"
35
+ data-test-tag="style-modified-toggle"
36
+ :class="{ active: isStyleModifiedPopupOpen }"
37
+ :aria-label="textStyleFieldTr('textStyleActionsAriaLabel')"
38
+ @click="toggleStyleModifiedPopup()"
39
+ >
40
+ <Icon name="roller-brush" size="sm" />
41
+ </button>
22
42
  <div
23
- class="tw-z-1000 tw-bg-white tw-text-grayscale-600"
24
- title="Text style"
43
+ v-if="isStyleModifiedPopupOpen && hasTypographyOverride()"
44
+ v-click-outside="(e: Event) => clickOutsideStyleModified(e)"
45
+ class="style-modified-popup"
46
+ data-test-tag="style-modified-toolbar"
47
+ :style="{ left: styleModifiedPopupLeft + 'px' }"
25
48
  >
26
- <div
27
- v-for="option in textStyleTypeOptions"
28
- :key="option.value"
29
- class="tw-flex tw-items-center tw-px-2 tw-py-2 drop-down-item tw-cursor-pointer"
30
- @click="onSelectTextStyleType(option)"
31
- >
32
- <span
33
- class="tw-flex tw-flex-row tw-w-full tw-justify-between tw-items-center"
49
+ <div class="popup-panel tw-flex tw-flex-col tw-gap-1">
50
+ <p class="tw-text-xs tw-text-grayscale-600 tw-mb-1">
51
+ {{ textStyleFieldTr('styleModifiedHeader') }}
52
+ </p>
53
+ <a
54
+ v-if="canApplyTypographyToRole()"
55
+ class="tw-flex tw-items-center tw-gap-2 tw-cursor-pointer tw-text-sm tw-text-grayscale-700 tw-py-1"
56
+ data-test-tag="style-modified-apply"
57
+ @click="applyStyleToRole()"
58
+ >
59
+ <Icon name="refresh" size="sm" />
60
+ <span>{{
61
+ textStyleFieldTr('applyChangesToAll', {
62
+ role: selectedRoleLabel,
63
+ })
64
+ }}</span>
65
+ </a>
66
+ <a
67
+ class="tw-flex tw-items-center tw-gap-2 tw-cursor-pointer tw-text-sm tw-text-grayscale-700 tw-py-1"
68
+ data-test-tag="style-modified-reset"
69
+ @click="resetStyleToRole()"
34
70
  >
35
- {{ option.label }}
36
- <Icon v-if="option.isSelected" name="check-thin" size="sm" />
37
- </span>
71
+ <Icon name="undo" size="sm" />
72
+ <span>{{ textStyleFieldTr('resetToDefault') }}</span>
73
+ </a>
38
74
  </div>
39
75
  </div>
40
- </Dropdown>
76
+ </div>
41
77
  <Dropdown
42
78
  ref="fontStyleDropdownRef"
43
79
  v-click-outside="(e: Event) => clickOutsideFontStyle(e)"
@@ -47,8 +83,8 @@
47
83
  class="style-editor-button style-editor-button-font"
48
84
  element-classes="text-dropdown-title"
49
85
  :menu-z-index="10"
50
- menu-element-classes="tw-origin-top-left tw-min-w-[310px] md:tw-min-w-[350px] left-align !tw-z-10"
51
- menu-align="left"
86
+ menu-element-classes="tw-origin-top-right tw-min-w-[310px] md:tw-min-w-[350px] !tw-z-10"
87
+ menu-align="right"
52
88
  :force-down-position="true"
53
89
  >
54
90
  <DropdownItem
@@ -72,7 +108,8 @@
72
108
  </DropdownItem>
73
109
  </Dropdown>
74
110
 
75
- <div class="border mobile" />
111
+ <!-- Break to the second row; the size stepper leads it (BP-5969). -->
112
+ <div class="border" />
76
113
  <div class="style-editor-button stepper">
77
114
  <NumberStepper
78
115
  v-model="fontSettings.selectedFontSizePx"
@@ -81,7 +118,7 @@
81
118
  :max="MAX_TEXT_SIZE_PX"
82
119
  size="xs"
83
120
  :full-height="true"
84
- :input-classes="'tw-min-w-8 tw-text-sm tw-text-grayscale-600'"
121
+ :input-classes="'tw-min-w-7 tw-px-0 tw-text-sm tw-text-grayscale-600'"
85
122
  :container-class="'style-editor-button-stepper tw-h-8 '"
86
123
  :timer-to-minimum="750"
87
124
  @input="
@@ -92,10 +129,10 @@
92
129
  "
93
130
  />
94
131
  </div>
95
- <div class="style-editor-button">
132
+ <div class="toolbar-editor-button">
96
133
  <ColorField
97
134
  id="text-color-picker"
98
- class="tw-max-h-9 tw-max-w-8 tw-justify-center"
135
+ class="tw-max-h-8 tw-max-w-8 tw-justify-center"
99
136
  data-test-tag="text-color-picker"
100
137
  name="fill"
101
138
  :is-rich-text-editor="true"
@@ -117,15 +154,13 @@
117
154
  "
118
155
  />
119
156
  </div>
120
-
121
- <div class="border desktop" />
122
157
  <Button
123
158
  class="toolbar-editor-button"
124
159
  data-test-tag="bold-toolbar"
125
160
  icon="maker-bold"
126
161
  icon-size="sm"
127
162
  :class="{
128
- active: editor.isActive('bold'),
163
+ active: fontSettings.isBold,
129
164
  }"
130
165
  @click="
131
166
  triggerEditorStyleChange({ type: 'fontWeight', value: 'bold' })
@@ -137,7 +172,7 @@
137
172
  icon="maker-italic"
138
173
  icon-size="sm"
139
174
  :class="{
140
- active: editor.isActive('italic'),
175
+ active: fontSettings.isItalic,
141
176
  }"
142
177
  @click="
143
178
  triggerEditorStyleChange({ type: 'fontStyle', value: 'italic' })
@@ -149,7 +184,7 @@
149
184
  data-test-tag="underline-toolbar"
150
185
  icon-size="sm"
151
186
  :class="{
152
- active: editor.isActive('underline'),
187
+ active: fontSettings.isUnderline,
153
188
  }"
154
189
  @click="
155
190
  triggerEditorStyleChange({
@@ -159,7 +194,6 @@
159
194
  "
160
195
  />
161
196
 
162
- <div class="border mobile" />
163
197
  <Button
164
198
  class="toolbar-editor-button"
165
199
  data-test-tag="strikethrough-toolbar"
@@ -167,7 +201,7 @@
167
201
  icon-size="sm"
168
202
  justify="center"
169
203
  :class="{
170
- active: editor.isActive('strike'),
204
+ active: fontSettings.isStrike,
171
205
  }"
172
206
  @click="
173
207
  triggerEditorStyleChange({
@@ -179,7 +213,7 @@
179
213
  <div class="toolbar-editor-button">
180
214
  <ColorField
181
215
  id="text-background-color-picker"
182
- class="tw-max-h-9 tw-max-w-9 tw-justify-center"
216
+ class="tw-max-h-8 tw-max-w-8 tw-justify-center"
183
217
  data-test-tag="background-color-picker"
184
218
  name="fill"
185
219
  :is-rich-text-editor="true"
@@ -203,14 +237,17 @@
203
237
  <Button
204
238
  class="toolbar-editor-button"
205
239
  :icon="currentAlignment.icon"
206
- data-test-tag="alignment-toolbar"
240
+ data-test-tag="text-align-toolbar"
207
241
  icon-size="sm"
208
242
  justify="center"
209
243
  :class="{
210
244
  active: currentAlignment.isActive(),
211
245
  }"
212
246
  @click="
213
- triggerEditorStyleChange({ type: 'textAlign', value: 'center' })
247
+ triggerEditorStyleChange({
248
+ type: 'textAlign',
249
+ value: 'center',
250
+ })
214
251
  "
215
252
  />
216
253
  <Button
@@ -373,6 +410,7 @@
373
410
  tabindex="0"
374
411
  :editor="editor"
375
412
  :v-model="model"
413
+ :class="editorRoleClass"
376
414
  @focus="onFocus"
377
415
  @blur="onBlur"
378
416
  />
@@ -394,6 +432,10 @@ import {
394
432
  } from '@designcrowd/fe-shared-lib';
395
433
  import { EditorContent } from '@tiptap/vue-3';
396
434
  import { BubbleMenu } from '@tiptap/vue-3/menus';
435
+ // v-click-outside resolves to this local binding — the directive is NOT registered
436
+ // globally (the host app registers zero directives), so every component that uses
437
+ // it must import it, or the toolbar dropdowns/popups won't close on outside-click.
438
+ import { directive as vClickOutside } from 'click-outside-vue3';
397
439
  import { useRichTextEditor } from '../../composables/rich-text-editor/useRichTextEditor';
398
440
  import FontPicker from '@shared/font-family-selector/FontPicker.vue';
399
441
  import ColorField from '@shared/content-settings/components/color-field/ColorField.vue';
@@ -408,14 +450,20 @@ import {
408
450
  MAX_LINE_HEIGHT,
409
451
  DEFAULT_FONT_SIZE,
410
452
  MAX_TEXT_SIZE_PX,
411
- TEXT_STYLE_TYPES,
412
453
  HYPERLINK_TYPE,
413
454
  type TextStyleDeclaration,
414
455
  type TextItem,
415
456
  type HyperlinkType,
416
457
  TEXT_STYLE_TYPES_DISPLAY_NAME_MAP,
417
458
  FONT_FAMILY_CONFIGS,
459
+ CANONICAL_TEXT_STYLE_TYPES,
460
+ type CanonicalTextStyleType,
418
461
  } from '@brand-page';
462
+ import {
463
+ CLEARED_TYPOGRAPHY,
464
+ TEXT_STYLE_CASCADE_PROPS,
465
+ textRoleClassName,
466
+ } from '@shared/text-role-typography.util';
419
467
  import {
420
468
  useBrandPageContainerStore,
421
469
  useUiStore,
@@ -423,6 +471,7 @@ import {
423
471
  import type { ButtonGroupOption } from '@brand-page-maker/models/button-group.model';
424
472
  import FieldSubHeader from '@shared/content-settings/components/field-sub-header/FieldSubHeader.vue';
425
473
  import PageDropdownField from '@shared/content-settings/components/page-dropdown-field/PageDropdownField.vue';
474
+ import TextStyleRoleDropdown from '@shared/content-settings/components/text-style-role-dropdown/TextStyleRoleDropdown.vue';
426
475
  import {
427
476
  textStyleFieldTr,
428
477
  contentSettingsTr,
@@ -497,6 +546,86 @@ const emit = defineEmits([
497
546
 
498
547
  const isSpacingDropdownOpen = ref(false);
499
548
 
549
+ // BP-5969: floating "this style has been modified" popup next to the role dropdown — offers
550
+ // "apply overrides to the role site-wide" and "reset to the role default". Only shown when
551
+ // the block overrides its role typography (hasTypographyOverride).
552
+ const isStyleModifiedPopupOpen = ref(false);
553
+ const styleModifiedAnchorRef = ref<HTMLElement>();
554
+ // The popup hangs under the toggle, centred on it. This inline value is that centring
555
+ // offset plus the clamp that keeps a 300px popup inside the toolbar when the toggle sits
556
+ // too near an edge. When the popup is wider than the toolbar (narrow mobile drawer) it
557
+ // can't be centred, so the left edge wins and it pins to the toolbar's left.
558
+ const styleModifiedPopupLeft = ref(0);
559
+
560
+ const STYLE_MODIFIED_POPUP_WIDTH = 300;
561
+
562
+ const toggleStyleModifiedPopup = () => {
563
+ isStyleModifiedPopupOpen.value = !isStyleModifiedPopupOpen.value;
564
+
565
+ if (!isStyleModifiedPopupOpen.value) return;
566
+
567
+ const anchor = styleModifiedAnchorRef.value;
568
+ const styleEditor = anchor?.closest('.style-editor');
569
+
570
+ if (!anchor || !styleEditor) return;
571
+
572
+ const EDGE = 4;
573
+ const a = anchor.getBoundingClientRect();
574
+ const bar = styleEditor.getBoundingClientRect();
575
+
576
+ // Centre the popup on the toggle, then clamp: never overflow the toolbar's right edge,
577
+ // never slip past its left edge (which also wins when the popup can't fit centred).
578
+ const centredLeft = a.width / 2 - STYLE_MODIFIED_POPUP_WIDTH / 2;
579
+ const maxLeft = bar.right - EDGE - STYLE_MODIFIED_POPUP_WIDTH - a.left;
580
+ const minLeft = bar.left + EDGE - a.left;
581
+ styleModifiedPopupLeft.value = Math.round(
582
+ Math.max(Math.min(centredLeft, maxLeft), minLeft),
583
+ );
584
+ };
585
+
586
+ const selectedRoleLabel = computed(
587
+ () => textStyleTypeOptions.find((option) => option.isSelected)?.label ?? '',
588
+ );
589
+
590
+ // Migration puts every field on one of the ten roles (`legacy-migrations.md`), so one option
591
+ // is always selected.
592
+ const selectedRoleType = computed(
593
+ () =>
594
+ textStyleTypeOptions.find((option) => option.isSelected)
595
+ ?.value as CanonicalTextStyleType,
596
+ );
597
+
598
+ const applyStyleToRole = () => {
599
+ applyTypographyToRole();
600
+ isStyleModifiedPopupOpen.value = false;
601
+ };
602
+
603
+ const writeBlockStyle = (value: Partial<TextStyleDeclaration>) => {
604
+ if (props.name === 'textItems') {
605
+ contentSettingStore.updateTextItemTextStyleTypeWithStyles({
606
+ id: props.rawId,
607
+ name: props.name,
608
+ value,
609
+ index: props.textItemIndex,
610
+ });
611
+ } else {
612
+ contentSettingStore.updateTextStyles({
613
+ id: props.rawId,
614
+ name: props.name,
615
+ value,
616
+ });
617
+ }
618
+ };
619
+
620
+ const resetStyleToRole = () => {
621
+ if (TEXT_STYLE_CASCADE_PROPS.some((prop) => props.styles?.[prop] != null)) {
622
+ writeBlockStyle({ ...CLEARED_TYPOGRAPHY });
623
+ }
624
+
625
+ resetTypographyToRole();
626
+ isStyleModifiedPopupOpen.value = false;
627
+ };
628
+
500
629
  const containerStore = useBrandPageContainerStore();
501
630
  const uiStore = useUiStore();
502
631
 
@@ -505,29 +634,31 @@ const logoTheme = computed(() => uiStore.logoTheme);
505
634
 
506
635
  const updateRichTextEditor = ref(false);
507
636
 
508
- const textStyleTypeOptions = reactive([
509
- {
510
- value: undefined,
511
- label: TEXT_STYLE_TYPES_DISPLAY_NAME_MAP().none,
512
- isSelected: false,
513
- },
514
- ...Object.keys(TEXT_STYLE_TYPES).map((key) => ({
637
+ // BP-5969 (ADR-0019): every block is always linked to a canonical role — no "none".
638
+ const textStyleTypeOptions = reactive(
639
+ CANONICAL_TEXT_STYLE_TYPES.map((key) => ({
515
640
  value: key,
516
641
  label:
517
642
  TEXT_STYLE_TYPES_DISPLAY_NAME_MAP()[key][0].toUpperCase() +
518
643
  TEXT_STYLE_TYPES_DISPLAY_NAME_MAP()[key].slice(1),
519
644
  isSelected: props.styles.textStyleType === key,
520
645
  })),
521
- ]) as ButtonGroupOption[];
646
+ ) as ButtonGroupOption[];
522
647
 
523
648
  const selectedGlobalTextStyles = computed({
524
649
  get: () =>
525
- styleSettingsStore.textStyles.textStyleOptions[
526
- textStyleTypeOptions.find((item) => item.isSelected)?.value ?? 'none'
527
- ],
650
+ styleSettingsStore.textStyles.textStyleOptions[selectedRoleType.value],
528
651
  set: (type: string) => styleSettingsStore.textStyles.textStyleOptions[type],
529
652
  });
530
653
 
654
+ // BP-5969: the role class on the editor host so unbaked content (A3b stops baking role
655
+ // typography into marks) still shows the role's typography while editing. The rule comes
656
+ // from the maker preview's global role <style> (`buildTextRoleRootCss`); here we only add
657
+ // the class.
658
+ const editorRoleClass = computed(() =>
659
+ textRoleClassName(selectedRoleType.value),
660
+ );
661
+
531
662
  const fontSettings = reactive({
532
663
  selectedTextStyle: '',
533
664
  selectedFont: 'Lato',
@@ -542,6 +673,11 @@ const fontSettings = reactive({
542
673
  selectedGlobalTextStyles.value?.style?.color,
543
674
  ),
544
675
  selectedBackgroundColor: 'transparent',
676
+ // BP-5969: toolbar active-state for weight/style/decoration, kept in sync by selectionUpdate.
677
+ isBold: false,
678
+ isItalic: false,
679
+ isUnderline: false,
680
+ isStrike: false,
545
681
  });
546
682
 
547
683
  const isHyperlinkPopupOpen = ref(false);
@@ -624,48 +760,6 @@ watch(
624
760
  },
625
761
  );
626
762
 
627
- watch(
628
- () => props.styles.textStyleType,
629
- (newType) => {
630
- if (newType) {
631
- unsetAllMarks();
632
- const globalStyle =
633
- styleSettingsStore.textStyles.textStyleOptions[newType ?? 'titles']
634
- .style;
635
- copyGlobalStyleSettings(globalStyle);
636
-
637
- // Adopt the newly-linked global style's colour onto this element.
638
- if (isAdminMaker.value) {
639
- const value = {
640
- color: globalStyle.color ?? '',
641
- backgroundColor: undefined,
642
- };
643
-
644
- if (props.name === 'textItems') {
645
- contentSettingStore.updateTextItemTextStyleTypeWithStyles({
646
- id: props.rawId,
647
- name: props.name,
648
- value,
649
- index: props.textItemIndex,
650
- });
651
- } else {
652
- contentSettingStore.updateTextStyles({
653
- id: props.rawId,
654
- name: props.name,
655
- value,
656
- });
657
- }
658
- }
659
- } else {
660
- // make sure text style options are updated and selected Global style is set to none
661
- if (selectedGlobalTextStyles.value) {
662
- onSelectTextStyleType({
663
- label: TEXT_STYLE_TYPES_DISPLAY_NAME_MAP().none,
664
- } as ButtonGroupOption);
665
- }
666
- }
667
- },
668
- );
669
763
  // Watch pages button should be disabled if no other pages and switch to URL if page type is selected but no pages available
670
764
  watch(
671
765
  () => pageNavigationStore.routes.length,
@@ -684,60 +778,15 @@ const onSelectTextStyleType = (option: ButtonGroupOption) => {
684
778
  const optionSelected = item.value === option.value;
685
779
  if (optionSelected) {
686
780
  selectedGlobalTextStyles.value = item.value;
687
- if (option.value === undefined) {
688
- if (props.name === 'textItems') {
689
- contentSettingStore.updateTextItemTextStyleTypeWithStyles({
690
- id: props.rawId,
691
- name: props.name,
692
- value: {
693
- textStyleType: undefined,
694
- fontSize: fontSettings.selectedFontSize,
695
- },
696
- index: props.textItemIndex,
697
- });
698
- } else {
699
- contentSettingStore.updateTextStyles({
700
- id: props.rawId,
701
- name: props.name,
702
- value: {
703
- textStyleType: undefined,
704
- fontSize: fontSettings.selectedFontSize,
705
- },
706
- });
707
- }
708
- } else {
709
- const selectedStyle: BrandPageCssStyle =
710
- styleSettingsStore.textStyles.textStyleOptions[
711
- option.value ?? 'titles'
712
- ].style;
713
-
714
- // Linking drops the element's own colour/background override so it
715
- // inherits the style's colour — the renderer resolves colour
716
- // element-first, so a colour parked before the link would otherwise keep
717
- // winning. Admins re-adopt the token-resolved colour in the
718
- // textStyleType watcher above.
719
- const value = {
720
- textStyleType: option.value,
721
- fontSize: selectedStyle.fontSize,
722
- color: undefined,
723
- backgroundColor: undefined,
724
- };
725
-
726
- if (props.name === 'textItems') {
727
- contentSettingStore.updateTextItemTextStyleTypeWithStyles({
728
- id: props.rawId,
729
- name: props.name,
730
- value,
731
- index: props.textItemIndex,
732
- });
733
- } else {
734
- contentSettingStore.updateTextStyles({
735
- id: props.rawId,
736
- name: props.name,
737
- value,
738
- });
739
- }
740
- }
781
+
782
+ // Linking a role is a typography-only action (ADR-0020): it writes the new
783
+ // `textStyleType` and drops the block's own typography, so the block takes the role's
784
+ // look. Colour and background stay — a role carries no colour. The runs relink in
785
+ // the composable's `textStyleType` watch.
786
+ writeBlockStyle({
787
+ textStyleType: option.value as TextStyleDeclaration['textStyleType'],
788
+ ...CLEARED_TYPOGRAPHY,
789
+ });
741
790
  item.isSelected = true;
742
791
  } else {
743
792
  item.isSelected = false;
@@ -787,6 +836,12 @@ const clickOutsideHyperlink = (event: Event) => {
787
836
  }
788
837
  };
789
838
 
839
+ const clickOutsideStyleModified = (event: Event) => {
840
+ if (isOutside(event, '.style-modified-popup')) {
841
+ isStyleModifiedPopupOpen.value = false;
842
+ }
843
+ };
844
+
790
845
  // Handle link type selection
791
846
  const onSelectLinkType = (option: ButtonGroupOption) => {
792
847
  const isPageOption = option.value === HYPERLINK_TYPE.page;
@@ -820,8 +875,10 @@ const {
820
875
  letterSpacingValue,
821
876
  lineHeightValue,
822
877
  setInitialStyleSettings,
823
- copyGlobalStyleSettings,
824
- unsetAllMarks,
878
+ hasTypographyOverride,
879
+ canApplyTypographyToRole,
880
+ resetTypographyToRole,
881
+ applyTypographyToRole,
825
882
  handleHyperlink,
826
883
  hyperlinkValue,
827
884
  setHyperlinkUrlValue,
@@ -942,13 +999,32 @@ const getSlugFromPageIdHref = (href: string): string => {
942
999
  @apply tw-border-grayscale-600;
943
1000
  }
944
1001
  .style-editor {
945
- @apply tw-flex tw-flex-row tw-flex-wrap;
1002
+ /* Spacing lives here: equal padding + gap. Items carry no margin/padding of their own. */
1003
+ @apply tw-flex tw-flex-row tw-flex-wrap tw-gap-1 tw-p-1;
946
1004
  }
947
1005
  .style-editor ::v-deep button:not(.c-button-style) {
948
1006
  @apply tw-flex tw-px-2 tw-justify-center;
949
1007
  }
950
1008
  .style-editor-button {
951
- @apply tw-pl-1 tw-pt-1 tw-cursor-pointer;
1009
+ @apply tw-cursor-pointer;
1010
+ }
1011
+ /* Role + font selectors evenly split the toolbar's first row at every width; the
1012
+ conditional reset tool (roller-brush) sits between them and takes only its own width
1013
+ while shown (it collapses otherwise, so the selectors fill the row).
1014
+ min-width:0 lets them shrink below their content so they never wrap to a second line —
1015
+ the dropdown title truncates instead. */
1016
+ .style-editor-button-textstyle,
1017
+ .style-editor-button-font {
1018
+ flex: 1 1 0;
1019
+ min-width: 0;
1020
+ }
1021
+ /* The size stepper leads the formatting row (with the icons), so it sits at a fixed width
1022
+ instead of growing. */
1023
+ .style-editor-button.stepper {
1024
+ flex: 0 0 auto;
1025
+ /* Two 30px −/+ buttons plus the 28px 3-digit input. A narrower box can't shrink the
1026
+ stepper — its + button paints over the colour picker instead. */
1027
+ width: 88px;
952
1028
  }
953
1029
  .toolbar-editor-button.active {
954
1030
  @apply tw-font-bold;
@@ -958,7 +1034,7 @@ const getSlugFromPageIdHref = (href: string): string => {
958
1034
  height: 32px;
959
1035
  width: 32px;
960
1036
  border-radius: 4px;
961
- @apply tw-flex tw-justify-center tw-items-center tw-my-1 tw-ml-1 tw-cursor-pointer;
1037
+ @apply tw-flex tw-justify-center tw-items-center tw-cursor-pointer;
962
1038
  }
963
1039
  ::v-deep .ProseMirror {
964
1040
  border-top: 1px solid #ccc;
@@ -990,17 +1066,16 @@ const getSlugFromPageIdHref = (href: string): string => {
990
1066
  font-family: 'Lato' !important;
991
1067
  }
992
1068
 
993
- ::v-deep .ProseMirror a s,
994
- ::v-deep .ProseMirror a strike,
995
- ::v-deep .ProseMirror a [data-strike] {
996
- text-decoration: line-through !important;
1069
+ /* A link shows only the decoration it stores (its `<u>`), as on the published page, whose base
1070
+ styles give `a` `text-decoration: inherit`; the browser default would underline every link. */
1071
+ ::v-deep .ProseMirror a {
1072
+ text-decoration: inherit !important;
997
1073
  }
998
1074
 
999
1075
  ::v-deep .ProseMirror a,
1000
1076
  ::v-deep .ProseMirror a * {
1001
1077
  /* Keep in sync with DEFAULT_LINK_COLOR (src/constants/rich-text-editor.constants.ts) — scoped CSS can't import it. */
1002
1078
  color: #0097d7 !important;
1003
- text-decoration: underline !important;
1004
1079
  }
1005
1080
 
1006
1081
  .error-message {
@@ -1014,6 +1089,28 @@ const getSlugFromPageIdHref = (href: string): string => {
1014
1089
  right: 8%;
1015
1090
  }
1016
1091
 
1092
+ /* The toggle's own positioning context, so the popup below it doesn't turn `.style-editor`
1093
+ into a containing block (which would squash the colour-picker popup). */
1094
+ .style-modified-anchor {
1095
+ @apply tw-inline-flex;
1096
+ position: relative;
1097
+ }
1098
+ .style-modified-toggle {
1099
+ @apply tw-border tw-border-solid tw-border-grayscale-400 tw-bg-white;
1100
+ }
1101
+ .style-modified-anchor--hidden {
1102
+ display: none;
1103
+ }
1104
+ /* Hangs just below the toggle (its row), floating over the rows beneath rather than sitting
1105
+ at the toolbar's bottom. Centred on the toggle by default; the inline `left` also clamps
1106
+ it inside the toolbar when the toggle sits too near an edge (keep width in sync with
1107
+ STYLE_MODIFIED_POPUP_WIDTH). */
1108
+ .style-modified-popup {
1109
+ @apply tw-absolute tw-z-20;
1110
+ top: calc(100% + 6px);
1111
+ width: 300px;
1112
+ }
1113
+
1017
1114
  .hyperlink-preview {
1018
1115
  @apply tw-absolute;
1019
1116
  z-index: 10;
@@ -1050,54 +1147,10 @@ const getSlugFromPageIdHref = (href: string): string => {
1050
1147
  }
1051
1148
 
1052
1149
  @media (max-width: 399px) {
1053
- .style-editor-button-font,
1054
- .style-editor-button-textstyle {
1055
- max-width: 48%;
1056
- @apply tw-pb-1;
1057
- }
1058
- .style-editor-button.stepper {
1059
- max-width: 40%;
1060
- }
1061
- .style-editor-button-stepper {
1062
- max-width: 100%;
1063
- }
1064
- .border.desktop {
1065
- display: none;
1066
- }
1067
- .border.mobile {
1068
- display: block;
1069
- }
1070
- ::v-deep .left-align {
1071
- transform: translateX(-48%);
1072
- }
1073
1150
  .hyperlink-popup {
1074
1151
  z-index: 10000 !important;
1075
1152
  }
1076
1153
  }
1077
-
1078
- @media (min-width: 400px) {
1079
- .style-editor-button.stepper {
1080
- max-width: 32%;
1081
- }
1082
- .style-editor-button-font {
1083
- max-width: 28%;
1084
- }
1085
- .style-editor-button-stepper {
1086
- max-width: 100%;
1087
- }
1088
- .style-editor-button-textstyle {
1089
- max-width: 25%;
1090
- }
1091
- .border.desktop {
1092
- display: block;
1093
- }
1094
- .border.mobile {
1095
- display: none;
1096
- }
1097
- ::v-deep .left-align {
1098
- transform: translateX(-25%);
1099
- }
1100
- }
1101
1154
  .drop-down-item:hover {
1102
1155
  background-color: #eee;
1103
1156
  }