@designcrowd/library.brand-page 6.2.11-builder-v2-1 → 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 (579) hide show
  1. package/lib/src/{CreatedOnBrandCrowd-de-de-Dg2pOwbr.js → CreatedOnBrandCrowd-de-de-BtVKllNQ.js} +1 -1
  2. package/lib/src/{CreatedOnBrandCrowd-en-us-BILs_hsB.js → CreatedOnBrandCrowd-en-us-CX5V0v8u.js} +1 -1
  3. package/lib/src/{CreatedOnBrandCrowd-es-es-VpxQ0N5F.js → CreatedOnBrandCrowd-es-es-CbA02PCL.js} +1 -1
  4. package/lib/src/{CreatedOnBrandCrowd-fr-fr-CFHWRHzi.js → CreatedOnBrandCrowd-fr-ca-BQAKruBF.js} +1 -1
  5. package/lib/src/{CreatedOnBrandCrowd-fr-ca-CFHWRHzi.js → CreatedOnBrandCrowd-fr-fr-BQAKruBF.js} +1 -1
  6. package/lib/src/{CreatedOnBrandCrowd-pt-pt-CZfs45s9.js → CreatedOnBrandCrowd-pt-br-Yk_yzB3s.js} +1 -1
  7. package/lib/src/{CreatedOnBrandCrowd-pt-br-CZfs45s9.js → CreatedOnBrandCrowd-pt-pt-Yk_yzB3s.js} +1 -1
  8. package/lib/src/{CreatedOnDcom-de-de-DYMQ6sIF.js → CreatedOnDcom-de-de-DJZQbPSD.js} +1 -1
  9. package/lib/src/{CreatedOnDcom-en-us-Dj5sdPid.js → CreatedOnDcom-en-us-BJvNAa4l.js} +1 -1
  10. package/lib/src/{CreatedOnDcom-es-es-Cx9yNTro.js → CreatedOnDcom-es-es-CUwB1FRY.js} +1 -1
  11. package/lib/src/{CreatedOnDcom-fr-ca-Bzr0SjGq.js → CreatedOnDcom-fr-ca-CK54U4oh.js} +1 -1
  12. package/lib/src/{CreatedOnDcom-fr-fr-BgqKY35F.js → CreatedOnDcom-fr-fr-DuUNBGrM.js} +1 -1
  13. package/lib/src/{CreatedOnDcom-pt-br-CXK6qfvL.js → CreatedOnDcom-pt-br-BfODpFNV.js} +1 -1
  14. package/lib/src/{CreatedOnDcom-pt-pt-B8SggNTQ.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/brand-page-context.model.d.ts +2 -0
  39. package/lib/src/brand-page/models/brand-page-context.model.js +7 -0
  40. package/lib/src/brand-page/models/index.d.ts +23 -24
  41. package/lib/src/brand-page/models/index.js +20 -7
  42. package/lib/src/brand-page/models/navigation-styles.model.d.ts +1 -1
  43. package/lib/src/brand-page/models/navigation-styles.model.js +17 -8
  44. package/lib/src/brand-page/models/payment.model.d.ts +11 -6
  45. package/lib/src/brand-page/models/styles.model.d.ts +53 -7
  46. package/lib/src/brand-page/models/styles.model.js +115 -27
  47. package/lib/src/brand-page/utils/color-palette.util.d.ts +43 -23
  48. package/lib/src/brand-page/utils/color-palette.util.js +65 -27
  49. package/lib/src/brand-page/utils/color.util.d.ts +13 -9
  50. package/lib/src/brand-page/utils/color.util.js +56 -15
  51. package/lib/src/brand-page/utils/container-text-color.util.d.ts +46 -13
  52. package/lib/src/brand-page/utils/container-text-color.util.js +321 -41
  53. package/lib/src/brand-page/utils/index.d.ts +1 -0
  54. package/lib/src/brand-page/utils/index.js +1 -0
  55. package/lib/src/brand-page/utils/migration/migration-20.js +6 -2
  56. package/lib/src/brand-page/utils/migration/migration-21.js +34 -6
  57. package/lib/src/brand-page/utils/migration/migration-22.d.ts +99 -0
  58. package/lib/src/brand-page/utils/migration/migration-22.js +909 -0
  59. package/lib/src/brand-page/utils/migration.util.js +17 -0
  60. package/lib/src/brand-page/utils/model.util.d.ts +4 -0
  61. package/lib/src/brand-page/utils/model.util.js +4 -0
  62. package/lib/src/brand-page/utils/personalisation.util.js +9 -1
  63. package/lib/src/brand-page/utils/rte-role-lift.util.d.ts +72 -0
  64. package/lib/src/brand-page/utils/rte-role-lift.util.js +275 -0
  65. package/lib/src/brand-page/utils/style.util.d.ts +5 -1
  66. package/lib/src/brand-page/utils/style.util.js +34 -11
  67. package/lib/src/brand-page/utils/text-role-css.util.d.ts +19 -0
  68. package/lib/src/brand-page/utils/text-role-css.util.js +186 -0
  69. package/lib/src/brand-page/utils/text-role-reconnect.util.d.ts +90 -0
  70. package/lib/src/brand-page/utils/text-role-reconnect.util.js +434 -0
  71. package/lib/src/brand-page/utils/text-style.util.d.ts +53 -23
  72. package/lib/src/brand-page/utils/text-style.util.js +122 -22
  73. package/lib/src/brand-page/utils/view-model.util.d.ts +9 -1
  74. package/lib/src/brand-page/utils/view-model.util.js +124 -111
  75. package/lib/src/brand-page/view-models.d.ts +1 -0
  76. package/lib/src/brand-page-maker/components/action-bar/ActionBar.mixin.d.ts +4 -1
  77. package/lib/src/brand-page-maker/components/brand-page-maker/BrandPageMaker.mixin.d.ts +34 -2
  78. package/lib/src/brand-page-maker/components/brand-page-maker/BrandPageMaker.mixin.js +4 -4
  79. package/lib/src/brand-page-maker/components/brand-page-maker/BrandPageMakerTemplateSettings.mixin.d.ts +4 -1
  80. package/lib/src/brand-page-maker/components/brand-page-maker/__fixtures__/brand-page-examples.js +0 -10
  81. package/lib/src/brand-page-maker/components/brand-page-maker/__fixtures__/content-settings-items.fixture.js +0 -1
  82. package/lib/src/brand-page-maker/components/brandpage-maker-page/BrandPageMakerPage.mixin.d.ts +44 -138
  83. package/lib/src/brand-page-maker/components/brandpage-maker-page/BrandPageMakerPage.mixin.js +0 -28
  84. package/lib/src/brand-page-maker/components/brandpage-settings/ReplaceImageSettingsForBrandPageSettings.mixin.d.ts +4 -1
  85. package/lib/src/brand-page-maker/components/navigation/Navigation.mixin.d.ts +1 -1
  86. package/lib/src/brand-page-maker/components/preview/Preview.mixin.d.ts +7 -0
  87. package/lib/src/brand-page-maker/components/quick-link-bar/QuickLinkBar.mixin.d.ts +21 -0
  88. package/lib/src/brand-page-maker/components/seo-settings/SeoPageSettings.mixin.d.ts +25 -1
  89. package/lib/src/brand-page-maker/components/seo-settings/UrlSettings.mixin.d.ts +25 -1
  90. package/lib/src/brand-page-maker/components/seo-settings/UseExistingDomainModal.mixin.d.ts +21 -0
  91. package/lib/src/brand-page-maker/components/social-share/SocialShare.mixin.d.ts +4 -1
  92. package/lib/src/brand-page-maker/components/template-preview/TemplatePreview.mixin.d.ts +25 -1
  93. package/lib/src/brand-page-maker/components/upgrade-to-premium-button/UpgradeToPremiumButton.mixin.d.ts +21 -0
  94. package/lib/src/brand-page-maker/composables/ai-chat/ai-builder-experiment.d.ts +10 -0
  95. package/lib/src/brand-page-maker/composables/ai-chat/ai-builder-experiment.js +11 -0
  96. package/lib/src/brand-page-maker/composables/ai-chat/useAiMetadataBuilder.d.ts +1 -0
  97. package/lib/src/brand-page-maker/composables/ai-chat/useAiMetadataBuilder.js +1 -0
  98. package/lib/src/brand-page-maker/composables/ai-chat/useAiWebsiteBuilderChat.js +14 -0
  99. package/lib/src/brand-page-maker/composables/rich-text-editor/extensions/RoleTypographyFill.d.ts +16 -0
  100. package/lib/src/brand-page-maker/composables/rich-text-editor/extensions/RoleTypographyFill.js +61 -0
  101. package/lib/src/brand-page-maker/composables/rich-text-editor/extensions/RteClipboard.d.ts +11 -0
  102. package/lib/src/brand-page-maker/composables/rich-text-editor/extensions/RteClipboard.js +236 -0
  103. package/lib/src/brand-page-maker/composables/rich-text-editor/font.d.ts +2 -1
  104. package/lib/src/brand-page-maker/composables/rich-text-editor/font.js +25 -6
  105. package/lib/src/brand-page-maker/composables/rich-text-editor/formatting.d.ts +17 -4
  106. package/lib/src/brand-page-maker/composables/rich-text-editor/formatting.js +204 -17
  107. package/lib/src/brand-page-maker/composables/rich-text-editor/hyperlink.d.ts +1 -1
  108. package/lib/src/brand-page-maker/composables/rich-text-editor/hyperlink.js +29 -31
  109. package/lib/src/brand-page-maker/composables/rich-text-editor/keepMarksOnEmpty.d.ts +20 -0
  110. package/lib/src/brand-page-maker/composables/rich-text-editor/keepMarksOnEmpty.js +60 -0
  111. package/lib/src/brand-page-maker/composables/rich-text-editor/spacing.d.ts +2 -1
  112. package/lib/src/brand-page-maker/composables/rich-text-editor/spacing.js +22 -6
  113. package/lib/src/brand-page-maker/composables/rich-text-editor/useRichTextEditor.d.ts +10 -4
  114. package/lib/src/brand-page-maker/composables/rich-text-editor/useRichTextEditor.js +319 -275
  115. package/lib/src/brand-page-maker/constants/config-settings-constant.js +1 -5
  116. package/lib/src/brand-page-maker/convertors/text-css-style-options.convertor.js +6 -2
  117. package/lib/src/brand-page-maker/convertors/text-size-value.convertor.d.ts +1 -1
  118. package/lib/src/brand-page-maker/convertors/text-size-value.convertor.js +3 -1
  119. package/lib/src/brand-page-maker/default-getters/payment-text-and-border-color.default-getter.js +7 -14
  120. package/lib/src/brand-page-maker/default-getters/text-color.default-getter.js +6 -13
  121. package/lib/src/brand-page-maker/models/content-settings.d.ts +8 -0
  122. package/lib/src/brand-page-maker/models/content-settings.js +112 -81
  123. package/lib/src/brand-page-maker/stores/admin-logo-settings/admin-logo-settings-store-utils.d.ts +2 -2
  124. package/lib/src/brand-page-maker/stores/admin-logo-settings/admin-logo-settings-store-utils.js +5 -2
  125. package/lib/src/brand-page-maker/stores/admin-logo-settings/admin-logo-settings-store.js +4 -3
  126. package/lib/src/brand-page-maker/stores/ai-checkpoint/ai-checkpoint-store.d.ts +1257 -117
  127. package/lib/src/brand-page-maker/stores/ai-thread/ai-website-builder-thread-store.d.ts +9 -2
  128. package/lib/src/brand-page-maker/stores/ai-thread/ai-website-builder-thread-store.js +20 -0
  129. package/lib/src/brand-page-maker/stores/brandpage-container/brand-page-container-store.d.ts +21 -0
  130. package/lib/src/brand-page-maker/stores/brandpage-maker/brandpage-maker-store.d.ts +6 -1
  131. package/lib/src/brand-page-maker/stores/brandpage-maker/brandpage-maker-store.js +17 -9
  132. package/lib/src/brand-page-maker/stores/history/history-store.d.ts +59 -5
  133. package/lib/src/brand-page-maker/stores/history/history-store.js +22 -2
  134. package/lib/src/brand-page-maker/utils/apply-color-strategy.js +26 -8
  135. package/lib/src/brand-page-maker/utils/index.d.ts +2 -1
  136. package/lib/src/brand-page-maker/utils/index.js +2 -1
  137. package/lib/src/brand-page-maker/utils/rich-text-editor.util.d.ts +117 -15
  138. package/lib/src/brand-page-maker/utils/rich-text-editor.util.js +435 -281
  139. package/lib/src/brand-page-maker/utils/rte-authoring.util.d.ts +4 -0
  140. package/lib/src/brand-page-maker/utils/rte-authoring.util.js +101 -0
  141. package/lib/src/brand-page-maker/utils/rte-clipboard.util.d.ts +126 -0
  142. package/lib/src/brand-page-maker/utils/rte-clipboard.util.js +307 -0
  143. package/lib/src/brand-page-maker/utils/rte-sanitize.util.js +13 -3
  144. package/lib/src/{bundled-translations-zfiA5Tsw.js → bundled-translations-yGrvPE5i.js} +17 -17
  145. package/lib/src/{bundled-translations.de-DE-ChsdSyAP.js → bundled-translations.de-DE-L4Znf8Hs.js} +17 -17
  146. package/lib/src/{bundled-translations.es-ES-DflsWQK0.js → bundled-translations.es-ES-D6iticrK.js} +15 -15
  147. package/lib/src/{bundled-translations.fr-CA-fpDRuZ52.js → bundled-translations.fr-CA-BgAVE-9k.js} +25 -25
  148. package/lib/src/{bundled-translations.fr-FR-Bub73Zt-.js → bundled-translations.fr-FR-B8GbyqxQ.js} +17 -17
  149. package/lib/src/{bundled-translations.pt-BR-BlnWE9TB.js → bundled-translations.pt-BR-DjPU3Db7.js} +25 -25
  150. package/lib/src/{bundled-translations.pt-PT-DmzXlnaS.js → bundled-translations.pt-PT-BaepaDpr.js} +23 -23
  151. package/lib/src/bundles/bundled-translations.de-DE.json +21 -2
  152. package/lib/src/bundles/bundled-translations.es-ES.json +21 -2
  153. package/lib/src/bundles/bundled-translations.fr-CA.json +21 -2
  154. package/lib/src/bundles/bundled-translations.fr-FR.json +21 -2
  155. package/lib/src/bundles/bundled-translations.json +21 -2
  156. package/lib/src/bundles/bundled-translations.pt-BR.json +21 -2
  157. package/lib/src/bundles/bundled-translations.pt-PT.json +21 -2
  158. package/lib/src/clients/ai-assistant-client.d.ts +7 -1
  159. package/lib/src/clients/ai-assistant-client.js +7 -15
  160. package/lib/src/composables/useTranslate.d.ts +1 -1
  161. package/lib/src/composables/useTranslate.js +1 -1
  162. package/lib/src/css/library.brand-page-brandCrowd.min.css +284 -188
  163. package/lib/src/css/library.brand-page-brandPage.min.css +284 -188
  164. package/lib/src/css/library.brand-page-designCom.min.css +284 -188
  165. package/lib/src/css/library.brand-page-preview.min.css +284 -188
  166. package/lib/src/index.d.ts +2 -1
  167. package/lib/src/index.mjs +195 -191
  168. package/lib/src/{lib-7gtW85nE.js → lib-kGRlD3_P.js} +39082 -36131
  169. package/lib/src/lib.js +2 -1
  170. package/lib/src/metadata-builder/builders/footer-builder.js +4 -5
  171. package/lib/src/metadata-builder/builders/global-role-propagation.d.ts +58 -0
  172. package/lib/src/metadata-builder/builders/global-role-propagation.js +246 -0
  173. package/lib/src/metadata-builder/builders/global-styles-builder.d.ts +1 -0
  174. package/lib/src/metadata-builder/builders/global-styles-builder.js +116 -45
  175. package/lib/src/metadata-builder/builders/header-builder.js +13 -4
  176. package/lib/src/metadata-builder/builders/section-builders/about-section-builder.js +3 -3
  177. package/lib/src/metadata-builder/builders/section-builders/banner-section-builder.js +3 -3
  178. package/lib/src/metadata-builder/builders/section-builders/booking-section-builder.js +3 -3
  179. package/lib/src/metadata-builder/builders/section-builders/contact-form-builder.js +4 -4
  180. package/lib/src/metadata-builder/builders/section-builders/images-section-builder.js +3 -3
  181. package/lib/src/metadata-builder/builders/section-builders/mailing-list-builder.js +2 -2
  182. package/lib/src/metadata-builder/builders/section-builders/mailing-list-section-builder.js +2 -2
  183. package/lib/src/metadata-builder/builders/section-builders/profile-section-builder.js +4 -4
  184. package/lib/src/metadata-builder/builders/section-builders/shapes-section-builder.js +3 -3
  185. package/lib/src/metadata-builder/builders/section-builders/social-links-builder.js +8 -2
  186. package/lib/src/metadata-builder/builders/section-builders/testimonial-section-builder.js +2 -2
  187. package/lib/src/metadata-builder/builders/section-builders/text-section-builder.js +60 -29
  188. package/lib/src/metadata-builder/builders/section-field-maps.js +1 -0
  189. package/lib/src/metadata-builder/builders/section-field-utils.d.ts +48 -19
  190. package/lib/src/metadata-builder/builders/section-field-utils.js +128 -52
  191. package/lib/src/metadata-builder/builders/section-rules/global-styles.rules.d.ts +4 -2
  192. package/lib/src/metadata-builder/builders/section-rules/global-styles.rules.js +28 -12
  193. package/lib/src/metadata-builder/builders/section-rules/social-links.rules.js +5 -1
  194. package/lib/src/metadata-builder/helpers/rte.helpers.d.ts +1 -1
  195. package/lib/src/metadata-builder/helpers/rte.helpers.js +97 -40
  196. package/lib/src/metadata-builder/metadata-executor.js +23 -1
  197. package/lib/src/metadata-builder/models.d.ts +2 -0
  198. package/lib/src/metadata-builder/parsers/ai-toolcall-parser.d.ts +18 -19
  199. package/lib/src/metadata-builder/parsers/section-tool-arguments.d.ts +18 -1
  200. package/lib/src/metadata-builder/sanitizers/rte-schema-check.js +1 -1
  201. package/lib/src/metadata-builder/sanitizers/sanitizer-rules.d.ts +0 -1
  202. package/lib/src/metadata-builder/sanitizers/sanitizer-rules.js +5 -8
  203. package/lib/src/metadata-builder/sanitizers/section-args-validator.d.ts +7 -16
  204. package/lib/src/metadata-builder/sanitizers/section-args-validator.js +95 -22
  205. package/lib/src/shared/color-palette/section-color-matches.js +9 -25
  206. package/lib/src/shared/color-strategies/color-strategies.d.ts +15 -0
  207. package/lib/src/shared/color-strategies/color-strategies.js +31 -0
  208. package/lib/src/shared/color-strategies/rte-color.d.ts +8 -0
  209. package/lib/src/shared/color-strategies/rte-color.js +16 -0
  210. package/lib/src/shared/color-strategies/rte-field-pairs.d.ts +23 -0
  211. package/lib/src/shared/color-strategies/rte-field-pairs.js +28 -0
  212. package/lib/src/shared/content-settings/components/content-settings/ContentSettings.mixin.d.ts +9 -135
  213. package/lib/src/shared/content-settings/components/content-settings/ContentSettings.mixin.js +1 -27
  214. package/lib/src/shared/content-settings/components/content-settings/ReplaceImageSettingsForContent.mixin.d.ts +12 -2
  215. package/lib/src/shared/content-settings/components/content-settings-item/ContentSettingsItem.mixin.d.ts +7 -0
  216. package/lib/src/shared/content-settings/components/content-settings-item/ContentSettingsItemField.mixin.d.ts +75 -6
  217. package/lib/src/shared/content-settings/components/content-settings-item/ContentSettingsItemField.mixin.js +18 -7
  218. package/lib/src/shared/content-settings/components/focused-content-item-settings/FocusedContentItemSettings.mixin.d.ts +6 -1
  219. package/lib/src/shared/content-settings/components/focused-content-item-settings/FocusedContentItemSettings.mixin.js +0 -7
  220. package/lib/src/shared/content-settings/components/payment-config-field/PaymentConfigField.mixin.d.ts +22 -0
  221. package/lib/src/shared/content-settings/components/text-items-field/TextItemsField.mixin.js +8 -4
  222. package/lib/src/shared/content-settings/components/text-style-field/TextStyleField.mixin.d.ts +1255 -26
  223. package/lib/src/shared/content-settings/components/text-style-field/TextStyleField.mixin.js +203 -59
  224. package/lib/src/shared/content-settings/store/content-settings-store.d.ts +6 -0
  225. package/lib/src/shared/content-settings/store/content-settings-store.js +105 -8
  226. package/lib/src/shared/logo-settings/components/LogoSettings.mixin.d.ts +26 -1
  227. package/lib/src/shared/navigation-style-settings/store/index.d.ts +7 -3
  228. package/lib/src/shared/navigation-style-settings/store/index.js +40 -15
  229. package/lib/src/shared/page-settings/components/new-page-modal/NewPageModal.mixin.d.ts +1 -0
  230. package/lib/src/shared/page-settings/components/page-settings/PageSettings.mixin.d.ts +38 -5
  231. package/lib/src/shared/page-settings/components/page-settings-section-styles/PageSettingsSectionStyles.mixin.d.ts +91 -13
  232. package/lib/src/shared/page-settings/components/page-settings-section-styles/PageSettingsSectionStyles.mixin.js +10 -2
  233. package/lib/src/shared/page-settings/store/page-settings-store.d.ts +2 -1
  234. package/lib/src/shared/page-settings/store/page-settings-store.js +17 -0
  235. package/lib/src/shared/publish-brand-page-with-state/PublishBrandPageModalWithState.mixin.d.ts +32 -1
  236. package/lib/src/shared/rte-extensions/AutoLink.d.ts +17 -0
  237. package/lib/src/{brand-page-maker/composables/rich-text-editor/extensions → shared/rte-extensions}/AutoLink.js +67 -51
  238. package/lib/src/{brand-page-maker/composables/rich-text-editor/extensions → shared/rte-extensions}/MaxLength.js +4 -1
  239. package/lib/src/shared/rte-extensions/TextEffects.d.ts +28 -0
  240. package/lib/src/shared/rte-extensions/TextEffects.js +96 -0
  241. package/lib/src/shared/rte-extensions/ViewDomParser.d.ts +2 -0
  242. package/lib/src/shared/rte-extensions/ViewDomParser.js +21 -0
  243. package/lib/src/shared/rte-extensions.util.d.ts +25 -0
  244. package/lib/src/{brand-page-maker/composables/rich-text-editor/getRteExtensions.js → shared/rte-extensions.util.js} +62 -7
  245. package/lib/src/shared/rte-link.util.d.ts +1 -0
  246. package/lib/src/shared/rte-link.util.js +1 -0
  247. package/lib/src/shared/rte-render.util.d.ts +112 -0
  248. package/lib/src/shared/rte-render.util.js +255 -0
  249. package/lib/src/shared/rte-shape.util.d.ts +6 -0
  250. package/lib/src/shared/rte-shape.util.js +18 -0
  251. package/lib/src/shared/side-bar/components/SideBar.mixin.d.ts +23 -1
  252. package/lib/src/shared/side-bar/components/SideBarTabButton.mixin.d.ts +1 -0
  253. package/lib/src/shared/side-bar/store/side-bar-store.d.ts +2 -0
  254. package/lib/src/shared/side-bar/store/side-bar-store.js +9 -0
  255. package/lib/src/shared/style-settings/components/StyleSettings.mixin.d.ts +176 -15
  256. package/lib/src/shared/style-settings/components/StyleSettings.mixin.js +7 -1
  257. package/lib/src/shared/style-settings/store/style-settings-store.d.ts +1 -9
  258. package/lib/src/shared/style-settings/store/style-settings-store.js +3 -33
  259. package/lib/src/shared/style-settings/text-style-size-order.d.ts +2 -0
  260. package/lib/src/shared/style-settings/text-style-size-order.js +13 -0
  261. package/lib/src/shared/text-role-typography.util.d.ts +64 -0
  262. package/lib/src/shared/text-role-typography.util.js +183 -0
  263. package/lib/src/utils/minify-brand-page-metadata.d.ts +16 -1
  264. package/lib/src/utils/minify-brand-page-metadata.js +31 -9
  265. package/package.json +1 -1
  266. package/src/brand-page/__fixtures__/migration-22-v21/edited-brandsite-sections.v21.json +982 -0
  267. package/src/brand-page/__fixtures__/migration-22-v21/new-brandcontact-every-section.v21.json +1231 -0
  268. package/src/brand-page/__fixtures__/migration-22-v21/new-brandpage-every-section.v21.json +1231 -0
  269. package/src/brand-page/__fixtures__/migration-22-v21/new-brandsite-every-section.v21.json +1243 -0
  270. package/src/brand-page/__fixtures__/migration-22-v21/real-brandcontact.v21.json +755 -0
  271. package/src/brand-page/__fixtures__/migration-22-v21/real-brandpage-general-link.v21.json +527 -0
  272. package/src/brand-page/__fixtures__/migration-22-v21/real-brandpage-links.v21.json +755 -0
  273. package/src/brand-page/__fixtures__/migration-22-v21/real-brandpage-social-links.v21.json +514 -0
  274. package/src/brand-page/__fixtures__/migration-22-v21/real-brandsite-about.v21.json +459 -0
  275. package/src/brand-page/__fixtures__/migration-22-v21/real-brandsite-footer.v21.json +469 -0
  276. package/src/brand-page/__fixtures__/migration-22-v21/real-brandsite-header-banner.v21.json +481 -0
  277. package/src/brand-page/__fixtures__/migration-22-v21/real-brandsite-sections.v21.json +800 -0
  278. package/src/brand-page/__fixtures__/production-text-style-resolver.fixture.ts +52 -0
  279. package/src/brand-page/components/about-section/AboutSection.vue.test.ts +0 -10
  280. package/src/brand-page/components/contact-form/ContactForm.mixin.test.ts +127 -0
  281. package/src/brand-page/components/contact-form/ContactForm.mixin.ts +31 -14
  282. package/src/brand-page/components/contact-form/ContactForm.vue +26 -12
  283. package/src/brand-page/components/contact-form/ContactForm.vue.test.ts +60 -0
  284. package/src/brand-page/components/mailing-list/MailingList.mixin.test.ts +92 -0
  285. package/src/brand-page/components/mailing-list/MailingList.mixin.ts +28 -3
  286. package/src/brand-page/components/mailing-list/MailingList.vue +9 -4
  287. package/src/brand-page/components/mailing-list/MailingList.vue.test.ts +63 -0
  288. package/src/brand-page/components/navigation/button-carousel/ButtonCarouselNavigation.mixin.ts +51 -1
  289. package/src/brand-page/components/navigation/button-carousel/ButtonCarouselNavigation.test.ts +114 -0
  290. package/src/brand-page/components/navigation/button-carousel/ButtonCarouselNavigation.vue +8 -2
  291. package/src/brand-page/components/navigation/navigation-carousel/NavigationCarousel.test.ts +182 -0
  292. package/src/brand-page/components/navigation/navigation-carousel/NavigationCarousel.vue +58 -12
  293. package/src/brand-page/components/navigation/navigation-side-menu/NavigationSideMenu.mixin.ts +40 -3
  294. package/src/brand-page/components/navigation/navigation-side-menu/NavigationSideMenu.vue +15 -7
  295. package/src/brand-page/components/navigation/navigation-side-menu/NavigationSideMenu.vue.test.ts +133 -3
  296. package/src/brand-page/components/page/Page.mixin.ts +41 -34
  297. package/src/brand-page/components/page/Page.vue +17 -6
  298. package/src/brand-page/components/page/Page.vue.test.ts +91 -1
  299. package/src/brand-page/components/page-footer/PageFooter.mixin.ts +32 -2
  300. package/src/brand-page/components/page-footer/PageFooter.test.ts +79 -0
  301. package/src/brand-page/components/page-footer/PageFooter.vue +12 -4
  302. package/src/brand-page/components/payment/Payment.mixin.ts +34 -2
  303. package/src/brand-page/components/payment/Payment.test.ts +188 -0
  304. package/src/brand-page/components/payment/Payment.vue +12 -5
  305. package/src/brand-page/components/payment/RequestPaymentStripe.vue +1 -0
  306. package/src/brand-page/components/payment/support-me/SupportMe.mixin.ts +49 -2
  307. package/src/brand-page/components/payment/support-me/SupportMe.test.ts +100 -0
  308. package/src/brand-page/components/payment/support-me/SupportMe.vue +7 -1
  309. package/src/brand-page/components/payment/support-me/SupportMe.vue.test.ts +66 -0
  310. package/src/brand-page/components/save-contact/SaveContactWidget.test.ts +100 -0
  311. package/src/brand-page/components/save-contact/SaveContactWidget.vue +6 -3
  312. package/src/brand-page/components/shop/PaymentModal.vue +2 -6
  313. package/src/brand-page/components/shop/PaymentShippingAddress.vue +6 -0
  314. package/src/brand-page/components/shop/Shop.vue +15 -2
  315. package/src/brand-page/components/shop/Shop.vue.test.ts +74 -2
  316. package/src/brand-page/components/social-links/SocialLinks.stories.ts +0 -3
  317. package/src/brand-page/components/social-links/SocialLinks.vue.test.ts +0 -3
  318. package/src/brand-page/components/testimonial-section/__fixtures__/data.ts +0 -3
  319. package/src/brand-page/components/text/Text.stories.ts +0 -17
  320. package/src/brand-page/components/text-wrapper/TextWrapper.parity.test.ts +136 -0
  321. package/src/brand-page/components/text-wrapper/TextWrapper.test.ts +358 -0
  322. package/src/brand-page/components/text-wrapper/TextWrapper.vue +82 -22
  323. package/src/brand-page/constants/font.constants.ts +37 -0
  324. package/src/brand-page/models/brand-page-context.model.ts +13 -0
  325. package/src/brand-page/models/footer-icon-color.test.ts +22 -0
  326. package/src/brand-page/models/index.ts +50 -28
  327. package/src/brand-page/models/navigation-styles.model.test.ts +77 -1
  328. package/src/brand-page/models/navigation-styles.model.ts +26 -9
  329. package/src/brand-page/models/payment.model.ts +15 -6
  330. package/src/brand-page/models/styles.model.test.ts +104 -0
  331. package/src/brand-page/models/styles.model.ts +181 -47
  332. package/src/brand-page/utils/__snapshots__/migration.util.test.ts.snap +619 -115
  333. package/src/brand-page/utils/__snapshots__/migration2.util.test.ts.snap +150 -9
  334. package/src/brand-page/utils/__snapshots__/model.util.test.ts.snap +300 -18
  335. package/src/brand-page/utils/color-palette.util.test.ts +126 -1
  336. package/src/brand-page/utils/color-palette.util.ts +92 -26
  337. package/src/brand-page/utils/color.util.test.ts +62 -29
  338. package/src/brand-page/utils/color.util.ts +77 -14
  339. package/src/brand-page/utils/container-text-color.util.test.ts +672 -26
  340. package/src/brand-page/utils/container-text-color.util.ts +472 -46
  341. package/src/brand-page/utils/index.ts +1 -0
  342. package/src/brand-page/utils/migration/__snapshots__/migration-22-output/edited-brandsite-sections.v22.json +1191 -0
  343. package/src/brand-page/utils/migration/__snapshots__/migration-22-output/new-brandcontact-every-section.v22.json +2026 -0
  344. package/src/brand-page/utils/migration/__snapshots__/migration-22-output/new-brandpage-every-section.v22.json +2017 -0
  345. package/src/brand-page/utils/migration/__snapshots__/migration-22-output/new-brandsite-every-section.v22.json +2031 -0
  346. package/src/brand-page/utils/migration/__snapshots__/migration-22-output/real-brandcontact.v22.json +1145 -0
  347. package/src/brand-page/utils/migration/__snapshots__/migration-22-output/real-brandpage-general-link.v22.json +645 -0
  348. package/src/brand-page/utils/migration/__snapshots__/migration-22-output/real-brandpage-links.v22.json +1136 -0
  349. package/src/brand-page/utils/migration/__snapshots__/migration-22-output/real-brandpage-social-links.v22.json +662 -0
  350. package/src/brand-page/utils/migration/__snapshots__/migration-22-output/real-brandsite-about.v22.json +638 -0
  351. package/src/brand-page/utils/migration/__snapshots__/migration-22-output/real-brandsite-footer.v22.json +610 -0
  352. package/src/brand-page/utils/migration/__snapshots__/migration-22-output/real-brandsite-header-banner.v22.json +660 -0
  353. package/src/brand-page/utils/migration/__snapshots__/migration-22-output/real-brandsite-sections.v22.json +1132 -0
  354. package/src/brand-page/utils/migration/migration-01.ts +293 -237
  355. package/src/brand-page/utils/migration/migration-02.ts +8 -1
  356. package/src/brand-page/utils/migration/migration-20.ts +6 -3
  357. package/src/brand-page/utils/migration/migration-20_5.test.ts +5 -2
  358. package/src/brand-page/utils/migration/migration-21.test.ts +34 -0
  359. package/src/brand-page/utils/migration/migration-21.ts +46 -10
  360. package/src/brand-page/utils/migration/migration-22.fixed-input.test.ts +43 -0
  361. package/src/brand-page/utils/migration/migration-22.test.ts +4103 -0
  362. package/src/brand-page/utils/migration/migration-22.text-font-family.test.ts +72 -0
  363. package/src/brand-page/utils/migration/migration-22.ts +1336 -0
  364. package/src/brand-page/utils/migration.util.test.ts +146 -32
  365. package/src/brand-page/utils/migration.util.ts +18 -0
  366. package/src/brand-page/utils/model.util.ts +4 -0
  367. package/src/brand-page/utils/personalisation.util.test.ts +148 -3
  368. package/src/brand-page/utils/personalisation.util.ts +9 -1
  369. package/src/brand-page/utils/rte-role-lift.util.ts +409 -0
  370. package/src/brand-page/utils/style.util.test.ts +35 -2
  371. package/src/brand-page/utils/style.util.ts +45 -11
  372. package/src/brand-page/utils/text-role-css.util.test.ts +525 -0
  373. package/src/brand-page/utils/text-role-css.util.ts +321 -0
  374. package/src/brand-page/utils/text-role-reconnect.util.test.ts +604 -0
  375. package/src/brand-page/utils/text-role-reconnect.util.ts +727 -0
  376. package/src/brand-page/utils/text-style.util.test.ts +305 -0
  377. package/src/brand-page/utils/text-style.util.ts +198 -24
  378. package/src/brand-page/utils/view-model.page-data.test.ts +232 -0
  379. package/src/brand-page/utils/view-model.util.test.ts +954 -133
  380. package/src/brand-page/utils/view-model.util.ts +187 -139
  381. package/src/brand-page/view-models.ts +4 -0
  382. package/src/brand-page-maker/components/brand-page-maker/BrandPageMaker.blank-site.test.ts +57 -0
  383. package/src/brand-page-maker/components/brand-page-maker/BrandPageMaker.mixin.ts +9 -5
  384. package/src/brand-page-maker/components/brand-page-maker/__fixtures__/brand-page-examples.ts +0 -10
  385. package/src/brand-page-maker/components/brand-page-maker/__fixtures__/content-settings-items.fixture.ts +0 -1
  386. package/src/brand-page-maker/components/brandpage-maker-page/BrandPageMakerPage.mixin.ts +0 -44
  387. package/src/brand-page-maker/components/rich-text-editor/RichTextEditor.vue +253 -200
  388. package/src/brand-page-maker/composables/ai-chat/ai-builder-experiment.test.ts +82 -0
  389. package/src/brand-page-maker/composables/ai-chat/ai-builder-experiment.ts +19 -0
  390. package/src/brand-page-maker/composables/ai-chat/useAiMetadataBuilder.ts +2 -0
  391. package/src/brand-page-maker/composables/ai-chat/useAiWebsiteBuilderChat.ts +19 -0
  392. package/src/brand-page-maker/composables/rich-text-editor/block-typography.test.ts +519 -0
  393. package/src/brand-page-maker/composables/rich-text-editor/extensions/FontFamily.test.ts +1 -1
  394. package/src/brand-page-maker/composables/rich-text-editor/extensions/MaxLength.test.ts +26 -1
  395. package/src/brand-page-maker/composables/rich-text-editor/extensions/RoleTypographyFill.test.ts +110 -0
  396. package/src/brand-page-maker/composables/rich-text-editor/extensions/RoleTypographyFill.ts +99 -0
  397. package/src/brand-page-maker/composables/rich-text-editor/extensions/RteClipboard.ts +397 -0
  398. package/src/brand-page-maker/composables/rich-text-editor/extensions/ViewDomParser.test.ts +139 -0
  399. package/src/brand-page-maker/composables/rich-text-editor/font.ts +36 -5
  400. package/src/brand-page-maker/composables/rich-text-editor/formatting.test.ts +375 -1
  401. package/src/brand-page-maker/composables/rich-text-editor/formatting.ts +301 -17
  402. package/src/brand-page-maker/composables/rich-text-editor/hyperlink.test.ts +82 -1
  403. package/src/brand-page-maker/composables/rich-text-editor/hyperlink.ts +28 -34
  404. package/src/brand-page-maker/composables/rich-text-editor/keepMarksOnEmpty.test.ts +80 -0
  405. package/src/brand-page-maker/composables/rich-text-editor/keepMarksOnEmpty.ts +75 -0
  406. package/src/brand-page-maker/composables/rich-text-editor/spacing.ts +31 -6
  407. package/src/brand-page-maker/composables/rich-text-editor/useRichTextEditor.test.ts +2485 -0
  408. package/src/brand-page-maker/composables/rich-text-editor/useRichTextEditor.ts +435 -337
  409. package/src/brand-page-maker/constants/config-settings-constant.ts +0 -6
  410. package/src/brand-page-maker/convertors/text-css-style-options.convertor.test.ts +43 -0
  411. package/src/brand-page-maker/convertors/text-css-style-options.convertor.ts +6 -2
  412. package/src/brand-page-maker/convertors/text-size-value.convertor.test.ts +24 -0
  413. package/src/brand-page-maker/convertors/text-size-value.convertor.ts +17 -13
  414. package/src/brand-page-maker/default-getters/payment-text-and-border-color.default-getter.ts +7 -22
  415. package/src/brand-page-maker/default-getters/text-color.default-getter.ts +5 -21
  416. package/src/brand-page-maker/models/content-settings.test.ts +708 -0
  417. package/src/brand-page-maker/models/content-settings.ts +133 -82
  418. package/src/brand-page-maker/stores/admin-logo-settings/admin-logo-settings-store-utils.test.ts +63 -1
  419. package/src/brand-page-maker/stores/admin-logo-settings/admin-logo-settings-store-utils.ts +16 -3
  420. package/src/brand-page-maker/stores/admin-logo-settings/admin-logo-settings-store.test.ts +34 -0
  421. package/src/brand-page-maker/stores/admin-logo-settings/admin-logo-settings-store.ts +4 -2
  422. package/src/brand-page-maker/stores/ai-thread/ai-website-builder-thread-store.ts +30 -0
  423. package/src/brand-page-maker/stores/brandpage-maker/brandpage-maker-store.test.ts +185 -1
  424. package/src/brand-page-maker/stores/brandpage-maker/brandpage-maker-store.ts +22 -34
  425. package/src/brand-page-maker/stores/history/history-store.ts +35 -2
  426. package/src/brand-page-maker/utils/__snapshots__/apply-color-strategy.golden.test.ts.snap +528 -0
  427. package/src/brand-page-maker/utils/__snapshots__/rte-render-parity.test.ts.snap +12 -0
  428. package/src/brand-page-maker/utils/apply-color-strategy.golden.test.ts +2 -0
  429. package/src/brand-page-maker/utils/apply-color-strategy.test.ts +181 -3
  430. package/src/brand-page-maker/utils/apply-color-strategy.ts +36 -4
  431. package/src/brand-page-maker/utils/index.ts +2 -1
  432. package/src/brand-page-maker/utils/rich-text-editor.util.test.ts +447 -410
  433. package/src/brand-page-maker/utils/rich-text-editor.util.ts +610 -506
  434. package/src/brand-page-maker/utils/rte-authoring.util.test.ts +244 -0
  435. package/src/brand-page-maker/utils/rte-authoring.util.ts +175 -0
  436. package/src/brand-page-maker/utils/rte-clipboard.util.test.ts +558 -0
  437. package/src/brand-page-maker/utils/rte-clipboard.util.ts +473 -0
  438. package/src/brand-page-maker/utils/rte-features.test.ts +99 -3
  439. package/src/brand-page-maker/utils/rte-render-parity.test.ts +1 -1
  440. package/src/brand-page-maker/utils/rte-render.util.test.ts +230 -0
  441. package/src/brand-page-maker/utils/rte-sanitize-json.test.ts +1 -1
  442. package/src/brand-page-maker/utils/rte-sanitize.util.ts +14 -3
  443. package/src/brand-page-maker/utils/rte-schema-version.test.ts +102 -0
  444. package/src/bundles/bundled-translations.de-DE.json +21 -2
  445. package/src/bundles/bundled-translations.es-ES.json +21 -2
  446. package/src/bundles/bundled-translations.fr-CA.json +21 -2
  447. package/src/bundles/bundled-translations.fr-FR.json +21 -2
  448. package/src/bundles/bundled-translations.json +21 -2
  449. package/src/bundles/bundled-translations.pt-BR.json +21 -2
  450. package/src/bundles/bundled-translations.pt-PT.json +21 -2
  451. package/src/clients/ai-assistant-client.ts +13 -18
  452. package/src/composables/useTranslate.ts +2 -1
  453. package/src/lib.ts +2 -2
  454. package/src/metadata-builder/builders/footer-builder.test.ts +70 -45
  455. package/src/metadata-builder/builders/footer-builder.ts +4 -8
  456. package/src/metadata-builder/builders/global-role-propagation.test.ts +907 -0
  457. package/src/metadata-builder/builders/global-role-propagation.ts +430 -0
  458. package/src/metadata-builder/builders/global-styles-builder.test.ts +1020 -0
  459. package/src/metadata-builder/builders/global-styles-builder.ts +194 -48
  460. package/src/metadata-builder/builders/header-builder.test.ts +112 -40
  461. package/src/metadata-builder/builders/header-builder.ts +18 -8
  462. package/src/metadata-builder/builders/section-builders/about-section-builder.ts +5 -3
  463. package/src/metadata-builder/builders/section-builders/banner-section-builder.ts +5 -3
  464. package/src/metadata-builder/builders/section-builders/booking-section-builder.ts +5 -3
  465. package/src/metadata-builder/builders/section-builders/contact-form-builder.ts +7 -4
  466. package/src/metadata-builder/builders/section-builders/images-section-builder.ts +5 -3
  467. package/src/metadata-builder/builders/section-builders/mailing-list-builder.ts +3 -2
  468. package/src/metadata-builder/builders/section-builders/mailing-list-section-builder.ts +3 -2
  469. package/src/metadata-builder/builders/section-builders/profile-section-builder.ts +7 -7
  470. package/src/metadata-builder/builders/section-builders/shapes-section-builder.ts +5 -3
  471. package/src/metadata-builder/builders/section-builders/social-links-builder.test.ts +2 -2
  472. package/src/metadata-builder/builders/section-builders/social-links-builder.ts +21 -10
  473. package/src/metadata-builder/builders/section-builders/support-me-builder.test.ts +10 -0
  474. package/src/metadata-builder/builders/section-builders/testimonial-section-builder.ts +3 -2
  475. package/src/metadata-builder/builders/section-builders/text-section-builder.ts +111 -61
  476. package/src/metadata-builder/builders/section-field-maps.ts +1 -0
  477. package/src/metadata-builder/builders/section-field-utils.test.ts +545 -2
  478. package/src/metadata-builder/builders/section-field-utils.ts +202 -69
  479. package/src/metadata-builder/builders/section-rules/global-styles.rules.ts +38 -13
  480. package/src/metadata-builder/builders/section-rules/social-links.rules.ts +5 -0
  481. package/src/metadata-builder/helpers/rte.helpers.test.ts +101 -0
  482. package/src/metadata-builder/helpers/rte.helpers.ts +129 -43
  483. package/src/metadata-builder/metadata-executor.test.ts +167 -0
  484. package/src/metadata-builder/metadata-executor.ts +34 -1
  485. package/src/metadata-builder/models.ts +2 -0
  486. package/src/metadata-builder/parsers/ai-toolcall-parser.ts +23 -7
  487. package/src/metadata-builder/parsers/section-tool-arguments.ts +21 -1
  488. package/src/metadata-builder/sanitizers/__tests__/section-args-validator.test.ts +215 -0
  489. package/src/metadata-builder/sanitizers/rte-schema-check.ts +1 -1
  490. package/src/metadata-builder/sanitizers/sanitizer-rules.ts +4 -8
  491. package/src/metadata-builder/sanitizers/section-args-validator.ts +136 -53
  492. package/src/shared/color-palette/section-color-matches.test.ts +15 -11
  493. package/src/shared/color-palette/section-color-matches.ts +9 -28
  494. package/src/shared/color-strategies/color-strategies.ts +35 -0
  495. package/src/shared/color-strategies/rte-color.test.ts +1 -1
  496. package/src/shared/color-strategies/rte-color.ts +19 -0
  497. package/src/shared/color-strategies/rte-field-pairs.test.ts +26 -5
  498. package/src/shared/color-strategies/rte-field-pairs.ts +33 -0
  499. package/src/shared/content-settings/components/color-matches-panel/ColorMatchesPanel.test.ts +43 -66
  500. package/src/shared/content-settings/components/color-matches-panel/ColorMatchesPanel.vue +7 -1
  501. package/src/shared/content-settings/components/content-settings/ContentSettings.mixin.ts +1 -48
  502. package/src/shared/content-settings/components/content-settings-item/ContentSettingsItemField.mixin.ts +33 -7
  503. package/src/shared/content-settings/components/content-settings-item/ContentSettingsItemField.test.ts +128 -1
  504. package/src/shared/content-settings/components/focused-content-item-settings/FocusedContentItemSettings.mixin.ts +0 -6
  505. package/src/shared/content-settings/components/text-items-field/TextItemsField.mixin.test.ts +56 -3
  506. package/src/shared/content-settings/components/text-items-field/TextItemsField.mixin.ts +11 -4
  507. package/src/shared/content-settings/components/text-style-field/TextStyleField.mixin.test.ts +335 -25
  508. package/src/shared/content-settings/components/text-style-field/TextStyleField.mixin.ts +248 -70
  509. package/src/shared/content-settings/components/text-style-field/TextStyleField.vue +113 -25
  510. package/src/shared/content-settings/components/text-style-field/i18n/text-style-field.de-DE.json +17 -10
  511. package/src/shared/content-settings/components/text-style-field/i18n/text-style-field.es-ES.json +17 -10
  512. package/src/shared/content-settings/components/text-style-field/i18n/text-style-field.fr-CA.json +17 -10
  513. package/src/shared/content-settings/components/text-style-field/i18n/text-style-field.fr-FR.json +17 -10
  514. package/src/shared/content-settings/components/text-style-field/i18n/text-style-field.json +8 -1
  515. package/src/shared/content-settings/components/text-style-field/i18n/text-style-field.pt-BR.json +17 -10
  516. package/src/shared/content-settings/components/text-style-field/i18n/text-style-field.pt-PT.json +17 -10
  517. package/src/shared/content-settings/components/text-style-role-dropdown/TextStyleRoleDropdown.test.ts +141 -0
  518. package/src/shared/content-settings/components/text-style-role-dropdown/TextStyleRoleDropdown.vue +136 -0
  519. package/src/shared/content-settings/store/content-settings-store.test.ts +491 -6
  520. package/src/shared/content-settings/store/content-settings-store.ts +159 -17
  521. package/src/shared/navigation-style-settings/store/index.test.ts +295 -0
  522. package/src/shared/navigation-style-settings/store/index.ts +65 -15
  523. package/src/shared/page-settings/components/page-settings-section-styles/HeaderButtonSettings.test.ts +44 -4
  524. package/src/shared/page-settings/components/page-settings-section-styles/HeaderButtonSettings.vue +13 -4
  525. package/src/shared/page-settings/components/page-settings-section-styles/PageSettingsSectionStyles.mixin.navigation.test.ts +89 -0
  526. package/src/shared/page-settings/components/page-settings-section-styles/PageSettingsSectionStyles.mixin.text-style.test.ts +91 -0
  527. package/src/shared/page-settings/components/page-settings-section-styles/PageSettingsSectionStyles.mixin.ts +14 -2
  528. package/src/shared/page-settings/store/page-settings-store.text-style.test.ts +84 -0
  529. package/src/shared/page-settings/store/page-settings-store.ts +30 -1
  530. package/src/shared/rte-extensions/AutoLink.test.ts +98 -0
  531. package/src/{brand-page-maker/composables/rich-text-editor/extensions → shared/rte-extensions}/AutoLink.ts +87 -58
  532. package/src/{brand-page-maker/composables/rich-text-editor/extensions → shared/rte-extensions}/MaxLength.ts +4 -1
  533. package/src/shared/rte-extensions/TextEffects.ts +151 -0
  534. package/src/shared/rte-extensions/ViewDomParser.ts +27 -0
  535. package/src/{brand-page-maker/composables/rich-text-editor/getRteExtensions.ts → shared/rte-extensions.util.ts} +66 -9
  536. package/src/shared/rte-link.util.ts +2 -0
  537. package/src/shared/rte-render.util.ts +385 -0
  538. package/src/shared/rte-shape.util.ts +29 -0
  539. package/src/shared/side-bar/store/side-bar-store.test.ts +27 -1
  540. package/src/shared/side-bar/store/side-bar-store.ts +11 -0
  541. package/src/shared/style-settings/components/StyleSettings.mixin.ts +7 -3
  542. package/src/shared/style-settings/components/StyleSettings.test.ts +116 -0
  543. package/src/shared/style-settings/components/StyleSettings.vue +74 -25
  544. package/src/shared/style-settings/components/i18n/style-settings.de-DE.json +32 -20
  545. package/src/shared/style-settings/components/i18n/style-settings.es-ES.json +32 -20
  546. package/src/shared/style-settings/components/i18n/style-settings.fr-CA.json +32 -20
  547. package/src/shared/style-settings/components/i18n/style-settings.fr-FR.json +32 -20
  548. package/src/shared/style-settings/components/i18n/style-settings.json +13 -3
  549. package/src/shared/style-settings/components/i18n/style-settings.pt-BR.json +32 -20
  550. package/src/shared/style-settings/components/i18n/style-settings.pt-PT.json +32 -20
  551. package/src/shared/style-settings/components/text-style-options-settings-with-state/TextStyleOptionsSettingsWithState.vue +14 -34
  552. package/src/shared/style-settings/store/style-settings-store.ts +3 -49
  553. package/src/shared/style-settings/text-style-size-order.test.ts +76 -0
  554. package/src/shared/style-settings/text-style-size-order.ts +28 -0
  555. package/src/shared/text-role-typography.util.ts +277 -0
  556. package/src/utils/minify-brand-page-metadata.test.ts +102 -7
  557. package/src/utils/minify-brand-page-metadata.ts +62 -8
  558. package/lib/src/brand-page-maker/composables/rich-text-editor/extensions/AutoLink.d.ts +0 -2
  559. package/lib/src/brand-page-maker/composables/rich-text-editor/getRteExtensions.d.ts +0 -28
  560. package/lib/src/brand-page-maker/utils/rte-render.util.d.ts +0 -63
  561. package/lib/src/brand-page-maker/utils/rte-render.util.js +0 -106
  562. package/lib/src/brand-page-maker/utils/rte-shape.d.ts +0 -18
  563. package/lib/src/brand-page-maker/utils/rte-shape.js +0 -21
  564. package/lib/src/metadata-builder/builders/global-font-propagation.d.ts +0 -41
  565. package/lib/src/metadata-builder/builders/global-font-propagation.js +0 -146
  566. package/src/brand-page/models/brand-page-context.model.test.ts +0 -38
  567. package/src/brand-page-maker/utils/rte-render.util.ts +0 -179
  568. package/src/brand-page-maker/utils/rte-shape.ts +0 -29
  569. package/src/clients/ai-assistant-client.test.ts +0 -135
  570. package/src/metadata-builder/builders/global-font-propagation.test.ts +0 -401
  571. package/src/metadata-builder/builders/global-font-propagation.ts +0 -238
  572. package/src/shared/style-settings/components/StyleSettingsSection.vue +0 -8
  573. /package/lib/src/{brand-page-maker/composables/rich-text-editor/extensions → shared/rte-extensions}/FontFamily.d.ts +0 -0
  574. /package/lib/src/{brand-page-maker/composables/rich-text-editor/extensions → shared/rte-extensions}/FontFamily.js +0 -0
  575. /package/lib/src/{brand-page-maker/composables/rich-text-editor/extensions → shared/rte-extensions}/LetterSpacing.d.ts +0 -0
  576. /package/lib/src/{brand-page-maker/composables/rich-text-editor/extensions → shared/rte-extensions}/LetterSpacing.js +0 -0
  577. /package/lib/src/{brand-page-maker/composables/rich-text-editor/extensions → shared/rte-extensions}/MaxLength.d.ts +0 -0
  578. /package/src/{brand-page-maker/composables/rich-text-editor/extensions → shared/rte-extensions}/FontFamily.ts +0 -0
  579. /package/src/{brand-page-maker/composables/rich-text-editor/extensions → shared/rte-extensions}/LetterSpacing.ts +0 -0
@@ -70,6 +70,13 @@ declare const _default: import("vue").DefineComponent<import("vue").ExtractPropT
70
70
  isVariation: boolean;
71
71
  isExcluded: boolean;
72
72
  } | undefined;
