@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
@@ -1,5 +1,5 @@
1
1
  import { isTiptapDocument, } from '../../parsers/section-tool-arguments';
2
- import { applyButtonLink, applyScalarFields, applyStyleFields, resolveGlobalPresetIntoStyle, } from '../section-field-utils';
2
+ import { applyButtonLink, applyScalarFields, applyStyleFields, applyAiStyle, } from '../section-field-utils';
3
3
  import { applyColorThemeToReplacements, resolveShapeColorReplacementsAsync, } from '../shape-color-utils';
4
4
  import { BaseSectionBuilder } from './base-section-builder';
5
5
  import { validateBannerSection } from '../section-rules/banner-section.rules';
@@ -44,7 +44,7 @@ export class BannerSectionBuilder extends BaseSectionBuilder {
44
44
  if (bannerArgs.title !== undefined) {
45
45
  if (isTiptapDocument(bannerArgs.title)) {
46
46
  resolved.content.title = bannerArgs.title;
47
- resolved.content.titleStyle = resolveGlobalPresetIntoStyle(resolved.content.titleStyle, textStyleOptions);
47
+ resolved.content.titleStyle = applyAiStyle(resolved.content.titleStyle, {}, textStyleOptions);
48
48
  }
49
49
  else {
50
50
  resolved.content.title = bannerArgs.title;
@@ -53,7 +53,7 @@ export class BannerSectionBuilder extends BaseSectionBuilder {
53
53
  if (bannerArgs.description !== undefined) {
54
54
  if (isTiptapDocument(bannerArgs.description)) {
55
55
  resolved.content.description = bannerArgs.description;
56
- resolved.content.descriptionStyle = resolveGlobalPresetIntoStyle(resolved.content.descriptionStyle, textStyleOptions);
56
+ resolved.content.descriptionStyle = applyAiStyle(resolved.content.descriptionStyle, {}, textStyleOptions);
57
57
  }
58
58
  else {
59
59
  resolved.content.description = bannerArgs.description;
@@ -1,5 +1,5 @@
1
1
  import { isTiptapDocument, } from '../../parsers/section-tool-arguments';
2
- import { applyButtonLink, applyScalarFields, applyStyleFields, resolveGlobalPresetIntoStyle, } from '../section-field-utils';
2
+ import { applyButtonLink, applyScalarFields, applyStyleFields, applyAiStyle, } from '../section-field-utils';
3
3
  import { BaseSectionBuilder } from './base-section-builder';
4
4
  import { validateBookingSection } from '../section-rules/booking-section.rules';
5
5
  export class BookingSectionBuilder extends BaseSectionBuilder {
@@ -23,7 +23,7 @@ export class BookingSectionBuilder extends BaseSectionBuilder {
23
23
  if (bookingArgs.title !== undefined) {
24
24
  if (isTiptapDocument(bookingArgs.title)) {
25
25
  resolved.content.title = bookingArgs.title;
26
- resolved.content.titleStyle = resolveGlobalPresetIntoStyle(resolved.content.titleStyle, textStyleOptions);
26
+ resolved.content.titleStyle = applyAiStyle(resolved.content.titleStyle, {}, textStyleOptions);
27
27
  }
28
28
  else {
29
29
  resolved.content.title = bookingArgs.title;
@@ -32,7 +32,7 @@ export class BookingSectionBuilder extends BaseSectionBuilder {
32
32
  if (bookingArgs.description !== undefined) {
33
33
  if (isTiptapDocument(bookingArgs.description)) {
34
34
  resolved.content.description = bookingArgs.description;
35
- resolved.content.descriptionStyle = resolveGlobalPresetIntoStyle(resolved.content.descriptionStyle, textStyleOptions);
35
+ resolved.content.descriptionStyle = applyAiStyle(resolved.content.descriptionStyle, {}, textStyleOptions);
36
36
  }
37
37
  else {
38
38
  resolved.content.description = bookingArgs.description;
@@ -1,5 +1,5 @@
1
1
  import { isTiptapDocument, } from '../../parsers/section-tool-arguments';
2
- import { applyScalarFields, applyStyleFields, resolveGlobalPresetIntoStyle, } from '../section-field-utils';
2
+ import { applyScalarFields, applyStyleFields, applyAiStyle, } from '../section-field-utils';
3
3
  import { BaseSectionBuilder } from './base-section-builder';
4
4
  import { validateContactForm } from '../section-rules/contact-form.rules';
5
5
  export class ContactFormBuilder extends BaseSectionBuilder {
@@ -23,7 +23,7 @@ export class ContactFormBuilder extends BaseSectionBuilder {
23
23
  if (args.title !== undefined) {
24
24
  if (isTiptapDocument(args.title)) {
25
25
  content.title = args.title;
26
- content.titleStyle = resolveGlobalPresetIntoStyle(content.titleStyle, textStyleOptions);
26
+ content.titleStyle = applyAiStyle(content.titleStyle, {}, textStyleOptions);
27
27
  }
28
28
  else {
29
29
  content.title = args.title;
@@ -32,7 +32,7 @@ export class ContactFormBuilder extends BaseSectionBuilder {
32
32
  if (args.description !== undefined) {
33
33
  if (isTiptapDocument(args.description)) {
34
34
  content.description = args.description;
35
- content.descriptionStyle = resolveGlobalPresetIntoStyle(content.descriptionStyle, textStyleOptions);
35
+ content.descriptionStyle = applyAiStyle(content.descriptionStyle, {}, textStyleOptions);
36
36
  }
37
37
  else {
38
38
  content.description = args.description;
@@ -41,7 +41,7 @@ export class ContactFormBuilder extends BaseSectionBuilder {
41
41
  if (args.success_message !== undefined) {
42
42
  if (isTiptapDocument(args.success_message)) {
43
43
  content.successMessage = args.success_message;
44
- content.successMessageStyle = resolveGlobalPresetIntoStyle(content.successMessageStyle, textStyleOptions);
44
+ content.successMessageStyle = applyAiStyle(content.successMessageStyle, {}, textStyleOptions);
45
45
  }
46
46
  else {
47
47
  content.successMessage = args.success_message;
@@ -1,5 +1,5 @@
1
1
  import { isTiptapDocument, } from '../../parsers/section-tool-arguments';
2
- import { applyScalarFields, applyStyleFields, isValidUrl, resolveGlobalPresetIntoStyle, } from '../section-field-utils';
2
+ import { applyScalarFields, applyStyleFields, isValidUrl, applyAiStyle, } from '../section-field-utils';
3
3
  import { BaseSectionBuilder } from './base-section-builder';
4
4
  import { validateImagesSection } from '../section-rules/images-section.rules';
5
5
  import { ensureItemIds, generateItemId, removeItemsByIds, repositionItemByAnchor, } from '../item-id-utils';
@@ -96,7 +96,7 @@ export class ImagesSectionBuilder extends BaseSectionBuilder {
96
96
  if (args.title !== undefined) {
97
97
  if (isTiptapDocument(args.title)) {
98
98
  content.title = args.title;
99
- content.titleStyle = resolveGlobalPresetIntoStyle(content.titleStyle, textStyleOptions);
99
+ content.titleStyle = applyAiStyle(content.titleStyle, {}, textStyleOptions);
100
100
  }
101
101
  else {
102
102
  content.title = args.title;
@@ -105,7 +105,7 @@ export class ImagesSectionBuilder extends BaseSectionBuilder {
105
105
  if (args.description !== undefined) {
106
106
  if (isTiptapDocument(args.description)) {
107
107
  content.description = args.description;
108
- content.descriptionStyle = resolveGlobalPresetIntoStyle(content.descriptionStyle, textStyleOptions);
108
+ content.descriptionStyle = applyAiStyle(content.descriptionStyle, {}, textStyleOptions);
109
109
  }
110
110
  else {
111
111
  content.description = args.description;
@@ -1,5 +1,5 @@
1
1
  import { isTiptapDocument, } from '../../parsers/section-tool-arguments';
2
- import { applyScalarFields, applyStyleFields, resolveGlobalPresetIntoStyle, } from '../section-field-utils';
2
+ import { applyScalarFields, applyStyleFields, applyAiStyle, } from '../section-field-utils';
3
3
  import { BaseSectionBuilder } from './base-section-builder';
4
4
  import { validateMailingList } from '../section-rules/mailing-list.rules';
5
5
  export class MailingListBuilder extends BaseSectionBuilder {
@@ -23,7 +23,7 @@ export class MailingListBuilder extends BaseSectionBuilder {
23
23
  if (mailingListArgs.title !== undefined) {
24
24
  if (isTiptapDocument(mailingListArgs.title)) {
25
25
  content.title = mailingListArgs.title;
26
- content.titleStyle = resolveGlobalPresetIntoStyle(content.titleStyle, textStyleOptions);
26
+ content.titleStyle = applyAiStyle(content.titleStyle, {}, textStyleOptions);
27
27
  }
28
28
  else {
29
29
  content.title = mailingListArgs.title;
@@ -1,5 +1,5 @@
1
1
  import { isTiptapDocument, } from '../../parsers/section-tool-arguments';
2
- import { applyScalarFields, applyStyleFields, resolveGlobalPresetIntoStyle, } from '../section-field-utils';
2
+ import { applyScalarFields, applyStyleFields, applyAiStyle, } from '../section-field-utils';
3
3
  import { BaseSectionBuilder } from './base-section-builder';
4
4
  import { validateMailingList } from '../section-rules/mailing-list.rules';
5
5
  export class MailingListSectionBuilder extends BaseSectionBuilder {
@@ -22,7 +22,7 @@ export class MailingListSectionBuilder extends BaseSectionBuilder {
22
22
  if (mailingListArgs.title !== undefined) {
23
23
  if (isTiptapDocument(mailingListArgs.title)) {
24
24
  resolved.content.title = mailingListArgs.title;
25
- resolved.content.titleStyle = resolveGlobalPresetIntoStyle(resolved.content.titleStyle, textStyleOptions);
25
+ resolved.content.titleStyle = applyAiStyle(resolved.content.titleStyle, {}, textStyleOptions);
26
26
  }
27
27
  else {
28
28
  resolved.content.title = mailingListArgs.title;
@@ -1,5 +1,5 @@
1
1
  import { isTiptapDocument, } from '../../parsers/section-tool-arguments';
2
- import { applyScalarFields, resolveGlobalPresetIntoStyle, } from '../section-field-utils';
2
+ import { applyScalarFields, applyAiStyle } from '../section-field-utils';
3
3
  import { BaseSectionBuilder } from './base-section-builder';
4
4
  import { validateProfile } from '../section-rules/profile.rules';
5
5
  export class ProfileSectionBuilder extends BaseSectionBuilder {
@@ -21,7 +21,7 @@ export class ProfileSectionBuilder extends BaseSectionBuilder {
21
21
  if (profileArgs.name !== undefined) {
22
22
  if (isTiptapDocument(profileArgs.name)) {
23
23
  resolved.content.name = profileArgs.name;
24
- resolved.content.nameStyle = resolveGlobalPresetIntoStyle(resolved.content.nameStyle, textStyleOptions);
24
+ resolved.content.nameStyle = applyAiStyle(resolved.content.nameStyle, {}, textStyleOptions);
25
25
  }
26
26
  else {
27
27
  resolved.content.name = profileArgs.name;
@@ -30,7 +30,7 @@ export class ProfileSectionBuilder extends BaseSectionBuilder {
30
30
  if (profileArgs.title !== undefined) {
31
31
  if (isTiptapDocument(profileArgs.title)) {
32
32
  resolved.content.title = profileArgs.title;
33
- resolved.content.titleStyle = resolveGlobalPresetIntoStyle(resolved.content.titleStyle, textStyleOptions);
33
+ resolved.content.titleStyle = applyAiStyle(resolved.content.titleStyle, {}, textStyleOptions);
34
34
  }
35
35
  else {
36
36
  resolved.content.title = profileArgs.title;
@@ -39,7 +39,7 @@ export class ProfileSectionBuilder extends BaseSectionBuilder {
39
39
  if (profileArgs.description !== undefined) {
40
40
  if (isTiptapDocument(profileArgs.description)) {
41
41
  resolved.content.description = profileArgs.description;
42
- resolved.content.descriptionStyle = resolveGlobalPresetIntoStyle(resolved.content.descriptionStyle, textStyleOptions);
42
+ resolved.content.descriptionStyle = applyAiStyle(resolved.content.descriptionStyle, {}, textStyleOptions);
43
43
  }
44
44
  else {
45
45
  resolved.content.description = profileArgs.description;
@@ -1,5 +1,5 @@
1
1
  import { isTiptapDocument, } from '../../parsers/section-tool-arguments';
2
- import { applyScalarFields, applyStyleFields, resolveGlobalPresetIntoStyle, } from '../section-field-utils';
2
+ import { applyScalarFields, applyStyleFields, applyAiStyle, } from '../section-field-utils';
3
3
  import { applyColorThemeToReplacements, resolveShapeColorReplacementsAsync, } from '../shape-color-utils';
4
4
  import { BaseSectionBuilder } from './base-section-builder';
5
5
  import { validateShapesSection } from '../section-rules/shapes-section.rules';
@@ -117,7 +117,7 @@ export class ShapesSectionBuilder extends BaseSectionBuilder {
117
117
  if (args.title !== undefined) {
118
118
  if (isTiptapDocument(args.title)) {
119
119
  content.title = args.title;
120
- content.titleStyle = resolveGlobalPresetIntoStyle(content.titleStyle, textStyleOptions);
120
+ content.titleStyle = applyAiStyle(content.titleStyle, {}, textStyleOptions);
121
121
  }
122
122
  else {
123
123
  content.title = args.title;
@@ -126,7 +126,7 @@ export class ShapesSectionBuilder extends BaseSectionBuilder {
126
126
  if (args.description !== undefined) {
127
127
  if (isTiptapDocument(args.description)) {
128
128
  content.description = args.description;
129
- content.descriptionStyle = resolveGlobalPresetIntoStyle(content.descriptionStyle, textStyleOptions);
129
+ content.descriptionStyle = applyAiStyle(content.descriptionStyle, {}, textStyleOptions);
130
130
  }
131
131
  else {
132
132
  content.description = args.description;
@@ -1,4 +1,5 @@
1
- import { applyScalarFields, applyStyleFields } from '../section-field-utils';
1
+ import { isTiptapDocument, } from '../../parsers/section-tool-arguments';
2
+ import { applyAiStyle, applyScalarFields, applyStyleFields, } from '../section-field-utils';
2
3
  import { BaseSectionBuilder } from './base-section-builder';
3
4
  import { validateSocialLinks } from '../section-rules/social-links.rules';
4
5
  import { ensureItemIds, generateItemId, removeItemsByIds, repositionItemByAnchor, } from '../item-id-utils';
@@ -73,9 +74,14 @@ export class SocialLinksBuilder extends BaseSectionBuilder {
73
74
  if ('error' in resolved)
74
75
  return resolved.error;
75
76
  const content = resolved.content;
77
+ const textStyleOptions = this.getGlobalTextStyles(model);
76
78
  applyScalarFields(content, this.args, this.sectionType);
77
- applyStyleFields(content, this.args, this.sectionType, this.getGlobalTextStyles(model));
79
+ applyStyleFields(content, this.args, this.sectionType, textStyleOptions);
78
80
  const args = this.args;
81
+ if (isTiptapDocument(args.title)) {
82
+ content.title = args.title;
83
+ content.titleStyle = applyAiStyle(content.titleStyle, {}, textStyleOptions);
84
+ }
79
85
  if (args._replace_items && args.links && Array.isArray(args.links)) {
80
86
  // Full replacement: discard existing links and rebuild from the payload.
81
87
  applySocialLinks(content, args.links);
@@ -1,5 +1,5 @@
1
1
  import { isTiptapDocument, } from '../../parsers/section-tool-arguments';
2
- import { applyScalarFields, applyStyleFields, resolveGlobalPresetIntoStyle, } from '../section-field-utils';
2
+ import { applyScalarFields, applyStyleFields, applyAiStyle, } from '../section-field-utils';
3
3
  import { applyColorThemeToReplacements, resolveShapeColorReplacementsAsync, } from '../shape-color-utils';
4
4
  import { BaseSectionBuilder } from './base-section-builder';
5
5
  import { validateTestimonialSection, TESTIMONIAL_ITEM_CAP, } from '../section-rules/testimonial-section.rules';
@@ -103,7 +103,7 @@ export class TestimonialSectionBuilder extends BaseSectionBuilder {
103
103
  if (args.title !== undefined) {
104
104
  if (isTiptapDocument(args.title)) {
105
105
  content.title = args.title;
106
- content.titleStyle = resolveGlobalPresetIntoStyle(content.titleStyle, textStyleOptions);
106
+ content.titleStyle = applyAiStyle(content.titleStyle, {}, textStyleOptions);
107
107
  }
108
108
  else {
109
109
  content.title = args.title;
@@ -1,5 +1,5 @@
1
1
  import { isTiptapDocument, } from '../../parsers/section-tool-arguments';
2
- import { applyScalarFields, applyStyleFields, resolveGlobalPresetIntoStyle, } from '../section-field-utils';
2
+ import { applyScalarFields, applyStyleFields, applyAiStyle, applyStoredDocStyleConsequences, normalizeStyleValue, } from '../section-field-utils';
3
3
  import { BaseSectionBuilder } from './base-section-builder';
4
4
  import { validateTextSection } from '../section-rules/text-section.rules';
5
5
  import { ensureItemIds, generateItemId, removeItemsByIds, repositionItemByAnchor, } from '../item-id-utils';
@@ -14,16 +14,18 @@ const resolveText = (value) => {
14
14
  return { value, wasTiptap: true };
15
15
  return { value: typeof value === 'string' ? value : '', wasTiptap: false };
16
16
  };
17
- const clearTextStyleTypeIfTiptap = (style, wasTiptap, textStyleOptions) => wasTiptap
18
- ? resolveGlobalPresetIntoStyle(style, textStyleOptions)
19
- : style;
20
17
  const createTextItem = (item, baseStyle, textStyleOptions) => {
21
- const textStyle = (item.text_style ? { ...baseStyle, ...item.text_style } : { ...baseStyle });
22
18
  const { value, wasTiptap } = resolveText(item.text);
19
+ const incoming = normalizeIncomingStyle((item.text_style ?? {}));
20
+ // RTE text: role-aware apply (keep a named role + sparse override, else resolve-and-detach).
21
+ // Plain text: the section-level style still drives it, so a straight merge.
22
+ const textStyle = wasTiptap
23
+ ? applyAiStyle(baseStyle, incoming, textStyleOptions)
24
+ : { ...baseStyle, ...incoming };
23
25
  return {
24
26
  id: item.item_id || generateItemId(),
25
27
  text: value,
26
- textStyle: clearTextStyleTypeIfTiptap(textStyle, wasTiptap, textStyleOptions),
28
+ textStyle,
27
29
  };
28
30
  };
29
31
  /**
@@ -33,6 +35,36 @@ const createTextItem = (item, baseStyle, textStyleOptions) => {
33
35
  const applyTextItems = (content, items, textStyleOptions) => {
34
36
  content.textItems = items.map((item) => createTextItem(item, content.textStyle || {}, textStyleOptions));
35
37
  };
38
+ /**
39
+ * Run every item-level style value through `normalizeStyleValue` (letterSpacing 0-100 → em string,
40
+ * lineHeight → a plain numeric string, null → clear), same as the section-level `applyStyleFields`
41
+ * path does. Items are a separate hand-rolled path with three AI-facing entry points
42
+ * (`createTextItem`, the text+style update branch, the style-only patch); without this, a raw
43
+ * `item.text_style` merge would store e.g. `letterSpacing: 10` as the bare number 10.
44
+ */
45
+ const normalizeIncomingStyle = (style) => {
46
+ const normalized = {};
47
+ for (const [k, v] of Object.entries(style)) {
48
+ const value = normalizeStyleValue(k, v);
49
+ if (value !== undefined)
50
+ normalized[k] = value;
51
+ }
52
+ return normalized;
53
+ };
54
+ /**
55
+ * A style-only patch (no new text in this call) on one stored item: role-aware apply (R19's
56
+ * reset-on-switch), then the same stored-doc consequences a section-level style field gets (R18's
57
+ * recolour, R19's relink) — items are a separate hand-rolled path, so they need the same field
58
+ * helper as `applyStyleFields`. Shared by the id-based merge and the single-field shorthand, so
59
+ * neither raw-merges `text_style` into item 0 on its own.
60
+ */
61
+ const applyItemStyleOnlyPatch = (item, textStyle, textStyleOptions) => {
62
+ const existingStyle = item.textStyle;
63
+ const existingRole = existingStyle?.textStyleType;
64
+ const incoming = normalizeIncomingStyle(textStyle);
65
+ item.textStyle = applyAiStyle(existingStyle, incoming, textStyleOptions);
66
+ item.text = applyStoredDocStyleConsequences(item.text, existingRole, item.textStyle, incoming, textStyleOptions);
67
+ };
36
68
  /**
37
69
  * Id-based merge (BP-5603): mirrors the section-level id contract one level
38
70
  * deeper.
@@ -56,14 +88,17 @@ const mergeTextItems = (content, items, removeIds, textStyleOptions) => {
56
88
  continue;
57
89
  if (item.text !== undefined) {
58
90
  const { value, wasTiptap } = resolveText(item.text);
91
+ const incoming = normalizeIncomingStyle((item.text_style ?? {}));
59
92
  existing.text = value;
60
- existing.textStyle = clearTextStyleTypeIfTiptap(existing.textStyle || {}, wasTiptap, textStyleOptions);
93
+ existing.textStyle = wasTiptap
94
+ ? applyAiStyle(existing.textStyle || {}, incoming, textStyleOptions)
95
+ : {
96
+ ...(existing.textStyle || {}),
97
+ ...incoming,
98
+ };
61
99
  }
62
- if (item.text_style && typeof item.text_style === 'object') {
63
- existing.textStyle = {
64
- ...(existing.textStyle || {}),
65
- ...item.text_style,
66
- };
100
+ else if (item.text_style && typeof item.text_style === 'object') {
101
+ applyItemStyleOnlyPatch(existing, item.text_style, textStyleOptions);
67
102
  }
68
103
  repositionItemByAnchor(content.textItems, existing, item.move_before_item_id);
69
104
  }
@@ -79,37 +114,33 @@ const mergeTextItems = (content, items, removeIds, textStyleOptions) => {
79
114
  * or shorthand for the first item).
80
115
  */
81
116
  const applySingleTextField = (content, args, textStyleOptions) => {
117
+ const incoming = normalizeIncomingStyle((args.text_style ?? {}));
82
118
  if (args.text !== undefined) {
83
119
  const { value, wasTiptap } = resolveText(args.text);
84
- if (Array.isArray(content.textItems) && content.textItems.length > 0) {
120
+ const hasItem = Array.isArray(content.textItems) && content.textItems.length > 0;
121
+ const base = hasItem
122
+ ? content.textItems[0].textStyle || {}
123
+ : { ...(content.textStyle || {}) };
124
+ const textStyle = wasTiptap
125
+ ? applyAiStyle(base, incoming, textStyleOptions)
126
+ : { ...base, ...incoming };
127
+ if (hasItem) {
85
128
  content.textItems[0] = {
86
129
  ...content.textItems[0],
87
130
  text: value,
88
- textStyle: clearTextStyleTypeIfTiptap(content.textItems[0].textStyle || {}, wasTiptap, textStyleOptions),
131
+ textStyle,
89
132
  };
90
133
  }
91
134
  else {
92
- content.textItems = [
93
- {
94
- id: generateItemId(),
95
- text: value,
96
- textStyle: clearTextStyleTypeIfTiptap({ ...(content.textStyle || {}) }, wasTiptap, textStyleOptions),
97
- },
98
- ];
135
+ content.textItems = [{ id: generateItemId(), text: value, textStyle }];
99
136
  }
137
+ return;
100
138
  }
101
139
  if (args.text_style &&
102
140
  typeof args.text_style === 'object' &&
103
141
  Array.isArray(content.textItems) &&
104
142
  content.textItems.length > 0) {
105
- const mergedStyle = {
106
- ...(content.textItems[0].textStyle || {}),
107
- ...args.text_style,
108
- };
109
- content.textItems[0] = {
110
- ...content.textItems[0],
111
- textStyle: mergedStyle,
112
- };
143
+ applyItemStyleOnlyPatch(content.textItems[0], args.text_style, textStyleOptions);
113
144
  }
114
145
  };
115
146
  export class TextSectionBuilder extends BaseSectionBuilder {
@@ -223,6 +223,7 @@ const supportMeStyleFields = defineFieldMap({
223
223
  button_text_style: 'buttonTextStyle',
224
224
  });
225
225
  const socialLinksStyleFields = defineFieldMap({
226
+ title_style: 'titleStyle',
226
227
  icon_fill_style: 'iconFillStyles',
227
228
  icon_background_style: 'iconBackgroundStyles',
228
229
  });
@@ -1,6 +1,7 @@
1
1
  import type { Content } from '../../brand-page/models';
2
2
  import type { ButtonLinkType } from '../../brand-page/models';
3
3
  import type { TextStyleOptions } from '../../brand-page/models/styles.model';
4
+ import { type ReconnectSpec } from '../../brand-page/utils/text-role-reconnect.util';
4
5
  import { type SectionToolArguments } from '../parsers/section-tool-arguments';
5
6
  export declare const isValidUrl: (value: unknown) => boolean;
6
7
  interface ButtonLinkContent {
@@ -24,35 +25,63 @@ export declare const applyScalarFields: (content: Content, args: SectionToolArgu
24
25
  /**
25
26
  * Convert AI-sent style value to the format expected by the model.
26
27
  * - letterSpacing: unitless 0-100 → em string (e.g., 50 → '0.5em')
28
+ * - lineHeight: coerced to a plain numeric string, UNSNAPPED — snapping here would shift a
29
+ * value that's actually equal to its role (e.g. 1.25) off that equality before
30
+ * `applyAiStyle` gets a chance to drop it as a role-equal non-override (R2). Only a value
31
+ * that survives the role-equal check is snapped (`snapLineHeight`, in `applyAiStyle`), and the
32
+ * drop runs AGAIN after snapping: a role can itself hold a non-grid value (e.g. heading3's
33
+ * native 1.25), so comparing before snapping catches an exact match at full precision, and
34
+ * re-comparing after catches a snap that LANDS the override exactly on the role's value.
27
35
  * - null → '' (explicitly clear/reset the property)
28
36
  * - everything else passes through as-is
29
37
  */
30
38
  export declare const normalizeStyleValue: (key: string, value: unknown) => unknown;
31
39
  /**
32
- * When an executor is about to mark a content-level text style "custom" by
33
- * clearing `textStyleType`, the resolved preset values (font, size, spacing,
34
- * etc.) must first be copied onto the style — otherwise the renderer falls
35
- * back to browser defaults because `textStyleType` no longer points at a
36
- * preset.
40
+ * Whether this call is a REAL canonical switch (R19): both the stored and the INCOMING role (the
41
+ * raw value the call sent, before any reconnect fallback) are canonical, and differ. Decided once
42
+ * from `incoming.textStyleType` and shared by `applyAiStyle` (which resets the style object) and
43
+ * the caller of `applyStoredDocStyleConsequences` (which resets the stored doc), so both agree: a
44
+ * retired-key call reconnects in `applyAiStyle` (not a switch — it keeps the look as overrides) but
45
+ * can still land on a canonical role that differs from the stored one, which deriving it from the
46
+ * RESULT instead would misread as a switch and relink a doc whose overrides were meant to survive.
47
+ */
48
+ export declare const isRealCanonicalSwitch: (existingRole: unknown, incomingRole: unknown) => boolean;
49
+ /**
50
+ * Apply an AI-sent style to a field, honouring the role model under partial-update semantics
51
+ * (a property present = update; absent = no change).
52
+ *
53
+ * The role is the EFFECTIVE one — `incoming.textStyleType ?? existing.textStyleType` — so a sparse
54
+ * update that omits the role KEEPS the element's current role. When that role is canonical, keep
55
+ * the link and store a sparse override: incoming props layer on and `normalizeTextStyleAgainstRole`
56
+ * drops any prop equal to the role, so the page-scoped role CSS drives it and a later global edit
57
+ * repaints the block.
58
+ *
59
+ * A REAL canonical switch (both the old and the new role are canonical, and differ — R19) is a
60
+ * reset, not a patch: it starts from `omitTypography(existing)` before layering this call's own
61
+ * style on top, so a stale override from the old role doesn't survive as a bogus override of the
62
+ * new one. Colour, background, alignment and `applyAutoScale` aren't typography, so they carry
63
+ * over untouched; the call's own text and overrides win (they're applied after the reset).
37
64
  *
38
- * The category is read from the existing `style.textStyleType`, which is the
39
- * authoritative per-section + per-field reference set by the content factory.
40
- * Existing style values win over preset defaults (the content may already
41
- * carry user overrides on top of the preset).
65
+ * Any other role — a retired key the pipeline still emits, `none`, or no role at all — reconnects
66
+ * the way the upgrade does (`reconnectTextStyle`, with the field's `spec`): its starting role, else
67
+ * the retired role's successor, else the role nearest its size, keeping its look as overrides.
42
68
  */
43
- export declare const resolveGlobalPresetIntoStyle: (style: object | undefined, textStyleOptions: TextStyleOptions | undefined) => Record<string, unknown>;
69
+ export declare const applyAiStyle: <T extends object>(existing: T | undefined, incoming: Record<string, unknown>, textStyleOptions: TextStyleOptions | undefined, spec?: ReconnectSpec) => T;
44
70
  /**
45
- * Applies per-element style overrides while detaching the element from any
46
- * global text-style preset. When a style is bound to a `textStyleType` preset,
47
- * the renderer (`getCopyrightTextStyle` / `getTextStyleByContentTextStyle`)
48
- * replaces the whole style with that preset and discards per-element values such
49
- * as `fontFamily`. Resolving the preset in and clearing `textStyleType` makes the
50
- * override stick — the same disconnect rule section content follows.
71
+ * BP-5969 (R18, R19) — what a style-only patch (no new text in the same call) does to an already-
72
+ * stored RTE doc. A real role switch relinks every run to the new role (the document-level half of
73
+ * the reset `applyAiStyle` already gave the style object above), keeping any typography the call's
74
+ * own `nextStyle` still overrides via `relinkDocToRole`'s `styleOverrides` arg. A colour-only patch,
75
+ * OR a colour riding along with a switch in the same call (James Joung, 2026-10-01: a role switch
76
+ * and a recolour with no text both apply), recolours every run and clears the now-redundant style
77
+ * colour (kept only when the doc has no run to hold it — an empty field's colour waits for the
78
+ * maker's first keystroke, `buildInitialMarks`). Both consequences can apply to one call: the
79
+ * switch's relink runs first, then the colour branch recolours the relinked doc.
51
80
  *
52
- * Idempotent: once `textStyleType` is cleared, subsequent calls just merge the
53
- * updates without re-resolving a preset.
81
+ * No-op for anything but a stored Tiptap document — a legacy HTML string is handled by the caller's
82
+ * own `ApplyColorToRTE` rewrite instead.
54
83
  */
55
- export declare const applyDetachedStyleOverride: <T extends object>(current: T | undefined, updates: Partial<T>, textStyleOptions: TextStyleOptions | undefined) => T;
84
+ export declare const applyStoredDocStyleConsequences: (existingText: unknown, existingRole: unknown, nextStyle: Record<string, unknown>, incomingStyle: Record<string, unknown>, textStyleOptions: TextStyleOptions | undefined) => unknown;
56
85
  /**
57
86
  * Rewrites the stored RTE HTML's inline colour marks. Injectable for tests;
58
87
  * the default uses the external Tiptap editor (font-propagation precedent).