@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
@@ -28,6 +28,8 @@ export interface InitialisePayload {
28
28
  logoVariationImageUrls: string[];
29
29
  shopConfigData: string | ShopConfigData;
30
30
  isServerRenderOverride?: boolean;
31
+ /** The maker had no saved data and built the site with `createInitialBrandPage`. */
32
+ isBlankSite?: boolean;
31
33
  }
32
34
  export interface SetIsSavingPayload {
33
35
  isSaving: boolean;
@@ -139,6 +141,9 @@ export declare const useBrandPageMakerStore: import("pinia").StoreDefinition<"br
139
141
  setHideBranding(payload: {
140
142
  hideBranding: boolean;
141
143
  }): void;
144
+ setSaveContactButtonTextStyle(payload: {
145
+ buttonTextStyle: SaveContactOptions["buttonTextStyle"];
146
+ }): void;
142
147
  setSensitiveContent(payload: {
143
148
  sensitiveContent: string;
144
149
  }): void;
@@ -241,7 +246,7 @@ export declare const useBrandPageMakerStore: import("pinia").StoreDefinition<"br
241
246
  brandPageType: BrandPageType;
242
247
  }): void;
243
248
  initialiseStoresByBrandPageModelAsync(brandPageModel: BrandPageModel): Promise<void>;
