@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.
- package/lib/src/{CreatedOnBrandCrowd-de-de-DDcraD5S.js → CreatedOnBrandCrowd-de-de-BtVKllNQ.js} +1 -1
- package/lib/src/{CreatedOnBrandCrowd-en-us-DtOeaisf.js → CreatedOnBrandCrowd-en-us-CX5V0v8u.js} +1 -1
- package/lib/src/{CreatedOnBrandCrowd-es-es-BZpmJPew.js → CreatedOnBrandCrowd-es-es-CbA02PCL.js} +1 -1
- package/lib/src/{CreatedOnBrandCrowd-fr-fr-CqRwC4e7.js → CreatedOnBrandCrowd-fr-ca-BQAKruBF.js} +1 -1
- package/lib/src/{CreatedOnBrandCrowd-fr-ca-CqRwC4e7.js → CreatedOnBrandCrowd-fr-fr-BQAKruBF.js} +1 -1
- package/lib/src/{CreatedOnBrandCrowd-pt-pt-DId9Dfjh.js → CreatedOnBrandCrowd-pt-br-Yk_yzB3s.js} +1 -1
- package/lib/src/{CreatedOnBrandCrowd-pt-br-DId9Dfjh.js → CreatedOnBrandCrowd-pt-pt-Yk_yzB3s.js} +1 -1
- package/lib/src/{CreatedOnDcom-de-de-BTDfmOcm.js → CreatedOnDcom-de-de-DJZQbPSD.js} +1 -1
- package/lib/src/{CreatedOnDcom-en-us-CeAu9Ayx.js → CreatedOnDcom-en-us-BJvNAa4l.js} +1 -1
- package/lib/src/{CreatedOnDcom-es-es-WCv0K41H.js → CreatedOnDcom-es-es-CUwB1FRY.js} +1 -1
- package/lib/src/{CreatedOnDcom-fr-ca-BlfevQDY.js → CreatedOnDcom-fr-ca-CK54U4oh.js} +1 -1
- package/lib/src/{CreatedOnDcom-fr-fr-Cvt7MHPZ.js → CreatedOnDcom-fr-fr-DuUNBGrM.js} +1 -1
- package/lib/src/{CreatedOnDcom-pt-br-DipZuylv.js → CreatedOnDcom-pt-br-BfODpFNV.js} +1 -1
- package/lib/src/{CreatedOnDcom-pt-pt-BCw4lcKN.js → CreatedOnDcom-pt-pt-Cf6u2GCg.js} +1 -1
- package/lib/src/brand-page/__fixtures__/production-text-style-resolver.fixture.d.ts +16 -0
- package/lib/src/brand-page/__fixtures__/production-text-style-resolver.fixture.js +35 -0
- package/lib/src/brand-page/components/contact-form/ContactForm.mixin.d.ts +3 -0
- package/lib/src/brand-page/components/contact-form/ContactForm.mixin.js +19 -13
- package/lib/src/brand-page/components/mailing-list/MailingList.mixin.d.ts +3 -1
- package/lib/src/brand-page/components/mailing-list/MailingList.mixin.js +17 -2
- package/lib/src/brand-page/components/navigation/button-carousel/ButtonCarouselNavigation.mixin.d.ts +11 -3
- package/lib/src/brand-page/components/navigation/button-carousel/ButtonCarouselNavigation.mixin.js +35 -1
- package/lib/src/brand-page/components/navigation/navigation-side-menu/NavigationSideMenu.mixin.d.ts +8 -2
- package/lib/src/brand-page/components/navigation/navigation-side-menu/NavigationSideMenu.mixin.js +27 -3
- package/lib/src/brand-page/components/page/Page.mixin.d.ts +5 -2
- package/lib/src/brand-page/components/page/Page.mixin.js +33 -27
- package/lib/src/brand-page/components/page-footer/PageFooter.mixin.d.ts +7 -2
- package/lib/src/brand-page/components/page-footer/PageFooter.mixin.js +21 -1
- package/lib/src/brand-page/components/payment/Payment.mixin.d.ts +5 -2
- package/lib/src/brand-page/components/payment/Payment.mixin.js +22 -2
- package/lib/src/brand-page/components/payment/support-me/SupportMe.mixin.d.ts +6 -2
- package/lib/src/brand-page/components/payment/support-me/SupportMe.mixin.js +32 -1
- package/lib/src/brand-page/components/social-links/SocialLinks.stories.js +0 -3
- package/lib/src/brand-page/components/testimonial-section/__fixtures__/data.js +0 -3
- package/lib/src/brand-page/components/text/Text.stories.js +0 -17
- package/lib/src/brand-page/constants/font.constants.d.ts +62 -0
- package/lib/src/brand-page/constants/font.constants.js +35 -0
- package/lib/src/brand-page/models/index.d.ts +23 -24
- package/lib/src/brand-page/models/index.js +20 -7
- package/lib/src/brand-page/models/navigation-styles.model.d.ts +1 -1
- package/lib/src/brand-page/models/navigation-styles.model.js +17 -8
- package/lib/src/brand-page/models/payment.model.d.ts +11 -6
- package/lib/src/brand-page/models/styles.model.d.ts +53 -7
- package/lib/src/brand-page/models/styles.model.js +115 -27
- package/lib/src/brand-page/utils/color-palette.util.d.ts +43 -23
- package/lib/src/brand-page/utils/color-palette.util.js +65 -27
- package/lib/src/brand-page/utils/color.util.d.ts +13 -9
- package/lib/src/brand-page/utils/color.util.js +56 -15
- package/lib/src/brand-page/utils/container-text-color.util.d.ts +46 -13
- package/lib/src/brand-page/utils/container-text-color.util.js +321 -41
- package/lib/src/brand-page/utils/index.d.ts +1 -0
- package/lib/src/brand-page/utils/index.js +1 -0
- package/lib/src/brand-page/utils/migration/migration-20.js +6 -2
- package/lib/src/brand-page/utils/migration/migration-21.js +34 -6
- package/lib/src/brand-page/utils/migration/migration-22.d.ts +99 -0
- package/lib/src/brand-page/utils/migration/migration-22.js +909 -0
- package/lib/src/brand-page/utils/migration.util.js +17 -0
- package/lib/src/brand-page/utils/model.util.d.ts +4 -0
- package/lib/src/brand-page/utils/model.util.js +4 -0
- package/lib/src/brand-page/utils/personalisation.util.js +9 -1
- package/lib/src/brand-page/utils/rte-role-lift.util.d.ts +72 -0
- package/lib/src/brand-page/utils/rte-role-lift.util.js +275 -0
- package/lib/src/brand-page/utils/style.util.d.ts +5 -1
- package/lib/src/brand-page/utils/style.util.js +34 -11
- package/lib/src/brand-page/utils/text-role-css.util.d.ts +19 -0
- package/lib/src/brand-page/utils/text-role-css.util.js +186 -0
- package/lib/src/brand-page/utils/text-role-reconnect.util.d.ts +90 -0
- package/lib/src/brand-page/utils/text-role-reconnect.util.js +434 -0
- package/lib/src/brand-page/utils/text-style.util.d.ts +53 -23
- package/lib/src/brand-page/utils/text-style.util.js +122 -22
- package/lib/src/brand-page/utils/view-model.util.d.ts +9 -1
- package/lib/src/brand-page/utils/view-model.util.js +124 -111
- package/lib/src/brand-page/view-models.d.ts +1 -0
- package/lib/src/brand-page-maker/components/action-bar/ActionBar.mixin.d.ts +4 -1
- package/lib/src/brand-page-maker/components/brand-page-maker/BrandPageMaker.mixin.d.ts +13 -2
- package/lib/src/brand-page-maker/components/brand-page-maker/BrandPageMaker.mixin.js +4 -4
- package/lib/src/brand-page-maker/components/brand-page-maker/BrandPageMakerTemplateSettings.mixin.d.ts +4 -1
- package/lib/src/brand-page-maker/components/brand-page-maker/__fixtures__/brand-page-examples.js +0 -10
- package/lib/src/brand-page-maker/components/brand-page-maker/__fixtures__/content-settings-items.fixture.js +0 -1
- package/lib/src/brand-page-maker/components/brandpage-maker-page/BrandPageMakerPage.mixin.d.ts +23 -138
- package/lib/src/brand-page-maker/components/brandpage-maker-page/BrandPageMakerPage.mixin.js +0 -28
- package/lib/src/brand-page-maker/components/brandpage-settings/ReplaceImageSettingsForBrandPageSettings.mixin.d.ts +4 -1
- package/lib/src/brand-page-maker/components/navigation/Navigation.mixin.d.ts +1 -1
- package/lib/src/brand-page-maker/components/seo-settings/SeoPageSettings.mixin.d.ts +5 -2
- package/lib/src/brand-page-maker/components/seo-settings/UrlSettings.mixin.d.ts +4 -1
- package/lib/src/brand-page-maker/components/social-share/SocialShare.mixin.d.ts +4 -1
- package/lib/src/brand-page-maker/components/template-preview/TemplatePreview.mixin.d.ts +4 -1
- package/lib/src/brand-page-maker/composables/ai-chat/useAiMetadataBuilder.d.ts +1 -0
- package/lib/src/brand-page-maker/composables/ai-chat/useAiMetadataBuilder.js +1 -0
- package/lib/src/brand-page-maker/composables/ai-chat/useAiWebsiteBuilderChat.js +1 -0
- package/lib/src/brand-page-maker/composables/rich-text-editor/extensions/RoleTypographyFill.d.ts +16 -0
- package/lib/src/brand-page-maker/composables/rich-text-editor/extensions/RoleTypographyFill.js +61 -0
- package/lib/src/brand-page-maker/composables/rich-text-editor/extensions/RteClipboard.d.ts +11 -0
- package/lib/src/brand-page-maker/composables/rich-text-editor/extensions/RteClipboard.js +236 -0
- package/lib/src/brand-page-maker/composables/rich-text-editor/font.d.ts +2 -1
- package/lib/src/brand-page-maker/composables/rich-text-editor/font.js +25 -6
- package/lib/src/brand-page-maker/composables/rich-text-editor/formatting.d.ts +17 -4
- package/lib/src/brand-page-maker/composables/rich-text-editor/formatting.js +204 -17
- package/lib/src/brand-page-maker/composables/rich-text-editor/hyperlink.d.ts +1 -1
- package/lib/src/brand-page-maker/composables/rich-text-editor/hyperlink.js +29 -31
- package/lib/src/brand-page-maker/composables/rich-text-editor/keepMarksOnEmpty.d.ts +20 -0
- package/lib/src/brand-page-maker/composables/rich-text-editor/keepMarksOnEmpty.js +60 -0
- package/lib/src/brand-page-maker/composables/rich-text-editor/spacing.d.ts +2 -1
- package/lib/src/brand-page-maker/composables/rich-text-editor/spacing.js +22 -6
- package/lib/src/brand-page-maker/composables/rich-text-editor/useRichTextEditor.d.ts +10 -4
- package/lib/src/brand-page-maker/composables/rich-text-editor/useRichTextEditor.js +319 -275
- package/lib/src/brand-page-maker/constants/config-settings-constant.js +1 -5
- package/lib/src/brand-page-maker/convertors/text-css-style-options.convertor.js +6 -2
- package/lib/src/brand-page-maker/convertors/text-size-value.convertor.d.ts +1 -1
- package/lib/src/brand-page-maker/convertors/text-size-value.convertor.js +3 -1
- package/lib/src/brand-page-maker/default-getters/payment-text-and-border-color.default-getter.js +7 -14
- package/lib/src/brand-page-maker/default-getters/text-color.default-getter.js +6 -13
- package/lib/src/brand-page-maker/models/content-settings.d.ts +8 -0
- package/lib/src/brand-page-maker/models/content-settings.js +112 -81
- package/lib/src/brand-page-maker/stores/admin-logo-settings/admin-logo-settings-store-utils.d.ts +2 -2
- package/lib/src/brand-page-maker/stores/admin-logo-settings/admin-logo-settings-store-utils.js +5 -2
- package/lib/src/brand-page-maker/stores/admin-logo-settings/admin-logo-settings-store.js +4 -3
- package/lib/src/brand-page-maker/stores/ai-checkpoint/ai-checkpoint-store.d.ts +1257 -117
- package/lib/src/brand-page-maker/stores/brandpage-maker/brandpage-maker-store.d.ts +6 -1
- package/lib/src/brand-page-maker/stores/brandpage-maker/brandpage-maker-store.js +17 -9
- package/lib/src/brand-page-maker/stores/history/history-store.d.ts +59 -5
- package/lib/src/brand-page-maker/stores/history/history-store.js +22 -2
- package/lib/src/brand-page-maker/utils/apply-color-strategy.js +26 -8
- package/lib/src/brand-page-maker/utils/index.d.ts +2 -1
- package/lib/src/brand-page-maker/utils/index.js +2 -1
- package/lib/src/brand-page-maker/utils/rich-text-editor.util.d.ts +117 -15
- package/lib/src/brand-page-maker/utils/rich-text-editor.util.js +435 -281
- package/lib/src/brand-page-maker/utils/rte-authoring.util.d.ts +4 -0
- package/lib/src/brand-page-maker/utils/rte-authoring.util.js +101 -0
- package/lib/src/brand-page-maker/utils/rte-clipboard.util.d.ts +126 -0
- package/lib/src/brand-page-maker/utils/rte-clipboard.util.js +307 -0
- package/lib/src/brand-page-maker/utils/rte-sanitize.util.js +13 -3
- package/lib/src/{bundled-translations-zfiA5Tsw.js → bundled-translations-yGrvPE5i.js} +17 -17
- package/lib/src/{bundled-translations.de-DE-ChsdSyAP.js → bundled-translations.de-DE-L4Znf8Hs.js} +17 -17
- package/lib/src/{bundled-translations.es-ES-DflsWQK0.js → bundled-translations.es-ES-D6iticrK.js} +15 -15
- package/lib/src/{bundled-translations.fr-CA-fpDRuZ52.js → bundled-translations.fr-CA-BgAVE-9k.js} +25 -25
- package/lib/src/{bundled-translations.fr-FR-Bub73Zt-.js → bundled-translations.fr-FR-B8GbyqxQ.js} +17 -17
- package/lib/src/{bundled-translations.pt-BR-BlnWE9TB.js → bundled-translations.pt-BR-DjPU3Db7.js} +25 -25
- package/lib/src/{bundled-translations.pt-PT-DmzXlnaS.js → bundled-translations.pt-PT-BaepaDpr.js} +23 -23
- package/lib/src/bundles/bundled-translations.de-DE.json +21 -2
- package/lib/src/bundles/bundled-translations.es-ES.json +21 -2
- package/lib/src/bundles/bundled-translations.fr-CA.json +21 -2
- package/lib/src/bundles/bundled-translations.fr-FR.json +21 -2
- package/lib/src/bundles/bundled-translations.json +21 -2
- package/lib/src/bundles/bundled-translations.pt-BR.json +21 -2
- package/lib/src/bundles/bundled-translations.pt-PT.json +21 -2
- package/lib/src/clients/ai-assistant-client.d.ts +1 -0
- package/lib/src/composables/useTranslate.d.ts +1 -1
- package/lib/src/composables/useTranslate.js +1 -1
- package/lib/src/css/library.brand-page-brandCrowd.min.css +303 -207
- package/lib/src/css/library.brand-page-brandPage.min.css +303 -207
- package/lib/src/css/library.brand-page-designCom.min.css +303 -207
- package/lib/src/css/library.brand-page-preview.min.css +303 -207
- package/lib/src/index.d.ts +2 -1
- package/lib/src/index.mjs +195 -191
- package/lib/src/{lib-1AqtEmvQ.js → lib-kGRlD3_P.js} +36855 -33893
- package/lib/src/lib.js +2 -1
- package/lib/src/metadata-builder/builders/footer-builder.js +4 -5
- package/lib/src/metadata-builder/builders/global-role-propagation.d.ts +58 -0
- package/lib/src/metadata-builder/builders/global-role-propagation.js +246 -0
- package/lib/src/metadata-builder/builders/global-styles-builder.d.ts +1 -0
- package/lib/src/metadata-builder/builders/global-styles-builder.js +116 -45
- package/lib/src/metadata-builder/builders/header-builder.js +13 -4
- package/lib/src/metadata-builder/builders/section-builders/about-section-builder.js +3 -3
- package/lib/src/metadata-builder/builders/section-builders/banner-section-builder.js +3 -3
- package/lib/src/metadata-builder/builders/section-builders/booking-section-builder.js +3 -3
- package/lib/src/metadata-builder/builders/section-builders/contact-form-builder.js +4 -4
- package/lib/src/metadata-builder/builders/section-builders/images-section-builder.js +3 -3
- package/lib/src/metadata-builder/builders/section-builders/mailing-list-builder.js +2 -2
- package/lib/src/metadata-builder/builders/section-builders/mailing-list-section-builder.js +2 -2
- package/lib/src/metadata-builder/builders/section-builders/profile-section-builder.js +4 -4
- package/lib/src/metadata-builder/builders/section-builders/shapes-section-builder.js +3 -3
- package/lib/src/metadata-builder/builders/section-builders/social-links-builder.js +8 -2
- package/lib/src/metadata-builder/builders/section-builders/testimonial-section-builder.js +2 -2
- package/lib/src/metadata-builder/builders/section-builders/text-section-builder.js +60 -29
- package/lib/src/metadata-builder/builders/section-field-maps.js +1 -0
- package/lib/src/metadata-builder/builders/section-field-utils.d.ts +48 -19
- package/lib/src/metadata-builder/builders/section-field-utils.js +128 -52
- package/lib/src/metadata-builder/builders/section-rules/global-styles.rules.d.ts +4 -2
- package/lib/src/metadata-builder/builders/section-rules/global-styles.rules.js +28 -12
- package/lib/src/metadata-builder/builders/section-rules/social-links.rules.js +5 -1
- package/lib/src/metadata-builder/helpers/rte.helpers.d.ts +1 -1
- package/lib/src/metadata-builder/helpers/rte.helpers.js +97 -40
- package/lib/src/metadata-builder/metadata-executor.js +23 -1
- package/lib/src/metadata-builder/models.d.ts +2 -0
- package/lib/src/metadata-builder/parsers/ai-toolcall-parser.d.ts +18 -19
- package/lib/src/metadata-builder/parsers/section-tool-arguments.d.ts +18 -1
- package/lib/src/metadata-builder/sanitizers/rte-schema-check.js +1 -1
- package/lib/src/metadata-builder/sanitizers/sanitizer-rules.d.ts +0 -1
- package/lib/src/metadata-builder/sanitizers/sanitizer-rules.js +5 -8
- package/lib/src/metadata-builder/sanitizers/section-args-validator.d.ts +7 -16
- package/lib/src/metadata-builder/sanitizers/section-args-validator.js +95 -22
- package/lib/src/shared/color-palette/section-color-matches.js +9 -25
- package/lib/src/shared/color-strategies/color-strategies.d.ts +15 -0
- package/lib/src/shared/color-strategies/color-strategies.js +31 -0
- package/lib/src/shared/color-strategies/rte-color.d.ts +8 -0
- package/lib/src/shared/color-strategies/rte-color.js +16 -0
- package/lib/src/shared/color-strategies/rte-field-pairs.d.ts +23 -0
- package/lib/src/shared/color-strategies/rte-field-pairs.js +28 -0
- package/lib/src/shared/content-settings/components/content-settings/ContentSettings.mixin.d.ts +9 -135
- package/lib/src/shared/content-settings/components/content-settings/ContentSettings.mixin.js +1 -27
- package/lib/src/shared/content-settings/components/content-settings/ReplaceImageSettingsForContent.mixin.d.ts +12 -2
- package/lib/src/shared/content-settings/components/content-settings-item/ContentSettingsItem.mixin.d.ts +7 -0
- package/lib/src/shared/content-settings/components/content-settings-item/ContentSettingsItemField.mixin.d.ts +75 -6
- package/lib/src/shared/content-settings/components/content-settings-item/ContentSettingsItemField.mixin.js +18 -7
- package/lib/src/shared/content-settings/components/focused-content-item-settings/FocusedContentItemSettings.mixin.d.ts +6 -1
- package/lib/src/shared/content-settings/components/focused-content-item-settings/FocusedContentItemSettings.mixin.js +0 -7
- package/lib/src/shared/content-settings/components/payment-config-field/PaymentConfigField.mixin.d.ts +1 -0
- package/lib/src/shared/content-settings/components/text-items-field/TextItemsField.mixin.js +8 -4
- package/lib/src/shared/content-settings/components/text-style-field/TextStyleField.mixin.d.ts +1255 -26
- package/lib/src/shared/content-settings/components/text-style-field/TextStyleField.mixin.js +203 -59
- package/lib/src/shared/content-settings/store/content-settings-store.d.ts +6 -0
- package/lib/src/shared/content-settings/store/content-settings-store.js +105 -8
- package/lib/src/shared/logo-settings/components/LogoSettings.mixin.d.ts +5 -1
- package/lib/src/shared/navigation-style-settings/store/index.d.ts +7 -3
- package/lib/src/shared/navigation-style-settings/store/index.js +40 -15
- package/lib/src/shared/page-settings/components/delete-page-modal/DeletePageModal.mixin.d.ts +1 -1
- package/lib/src/shared/page-settings/components/new-page-modal/NewPageModal.mixin.d.ts +1 -0
- package/lib/src/shared/page-settings/components/page-settings/PageSettings.mixin.d.ts +17 -5
- package/lib/src/shared/page-settings/components/page-settings-section-styles/PageSettingsSectionStyles.mixin.d.ts +70 -13
- package/lib/src/shared/page-settings/components/page-settings-section-styles/PageSettingsSectionStyles.mixin.js +10 -2
- package/lib/src/shared/page-settings/store/page-settings-store.d.ts +2 -1
- package/lib/src/shared/page-settings/store/page-settings-store.js +17 -0
- package/lib/src/shared/publish-brand-page-with-state/PublishBrandPageModalWithState.mixin.d.ts +4 -1
- package/lib/src/shared/rte-extensions/AutoLink.d.ts +17 -0
- package/lib/src/{brand-page-maker/composables/rich-text-editor/extensions → shared/rte-extensions}/AutoLink.js +67 -51
- package/lib/src/{brand-page-maker/composables/rich-text-editor/extensions → shared/rte-extensions}/MaxLength.js +4 -1
- package/lib/src/shared/rte-extensions/TextEffects.d.ts +28 -0
- package/lib/src/shared/rte-extensions/TextEffects.js +96 -0
- package/lib/src/shared/rte-extensions/ViewDomParser.d.ts +2 -0
- package/lib/src/shared/rte-extensions/ViewDomParser.js +21 -0
- package/lib/src/shared/rte-extensions.util.d.ts +25 -0
- package/lib/src/{brand-page-maker/composables/rich-text-editor/getRteExtensions.js → shared/rte-extensions.util.js} +62 -7
- package/lib/src/shared/rte-link.util.d.ts +1 -0
- package/lib/src/shared/rte-link.util.js +1 -0
- package/lib/src/shared/rte-render.util.d.ts +112 -0
- package/lib/src/shared/rte-render.util.js +255 -0
- package/lib/src/shared/rte-shape.util.d.ts +6 -0
- package/lib/src/shared/rte-shape.util.js +18 -0
- package/lib/src/shared/side-bar/components/SideBar.mixin.d.ts +2 -1
- package/lib/src/shared/side-bar/components/SideBarTabButton.mixin.d.ts +1 -0
- package/lib/src/shared/side-bar/store/side-bar-store.d.ts +2 -0
- package/lib/src/shared/side-bar/store/side-bar-store.js +9 -0
- package/lib/src/shared/style-settings/components/StyleSettings.mixin.d.ts +155 -15
- package/lib/src/shared/style-settings/components/StyleSettings.mixin.js +7 -1
- package/lib/src/shared/style-settings/store/style-settings-store.d.ts +1 -9
- package/lib/src/shared/style-settings/store/style-settings-store.js +3 -33
- package/lib/src/shared/style-settings/text-style-size-order.d.ts +2 -0
- package/lib/src/shared/style-settings/text-style-size-order.js +13 -0
- package/lib/src/shared/text-role-typography.util.d.ts +64 -0
- package/lib/src/shared/text-role-typography.util.js +183 -0
- package/lib/src/utils/minify-brand-page-metadata.d.ts +16 -1
- package/lib/src/utils/minify-brand-page-metadata.js +31 -9
- package/package.json +1 -1
- package/src/brand-page/__fixtures__/migration-22-v21/edited-brandsite-sections.v21.json +982 -0
- package/src/brand-page/__fixtures__/migration-22-v21/new-brandcontact-every-section.v21.json +1231 -0
- package/src/brand-page/__fixtures__/migration-22-v21/new-brandpage-every-section.v21.json +1231 -0
- package/src/brand-page/__fixtures__/migration-22-v21/new-brandsite-every-section.v21.json +1243 -0
- package/src/brand-page/__fixtures__/migration-22-v21/real-brandcontact.v21.json +755 -0
- package/src/brand-page/__fixtures__/migration-22-v21/real-brandpage-general-link.v21.json +527 -0
- package/src/brand-page/__fixtures__/migration-22-v21/real-brandpage-links.v21.json +755 -0
- package/src/brand-page/__fixtures__/migration-22-v21/real-brandpage-social-links.v21.json +514 -0
- package/src/brand-page/__fixtures__/migration-22-v21/real-brandsite-about.v21.json +459 -0
- package/src/brand-page/__fixtures__/migration-22-v21/real-brandsite-footer.v21.json +469 -0
- package/src/brand-page/__fixtures__/migration-22-v21/real-brandsite-header-banner.v21.json +481 -0
- package/src/brand-page/__fixtures__/migration-22-v21/real-brandsite-sections.v21.json +800 -0
- package/src/brand-page/__fixtures__/production-text-style-resolver.fixture.ts +52 -0
- package/src/brand-page/components/about-section/AboutSection.vue.test.ts +0 -10
- package/src/brand-page/components/contact-form/ContactForm.mixin.test.ts +127 -0
- package/src/brand-page/components/contact-form/ContactForm.mixin.ts +31 -14
- package/src/brand-page/components/contact-form/ContactForm.vue +26 -12
- package/src/brand-page/components/contact-form/ContactForm.vue.test.ts +60 -0
- package/src/brand-page/components/mailing-list/MailingList.mixin.test.ts +92 -0
- package/src/brand-page/components/mailing-list/MailingList.mixin.ts +28 -3
- package/src/brand-page/components/mailing-list/MailingList.vue +9 -4
- package/src/brand-page/components/mailing-list/MailingList.vue.test.ts +63 -0
- package/src/brand-page/components/navigation/button-carousel/ButtonCarouselNavigation.mixin.ts +51 -1
- package/src/brand-page/components/navigation/button-carousel/ButtonCarouselNavigation.test.ts +114 -0
- package/src/brand-page/components/navigation/button-carousel/ButtonCarouselNavigation.vue +8 -2
- package/src/brand-page/components/navigation/navigation-carousel/NavigationCarousel.test.ts +182 -0
- package/src/brand-page/components/navigation/navigation-carousel/NavigationCarousel.vue +59 -12
- package/src/brand-page/components/navigation/navigation-side-menu/NavigationSideMenu.mixin.ts +40 -3
- package/src/brand-page/components/navigation/navigation-side-menu/NavigationSideMenu.vue +15 -7
- package/src/brand-page/components/navigation/navigation-side-menu/NavigationSideMenu.vue.test.ts +133 -3
- package/src/brand-page/components/page/Page.mixin.ts +41 -34
- package/src/brand-page/components/page/Page.vue +17 -6
- package/src/brand-page/components/page/Page.vue.test.ts +91 -1
- package/src/brand-page/components/page-footer/PageFooter.mixin.ts +32 -2
- package/src/brand-page/components/page-footer/PageFooter.test.ts +79 -0
- package/src/brand-page/components/page-footer/PageFooter.vue +12 -4
- package/src/brand-page/components/payment/Payment.mixin.ts +34 -2
- package/src/brand-page/components/payment/Payment.test.ts +188 -0
- package/src/brand-page/components/payment/Payment.vue +12 -5
- package/src/brand-page/components/payment/RequestPaymentStripe.vue +1 -0
- package/src/brand-page/components/payment/support-me/SupportMe.mixin.ts +49 -2
- package/src/brand-page/components/payment/support-me/SupportMe.test.ts +100 -0
- package/src/brand-page/components/payment/support-me/SupportMe.vue +7 -1
- package/src/brand-page/components/payment/support-me/SupportMe.vue.test.ts +66 -0
- package/src/brand-page/components/save-contact/SaveContactWidget.test.ts +100 -0
- package/src/brand-page/components/save-contact/SaveContactWidget.vue +6 -3
- package/src/brand-page/components/shop/PaymentModal.vue +2 -6
- package/src/brand-page/components/shop/PaymentShippingAddress.vue +6 -0
- package/src/brand-page/components/shop/Shop.vue +15 -2
- package/src/brand-page/components/shop/Shop.vue.test.ts +74 -2
- package/src/brand-page/components/social-links/SocialLinks.stories.ts +0 -3
- package/src/brand-page/components/social-links/SocialLinks.vue.test.ts +0 -3
- package/src/brand-page/components/testimonial-section/__fixtures__/data.ts +0 -3
- package/src/brand-page/components/text/Text.stories.ts +0 -17
- package/src/brand-page/components/text-wrapper/TextWrapper.parity.test.ts +136 -0
- package/src/brand-page/components/text-wrapper/TextWrapper.test.ts +358 -0
- package/src/brand-page/components/text-wrapper/TextWrapper.vue +82 -22
- package/src/brand-page/constants/font.constants.ts +37 -0
- package/src/brand-page/models/footer-icon-color.test.ts +22 -0
- package/src/brand-page/models/index.ts +50 -28
- package/src/brand-page/models/navigation-styles.model.test.ts +77 -1
- package/src/brand-page/models/navigation-styles.model.ts +26 -9
- package/src/brand-page/models/payment.model.ts +15 -6
- package/src/brand-page/models/styles.model.test.ts +104 -0
- package/src/brand-page/models/styles.model.ts +181 -47
- package/src/brand-page/utils/__snapshots__/migration.util.test.ts.snap +619 -115
- package/src/brand-page/utils/__snapshots__/migration2.util.test.ts.snap +150 -9
- package/src/brand-page/utils/__snapshots__/model.util.test.ts.snap +300 -18
- package/src/brand-page/utils/color-palette.util.test.ts +126 -1
- package/src/brand-page/utils/color-palette.util.ts +92 -26
- package/src/brand-page/utils/color.util.test.ts +62 -29
- package/src/brand-page/utils/color.util.ts +77 -14
- package/src/brand-page/utils/container-text-color.util.test.ts +672 -26
- package/src/brand-page/utils/container-text-color.util.ts +472 -46
- package/src/brand-page/utils/index.ts +1 -0
- package/src/brand-page/utils/migration/__snapshots__/migration-22-output/edited-brandsite-sections.v22.json +1191 -0
- package/src/brand-page/utils/migration/__snapshots__/migration-22-output/new-brandcontact-every-section.v22.json +2026 -0
- package/src/brand-page/utils/migration/__snapshots__/migration-22-output/new-brandpage-every-section.v22.json +2017 -0
- package/src/brand-page/utils/migration/__snapshots__/migration-22-output/new-brandsite-every-section.v22.json +2031 -0
- package/src/brand-page/utils/migration/__snapshots__/migration-22-output/real-brandcontact.v22.json +1145 -0
- package/src/brand-page/utils/migration/__snapshots__/migration-22-output/real-brandpage-general-link.v22.json +645 -0
- package/src/brand-page/utils/migration/__snapshots__/migration-22-output/real-brandpage-links.v22.json +1136 -0
- package/src/brand-page/utils/migration/__snapshots__/migration-22-output/real-brandpage-social-links.v22.json +662 -0
- package/src/brand-page/utils/migration/__snapshots__/migration-22-output/real-brandsite-about.v22.json +638 -0
- package/src/brand-page/utils/migration/__snapshots__/migration-22-output/real-brandsite-footer.v22.json +610 -0
- package/src/brand-page/utils/migration/__snapshots__/migration-22-output/real-brandsite-header-banner.v22.json +660 -0
- package/src/brand-page/utils/migration/__snapshots__/migration-22-output/real-brandsite-sections.v22.json +1132 -0
- package/src/brand-page/utils/migration/migration-01.ts +293 -237
- package/src/brand-page/utils/migration/migration-02.ts +8 -1
- package/src/brand-page/utils/migration/migration-20.ts +6 -3
- package/src/brand-page/utils/migration/migration-20_5.test.ts +5 -2
- package/src/brand-page/utils/migration/migration-21.test.ts +34 -0
- package/src/brand-page/utils/migration/migration-21.ts +46 -10
- package/src/brand-page/utils/migration/migration-22.fixed-input.test.ts +43 -0
- package/src/brand-page/utils/migration/migration-22.test.ts +4103 -0
- package/src/brand-page/utils/migration/migration-22.text-font-family.test.ts +72 -0
- package/src/brand-page/utils/migration/migration-22.ts +1336 -0
- package/src/brand-page/utils/migration.util.test.ts +146 -32
- package/src/brand-page/utils/migration.util.ts +18 -0
- package/src/brand-page/utils/model.util.ts +4 -0
- package/src/brand-page/utils/personalisation.util.test.ts +148 -3
- package/src/brand-page/utils/personalisation.util.ts +9 -1
- package/src/brand-page/utils/rte-role-lift.util.ts +409 -0
- package/src/brand-page/utils/style.util.test.ts +35 -2
- package/src/brand-page/utils/style.util.ts +45 -11
- package/src/brand-page/utils/text-role-css.util.test.ts +525 -0
- package/src/brand-page/utils/text-role-css.util.ts +321 -0
- package/src/brand-page/utils/text-role-reconnect.util.test.ts +604 -0
- package/src/brand-page/utils/text-role-reconnect.util.ts +727 -0
- package/src/brand-page/utils/text-style.util.test.ts +305 -0
- package/src/brand-page/utils/text-style.util.ts +198 -24
- package/src/brand-page/utils/view-model.page-data.test.ts +232 -0
- package/src/brand-page/utils/view-model.util.test.ts +954 -133
- package/src/brand-page/utils/view-model.util.ts +187 -139
- package/src/brand-page/view-models.ts +4 -0
- package/src/brand-page-maker/components/brand-page-maker/BrandPageMaker.blank-site.test.ts +57 -0
- package/src/brand-page-maker/components/brand-page-maker/BrandPageMaker.mixin.ts +9 -5
- package/src/brand-page-maker/components/brand-page-maker/__fixtures__/brand-page-examples.ts +0 -10
- package/src/brand-page-maker/components/brand-page-maker/__fixtures__/content-settings-items.fixture.ts +0 -1
- package/src/brand-page-maker/components/brandpage-maker-page/BrandPageMakerPage.mixin.ts +0 -44
- package/src/brand-page-maker/components/rich-text-editor/RichTextEditor.vue +253 -200
- package/src/brand-page-maker/components/shop/AddOrEditProductContainer.vue +1 -0
- package/src/brand-page-maker/components/template-preview/TemplatePreview.vue +1 -0
- package/src/brand-page-maker/composables/ai-chat/useAiMetadataBuilder.ts +2 -0
- package/src/brand-page-maker/composables/ai-chat/useAiWebsiteBuilderChat.ts +1 -0
- package/src/brand-page-maker/composables/rich-text-editor/block-typography.test.ts +519 -0
- package/src/brand-page-maker/composables/rich-text-editor/extensions/FontFamily.test.ts +1 -1
- package/src/brand-page-maker/composables/rich-text-editor/extensions/MaxLength.test.ts +26 -1
- package/src/brand-page-maker/composables/rich-text-editor/extensions/RoleTypographyFill.test.ts +110 -0
- package/src/brand-page-maker/composables/rich-text-editor/extensions/RoleTypographyFill.ts +99 -0
- package/src/brand-page-maker/composables/rich-text-editor/extensions/RteClipboard.ts +397 -0
- package/src/brand-page-maker/composables/rich-text-editor/extensions/ViewDomParser.test.ts +139 -0
- package/src/brand-page-maker/composables/rich-text-editor/font.ts +36 -5
- package/src/brand-page-maker/composables/rich-text-editor/formatting.test.ts +375 -1
- package/src/brand-page-maker/composables/rich-text-editor/formatting.ts +301 -17
- package/src/brand-page-maker/composables/rich-text-editor/hyperlink.test.ts +82 -1
- package/src/brand-page-maker/composables/rich-text-editor/hyperlink.ts +28 -34
- package/src/brand-page-maker/composables/rich-text-editor/keepMarksOnEmpty.test.ts +80 -0
- package/src/brand-page-maker/composables/rich-text-editor/keepMarksOnEmpty.ts +75 -0
- package/src/brand-page-maker/composables/rich-text-editor/spacing.ts +31 -6
- package/src/brand-page-maker/composables/rich-text-editor/useRichTextEditor.test.ts +2485 -0
- package/src/brand-page-maker/composables/rich-text-editor/useRichTextEditor.ts +435 -337
- package/src/brand-page-maker/constants/config-settings-constant.ts +0 -6
- package/src/brand-page-maker/convertors/text-css-style-options.convertor.test.ts +43 -0
- package/src/brand-page-maker/convertors/text-css-style-options.convertor.ts +6 -2
- package/src/brand-page-maker/convertors/text-size-value.convertor.test.ts +24 -0
- package/src/brand-page-maker/convertors/text-size-value.convertor.ts +17 -13
- package/src/brand-page-maker/default-getters/payment-text-and-border-color.default-getter.ts +7 -22
- package/src/brand-page-maker/default-getters/text-color.default-getter.ts +5 -21
- package/src/brand-page-maker/models/content-settings.test.ts +708 -0
- package/src/brand-page-maker/models/content-settings.ts +133 -82
- package/src/brand-page-maker/stores/admin-logo-settings/admin-logo-settings-store-utils.test.ts +63 -1
- package/src/brand-page-maker/stores/admin-logo-settings/admin-logo-settings-store-utils.ts +16 -3
- package/src/brand-page-maker/stores/admin-logo-settings/admin-logo-settings-store.test.ts +34 -0
- package/src/brand-page-maker/stores/admin-logo-settings/admin-logo-settings-store.ts +4 -2
- package/src/brand-page-maker/stores/brandpage-maker/brandpage-maker-store.test.ts +185 -1
- package/src/brand-page-maker/stores/brandpage-maker/brandpage-maker-store.ts +22 -34
- package/src/brand-page-maker/stores/history/history-store.ts +35 -2
- package/src/brand-page-maker/utils/__snapshots__/apply-color-strategy.golden.test.ts.snap +528 -0
- package/src/brand-page-maker/utils/__snapshots__/rte-render-parity.test.ts.snap +12 -0
- package/src/brand-page-maker/utils/apply-color-strategy.golden.test.ts +2 -0
- package/src/brand-page-maker/utils/apply-color-strategy.test.ts +181 -3
- package/src/brand-page-maker/utils/apply-color-strategy.ts +36 -4
- package/src/brand-page-maker/utils/index.ts +2 -1
- package/src/brand-page-maker/utils/rich-text-editor.util.test.ts +447 -410
- package/src/brand-page-maker/utils/rich-text-editor.util.ts +610 -506
- package/src/brand-page-maker/utils/rte-authoring.util.test.ts +244 -0
- package/src/brand-page-maker/utils/rte-authoring.util.ts +175 -0
- package/src/brand-page-maker/utils/rte-clipboard.util.test.ts +558 -0
- package/src/brand-page-maker/utils/rte-clipboard.util.ts +473 -0
- package/src/brand-page-maker/utils/rte-features.test.ts +99 -3
- package/src/brand-page-maker/utils/rte-render-parity.test.ts +1 -1
- package/src/brand-page-maker/utils/rte-render.util.test.ts +230 -0
- package/src/brand-page-maker/utils/rte-sanitize-json.test.ts +1 -1
- package/src/brand-page-maker/utils/rte-sanitize.util.ts +14 -3
- package/src/brand-page-maker/utils/rte-schema-version.test.ts +102 -0
- package/src/bundles/bundled-translations.de-DE.json +21 -2
- package/src/bundles/bundled-translations.es-ES.json +21 -2
- package/src/bundles/bundled-translations.fr-CA.json +21 -2
- package/src/bundles/bundled-translations.fr-FR.json +21 -2
- package/src/bundles/bundled-translations.json +21 -2
- package/src/bundles/bundled-translations.pt-BR.json +21 -2
- package/src/bundles/bundled-translations.pt-PT.json +21 -2
- package/src/clients/ai-assistant-client.ts +1 -0
- package/src/composables/useTranslate.ts +2 -1
- package/src/lib.ts +2 -2
- package/src/metadata-builder/builders/footer-builder.test.ts +70 -45
- package/src/metadata-builder/builders/footer-builder.ts +4 -8
- package/src/metadata-builder/builders/global-role-propagation.test.ts +907 -0
- package/src/metadata-builder/builders/global-role-propagation.ts +430 -0
- package/src/metadata-builder/builders/global-styles-builder.test.ts +1020 -0
- package/src/metadata-builder/builders/global-styles-builder.ts +194 -48
- package/src/metadata-builder/builders/header-builder.test.ts +112 -40
- package/src/metadata-builder/builders/header-builder.ts +18 -8
- package/src/metadata-builder/builders/section-builders/about-section-builder.ts +5 -3
- package/src/metadata-builder/builders/section-builders/banner-section-builder.ts +5 -3
- package/src/metadata-builder/builders/section-builders/booking-section-builder.ts +5 -3
- package/src/metadata-builder/builders/section-builders/contact-form-builder.ts +7 -4
- package/src/metadata-builder/builders/section-builders/images-section-builder.ts +5 -3
- package/src/metadata-builder/builders/section-builders/mailing-list-builder.ts +3 -2
- package/src/metadata-builder/builders/section-builders/mailing-list-section-builder.ts +3 -2
- package/src/metadata-builder/builders/section-builders/profile-section-builder.ts +7 -7
- package/src/metadata-builder/builders/section-builders/shapes-section-builder.ts +5 -3
- package/src/metadata-builder/builders/section-builders/social-links-builder.test.ts +2 -2
- package/src/metadata-builder/builders/section-builders/social-links-builder.ts +21 -10
- package/src/metadata-builder/builders/section-builders/support-me-builder.test.ts +10 -0
- package/src/metadata-builder/builders/section-builders/testimonial-section-builder.ts +3 -2
- package/src/metadata-builder/builders/section-builders/text-section-builder.ts +111 -61
- package/src/metadata-builder/builders/section-field-maps.ts +1 -0
- package/src/metadata-builder/builders/section-field-utils.test.ts +545 -2
- package/src/metadata-builder/builders/section-field-utils.ts +202 -69
- package/src/metadata-builder/builders/section-rules/global-styles.rules.ts +38 -13
- package/src/metadata-builder/builders/section-rules/social-links.rules.ts +5 -0
- package/src/metadata-builder/helpers/rte.helpers.test.ts +101 -0
- package/src/metadata-builder/helpers/rte.helpers.ts +129 -43
- package/src/metadata-builder/metadata-executor.test.ts +167 -0
- package/src/metadata-builder/metadata-executor.ts +34 -1
- package/src/metadata-builder/models.ts +2 -0
- package/src/metadata-builder/parsers/ai-toolcall-parser.ts +23 -7
- package/src/metadata-builder/parsers/section-tool-arguments.ts +21 -1
- package/src/metadata-builder/sanitizers/__tests__/section-args-validator.test.ts +215 -0
- package/src/metadata-builder/sanitizers/rte-schema-check.ts +1 -1
- package/src/metadata-builder/sanitizers/sanitizer-rules.ts +4 -8
- package/src/metadata-builder/sanitizers/section-args-validator.ts +136 -53
- package/src/shared/color-palette/section-color-matches.test.ts +15 -11
- package/src/shared/color-palette/section-color-matches.ts +9 -28
- package/src/shared/color-strategies/color-strategies.ts +35 -0
- package/src/shared/color-strategies/rte-color.test.ts +1 -1
- package/src/shared/color-strategies/rte-color.ts +19 -0
- package/src/shared/color-strategies/rte-field-pairs.test.ts +26 -5
- package/src/shared/color-strategies/rte-field-pairs.ts +33 -0
- package/src/shared/content-settings/components/color-matches-panel/ColorMatchesPanel.test.ts +43 -66
- package/src/shared/content-settings/components/color-matches-panel/ColorMatchesPanel.vue +7 -1
- package/src/shared/content-settings/components/content-settings/ContentSettings.mixin.ts +1 -48
- package/src/shared/content-settings/components/content-settings-item/ContentSettingsItemField.mixin.ts +33 -7
- package/src/shared/content-settings/components/content-settings-item/ContentSettingsItemField.test.ts +128 -1
- package/src/shared/content-settings/components/draggable-item-list/DraggableItemList.vue +1 -0
- package/src/shared/content-settings/components/focused-content-item-settings/FocusedContentItemSettings.mixin.ts +0 -6
- package/src/shared/content-settings/components/logo-selection-field/LogoSelection.vue +3 -0
- package/src/shared/content-settings/components/logo-size-field/LogoSizeSlider.vue +3 -0
- package/src/shared/content-settings/components/logo-size-field/LogoSizeSliderField.vue +1 -0
- package/src/shared/content-settings/components/testimonial-items-field/TestimonialItemsField.vue +1 -0
- package/src/shared/content-settings/components/text-items-field/TextItemsField.mixin.test.ts +56 -3
- package/src/shared/content-settings/components/text-items-field/TextItemsField.mixin.ts +11 -4
- package/src/shared/content-settings/components/text-style-field/TextStyleField.mixin.test.ts +335 -25
- package/src/shared/content-settings/components/text-style-field/TextStyleField.mixin.ts +248 -70
- package/src/shared/content-settings/components/text-style-field/TextStyleField.vue +113 -25
- package/src/shared/content-settings/components/text-style-field/i18n/text-style-field.de-DE.json +17 -10
- package/src/shared/content-settings/components/text-style-field/i18n/text-style-field.es-ES.json +17 -10
- package/src/shared/content-settings/components/text-style-field/i18n/text-style-field.fr-CA.json +17 -10
- package/src/shared/content-settings/components/text-style-field/i18n/text-style-field.fr-FR.json +17 -10
- package/src/shared/content-settings/components/text-style-field/i18n/text-style-field.json +8 -1
- package/src/shared/content-settings/components/text-style-field/i18n/text-style-field.pt-BR.json +17 -10
- package/src/shared/content-settings/components/text-style-field/i18n/text-style-field.pt-PT.json +17 -10
- package/src/shared/content-settings/components/text-style-role-dropdown/TextStyleRoleDropdown.test.ts +141 -0
- package/src/shared/content-settings/components/text-style-role-dropdown/TextStyleRoleDropdown.vue +136 -0
- package/src/shared/content-settings/store/content-settings-store.test.ts +491 -6
- package/src/shared/content-settings/store/content-settings-store.ts +159 -17
- package/src/shared/logo-settings/components/EditLogoSettings.vue +1 -0
- package/src/shared/logo-settings/components/LogoVariations.vue +1 -0
- package/src/shared/navigation-style-settings/components/navigation-style-settings/NavigationStyleSettings.vue +1 -0
- package/src/shared/navigation-style-settings/store/index.test.ts +295 -0
- package/src/shared/navigation-style-settings/store/index.ts +65 -15
- package/src/shared/page-settings/components/header-settings-panel/HeaderSettingsPanel.vue +2 -0
- package/src/shared/page-settings/components/page-settings/PageElement.vue +1 -0
- package/src/shared/page-settings/components/page-settings-section-styles/HeaderButtonSettings.test.ts +44 -4
- package/src/shared/page-settings/components/page-settings-section-styles/HeaderButtonSettings.vue +13 -4
- package/src/shared/page-settings/components/page-settings-section-styles/PageSettingsSectionStyles.mixin.navigation.test.ts +89 -0
- package/src/shared/page-settings/components/page-settings-section-styles/PageSettingsSectionStyles.mixin.text-style.test.ts +91 -0
- package/src/shared/page-settings/components/page-settings-section-styles/PageSettingsSectionStyles.mixin.ts +14 -2
- package/src/shared/page-settings/components/page-settings-section-styles/PageSettingsSectionStyles.vue +2 -0
- package/src/shared/page-settings/store/page-settings-store.text-style.test.ts +84 -0
- package/src/shared/page-settings/store/page-settings-store.ts +30 -1
- package/src/shared/rte-extensions/AutoLink.test.ts +98 -0
- package/src/{brand-page-maker/composables/rich-text-editor/extensions → shared/rte-extensions}/AutoLink.ts +87 -58
- package/src/{brand-page-maker/composables/rich-text-editor/extensions → shared/rte-extensions}/MaxLength.ts +4 -1
- package/src/shared/rte-extensions/TextEffects.ts +151 -0
- package/src/shared/rte-extensions/ViewDomParser.ts +27 -0
- package/src/{brand-page-maker/composables/rich-text-editor/getRteExtensions.ts → shared/rte-extensions.util.ts} +66 -9
- package/src/shared/rte-link.util.ts +2 -0
- package/src/shared/rte-render.util.ts +385 -0
- package/src/shared/rte-shape.util.ts +29 -0
- package/src/shared/side-bar/store/side-bar-store.test.ts +27 -1
- package/src/shared/side-bar/store/side-bar-store.ts +11 -0
- package/src/shared/style-settings/components/StyleSettings.mixin.ts +7 -3
- package/src/shared/style-settings/components/StyleSettings.test.ts +116 -0
- package/src/shared/style-settings/components/StyleSettings.vue +75 -25
- package/src/shared/style-settings/components/i18n/style-settings.de-DE.json +32 -20
- package/src/shared/style-settings/components/i18n/style-settings.es-ES.json +32 -20
- package/src/shared/style-settings/components/i18n/style-settings.fr-CA.json +32 -20
- package/src/shared/style-settings/components/i18n/style-settings.fr-FR.json +32 -20
- package/src/shared/style-settings/components/i18n/style-settings.json +13 -3
- package/src/shared/style-settings/components/i18n/style-settings.pt-BR.json +32 -20
- package/src/shared/style-settings/components/i18n/style-settings.pt-PT.json +32 -20
- package/src/shared/style-settings/components/text-style-options-settings-with-state/TextStyleOptionsSettingsWithState.vue +14 -34
- package/src/shared/style-settings/store/style-settings-store.ts +3 -49
- package/src/shared/style-settings/text-style-size-order.test.ts +76 -0
- package/src/shared/style-settings/text-style-size-order.ts +28 -0
- package/src/shared/template-settings/components/TemplatesSettings.vue +4 -0
- package/src/shared/text-role-typography.util.ts +277 -0
- package/src/utils/minify-brand-page-metadata.test.ts +102 -7
- package/src/utils/minify-brand-page-metadata.ts +62 -8
- package/lib/src/brand-page-maker/composables/rich-text-editor/extensions/AutoLink.d.ts +0 -2
- package/lib/src/brand-page-maker/composables/rich-text-editor/getRteExtensions.d.ts +0 -28
- package/lib/src/brand-page-maker/utils/rte-render.util.d.ts +0 -63
- package/lib/src/brand-page-maker/utils/rte-render.util.js +0 -106
- package/lib/src/brand-page-maker/utils/rte-shape.d.ts +0 -18
- package/lib/src/brand-page-maker/utils/rte-shape.js +0 -21
- package/lib/src/metadata-builder/builders/global-font-propagation.d.ts +0 -41
- package/lib/src/metadata-builder/builders/global-font-propagation.js +0 -146
- package/src/brand-page-maker/utils/rte-render.util.ts +0 -179
- package/src/brand-page-maker/utils/rte-shape.ts +0 -29
- package/src/metadata-builder/builders/global-font-propagation.test.ts +0 -401
- package/src/metadata-builder/builders/global-font-propagation.ts +0 -238
- package/src/shared/style-settings/components/StyleSettingsSection.vue +0 -8
- /package/lib/src/{brand-page-maker/composables/rich-text-editor/extensions → shared/rte-extensions}/FontFamily.d.ts +0 -0
- /package/lib/src/{brand-page-maker/composables/rich-text-editor/extensions → shared/rte-extensions}/FontFamily.js +0 -0
- /package/lib/src/{brand-page-maker/composables/rich-text-editor/extensions → shared/rte-extensions}/LetterSpacing.d.ts +0 -0
- /package/lib/src/{brand-page-maker/composables/rich-text-editor/extensions → shared/rte-extensions}/LetterSpacing.js +0 -0
- /package/lib/src/{brand-page-maker/composables/rich-text-editor/extensions → shared/rte-extensions}/MaxLength.d.ts +0 -0
- /package/src/{brand-page-maker/composables/rich-text-editor/extensions → shared/rte-extensions}/FontFamily.ts +0 -0
- /package/src/{brand-page-maker/composables/rich-text-editor/extensions → shared/rte-extensions}/LetterSpacing.ts +0 -0
|
@@ -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
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
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
|
-
|
|
129
|
-
|
|
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
|
-
|
|
134
|
-
const oldNode =
|
|
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
|
-
//
|
|
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
|
-
|
|
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,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 {
|
|
12
|
-
import {
|
|
13
|
-
import {
|
|
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:');
|
|
@@ -0,0 +1,112 @@
|
|
|
1
|
+
import type { JSONContent } from '@tiptap/vue-3';
|
|
2
|
+
import { isTiptapDocument, getRteJsonPlainText } from './rte-shape.util';
|
|
3
|
+
export { isTiptapDocument, getRteJsonPlainText };
|
|
4
|
+
/**
|
|
5
|
+
* BP-5787 — the boundary plumbing for storing RTE as Tiptap JSON.
|
|
6
|
+
*
|
|
7
|
+
* An RTE field is either a legacy inline-HTML string (pre-migration, or a
|
|
8
|
+
* not-yet-migrated published site) or a Tiptap JSON document (post-migration).
|
|
9
|
+
* These helpers let every consumer treat the two uniformly:
|
|
10
|
+
*
|
|
11
|
+
* - isTiptapDocument — the canonical discriminator (object with type 'doc').
|
|
12
|
+
* - renderRteToHtml — render either form to final HTML for display.
|
|
13
|
+
* - toRteJson — normalise either form to JSON for storage.
|
|
14
|
+
*
|
|
15
|
+
* The schema-driven core of both directions is Tiptap/ProseMirror, fed by the
|
|
16
|
+
* single-source-of-truth extension set (getRteExtensions) — so the mapping lives
|
|
17
|
+
* in the extensions' schema, not a hand-maintained copy that drifts:
|
|
18
|
+
*
|
|
19
|
+
* - renderRteToHtml uses @tiptap/static-renderer (renderToHTMLString). It is
|
|
20
|
+
* DOM-less, so it runs on the server (SSR/publish/preview), not just the
|
|
21
|
+
* browser, and needs no Editor instance.
|
|
22
|
+
* - toRteJson turns an HTML string into a DOM node with an INJECTED parser and
|
|
23
|
+
* feeds it to ProseMirror's schema-driven DOMParser. The HTML→DOM step needs
|
|
24
|
+
* a DOM parser; rather than read the global `window.DOMParser` (as Tiptap's
|
|
25
|
+
* `generateJSON` does — unusable on a pure-node server and fragile across SSR
|
|
26
|
+
* execution contexts), the parser is supplied by the caller: the native
|
|
27
|
+
* `DOMParser` in the browser, a jsdom `DOMParser` *instance* on the server
|
|
28
|
+
* (see resolveHtmlParser). No global is ever mutated, so the conversion is
|
|
29
|
+
* fully isomorphic regardless of how the SSR host bundles/executes this code.
|
|
30
|
+
*/
|
|
31
|
+
export type RichTextValue = string | JSONContent;
|
|
32
|
+
/**
|
|
33
|
+
* A `DOMParser`-compatible object: turns an HTML string into a Document whose
|
|
34
|
+
* `body` is a DOM node ProseMirror can parse. The browser's native `DOMParser`
|
|
35
|
+
* and jsdom's `DOMParser` both satisfy this, so the DOM dependency is injected
|
|
36
|
+
* rather than read from a global.
|
|
37
|
+
*/
|
|
38
|
+
export interface HtmlParser {
|
|
39
|
+
parseFromString(html: string, type: 'text/html'): Document;
|
|
40
|
+
}
|
|
41
|
+
/**
|
|
42
|
+
* Render an RTE value to final HTML. Legacy HTML strings pass through untouched
|
|
43
|
+
* (they are already HTML); Tiptap JSON is serialised by @tiptap/static-renderer
|
|
44
|
+
* from the extension schema — no editor, no DOM — so it works on the server
|
|
45
|
+
* (SSR/publish), not just the browser.
|
|
46
|
+
*
|
|
47
|
+
* MIGRATION-22 SNAPSHOT DEPENDENCY: B1 uses this module's plain-text conversion and parser seam.
|
|
48
|
+
* Pin that v22 conversion before changing it after migration-22 releases.
|
|
49
|
+
*/
|
|
50
|
+
export declare const renderRteToHtml: (value: RichTextValue | null | undefined, options?: {
|
|
51
|
+
textDecorationClasses?: boolean;
|
|
52
|
+
}) => string;
|
|
53
|
+
/**
|
|
54
|
+
* Resolve an HtmlParser for the current runtime: the native `DOMParser` in the
|
|
55
|
+
* browser (and jsdom-based test envs), or a jsdom `DOMParser` INSTANCE on a
|
|
56
|
+
* pure-node server — created and returned directly, never assigned to a global,
|
|
57
|
+
* so it is immune to SSR execution-context differences. The jsdom specifier is
|
|
58
|
+
* assembled at runtime so no bundler follows it into a browser build. Memoised
|
|
59
|
+
* on the server (JSDOM construction is relatively expensive).
|
|
60
|
+
*/
|
|
61
|
+
export declare const resolveHtmlParser: () => Promise<HtmlParser>;
|
|
62
|
+
/**
|
|
63
|
+
* Normalise an RTE value to a Tiptap JSON document. HTML strings are parsed with
|
|
64
|
+
* `parser` (defaults to the browser's native DOMParser); JSON documents pass
|
|
65
|
+
* through unchanged. Returns undefined for empty/blank input so callers can omit
|
|
66
|
+
* empty fields. `schemaVersion` pins the parse schema — a migration passes its own
|
|
67
|
+
* version so its output can't drift when the live schema gains an extension;
|
|
68
|
+
* everything else omits it and parses with the latest.
|
|
69
|
+
*/
|
|
70
|
+
export declare const toRteJson: (value: RichTextValue | null | undefined, parser?: HtmlParser, schemaVersion?: number) => JSONContent | undefined;
|
|
71
|
+
/**
|
|
72
|
+
* Convert a PLAIN-TEXT field to a Tiptap JSON document. Plain-text fields persist
|
|
73
|
+
* newlines percent-encoded (`ESCAPED_NEWLINE_CHARACTER`, `%0A`); fed straight to the
|
|
74
|
+
* HTML parser those survive as a literal `"%0A"` run with the line structure lost, so
|
|
75
|
+
* we first turn them (and any raw `\n`) into `<br>` — the same shim the retired runtime
|
|
76
|
+
* rewrap applied via getRenderText before `setContent`. Guarded on `%0A` so a legacy
|
|
77
|
+
* RTE-HTML string (whose pretty-print `\n` must stay insignificant whitespace, stripped
|
|
78
|
+
* by `stripIndentationTextNodes`) is passed through untouched. JSON docs pass through.
|
|
79
|
+
*/
|
|
80
|
+
export declare const plainTextToRteJson: (value: RichTextValue | null | undefined, parser?: HtmlParser, schemaVersion?: number) => JSONContent | undefined;
|
|
81
|
+
/**
|
|
82
|
+
* BP-5969 — build the Tiptap doc a factory stores for an RTE field: the RTE-JSON **source** that
|
|
83
|
+
* replaces the plain-string-then-convert seam. STRUCTURE only (paragraph + text + `textAlign`) —
|
|
84
|
+
* colour and role typography are baked afterwards by the init step (`applyTextContrast` +
|
|
85
|
+
* `authorContentRteFields`), since colour is contrast-derived and must not be duplicated per factory.
|
|
86
|
+
* Schema-built (never a hand-written literal), so it stays valid and matches migration output.
|
|
87
|
+
*
|
|
88
|
+
* Empty text → an empty paragraph (still a doc, never a string). A ProseMirror text node cannot be
|
|
89
|
+
* empty, so an empty field has no run: its colour then lives on the style object until the user types,
|
|
90
|
+
* when `buildInitialMarks` seeds the first run from it.
|
|
91
|
+
*/
|
|
92
|
+
export declare const rteDoc: (text: string, textAlign?: string, parser?: HtmlParser) => JSONContent;
|
|
93
|
+
/**
|
|
94
|
+
* BP-5969 — inject `newText` into a template RTE doc while KEEPING the template's embedded style.
|
|
95
|
+
* Personalisation supplies only plain text; writing it raw drops the doc and its style (colour +
|
|
96
|
+
* typography live in the run marks). This lifts the template's **style skeleton** — the FIRST text
|
|
97
|
+
* run's `textStyle` mark (colour + role-var refs + any literal override) and the first block's
|
|
98
|
+
* alignment — and reflows the new text through it: a single paragraph whose lines join with hard
|
|
99
|
+
* breaks (matching how plain text is authored), every run carrying that mark. Per-word variation (a
|
|
100
|
+
* coloured word, an inline link) collapses to the base style — an accepted, documented loss; a
|
|
101
|
+
* uniformly-styled field comes out identical.
|
|
102
|
+
*
|
|
103
|
+
* The library owns schema handling: `Node.fromJSON` validates the template and hydrates real marks,
|
|
104
|
+
* `schema.text` applies them. No hand-written JSON and no `DOMParser`, so it is isomorphic — it runs
|
|
105
|
+
* on the server draft path where an editor or an HTML parse could not. The linked role lives on the
|
|
106
|
+
* sibling style object (`textStyleType`), untouched here, so the reflowed block still repaints on a
|
|
107
|
+
* role edit.
|
|
108
|
+
*
|
|
109
|
+
* A template that cannot be parsed, or that has no styled run, degrades to unstyled reflow rather than
|
|
110
|
+
* throwing — one bad field must not abort a whole personalisation pass.
|
|
111
|
+
*/
|
|
112
|
+
export declare const reflowRteDoc: (templateDoc: JSONContent, newText: string) => JSONContent;
|