73
+ bp_6136_v2_ai_builder?: {
74
+ key: string;
75
+ value: string;
76
+ isControl: boolean;
77
+ isVariation: boolean;
78
+ isExcluded: boolean;
79
+ } | undefined;
73
80
  }>;
74
81
  brandPageType: import("vue").ComputedRef<"default" | "brandSite" | "brandContact">;
75
82
  isSubsequentPublish: import("vue").ComputedRef<boolean>;
@@ -125,6 +132,9 @@ declare const _default: import("vue").DefineComponent<import("vue").ExtractPropT
125
132
  setHideBranding(payload: {
126
133
  hideBranding: boolean;
127
134
  }): void;
135
+ setSaveContactButtonTextStyle(payload: {
136
+ buttonTextStyle: import("../../brand-page").SaveContactOptions["buttonTextStyle"];
137
+ }): void;
128
138
  setSensitiveContent(payload: {
129
139
  sensitiveContent: string;
130
140
  }): void;
@@ -187,7 +197,7 @@ declare const _default: import("vue").DefineComponent<import("vue").ExtractPropT
187
197
  brandPageType: import("../../brand-page").BrandPageType;
188
198
  }): void;
189
199
  initialiseStoresByBrandPageModelAsync(brandPageModel: import("../../brand-page").BrandPageModel): Promise<void>;