244
- initialise({ brandPage, brandPageType, logoDraftDesignAttributes, unsplashApplicationName, templateCategories, personalisationData, isPersonalisationEnabled, userPromptContentKey, showAiTemplatesTab, businessName, industry, layout, logoVariationImageUrls, shopConfigData: _shopConfigData, isServerRenderOverride, }: InitialisePayload): Promise<void>;
249
+ initialise({ brandPage, brandPageType, logoDraftDesignAttributes, unsplashApplicationName, templateCategories, personalisationData, isPersonalisationEnabled, userPromptContentKey, showAiTemplatesTab, businessName, industry, layout, logoVariationImageUrls, shopConfigData: _shopConfigData, isServerRenderOverride, isBlankSite, }: InitialisePayload): Promise<void>;
245
250
  initialisePages({ pages, sections, }: {
246
251
  pages: PageModel[];
247
252
  sections: PageSettingsStateSections;
@@ -1,4 +1,4 @@
1
- import { EMPTY_LOGO_IMAGE_MODEL, SENSITIVE_CONTENT_TYPES, TEXT_STYLE_TYPES, VIEWPORTS, } from '@brand-page';
1
+ import { EMPTY_LOGO_IMAGE_MODEL, SENSITIVE_CONTENT_TYPES, VIEWPORTS, } from '@brand-page';
2
2
  import { BackgroundStyles, BRAND_PAGE_TYPES, BrandPageModel, CONTENT_TYPES, NavigationDesktop, NavigationMobile, } from '@brand-page';
3
3
  import { useBrandPageMakerUserStore } from '../user';
4
4
  import { useAiWebsiteBuilderThreadStore } from '../ai-thread/ai-website-builder-thread-store';
@@ -22,10 +22,10 @@ import { useUiContentSettingsStore } from '@shared/content-settings/store';
22
22
  import { setContentSettingsAddContentOptions } from './brandpage-maker-store-utils';
23
23
  import { useAdminLogoSettingsStore } from '../admin-logo-settings';
24
24
  import { useUiPageSettingsStore } from '@shared/page-settings/store';
25
- import { mapBrandPageContentToContentSettingsItem, removeContentFieldValues, removeLogoTemplateModel, transformToRTE, } from '@brand-page-maker/utils';
26
- import { useExternalRichTextEditor } from '@brand-page-maker/composables/rich-text-editor/useRichTextEditor';
25
+ import { mapBrandPageContentToContentSettingsItem, removeContentFieldValues, removeLogoTemplateModel, } from '@brand-page-maker/utils';
27
26
  import { UI_DEVICE_MODES, UI_SCREENSIZE_MODES, } from '@shared/models';
28
27
  import { PAGE_SECTIONS } from '@shared/page-settings/models';
28
+ import { applyBlankSiteTextRoles } from '@brand-page-maker/models/content-settings';
29
29
  import { toPageModels } from '@shared/page-settings/utils';
30
30
  import { useUiTemplateSettingsStore } from '@shared/template-settings/store';
31
31
  import { useBrandPageContainerStore } from '../brandpage-container';
@@ -119,6 +119,11 @@ export const useBrandPageMakerStore = defineStore('brandPageMaker', {
119
119
  setHideBranding(payload) {
120
120
  this.saveContactSettings.hideBranding = payload.hideBranding;
121
121
  },
122
+ // No maker control writes it, so a load is its only way in. Set even when absent, so the
123
+ // previous site's value is never saved into this one.
124
+ setSaveContactButtonTextStyle(payload) {
125
+ this.saveContactSettings.buttonTextStyle = payload.buttonTextStyle;
126
+ },
122
127
  setSensitiveContent(payload) {
123
128
  this.sensitiveContent = payload.sensitiveContent;
124
129
  },
@@ -882,6 +887,9 @@ export const useBrandPageMakerStore = defineStore('brandPageMaker', {
882
887
  // dangling `var(--…)` refs. No `ensurePaletteRoles` — an applied model is
883
888
  // already migrated; role top-up belongs on the initial load path only.
884
889
  useUiColorPaletteStore().setColors(brandPageModel.styles?.colors ?? []);
890
+ this.setSaveContactButtonTextStyle({
891
+ buttonTextStyle: brandPageModel.saveContactSettings?.buttonTextStyle,
892
+ });
885
893
  // Apply button style config CSS (border-radius, box-shadow) to match
886
894
  // the selectedButtonStyleId. setState sets the raw model values but
887
895
  // doesn't derive the config-specific CSS that setSelectedButtonStyle does.
@@ -890,13 +898,8 @@ export const useBrandPageMakerStore = defineStore('brandPageMaker', {
890
898
  id: buttonStyles.selectedButtonStyleId,
891
899
  });
892
900
  }
893
- const { externalEditor } = useExternalRichTextEditor();
894
- transformToRTE(pageSettingsStore, externalEditor, undefined, undefined, TEXT_STYLE_TYPES.titles, textStyles.textStyleOptions.titles.style);
895
- transformToRTE(pageSettingsStore, externalEditor, undefined, undefined, TEXT_STYLE_TYPES.headings, textStyles.textStyleOptions.headings.style);
896
- transformToRTE(pageSettingsStore, externalEditor, undefined, undefined, TEXT_STYLE_TYPES.paragraphs, textStyles.textStyleOptions.paragraphs.style);
897
- externalEditor.destroy();
898
901
  },
899
- async initialise({ brandPage, brandPageType, logoDraftDesignAttributes, unsplashApplicationName, templateCategories, personalisationData, isPersonalisationEnabled, userPromptContentKey, showAiTemplatesTab = false, businessName, industry, layout, logoVariationImageUrls, shopConfigData: _shopConfigData, isServerRenderOverride = false, }) {
902
+ async initialise({ brandPage, brandPageType, logoDraftDesignAttributes, unsplashApplicationName, templateCategories, personalisationData, isPersonalisationEnabled, userPromptContentKey, showAiTemplatesTab = false, businessName, industry, layout, logoVariationImageUrls, shopConfigData: _shopConfigData, isServerRenderOverride = false, isBlankSite = false, }) {
900
903
  const brandPageContainerStore = useBrandPageContainerStore();
901
904
  const userStore = useBrandPageMakerUserStore();
902
905
  const uiStore = useUiStore();
@@ -932,6 +935,8 @@ export const useBrandPageMakerStore = defineStore('brandPageMaker', {
932
935
  isUserDraft: this.isUserDraft,
933
936
  isServerRender: isServerRenderOverride,
934
937
  });
938
+ if (isBlankSite)
939
+ applyBlankSiteTextRoles(brandPageModel);
935
940
  const userPersonalisation = personalisationData && personalisationData.length > 0
936
941
  ? personalisationData[await getAiContentIndexByTemplateTokenAndNumberOfVariations(this.selectedTemplateId, personalisationData.length)].userPersonalisation
937
942
  : undefined;
@@ -1141,6 +1146,9 @@ export const useBrandPageMakerStore = defineStore('brandPageMaker', {
1141
1146
  this.setHideBranding({
1142
1147
  hideBranding: brandPageModel.saveContactSettings?.hideBranding ?? false,
1143
1148
  });
1149
+ this.setSaveContactButtonTextStyle({
1150
+ buttonTextStyle: brandPageModel.saveContactSettings?.buttonTextStyle,
1151
+ });
1144
1152
  this.businessName = businessName;
1145
1153
  this.industry = industry;
1146
1154
  }
@@ -29,6 +29,15 @@ export declare const useHistoryStore: import("pinia").StoreDefinition<"history",
29
29
  isApplyingSnapshot: import("vue").Ref<boolean, boolean>;
30
30
  snapshotAppliedToken: import("vue").Ref<number, number>;
31
31
  rteResyncToken: import("vue").Ref<number, number>;
32
+ rteResyncExcept: import("vue").Ref<{
33
+ id: string;
34
+ name: string;
35
+ from: number;
36
+ } | undefined, {
37
+ id: string;
38
+ name: string;
39
+ from: number;
40
+ } | undefined>;
32
41
  baselineCaptured: import("vue").Ref<boolean, boolean>;
33
42
  canUndo: import("vue").ComputedRef<boolean>;
34
43
  canRedo: import("vue").ComputedRef<boolean>;
@@ -41,18 +50,36 @@ export declare const useHistoryStore: import("pinia").StoreDefinition<"history",
41
50
  captureTemplateSwitch: (label?: string) => "committed" | "oversized" | "noop" | "skipped";
42
51
  captureAiChangeset: (label?: string) => "committed" | "oversized" | "noop" | "skipped";
43
52
  mergeNextMutation: () => void;
44
- markRteResync: () => void;
53
+ markRteResync: (options?: {
54
+ except?: {
55
+ id: string;
56
+ name: string;
57
+ };
58
+ }) => void;
59
+ isRteResyncExcepted: (field: {
60
+ id: string;
61
+ name: string;
62
+ }, sinceToken: number) => boolean;
45
63
  undo: () => Promise<void>;
46
64
  redo: () => Promise<void>;
47
65
  reset: () => void;
48
66
  getCurrentSizeBytes: () => number;
49
67
  getCurrentEntryCount: () => number;
50
- }, "entries" | "currentIndex" | "isApplyingSnapshot" | "snapshotAppliedToken" | "rteResyncToken" | "baselineCaptured">, Pick<{
68
+ }, "entries" | "currentIndex" | "isApplyingSnapshot" | "snapshotAppliedToken" | "rteResyncToken" | "rteResyncExcept" | "baselineCaptured">, Pick<{
51
69
  entries: import("vue").ShallowRef<HistoryEntry[], HistoryEntry[]>;
52
70
  currentIndex: import("vue").Ref<number, number>;
53
71
  isApplyingSnapshot: import("vue").Ref<boolean, boolean>;
54
72
  snapshotAppliedToken: import("vue").Ref<number, number>;
55
73
  rteResyncToken: import("vue").Ref<number, number>;
74
+ rteResyncExcept: import("vue").Ref<{
75
+ id: string;
76
+ name: string;
77
+ from: number;
78
+ } | undefined, {
79
+ id: string;
80
+ name: string;
81
+ from: number;
82
+ } | undefined>;
56
83
  baselineCaptured: import("vue").Ref<boolean, boolean>;
57
84
  canUndo: import("vue").ComputedRef<boolean>;
58
85
  canRedo: import("vue").ComputedRef<boolean>;
@@ -65,7 +92,16 @@ export declare const useHistoryStore: import("pinia").StoreDefinition<"history",
65
92
  captureTemplateSwitch: (label?: string) => "committed" | "oversized" | "noop" | "skipped";
66
93
  captureAiChangeset: (label?: string) => "committed" | "oversized" | "noop" | "skipped";
67
94
  mergeNextMutation: () => void;
68
- markRteResync: () => void;
95
+ markRteResync: (options?: {
96
+ except?: {
97
+ id: string;
98
+ name: string;
99
+ };
100
+ }) => void;
101
+ isRteResyncExcepted: (field: {
102
+ id: string;
103
+ name: string;
104
+ }, sinceToken: number) => boolean;
69
105
  undo: () => Promise<void>;
70
106
  redo: () => Promise<void>;
71
107
  reset: () => void;
@@ -77,6 +113,15 @@ export declare const useHistoryStore: import("pinia").StoreDefinition<"history",
77
113
  isApplyingSnapshot: import("vue").Ref<boolean, boolean>;
78
114
  snapshotAppliedToken: import("vue").Ref<number, number>;
79
115
  rteResyncToken: import("vue").Ref<number, number>;
116
+ rteResyncExcept: import("vue").Ref<{
117
+ id: string;
118
+ name: string;
119
+ from: number;
120
+ } | undefined, {
121
+ id: string;
122
+ name: string;
123
+ from: number;
124
+ } | undefined>;
80
125
  baselineCaptured: import("vue").Ref<boolean, boolean>;
81
126
  canUndo: import("vue").ComputedRef<boolean>;
82
127
  canRedo: import("vue").ComputedRef<boolean>;
@@ -89,10 +134,19 @@ export declare const useHistoryStore: import("pinia").StoreDefinition<"history",
89
134
  captureTemplateSwitch: (label?: string) => "committed" | "oversized" | "noop" | "skipped";
90
135
  captureAiChangeset: (label?: string) => "committed" | "oversized" | "noop" | "skipped";
91
136
  mergeNextMutation: () => void;
92
- markRteResync: () => void;
137
+ markRteResync: (options?: {
138
+ except?: {
139
+ id: string;
140
+ name: string;
141
+ };
142
+ }) => void;
143
+ isRteResyncExcepted: (field: {
144
+ id: string;
145
+ name: string;
146
+ }, sinceToken: number) => boolean;
93
147
  undo: () => Promise<void>;
94
148
  redo: () => Promise<void>;
95
149
  reset: () => void;
96
150
  getCurrentSizeBytes: () => number;
97
151
  getCurrentEntryCount: () => number;
98
- }, "reset" | "captureBaseline" | "capture" | "captureTemplateSwitch" | "captureAiChangeset" | "mergeNextMutation" | "markRteResync" | "undo" | "redo" | "getCurrentSizeBytes" | "getCurrentEntryCount">>;
152
+ }, "reset" | "undo" | "redo" | "captureBaseline" | "capture" | "captureTemplateSwitch" | "captureAiChangeset" | "mergeNextMutation" | "markRteResync" | "isRteResyncExcepted" | "getCurrentSizeBytes" | "getCurrentEntryCount">>;
@@ -45,6 +45,9 @@ export const useHistoryStore = defineStore('history', () => {
45
45
  // (ephemeral, never part of a snapshot) so undo/redo can't restore a stale
46
46
  // value and trigger a spurious re-seed.
47
47
  const rteResyncToken = ref(0);
48
+ // The field (content id + field name) a resync leaves mounted: its own editor wrote the doc.
49
+ // `from` is the first token of the unbroken run of resyncs that each excepted it.
50
+ const rteResyncExcept = ref();
48
51
  const baselineCaptured = ref(false);
49
52
  const watcherInstalled = ref(false);
50
53
  let baselineCapturedAt = 0;
@@ -503,8 +506,23 @@ export const useHistoryStore = defineStore('history', () => {
503
506
  }
504
507
  // Signal mounted RTE editors to re-seed from the store after an external
505
508
  // (non-history) replacement of their content — see rteResyncToken.
506
- function markRteResync() {
507
- rteResyncToken.value += 1;
509
+ function markRteResync(options) {
510
+ const except = options?.except;
511
+ const current = rteResyncExcept.value;
512
+ const token = rteResyncToken.value + 1;
513
+ const continues = !!except && current?.id === except.id && current.name === except.name;
514
+ rteResyncExcept.value = except
515
+ ? { ...except, from: continues ? current.from : token }
516
+ : undefined;
517
+ rteResyncToken.value = token;
518
+ }
519
+ // Watchers batch, so one reaction can cover several resyncs: a field stays mounted only if every
520
+ // resync after `sinceToken` excepted it.
521
+ function isRteResyncExcepted(field, sinceToken) {
522
+ const except = rteResyncExcept.value;
523
+ return (except?.id === field.id &&
524
+ except.name === field.name &&
525
+ except.from <= sinceToken + 1);
508
526
  }
509
527
  return {
510
528
  // State
@@ -513,6 +531,7 @@ export const useHistoryStore = defineStore('history', () => {
513
531
  isApplyingSnapshot,
514
532
  snapshotAppliedToken,
515
533
  rteResyncToken,
534
+ rteResyncExcept,
516
535
  baselineCaptured,
517
536
  // Getters
518
537
  canUndo,
@@ -524,6 +543,7 @@ export const useHistoryStore = defineStore('history', () => {
524
543
  captureAiChangeset,
525
544
  mergeNextMutation,
526
545
  markRteResync,
546
+ isRteResyncExcepted,
527
547
  undo,
528
548
  redo,
529
549
  reset,
@@ -1,8 +1,9 @@
1
1
  import { BRAND_PAGE_TYPES } from '@brand-page';
2
- import { FIELD_SLOT_MAP, raisedLayerFor, strategyRoleRefForField, } from '@shared/color-strategies/color-strategies';
2
+ import { FIELD_SLOT_MAP, raisedLayerFor, STYLE_FIELDS_OUTSIDE_CONFIG, strategyRoleRefForField, } from '@shared/color-strategies/color-strategies';
3
3
  import { isTransparentDisabled, } from '@shared/content-settings/disable-transparent.util';
4
4
  import { setRteTextColor } from '@shared/color-strategies/rte-color';
5
5
  import { pairedRteTextField } from '@shared/color-strategies/rte-field-pairs';
6
+ import { isCanonicalTextStyleType } from '@brand-page/models/styles.model';
6
7
  /**
7
8
  * Field types a strategy can assign. `color` fields hold nothing but a colour and are
8
9
  * REPLACED via their `valueConvertor`; `text-style` fields hold typography *and* a
@@ -14,11 +15,27 @@ const ASSIGNABLE_FIELD_TYPES = new Set(['color', 'text-style']);
14
15
  * mapped to a slot, AND currently visible (the same `visibilityAssessor` the settings
15
16
  * panel uses). Shared by the picker's visibility gate and the applier, so the picker is
16
17
  * only shown when applying would actually change something.
18
+ *
19
+ * Plus any `STYLE_FIELDS_OUTSIDE_CONFIG` whose followed field made the list.
17
20
  */
18
- const assignableColorFields = (config, content, context) => Object.entries(config.fields).filter(([name, field]) => !!field?.type &&
19
- ASSIGNABLE_FIELD_TYPES.has(field.type) &&
20
- !!FIELD_SLOT_MAP[name] &&
21
- (!field.visibilityAssessor || field.visibilityAssessor(content, context)));
21
+ const assignableColorFields = (config, content, context) => {
22
+ const assignable = Object.entries(config.fields).filter(([name, field]) => !!field?.type &&
23
+ ASSIGNABLE_FIELD_TYPES.has(field.type) &&
24
+ !!FIELD_SLOT_MAP[name] &&
25
+ (!field.visibilityAssessor || field.visibilityAssessor(content, context)));
26
+ // One with no canonical role yet is skipped: a colour written alone would link no role.
27
+ const outsideConfig = Object.entries(STYLE_FIELDS_OUTSIDE_CONFIG[config.type] ?? {})
28
+ .filter(([name, { follows }]) => {
29
+ const style = content?.[name];
30
+ return (isCanonicalTextStyleType(style?.textStyleType) &&
31
+ assignable.some(([assigned]) => assigned === follows));
32
+ })
33
+ .map(([name, { textField }]) => [
34
+ name,
35
+ { type: 'text-style', textField },
36
+ ]);
37
+ return [...assignable, ...outsideConfig];
38
+ };
22
39
  /**
23
40
  * Whether a strategy would actually assign at least one colour on THIS section as
24
41
  * it stands (mapped + visible). Used to hide the picker where applying would be a
@@ -111,9 +128,10 @@ export const buildColorStrategyValues = (config, content, strategyId, context, a
111
128
  // `setRteTextColor` returns undefined for a plain string or legacy HTML RTE, so
112
129
  // that doubles as the "nothing to do" test — no separate type guard here.
113
130
  const sectionType = contentRecord.type;
114
- const textField = typeof sectionType === 'string'
115
- ? pairedRteTextField(sectionType, name)
116
- : undefined;
131
+ const textField = field.textField ??
132
+ (typeof sectionType === 'string'
133
+ ? pairedRteTextField(sectionType, name)
134
+ : undefined);
117
135
  if (textField) {
118
136
  const nextDoc = setRteTextColor(contentRecord[textField], ref);
119
137
  if (nextDoc) {
@@ -5,5 +5,6 @@ export * from './url.util';
5
5
  export * from './slug.util';
6
6
  export * from './text.util';
7
7
  export * from './rich-text-editor.util';
8
- export * from './rte-render.util';
8
+ export * from '@shared/rte-render.util';
9
9
  export * from './rte-sanitize.util';
10
+ export * from './rte-authoring.util';
@@ -5,5 +5,6 @@ export * from './url.util';
5
5
  export * from './slug.util';
6
6
  export * from './text.util';
7
7
  export * from './rich-text-editor.util';
8
- export * from './rte-render.util';
8
+ export * from '@shared/rte-render.util';
9
9
  export * from './rte-sanitize.util';
10
+ export * from './rte-authoring.util';
@@ -1,21 +1,114 @@
1
1
  import type { ChainedCommands, Editor, JSONContent } from '@tiptap/vue-3';
2
2
  import type { EditorState, Transaction, Selection } from 'prosemirror-state';
3
- import { type Content, type TextStyleDeclaration, type TextStyleType, type RichTextValue } from '@brand-page';
4
- import type { PageSettingsState } from '@shared/page-settings/store';
5
- import type { StyleSettingsState } from '@shared/style-settings/store';
6
- import type { Mark } from 'prosemirror-model';
3
+ import { type TextStyleDeclaration, type RichTextValue } from '@brand-page';
4
+ import type { Mark, Node as ProseMirrorNode } from 'prosemirror-model';
7
5
  import { type DOMPurify } from 'dompurify';
8
- import { isTiptapDocument, isRteHtmlString } from './rte-shape';
9
- export { isTiptapDocument, isRteHtmlString };
6
+ export { getRteJsonPlainText, isRteHtmlString, isTiptapDocument, } from '@shared/rte-shape.util';
7
+ /**
8
+ * BP-5969 (ADR-0019, Option B): a block linked to a CANONICAL role gets its typography
9
+ * from the page-scoped CSS class (`text-role-css.util`), so authoring must NOT bake
10
+ * family/size/spacing/line-height/weight/style/decoration into the marks — a value baked
11
+ * post-migration would pin the block forever (migration-22 never re-runs to strip it).
12
+ * Colour is exempt (it isn't in the class). Legacy/unlinked types have no class, so they
13
+ * still bake inline. Mirrors `TextWrapper`'s canonical-only `roleClass`.
14
+ */
15
+ export declare const isCanonicalLinked: (style: {
16
+ textStyleType?: string | undefined;
17
+ } | undefined) => boolean;
18
+ /** True when a mark value is a role reference (`var(--role-…)`) rather than a literal. */
19
+ export declare const isRoleVarRef: (value: unknown) => value is string;
20
+ /**
21
+ * Normalise a typography value for a role-equality compare: quote-strip + trim for fontFamily,
22
+ * trim otherwise, then fold a prop's default keyword (`normal`/`none`) to '' so it matches a role
23
+ * that leaves the prop unset (`'normal'`/`'none'`/absent are the same override-wise).
24
+ */
25
+ export declare const normTypographyValue: (key: string, value?: string) => string;
26
+ /**
27
+ * BP-5969 — the RTE mark value to write for a typography attr change: the role var (so the run
28
+ * stays linked and follows role edits) when the picked value equals the linked role, else the
29
+ * literal raw override. `roleStyle` undefined (legacy/unlinked block, no role class to resolve a
30
+ * var) → always the literal. The equality test runs at the mutation point, per ADR-0019.
31
+ */
32
+ export declare const roleVarOrLiteral: (markAttr: string, picked: string, roleStyle: TextStyleDeclaration | undefined) => string;
33
+ declare const BLOCK_TYPOGRAPHY_ATTRS: readonly ["fontFamily", "fontSize", "lineHeight", "letterSpacing", "fontWeight", "fontStyle", "textDecoration"];
34
+ type BlockTypographyAttr = (typeof BLOCK_TYPOGRAPHY_ATTRS)[number];
35
+ export declare const LEGACY_TYPOGRAPHY_MARKS: Partial<Record<BlockTypographyAttr, string[]>>;
36
+ /**
37
+ * A run's marks without the legacy semantic marks (`<strong>`/`<em>`/`<u>`/`<s>`) that compete with
38
+ * `attrs`. A link keeps its underline, as Reset does (`restoreLinkUnderlines`).
39
+ */
40
+ export declare const withoutTypographyMarks: <M extends {
41
+ type: string;
42
+ }>(marks: readonly M[], attrs: readonly BlockTypographyAttr[], isLink: boolean) => M[];
43
+ /**
44
+ * One text run's typography: its `textStyle` attrs, falling back to a legacy semantic mark
45
+ * (`<strong>`/`<em>`/`<u>`/`<s>`) for un-migrated / pasted runs (mirrors `formatting.ts` `effective`).
46
+ * An absent attr is undefined — the run inherits the role class.
47
+ */
48
+ export declare const runTypography: (node: ProseMirrorNode) => Record<BlockTypographyAttr, string | undefined>;
49
+ /**
50
+ * True when any run's typography differs from `role` — the role dropdown's asterisk. Unlike
51
+ * `readBlockTypography`, one bold word counts. Absent attrs and role refs follow the role.
52
+ */
53
+ export declare const hasRunTypographyOverride: (editor: Editor, role: Record<string, unknown>) => boolean;
54
+ /**
55
+ * "Apply changes to all", on the live editor: every run value now equal to `role` becomes its
56
+ * `var(--role-*)` ref (or is unset when the role leaves the attr undefined), and the legacy mark it
57
+ * came from is dropped. A value that still differs — a word-level override — stays. Colour and the
58
+ * selection are untouched. The editor twin of `relinkRoleEqualMarks`; the caller runs the chain.
59
+ */
60
+ export declare const relinkRoleEqualRunsChain: (editor: Editor, role: Record<string, unknown>, previousRole?: Record<string, unknown>) => ChainedCommands;
61
+ /**
62
+ * The block's whole-box typography — what "Apply changes to all" can promote into the role. A prop
63
+ * is included only when UNIFORM across every text run: one bold word has no single value to promote
64
+ * (`hasRunTypographyOverride` still flags it). A role-var ref rides through as the block value; the
65
+ * caller (`getTypographyOverride`) treats it as "linked", not an override.
66
+ */
67
+ export declare const readBlockTypography: (editor: Editor) => Record<string, string>;
68
+ /**
69
+ * BP-5969 — build the "reset to role" chain for the whole selection: re-link every typography attr
70
+ * the role DEFINES to its `var(--role-*)` token (self-describing, follows future role edits), unset
71
+ * the attrs the role leaves undefined, and clear the legacy semantic marks (bold/italic/underline/
72
+ * strike) that the attr resets don't touch. Returns the un-run chain so the caller can wrap it in
73
+ * `skipStyleDetection` (keeping the role link) before running. Colour marks are left alone.
74
+ */
75
+ export declare const relinkTypographyChain: (editor: Editor, role: Record<string, unknown> | undefined) => ChainedCommands;
76
+ /**
77
+ * A chain step that puts the underline back on link text that had one before the chain cleared
78
+ * every underline: a link's underline is its own look, not a typography choice (`typographyAttrsOf`).
79
+ * Captures the link ranges now, so build it before the chain changes the doc; mark steps keep
80
+ * positions, so the ranges still hold when it runs.
81
+ */
82
+ export declare const restoreLinkUnderlines: (editor: Editor) => ((props: {
83
+ tr: Transaction;
84
+ }) => boolean);
85
+ /**
86
+ * The document-level twin of `relinkTypographyChain`, for a block that isn't being edited: each run's
87
+ * typography literal that equals any of `roles` (a literal the asterisk never counted as an override)
88
+ * becomes the `var(--role-*)` ref when `roles[0]` — the role the block links now — defines the attr,
89
+ * else it's unset. Literals that differ from every role, role refs, colour and link marks are left
90
+ * alone. Returns the same doc when nothing changes.
91
+ */
92
+ export declare const relinkRoleEqualMarks: (doc: JSONContent, roles: readonly (Record<string, unknown> | undefined)[]) => JSONContent;
93
+ /**
94
+ * BP-5969 (R19) — the stored-document twin of `relinkTypographyChain`'s reset-to-role chain, for a
95
+ * doc that isn't mounted in an editor (the AI boundary's role switch). Unlike `relinkRoleEqualMarks`
96
+ * (which only relinks a literal that already equals a role), every run's typography is reset to
97
+ * `role` — a deliberate accent override included — mirroring the maker's Reset: a `var(--role-*)`
98
+ * ref where `role` defines the attr, else unset. The legacy semantic marks (bold/italic/underline/
99
+ * strike) that the attr resets don't touch are dropped too. Colour and link marks are left alone.
100
+ *
101
+ * `styleOverrides` is the call's own surviving style-object override — e.g. a switch call that
102
+ * also sends `fontFamily: 'Playfair Display'`. Those attrs are nulled, not ref'd: the render fill
103
+ * (`fillRteRunTypography`) treats a non-null mark value as final, so baking the ref here would bury
104
+ * the override under it; nulling leaves the render fill free to resolve the literal from the style
105
+ * object, same as any other block-level override.
106
+ */
107
+ export declare const relinkDocToRole: (doc: JSONContent, role: Record<string, unknown> | undefined, styleOverrides?: Record<string, unknown>) => JSONContent;
10
108
  export declare const RTE_ALLOWED_SECTION_TYPES: string[];
11
109
  export declare const isRTEManagedStyleField: (sectionType: string, fieldName: string) => boolean;
12
110
  export declare const isStyleChanged: (tr: Transaction) => boolean;
13
111
  export declare const skipStyleDetection: (chain: ChainedCommands, marks?: Mark[]) => ChainedCommands;
14
- /**
15
- * Extract visible plain text from a Tiptap JSON document (concatenated text
16
- * nodes). Dependency-free — no editor instantiation.
17
- */
18
- export declare const getRteJsonPlainText: (doc: JSONContent) => string;
19
112
  export declare const hasRTEContent: (content: unknown) => boolean;
20
113
  export declare const getPlainTextFromRTE: (content: unknown) => string;
21
114
  /**
@@ -36,10 +129,19 @@ export declare const getPlainTextFromRTE: (content: unknown) => string;
36
129
  */
37
130
  export declare const getRteTextLength: (value: RichTextValue | null | undefined) => number;
38
131
  export declare const replaceTextInRTE: (existingHtml: string, newText: string) => string;
39
- export declare const transformToRTE: (uiPageSettingStore: PageSettingsState, externalEditor: Editor, uiStyleSettingsStore?: StyleSettingsState, newContent?: Content, type?: TextStyleType, newStyle?: TextStyleDeclaration) => void;
40
- export declare const switchAllContentToRTE: (uiPageSettingStore: PageSettingsState, externalEditor: Editor, uiStyleSettingsStore?: StyleSettingsState) => void;
41
- export declare const getUpdatedHTMLFromEditor: (externalEditor: Editor, contentText: RichTextValue, newContentStyle: TextStyleDeclaration) => string | import("@tiptap/core").DocumentType<Record<string, any> | undefined, import("@tiptap/core").NodeType<string, Record<string, any> | undefined, any, (import("@tiptap/core").NodeType<any, any, any, any> | import("@tiptap/core").TextType<import("@tiptap/core").MarkType<any, any>>)[]>[]>;
42
- export declare const buildInitialMarks: (state: EditorState, style: TextStyleDeclaration) => any[];
132
+ /**
133
+ * Helper to build stored marks from a style declaration. BP-5969: when `bakeTypography`
134
+ * is false (a canonical-role block — the class supplies typography), only colour and
135
+ * highlight are baked; family/size/spacing/line-height/weight/style/decoration are left
136
+ * to the role class so freshly-typed text follows the role and repaints on a role edit.
137
+ */
138
+ export declare const buildInitialMarks: (state: EditorState, style: TextStyleDeclaration, bakeTypography?: boolean) => any[];
139
+ /**
140
+ * The first-type seed for an empty field, with what the customer picked before typing laid over it:
141
+ * a picked mark wins per attribute (its unset attrs keep the seed's), and a picked mark the seed
142
+ * lacks is added. With nothing picked, the seed as is.
143
+ */
144
+ export declare const mergePickedMarks: (seed: readonly Mark[], picked: readonly Mark[] | null | undefined) => Mark[];
43
145
  export declare const retainStyleOnEmptyLine: (editor: Editor, selection: Selection) => void;
44
146
  export interface SanitizationResult {
45
147
  sanitizedHtml: string;