@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,179 +0,0 @@
|
|
|
1
|
-
import { getSchema } from '@tiptap/core';
|
|
2
|
-
import { DOMParser as ProseMirrorDOMParser } from '@tiptap/pm/model';
|
|
3
|
-
import type { JSONContent } from '@tiptap/vue-3';
|
|
4
|
-
import { renderToHTMLString } from '@tiptap/static-renderer/pm/html-string';
|
|
5
|
-
import { getRteExtensions } from '../composables/rich-text-editor/getRteExtensions';
|
|
6
|
-
import { isTiptapDocument, getRteJsonPlainText } from './rich-text-editor.util';
|
|
7
|
-
|
|
8
|
-
export { isTiptapDocument, getRteJsonPlainText };
|
|
9
|
-
|
|
10
|
-
/**
|
|
11
|
-
* BP-5787 — the boundary plumbing for storing RTE as Tiptap JSON.
|
|
12
|
-
*
|
|
13
|
-
* An RTE field is either a legacy inline-HTML string (pre-migration, or a
|
|
14
|
-
* not-yet-migrated published site) or a Tiptap JSON document (post-migration).
|
|
15
|
-
* These helpers let every consumer treat the two uniformly:
|
|
16
|
-
*
|
|
17
|
-
* - isTiptapDocument — the canonical discriminator (object with type 'doc').
|
|
18
|
-
* - renderRteToHtml — render either form to final HTML for display.
|
|
19
|
-
* - toRteJson — normalise either form to JSON for storage.
|
|
20
|
-
*
|
|
21
|
-
* The schema-driven core of both directions is Tiptap/ProseMirror, fed by the
|
|
22
|
-
* single-source-of-truth extension set (getRteExtensions) — so the mapping lives
|
|
23
|
-
* in the extensions' schema, not a hand-maintained copy that drifts:
|
|
24
|
-
*
|
|
25
|
-
* - renderRteToHtml uses @tiptap/static-renderer (renderToHTMLString). It is
|
|
26
|
-
* DOM-less, so it runs on the server (SSR/publish/preview), not just the
|
|
27
|
-
* browser, and needs no Editor instance.
|
|
28
|
-
* - toRteJson turns an HTML string into a DOM node with an INJECTED parser and
|
|
29
|
-
* feeds it to ProseMirror's schema-driven DOMParser. The HTML→DOM step needs
|
|
30
|
-
* a DOM parser; rather than read the global `window.DOMParser` (as Tiptap's
|
|
31
|
-
* `generateJSON` does — unusable on a pure-node server and fragile across SSR
|
|
32
|
-
* execution contexts), the parser is supplied by the caller: the native
|
|
33
|
-
* `DOMParser` in the browser, a jsdom `DOMParser` *instance* on the server
|
|
34
|
-
* (see resolveHtmlParser). No global is ever mutated, so the conversion is
|
|
35
|
-
* fully isomorphic regardless of how the SSR host bundles/executes this code.
|
|
36
|
-
*/
|
|
37
|
-
export type RichTextValue = string | JSONContent;
|
|
38
|
-
|
|
39
|
-
// One extension set shared by both directions (render + parse). Schema knowledge
|
|
40
|
-
// lives here, once — Tiptap/extension upgrades propagate to both automatically.
|
|
41
|
-
const RTE_EXTENSIONS = getRteExtensions();
|
|
42
|
-
|
|
43
|
-
// ProseMirror schema derived once from the shared extension set. This is the
|
|
44
|
-
// schema-driven heart of HTML→JSON (no drift); only the HTML→DOM step is injected.
|
|
45
|
-
const RTE_SCHEMA = getSchema(RTE_EXTENSIONS);
|
|
46
|
-
|
|
47
|
-
/**
|
|
48
|
-
* A `DOMParser`-compatible object: turns an HTML string into a Document whose
|
|
49
|
-
* `body` is a DOM node ProseMirror can parse. The browser's native `DOMParser`
|
|
50
|
-
* and jsdom's `DOMParser` both satisfy this, so the DOM dependency is injected
|
|
51
|
-
* rather than read from a global.
|
|
52
|
-
*/
|
|
53
|
-
export interface HtmlParser {
|
|
54
|
-
parseFromString(html: string, type: 'text/html'): Document;
|
|
55
|
-
}
|
|
56
|
-
|
|
57
|
-
/**
|
|
58
|
-
* Render an RTE value to final HTML. Legacy HTML strings pass through untouched
|
|
59
|
-
* (they are already HTML); Tiptap JSON is serialised by @tiptap/static-renderer
|
|
60
|
-
* from the extension schema — no editor, no DOM — so it works on the server
|
|
61
|
-
* (SSR/publish), not just the browser.
|
|
62
|
-
*/
|
|
63
|
-
export const renderRteToHtml = (
|
|
64
|
-
value: RichTextValue | null | undefined,
|
|
65
|
-
): string => {
|
|
66
|
-
if (value == null || value === '') return '';
|
|
67
|
-
|
|
68
|
-
if (typeof value === 'string') return value;
|
|
69
|
-
|
|
70
|
-
try {
|
|
71
|
-
return renderToHTMLString({ content: value, extensions: RTE_EXTENSIONS });
|
|
72
|
-
} catch (error) {
|
|
73
|
-
// renderToHTMLString throws on a node/mark type this renderer's schema
|
|
74
|
-
// doesn't know. The realistic trigger is version skew — the library ships to
|
|
75
|
-
// multiple apps, so a maker on a newer schema can persist a node an older
|
|
76
|
-
// deployed renderer can't render. Degrade to visible text rather than let
|
|
77
|
-
// one field throw out of its (unguarded) computed and 500 the whole page.
|
|
78
|
-
console.error(
|
|
79
|
-
'renderRteToHtml: unrenderable doc, falling back to plain text',
|
|
80
|
-
error,
|
|
81
|
-
);
|
|
82
|
-
|
|
83
|
-
return getRteJsonPlainText(value);
|
|
84
|
-
}
|
|
85
|
-
};
|
|
86
|
-
|
|
87
|
-
// Tiptap's elementFromString strips whitespace-only text nodes (pretty-print
|
|
88
|
-
// indentation between tags) before parsing; replicate it so injected-parser
|
|
89
|
-
// output stays identical to the previous generateJSON-based conversion.
|
|
90
|
-
const stripIndentationTextNodes = (node: Node): Node => {
|
|
91
|
-
const children = node.childNodes;
|
|
92
|
-
|
|
93
|
-
for (let i = children.length - 1; i >= 0; i -= 1) {
|
|
94
|
-
const child = children[i];
|
|
95
|
-
|
|
96
|
-
if (
|
|
97
|
-
child.nodeType === 3 &&
|
|
98
|
-
child.nodeValue &&
|
|
99
|
-
/^(\n\s\s|\n)$/.test(child.nodeValue)
|
|
100
|
-
) {
|
|
101
|
-
node.removeChild(child);
|
|
102
|
-
} else if (child.nodeType === 1) {
|
|
103
|
-
stripIndentationTextNodes(child);
|
|
104
|
-
}
|
|
105
|
-
}
|
|
106
|
-
|
|
107
|
-
return node;
|
|
108
|
-
};
|
|
109
|
-
|
|
110
|
-
const htmlToRteJson = (html: string, parser: HtmlParser): JSONContent => {
|
|
111
|
-
const body = parser.parseFromString(`<body>${html}</body>`, 'text/html').body;
|
|
112
|
-
const dom = stripIndentationTextNodes(body);
|
|
113
|
-
|
|
114
|
-
return ProseMirrorDOMParser.fromSchema(RTE_SCHEMA).parse(dom).toJSON();
|
|
115
|
-
};
|
|
116
|
-
|
|
117
|
-
let serverParserPromise: Promise<HtmlParser> | null = null;
|
|
118
|
-
|
|
119
|
-
/**
|
|
120
|
-
* Resolve an HtmlParser for the current runtime: the native `DOMParser` in the
|
|
121
|
-
* browser (and jsdom-based test envs), or a jsdom `DOMParser` INSTANCE on a
|
|
122
|
-
* pure-node server — created and returned directly, never assigned to a global,
|
|
123
|
-
* so it is immune to SSR execution-context differences. The jsdom specifier is
|
|
124
|
-
* assembled at runtime so no bundler follows it into a browser build. Memoised
|
|
125
|
-
* on the server (JSDOM construction is relatively expensive).
|
|
126
|
-
*/
|
|
127
|
-
export const resolveHtmlParser = async (): Promise<HtmlParser> => {
|
|
128
|
-
if (typeof DOMParser !== 'undefined') return new DOMParser();
|
|
129
|
-
|
|
130
|
-
if (!serverParserPromise) {
|
|
131
|
-
const jsdomModuleId = ['js', 'dom'].join('');
|
|
132
|
-
|
|
133
|
-
serverParserPromise = import(/* @vite-ignore */ jsdomModuleId)
|
|
134
|
-
.then((mod) => {
|
|
135
|
-
const { JSDOM } = mod as {
|
|
136
|
-
JSDOM: new (html?: string) => {
|
|
137
|
-
window: { DOMParser: new () => HtmlParser };
|
|
138
|
-
};
|
|
139
|
-
};
|
|
140
|
-
const { DOMParser: JsdomDOMParser } = new JSDOM('').window;
|
|
141
|
-
|
|
142
|
-
return new JsdomDOMParser();
|
|
143
|
-
})
|
|
144
|
-
.catch((error) => {
|
|
145
|
-
// Don't cache the failure — let a later call retry the import.
|
|
146
|
-
serverParserPromise = null;
|
|
147
|
-
|
|
148
|
-
throw error;
|
|
149
|
-
});
|
|
150
|
-
}
|
|
151
|
-
|
|
152
|
-
return serverParserPromise;
|
|
153
|
-
};
|
|
154
|
-
|
|
155
|
-
const getDefaultParser = (): HtmlParser => {
|
|
156
|
-
if (typeof DOMParser !== 'undefined') return new DOMParser();
|
|
157
|
-
|
|
158
|
-
throw new Error(
|
|
159
|
-
'toRteJson: no global DOMParser in this environment. On the server, pass an ' +
|
|
160
|
-
'explicit parser as the second argument (see resolveHtmlParser).',
|
|
161
|
-
);
|
|
162
|
-
};
|
|
163
|
-
|
|
164
|
-
/**
|
|
165
|
-
* Normalise an RTE value to a Tiptap JSON document. HTML strings are parsed with
|
|
166
|
-
* `parser` (defaults to the browser's native DOMParser); JSON documents pass
|
|
167
|
-
* through unchanged. Returns undefined for empty/blank input so callers can omit
|
|
168
|
-
* empty fields.
|
|
169
|
-
*/
|
|
170
|
-
export const toRteJson = (
|
|
171
|
-
value: RichTextValue | null | undefined,
|
|
172
|
-
parser?: HtmlParser,
|
|
173
|
-
): JSONContent | undefined => {
|
|
174
|
-
if (value == null || value === '') return undefined;
|
|
175
|
-
|
|
176
|
-
if (isTiptapDocument(value)) return value;
|
|
177
|
-
|
|
178
|
-
return htmlToRteJson(value, parser ?? getDefaultParser());
|
|
179
|
-
};
|
|
@@ -1,29 +0,0 @@
|
|
|
1
|
-
import type { JSONContent } from '@tiptap/vue-3';
|
|
2
|
-
|
|
3
|
-
/**
|
|
4
|
-
* Is this value RTE content, and in which shape?
|
|
5
|
-
*
|
|
6
|
-
* Pure predicates with NO runtime imports, kept out of `rich-text-editor.util.ts`
|
|
7
|
-
* (which pulls `dompurify` and the render helpers) so a pure consumer — the Color
|
|
8
|
-
* Matches panel, which must tell a plain string from legacy RTE HTML — doesn't drag
|
|
9
|
-
* in the editor toolchain. That module re-exports both, so callers are unchanged.
|
|
10
|
-
*/
|
|
11
|
-
|
|
12
|
-
/** Canonical discriminator for the JSON RTE model: an object with `type: 'doc'`. */
|
|
13
|
-
export const isTiptapDocument = (value: unknown): value is JSONContent =>
|
|
14
|
-
typeof value === 'object' &&
|
|
15
|
-
value !== null &&
|
|
16
|
-
(value as JSONContent).type === 'doc';
|
|
17
|
-
|
|
18
|
-
/**
|
|
19
|
-
* A legacy inline-HTML RTE string: opens with a tag and closes with one. It does
|
|
20
|
-
* NOT match plain strings (`Price < 10`), CSS values, or text with merely embedded
|
|
21
|
-
* HTML, because genuine RTE always begins with a block tag. Legacy shape only —
|
|
22
|
-
* post-migration use isTiptapDocument, or hasRTEContent for either shape.
|
|
23
|
-
*/
|
|
24
|
-
export const isRteHtmlString = (value: unknown): value is string =>
|
|
25
|
-
typeof value === 'string' &&
|
|
26
|
-
value.length > 0 &&
|
|
27
|
-
/^<[A-Za-z][A-Za-z0-9-]*\b[^>]*>[\s\S]*<\/[A-Za-z][A-Za-z0-9-]*>$/.test(
|
|
28
|
-
value.trim(),
|
|
29
|
-
);
|
|
@@ -1,401 +0,0 @@
|
|
|
1
|
-
import { describe, it, expect } from 'vitest';
|
|
2
|
-
import type { BrandPageModel, Content } from '../../brand-page/models';
|
|
3
|
-
import type { UpdateGlobalStylesArguments } from '../parsers/ai-toolcall-parser';
|
|
4
|
-
import { BUILDER_TYPES } from '../models';
|
|
5
|
-
import { GlobalStylesBuilder } from './global-styles-builder';
|
|
6
|
-
import {
|
|
7
|
-
collectChangedFontFamilies,
|
|
8
|
-
propagateFontFamiliesToContents,
|
|
9
|
-
} from './global-font-propagation';
|
|
10
|
-
|
|
11
|
-
/**
|
|
12
|
-
* BP-5780 ISSUE-01: an AI global font change only reached preset-bound content.
|
|
13
|
-
* Template-authored sections carry detached `*Style` objects and inline RTE
|
|
14
|
-
* `font-family` marks that override the preset at render, so "use a serif font"
|
|
15
|
-
* produced a confident reply and a pixel-identical page. Propagation must align
|
|
16
|
-
* detached styles and rewrite inline marks for every changed category.
|
|
17
|
-
*/
|
|
18
|
-
|
|
19
|
-
const RTE_TITLE =
|
|
20
|
-
'<p><span style="font-family: Playfair Display">Bloom</span></p>';
|
|
21
|
-
|
|
22
|
-
// Injectable stand-in for the Tiptap rewrite — tags the string so tests can
|
|
23
|
-
// assert exactly which fields were rewritten and with which family.
|
|
24
|
-
const fakeApplyFont = (text: string, fontFamily: string) =>
|
|
25
|
-
`${text}::rewritten(${fontFamily})`;
|
|
26
|
-
|
|
27
|
-
const makeModel = (contents: Partial<Content>[]): BrandPageModel =>
|
|
28
|
-
({
|
|
29
|
-
styles: { textStyles: { textStyleOptions: {} } },
|
|
30
|
-
pages: [{ id: 'p1', contents }],
|
|
31
|
-
}) as unknown as BrandPageModel;
|
|
32
|
-
|
|
33
|
-
describe('collectChangedFontFamilies', () => {
|
|
34
|
-
it('extracts per-category families from textStyleOptions', () => {
|
|
35
|
-
const changed = collectChangedFontFamilies({
|
|
36
|
-
textStyleOptions: {
|
|
37
|
-
titles: { style: { fontFamily: 'EB Garamond' } },
|
|
38
|
-
headings: { style: { fontFamily: 'EB Garamond' } },
|
|
39
|
-
buttons: { style: { fontFamily: 'Inter' } },
|
|
40
|
-
},
|
|
41
|
-
} as UpdateGlobalStylesArguments['textStyles']);
|
|
42
|
-
|
|
43
|
-
expect(changed).toEqual({
|
|
44
|
-
titles: 'EB Garamond',
|
|
45
|
-
headings: 'EB Garamond',
|
|
46
|
-
buttons: 'Inter',
|
|
47
|
-
});
|
|
48
|
-
});
|
|
49
|
-
|
|
50
|
-
it('falls back textFontFamily → paragraphs when no explicit paragraphs entry', () => {
|
|
51
|
-
const changed = collectChangedFontFamilies({
|
|
52
|
-
textFontFamily: 'Inter',
|
|
53
|
-
} as UpdateGlobalStylesArguments['textStyles']);
|
|
54
|
-
|
|
55
|
-
expect(changed).toEqual({ paragraphs: 'Inter' });
|
|
56
|
-
});
|
|
57
|
-
|
|
58
|
-
it('returns empty for calls that change no fonts', () => {
|
|
59
|
-
expect(collectChangedFontFamilies(undefined)).toEqual({});
|
|
60
|
-
expect(
|
|
61
|
-
collectChangedFontFamilies({
|
|
62
|
-
style: { color: '#111111' },
|
|
63
|
-
} as UpdateGlobalStylesArguments['textStyles']),
|
|
64
|
-
).toEqual({});
|
|
65
|
-
});
|
|
66
|
-
});
|
|
67
|
-
|
|
68
|
-
describe('propagateFontFamiliesToContents', () => {
|
|
69
|
-
it('aligns detached styles and rewrites RTE marks for the changed category', () => {
|
|
70
|
-
const content = {
|
|
71
|
-
id: 'c1',
|
|
72
|
-
type: 'about-section',
|
|
73
|
-
title: RTE_TITLE,
|
|
74
|
-
titleStyle: { fontFamily: 'Playfair Display' },
|
|
75
|
-
} as unknown as Content;
|
|
76
|
-
const model = makeModel([content]);
|
|
77
|
-
|
|
78
|
-
propagateFontFamiliesToContents(
|
|
79
|
-
model,
|
|
80
|
-
{ headings: 'EB Garamond' },
|
|
81
|
-
fakeApplyFont,
|
|
82
|
-
);
|
|
83
|
-
|
|
84
|
-
const c = model.pages[0].contents[0] as unknown as Record<string, unknown>;
|
|
85
|
-
|
|
86
|
-
expect((c.titleStyle as Record<string, unknown>).fontFamily).toBe(
|
|
87
|
-
'EB Garamond',
|
|
88
|
-
);
|
|
89
|
-
expect(c.title).toBe(`${RTE_TITLE}::rewritten(EB Garamond)`);
|
|
90
|
-
});
|
|
91
|
-
|
|
92
|
-
it('banner-section titles follow the titles category, not headings', () => {
|
|
93
|
-
const content = {
|
|
94
|
-
id: 'c1',
|
|
95
|
-
type: 'banner-section',
|
|
96
|
-
title: RTE_TITLE,
|
|
97
|
-
titleStyle: { fontFamily: 'Playfair Display' },
|
|
98
|
-
} as unknown as Content;
|
|
99
|
-
const model = makeModel([content]);
|
|
100
|
-
|
|
101
|
-
propagateFontFamiliesToContents(
|
|
102
|
-
model,
|
|
103
|
-
{ titles: 'Lexend Deca', headings: 'EB Garamond' },
|
|
104
|
-
fakeApplyFont,
|
|
105
|
-
);
|
|
106
|
-
|
|
107
|
-
const c = model.pages[0].contents[0] as unknown as Record<string, unknown>;
|
|
108
|
-
|
|
109
|
-
expect((c.titleStyle as Record<string, unknown>).fontFamily).toBe(
|
|
110
|
-
'Lexend Deca',
|
|
111
|
-
);
|
|
112
|
-
expect(c.title).toBe(`${RTE_TITLE}::rewritten(Lexend Deca)`);
|
|
113
|
-
});
|
|
114
|
-
|
|
115
|
-
it('preset-bound styles stay preset-bound; only their RTE marks are rewritten', () => {
|
|
116
|
-
const content = {
|
|
117
|
-
id: 'c1',
|
|
118
|
-
type: 'about-section',
|
|
119
|
-
title: RTE_TITLE,
|
|
120
|
-
titleStyle: { textStyleType: 'headings' },
|
|
121
|
-
} as unknown as Content;
|
|
122
|
-
const model = makeModel([content]);
|
|
123
|
-
|
|
124
|
-
propagateFontFamiliesToContents(
|
|
125
|
-
model,
|
|
126
|
-
{ headings: 'EB Garamond' },
|
|
127
|
-
fakeApplyFont,
|
|
128
|
-
);
|
|
129
|
-
|
|
130
|
-
const c = model.pages[0].contents[0] as unknown as Record<string, unknown>;
|
|
131
|
-
const style = c.titleStyle as unknown as Record<string, unknown>;
|
|
132
|
-
|
|
133
|
-
expect(style.textStyleType).toBe('headings');
|
|
134
|
-
expect(style.fontFamily).toBeUndefined();
|
|
135
|
-
expect(c.title).toBe(`${RTE_TITLE}::rewritten(EB Garamond)`);
|
|
136
|
-
});
|
|
137
|
-
|
|
138
|
-
it('walks items arrays (per-item text fields and styles)', () => {
|
|
139
|
-
const itemText = '<p>Live music</p>';
|
|
140
|
-
const content = {
|
|
141
|
-
id: 'c1',
|
|
142
|
-
type: 'shapes-section',
|
|
143
|
-
items: [
|
|
144
|
-
{
|
|
145
|
-
heading: itemText,
|
|
146
|
-
headingStyle: { fontFamily: 'Playfair Display' },
|
|
147
|
-
text: itemText,
|
|
148
|
-
},
|
|
149
|
-
],
|
|
150
|
-
} as unknown as Content;
|
|
151
|
-
const model = makeModel([content]);
|
|
152
|
-
|
|
153
|
-
propagateFontFamiliesToContents(
|
|
154
|
-
model,
|
|
155
|
-
{ headings: 'EB Garamond', paragraphs: 'Inter' },
|
|
156
|
-
fakeApplyFont,
|
|
157
|
-
);
|
|
158
|
-
|
|
159
|
-
const item = (
|
|
160
|
-
model.pages[0].contents[0] as unknown as Record<string, unknown>
|
|
161
|
-
).items as Record<string, unknown>[];
|
|
162
|
-
|
|
163
|
-
expect((item[0].headingStyle as Record<string, unknown>).fontFamily).toBe(
|
|
164
|
-
'EB Garamond',
|
|
165
|
-
);
|
|
166
|
-
expect(item[0].heading).toBe(`${itemText}::rewritten(EB Garamond)`);
|
|
167
|
-
expect(item[0].text).toBe(`${itemText}::rewritten(Inter)`);
|
|
168
|
-
});
|
|
169
|
-
|
|
170
|
-
it('leaves fields alone when their category did not change', () => {
|
|
171
|
-
const content = {
|
|
172
|
-
id: 'c1',
|
|
173
|
-
type: 'about-section',
|
|
174
|
-
title: RTE_TITLE,
|
|
175
|
-
titleStyle: { fontFamily: 'Playfair Display' },
|
|
176
|
-
description: RTE_TITLE,
|
|
177
|
-
descriptionStyle: { fontFamily: 'Lato' },
|
|
178
|
-
} as unknown as Content;
|
|
179
|
-
const model = makeModel([content]);
|
|
180
|
-
|
|
181
|
-
propagateFontFamiliesToContents(
|
|
182
|
-
model,
|
|
183
|
-
{ paragraphs: 'Inter' },
|
|
184
|
-
fakeApplyFont,
|
|
185
|
-
);
|
|
186
|
-
|
|
187
|
-
const c = model.pages[0].contents[0] as unknown as Record<string, unknown>;
|
|
188
|
-
|
|
189
|
-
expect((c.titleStyle as Record<string, unknown>).fontFamily).toBe(
|
|
190
|
-
'Playfair Display',
|
|
191
|
-
);
|
|
192
|
-
expect(c.title).toBe(RTE_TITLE);
|
|
193
|
-
expect((c.descriptionStyle as Record<string, unknown>).fontFamily).toBe(
|
|
194
|
-
'Inter',
|
|
195
|
-
);
|
|
196
|
-
expect(c.description).toBe(`${RTE_TITLE}::rewritten(Inter)`);
|
|
197
|
-
});
|
|
198
|
-
|
|
199
|
-
it('non-RTE plain text fields are not rewritten (style still aligned)', () => {
|
|
200
|
-
const content = {
|
|
201
|
-
id: 'c1',
|
|
202
|
-
type: 'about-section',
|
|
203
|
-
title: 'Plain title',
|
|
204
|
-
titleStyle: { fontFamily: 'Playfair Display' },
|
|
205
|
-
} as unknown as Content;
|
|
206
|
-
const model = makeModel([content]);
|
|
207
|
-
|
|
208
|
-
propagateFontFamiliesToContents(
|
|
209
|
-
model,
|
|
210
|
-
{ headings: 'EB Garamond' },
|
|
211
|
-
fakeApplyFont,
|
|
212
|
-
);
|
|
213
|
-
|
|
214
|
-
const c = model.pages[0].contents[0] as unknown as Record<string, unknown>;
|
|
215
|
-
|
|
216
|
-
expect(c.title).toBe('Plain title');
|
|
217
|
-
expect((c.titleStyle as Record<string, unknown>).fontFamily).toBe(
|
|
218
|
-
'EB Garamond',
|
|
219
|
-
);
|
|
220
|
-
});
|
|
221
|
-
});
|
|
222
|
-
|
|
223
|
-
describe('GlobalStylesBuilder font propagation wiring', () => {
|
|
224
|
-
it('buildAsync propagates changed category families into existing detached styles', async () => {
|
|
225
|
-
const content = {
|
|
226
|
-
id: 'c1',
|
|
227
|
-
type: 'about-section',
|
|
228
|
-
title: 'Plain title', // plain text — the builder path must not need the RTE editor here
|
|
229
|
-
titleStyle: { fontFamily: 'Playfair Display' },
|
|
230
|
-
} as unknown as Content;
|
|
231
|
-
const model = {
|
|
232
|
-
styles: {
|
|
233
|
-
textStyles: {
|
|
234
|
-
textStyleOptions: {
|
|
235
|
-
headings: { style: { fontFamily: 'Lato' }, isModified: false },
|
|
236
|
-
},
|
|
237
|
-
},
|
|
238
|
-
buttonStyles: { style: {} },
|
|
239
|
-
backgroundStyles: { style: {} },
|
|
240
|
-
},
|
|
241
|
-
pages: [{ id: 'p1', contents: [content] }],
|
|
242
|
-
} as unknown as BrandPageModel;
|
|
243
|
-
|
|
244
|
-
const builder = new GlobalStylesBuilder({
|
|
245
|
-
id: 'g1',
|
|
246
|
-
type: BUILDER_TYPES.UPDATE_GLOBAL_STYLES,
|
|
247
|
-
payload: {
|
|
248
|
-
textStyles: {
|
|
249
|
-
textStyleOptions: {
|
|
250
|
-
headings: { style: { fontFamily: 'EB Garamond' } },
|
|
251
|
-
},
|
|
252
|
-
},
|
|
253
|
-
} as UpdateGlobalStylesArguments,
|
|
254
|
-
});
|
|
255
|
-
|
|
256
|
-
const result = await builder.buildAsync(model);
|
|
257
|
-
|
|
258
|
-
expect(result.errors).toBeUndefined();
|
|
259
|
-
// Preset updated (pre-existing behaviour)…
|
|
260
|
-
expect(
|
|
261
|
-
model.styles.textStyles.textStyleOptions.headings.style.fontFamily,
|
|
262
|
-
).toBe('EB Garamond');
|
|
263
|
-
// …AND the detached section style now follows (the fix).
|
|
264
|
-
expect(
|
|
265
|
-
(model.pages[0].contents[0] as unknown as Record<string, unknown>)
|
|
266
|
-
.titleStyle,
|
|
267
|
-
).toMatchObject({ fontFamily: 'EB Garamond' });
|
|
268
|
-
});
|
|
269
|
-
});
|
|
270
|
-
|
|
271
|
-
describe('propagateFontFamiliesToContents — Tiptap JSON docs (BP-6079)', () => {
|
|
272
|
-
// The migrated model stores RTE fields as Tiptap JSON; the string-only path
|
|
273
|
-
// skipped them, so every inline mark kept the old family while the *Style
|
|
274
|
-
// objects moved (eval TYP-BP5540, compact-site).
|
|
275
|
-
const doc = (
|
|
276
|
-
family: string | undefined,
|
|
277
|
-
text = 'Your Local Music Destination',
|
|
278
|
-
) => ({
|
|
279
|
-
type: 'doc',
|
|
280
|
-
content: [
|
|
281
|
-
{
|
|
282
|
-
type: 'paragraph',
|
|
283
|
-
attrs: { textAlign: 'left' },
|
|
284
|
-
content: [
|
|
285
|
-
{
|
|
286
|
-
type: 'text',
|
|
287
|
-
marks: [
|
|
288
|
-
{ type: 'bold' },
|
|
289
|
-
{
|
|
290
|
-
type: 'textStyle',
|
|
291
|
-
attrs: {
|
|
292
|
-
...(family ? { fontFamily: family } : {}),
|
|
293
|
-
fontSize: '4.52em',
|
|
294
|
-
lineHeight: '1.3',
|
|
295
|
-
color: 'rgb(255, 244, 224)',
|
|
296
|
-
},
|
|
297
|
-
},
|
|
298
|
-
],
|
|
299
|
-
text,
|
|
300
|
-
},
|
|
301
|
-
],
|
|
302
|
-
},
|
|
303
|
-
],
|
|
304
|
-
});
|
|
305
|
-
|
|
306
|
-
it('rewrites the fontFamily attr of every textStyle mark, keeping the other attrs and marks', () => {
|
|
307
|
-
const content = {
|
|
308
|
-
id: 'c1',
|
|
309
|
-
type: 'banner-section',
|
|
310
|
-
title: doc('Aboreto'),
|
|
311
|
-
titleStyle: { fontFamily: 'Aboreto' },
|
|
312
|
-
} as unknown as Content;
|
|
313
|
-
const model = makeModel([content]);
|
|
314
|
-
|
|
315
|
-
propagateFontFamiliesToContents(model, { titles: 'Oswald' }, fakeApplyFont);
|
|
316
|
-
|
|
317
|
-
const c = model.pages[0].contents[0] as unknown as Record<string, unknown>;
|
|
318
|
-
const run = (c.title as ReturnType<typeof doc>).content[0].content[0];
|
|
319
|
-
|
|
320
|
-
expect((c.titleStyle as Record<string, unknown>).fontFamily).toBe('Oswald');
|
|
321
|
-
expect(run.marks[0]).toEqual({ type: 'bold' });
|
|
322
|
-
expect(run.marks[1].attrs).toEqual({
|
|
323
|
-
fontFamily: 'Oswald',
|
|
324
|
-
fontSize: '4.52em',
|
|
325
|
-
lineHeight: '1.3',
|
|
326
|
-
color: 'rgb(255, 244, 224)',
|
|
327
|
-
});
|
|
328
|
-
expect(run.text).toBe('Your Local Music Destination');
|
|
329
|
-
});
|
|
330
|
-
|
|
331
|
-
it('leaves a textStyle mark without a family alone (it inherits the updated style)', () => {
|
|
332
|
-
const content = {
|
|
333
|
-
id: 'c1',
|
|
334
|
-
type: 'about-section',
|
|
335
|
-
title: doc(undefined),
|
|
336
|
-
titleStyle: { fontFamily: 'Aboreto' },
|
|
337
|
-
} as unknown as Content;
|
|
338
|
-
const model = makeModel([content]);
|
|
339
|
-
|
|
340
|
-
propagateFontFamiliesToContents(
|
|
341
|
-
model,
|
|
342
|
-
{ headings: 'Oswald' },
|
|
343
|
-
fakeApplyFont,
|
|
344
|
-
);
|
|
345
|
-
|
|
346
|
-
const c = model.pages[0].contents[0] as unknown as Record<string, unknown>;
|
|
347
|
-
const run = (c.title as ReturnType<typeof doc>).content[0].content[0];
|
|
348
|
-
|
|
349
|
-
expect(run.marks[1].attrs?.fontFamily).toBeUndefined();
|
|
350
|
-
});
|
|
351
|
-
|
|
352
|
-
it('walks item docs (text section textItems)', () => {
|
|
353
|
-
const content = {
|
|
354
|
-
id: 'c1',
|
|
355
|
-
type: 'text',
|
|
356
|
-
textItems: [
|
|
357
|
-
{
|
|
358
|
-
text: doc('Tenor Sans', 'Lessons'),
|
|
359
|
-
textStyle: { fontFamily: 'Tenor Sans' },
|
|
360
|
-
},
|
|
361
|
-
],
|
|
362
|
-
} as unknown as Content;
|
|
363
|
-
const model = makeModel([content]);
|
|
364
|
-
|
|
365
|
-
propagateFontFamiliesToContents(
|
|
366
|
-
model,
|
|
367
|
-
{ paragraphs: 'Oswald' },
|
|
368
|
-
fakeApplyFont,
|
|
369
|
-
);
|
|
370
|
-
|
|
371
|
-
const items = (
|
|
372
|
-
model.pages[0].contents[0] as unknown as Record<string, unknown>
|
|
373
|
-
).textItems as Record<string, unknown>[];
|
|
374
|
-
const run = (items[0].text as ReturnType<typeof doc>).content[0].content[0];
|
|
375
|
-
|
|
376
|
-
expect((items[0].textStyle as Record<string, unknown>).fontFamily).toBe(
|
|
377
|
-
'Oswald',
|
|
378
|
-
);
|
|
379
|
-
expect(run.marks[1].attrs?.fontFamily).toBe('Oswald');
|
|
380
|
-
});
|
|
381
|
-
|
|
382
|
-
it('legacy HTML strings still go through the editor rewrite', () => {
|
|
383
|
-
const content = {
|
|
384
|
-
id: 'c1',
|
|
385
|
-
type: 'about-section',
|
|
386
|
-
title: RTE_TITLE,
|
|
387
|
-
titleStyle: { fontFamily: 'Playfair Display' },
|
|
388
|
-
} as unknown as Content;
|
|
389
|
-
const model = makeModel([content]);
|
|
390
|
-
|
|
391
|
-
propagateFontFamiliesToContents(
|
|
392
|
-
model,
|
|
393
|
-
{ headings: 'Oswald' },
|
|
394
|
-
fakeApplyFont,
|
|
395
|
-
);
|
|
396
|
-
|
|
397
|
-
expect(
|
|
398
|
-
(model.pages[0].contents[0] as unknown as Record<string, unknown>).title,
|
|
399
|
-
).toBe(`${RTE_TITLE}::rewritten(Oswald)`);
|
|
400
|
-
});
|
|
401
|
-
});
|