190
- initialise({ brandPage, brandPageType, logoDraftDesignAttributes, unsplashApplicationName, templateCategories, personalisationData, isPersonalisationEnabled, userPromptContentKey, showAiTemplatesTab, businessName, industry, layout, logoVariationImageUrls, shopConfigData: _shopConfigData, isServerRenderOverride, }: import("@brand-page-maker/stores").InitialisePayload): Promise<void>;
200
+ initialise({ brandPage, brandPageType, logoDraftDesignAttributes, unsplashApplicationName, templateCategories, personalisationData, isPersonalisationEnabled, userPromptContentKey, showAiTemplatesTab, businessName, industry, layout, logoVariationImageUrls, shopConfigData: _shopConfigData, isServerRenderOverride, isBlankSite, }: import("@brand-page-maker/stores").InitialisePayload): Promise<void>;
191
201
  initialisePages({ pages, sections, }: {
192
202
  pages: import("../../brand-page").PageModel[];
193
203
  sections: import("../page-settings/store").PageSettingsStateSections;
@@ -287,6 +297,13 @@ declare const _default: import("vue").DefineComponent<import("vue").ExtractPropT
287
297
  isVariation: boolean;
288
298
  isExcluded: boolean;
289
299
  } | undefined;
300
+ bp_6136_v2_ai_builder?: {
301
+ key: string;
302
+ value: string;
303
+ isControl: boolean;
304
+ isVariation: boolean;
305
+ isExcluded: boolean;
306
+ } | undefined;
290
307
  };
