@designcrowd/library.brand-page 5.17.28 → 5.18.0
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-CJZpKPNH.js → CreatedOnBrandCrowd-de-de-xmkupPus.js} +1 -1
- package/lib/src/{CreatedOnBrandCrowd-en-us-DkIa7iEb.js → CreatedOnBrandCrowd-en-us-Ck7EdTtb.js} +1 -1
- package/lib/src/{CreatedOnBrandCrowd-es-es-CE2p6XHz.js → CreatedOnBrandCrowd-es-es-BC8sJuDH.js} +1 -1
- package/lib/src/{CreatedOnBrandCrowd-fr-fr-BBjOZS3M.js → CreatedOnBrandCrowd-fr-ca-CN-UBe1q.js} +1 -1
- package/lib/src/{CreatedOnBrandCrowd-fr-ca-BBjOZS3M.js → CreatedOnBrandCrowd-fr-fr-CN-UBe1q.js} +1 -1
- package/lib/src/{CreatedOnBrandCrowd-pt-pt-Dayzl4BZ.js → CreatedOnBrandCrowd-pt-br-CajQyNkx.js} +1 -1
- package/lib/src/{CreatedOnBrandCrowd-pt-br-Dayzl4BZ.js → CreatedOnBrandCrowd-pt-pt-CajQyNkx.js} +1 -1
- package/lib/src/{CreatedOnDcom-de-de-CFzDqfCb.js → CreatedOnDcom-de-de-BRCNMmDq.js} +1 -1
- package/lib/src/{CreatedOnDcom-en-us-C2jIPBDY.js → CreatedOnDcom-en-us-BzQDtZhc.js} +1 -1
- package/lib/src/{CreatedOnDcom-es-es-qejpzqho.js → CreatedOnDcom-es-es-D-qAM4Cd.js} +1 -1
- package/lib/src/{CreatedOnDcom-fr-ca-DMO9Ld7K.js → CreatedOnDcom-fr-ca-CZ1irFOc.js} +1 -1
- package/lib/src/{CreatedOnDcom-fr-fr-BFWN9qTP.js → CreatedOnDcom-fr-fr-Gb5BCF0N.js} +1 -1
- package/lib/src/{CreatedOnDcom-pt-br-CneD3ghF.js → CreatedOnDcom-pt-br-CAQV0q6o.js} +1 -1
- package/lib/src/{CreatedOnDcom-pt-pt-Cg1B7s0o.js → CreatedOnDcom-pt-pt-D6tQdQFh.js} +1 -1
- package/lib/src/brand-page/components/image-gallery/ImageGalleryModal.mixin.js +2 -2
- package/lib/src/brand-page/models/brand-page-context.model.d.ts +0 -2
- package/lib/src/brand-page/models/brand-page-context.model.js +1 -11
- package/lib/src/brand-page/models/index.d.ts +1 -0
- package/lib/src/brand-page/models/index.js +1 -0
- package/lib/src/brand-page/utils/color.util.js +23 -3
- package/lib/src/brand-page/utils/raygun.util.d.ts +5 -1
- package/lib/src/brand-page/utils/raygun.util.js +7 -2
- package/lib/src/brand-page/utils/svg-color.util.js +1 -2
- package/lib/src/brand-page/utils/view-model.util.js +1 -1
- package/lib/src/brand-page-maker/components/brand-page-maker/BrandPageMaker.mixin.d.ts +1 -31
- package/lib/src/brand-page-maker/components/brand-page-maker/__fixtures__/brand-page-examples.js +0 -2
- package/lib/src/brand-page-maker/components/brandpage-maker-page/BrandPageMakerPage.mixin.d.ts +2 -31
- package/lib/src/brand-page-maker/components/preview/Preview.mixin.d.ts +0 -14
- package/lib/src/brand-page-maker/components/quick-link-bar/QuickLinkBar.mixin.d.ts +0 -28
- package/lib/src/brand-page-maker/components/seo-settings/SeoPageSettings.mixin.d.ts +0 -28
- package/lib/src/brand-page-maker/components/seo-settings/UrlSettings.mixin.d.ts +0 -28
- package/lib/src/brand-page-maker/components/seo-settings/UseExistingDomainModal.mixin.d.ts +0 -28
- package/lib/src/brand-page-maker/components/template-preview/TemplatePreview.mixin.d.ts +0 -28
- package/lib/src/brand-page-maker/components/upgrade-to-premium-button/UpgradeToPremiumButton.mixin.d.ts +0 -28
- package/lib/src/brand-page-maker/composables/ai-chat/aiErrorCopy.d.ts +35 -0
- package/lib/src/brand-page-maker/composables/ai-chat/aiErrorCopy.js +108 -0
- package/lib/src/brand-page-maker/composables/ai-chat/{useAiChat.d.ts → types.d.ts} +5 -13
- package/lib/src/brand-page-maker/composables/ai-chat/types.js +1 -0
- package/lib/src/brand-page-maker/composables/ai-chat/useAiMetadataBuilder.d.ts +19 -0
- package/lib/src/brand-page-maker/composables/ai-chat/useAiMetadataBuilder.js +1 -0
- package/lib/src/brand-page-maker/composables/ai-chat/useAiWebsiteBuilderChat.d.ts +1 -1
- package/lib/src/brand-page-maker/composables/ai-chat/useAiWebsiteBuilderChat.js +488 -82
- package/lib/src/brand-page-maker/composables/rich-text-editor/useRichTextEditor.js +5 -5
- package/lib/src/brand-page-maker/composables/useEventTracker.d.ts +6 -16
- package/lib/src/brand-page-maker/composables/useEventTracker.js +19 -21
- package/lib/src/brand-page-maker/constants/sidebar-constant.d.ts +0 -1
- package/lib/src/brand-page-maker/constants/sidebar-constant.js +7 -15
- package/lib/src/brand-page-maker/convertors/image-aspect-ratio.convertor.js +2 -2
- package/lib/src/brand-page-maker/convertors/text-size-value.convertor.js +3 -1
- package/lib/src/brand-page-maker/stores/ai-checkpoint/ai-checkpoint-store.d.ts +30660 -0
- package/lib/src/brand-page-maker/stores/ai-checkpoint/ai-checkpoint-store.js +34 -0
- package/lib/src/brand-page-maker/stores/ai-thread/ai-website-builder-thread-store.d.ts +1 -1
- package/lib/src/brand-page-maker/stores/brandpage-container/brand-page-container-store.d.ts +0 -28
- package/lib/src/brand-page-maker/stores/brandpage-maker/brandpage-maker-store.js +42 -2
- package/lib/src/brand-page-maker/stores/index.d.ts +1 -1
- package/lib/src/brand-page-maker/stores/index.js +1 -1
- package/lib/src/brand-page-maker/stores/user/user-store.js +0 -1
- package/lib/src/bundled-translations-CnareLWC.js +175 -0
- package/lib/src/bundled-translations.de-DE-2Ys7epLO.js +175 -0
- package/lib/src/bundled-translations.es-ES-Cjp-G8rT.js +175 -0
- package/lib/src/bundled-translations.fr-CA-CsaW4Oae.js +175 -0
- package/lib/src/bundled-translations.fr-FR-DIT2dd8J.js +175 -0
- package/lib/src/bundled-translations.pt-BR-BamoBpDW.js +175 -0
- package/lib/src/bundled-translations.pt-PT-C9A4hY_e.js +175 -0
- package/lib/src/bundles/bundled-translations.de-DE.json +1 -20
- package/lib/src/bundles/bundled-translations.es-ES.json +1 -20
- package/lib/src/bundles/bundled-translations.fr-CA.json +1 -20
- package/lib/src/bundles/bundled-translations.fr-FR.json +1 -20
- package/lib/src/bundles/bundled-translations.json +1 -20
- package/lib/src/bundles/bundled-translations.pt-BR.json +1 -20
- package/lib/src/bundles/bundled-translations.pt-PT.json +1 -20
- package/lib/src/clients/ai-assistant-client.d.ts +30 -29
- package/lib/src/clients/ai-assistant-client.js +16 -16
- package/lib/src/clients/design-template-client.d.ts +0 -2
- package/lib/src/clients/design-template-client.js +0 -38
- package/lib/src/clients/websocket-gateway-client.d.ts +9 -1
- package/lib/src/composables/useTranslate.d.ts +2 -1
- package/lib/src/composables/useTranslate.js +2 -1
- package/lib/src/constants/ui.d.ts +0 -1
- package/lib/src/css/library.brand-page-brandCrowd.min.css +225 -134
- package/lib/src/css/library.brand-page-brandPage.min.css +227 -121
- package/lib/src/css/library.brand-page-designCom.min.css +225 -134
- package/lib/src/css/library.brand-page-preview.min.css +225 -118
- package/lib/src/index.d.ts +1 -1
- package/lib/src/index.mjs +1 -1
- package/lib/src/{lib-33w_DBny.js → lib-CSRUPpSo.js} +30887 -29395
- package/lib/src/metadata-builder/ai-metadata-executor.d.ts +21 -0
- package/lib/src/metadata-builder/ai-metadata-executor.js +56 -3
- package/lib/src/metadata-builder/builders/add-page-builder.d.ts +2 -4
- package/lib/src/metadata-builder/builders/add-page-builder.js +5 -8
- package/lib/src/metadata-builder/builders/footer-builder.d.ts +11 -0
- package/lib/src/metadata-builder/builders/footer-builder.js +151 -0
- package/lib/src/metadata-builder/builders/global-styles-builder.d.ts +15 -0
- package/lib/src/metadata-builder/builders/global-styles-builder.js +129 -0
- package/lib/src/metadata-builder/builders/header-builder.d.ts +11 -0
- package/lib/src/metadata-builder/builders/header-builder.js +167 -0
- package/lib/src/metadata-builder/builders/rename-page-builder.d.ts +12 -0
- package/lib/src/metadata-builder/builders/rename-page-builder.js +49 -0
- package/lib/src/metadata-builder/builders/section-builders/about-section-builder.d.ts +2 -0
- package/lib/src/metadata-builder/builders/section-builders/about-section-builder.js +44 -4
- package/lib/src/metadata-builder/builders/section-builders/banner-section-builder.d.ts +2 -0
- package/lib/src/metadata-builder/builders/section-builders/banner-section-builder.js +70 -6
- package/lib/src/metadata-builder/builders/section-builders/base-section-builder.d.ts +36 -4
- package/lib/src/metadata-builder/builders/section-builders/base-section-builder.js +102 -12
- package/lib/src/metadata-builder/builders/section-builders/booking-section-builder.d.ts +8 -0
- package/lib/src/metadata-builder/builders/section-builders/booking-section-builder.js +50 -0
- package/lib/src/metadata-builder/builders/section-builders/button-section-builder.d.ts +2 -0
- package/lib/src/metadata-builder/builders/section-builders/button-section-builder.js +5 -1
- package/lib/src/metadata-builder/builders/section-builders/contact-form-builder.d.ts +2 -0
- package/lib/src/metadata-builder/builders/section-builders/contact-form-builder.js +47 -3
- package/lib/src/metadata-builder/builders/section-builders/delete-section-builder.d.ts +2 -1
- package/lib/src/metadata-builder/builders/section-builders/delete-section-builder.js +5 -2
- package/lib/src/metadata-builder/builders/section-builders/divider-section-builder.d.ts +2 -0
- package/lib/src/metadata-builder/builders/section-builders/divider-section-builder.js +11 -1
- package/lib/src/metadata-builder/builders/section-builders/image-gallery-builder.d.ts +2 -0
- package/lib/src/metadata-builder/builders/section-builders/image-gallery-builder.js +52 -13
- package/lib/src/metadata-builder/builders/section-builders/images-section-builder.d.ts +2 -0
- package/lib/src/metadata-builder/builders/section-builders/images-section-builder.js +47 -17
- package/lib/src/metadata-builder/builders/section-builders/index.d.ts +1 -0
- package/lib/src/metadata-builder/builders/section-builders/index.js +1 -0
- package/lib/src/metadata-builder/builders/section-builders/mailing-list-builder.d.ts +2 -0
- package/lib/src/metadata-builder/builders/section-builders/mailing-list-builder.js +20 -2
- package/lib/src/metadata-builder/builders/section-builders/mailing-list-section-builder.d.ts +2 -0
- package/lib/src/metadata-builder/builders/section-builders/mailing-list-section-builder.js +20 -2
- package/lib/src/metadata-builder/builders/section-builders/profile-section-builder.d.ts +2 -0
- package/lib/src/metadata-builder/builders/section-builders/profile-section-builder.js +36 -2
- package/lib/src/metadata-builder/builders/section-builders/shapes-section-builder.d.ts +2 -0
- package/lib/src/metadata-builder/builders/section-builders/shapes-section-builder.js +70 -27
- package/lib/src/metadata-builder/builders/section-builders/social-links-builder.d.ts +2 -0
- package/lib/src/metadata-builder/builders/section-builders/social-links-builder.js +7 -2
- package/lib/src/metadata-builder/builders/section-builders/testimonial-section-builder.d.ts +2 -0
- package/lib/src/metadata-builder/builders/section-builders/testimonial-section-builder.js +91 -26
- package/lib/src/metadata-builder/builders/section-builders/text-section-builder.d.ts +2 -0
- package/lib/src/metadata-builder/builders/section-builders/text-section-builder.js +69 -31
- package/lib/src/metadata-builder/builders/section-content-factory.d.ts +2 -2
- package/lib/src/metadata-builder/builders/section-content-factory.js +8 -2
- package/lib/src/metadata-builder/builders/section-field-maps.js +30 -2
- package/lib/src/metadata-builder/builders/section-field-utils.d.ts +46 -7
- package/lib/src/metadata-builder/builders/section-field-utils.js +86 -62
- package/lib/src/metadata-builder/builders/section-rules/about-section.rules.d.ts +2 -0
- package/lib/src/metadata-builder/builders/section-rules/about-section.rules.js +20 -0
- package/lib/src/metadata-builder/builders/section-rules/add-page.rules.d.ts +7 -0
- package/lib/src/metadata-builder/builders/section-rules/add-page.rules.js +8 -0
- package/lib/src/metadata-builder/builders/section-rules/banner-section.rules.d.ts +2 -0
- package/lib/src/metadata-builder/builders/section-rules/banner-section.rules.js +27 -0
- package/lib/src/metadata-builder/builders/section-rules/booking-section.rules.d.ts +2 -0
- package/lib/src/metadata-builder/builders/section-rules/booking-section.rules.js +16 -0
- package/lib/src/metadata-builder/builders/section-rules/button-section.rules.d.ts +2 -0
- package/lib/src/metadata-builder/builders/section-rules/button-section.rules.js +13 -0
- package/lib/src/metadata-builder/builders/section-rules/contact-form.rules.d.ts +2 -0
- package/lib/src/metadata-builder/builders/section-rules/contact-form.rules.js +16 -0
- package/lib/src/metadata-builder/builders/section-rules/divider-section.rules.d.ts +2 -0
- package/lib/src/metadata-builder/builders/section-rules/divider-section.rules.js +7 -0
- package/lib/src/metadata-builder/builders/section-rules/footer.rules.d.ts +4 -0
- package/lib/src/metadata-builder/builders/section-rules/footer.rules.js +5 -0
- package/lib/src/metadata-builder/builders/section-rules/global-styles.rules.d.ts +6 -0
- package/lib/src/metadata-builder/builders/section-rules/global-styles.rules.js +26 -0
- package/lib/src/metadata-builder/builders/section-rules/header.rules.d.ts +4 -0
- package/lib/src/metadata-builder/builders/section-rules/header.rules.js +41 -0
- package/lib/src/metadata-builder/builders/section-rules/image-gallery.rules.d.ts +2 -0
- package/lib/src/metadata-builder/builders/section-rules/image-gallery.rules.js +10 -0
- package/lib/src/metadata-builder/builders/section-rules/images-section.rules.d.ts +2 -0
- package/lib/src/metadata-builder/builders/section-rules/images-section.rules.js +31 -0
- package/lib/src/metadata-builder/builders/section-rules/mailing-list.rules.d.ts +2 -0
- package/lib/src/metadata-builder/builders/section-rules/mailing-list.rules.js +11 -0
- package/lib/src/metadata-builder/builders/section-rules/profile.rules.d.ts +2 -0
- package/lib/src/metadata-builder/builders/section-rules/profile.rules.js +14 -0
- package/lib/src/metadata-builder/builders/section-rules/rename-page.rules.d.ts +7 -0
- package/lib/src/metadata-builder/builders/section-rules/rename-page.rules.js +8 -0
- package/lib/src/metadata-builder/builders/section-rules/shapes-section.rules.d.ts +2 -0
- package/lib/src/metadata-builder/builders/section-rules/shapes-section.rules.js +27 -0
- package/lib/src/metadata-builder/builders/section-rules/social-links.rules.d.ts +2 -0
- package/lib/src/metadata-builder/builders/section-rules/social-links.rules.js +9 -0
- package/lib/src/metadata-builder/builders/section-rules/testimonial-section.rules.d.ts +7 -0
- package/lib/src/metadata-builder/builders/section-rules/testimonial-section.rules.js +26 -0
- package/lib/src/metadata-builder/builders/section-rules/text-section.rules.d.ts +2 -0
- package/lib/src/metadata-builder/builders/section-rules/text-section.rules.js +14 -0
- package/lib/src/metadata-builder/builders/shape-color-utils.d.ts +26 -0
- package/lib/src/metadata-builder/builders/shape-color-utils.js +52 -0
- package/lib/src/metadata-builder/builders/undo-builder.d.ts +48 -0
- package/lib/src/metadata-builder/builders/undo-builder.js +58 -0
- package/lib/src/metadata-builder/builders/update-content-text-style-builder.js +5 -1
- package/lib/src/metadata-builder/helpers/rte.helpers.d.ts +15 -4
- package/lib/src/metadata-builder/helpers/rte.helpers.js +24 -10
- package/lib/src/metadata-builder/metadata-executor.d.ts +2 -1
- package/lib/src/metadata-builder/metadata-executor.js +32 -5
- package/lib/src/metadata-builder/models.d.ts +26 -1
- package/lib/src/metadata-builder/models.js +14 -1
- package/lib/src/metadata-builder/parsers/ai-toolcall-parser.d.ts +144 -0
- package/lib/src/metadata-builder/parsers/ai-toolcall-parser.js +17 -0
- package/lib/src/metadata-builder/parsers/section-tool-arguments.d.ts +113 -24
- package/lib/src/metadata-builder/parsers/section-tool-arguments.js +5 -1
- package/lib/src/metadata-builder/sanitizers/rte-schema-check.d.ts +22 -0
- package/lib/src/metadata-builder/sanitizers/rte-schema-check.js +84 -0
- package/lib/src/metadata-builder/sanitizers/sanitizer-rules.d.ts +47 -0
- package/lib/src/metadata-builder/sanitizers/sanitizer-rules.js +60 -0
- package/lib/src/metadata-builder/sanitizers/section-args-validator.d.ts +41 -0
- package/lib/src/metadata-builder/sanitizers/section-args-validator.js +274 -0
- package/lib/src/shared/content-settings/components/content-settings/ContentSettings.mixin.d.ts +2 -1
- package/lib/src/shared/content-settings/components/content-settings/ContentSettings.mixin.js +2 -16
- package/lib/src/shared/content-settings/components/content-settings/ContentSettings.stories.js +0 -1
- package/lib/src/shared/content-settings/components/content-settings/ReplaceImageSettingsForContent.mixin.d.ts +2 -1
- package/lib/src/shared/content-settings/components/content-settings-item/ContentSettingsItem.mixin.d.ts +2 -3
- package/lib/src/shared/content-settings/components/content-settings-item/ContentSettingsItemField.mixin.d.ts +0 -4
- package/lib/src/shared/content-settings/components/content-settings-item/ContentSettingsItemField.mixin.js +6 -8
- package/lib/src/shared/content-settings/components/payment-config-field/PaymentConfigField.mixin.d.ts +0 -28
- package/lib/src/shared/logo-settings/components/EditLogoSettings.mixin.d.ts +2 -1
- package/lib/src/shared/logo-settings/components/LogoSettings.mixin.d.ts +0 -28
- package/lib/src/shared/navigation-style-settings/store/index.js +1 -0
- package/lib/src/shared/page-navigation/store/page-navigation-store.js +1 -20
- package/lib/src/shared/page-navigation/utils/nav-order-utils.d.ts +3 -0
- package/lib/src/shared/page-navigation/utils/nav-order-utils.js +20 -0
- package/lib/src/shared/page-settings/components/page-settings/PageSettings.mixin.d.ts +2 -30
- package/lib/src/shared/page-settings/components/page-settings-section-styles/PageSettingsSectionStyles.mixin.d.ts +0 -28
- package/lib/src/shared/publish-brand-page-with-state/PublishBrandPageModalWithState.mixin.d.ts +2 -43
- package/lib/src/shared/side-bar/components/SideBar.mixin.d.ts +0 -30
- package/lib/src/shared/side-bar/components/SideBarTabButton.mixin.d.ts +2 -3
- package/lib/src/shared/side-bar/store/side-bar-store.d.ts +0 -12
- package/lib/src/shared/side-bar/store/side-bar-store.js +0 -7
- package/lib/src/shared/style-settings/components/StyleSettings.mixin.d.ts +2 -29
- package/lib/src/shared/template-settings/components/TemplatesSettings.mixin.d.ts +2 -1
- package/lib/src/utils/build-asset-manifest.d.ts +26 -0
- package/lib/src/utils/build-asset-manifest.js +114 -0
- package/lib/src/utils/minify-brand-page-metadata.d.ts +49 -1
- package/lib/src/utils/minify-brand-page-metadata.js +216 -129
- package/package.json +1 -1
- package/src/brand-page/components/banner-section/BannerSection.vue +1 -1
- package/src/brand-page/components/contact-form/ContactForm.vue +29 -26
- package/src/brand-page/components/image-gallery/ImageGalleryModal.mixin.ts +6 -2
- package/src/brand-page/components/text-media-section/TextMediaSection.vue +1 -5
- package/src/brand-page/models/brand-page-context.model.ts +1 -25
- package/src/brand-page/models/index.ts +1 -0
- package/src/brand-page/utils/color.util.test.ts +48 -0
- package/src/brand-page/utils/color.util.ts +29 -4
- package/src/brand-page/utils/raygun.util.ts +11 -2
- package/src/brand-page/utils/svg-color.util.ts +1 -3
- package/src/brand-page/utils/view-model.util.ts +1 -4
- package/src/brand-page-maker/components/ai-text-edit/AiChatbox.vue +2 -2
- package/src/brand-page-maker/components/ai-text-edit/AiProgressFeed.vue +162 -0
- package/src/brand-page-maker/components/ai-text-edit/TextBubble.vue +57 -5
- package/src/brand-page-maker/components/ai-text-edit/i18n/generate-ai.de-DE.json +0 -20
- package/src/brand-page-maker/components/ai-text-edit/i18n/generate-ai.es-ES.json +0 -20
- package/src/brand-page-maker/components/ai-text-edit/i18n/generate-ai.fr-CA.json +0 -20
- package/src/brand-page-maker/components/ai-text-edit/i18n/generate-ai.fr-FR.json +0 -20
- package/src/brand-page-maker/components/ai-text-edit/i18n/generate-ai.json +0 -20
- package/src/brand-page-maker/components/ai-text-edit/i18n/generate-ai.pt-BR.json +0 -20
- package/src/brand-page-maker/components/ai-text-edit/i18n/generate-ai.pt-PT.json +0 -20
- package/src/brand-page-maker/components/ai-website-builder/AiWebsiteBuilder.vue +1 -2
- package/src/brand-page-maker/components/ai-website-builder/i18n/ai-website-builder.de-DE.json +3 -0
- package/src/brand-page-maker/components/ai-website-builder/i18n/ai-website-builder.es-ES.json +3 -0
- package/src/brand-page-maker/components/ai-website-builder/i18n/ai-website-builder.fr-CA.json +3 -0
- package/src/brand-page-maker/components/ai-website-builder/i18n/ai-website-builder.fr-FR.json +3 -0
- package/src/brand-page-maker/components/ai-website-builder/i18n/ai-website-builder.json +3 -0
- package/src/brand-page-maker/components/ai-website-builder/i18n/ai-website-builder.pt-BR.json +3 -0
- package/src/brand-page-maker/components/ai-website-builder/i18n/ai-website-builder.pt-PT.json +3 -0
- package/src/brand-page-maker/components/brand-page-maker/BrandPageMaker.vue +3 -28
- package/src/brand-page-maker/components/brand-page-maker/__fixtures__/brand-page-examples.ts +0 -2
- package/src/brand-page-maker/composables/ai-chat/aiErrorCopy.test.ts +229 -0
- package/src/brand-page-maker/composables/ai-chat/aiErrorCopy.ts +164 -0
- package/src/brand-page-maker/composables/ai-chat/types.ts +49 -0
- package/src/brand-page-maker/composables/ai-chat/useAiMetadataBuilder.ts +20 -0
- package/src/brand-page-maker/composables/ai-chat/useAiWebsiteBuilderChat.ts +651 -94
- package/src/brand-page-maker/composables/rich-text-editor/useRichTextEditor.ts +9 -9
- package/src/brand-page-maker/composables/useEventTracker.ts +31 -25
- package/src/brand-page-maker/constants/sidebar-constant.ts +7 -15
- package/src/brand-page-maker/convertors/image-aspect-ratio.convertor.ts +2 -2
- package/src/brand-page-maker/convertors/text-size-value.convertor.ts +3 -3
- package/src/brand-page-maker/stores/ai-checkpoint/ai-checkpoint-store.ts +54 -0
- package/src/brand-page-maker/stores/brandpage-maker/brandpage-maker-store.ts +76 -0
- package/src/brand-page-maker/stores/index.ts +1 -1
- package/src/brand-page-maker/stores/user/user-store.ts +0 -1
- package/src/bundles/bundled-translations.de-DE.json +1 -20
- package/src/bundles/bundled-translations.es-ES.json +1 -20
- package/src/bundles/bundled-translations.fr-CA.json +1 -20
- package/src/bundles/bundled-translations.fr-FR.json +1 -20
- package/src/bundles/bundled-translations.json +1 -20
- package/src/bundles/bundled-translations.pt-BR.json +1 -20
- package/src/bundles/bundled-translations.pt-PT.json +1 -20
- package/src/clients/ai-assistant-client.ts +59 -46
- package/src/clients/design-template-client.ts +0 -66
- package/src/clients/websocket-gateway-client.ts +17 -1
- package/src/composables/useTranslate.ts +3 -0
- package/src/constants/ui.ts +0 -1
- package/src/lib.ts +1 -0
- package/src/metadata-builder/ai-metadata-executor.ts +94 -1
- package/src/metadata-builder/builders/add-page-builder.ts +9 -13
- package/src/metadata-builder/builders/footer-builder.test.ts +76 -0
- package/src/metadata-builder/builders/footer-builder.ts +226 -0
- package/src/metadata-builder/builders/global-styles-builder.ts +187 -0
- package/src/metadata-builder/builders/header-builder.test.ts +106 -0
- package/src/metadata-builder/builders/header-builder.ts +254 -0
- package/src/metadata-builder/builders/rename-page-builder.ts +79 -0
- package/src/metadata-builder/builders/section-builders/about-section-builder.ts +73 -5
- package/src/metadata-builder/builders/section-builders/banner-section-builder.ts +112 -7
- package/src/metadata-builder/builders/section-builders/base-section-builder.ts +149 -11
- package/src/metadata-builder/builders/section-builders/booking-section-builder.ts +87 -0
- package/src/metadata-builder/builders/section-builders/button-section-builder.ts +6 -1
- package/src/metadata-builder/builders/section-builders/contact-form-builder.ts +74 -4
- package/src/metadata-builder/builders/section-builders/delete-section-builder.ts +15 -1
- package/src/metadata-builder/builders/section-builders/divider-section-builder.ts +13 -1
- package/src/metadata-builder/builders/section-builders/image-gallery-builder.ts +91 -31
- package/src/metadata-builder/builders/section-builders/images-section-builder.ts +102 -48
- package/src/metadata-builder/builders/section-builders/index.ts +1 -0
- package/src/metadata-builder/builders/section-builders/mailing-list-builder.ts +38 -2
- package/src/metadata-builder/builders/section-builders/mailing-list-section-builder.ts +38 -2
- package/src/metadata-builder/builders/section-builders/profile-section-builder.ts +55 -3
- package/src/metadata-builder/builders/section-builders/shapes-section-builder.ts +170 -77
- package/src/metadata-builder/builders/section-builders/social-links-builder.test.ts +119 -0
- package/src/metadata-builder/builders/section-builders/social-links-builder.ts +13 -2
- package/src/metadata-builder/builders/section-builders/testimonial-section-builder.ts +178 -57
- package/src/metadata-builder/builders/section-builders/text-section-builder.ts +130 -30
- package/src/metadata-builder/builders/section-content-factory.ts +15 -2
- package/src/metadata-builder/builders/section-field-maps.ts +34 -1
- package/src/metadata-builder/builders/section-field-utils.ts +131 -72
- package/src/metadata-builder/builders/section-rules/about-section.rules.ts +38 -0
- package/src/metadata-builder/builders/section-rules/add-page.rules.ts +17 -0
- package/src/metadata-builder/builders/section-rules/banner-section.rules.ts +49 -0
- package/src/metadata-builder/builders/section-rules/booking-section.rules.ts +34 -0
- package/src/metadata-builder/builders/section-rules/button-section.rules.ts +22 -0
- package/src/metadata-builder/builders/section-rules/contact-form.rules.ts +30 -0
- package/src/metadata-builder/builders/section-rules/divider-section.rules.ts +17 -0
- package/src/metadata-builder/builders/section-rules/footer.rules.ts +21 -0
- package/src/metadata-builder/builders/section-rules/global-styles.rules.ts +44 -0
- package/src/metadata-builder/builders/section-rules/header.rules.ts +75 -0
- package/src/metadata-builder/builders/section-rules/image-gallery.rules.ts +22 -0
- package/src/metadata-builder/builders/section-rules/images-section.rules.ts +55 -0
- package/src/metadata-builder/builders/section-rules/mailing-list.rules.ts +21 -0
- package/src/metadata-builder/builders/section-rules/profile.rules.ts +27 -0
- package/src/metadata-builder/builders/section-rules/rename-page.rules.ts +17 -0
- package/src/metadata-builder/builders/section-rules/shapes-section.rules.ts +51 -0
- package/src/metadata-builder/builders/section-rules/social-links.rules.ts +27 -0
- package/src/metadata-builder/builders/section-rules/testimonial-section.rules.ts +48 -0
- package/src/metadata-builder/builders/section-rules/text-section.rules.ts +28 -0
- package/src/metadata-builder/builders/shape-color-utils.test.ts +115 -0
- package/src/metadata-builder/builders/shape-color-utils.ts +75 -0
- package/src/metadata-builder/builders/undo-builder.ts +105 -0
- package/src/metadata-builder/builders/update-content-text-style-builder.ts +4 -1
- package/src/metadata-builder/helpers/rte.helpers.ts +27 -13
- package/src/metadata-builder/metadata-executor.ts +42 -2
- package/src/metadata-builder/models.ts +39 -1
- package/src/metadata-builder/parsers/ai-toolcall-parser.ts +152 -0
- package/src/metadata-builder/parsers/section-tool-arguments.ts +138 -24
- package/src/metadata-builder/sanitizers/__tests__/section-args-validator.test.ts +659 -0
- package/src/metadata-builder/sanitizers/rte-schema-check.ts +99 -0
- package/src/metadata-builder/sanitizers/sanitizer-rules.ts +97 -0
- package/src/metadata-builder/sanitizers/section-args-validator.ts +445 -0
- package/src/shared/content-settings/components/content-settings/ContentSettings.mixin.ts +10 -16
- package/src/shared/content-settings/components/content-settings/ContentSettings.stories.ts +0 -1
- package/src/shared/content-settings/components/content-settings-item/ContentSettingsItemField.mixin.ts +6 -10
- package/src/shared/content-settings/components/content-settings-item/ContentSettingsItemField.vue +1 -23
- package/src/shared/content-settings/components/testimonial-items-field/TestimonialItemsField.vue +0 -15
- package/src/shared/content-settings/components/text-items-field/TextItemsField.vue +0 -15
- package/src/shared/navigation-style-settings/store/index.ts +5 -0
- package/src/shared/page-navigation/store/page-navigation-store.ts +4 -31
- package/src/shared/page-navigation/utils/nav-order-utils.ts +32 -0
- package/src/shared/side-bar/components/SideBar.vue +14 -1
- package/src/shared/side-bar/store/side-bar-store.ts +0 -20
- package/src/utils/build-asset-manifest.ts +153 -0
- package/src/utils/minify-brand-page-metadata.ts +362 -130
- package/lib/src/brand-page-maker/composables/ai-chat/useAiChat.js +0 -368
- package/lib/src/brand-page-maker/composables/ai-chat/useAiTextEditPrompts.d.ts +0 -18
- package/lib/src/brand-page-maker/composables/ai-chat/useAiTextEditPrompts.js +0 -144
- package/lib/src/brand-page-maker/stores/ai-thread/ai-thread-store.d.ts +0 -155
- package/lib/src/brand-page-maker/stores/ai-thread/ai-thread-store.js +0 -25
- package/lib/src/brand-page-maker/utils/mixpanel.util.d.ts +0 -1
- package/lib/src/brand-page-maker/utils/mixpanel.util.js +0 -29
- package/lib/src/bundled-translations-CNK7l6_v.js +0 -173
- package/lib/src/bundled-translations.de-DE-BLE4_y0H.js +0 -173
- package/lib/src/bundled-translations.es-ES-thO9osbg.js +0 -173
- package/lib/src/bundled-translations.fr-CA-BZkhiNgU.js +0 -173
- package/lib/src/bundled-translations.fr-FR-bhDLPKgZ.js +0 -173
- package/lib/src/bundled-translations.pt-BR-CI9a5Bq1.js +0 -173
- package/lib/src/bundled-translations.pt-PT-DBoErBaq.js +0 -173
- package/src/brand-page-maker/components/ai-text-edit/AiTextEdit.vue +0 -154
- package/src/brand-page-maker/composables/ai-chat/useAiChat.ts +0 -562
- package/src/brand-page-maker/composables/ai-chat/useAiTextEditPrompts.ts +0 -196
- package/src/brand-page-maker/stores/ai-thread/ai-thread-store.ts +0 -31
- package/src/brand-page-maker/utils/mixpanel.util.ts +0 -42
- package/src/shared/content-settings/components/generate-ai-button/GenerateAiButton.vue +0 -114
- package/src/shared/content-settings/components/generate-ai-modal/GenerateAiModal.vue +0 -761
|
@@ -18,12 +18,20 @@ const bannerFields = defineFieldMap({
|
|
|
18
18
|
button_text: 'buttonText',
|
|
19
19
|
button_url: 'url',
|
|
20
20
|
background_image_url: 'imageUrl',
|
|
21
|
+
background_shape_url: 'imageUrl',
|
|
21
22
|
display_style: 'displayStyle',
|
|
22
23
|
});
|
|
24
|
+
const bookingFields = defineFieldMap({
|
|
25
|
+
title: 'title',
|
|
26
|
+
description: 'description',
|
|
27
|
+
button_text: 'buttonText',
|
|
28
|
+
button_url: 'url',
|
|
29
|
+
});
|
|
23
30
|
const aboutFields = defineFieldMap({
|
|
24
31
|
title: 'title',
|
|
25
32
|
paragraph: 'paragraph',
|
|
26
33
|
about_image_url: 'imageUrl',
|
|
34
|
+
about_shape_url: 'imageUrl',
|
|
27
35
|
display_style: 'displayStyle',
|
|
28
36
|
});
|
|
29
37
|
const testimonialFields = defineFieldMap({
|
|
@@ -67,8 +75,8 @@ const contactFormFields = defineFieldMap({
|
|
|
67
75
|
layout_style: 'layoutStyle',
|
|
68
76
|
});
|
|
69
77
|
const mailingListFields = defineFieldMap({
|
|
70
|
-
title: 'title',
|
|
71
78
|
button_text: 'buttonText',
|
|
79
|
+
accepted_fields: 'acceptedFields',
|
|
72
80
|
});
|
|
73
81
|
const socialLinksFields = defineFieldMap({
|
|
74
82
|
title: 'title',
|
|
@@ -77,13 +85,15 @@ const socialLinksFields = defineFieldMap({
|
|
|
77
85
|
});
|
|
78
86
|
const dividerFields = defineFieldMap({
|
|
79
87
|
divider_style: 'dividerStyle',
|
|
88
|
+
padding: 'paddingStyle',
|
|
80
89
|
});
|
|
81
90
|
const imageFields = defineFieldMap({
|
|
82
91
|
image_url: 'imageUrl',
|
|
83
92
|
image_title: 'imageTitle',
|
|
84
93
|
});
|
|
85
94
|
const imageGalleryFields = defineFieldMap({
|
|
86
|
-
|
|
95
|
+
is_full_width: 'isFullWidth',
|
|
96
|
+
// images handled separately
|
|
87
97
|
});
|
|
88
98
|
const buttonWithIconFields = defineFieldMap({
|
|
89
99
|
title: 'title',
|
|
@@ -106,6 +116,7 @@ const socialButtonFields = defineFieldMap({
|
|
|
106
116
|
});
|
|
107
117
|
export const SECTION_FIELD_MAPS = {
|
|
108
118
|
'banner-section': bannerFields,
|
|
119
|
+
'booking-section': bookingFields,
|
|
109
120
|
'about-section': aboutFields,
|
|
110
121
|
'testimonial-section': testimonialFields,
|
|
111
122
|
'images-section': imagesSectionFields,
|
|
@@ -163,6 +174,7 @@ const imagesSectionStyleFields = defineFieldMap({
|
|
|
163
174
|
description_style: 'descriptionStyle',
|
|
164
175
|
heading_style: 'headingStyle',
|
|
165
176
|
paragraph_style: 'paragraphStyle',
|
|
177
|
+
button_text_style: 'buttonTextStyle',
|
|
166
178
|
});
|
|
167
179
|
const shapesSectionStyleFields = defineFieldMap({
|
|
168
180
|
title_style: 'titleStyle',
|
|
@@ -170,13 +182,29 @@ const shapesSectionStyleFields = defineFieldMap({
|
|
|
170
182
|
heading_style: 'headingStyle',
|
|
171
183
|
paragraph_style: 'paragraphStyle',
|
|
172
184
|
});
|
|
185
|
+
const bookingStyleFields = defineFieldMap({
|
|
186
|
+
title_style: 'titleStyle',
|
|
187
|
+
description_style: 'descriptionStyle',
|
|
188
|
+
button_text_style: 'buttonTextStyle',
|
|
189
|
+
});
|
|
190
|
+
const mailingListStyleFields = defineFieldMap({
|
|
191
|
+
title_style: 'titleStyle',
|
|
192
|
+
button_text_style: 'buttonTextStyle',
|
|
193
|
+
});
|
|
194
|
+
const socialLinksStyleFields = defineFieldMap({
|
|
195
|
+
icon_fill_style: 'iconFillStyles',
|
|
196
|
+
icon_background_style: 'iconBackgroundStyles',
|
|
197
|
+
});
|
|
173
198
|
export const STYLE_FIELD_MAPS = {
|
|
174
199
|
'banner-section': bannerStyleFields,
|
|
200
|
+
'booking-section': bookingStyleFields,
|
|
175
201
|
'about-section': aboutStyleFields,
|
|
176
202
|
text: textStyleFields,
|
|
177
203
|
'testimonial-section': testimonialStyleFields,
|
|
178
204
|
'contact-form': contactFormStyleFields,
|
|
179
205
|
'images-section': imagesSectionStyleFields,
|
|
180
206
|
'shapes-section': shapesSectionStyleFields,
|
|
207
|
+
'mailing-list': mailingListStyleFields,
|
|
208
|
+
'social-links': socialLinksStyleFields,
|
|
181
209
|
};
|
|
182
210
|
export const getStyleFieldMap = (sectionType) => STYLE_FIELD_MAPS[sectionType];
|
|
@@ -1,11 +1,50 @@
|
|
|
1
1
|
import type { Content } from '../../brand-page/models';
|
|
2
|
-
import type {
|
|
2
|
+
import type { ButtonLinkType } from '../../brand-page/models';
|
|
3
|
+
import type { TextStyleOptions } from '../../brand-page/models/styles.model';
|
|
4
|
+
import { type SectionToolArguments } from '../parsers/section-tool-arguments';
|
|
5
|
+
export declare const isValidUrl: (value: unknown) => boolean;
|
|
6
|
+
interface ButtonLinkContent {
|
|
7
|
+
url: string;
|
|
8
|
+
email?: string;
|
|
9
|
+
tel?: string;
|
|
10
|
+
buttonPageId: string;
|
|
11
|
+
buttonLinkType: ButtonLinkType;
|
|
12
|
+
}
|
|
13
|
+
interface ButtonLinkArgs {
|
|
14
|
+
button_link_type?: 'url' | 'page' | 'mailTo' | 'tel';
|
|
15
|
+
button_url?: string;
|
|
16
|
+
}
|
|
17
|
+
/**
|
|
18
|
+
* Sets buttonLinkType and the corresponding link value field (url/email/tel/buttonPageId)
|
|
19
|
+
* on any section content that supports multiple button link types.
|
|
20
|
+
* Must be called after applyScalarFields() since that sets content.url as a baseline.
|
|
21
|
+
*/
|
|
22
|
+
export declare const applyButtonLink: (content: ButtonLinkContent, args: ButtonLinkArgs) => void;
|
|
3
23
|
export declare const applyScalarFields: (content: Content, args: SectionToolArguments, sectionType: string) => void;
|
|
4
|
-
export declare const applyStyleFields: (content: Content, args: SectionToolArguments, sectionType: string) => void;
|
|
5
24
|
/**
|
|
6
|
-
*
|
|
7
|
-
*
|
|
8
|
-
*
|
|
9
|
-
*
|
|
25
|
+
* When an executor is about to mark a content-level text style "custom" by
|
|
26
|
+
* clearing `textStyleType`, the resolved preset values (font, size, spacing,
|
|
27
|
+
* etc.) must first be copied onto the style — otherwise the renderer falls
|
|
28
|
+
* back to browser defaults because `textStyleType` no longer points at a
|
|
29
|
+
* preset.
|
|
30
|
+
*
|
|
31
|
+
* The category is read from the existing `style.textStyleType`, which is the
|
|
32
|
+
* authoritative per-section + per-field reference set by the content factory.
|
|
33
|
+
* Existing style values win over preset defaults (the content may already
|
|
34
|
+
* carry user overrides on top of the preset).
|
|
35
|
+
*/
|
|
36
|
+
export declare const resolveGlobalPresetIntoStyle: (style: object | undefined, textStyleOptions: TextStyleOptions | undefined) => Record<string, unknown>;
|
|
37
|
+
/**
|
|
38
|
+
* Applies per-element style overrides while detaching the element from any
|
|
39
|
+
* global text-style preset. When a style is bound to a `textStyleType` preset,
|
|
40
|
+
* the renderer (`getCopyrightTextStyle` / `getTextStyleByContentTextStyle`)
|
|
41
|
+
* replaces the whole style with that preset and discards per-element values such
|
|
42
|
+
* as `fontFamily`. Resolving the preset in and clearing `textStyleType` makes the
|
|
43
|
+
* override stick — the same disconnect rule section content follows.
|
|
44
|
+
*
|
|
45
|
+
* Idempotent: once `textStyleType` is cleared, subsequent calls just merge the
|
|
46
|
+
* updates without re-resolving a preset.
|
|
10
47
|
*/
|
|
11
|
-
export declare const
|
|
48
|
+
export declare const applyDetachedStyleOverride: <T extends object>(current: T | undefined, updates: Partial<T>, textStyleOptions: TextStyleOptions | undefined) => T;
|
|
49
|
+
export declare const applyStyleFields: (content: Content, args: SectionToolArguments, sectionType: string, textStyleOptions?: TextStyleOptions) => void;
|
|
50
|
+
export {};
|
|
@@ -1,8 +1,8 @@
|
|
|
1
|
-
import {
|
|
2
|
-
import {
|
|
1
|
+
import { BUTTON_LINK_TYPE } from '../../brand-page/models';
|
|
2
|
+
import { isTiptapDocument, } from '../parsers/section-tool-arguments';
|
|
3
3
|
import { getSectionFieldMap, getStyleFieldMap } from './section-field-maps';
|
|
4
4
|
const isUrlField = (aiKey) => aiKey.endsWith('_url');
|
|
5
|
-
const isValidUrl = (value) => {
|
|
5
|
+
export const isValidUrl = (value) => {
|
|
6
6
|
if (typeof value !== 'string' || !value)
|
|
7
7
|
return false;
|
|
8
8
|
try {
|
|
@@ -13,6 +13,27 @@ const isValidUrl = (value) => {
|
|
|
13
13
|
return false;
|
|
14
14
|
}
|
|
15
15
|
};
|
|
16
|
+
/**
|
|
17
|
+
* Sets buttonLinkType and the corresponding link value field (url/email/tel/buttonPageId)
|
|
18
|
+
* on any section content that supports multiple button link types.
|
|
19
|
+
* Must be called after applyScalarFields() since that sets content.url as a baseline.
|
|
20
|
+
*/
|
|
21
|
+
export const applyButtonLink = (content, args) => {
|
|
22
|
+
const { button_link_type: linkType, button_url: buttonUrl } = args;
|
|
23
|
+
if (!linkType || !buttonUrl)
|
|
24
|
+
return;
|
|
25
|
+
content.buttonLinkType = linkType;
|
|
26
|
+
switch (linkType) {
|
|
27
|
+
case BUTTON_LINK_TYPE.url:
|
|
28
|
+
case BUTTON_LINK_TYPE.mailTo:
|
|
29
|
+
case BUTTON_LINK_TYPE.tel:
|
|
30
|
+
content.url = buttonUrl;
|
|
31
|
+
break;
|
|
32
|
+
case BUTTON_LINK_TYPE.page:
|
|
33
|
+
content.buttonPageId = buttonUrl.replace('pageid:', '');
|
|
34
|
+
break;
|
|
35
|
+
}
|
|
36
|
+
};
|
|
16
37
|
export const applyScalarFields = (content, args, sectionType) => {
|
|
17
38
|
const fieldMap = getSectionFieldMap(sectionType);
|
|
18
39
|
if (!fieldMap)
|
|
@@ -20,10 +41,14 @@ export const applyScalarFields = (content, args, sectionType) => {
|
|
|
20
41
|
const record = content;
|
|
21
42
|
for (const [aiKey, modelKey] of Object.entries(fieldMap)) {
|
|
22
43
|
if (aiKey in args) {
|
|
44
|
+
const value = args[aiKey];
|
|
23
45
|
// Skip invalid URLs — don't overwrite model with malformed values
|
|
24
|
-
if (isUrlField(aiKey) && !isValidUrl(
|
|
46
|
+
if (isUrlField(aiKey) && !isValidUrl(value))
|
|
47
|
+
continue;
|
|
48
|
+
// Skip Tiptap JSON documents — each builder handles its own RTE fields
|
|
49
|
+
if (isTiptapDocument(value))
|
|
25
50
|
continue;
|
|
26
|
-
record[modelKey] =
|
|
51
|
+
record[modelKey] = value;
|
|
27
52
|
}
|
|
28
53
|
}
|
|
29
54
|
};
|
|
@@ -41,74 +66,73 @@ const normalizeStyleValue = (key, value) => {
|
|
|
41
66
|
if (key === 'letterSpacing' && typeof value === 'number') {
|
|
42
67
|
return `${value / 100}em`;
|
|
43
68
|
}
|
|
44
|
-
if (key === 'lineHeight'
|
|
45
|
-
|
|
69
|
+
if (key === 'lineHeight') {
|
|
70
|
+
// Snap to 0.1 increments to match the UI slider step
|
|
71
|
+
const num = typeof value === 'number' ? value : parseFloat(String(value));
|
|
72
|
+
if (!isNaN(num))
|
|
73
|
+
return String(Math.floor(num * 10) / 10);
|
|
46
74
|
}
|
|
47
75
|
return value;
|
|
48
76
|
};
|
|
49
|
-
export const applyStyleFields = (content, args, sectionType) => {
|
|
50
|
-
const styleMap = getStyleFieldMap(sectionType);
|
|
51
|
-
if (!styleMap)
|
|
52
|
-
return;
|
|
53
|
-
const record = content;
|
|
54
|
-
for (const [aiKey, modelKey] of Object.entries(styleMap)) {
|
|
55
|
-
if (aiKey in args && args[aiKey] && typeof args[aiKey] === 'object') {
|
|
56
|
-
const existing = content[modelKey] || {};
|
|
57
|
-
const aiStyle = args[aiKey];
|
|
58
|
-
const filtered = {};
|
|
59
|
-
for (const [k, v] of Object.entries(aiStyle)) {
|
|
60
|
-
const normalized = normalizeStyleValue(k, v);
|
|
61
|
-
if (normalized !== undefined)
|
|
62
|
-
filtered[k] = normalized;
|
|
63
|
-
}
|
|
64
|
-
record[modelKey] = {
|
|
65
|
-
...existing,
|
|
66
|
-
...filtered,
|
|
67
|
-
textStyleType: undefined,
|
|
68
|
-
};
|
|
69
|
-
}
|
|
70
|
-
}
|
|
71
|
-
};
|
|
72
77
|
/**
|
|
73
|
-
*
|
|
74
|
-
*
|
|
75
|
-
*
|
|
78
|
+
* When an executor is about to mark a content-level text style "custom" by
|
|
79
|
+
* clearing `textStyleType`, the resolved preset values (font, size, spacing,
|
|
80
|
+
* etc.) must first be copied onto the style — otherwise the renderer falls
|
|
81
|
+
* back to browser defaults because `textStyleType` no longer points at a
|
|
82
|
+
* preset.
|
|
76
83
|
*
|
|
77
|
-
*
|
|
78
|
-
*
|
|
84
|
+
* The category is read from the existing `style.textStyleType`, which is the
|
|
85
|
+
* authoritative per-section + per-field reference set by the content factory.
|
|
86
|
+
* Existing style values win over preset defaults (the content may already
|
|
87
|
+
* carry user overrides on top of the preset).
|
|
79
88
|
*/
|
|
80
|
-
const
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
}
|
|
87
|
-
|
|
88
|
-
{
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
89
|
+
export const resolveGlobalPresetIntoStyle = (style, textStyleOptions) => {
|
|
90
|
+
const base = { ...(style ?? {}) };
|
|
91
|
+
const currentTextStyleType = base.textStyleType;
|
|
92
|
+
if (!currentTextStyleType || !textStyleOptions?.[currentTextStyleType]) {
|
|
93
|
+
base.textStyleType = undefined;
|
|
94
|
+
return base;
|
|
95
|
+
}
|
|
96
|
+
const presetStyle = textStyleOptions[currentTextStyleType].style;
|
|
97
|
+
const presetDefaults = {};
|
|
98
|
+
for (const [k, v] of Object.entries(presetStyle)) {
|
|
99
|
+
if (k === 'textStyleType' || v === undefined)
|
|
100
|
+
continue;
|
|
101
|
+
presetDefaults[k] = v;
|
|
102
|
+
}
|
|
103
|
+
return { ...presetDefaults, ...base, textStyleType: undefined };
|
|
104
|
+
};
|
|
94
105
|
/**
|
|
95
|
-
*
|
|
96
|
-
*
|
|
97
|
-
* (
|
|
98
|
-
*
|
|
106
|
+
* Applies per-element style overrides while detaching the element from any
|
|
107
|
+
* global text-style preset. When a style is bound to a `textStyleType` preset,
|
|
108
|
+
* the renderer (`getCopyrightTextStyle` / `getTextStyleByContentTextStyle`)
|
|
109
|
+
* replaces the whole style with that preset and discards per-element values such
|
|
110
|
+
* as `fontFamily`. Resolving the preset in and clearing `textStyleType` makes the
|
|
111
|
+
* override stick — the same disconnect rule section content follows.
|
|
112
|
+
*
|
|
113
|
+
* Idempotent: once `textStyleType` is cleared, subsequent calls just merge the
|
|
114
|
+
* updates without re-resolving a preset.
|
|
99
115
|
*/
|
|
100
|
-
export const
|
|
101
|
-
|
|
116
|
+
export const applyDetachedStyleOverride = (current, updates, textStyleOptions) => ({
|
|
117
|
+
...resolveGlobalPresetIntoStyle(current, textStyleOptions),
|
|
118
|
+
...updates,
|
|
119
|
+
});
|
|
120
|
+
export const applyStyleFields = (content, args, sectionType, textStyleOptions) => {
|
|
121
|
+
const styleMap = getStyleFieldMap(sectionType);
|
|
122
|
+
if (!styleMap)
|
|
102
123
|
return;
|
|
103
124
|
const record = content;
|
|
104
|
-
const
|
|
105
|
-
|
|
106
|
-
if (!argsRecord[argKey])
|
|
125
|
+
for (const [aiKey, modelKey] of Object.entries(styleMap)) {
|
|
126
|
+
if (!(aiKey in args) || !args[aiKey] || typeof args[aiKey] !== 'object')
|
|
107
127
|
continue;
|
|
108
|
-
const
|
|
109
|
-
const
|
|
110
|
-
|
|
111
|
-
|
|
128
|
+
const aiStyle = args[aiKey];
|
|
129
|
+
const filtered = {};
|
|
130
|
+
for (const [k, v] of Object.entries(aiStyle)) {
|
|
131
|
+
const normalized = normalizeStyleValue(k, v);
|
|
132
|
+
if (normalized !== undefined)
|
|
133
|
+
filtered[k] = normalized;
|
|
112
134
|
}
|
|
135
|
+
const resolved = resolveGlobalPresetIntoStyle(content[modelKey], textStyleOptions);
|
|
136
|
+
record[modelKey] = { ...resolved, ...filtered, textStyleType: undefined };
|
|
113
137
|
}
|
|
114
138
|
};
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
import { MAX_TITLE_LENGTH, MAX_DESCRIPTION_LENGTH, } from '../../../brand-page/constants/font.constants';
|
|
2
|
+
import { enumCheck, runChecks, styleCheck, } from '../../sanitizers/section-args-validator';
|
|
3
|
+
import { textAndRteChecks } from '../../sanitizers/rte-schema-check';
|
|
4
|
+
const CHECKS = [
|
|
5
|
+
...textAndRteChecks('title', MAX_TITLE_LENGTH),
|
|
6
|
+
...textAndRteChecks('paragraph', MAX_DESCRIPTION_LENGTH),
|
|
7
|
+
styleCheck('title_style'),
|
|
8
|
+
styleCheck('paragraph_style'),
|
|
9
|
+
enumCheck('display_style', [
|
|
10
|
+
'left-aligned',
|
|
11
|
+
'right-aligned',
|
|
12
|
+
'centered',
|
|
13
|
+
'text-only',
|
|
14
|
+
'left-aligned-full-image',
|
|
15
|
+
'right-aligned-full-image',
|
|
16
|
+
], 'about-section'),
|
|
17
|
+
];
|
|
18
|
+
export function validateAboutSection(args, ctx) {
|
|
19
|
+
return runChecks(CHECKS, args, ctx);
|
|
20
|
+
}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import { PAGE_RULES } from '../../sanitizers/sanitizer-rules';
|
|
2
|
+
export const ADD_PAGE_CHECKS = [
|
|
3
|
+
(p) => (!p?.pageId ? 'page_id is required for add_page' : null),
|
|
4
|
+
(p) => (!p?.pageName ? 'page_name is required for add_page' : null),
|
|
5
|
+
(p) => p?.pageName && p.pageName.length > PAGE_RULES.pageName
|
|
6
|
+
? `page_name exceeds the maximum length of ${PAGE_RULES.pageName} characters (got ${p.pageName.length})`
|
|
7
|
+
: null,
|
|
8
|
+
];
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
import { MAX_TITLE_LENGTH, MAX_DESCRIPTION_LENGTH, } from '../../../brand-page/constants/font.constants';
|
|
2
|
+
import { BUTTON_LINK_TYPE } from '../../../brand-page/models';
|
|
3
|
+
import { enumCheck, runChecks, styleCheck, } from '../../sanitizers/section-args-validator';
|
|
4
|
+
import { textAndRteChecks } from '../../sanitizers/rte-schema-check';
|
|
5
|
+
const CHECKS = [
|
|
6
|
+
...textAndRteChecks('title', MAX_TITLE_LENGTH),
|
|
7
|
+
...textAndRteChecks('description', MAX_DESCRIPTION_LENGTH),
|
|
8
|
+
...textAndRteChecks('button_text', MAX_TITLE_LENGTH),
|
|
9
|
+
styleCheck('title_style'),
|
|
10
|
+
styleCheck('description_style'),
|
|
11
|
+
styleCheck('button_text_style'),
|
|
12
|
+
enumCheck('display_style', [
|
|
13
|
+
'left-aligned',
|
|
14
|
+
'right-aligned',
|
|
15
|
+
'centered',
|
|
16
|
+
'big-image',
|
|
17
|
+
'left-aligned-big-image',
|
|
18
|
+
'right-aligned-full-image',
|
|
19
|
+
'left-aligned-full-image',
|
|
20
|
+
'center-card-aligned-image',
|
|
21
|
+
'left-card-aligned-image',
|
|
22
|
+
], 'banner-section'),
|
|
23
|
+
enumCheck('button_link_type', Object.keys(BUTTON_LINK_TYPE), 'banner-section'),
|
|
24
|
+
];
|
|
25
|
+
export function validateBannerSection(args, ctx) {
|
|
26
|
+
return runChecks(CHECKS, args, ctx);
|
|
27
|
+
}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
import { MAX_TITLE_LENGTH, MAX_DESCRIPTION_LENGTH, } from '../../../brand-page/constants/font.constants';
|
|
2
|
+
import { BUTTON_LINK_TYPE } from '../../../brand-page/models';
|
|
3
|
+
import { enumCheck, runChecks, styleCheck, } from '../../sanitizers/section-args-validator';
|
|
4
|
+
import { textAndRteChecks } from '../../sanitizers/rte-schema-check';
|
|
5
|
+
const CHECKS = [
|
|
6
|
+
...textAndRteChecks('title', MAX_TITLE_LENGTH),
|
|
7
|
+
...textAndRteChecks('description', MAX_DESCRIPTION_LENGTH),
|
|
8
|
+
...textAndRteChecks('button_text', MAX_TITLE_LENGTH),
|
|
9
|
+
styleCheck('title_style'),
|
|
10
|
+
styleCheck('description_style'),
|
|
11
|
+
styleCheck('button_text_style'),
|
|
12
|
+
enumCheck('button_link_type', Object.keys(BUTTON_LINK_TYPE), 'booking-section'),
|
|
13
|
+
];
|
|
14
|
+
export function validateBookingSection(args, ctx) {
|
|
15
|
+
return runChecks(CHECKS, args, ctx);
|
|
16
|
+
}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import { MAX_TITLE_LENGTH } from '../../../brand-page/constants/font.constants';
|
|
2
|
+
import { runChecks, } from '../../sanitizers/section-args-validator';
|
|
3
|
+
import { textAndRteChecks } from '../../sanitizers/rte-schema-check';
|
|
4
|
+
/**
|
|
5
|
+
* Shared validation for all link/button section types:
|
|
6
|
+
* website, email, phone, general-link, facebook, x, instagram,
|
|
7
|
+
* youtube, linkedin, pinterest, twitch, tiktok.
|
|
8
|
+
* All use ButtonSectionBuilder and share the same title constraint.
|
|
9
|
+
*/
|
|
10
|
+
const CHECKS = [...textAndRteChecks('title', MAX_TITLE_LENGTH)];
|
|
11
|
+
export function validateButtonSection(args, ctx) {
|
|
12
|
+
return runChecks(CHECKS, args, ctx);
|
|
13
|
+
}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
import { MAX_TITLE_LENGTH, MAX_DESCRIPTION_LENGTH, } from '../../../brand-page/constants/font.constants';
|
|
2
|
+
import { enumCheck, runChecks, styleCheck, } from '../../sanitizers/section-args-validator';
|
|
3
|
+
import { textAndRteChecks } from '../../sanitizers/rte-schema-check';
|
|
4
|
+
const CHECKS = [
|
|
5
|
+
...textAndRteChecks('title', MAX_TITLE_LENGTH),
|
|
6
|
+
...textAndRteChecks('description', MAX_DESCRIPTION_LENGTH),
|
|
7
|
+
...textAndRteChecks('button_text', MAX_TITLE_LENGTH),
|
|
8
|
+
...textAndRteChecks('success_message', MAX_TITLE_LENGTH),
|
|
9
|
+
styleCheck('title_style'),
|
|
10
|
+
styleCheck('description_style'),
|
|
11
|
+
styleCheck('button_text_style'),
|
|
12
|
+
enumCheck('display_style', ['preview', 'collapsed'], 'contact-form'),
|
|
13
|
+
];
|
|
14
|
+
export function validateContactForm(args, ctx) {
|
|
15
|
+
return runChecks(CHECKS, args, ctx);
|
|
16
|
+
}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
import { enumCheck, runChecks, } from '../../sanitizers/section-args-validator';
|
|
2
|
+
const CHECKS = [
|
|
3
|
+
enumCheck('divider_style', ['none', 'thin', 'thick'], 'divider-section'),
|
|
4
|
+
];
|
|
5
|
+
export function validateDividerSection(args, ctx) {
|
|
6
|
+
return runChecks(CHECKS, args, ctx);
|
|
7
|
+
}
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
import { validateLogoSize } from '../../sanitizers/section-args-validator';
|
|
2
|
+
export const FOOTER_CHECKS = ['desktop', 'mobile'].flatMap((viewport) => [
|
|
3
|
+
(args) => validateLogoSize(`${viewport}.logo_image_height`, args[viewport]?.logo_image_height, viewport),
|
|
4
|
+
(args) => validateLogoSize(`${viewport}.logo_image_width`, args[viewport]?.logo_image_width, viewport),
|
|
5
|
+
]);
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
import type { UpdateGlobalStylesArguments } from '../../parsers/ai-toolcall-parser';
|
|
2
|
+
import type { TextStyleType } from '../../../brand-page/models/styles.model';
|
|
3
|
+
export declare const TEXT_STYLE_OPTION_KEYS: TextStyleType[];
|
|
4
|
+
type GlobalStyleCheck = (args: UpdateGlobalStylesArguments) => string | null;
|
|
5
|
+
export declare const GLOBAL_STYLE_CHECKS: GlobalStyleCheck[];
|
|
6
|
+
export {};
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
import { STYLE_RULES } from '../../sanitizers/sanitizer-rules';
|
|
2
|
+
import { validateStringStyleAttrs } from '../../sanitizers/section-args-validator';
|
|
3
|
+
export const TEXT_STYLE_OPTION_KEYS = [
|
|
4
|
+
'titles',
|
|
5
|
+
'headings',
|
|
6
|
+
'paragraphs',
|
|
7
|
+
'buttons',
|
|
8
|
+
];
|
|
9
|
+
export const GLOBAL_STYLE_CHECKS = [
|
|
10
|
+
// textFontFamily: must be a recognized camelCase font key (e.g. 'playfairDisplay')
|
|
11
|
+
(args) => {
|
|
12
|
+
const font = args.textStyles?.textFontFamily;
|
|
13
|
+
if (font == null)
|
|
14
|
+
return null;
|
|
15
|
+
return !STYLE_RULES.fontFamilyKeys.has(font)
|
|
16
|
+
? `"textFontFamily" "${font}" is not a recognized font family key`
|
|
17
|
+
: null;
|
|
18
|
+
},
|
|
19
|
+
// textStyleOptions[category].style — fontSize, fontFamily, lineHeight, letterSpacing
|
|
20
|
+
...TEXT_STYLE_OPTION_KEYS.map((category) => (args) => {
|
|
21
|
+
const style = args.textStyles?.textStyleOptions?.[category]?.style;
|
|
22
|
+
if (!style)
|
|
23
|
+
return null;
|
|
24
|
+
return validateStringStyleAttrs(`textStyleOptions.${category}.style`, style);
|
|
25
|
+
}),
|
|
26
|
+
];
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
import { HEADER_DISPLAY_STYLE_CONFIGS } from '../../../brand-page/constants/sections/header-display.constants';
|
|
2
|
+
import { validateLogoSize } from '../../sanitizers/section-args-validator';
|
|
3
|
+
import { PAGE_RULES, STYLE_RULES } from '../../sanitizers/sanitizer-rules';
|
|
4
|
+
export const HEADER_CHECKS = [
|
|
5
|
+
// Display style + nav type compatibility per viewport
|
|
6
|
+
...['desktop', 'mobile'].map((viewport) => (args) => {
|
|
7
|
+
const overrides = args[viewport];
|
|
8
|
+
if (!overrides?.nav_display_type || !overrides?.display_style)
|
|
9
|
+
return null;
|
|
10
|
+
const compatible = HEADER_DISPLAY_STYLE_CONFIGS.some((c) => c.option.value === overrides.display_style &&
|
|
11
|
+
c.supportedNavTypes.includes(overrides.nav_display_type));
|
|
12
|
+
return compatible
|
|
13
|
+
? null
|
|
14
|
+
: `Incompatible ${viewport} combination: display_style "${overrides.display_style}" is not compatible with nav_display_type "${overrides.nav_display_type}".`;
|
|
15
|
+
}),
|
|
16
|
+
// Nav link font per viewport
|
|
17
|
+
...['desktop', 'mobile'].map((viewport) => (args) => {
|
|
18
|
+
const font = args[viewport]?.link_text_font;
|
|
19
|
+
if (font == null)
|
|
20
|
+
return null;
|
|
21
|
+
return !STYLE_RULES.fontFamilyNames.has(font)
|
|
22
|
+
? `"${viewport}.link_text_font" "${font}" is not a recognized font family`
|
|
23
|
+
: null;
|
|
24
|
+
}),
|
|
25
|
+
// Logo sizes per viewport
|
|
26
|
+
...['desktop', 'mobile'].flatMap((viewport) => [
|
|
27
|
+
(args) => validateLogoSize(`${viewport}.logo_image_height`, args[viewport]?.logo_image_height, viewport),
|
|
28
|
+
(args) => validateLogoSize(`${viewport}.logo_image_width`, args[viewport]?.logo_image_width, viewport),
|
|
29
|
+
]),
|
|
30
|
+
// Nav route display name length (returns first violation — retry loop handles the rest)
|
|
31
|
+
(args) => {
|
|
32
|
+
for (let i = 0; i < (args.nav_routes ?? []).length; i++) {
|
|
33
|
+
const displayName = args.nav_routes[i].display_name;
|
|
34
|
+
if (displayName != null &&
|
|
35
|
+
displayName.length > PAGE_RULES.navDisplayName) {
|
|
36
|
+
return `nav_routes[${i}].display_name exceeds the maximum length of ${PAGE_RULES.navDisplayName} characters (got ${displayName.length})`;
|
|
37
|
+
}
|
|
38
|
+
}
|
|
39
|
+
return null;
|
|
40
|
+
},
|
|
41
|
+
];
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import { MAX_TITLE_LENGTH } from '../../../brand-page/constants/font.constants';
|
|
2
|
+
import { enumCheck, itemRteStyleCheck, itemTextCheck, runChecks, } from '../../sanitizers/section-args-validator';
|
|
3
|
+
const CHECKS = [
|
|
4
|
+
itemTextCheck('images', 'caption', MAX_TITLE_LENGTH),
|
|
5
|
+
itemRteStyleCheck('images', 'caption'),
|
|
6
|
+
enumCheck('gallery_type', ['grid', 'carousel', 'masonry'], 'image-gallery'),
|
|
7
|
+
];
|
|
8
|
+
export function validateImageGallery(args, ctx) {
|
|
9
|
+
return runChecks(CHECKS, args, ctx);
|
|
10
|
+
}
|