@designcrowd/library.brand-page 6.2.11-builder-v2-1 → 6.2.12
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/lib/src/{CreatedOnBrandCrowd-de-de-Dg2pOwbr.js → CreatedOnBrandCrowd-de-de-BtVKllNQ.js} +1 -1
- package/lib/src/{CreatedOnBrandCrowd-en-us-BILs_hsB.js → CreatedOnBrandCrowd-en-us-CX5V0v8u.js} +1 -1
- package/lib/src/{CreatedOnBrandCrowd-es-es-VpxQ0N5F.js → CreatedOnBrandCrowd-es-es-CbA02PCL.js} +1 -1
- package/lib/src/{CreatedOnBrandCrowd-fr-fr-CFHWRHzi.js → CreatedOnBrandCrowd-fr-ca-BQAKruBF.js} +1 -1
- package/lib/src/{CreatedOnBrandCrowd-fr-ca-CFHWRHzi.js → CreatedOnBrandCrowd-fr-fr-BQAKruBF.js} +1 -1
- package/lib/src/{CreatedOnBrandCrowd-pt-pt-CZfs45s9.js → CreatedOnBrandCrowd-pt-br-Yk_yzB3s.js} +1 -1
- package/lib/src/{CreatedOnBrandCrowd-pt-br-CZfs45s9.js → CreatedOnBrandCrowd-pt-pt-Yk_yzB3s.js} +1 -1
- package/lib/src/{CreatedOnDcom-de-de-DYMQ6sIF.js → CreatedOnDcom-de-de-DJZQbPSD.js} +1 -1
- package/lib/src/{CreatedOnDcom-en-us-Dj5sdPid.js → CreatedOnDcom-en-us-BJvNAa4l.js} +1 -1
- package/lib/src/{CreatedOnDcom-es-es-Cx9yNTro.js → CreatedOnDcom-es-es-CUwB1FRY.js} +1 -1
- package/lib/src/{CreatedOnDcom-fr-ca-Bzr0SjGq.js → CreatedOnDcom-fr-ca-CK54U4oh.js} +1 -1
- package/lib/src/{CreatedOnDcom-fr-fr-BgqKY35F.js → CreatedOnDcom-fr-fr-DuUNBGrM.js} +1 -1
- package/lib/src/{CreatedOnDcom-pt-br-CXK6qfvL.js → CreatedOnDcom-pt-br-BfODpFNV.js} +1 -1
- package/lib/src/{CreatedOnDcom-pt-pt-B8SggNTQ.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/brand-page-context.model.d.ts +2 -0
- package/lib/src/brand-page/models/brand-page-context.model.js +7 -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 +34 -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 +44 -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/preview/Preview.mixin.d.ts +7 -0
- package/lib/src/brand-page-maker/components/quick-link-bar/QuickLinkBar.mixin.d.ts +21 -0
- package/lib/src/brand-page-maker/components/seo-settings/SeoPageSettings.mixin.d.ts +25 -1
- package/lib/src/brand-page-maker/components/seo-settings/UrlSettings.mixin.d.ts +25 -1
- package/lib/src/brand-page-maker/components/seo-settings/UseExistingDomainModal.mixin.d.ts +21 -0
- 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 +25 -1
- package/lib/src/brand-page-maker/components/upgrade-to-premium-button/UpgradeToPremiumButton.mixin.d.ts +21 -0
- package/lib/src/brand-page-maker/composables/ai-chat/ai-builder-experiment.d.ts +10 -0
- package/lib/src/brand-page-maker/composables/ai-chat/ai-builder-experiment.js +11 -0
- 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 +14 -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/ai-thread/ai-website-builder-thread-store.d.ts +9 -2
- package/lib/src/brand-page-maker/stores/ai-thread/ai-website-builder-thread-store.js +20 -0
- package/lib/src/brand-page-maker/stores/brandpage-container/brand-page-container-store.d.ts +21 -0
- 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 +7 -1
- package/lib/src/clients/ai-assistant-client.js +7 -15
- 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 +284 -188
- package/lib/src/css/library.brand-page-brandPage.min.css +284 -188
- package/lib/src/css/library.brand-page-designCom.min.css +284 -188
- package/lib/src/css/library.brand-page-preview.min.css +284 -188
- package/lib/src/index.d.ts +2 -1
- package/lib/src/index.mjs +195 -191
- package/lib/src/{lib-7gtW85nE.js → lib-kGRlD3_P.js} +39082 -36131
- 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 +22 -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 +26 -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/new-page-modal/NewPageModal.mixin.d.ts +1 -0
- package/lib/src/shared/page-settings/components/page-settings/PageSettings.mixin.d.ts +38 -5
- package/lib/src/shared/page-settings/components/page-settings-section-styles/PageSettingsSectionStyles.mixin.d.ts +91 -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 +32 -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 +23 -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 +176 -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 +58 -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/brand-page-context.model.ts +13 -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/composables/ai-chat/ai-builder-experiment.test.ts +82 -0
- package/src/brand-page-maker/composables/ai-chat/ai-builder-experiment.ts +19 -0
- package/src/brand-page-maker/composables/ai-chat/useAiMetadataBuilder.ts +2 -0
- package/src/brand-page-maker/composables/ai-chat/useAiWebsiteBuilderChat.ts +19 -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/ai-thread/ai-website-builder-thread-store.ts +30 -0
- 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 +13 -18
- 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/focused-content-item-settings/FocusedContentItemSettings.mixin.ts +0 -6
- 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/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/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/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 +74 -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/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/models/brand-page-context.model.test.ts +0 -38
- 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/clients/ai-assistant-client.test.ts +0 -135
- 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,16 +1,31 @@
|
|
|
1
|
+
import type { JSONContent } from '@tiptap/vue-3';
|
|
1
2
|
import type { Content } from '../../brand-page/models';
|
|
2
3
|
import { BUTTON_LINK_TYPE } from '../../brand-page/models';
|
|
3
4
|
import type { ButtonLinkType } from '../../brand-page/models';
|
|
4
|
-
import type {
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
5
|
+
import type { TextStyleOptions } from '../../brand-page/models/styles.model';
|
|
6
|
+
import type { CanonicalTextStyleType } from '../../brand-page/models/styles.model';
|
|
7
|
+
import {
|
|
8
|
+
normalizeTextStyleAgainstRole,
|
|
9
|
+
omitTypography,
|
|
10
|
+
} from '../../brand-page/utils/text-style.util';
|
|
11
|
+
import {
|
|
12
|
+
computeLegacyTargets,
|
|
13
|
+
contentFieldReconnectSpec,
|
|
14
|
+
isCanonicalTextStyleType,
|
|
15
|
+
reconnectTextStyle,
|
|
16
|
+
type ReconnectSpec,
|
|
17
|
+
} from '../../brand-page/utils/text-role-reconnect.util';
|
|
8
18
|
import {
|
|
9
19
|
isTiptapDocument,
|
|
10
20
|
type SectionToolArguments,
|
|
11
21
|
} from '../parsers/section-tool-arguments';
|
|
12
22
|
import { hasRTEContent } from '../../brand-page-maker/utils';
|
|
13
23
|
import { useExternalRichTextEditor } from '../../brand-page-maker/composables/rich-text-editor/useRichTextEditor';
|
|
24
|
+
import { relinkDocToRole } from '../../brand-page-maker/utils/rich-text-editor.util';
|
|
25
|
+
import {
|
|
26
|
+
docHasColourableRun,
|
|
27
|
+
setRteTextColor,
|
|
28
|
+
} from '../../shared/color-strategies/rte-color';
|
|
14
29
|
import { applyStyleToRTEText } from '../helpers/rte.helpers';
|
|
15
30
|
import type { TextStyleDeclaration } from '../../brand-page/models';
|
|
16
31
|
import { getSectionFieldMap, getStyleFieldMap } from './section-field-maps';
|
|
@@ -110,6 +125,13 @@ export const applyScalarFields = (
|
|
|
110
125
|
/**
|
|
111
126
|
* Convert AI-sent style value to the format expected by the model.
|
|
112
127
|
* - letterSpacing: unitless 0-100 → em string (e.g., 50 → '0.5em')
|
|
128
|
+
* - lineHeight: coerced to a plain numeric string, UNSNAPPED — snapping here would shift a
|
|
129
|
+
* value that's actually equal to its role (e.g. 1.25) off that equality before
|
|
130
|
+
* `applyAiStyle` gets a chance to drop it as a role-equal non-override (R2). Only a value
|
|
131
|
+
* that survives the role-equal check is snapped (`snapLineHeight`, in `applyAiStyle`), and the
|
|
132
|
+
* drop runs AGAIN after snapping: a role can itself hold a non-grid value (e.g. heading3's
|
|
133
|
+
* native 1.25), so comparing before snapping catches an exact match at full precision, and
|
|
134
|
+
* re-comparing after catches a snap that LANDS the override exactly on the role's value.
|
|
113
135
|
* - null → '' (explicitly clear/reset the property)
|
|
114
136
|
* - everything else passes through as-is
|
|
115
137
|
*/
|
|
@@ -123,72 +145,168 @@ export const normalizeStyleValue = (key: string, value: unknown): unknown => {
|
|
|
123
145
|
}
|
|
124
146
|
|
|
125
147
|
if (key === 'lineHeight') {
|
|
126
|
-
// Snap to 0.1 increments to match the UI slider step
|
|
127
148
|
const num = typeof value === 'number' ? value : parseFloat(String(value));
|
|
128
149
|
|
|
129
|
-
if (!isNaN(num)) return String(
|
|
150
|
+
if (!isNaN(num)) return String(num);
|
|
130
151
|
}
|
|
131
152
|
|
|
132
153
|
return value;
|
|
133
154
|
};
|
|
134
155
|
|
|
135
|
-
/**
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
* etc.) must first be copied onto the style — otherwise the renderer falls
|
|
139
|
-
* back to browser defaults because `textStyleType` no longer points at a
|
|
140
|
-
* preset.
|
|
141
|
-
*
|
|
142
|
-
* The category is read from the existing `style.textStyleType`, which is the
|
|
143
|
-
* authoritative per-section + per-field reference set by the content factory.
|
|
144
|
-
* Existing style values win over preset defaults (the content may already
|
|
145
|
-
* carry user overrides on top of the preset).
|
|
146
|
-
*/
|
|
147
|
-
export const resolveGlobalPresetIntoStyle = (
|
|
148
|
-
style: object | undefined,
|
|
149
|
-
textStyleOptions: TextStyleOptions | undefined,
|
|
156
|
+
/** Snap a line-height value to the UI slider's 0.1 step. Pure — returns a new object. */
|
|
157
|
+
const snapLineHeight = (
|
|
158
|
+
style: Record<string, unknown>,
|
|
150
159
|
): Record<string, unknown> => {
|
|
151
|
-
const
|
|
152
|
-
const currentTextStyleType = base.textStyleType as TextStyleType | undefined;
|
|
160
|
+
const { lineHeight } = style;
|
|
153
161
|
|
|
154
|
-
if (
|
|
155
|
-
base.textStyleType = undefined;
|
|
162
|
+
if (typeof lineHeight !== 'string') return style;
|
|
156
163
|
|
|
157
|
-
|
|
158
|
-
}
|
|
164
|
+
const num = parseFloat(lineHeight);
|
|
159
165
|
|
|
160
|
-
|
|
161
|
-
const presetDefaults: Record<string, unknown> = {};
|
|
166
|
+
if (isNaN(num)) return style;
|
|
162
167
|
|
|
163
|
-
|
|
164
|
-
|
|
168
|
+
return { ...style, lineHeight: String(Math.floor(num * 10) / 10) };
|
|
169
|
+
};
|
|
170
|
+
|
|
171
|
+
/**
|
|
172
|
+
* Whether this call is a REAL canonical switch (R19): both the stored and the INCOMING role (the
|
|
173
|
+
* raw value the call sent, before any reconnect fallback) are canonical, and differ. Decided once
|
|
174
|
+
* from `incoming.textStyleType` and shared by `applyAiStyle` (which resets the style object) and
|
|
175
|
+
* the caller of `applyStoredDocStyleConsequences` (which resets the stored doc), so both agree: a
|
|
176
|
+
* retired-key call reconnects in `applyAiStyle` (not a switch — it keeps the look as overrides) but
|
|
177
|
+
* can still land on a canonical role that differs from the stored one, which deriving it from the
|
|
178
|
+
* RESULT instead would misread as a switch and relink a doc whose overrides were meant to survive.
|
|
179
|
+
*/
|
|
180
|
+
export const isRealCanonicalSwitch = (
|
|
181
|
+
existingRole: unknown,
|
|
182
|
+
incomingRole: unknown,
|
|
183
|
+
): boolean =>
|
|
184
|
+
isCanonicalTextStyleType(existingRole) &&
|
|
185
|
+
isCanonicalTextStyleType(incomingRole) &&
|
|
186
|
+
incomingRole !== existingRole;
|
|
187
|
+
|
|
188
|
+
/**
|
|
189
|
+
* Apply an AI-sent style to a field, honouring the role model under partial-update semantics
|
|
190
|
+
* (a property present = update; absent = no change).
|
|
191
|
+
*
|
|
192
|
+
* The role is the EFFECTIVE one — `incoming.textStyleType ?? existing.textStyleType` — so a sparse
|
|
193
|
+
* update that omits the role KEEPS the element's current role. When that role is canonical, keep
|
|
194
|
+
* the link and store a sparse override: incoming props layer on and `normalizeTextStyleAgainstRole`
|
|
195
|
+
* drops any prop equal to the role, so the page-scoped role CSS drives it and a later global edit
|
|
196
|
+
* repaints the block.
|
|
197
|
+
*
|
|
198
|
+
* A REAL canonical switch (both the old and the new role are canonical, and differ — R19) is a
|
|
199
|
+
* reset, not a patch: it starts from `omitTypography(existing)` before layering this call's own
|
|
200
|
+
* style on top, so a stale override from the old role doesn't survive as a bogus override of the
|
|
201
|
+
* new one. Colour, background, alignment and `applyAutoScale` aren't typography, so they carry
|
|
202
|
+
* over untouched; the call's own text and overrides win (they're applied after the reset).
|
|
203
|
+
*
|
|
204
|
+
* Any other role — a retired key the pipeline still emits, `none`, or no role at all — reconnects
|
|
205
|
+
* the way the upgrade does (`reconnectTextStyle`, with the field's `spec`): its starting role, else
|
|
206
|
+
* the retired role's successor, else the role nearest its size, keeping its look as overrides.
|
|
207
|
+
*/
|
|
208
|
+
export const applyAiStyle = <T extends object>(
|
|
209
|
+
existing: T | undefined,
|
|
210
|
+
incoming: Record<string, unknown>,
|
|
211
|
+
textStyleOptions: TextStyleOptions | undefined,
|
|
212
|
+
spec: ReconnectSpec = {},
|
|
213
|
+
): T => {
|
|
214
|
+
const existingRole = (existing as Record<string, unknown> | undefined)
|
|
215
|
+
?.textStyleType;
|
|
216
|
+
const role = incoming.textStyleType ?? existingRole;
|
|
217
|
+
const base = isRealCanonicalSwitch(existingRole, incoming.textStyleType)
|
|
218
|
+
? omitTypography(existing ?? ({} as T))
|
|
219
|
+
: (existing ?? {});
|
|
220
|
+
const merged = { ...base, ...incoming, textStyleType: role } as T;
|
|
221
|
+
|
|
222
|
+
if (isCanonicalTextStyleType(role)) {
|
|
223
|
+
const normalized = normalizeTextStyleAgainstRole(
|
|
224
|
+
merged,
|
|
225
|
+
textStyleOptions,
|
|
226
|
+
) as Record<string, unknown>;
|
|
227
|
+
|
|
228
|
+
// Snap and re-check only a lineHeight that is BOTH this call's own (not one inherited
|
|
229
|
+
// untouched from the stored style — an unrelated patch must not silently rewrite it) AND
|
|
230
|
+
// survived the first role-equal pass as a genuine override.
|
|
231
|
+
if ('lineHeight' in incoming && 'lineHeight' in normalized) {
|
|
232
|
+
return normalizeTextStyleAgainstRole(
|
|
233
|
+
snapLineHeight(normalized),
|
|
234
|
+
textStyleOptions,
|
|
235
|
+
) as T;
|
|
236
|
+
}
|
|
165
237
|
|
|
166
|
-
|
|
238
|
+
return normalized as T;
|
|
167
239
|
}
|
|
168
240
|
|
|
169
|
-
return
|
|
241
|
+
return reconnectTextStyle(
|
|
242
|
+
merged,
|
|
243
|
+
computeLegacyTargets(textStyleOptions),
|
|
244
|
+
textStyleOptions,
|
|
245
|
+
spec,
|
|
246
|
+
);
|
|
170
247
|
};
|
|
171
248
|
|
|
172
249
|
/**
|
|
173
|
-
*
|
|
174
|
-
*
|
|
175
|
-
* the
|
|
176
|
-
*
|
|
177
|
-
*
|
|
178
|
-
*
|
|
250
|
+
* BP-5969 (R18, R19) — what a style-only patch (no new text in the same call) does to an already-
|
|
251
|
+
* stored RTE doc. A real role switch relinks every run to the new role (the document-level half of
|
|
252
|
+
* the reset `applyAiStyle` already gave the style object above), keeping any typography the call's
|
|
253
|
+
* own `nextStyle` still overrides via `relinkDocToRole`'s `styleOverrides` arg. A colour-only patch,
|
|
254
|
+
* OR a colour riding along with a switch in the same call (James Joung, 2026-10-01: a role switch
|
|
255
|
+
* and a recolour with no text both apply), recolours every run and clears the now-redundant style
|
|
256
|
+
* colour (kept only when the doc has no run to hold it — an empty field's colour waits for the
|
|
257
|
+
* maker's first keystroke, `buildInitialMarks`). Both consequences can apply to one call: the
|
|
258
|
+
* switch's relink runs first, then the colour branch recolours the relinked doc.
|
|
179
259
|
*
|
|
180
|
-
*
|
|
181
|
-
*
|
|
260
|
+
* No-op for anything but a stored Tiptap document — a legacy HTML string is handled by the caller's
|
|
261
|
+
* own `ApplyColorToRTE` rewrite instead.
|
|
182
262
|
*/
|
|
183
|
-
export const
|
|
184
|
-
|
|
185
|
-
|
|
263
|
+
export const applyStoredDocStyleConsequences = (
|
|
264
|
+
existingText: unknown,
|
|
265
|
+
existingRole: unknown,
|
|
266
|
+
nextStyle: Record<string, unknown>,
|
|
267
|
+
incomingStyle: Record<string, unknown>,
|
|
186
268
|
textStyleOptions: TextStyleOptions | undefined,
|
|
187
|
-
):
|
|
188
|
-
(
|
|
189
|
-
|
|
190
|
-
|
|
191
|
-
|
|
269
|
+
): unknown => {
|
|
270
|
+
if (!isTiptapDocument(existingText)) return existingText;
|
|
271
|
+
|
|
272
|
+
// Decided from the call's own RAW textStyleType (via isRealCanonicalSwitch), the same test
|
|
273
|
+
// applyAiStyle already made for the style object, not re-derived from nextStyle.textStyleType:
|
|
274
|
+
// a retired-key call reconnects (not a switch) in applyAiStyle but can still land on a canonical
|
|
275
|
+
// role that differs from the stored one, which re-deriving from the RESULT would misread as a
|
|
276
|
+
// switch. When it IS a real switch, nextStyle.textStyleType equals incomingStyle.textStyleType.
|
|
277
|
+
const isRealSwitch = isRealCanonicalSwitch(
|
|
278
|
+
existingRole,
|
|
279
|
+
incomingStyle.textStyleType,
|
|
280
|
+
);
|
|
281
|
+
const nextRole = nextStyle.textStyleType;
|
|
282
|
+
|
|
283
|
+
let text: unknown = existingText;
|
|
284
|
+
|
|
285
|
+
if (isRealSwitch) {
|
|
286
|
+
const roleStyle = textStyleOptions?.[nextRole as CanonicalTextStyleType]
|
|
287
|
+
?.style as Record<string, unknown> | undefined;
|
|
288
|
+
|
|
289
|
+
text = relinkDocToRole(text as JSONContent, roleStyle, nextStyle);
|
|
290
|
+
}
|
|
291
|
+
|
|
292
|
+
const newColor = incomingStyle.color;
|
|
293
|
+
|
|
294
|
+
if (
|
|
295
|
+
typeof newColor === 'string' &&
|
|
296
|
+
newColor &&
|
|
297
|
+
docHasColourableRun(text as JSONContent)
|
|
298
|
+
) {
|
|
299
|
+
const recoloured = setRteTextColor(text, newColor);
|
|
300
|
+
|
|
301
|
+
if (recoloured) {
|
|
302
|
+
delete nextStyle.color;
|
|
303
|
+
|
|
304
|
+
return recoloured;
|
|
305
|
+
}
|
|
306
|
+
}
|
|
307
|
+
|
|
308
|
+
return text;
|
|
309
|
+
};
|
|
192
310
|
|
|
193
311
|
/**
|
|
194
312
|
* Rewrites the stored RTE HTML's inline colour marks. Injectable for tests;
|
|
@@ -235,35 +353,50 @@ export const applyStyleFields = (
|
|
|
235
353
|
if (normalized !== undefined) filtered[k] = normalized;
|
|
236
354
|
}
|
|
237
355
|
|
|
238
|
-
const
|
|
239
|
-
|
|
356
|
+
const existingStyle = content[modelKey] as
|
|
357
|
+
| Record<string, unknown>
|
|
358
|
+
| undefined;
|
|
359
|
+
const existingRole = existingStyle?.textStyleType;
|
|
360
|
+
|
|
361
|
+
record[modelKey] = applyAiStyle(
|
|
362
|
+
existingStyle as object,
|
|
363
|
+
filtered,
|
|
240
364
|
textStyleOptions,
|
|
365
|
+
contentFieldReconnectSpec(sectionType, modelKey),
|
|
241
366
|
);
|
|
242
367
|
|
|
243
|
-
|
|
244
|
-
|
|
245
|
-
//
|
|
246
|
-
//
|
|
247
|
-
//
|
|
248
|
-
// text, AI QA 2026-07-05 rerun). Propagate the new colour into the
|
|
249
|
-
// stored HTML, mirroring global-font-propagation for font families.
|
|
368
|
+
// A style-only patch (no new text in this call) leaves the field's EXISTING inline
|
|
369
|
+
// textStyle marks in place — and inline marks override every style layer at render, so the
|
|
370
|
+
// old look survives a recoloured band (invisible text, AI QA 2026-07-05 rerun) or a role
|
|
371
|
+
// switch (the overrides reset above, but the stored doc's runs don't follow on their own).
|
|
372
|
+
// Propagate the consequence into the stored text, mirroring global-role-propagation.
|
|
250
373
|
const textKey = modelKey.endsWith('Style')
|
|
251
374
|
? modelKey.slice(0, -'Style'.length)
|
|
252
375
|
: undefined;
|
|
253
376
|
const textAiKey = aiKey.endsWith('_style')
|
|
254
377
|
? aiKey.slice(0, -'_style'.length)
|
|
255
378
|
: undefined;
|
|
256
|
-
const
|
|
257
|
-
|
|
258
|
-
if (
|
|
259
|
-
textKey
|
|
260
|
-
|
|
261
|
-
|
|
262
|
-
|
|
263
|
-
|
|
264
|
-
|
|
265
|
-
|
|
266
|
-
|
|
379
|
+
const textSentThisCall = !!(textAiKey && textAiKey in args);
|
|
380
|
+
|
|
381
|
+
if (textKey && !textSentThisCall) {
|
|
382
|
+
const existingText = record[textKey];
|
|
383
|
+
|
|
384
|
+
if (isTiptapDocument(existingText)) {
|
|
385
|
+
record[textKey] = applyStoredDocStyleConsequences(
|
|
386
|
+
existingText,
|
|
387
|
+
existingRole,
|
|
388
|
+
record[modelKey] as Record<string, unknown>,
|
|
389
|
+
filtered,
|
|
390
|
+
textStyleOptions,
|
|
391
|
+
);
|
|
392
|
+
} else if (
|
|
393
|
+
typeof filtered.color === 'string' &&
|
|
394
|
+
filtered.color &&
|
|
395
|
+
typeof existingText === 'string' &&
|
|
396
|
+
hasRTEContent(existingText)
|
|
397
|
+
) {
|
|
398
|
+
record[textKey] = applyColorToHtml(existingText, filtered.color);
|
|
399
|
+
}
|
|
267
400
|
}
|
|
268
401
|
}
|
|
269
402
|
} finally {
|
|
@@ -2,32 +2,57 @@ import type {
|
|
|
2
2
|
UpdateGlobalStylesArguments,
|
|
3
3
|
TextStyleOptionStyle,
|
|
4
4
|
} from '../../parsers/ai-toolcall-parser';
|
|
5
|
-
import
|
|
6
|
-
|
|
5
|
+
import {
|
|
6
|
+
CANONICAL_TEXT_STYLE_TYPES,
|
|
7
|
+
LEGACY_TEXT_STYLE_TYPES,
|
|
8
|
+
type TextStyleType,
|
|
9
|
+
} from '../../../brand-page/models/styles.model';
|
|
7
10
|
import { validateStringStyleAttrs } from '../../sanitizers/section-args-validator';
|
|
8
11
|
|
|
9
12
|
export const TEXT_STYLE_OPTION_KEYS: TextStyleType[] = [
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
'paragraphs',
|
|
13
|
-
'buttons',
|
|
13
|
+
...CANONICAL_TEXT_STYLE_TYPES,
|
|
14
|
+
...LEGACY_TEXT_STYLE_TYPES,
|
|
14
15
|
];
|
|
15
16
|
|
|
17
|
+
/** Role definitions accept numeric wire values but store their canonical string representation. */
|
|
18
|
+
export const normalizeGlobalTextStyleOption = (
|
|
19
|
+
style: TextStyleOptionStyle,
|
|
20
|
+
): TextStyleOptionStyle => {
|
|
21
|
+
const normalized = { ...style } as TextStyleOptionStyle;
|
|
22
|
+
const lineHeight: unknown = style.lineHeight;
|
|
23
|
+
const fontWeight: unknown = style.fontWeight;
|
|
24
|
+
|
|
25
|
+
if (typeof lineHeight === 'number' && !isNaN(lineHeight)) {
|
|
26
|
+
normalized.lineHeight = String(lineHeight);
|
|
27
|
+
} else if (lineHeight != null) {
|
|
28
|
+
const value = parseFloat(String(lineHeight).trim());
|
|
29
|
+
|
|
30
|
+
if (!isNaN(value) && String(lineHeight).trim() !== String(value)) {
|
|
31
|
+
normalized.lineHeight = String(value);
|
|
32
|
+
}
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
if (typeof fontWeight === 'number' && !isNaN(fontWeight)) {
|
|
36
|
+
normalized.fontWeight = String(fontWeight);
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
return normalized;
|
|
40
|
+
};
|
|
41
|
+
|
|
16
42
|
type GlobalStyleCheck = (args: UpdateGlobalStylesArguments) => string | null;
|
|
17
43
|
|
|
18
44
|
export const GLOBAL_STYLE_CHECKS: GlobalStyleCheck[] = [
|
|
19
|
-
// textFontFamily: must be a recognized camelCase font key (e.g. 'playfairDisplay')
|
|
20
45
|
(args) => {
|
|
21
|
-
const
|
|
46
|
+
const keepRuns = args.textStyles?.keepRuns;
|
|
22
47
|
|
|
23
|
-
if (
|
|
48
|
+
if (keepRuns == null) return null;
|
|
24
49
|
|
|
25
|
-
return !
|
|
26
|
-
|
|
50
|
+
return !Array.isArray(keepRuns) ||
|
|
51
|
+
keepRuns.some((run) => typeof run !== 'string')
|
|
52
|
+
? `"textStyles.keepRuns" must be an array of strings`
|
|
27
53
|
: null;
|
|
28
54
|
},
|
|
29
55
|
|
|
30
|
-
// textStyleOptions[category].style — fontSize, fontFamily, lineHeight, letterSpacing
|
|
31
56
|
...TEXT_STYLE_OPTION_KEYS.map(
|
|
32
57
|
(category): GlobalStyleCheck =>
|
|
33
58
|
(args) => {
|
|
@@ -37,7 +62,7 @@ export const GLOBAL_STYLE_CHECKS: GlobalStyleCheck[] = [
|
|
|
37
62
|
|
|
38
63
|
return validateStringStyleAttrs(
|
|
39
64
|
`textStyleOptions.${category}.style`,
|
|
40
|
-
style as TextStyleOptionStyle,
|
|
65
|
+
normalizeGlobalTextStyleOption(style as TextStyleOptionStyle),
|
|
41
66
|
);
|
|
42
67
|
},
|
|
43
68
|
),
|
|
@@ -1,18 +1,23 @@
|
|
|
1
1
|
import { SOCIAL_LINKS_ICON_DISPLAY_STYLES } from '../../../brand-page/models';
|
|
2
|
+
import { MAX_TITLE_LENGTH } from '../../../brand-page/constants/font.constants';
|
|
2
3
|
import {
|
|
3
4
|
enumCheck,
|
|
4
5
|
itemCapCheck,
|
|
5
6
|
runChecks,
|
|
7
|
+
styleCheck,
|
|
6
8
|
type SectionCheck,
|
|
7
9
|
type ValidationContext,
|
|
8
10
|
} from '../../sanitizers/section-args-validator';
|
|
11
|
+
import { textAndRteChecks } from '../../sanitizers/rte-schema-check';
|
|
9
12
|
|
|
10
13
|
const CHECKS: SectionCheck[] = [
|
|
14
|
+
...textAndRteChecks('title', MAX_TITLE_LENGTH),
|
|
11
15
|
enumCheck(
|
|
12
16
|
'icon_style',
|
|
13
17
|
Object.keys(SOCIAL_LINKS_ICON_DISPLAY_STYLES),
|
|
14
18
|
'social-links',
|
|
15
19
|
),
|
|
20
|
+
styleCheck('title_style'),
|
|
16
21
|
itemCapCheck(
|
|
17
22
|
{ brandSite: 4, brandPage: 4, arrayField: 'links' },
|
|
18
23
|
'social-links',
|
|
@@ -0,0 +1,101 @@
|
|
|
1
|
+
import { afterEach, describe, expect, it } from 'vitest';
|
|
2
|
+
import type { Editor } from '@tiptap/vue-3';
|
|
3
|
+
import { useExternalRichTextEditor } from '../../brand-page-maker/composables/rich-text-editor/useRichTextEditor';
|
|
4
|
+
import { applyStyleToRTEText } from './rte.helpers';
|
|
5
|
+
|
|
6
|
+
describe('applyStyleToRTEText', () => {
|
|
7
|
+
let editor: Editor | undefined;
|
|
8
|
+
|
|
9
|
+
afterEach(() => editor?.destroy());
|
|
10
|
+
|
|
11
|
+
it('keeps a named word in legacy HTML while relinking the surrounding text', () => {
|
|
12
|
+
editor = useExternalRichTextEditor().externalEditor;
|
|
13
|
+
|
|
14
|
+
const html = applyStyleToRTEText(
|
|
15
|
+
editor,
|
|
16
|
+
'<p><span style="font-family: Georgia">Taste</span> <span style="font-family: Georgia">the rest</span></p>',
|
|
17
|
+
{ fontFamily: 'Oswald' },
|
|
18
|
+
['Taste'],
|
|
19
|
+
);
|
|
20
|
+
|
|
21
|
+
expect(html).toContain('font-family: Georgia;">Taste</span>');
|
|
22
|
+
expect(html).toContain('font-family: Oswald;">the rest</span>');
|
|
23
|
+
});
|
|
24
|
+
|
|
25
|
+
it('does not keep text that only exists across separate text nodes', () => {
|
|
26
|
+
editor = useExternalRichTextEditor().externalEditor;
|
|
27
|
+
|
|
28
|
+
const html = applyStyleToRTEText(
|
|
29
|
+
editor,
|
|
30
|
+
'<p><span style="font-family: Georgia">Ta</span><span style="font-family: Georgia">ste</span></p>',
|
|
31
|
+
{ fontFamily: 'Oswald' },
|
|
32
|
+
['Taste'],
|
|
33
|
+
);
|
|
34
|
+
|
|
35
|
+
expect(html).not.toContain('font-family: Georgia;">Ta</span>');
|
|
36
|
+
expect(html).not.toContain('font-family: Georgia;">ste</span>');
|
|
37
|
+
});
|
|
38
|
+
|
|
39
|
+
it('keeps a named word only where it stands as a whole word', () => {
|
|
40
|
+
editor = useExternalRichTextEditor().externalEditor;
|
|
41
|
+
|
|
42
|
+
const html = applyStyleToRTEText(
|
|
43
|
+
editor,
|
|
44
|
+
'<p><span style="font-family: Georgia">Tasteful Taste</span></p>',
|
|
45
|
+
{ fontFamily: 'Oswald' },
|
|
46
|
+
['Taste'],
|
|
47
|
+
);
|
|
48
|
+
|
|
49
|
+
expect(html).toContain('font-family: Oswald;">Tasteful </span>');
|
|
50
|
+
expect(html).toContain('font-family: Georgia;">Taste</span>');
|
|
51
|
+
});
|
|
52
|
+
|
|
53
|
+
it("keeps a link's underline when a decoration ref clears the others", () => {
|
|
54
|
+
editor = useExternalRichTextEditor().externalEditor;
|
|
55
|
+
|
|
56
|
+
const html = applyStyleToRTEText(
|
|
57
|
+
editor,
|
|
58
|
+
'<p><u>Plain</u> <a href="https://example.com"><u>link</u></a></p>',
|
|
59
|
+
{ textDecoration: 'var(--role-text-decoration)' },
|
|
60
|
+
);
|
|
61
|
+
|
|
62
|
+
expect(html).toContain(
|
|
63
|
+
'<span style="text-decoration: var(--role-text-decoration);">Plain </span>',
|
|
64
|
+
);
|
|
65
|
+
expect(html).toContain(
|
|
66
|
+
'<u><span style="text-decoration: var(--role-text-decoration);">link</span></u>',
|
|
67
|
+
);
|
|
68
|
+
});
|
|
69
|
+
|
|
70
|
+
it('a weight ref drops <strong> on every run except a kept word', () => {
|
|
71
|
+
editor = useExternalRichTextEditor().externalEditor;
|
|
72
|
+
|
|
73
|
+
const html = applyStyleToRTEText(
|
|
74
|
+
editor,
|
|
75
|
+
'<p><strong>Fresh</strong> <strong>Taste</strong></p>',
|
|
76
|
+
{ fontWeight: 'var(--role-font-weight)' },
|
|
77
|
+
['Taste'],
|
|
78
|
+
);
|
|
79
|
+
|
|
80
|
+
expect(html).toContain(
|
|
81
|
+
'<span style="font-weight: var(--role-font-weight);">Fresh </span>',
|
|
82
|
+
);
|
|
83
|
+
expect(html).toContain('<strong>Taste</strong>');
|
|
84
|
+
expect(html).not.toContain('<strong>Fresh');
|
|
85
|
+
});
|
|
86
|
+
|
|
87
|
+
it('a style that names no emphasis leaves <strong>, <em>, <u> and <s> alone', () => {
|
|
88
|
+
editor = useExternalRichTextEditor().externalEditor;
|
|
89
|
+
|
|
90
|
+
const html = applyStyleToRTEText(
|
|
91
|
+
editor,
|
|
92
|
+
'<p><strong>Bold</strong> <em>Italic</em> <u>Under</u> <s>Struck</s></p>',
|
|
93
|
+
{ color: '#ff0000', fontFamily: 'Oswald' },
|
|
94
|
+
);
|
|
95
|
+
|
|
96
|
+
expect(html).toContain('<strong>');
|
|
97
|
+
expect(html).toContain('<em>');
|
|
98
|
+
expect(html).toContain('<u>');
|
|
99
|
+
expect(html).toContain('<s>');
|
|
100
|
+
});
|
|
101
|
+
});
|