291
308
  isSubsequentPublish: boolean;
292
309
  isContextualUpgradeModalVisible: boolean;
@@ -362,6 +379,13 @@ declare const _default: import("vue").DefineComponent<import("vue").ExtractPropT
362
379
  isVariation: boolean;
363
380
  isExcluded: boolean;
364
381
  } | undefined;
382
+ bp_6136_v2_ai_builder?: {
383
+ key: string;
384
+ value: string;
385
+ isControl: boolean;
386
+ isVariation: boolean;
387
+ isExcluded: boolean;
388
+ } | undefined;
365
389
  };
366
390
  isSubsequentPublish: boolean;
367
391
  isContextualUpgradeModalVisible: boolean;
@@ -437,6 +461,13 @@ declare const _default: import("vue").DefineComponent<import("vue").ExtractPropT
437
461
  isVariation: boolean;
438
462
  isExcluded: boolean;
439
463
  } | undefined;
464
+ bp_6136_v2_ai_builder?: {
465
+ key: string;
466
+ value: string;
467
+ isControl: boolean;
468
+ isVariation: boolean;
469
+ isExcluded: boolean;
470
+ } | undefined;
440
471
  };
441
472
  isSubsequentPublish: boolean;
442
473
  isContextualUpgradeModalVisible: boolean;
@@ -0,0 +1,17 @@
1
+ import { Extension } from '@tiptap/core';
2
+ import type { EditorState } from 'prosemirror-state';
3
+ import type { Mark } from 'prosemirror-model';
4
+ /** A transaction carrying this meta skips the new-link styling pass below: a clipboard paste
5
+ * brings its own look (a copied link keeps its colour; a text-only paste brings no links), so
6
+ * neither wants AutoLink's "force blue + underline" treatment for a newly-created link. */
7
+ export declare const AUTO_LINK_SKIP_STYLING_META = "autoLinkSkipStyling";
8
+ /**
9
+ * The end-of-link detach a typed character gets right after a link's last position: the link
10
+ * mark (and its auto-blue colour, unless the user manually added an underline) drops from what
11
+ * comes next, so continuing to type doesn't extend the link. `null` when `pos` isn't at the end
12
+ * of a link — mid-link, or no link at all — so the caller keeps its own marks unchanged.
13
+ * Exported for `RteClipboard.ts`'s text-only paste, which takes the same detach a typed
14
+ * character would.
15
+ */
16
+ export declare const linkDetachMarksAt: (state: EditorState, pos: number) => Mark[] | null;
17
+ export declare const AutoLink: Extension<any, any>;
@@ -1,6 +1,10 @@
1
1
  import { Extension } from '@tiptap/core';
2
2
  import { Plugin, PluginKey } from 'prosemirror-state';
3
3
  import { DEFAULT_LINK_COLOR as LINK_COLOR } from '@src/constants/rich-text-editor.constants';
4
+ /** A transaction carrying this meta skips the new-link styling pass below: a clipboard paste
5
+ * brings its own look (a copied link keeps its colour; a text-only paste brings no links), so
6
+ * neither wants AutoLink's "force blue + underline" treatment for a newly-created link. */
7
+ export const AUTO_LINK_SKIP_STYLING_META = 'autoLinkSkipStyling';
4
8
  const isLinkMark = (mark) => mark.type.name === 'link';
5
9
  const isUnderlineMark = (mark) => mark.type.name === 'underline';
6
10
  const isTextStyleMark = (mark) => mark.type.name === 'textStyle';
@@ -38,6 +42,45 @@ const applyDefaultLinkStyling = (tr, schema, node, pos) => {
38
42
  }
39
43
  return modified;
40
44
  };
45
+ /**
46
+ * The end-of-link detach a typed character gets right after a link's last position: the link
47
+ * mark (and its auto-blue colour, unless the user manually added an underline) drops from what
48
+ * comes next, so continuing to type doesn't extend the link. `null` when `pos` isn't at the end
49
+ * of a link — mid-link, or no link at all — so the caller keeps its own marks unchanged.
50
+ * Exported for `RteClipboard.ts`'s text-only paste, which takes the same detach a typed
51
+ * character would.
52
+ */
53
+ export const linkDetachMarksAt = (state, pos) => {
54
+ const currentMarks = state.doc.resolve(pos).marks();
55
+ const linkMark = currentMarks.find(isLinkMark);
56
+ if (!linkMark)
57
+ return null;
58
+ const nextPos = pos + 1;
59
+ const hasLinkAfter = nextPos <= state.doc.content.size &&
60
+ state.doc
61
+ .resolve(Math.min(nextPos, state.doc.content.size))
62
+ .marks()
63
+ .some((mark) => isLinkMark(mark) && mark.eq(linkMark));
64
+ if (hasLinkAfter)
65
+ return null;
66
+ return currentMarks
67
+ .filter((mark) => {
68
+ if (isLinkMark(mark))
69
+ return false;
70
+ // Only preserve underlines if there's no blue color (manually added underlines)
71
+ // Remove underlines that were part of link styling (with blue color)
72
+ if (isUnderlineMark(mark)) {
73
+ const hasBlueColor = currentMarks.some(isBlueColorMark);
74
+ return !hasBlueColor;
75
+ }
76
+ // Remove blue color styling but preserve other text styles
77
+ if (isBlueColorMark(mark)) {
78
+ return createStylesWithoutColor(state.schema, mark);
79
+ }
80
+ return true;
81
+ })
82
+ .filter(Boolean);
83
+ };
41
84
  const removeHyperlinkStyles = (tr, schema, node, pos) => {
42
85
  const range = { from: pos, to: pos + node.nodeSize };
43
86
  let modified = false;
@@ -70,52 +113,19 @@ export const AutoLink = Extension.create({
70
113
  props: {
71
114
  handleTextInput(view, from, to, text) {
72
115
  const { state } = view;
73
- const { selection } = state;
74
- const { $anchor } = selection;
75
116
  // Only handle when typing at a cursor position (from === to)
76
117
  if (from !== to) {
77
118
  return false;
78
119
  }
79
- // Check if we have link marks at cursor position
80
- const currentMarks = $anchor.marks();
81
- const linkMark = currentMarks.find(isLinkMark);
82
- if (linkMark) {
83
- // Check if we're at the end of the link
84
- const currentPos = $anchor.pos;
85
- const nextPos = currentPos + 1;
86
- const hasLinkAfter = nextPos <= state.doc.content.size &&
87
- state.doc
88
- .resolve(Math.min(nextPos, state.doc.content.size))
89
- .marks()
90
- .some((mark) => isLinkMark(mark) && mark.eq(linkMark));
91
- if (!hasLinkAfter) {
92
- // detach the link after the attached link mark
93
- const preservedMarks = currentMarks
94
- .filter((mark) => {
95
- if (isLinkMark(mark))
96
- return false;
97
- // Only preserve underlines if there's no blue color (manually added underlines)
98
- // Remove underlines that were part of link styling (with blue color)
99
- if (isUnderlineMark(mark)) {
100
- const hasBlueColor = currentMarks.some(isBlueColorMark);
101
- return !hasBlueColor; // Keep underline only if no blue color
102
- }
103
- // Remove blue color styling but preserve other text styles
104
- if (isBlueColorMark(mark)) {
105
- return createStylesWithoutColor(state.schema, mark);
106
- }
107
- return true;
108
- })
109
- .filter(Boolean); // Insert text with only preserved marks
110
- let tr = state.tr;
111
- tr = tr.setStoredMarks(preservedMarks);
112
- tr = tr.insertText(text, from, to);
113
- tr = tr.setMeta('autoLinkDetached', true);
114
- view.dispatch(tr);
115
- return true;
116
- }
117
- }
118
- return false;
120
+ const detached = linkDetachMarksAt(state, state.selection.$anchor.pos);
121
+ if (!detached)
122
+ return false;
123
+ let tr = state.tr;
124
+ tr = tr.setStoredMarks(detached);
125
+ tr = tr.insertText(text, from, to);
126
+ tr = tr.setMeta('autoLinkDetached', true);
127
+ view.dispatch(tr);
128
+ return true;
119
129
  },
120
130
  },
121
131
  appendTransaction(transactions, oldState, newState) {
@@ -125,24 +135,30 @@ export const AutoLink = Extension.create({
125
135
  if (!hasDocChanges)
126
136
  return null;
127
137
  const wasDetached = transactions.some((transaction) => transaction.getMeta('autoLinkDetached'));
128
- // Apply default styling to links (unless just detached)
129
- if (!wasDetached) {
138
+ const skipsNewLinkStyling = transactions.some((transaction) => transaction.getMeta(AUTO_LINK_SKIP_STYLING_META));
139
+ // Apply default styling to links (unless just detached, or the transaction brings its
140
+ // own look — a clipboard paste)
141
+ if (!wasDetached && !skipsNewLinkStyling) {
142
+ // A link is new when its text wasn't a link before these transactions. Map each
143
+ // position back through them: an edit earlier in the doc shifts every later link, so
144
+ // the same raw position in the old doc lands on other text.
145
+ const toOldPos = transactions
146
+ .map((transaction) => transaction.mapping.invert())
147
+ .reverse();
130
148
  newState.doc.descendants((node, pos) => {
131
149
  if (!node.isText || !node.text || !hasLinkMark(node.marks))
132
150
  return;
133
- // Check if this is a newly created link by comparing with old state
134
- const oldNode = pos < oldState.doc.nodeSize ? oldState.doc.nodeAt(pos) : null;
151
+ const oldPos = toOldPos.reduce((mapped, mapping) => mapping.map(mapped, 1), pos);
152
+ const oldNode = oldPos < oldState.doc.content.size
153
+ ? oldState.doc.nodeAt(oldPos)
154
+ : null;
135
155
  const wasAlreadyLink = oldNode && hasLinkMark(oldNode.marks);
136
- // Only apply full styling (including underline) to newly created links
156
+ // An existing link keeps the colour and underline it has now.
137
157
  if (wasAlreadyLink === false) {
138
158
  if (applyDefaultLinkStyling(tr, newState.schema, node, pos)) {
139
159
  modified = true;
140
160
  }
141
161
  }
142
- else {
143
- // For existing links, preserve their current color and underline choices
144
- // Don't override user customizations on existing links
145
- }
146
162
  });
147
163
  }
148
164
  // Clean up hyperlink styling from text without link marks
@@ -18,7 +18,10 @@ export const MaxLength = Extension.create({
18
18
  const { maxLength } = this.options;
19
19
  const { state } = view;
20
20
  const { from, to } = view.state.selection;
21
- const selectionSize = to - from;
21
+ // The selected TEXT being replaced, not its position span: a selection crossing a
22
+ // paragraph boundary spans 2 extra positions (the closing/opening block nodes) that
23
+ // aren't characters.
24
+ const selectionSize = state.doc.textBetween(from, to).length;
22
25
  const currentTextLength = state.doc.textContent.length - selectionSize;
23
26
  const incomingText = slice.content.textBetween(0, slice.content.size, '\n');
24
27
  const allowed = maxLength - currentTextLength;
@@ -0,0 +1,28 @@
1
+ import { Extension } from '@tiptap/core';
2
+ export type TextEffectsOptions = {
3
+ types: string[];
4
+ renderTextDecorationClasses?: boolean;
5
+ };
6
+ declare module '@tiptap/core' {
7
+ interface Commands<ReturnType> {
8
+ textEffects: {
9
+ setFontWeight: (value: string) => ReturnType;
10
+ unsetFontWeight: () => ReturnType;
11
+ setFontStyle: (value: string) => ReturnType;
12
+ unsetFontStyle: () => ReturnType;
13
+ setTextDecoration: (value: string) => ReturnType;
14
+ unsetTextDecoration: () => ReturnType;
15
+ };
16
+ }
17
+ }
18
+ /**
19
+ * BP-5969 — weight / style / decoration as `textStyle` mark ATTRIBUTES, not semantic marks.
20
+ *
21
+ * Every typography property now lives on the run's `textStyle` mark, each defaulting to its role
22
+ * `var(--role-*)` (or a raw override) — identical to family/size/line-height/letter-spacing. So
23
+ * editing a role's font-weight / font-style / text-decoration changes one CSS custom-property
24
+ * declaration and repaints every linked run through the cascade, with no doc rewrite. (The
25
+ * container applies nothing, so a per-run `font-weight: normal` / `text-decoration: none` override
26
+ * cleanly wins — the reason these can leave the semantic `<strong>`/`<u>` model.)
27
+ */
28
+ export declare const TextEffects: Extension<TextEffectsOptions, any>;
@@ -0,0 +1,96 @@
1
+ import { Extension } from '@tiptap/core';
2
+ import { composeTextDecoration, roleVarRef, rteTextDecorationClassName, } from '@shared/text-role-typography.util';
3
+ /**
4
+ * BP-5969 — weight / style / decoration as `textStyle` mark ATTRIBUTES, not semantic marks.
5
+ *
6
+ * Every typography property now lives on the run's `textStyle` mark, each defaulting to its role
7
+ * `var(--role-*)` (or a raw override) — identical to family/size/line-height/letter-spacing. So
8
+ * editing a role's font-weight / font-style / text-decoration changes one CSS custom-property
9
+ * declaration and repaints every linked run through the cascade, with no doc rewrite. (The
10
+ * container applies nothing, so a per-run `font-weight: normal` / `text-decoration: none` override
11
+ * cleanly wins — the reason these can leave the semantic `<strong>`/`<u>` model.)
12
+ */
13
+ export const TextEffects = Extension.create({
14
+ name: 'textEffects',
15
+ addOptions() {
16
+ return {
17
+ types: ['textStyle'],
18
+ renderTextDecorationClasses: false,
19
+ };
20
+ },
21
+ addGlobalAttributes() {
22
+ return [
23
+ {
24
+ types: this.options.types,
25
+ attributes: {
26
+ fontWeight: {
27
+ default: null,
28
+ parseHTML: (element) => element.style.fontWeight || null,
29
+ renderHTML: (attributes) => attributes.fontWeight
30
+ ? { style: `font-weight: ${attributes.fontWeight}` }
31
+ : {},
32
+ },
33
+ fontStyle: {
34
+ default: null,
35
+ parseHTML: (element) => element.style.fontStyle || null,
36
+ renderHTML: (attributes) => attributes.fontStyle
37
+ ? { style: `font-style: ${attributes.fontStyle}` }
38
+ : {},
39
+ },
40
+ textDecoration: {
41
+ default: null,
42
+ parseHTML: (element) => element.style.textDecoration || null,
43
+ renderHTML: (attributes) => {
44
+ if (!attributes.textDecoration)
45
+ return {};
46
+ const className = this.options.renderTextDecorationClasses
47
+ ? rteTextDecorationClassName(attributes.textDecoration, attributes.textDecorationReset === true)
48
+ : undefined;
49
+ if (this.options.renderTextDecorationClasses)
50
+ return className ? { class: className } : {};
51
+ const value = attributes.textDecoration === roleVarRef('textDecoration')
52
+ ? attributes.textDecoration
53
+ : composeTextDecoration(undefined, attributes.textDecoration);
54
+ return value ? { style: `text-decoration: ${value}` } : {};
55
+ },
56
+ },
57
+ textDecorationReset: {
58
+ default: null,
59
+ parseHTML: (element) => element.getAttribute('data-bp-text-decoration-reset') === 'true'
60
+ ? true
61
+ : null,
62
+ renderHTML: (attributes) => attributes.textDecorationReset
63
+ ? { 'data-bp-text-decoration-reset': 'true' }
64
+ : {},
65
+ },
66
+ },
67
+ },
68
+ ];
69
+ },
70
+ addCommands() {
71
+ return {
72
+ setFontWeight: (fontWeight) => ({ chain }) => chain().setMark('textStyle', { fontWeight }).run(),
73
+ unsetFontWeight: () => ({ chain }) => chain()
74
+ .setMark('textStyle', { fontWeight: null })
75
+ .removeEmptyTextStyle()
76
+ .run(),
77
+ setFontStyle: (fontStyle) => ({ chain }) => chain().setMark('textStyle', { fontStyle }).run(),
78
+ unsetFontStyle: () => ({ chain }) => chain()
79
+ .setMark('textStyle', { fontStyle: null })
80
+ .removeEmptyTextStyle()
81
+ .run(),
82
+ // A reset marker qualifies only the value it was written with; setMark merges attrs, so a
83
+ // new value must clear it or the run would drop its role's lines.
84
+ setTextDecoration: (textDecoration) => ({ chain }) => chain()
85
+ .setMark('textStyle', { textDecoration, textDecorationReset: null })
86
+ .run(),
87
+ unsetTextDecoration: () => ({ chain }) => chain()
88
+ .setMark('textStyle', {
89
+ textDecoration: null,
90
+ textDecorationReset: null,
91
+ })
92
+ .removeEmptyTextStyle()
93
+ .run(),
94
+ };
95
+ },
96
+ });
@@ -0,0 +1,2 @@
1
+ import { Extension } from '@tiptap/core';
2
+ export declare const ViewDomParser: Extension<any, any>;
@@ -0,0 +1,21 @@
1
+ import { Extension } from '@tiptap/core';
2
+ import { DOMParser } from 'prosemirror-model';
3
+ import { Plugin, PluginKey } from 'prosemirror-state';
4
+ // The legacy bold/italic/underline/strike style rules misread the textStyle span's own styles on the
5
+ // per-keystroke DOM read-back, so the whole run is retyped with the armed format — see
6
+ // rich-text-editor.md. Paste keeps them: foreign HTML may carry bold only as a style.
7
+ export const ViewDomParser = Extension.create({
8
+ name: 'viewDomParser',
9
+ addProseMirrorPlugins() {
10
+ const schemaParser = DOMParser.fromSchema(this.editor.schema);
11
+ return [
12
+ new Plugin({
13
+ key: new PluginKey('viewDomParser'),
14
+ props: {
15
+ domParser: new DOMParser(this.editor.schema, schemaParser.rules.filter((rule) => 'tag' in rule)),
16
+ clipboardParser: schemaParser,
17
+ },
18
+ }),
19
+ ];
20
+ },
21
+ });
@@ -0,0 +1,25 @@
1
+ import type { Extensions } from '@tiptap/vue-3';
2
+ /**
3
+ * The schema generation a requested version resolves to: the highest change point at or below it
4
+ * (0 = the base schema). `undefined` = latest → the newest generation. So versions in the same
5
+ * range share one schema — asking for 5 or 20 both give the base — and callers cache one built
6
+ * schema per generation rather than per exact number.
7
+ */
8
+ export declare const rteSchemaGeneration: (schemaVersion?: number) => number;
9
+ export interface RteExtensionOptions {
10
+ /** Disable StarterKit nodes the editor doesn't use (lists, hr, code). */
11
+ restrictStarterKit?: boolean;
12
+ /** When present, add the live-editing-only plugins (Placeholder, MaxLength, ViewDomParser). */
13
+ editing?: {
14
+ placeholder?: string;
15
+ maxLength?: number;
16
+ };
17
+ /**
18
+ * Pin the schema to a model version's extension set. A migration passes its own version so the
19
+ * parse reproduces that era's schema (see `rteSchemaGeneration`); omit for the latest (runtime).
20
+ */
21
+ schemaVersion?: number;
22
+ /** Render text-decoration marks as role-aware classes instead of inline styles. */
23
+ renderTextDecorationClasses?: boolean;
24
+ }
25
+ export declare const getRteExtensions: (options?: RteExtensionOptions) => Extensions;
@@ -6,13 +6,55 @@ import ColorExtension from '@tiptap/extension-color';
6
6
  import Highlight from '@tiptap/extension-highlight';
7
7
  import Placeholder from '@tiptap/extension-placeholder';
8
8
  import Link from '@tiptap/extension-link';
9
- import { FontFamily } from './extensions/FontFamily';
10
- import { LetterSpacing } from './extensions/LetterSpacing';
11
- import { MaxLength } from './extensions/MaxLength';
12
- import { AutoLink } from './extensions/AutoLink';
13
- import { isHrefPageId } from './hyperlink';
9
+ import { FontFamily } from './rte-extensions/FontFamily';
10
+ import { LetterSpacing } from './rte-extensions/LetterSpacing';
11
+ import { TextEffects } from './rte-extensions/TextEffects';
12
+ import { MaxLength } from './rte-extensions/MaxLength';
13
+ import { ViewDomParser } from './rte-extensions/ViewDomParser';
14
+ import { AutoLink } from './rte-extensions/AutoLink';
15
+ import { isHrefPageId } from './rte-link.util';
16
+ /**
17
+ * Single source of truth for the Tiptap extension set (BP-5787).
18
+ *
19
+ * The live editor, the headless serialiser (useExternalRichTextEditor), and
20
+ * the upcoming render-from-JSON path must all use the SAME extensions, or
21
+ * rendered output drifts from what the user authored. This factory removes the
22
+ * previous duplication while preserving each consumer's exact configuration.
23
+ *
24
+ * Known, intentional differences are parameterised:
25
+ * - `restrictStarterKit` — the live editor disables list/hr/code nodes.
26
+ * - `editing` — only the live editor carries the Placeholder, MaxLength and
27
+ * ViewDomParser plugins (none affects serialised output; they are editing-time only).
28
+ *
29
+ * Link target/rel are NOT parameterised: they are a pure function of the href
30
+ * applied in the Link mark's renderHTML (below), so every consumer — live
31
+ * editor, static renderer, schema check — emits identical link markup.
32
+ */
33
+ /**
34
+ * The RTE schema is piecewise-constant across model-version ranges: it only changes when an
35
+ * extension is added, so every version between two change points shares one schema. Today the one
36
+ * change point is v22 — where `TextEffects` (weight/style/decoration on the `textStyle` mark) was
37
+ * added — giving two generations: below 22 is the pre-BP-5969 schema, 22-and-later (and the latest)
38
+ * carries TextEffects. Add the next version here if the schema grows.
39
+ *
40
+ * MIGRATION-22 SNAPSHOT DEPENDENCY: B1 parses v21 plain RTE strings with generation 22, so the
41
+ * extensions' `parseHTML` rules shape its output. Pinning the generation does not freeze those rules;
42
+ * after migration-22 releases, pin them in the migration before changing them.
43
+ */
44
+ const RTE_SCHEMA_CHANGE_VERSIONS = [22];
45
+ /**
46
+ * The schema generation a requested version resolves to: the highest change point at or below it
47
+ * (0 = the base schema). `undefined` = latest → the newest generation. So versions in the same
48
+ * range share one schema — asking for 5 or 20 both give the base — and callers cache one built
49
+ * schema per generation rather than per exact number.
50
+ */
51
+ export const rteSchemaGeneration = (schemaVersion) => RTE_SCHEMA_CHANGE_VERSIONS.reduce((generation, changeVersion) =>
52
+ // undefined = latest → reaches every change point → the newest generation.
53
+ schemaVersion === undefined || schemaVersion >= changeVersion
54
+ ? changeVersion
55
+ : generation, 0);
14
56
  export const getRteExtensions = (options = {}) => {
15
- const { restrictStarterKit = false, editing } = options;
57
+ const { restrictStarterKit = false, editing, schemaVersion, renderTextDecorationClasses = false, } = options;
16
58
  const extensions = [
17
59
  // v3 StarterKit bundles Link + Underline; we register both separately (with
18
60
  // custom Link config), so disable the bundled copies to avoid duplicate
@@ -61,6 +103,19 @@ export const getRteExtensions = (options = {}) => {
61
103
  FontSize.configure({ types: ['textStyle'] }),
62
104
  LetterSpacing,
63
105
  LineHeight.configure({ types: ['textStyle'] }),
106
+ // BP-5969: weight / style / decoration as textStyle attrs (role var or literal override), so a
107
+ // role edit to any of them repaints linked RTE via the cascade — like family/size already do.
108
+ // TextEffects entered at v22 (RTE_SCHEMA_CHANGE_VERSIONS). Gated in place — not appended — so the
109
+ // latest schema's extension order is byte-unchanged; a parse resolving below 22 omits it,
110
+ // reproducing the pre-BP-5969 schema.
111
+ ...(rteSchemaGeneration(schemaVersion) >= 22
112
+ ? [
113
+ TextEffects.configure({
114
+ types: ['textStyle'],
115
+ renderTextDecorationClasses,
116
+ }),
117
+ ]
118
+ : []),
64
119
  ColorExtension.configure({
65
120
  types: ['textStyle'],
66
121
  }),
@@ -70,7 +125,7 @@ export const getRteExtensions = (options = {}) => {
70
125
  ];
71
126
  // Live-editing-only plugins sit between Highlight and Link (original order).
72
127
  if (editing) {
73
- extensions.push(Placeholder.configure({ placeholder: editing.placeholder }), MaxLength.configure({ maxLength: editing.maxLength }));
128
+ extensions.push(Placeholder.configure({ placeholder: editing.placeholder }), MaxLength.configure({ maxLength: editing.maxLength }), ViewDomParser);
74
129
  }
75
130
  extensions.push(Link.extend({
76
131
  // External-link policy lives at the serialisation boundary: target/rel are
@@ -0,0 +1 @@
1
+ export declare const isHrefPageId: (href: string) => boolean;
@@ -0,0 +1 @@
1
+ export const isHrefPageId = (href) => !!href && href.startsWith('pageid:');