@designcrowd/library.brand-page 6.0.3 → 6.0.4
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-BctSP4tp.js → CreatedOnBrandCrowd-de-de-Ruu5Az32.js} +3 -3
- package/lib/src/{CreatedOnBrandCrowd-en-us-BeNytcxt.js → CreatedOnBrandCrowd-en-us-DGUJtvld.js} +3 -3
- package/lib/src/{CreatedOnBrandCrowd-es-es-hY12f5TN.js → CreatedOnBrandCrowd-es-es-Dg-1uOfV.js} +3 -3
- package/lib/src/{CreatedOnBrandCrowd-fr-fr-C4SCU39P.js → CreatedOnBrandCrowd-fr-ca-CRKraZl8.js} +3 -3
- package/lib/src/{CreatedOnBrandCrowd-fr-ca-C4SCU39P.js → CreatedOnBrandCrowd-fr-fr-CRKraZl8.js} +3 -3
- package/lib/src/{CreatedOnBrandCrowd-pt-pt-C5J5kWiD.js → CreatedOnBrandCrowd-pt-br-bZ9VlEAu.js} +3 -3
- package/lib/src/{CreatedOnBrandCrowd-pt-br-C5J5kWiD.js → CreatedOnBrandCrowd-pt-pt-bZ9VlEAu.js} +3 -3
- package/lib/src/{CreatedOnDcom-de-de-DXCeZZLg.js → CreatedOnDcom-de-de-CJYfwZx8.js} +3 -3
- package/lib/src/{CreatedOnDcom-en-us-GeBTaofv.js → CreatedOnDcom-en-us-rzA1lVxH.js} +3 -3
- package/lib/src/{CreatedOnDcom-es-es-BiPmv1q-.js → CreatedOnDcom-es-es-CNwGPjik.js} +3 -3
- package/lib/src/{CreatedOnDcom-fr-ca-Cns_iX4-.js → CreatedOnDcom-fr-ca-DKw7OGIz.js} +3 -3
- package/lib/src/{CreatedOnDcom-fr-fr-CC-f_hUR.js → CreatedOnDcom-fr-fr-WzOEaAZG.js} +3 -3
- package/lib/src/{CreatedOnDcom-pt-br-DnhSuPKo.js → CreatedOnDcom-pt-br-DkualVhm.js} +3 -3
- package/lib/src/{CreatedOnDcom-pt-pt-BCgbUsqY.js → CreatedOnDcom-pt-pt-w4Nnsdzq.js} +3 -3
- package/lib/src/brand-page/clients/brand-page.client.d.ts +9 -9
- package/lib/src/brand-page/components/image-gallery/masonry/MasonryGallery.mixin.d.ts +2 -1
- package/lib/src/brand-page/components/navigation/hamburger/HamburgerNavigation.mixin.d.ts +2 -4
- package/lib/src/brand-page/components/navigation/hamburger/HamburgerNavigation.mixin.js +0 -1
- package/lib/src/brand-page/components/navigation/navigation-side-menu/NavigationSideMenu.mixin.d.ts +2 -4
- package/lib/src/brand-page/components/navigation/navigation-side-menu/NavigationSideMenu.mixin.js +4 -5
- package/lib/src/brand-page/components/page/Page.mixin.d.ts +1 -1
- package/lib/src/brand-page/components/page/PageComponent.mixin.d.ts +1 -1
- package/lib/src/brand-page/components/payment/Payment.mixin.d.ts +3 -3
- package/lib/src/brand-page/components/payment/__fixtures__/request-payment.d.ts +13 -13
- package/lib/src/brand-page/components/payment/__fixtures__/support-me.d.ts +13 -13
- package/lib/src/brand-page/constants/sections/footer-display.constants.js +1 -1
- package/lib/src/brand-page/models/index.d.ts +13 -2
- package/lib/src/brand-page/models/index.js +0 -3
- package/lib/src/brand-page/models/payment.model.d.ts +1 -1
- package/lib/src/brand-page/utils/personalisation.util.js +14 -72
- package/lib/src/brand-page-maker/components/action-bar/ActionBar.mixin.d.ts +19 -21
- package/lib/src/brand-page-maker/components/action-bar/ActionBar.mixin.js +0 -1
- package/lib/src/brand-page-maker/components/admin-background-settings/AdminBackgroundSettings.mixin.d.ts +10 -16
- package/lib/src/brand-page-maker/components/admin-background-settings/ShapePositionSlider.mixin.d.ts +1 -1
- package/lib/src/brand-page-maker/components/admin-logo-settings/AdminLogoSettings.mixin.d.ts +3 -3
- package/lib/src/brand-page-maker/components/brand-page-maker/BrandPageMaker.mixin.d.ts +170 -181
- package/lib/src/brand-page-maker/components/brand-page-maker/BrandPageMaker.mixin.js +0 -3
- package/lib/src/brand-page-maker/components/brand-page-maker/BrandPageMaker.stories.js +0 -1
- package/lib/src/brand-page-maker/components/brand-page-maker/BrandPageMakerTemplateSettings.mixin.d.ts +12 -12
- package/lib/src/brand-page-maker/components/brand-page-maker/BrandPageMakerTemplateSettings.stories.js +2 -2
- package/lib/src/brand-page-maker/components/brand-page-maker/__fixtures__/brand-page-payment.js +7 -0
- package/lib/src/brand-page-maker/components/brandpage-maker-page/BrandPageMakerPage.mixin.d.ts +149 -148
- package/lib/src/brand-page-maker/components/brandpage-settings/ReplaceImageSettingsForBrandPageSettings.mixin.d.ts +21 -21
- package/lib/src/brand-page-maker/components/brandpage-settings/ReplaceImageSettingsForBrandPageSettings.mixin.js +1 -1
- package/lib/src/brand-page-maker/components/color-picker/components/ColorModeSelect.mixin.d.ts +2 -4
- package/lib/src/brand-page-maker/components/color-picker/components/ColorModeSelect.mixin.js +0 -1
- package/lib/src/brand-page-maker/components/color-picker/components/GradientColorSlider.mixin.d.ts +2 -4
- package/lib/src/brand-page-maker/components/color-picker/components/GradientColorSlider.mixin.js +0 -1
- package/lib/src/brand-page-maker/components/color-picker/components/GradientColorSliderHandler.mixin.d.ts +2 -5
- package/lib/src/brand-page-maker/components/color-picker/components/GradientColorSliderHandler.mixin.js +0 -1
- package/lib/src/brand-page-maker/components/color-picker/components/GradientTypeSelector.mixin.d.ts +2 -4
- package/lib/src/brand-page-maker/components/color-picker/components/GradientTypeSelector.mixin.js +0 -1
- package/lib/src/brand-page-maker/components/device/Device.mixin.d.ts +2 -4
- package/lib/src/brand-page-maker/components/device/Device.mixin.js +0 -1
- package/lib/src/brand-page-maker/components/navigation/Navigation.mixin.d.ts +2 -4
- package/lib/src/brand-page-maker/components/navigation/Navigation.mixin.js +0 -1
- package/lib/src/brand-page-maker/components/preview/Preview.mixin.d.ts +3 -3
- package/lib/src/brand-page-maker/components/quick-link-bar/QuickLinkBar.mixin.d.ts +11 -11
- package/lib/src/brand-page-maker/components/seo-settings/SeoPageSettings.mixin.d.ts +25 -27
- package/lib/src/brand-page-maker/components/seo-settings/SeoPageSettings.mixin.js +0 -1
- package/lib/src/brand-page-maker/components/seo-settings/UrlSettings.mixin.d.ts +27 -27
- package/lib/src/brand-page-maker/components/seo-settings/UrlSettings.mixin.js +1 -1
- package/lib/src/brand-page-maker/components/seo-settings/UseExistingDomainModal.mixin.d.ts +12 -17
- package/lib/src/brand-page-maker/components/social-share/SocialShare.mixin.d.ts +12 -12
- package/lib/src/brand-page-maker/components/template-preview/TemplatePreview.mixin.d.ts +32 -30
- package/lib/src/brand-page-maker/components/template-preview/TemplatePreview.mixin.js +5 -16
- package/lib/src/brand-page-maker/components/upgrade-to-premium-button/UpgradeToPremiumButton.mixin.d.ts +11 -11
- package/lib/src/brand-page-maker/composables/ai-chat/useAiWebsiteBuilderChat.js +6 -3
- package/lib/src/brand-page-maker/composables/rich-text-editor/useRichTextEditor.d.ts +1 -1
- package/lib/src/brand-page-maker/composables/rich-text-editor/useRichTextEditor.js +6 -6
- package/lib/src/brand-page-maker/composables/useEventTracker.d.ts +2 -2
- package/lib/src/brand-page-maker/constants/config-settings-constant.d.ts +6 -6
- package/lib/src/brand-page-maker/constants/config-settings-constant.js +3 -3
- package/lib/src/brand-page-maker/convertors/text-image-display-style.convertor.d.ts +1 -1
- package/lib/src/brand-page-maker/convertors/text-image-display-style.convertor.js +1 -1
- package/lib/src/brand-page-maker/models/content-settings.d.ts +1 -1
- package/lib/src/brand-page-maker/models/navigation-style-configs.js +1 -1
- package/lib/src/brand-page-maker/routing/brand-page-maker-router.d.ts +2 -1
- package/lib/src/brand-page-maker/stores/ai-checkpoint/ai-checkpoint-store.d.ts +378 -366
- package/lib/src/brand-page-maker/stores/brandpage-container/brand-page-container-store.d.ts +4 -5
- package/lib/src/brand-page-maker/stores/brandpage-container/brand-page-container-store.js +5 -8
- package/lib/src/brand-page-maker/stores/brandpage-maker/brandpage-maker-store.d.ts +1 -3
- package/lib/src/brand-page-maker/stores/brandpage-maker/brandpage-maker-store.js +3 -7
- package/lib/src/brand-page-maker/stores/history/history-store.d.ts +15 -15
- package/lib/src/brand-page-maker/stores/ui/ui-store.d.ts +0 -6
- package/lib/src/brand-page-maker/stores/ui/ui-store.js +0 -8
- package/lib/src/brand-page-maker/utils/content-settings.util.js +1 -1
- package/lib/src/brand-page-maker/utils/rich-text-editor.util.d.ts +1 -1
- package/lib/src/brand-page-maker/utils/rich-text-editor.util.js +4 -4
- package/lib/src/clients/ai-assistant-client.d.ts +0 -7
- package/lib/src/clients/brand-page-client.d.ts +15 -16
- package/lib/src/clients/design-template-client.d.ts +0 -3
- package/lib/src/clients/media-client.d.ts +2 -2
- package/lib/src/clients/models.d.ts +0 -2
- package/lib/src/composables/useSnapshot.js +18 -18
- package/lib/src/css/library.brand-page-brandCrowd.min.css +324 -342
- package/lib/src/css/library.brand-page-brandPage.min.css +324 -620
- package/lib/src/css/library.brand-page-designCom.min.css +324 -342
- package/lib/src/css/library.brand-page-preview.min.css +324 -598
- package/lib/src/index.d.ts +1 -5
- package/lib/src/index.mjs +106 -110
- package/lib/src/{lib-Cw6L6CfQ.js → lib-Dy7MYyqz.js} +33240 -36457
- package/lib/src/lib.js +1 -11
- package/lib/src/metadata-builder/builders/footer-builder.js +62 -105
- package/lib/src/metadata-builder/builders/item-id-utils.d.ts +54 -0
- package/lib/src/metadata-builder/builders/item-id-utils.js +96 -0
- package/lib/src/metadata-builder/builders/section-builders/image-gallery-builder.js +57 -68
- package/lib/src/metadata-builder/builders/section-builders/images-section-builder.js +58 -93
- package/lib/src/metadata-builder/builders/section-builders/shapes-section-builder.js +66 -99
- package/lib/src/metadata-builder/builders/section-builders/social-links-builder.js +57 -17
- package/lib/src/metadata-builder/builders/section-builders/testimonial-section-builder.js +51 -85
- package/lib/src/metadata-builder/builders/section-builders/text-section-builder.js +49 -74
- package/lib/src/metadata-builder/builders/section-field-utils.d.ts +0 -7
- package/lib/src/metadata-builder/builders/section-field-utils.js +1 -1
- package/lib/src/metadata-builder/builders/shape-color-utils.js +1 -1
- package/lib/src/metadata-builder/parsers/ai-toolcall-parser.d.ts +16 -7
- package/lib/src/metadata-builder/parsers/section-tool-arguments.d.ts +66 -48
- package/lib/src/plugins/google-maps-plugin/google-maps-plugin.d.ts +1 -1
- package/lib/src/plugins/google-maps-plugin/google-maps-plugin.js +8 -8
- package/lib/src/shared/background-settings/components/background-shapes/BackgroundShapeSettings.mixin.d.ts +13 -13
- package/lib/src/shared/background-settings/store/background-settings-store.d.ts +3 -3
- package/lib/src/shared/color-picker/components/ColorPicker.mixin.d.ts +2 -4
- package/lib/src/shared/color-picker/components/ColorPicker.mixin.js +2 -2
- package/lib/src/shared/color-picker/components/ColorPickerSwatch.mixin.d.ts +2 -4
- package/lib/src/shared/color-picker/components/ColorPickerSwatch.mixin.js +0 -1
- package/lib/src/shared/confirm-modal/ConfirmModal.mixin.d.ts +2 -5
- package/lib/src/shared/confirm-modal/ConfirmModal.mixin.js +0 -1
- package/lib/src/shared/content-settings/components/GenericTextInput.mixin.d.ts +1 -0
- package/lib/src/shared/content-settings/components/content-settings/ContentSettings.mixin.d.ts +129 -131
- package/lib/src/shared/content-settings/components/content-settings/ContentSettings.mixin.js +1 -2
- package/lib/src/shared/content-settings/components/content-settings/ReplaceImageSettingsForContent.mixin.d.ts +110 -111
- package/lib/src/shared/content-settings/components/content-settings-item/ContentSettingsItem.mixin.d.ts +81 -84
- package/lib/src/shared/content-settings/components/content-settings-item/ContentSettingsItem.mixin.js +0 -5
- package/lib/src/shared/content-settings/components/content-settings-item/ContentSettingsItemField.mixin.d.ts +109 -117
- package/lib/src/shared/content-settings/components/content-settings-item/ContentSettingsItemField.mixin.js +14 -1
- package/lib/src/shared/content-settings/components/email-field/EmailField.mixin.d.ts +1 -0
- package/lib/src/shared/content-settings/components/focused-content-item-settings/FocusedContentItemSettings.mixin.d.ts +70 -72
- package/lib/src/shared/content-settings/components/focused-content-item-settings/FocusedContentItemSettings.mixin.js +3 -4
- package/lib/src/shared/content-settings/components/form-fields-field/FormFieldsField.mixin.d.ts +4 -4
- package/lib/src/shared/content-settings/components/icon-library/IconLibrary.mixin.d.ts +1 -3
- package/lib/src/shared/content-settings/components/icon-library/IconLibrary.mixin.js +0 -1
- package/lib/src/shared/content-settings/components/images-field/ImagesField.mixin.d.ts +2 -2
- package/lib/src/shared/content-settings/components/items-field/ItemsField.mixin.d.ts +3 -4
- package/lib/src/shared/content-settings/components/items-field/ItemsField.mixin.js +1 -1
- package/lib/src/shared/content-settings/components/payment-config-field/PaymentConfigField.mixin.d.ts +40 -40
- package/lib/src/shared/content-settings/components/payment-config-field/PaymentConfigOptionField.mixin.d.ts +6 -5
- package/lib/src/shared/content-settings/components/shape-field/ShapeField.mixin.d.ts +1 -0
- package/lib/src/shared/content-settings/components/slider-field/SliderField.mixin.d.ts +2 -2
- package/lib/src/shared/content-settings/components/tel-field/TelField.mixin.d.ts +1 -0
- package/lib/src/shared/content-settings/components/testimonial-items-field/TestimonialItemsField.mixin.d.ts +2 -1
- package/lib/src/shared/content-settings/components/text-field/TextField.mixin.d.ts +1 -0
- package/lib/src/shared/content-settings/components/text-items-field/TextItemsField.mixin.d.ts +2 -1
- package/lib/src/shared/content-settings/components/text-items-field/TextItemsField.mixin.js +1 -1
- package/lib/src/shared/content-settings/components/text-style-field/TextStyleField.mixin.d.ts +28 -28
- package/lib/src/shared/content-settings/components/textarea-field/TextareaField.mixin.d.ts +1 -0
- package/lib/src/shared/content-settings/components/toggle-field/ToggleField.mixin.d.ts +2 -2
- package/lib/src/shared/content-settings/components/url-field/UrlField.mixin.d.ts +1 -0
- package/lib/src/shared/content-settings/components/youtube-video-field/YoutubeVideoField.mixin.d.ts +1 -0
- package/lib/src/shared/content-settings/store/content-settings-store.d.ts +39 -39
- package/lib/src/shared/content-settings/utils.js +1 -0
- package/lib/src/shared/font-family-selector/FontFamilySelector.mixin.d.ts +4 -6
- package/lib/src/shared/font-family-selector/FontFamilySelector.mixin.js +0 -1
- package/lib/src/shared/image-gallery-style-settings/ImageGalleryStyleSettings.mixin.d.ts +2 -4
- package/lib/src/shared/image-gallery-style-settings/ImageGalleryStyleSettings.mixin.js +0 -1
- package/lib/src/shared/logo-settings/components/EditLogoSettings.mixin.d.ts +21 -29
- package/lib/src/shared/logo-settings/components/EditLogoSettings.mixin.js +1 -1
- package/lib/src/shared/logo-settings/components/LogoSettings.mixin.d.ts +51 -50
- package/lib/src/shared/logo-settings/components/LogoSettingsHeader.mixin.d.ts +4 -6
- package/lib/src/shared/logo-settings/components/LogoSettingsHeader.mixin.js +0 -1
- package/lib/src/shared/logo-settings/store/editable-logo-store.js +1 -1
- package/lib/src/shared/logo-settings/store/logo-settings-store.d.ts +1 -1
- package/lib/src/shared/logo-versions/LogoVersions.mixin.d.ts +5 -13
- package/lib/src/shared/logo-versions/LogoVersions.mixin.js +0 -1
- package/lib/src/shared/models.d.ts +0 -2
- package/lib/src/shared/my-designs/MyDesigns.mixin.d.ts +6 -14
- package/lib/src/shared/my-designs/MyDesigns.mixin.js +0 -1
- package/lib/src/shared/my-uploads/MyMedia.mixin.d.ts +5 -14
- package/lib/src/shared/my-uploads/MyMedia.mixin.js +0 -1
- package/lib/src/shared/my-uploads/MyUploads.mixin.d.ts +5 -14
- package/lib/src/shared/my-uploads/MyUploads.mixin.js +0 -1
- package/lib/src/shared/navigation-style-settings/components/navigation-style-settings/NavigationStyleSettings.mixin.d.ts +3 -5
- package/lib/src/shared/navigation-style-settings/components/navigation-style-settings/NavigationStyleSettings.mixin.js +0 -1
- package/lib/src/shared/navigation-style-settings/store/index.d.ts +2 -2
- package/lib/src/shared/page-navigation/store/page-navigation-store.d.ts +2 -2
- package/lib/src/shared/page-settings/components/new-page-modal/NewPageModal.mixin.d.ts +28 -27
- package/lib/src/shared/page-settings/components/new-page-modal/NewPageModal.mixin.js +2 -0
- package/lib/src/shared/page-settings/components/page-settings/PageSettings.mixin.d.ts +179 -188
- package/lib/src/shared/page-settings/components/page-settings-section-styles/PageSettingsSectionStyles.mixin.d.ts +177 -181
- package/lib/src/shared/page-settings/components/page-settings-section-styles/PageSettingsSectionStyles.mixin.js +1 -1
- package/lib/src/shared/page-settings/store/page-settings-store.d.ts +9 -9
- package/lib/src/shared/publish-brand-page-with-state/PublishBrandPageModalWithState.mixin.d.ts +39 -39
- package/lib/src/shared/publish-brand-page-with-state/PublishBrandPageModalWithState.mixin.js +1 -0
- package/lib/src/shared/side-bar/components/SideBar.mixin.d.ts +18 -18
- package/lib/src/shared/side-bar/components/SideBarTabButton.mixin.d.ts +6 -6
- package/lib/src/shared/style-settings/components/StyleSettings.mixin.d.ts +60 -66
- package/lib/src/shared/style-settings/store/style-settings-store.d.ts +1 -1
- package/lib/src/shared/style-settings/store/style-settings-store.js +1 -1
- package/lib/src/shared/template-settings/components/TemplatesSettings.mixin.d.ts +450 -20
- package/lib/src/shared/template-settings/components/TemplatesSettings.mixin.js +2 -2
- package/lib/src/shared/template-settings/models.d.ts +0 -1
- package/lib/src/shared/template-settings/store/template-settings-store.d.ts +0 -4
- package/lib/src/shared/template-settings/store/template-settings-store.js +11 -79
- package/lib/src/shared/unsplash-library/UnsplashLibrary.mixin.d.ts +4 -9
- package/lib/src/utils/build-asset-manifest.d.ts +0 -4
- package/lib/src/utils/build-asset-manifest.js +0 -8
- package/lib/src/utils/minify-brand-page-metadata.d.ts +2 -0
- package/lib/src/utils/minify-brand-page-metadata.js +17 -2
- package/package.json +56 -60
- package/src/brand-page/components/about-section/AboutSection.vue.test.ts +5 -7
- package/src/brand-page/components/brand-page-footer/BrandPageFooter.vue +1 -1
- package/src/brand-page/components/image/Image.mixin.ts +1 -1
- package/src/brand-page/components/image/Image.test.ts +1 -1
- package/src/brand-page/components/image-gallery/masonry/MasonryGallery.mixin.ts +2 -1
- package/src/brand-page/components/images-section/ImagesSection.vue +1 -0
- package/src/brand-page/components/logo/LogoRender.vue +188 -188
- package/src/brand-page/components/navigation/hamburger/HamburgerNavigation.mixin.ts +0 -1
- package/src/brand-page/components/navigation/navigation-side-menu/NavigationSideMenu.mixin.ts +6 -15
- package/src/brand-page/components/page-footer/PageFooter.vue +0 -1
- package/src/brand-page/components/page-header/HeaderLayout.vue +6 -12
- package/src/brand-page/components/page-header/PageHeader.vue +0 -1
- package/src/brand-page/components/shapes-section/ShapesSection.vue +1 -1
- package/src/brand-page/components/shop/CartModal.vue +3 -1
- package/src/brand-page/components/shop/FeaturedDisplay.vue +2 -2
- package/src/brand-page/components/shop/PaymentModal.vue +5 -1
- package/src/brand-page/components/shop/ProductDetailModal.vue +1 -1
- package/src/brand-page/components/shop/Shop.vue +1 -1
- package/src/brand-page/components/shop/TextDisplay.vue +1 -1
- package/src/brand-page/components/shop/ThumbnailDisplay.vue +2 -2
- package/src/brand-page/components/testimonial-section/TestimonialSection.vue +3 -3
- package/src/brand-page/components/text-wrapper/TextWrapper.vue +1 -3
- package/src/brand-page/constants/sections/footer-display.constants.ts +1 -1
- package/src/brand-page/models/index.ts +12 -4
- package/src/brand-page/models/payment.model.ts +1 -2
- package/src/brand-page/models/shop.model.ts +2 -0
- package/src/brand-page/models/user-personalisation.model.ts +2 -1
- package/src/brand-page/utils/__snapshots__/migration.util.test.ts.snap +0 -3
- package/src/brand-page/utils/__snapshots__/migration2.util.test.ts.snap +0 -1
- package/src/brand-page/utils/__snapshots__/model.util.test.ts.snap +0 -2
- package/src/brand-page/utils/migration/migration-01_1.ts +1 -1
- package/src/brand-page/utils/migration/migration-02.ts +1 -0
- package/src/brand-page/utils/migration/migration-03.ts +1 -0
- package/src/brand-page/utils/migration/migration-04.ts +1 -0
- package/src/brand-page/utils/migration/migration-05.ts +5 -1
- package/src/brand-page/utils/migration/migration-05_2.ts +1 -1
- package/src/brand-page/utils/migration/migration-08.test.ts +1 -1
- package/src/brand-page/utils/personalisation.util.test.ts +0 -35
- package/src/brand-page/utils/personalisation.util.ts +23 -119
- package/src/brand-page/view-models.ts +56 -38
- package/src/brand-page-maker/assessors/banner-section-description-visibility.assessor.ts +6 -6
- package/src/brand-page-maker/assessors/color-replacement-icon-visibility.assessor.ts +2 -2
- package/src/brand-page-maker/assessors/color-replacement-profile-visibility.assessor.ts +2 -2
- package/src/brand-page-maker/assessors/color-replacement-visibility.assessor.ts +2 -2
- package/src/brand-page-maker/assessors/contact-form-visibility.assessor.ts +14 -14
- package/src/brand-page-maker/components/action-bar/ActionBar.mixin.ts +0 -1
- package/src/brand-page-maker/components/ai-text-edit/TextBubble.vue +0 -1
- package/src/brand-page-maker/components/brand-page-maker/BrandPageMaker.mixin.ts +1 -5
- package/src/brand-page-maker/components/brand-page-maker/BrandPageMaker.stories.ts +0 -1
- package/src/brand-page-maker/components/brand-page-maker/BrandPageMakerTemplateSettings.stories.ts +5 -2
- package/src/brand-page-maker/components/brand-page-maker/__fixtures__/brand-page-examples.ts +5 -0
- package/src/brand-page-maker/components/brand-page-maker/__fixtures__/brand-page-payment.ts +8 -0
- package/src/brand-page-maker/components/brand-page-maker/__fixtures__/brand-site-template.examples.ts +2 -0
- package/src/brand-page-maker/components/brandpage-maker-page/BrandPageMakerPage.vue +0 -1
- package/src/brand-page-maker/components/brandpage-settings/ReplaceImageSettingsForBrandPageSettings.mixin.ts +1 -1
- package/src/brand-page-maker/components/color-palette/BpColorPalette.vue +2 -1
- package/src/brand-page-maker/components/color-picker/components/ColorModeSelect.mixin.ts +0 -1
- package/src/brand-page-maker/components/color-picker/components/GradientColorSlider.mixin.ts +0 -1
- package/src/brand-page-maker/components/color-picker/components/GradientColorSliderHandler.mixin.ts +0 -1
- package/src/brand-page-maker/components/color-picker/components/GradientTypeSelector.mixin.ts +0 -1
- package/src/brand-page-maker/components/device/Device.mixin.ts +0 -1
- package/src/brand-page-maker/components/navigation/Navigation.mixin.ts +0 -1
- package/src/brand-page-maker/components/rich-text-editor/RichTextEditor.vue +1 -3
- package/src/brand-page-maker/components/sensitive-content/SensitiveContent.vue +4 -1
- package/src/brand-page-maker/components/seo-settings/DeleteDomainModal.vue +1 -1
- package/src/brand-page-maker/components/seo-settings/SeoPageSettings.mixin.ts +0 -1
- package/src/brand-page-maker/components/seo-settings/SeoPageSettings.vue +1 -1
- package/src/brand-page-maker/components/seo-settings/UrlSettings.mixin.ts +1 -0
- package/src/brand-page-maker/components/seo-settings/UrlSettings.vue +1 -0
- package/src/brand-page-maker/components/seo-settings/UseExistingDomainModal.vue +5 -1
- package/src/brand-page-maker/components/shop/AddOrEditProductContainer.vue +1 -1
- package/src/brand-page-maker/components/shop/ReplaceImageSettingsForShop.vue +1 -1
- package/src/brand-page-maker/components/social-share/SocialShare.vue +1 -1
- package/src/brand-page-maker/components/template-preview/TemplatePreview.mixin.ts +8 -22
- package/src/brand-page-maker/components/template-preview/TemplatePreview.vue +10 -5
- package/src/brand-page-maker/components/video-play/VideoPlayButton.vue +1 -1
- package/src/brand-page-maker/composables/ai-chat/useAiWebsiteBuilderChat.ts +7 -3
- package/src/brand-page-maker/composables/rich-text-editor/useRichTextEditor.ts +6 -6
- package/src/brand-page-maker/constants/config-settings-constant.ts +5 -5
- package/src/brand-page-maker/convertors/text-image-display-style.convertor.ts +1 -1
- package/src/brand-page-maker/models/button-styles-config.ts +2 -4
- package/src/brand-page-maker/models/content-settings-configs.ts +2 -4
- package/src/brand-page-maker/models/navigation-style-configs.ts +6 -5
- package/src/brand-page-maker/stores/admin-logo-settings/admin-logo-settings-store.ts +1 -0
- package/src/brand-page-maker/stores/brandpage-container/brand-page-container-store.ts +5 -8
- package/src/brand-page-maker/stores/brandpage-maker/brandpage-maker-store.test.ts +3 -1
- package/src/brand-page-maker/stores/brandpage-maker/brandpage-maker-store.ts +4 -12
- package/src/brand-page-maker/stores/ui/ui-store.ts +0 -16
- package/src/brand-page-maker/utils/content-settings.util.ts +1 -1
- package/src/brand-page-maker/utils/rich-text-editor.util.ts +4 -4
- package/src/clients/ai-assistant-client.ts +0 -7
- package/src/clients/design-template-client.ts +0 -3
- package/src/clients/models.ts +0 -2
- package/src/composables/useSnapshot.ts +22 -19
- package/src/lib.ts +0 -13
- package/src/metadata-builder/builders/footer-builder.test.ts +229 -130
- package/src/metadata-builder/builders/footer-builder.ts +90 -155
- package/src/metadata-builder/builders/item-id-utils.test.ts +184 -0
- package/src/metadata-builder/builders/item-id-utils.ts +117 -0
- package/src/metadata-builder/builders/section-builders/image-gallery-builder.ts +62 -88
- package/src/metadata-builder/builders/section-builders/images-section-builder.ts +66 -129
- package/src/metadata-builder/builders/section-builders/shapes-section-builder.ts +105 -160
- package/src/metadata-builder/builders/section-builders/social-links-builder.ts +65 -20
- package/src/metadata-builder/builders/section-builders/testimonial-section-builder.ts +83 -146
- package/src/metadata-builder/builders/section-builders/text-section-builder.ts +70 -122
- package/src/metadata-builder/builders/section-field-utils.ts +1 -1
- package/src/metadata-builder/builders/shape-color-utils.ts +2 -2
- package/src/metadata-builder/parsers/ai-toolcall-parser.ts +16 -7
- package/src/metadata-builder/parsers/section-tool-arguments.ts +66 -48
- package/src/plugins/google-maps-plugin/google-maps-plugin.ts +8 -8
- package/src/shared/background-settings/components/BackgroundSettings.vue +1 -1
- package/src/shared/background-settings/components/background-color/BackgroundColorSettings.vue +1 -1
- package/src/shared/color-picker/components/ColorPicker.mixin.ts +7 -2
- package/src/shared/color-picker/components/ColorPickerSwatch.mixin.ts +0 -1
- package/src/shared/common/NumberInput.vue +0 -1
- package/src/shared/common/SideBarSettingsHeader.vue +2 -2
- package/src/shared/confirm-modal/ConfirmModal.mixin.ts +0 -1
- package/src/shared/content-settings/components/booking-url-field/BookingUrlField.vue +0 -1
- package/src/shared/content-settings/components/button-configuration-field/ButtonConfigurationField.vue +0 -1
- package/src/shared/content-settings/components/color-field/ColorField.vue +10 -3
- package/src/shared/content-settings/components/content-settings/ContentSettings.mixin.ts +1 -1
- package/src/shared/content-settings/components/content-settings/ContentSettingsLockedButton.vue +0 -1
- package/src/shared/content-settings/components/content-settings-item/ContentSettingsItem.mixin.ts +0 -5
- package/src/shared/content-settings/components/content-settings-item/ContentSettingsItemField.mixin.ts +14 -1
- package/src/shared/content-settings/components/focused-content-item-settings/FocusedContentItemSettings.mixin.ts +6 -4
- package/src/shared/content-settings/components/icon-library/IconLibrary.mixin.ts +0 -1
- package/src/shared/content-settings/components/items-field/ItemsField.mixin.ts +1 -1
- package/src/shared/content-settings/components/logo-selection-field/LogoSelectionField.vue +1 -1
- package/src/shared/content-settings/components/logo-size-field/LogoSizeSliderField.vue +1 -1
- package/src/shared/content-settings/components/page-dropdown-field/PageDropdownField.vue +1 -1
- package/src/shared/content-settings/components/personalisation-role-field/PersonalisationRoleField.vue +4 -4
- package/src/shared/content-settings/components/text-image-field/TextImageField.vue +8 -2
- package/src/shared/content-settings/components/text-items-field/TextItemsField.mixin.ts +1 -1
- package/src/shared/content-settings/models.ts +2 -3
- package/src/shared/content-settings/utils.ts +1 -0
- package/src/shared/dropzone-image-uploader/components/DropzoneImageUploader.vue +0 -1
- package/src/shared/ecommerce-settings/store/cart-store.test.ts +1 -1
- package/src/shared/font-family-selector/FontFamilySelector.mixin.ts +0 -1
- package/src/shared/image-gallery-style-settings/ImageGalleryStyleSettings.mixin.ts +0 -1
- package/src/shared/logo-settings/components/EditLogoSettings.mixin.ts +1 -1
- package/src/shared/logo-settings/components/LogoSettings.mixin.ts +1 -0
- package/src/shared/logo-settings/components/LogoSettingsHeader.mixin.ts +0 -1
- package/src/shared/logo-settings/components/LogoStyleSettingsWithState.vue +2 -2
- package/src/shared/logo-settings/components/LogoTemplateSearch.vue +1 -1
- package/src/shared/logo-settings/store/editable-logo-store.ts +1 -1
- package/src/shared/logo-settings/store/logo-settings-store.test.ts +4 -4
- package/src/shared/logo-versions/LogoVersions.mixin.ts +0 -1
- package/src/shared/models.ts +0 -6
- package/src/shared/my-designs/MyDesigns.mixin.ts +0 -1
- package/src/shared/my-uploads/MyMedia.mixin.ts +0 -1
- package/src/shared/my-uploads/MyMediaSelectionItem.vue +1 -2
- package/src/shared/my-uploads/MyUploads.mixin.ts +0 -1
- package/src/shared/my-uploads/models.ts +2 -1
- package/src/shared/navigation-style-settings/components/navigation-style-settings/NavigationStyleSettings.mixin.ts +0 -1
- package/src/shared/navigation-style-settings/components/navigation-style-settings/NavigationStyleSettings.vue +1 -1
- package/src/shared/page-settings/components/new-page-modal/NewPageModal.mixin.ts +3 -0
- package/src/shared/page-settings/components/page-settings/NestedDraggable.vue +1 -1
- package/src/shared/page-settings/components/page-settings/PageSettings.vue +2 -1
- package/src/shared/page-settings/components/page-settings-section-styles/HeaderDisplayStyle.vue +1 -1
- package/src/shared/page-settings/components/page-settings-section-styles/PageSettingsSectionStyles.mixin.ts +1 -1
- package/src/shared/page-settings/store/page-settings-store.test.ts +8 -4
- package/src/shared/publish-brand-page-with-state/PublishBrandPageModalWithState.mixin.ts +1 -0
- package/src/shared/shape-library/ShapeLibrary.vue +2 -2
- package/src/shared/style-settings/store/style-settings-store.ts +1 -1
- package/src/shared/template-settings/components/TemplatesSettings.mixin.ts +2 -2
- package/src/shared/template-settings/models.ts +0 -1
- package/src/shared/template-settings/store/template-settings-store.ts +18 -105
- package/src/shared/unsplash-library/UnsplashLibrary.vue +6 -2
- package/src/shared/video-library/VideoLibrary.vue +1 -1
- package/src/utils/build-asset-manifest.ts +0 -12
- package/src/utils/minify-brand-page-metadata.ts +27 -7
- package/lib/src/brand-page/components/banner-section/BannerSection.mixin.d.ts +0 -103
- package/lib/src/brand-page/components/banner-section/BannerSection.mixin.js +0 -178
- package/src/brand-page/components/banner-section/BannerSection.mixin.ts +0 -210
- package/src/brand-page-maker/components/template-preview/TemplatePreviewAiBadge.vue +0 -12
|
@@ -4,6 +4,7 @@ import { applyScalarFields, applyStyleFields, resolveGlobalPresetIntoStyle, } fr
|
|
|
4
4
|
import { applyColorThemeToReplacements, resolveShapeColorReplacementsAsync, } from '../shape-color-utils';
|
|
5
5
|
import { BaseSectionBuilder } from './base-section-builder';
|
|
6
6
|
import { validateTestimonialSection, TESTIMONIAL_ITEM_CAP, } from '../section-rules/testimonial-section.rules';
|
|
7
|
+
import { ensureItemIds, generateItemId, removeItemsByIds, repositionItemByAnchor, } from '../item-id-utils';
|
|
7
8
|
const resolveItemColorsAsync = async (item, existing, prevImageUrl) => {
|
|
8
9
|
let colors = existing ?? [];
|
|
9
10
|
if (item.avatar_shape_url && item.avatar_shape_url !== prevImageUrl) {
|
|
@@ -16,6 +17,7 @@ const resolveItemColorsAsync = async (item, existing, prevImageUrl) => {
|
|
|
16
17
|
};
|
|
17
18
|
const applyTestimonialItemsAsync = async (content, items) => {
|
|
18
19
|
content.items = await Promise.all(items.map(async (item) => ({
|
|
20
|
+
id: item.item_id || generateItemId(),
|
|
19
21
|
imageUrl: item.avatar_shape_url || item.avatar_image_url || '',
|
|
20
22
|
name: item.name || '',
|
|
21
23
|
position: item.position || '',
|
|
@@ -24,16 +26,28 @@ const applyTestimonialItemsAsync = async (content, items) => {
|
|
|
24
26
|
mediaType: item.avatar_shape_url ? 'shape' : 'image',
|
|
25
27
|
})));
|
|
26
28
|
};
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
29
|
+
/**
|
|
30
|
+
* Apply a batch of item operations by id (BP-5603), mirroring the section-level
|
|
31
|
+
* id-based contract one level deeper:
|
|
32
|
+
* - item with `item_id` matching an existing item → update in place (and
|
|
33
|
+
* reposition if `move_before_item_id` is set);
|
|
34
|
+
* - item without `item_id` → add a new item,
|
|
35
|
+
* positioned by `move_before_item_id`;
|
|
36
|
+
* - `_remove_item_ids` → delete by id.
|
|
37
|
+
*
|
|
38
|
+
* Existing items are id-backfilled first so legacy sections become referenceable
|
|
39
|
+
* the moment the metadata builder touches them. Order-independent: there are no
|
|
40
|
+
* positional indices to shift between operations.
|
|
41
|
+
*/
|
|
42
|
+
const mergeTestimonialItemsAsync = async (content, items, removeIds) => {
|
|
43
|
+
ensureItemIds(content.items);
|
|
44
|
+
content.items = removeItemsByIds(content.items, removeIds);
|
|
45
|
+
for (const item of items) {
|
|
46
|
+
if (item.item_id) {
|
|
47
|
+
const existing = content.items.find((i) => i.id === item.item_id);
|
|
48
|
+
// Unknown id — skip rather than guess at a position.
|
|
49
|
+
if (!existing)
|
|
50
|
+
continue;
|
|
37
51
|
const prevImageUrl = existing.imageUrl;
|
|
38
52
|
if (item.avatar_shape_url !== undefined) {
|
|
39
53
|
existing.imageUrl = item.avatar_shape_url;
|
|
@@ -53,37 +67,21 @@ const mergeTestimonialItemsAsync = async (content, items, replaceAll) => {
|
|
|
53
67
|
item.color_theme !== undefined) {
|
|
54
68
|
existing.colorReplacements = await resolveItemColorsAsync(item, existing.colorReplacements, prevImageUrl);
|
|
55
69
|
}
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
: (existing?.mediaType ?? 'image');
|
|
71
|
-
return {
|
|
72
|
-
...(existing || {}),
|
|
73
|
-
imageUrl,
|
|
74
|
-
name: item.name ?? existing?.name ?? '',
|
|
75
|
-
position: item.position ?? existing?.position ?? '',
|
|
76
|
-
testimonials: item.testimonial ?? existing?.testimonials ?? '',
|
|
77
|
-
colorReplacements: await resolveItemColorsAsync(item, existing?.colorReplacements, existing?.imageUrl),
|
|
78
|
-
mediaType,
|
|
79
|
-
};
|
|
80
|
-
}));
|
|
81
|
-
if (!replaceAll &&
|
|
82
|
-
content.items &&
|
|
83
|
-
content.items.length > itemsToMerge.length) {
|
|
84
|
-
updatedItems.push(...content.items.slice(itemsToMerge.length));
|
|
70
|
+
repositionItemByAnchor(content.items, existing, item.move_before_item_id);
|
|
71
|
+
}
|
|
72
|
+
else {
|
|
73
|
+
const newItem = {
|
|
74
|
+
id: generateItemId(),
|
|
75
|
+
imageUrl: item.avatar_shape_url ?? item.avatar_image_url ?? '',
|
|
76
|
+
name: item.name ?? '',
|
|
77
|
+
position: item.position ?? '',
|
|
78
|
+
testimonials: item.testimonial ?? '',
|
|
79
|
+
colorReplacements: await resolveItemColorsAsync(item, [], undefined),
|
|
80
|
+
mediaType: item.avatar_shape_url ? 'shape' : 'image',
|
|
81
|
+
};
|
|
82
|
+
repositionItemByAnchor(content.items, newItem, item.move_before_item_id);
|
|
83
|
+
}
|
|
85
84
|
}
|
|
86
|
-
content.items = updatedItems;
|
|
87
85
|
};
|
|
88
86
|
export class TestimonialSectionBuilder extends BaseSectionBuilder {
|
|
89
87
|
get sectionValidate() {
|
|
@@ -132,56 +130,24 @@ export class TestimonialSectionBuilder extends BaseSectionBuilder {
|
|
|
132
130
|
])),
|
|
133
131
|
};
|
|
134
132
|
}
|
|
135
|
-
if (args.items && Array.isArray(args.items)) {
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
}
|
|
139
|
-
else {
|
|
140
|
-
await mergeTestimonialItemsAsync(content, args.items, !!args._replace_items);
|
|
141
|
-
}
|
|
142
|
-
}
|
|
143
|
-
// Phase 2: Item operations (remove, insert, reorder)
|
|
144
|
-
if (args._remove_item_indices?.length && content.items) {
|
|
145
|
-
const sorted = [...args._remove_item_indices].sort((a, b) => b - a);
|
|
146
|
-
for (const idx of sorted) {
|
|
147
|
-
if (idx >= 0 && idx < content.items.length) {
|
|
148
|
-
content.items.splice(idx, 1);
|
|
149
|
-
}
|
|
150
|
-
}
|
|
133
|
+
if (args._replace_items && args.items && Array.isArray(args.items)) {
|
|
134
|
+
// Full replacement: discard existing items and rebuild from the payload.
|
|
135
|
+
await applyTestimonialItemsAsync(content, args.items);
|
|
151
136
|
}
|
|
152
|
-
if (
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
for (const item of sortedInserts) {
|
|
156
|
-
const pos = Math.max(0, Math.min(item.insert_at ?? 0, content.items?.length ?? 0));
|
|
157
|
-
const newItem = {
|
|
158
|
-
imageUrl: item.avatar_shape_url ?? item.avatar_image_url ?? '',
|
|
159
|
-
name: item.name ?? '',
|
|
160
|
-
position: item.position ?? '',
|
|
161
|
-
testimonials: item.testimonial ?? '',
|
|
162
|
-
colorReplacements: await resolveItemColorsAsync(item, [], undefined),
|
|
163
|
-
mediaType: item.avatar_shape_url ? 'shape' : 'image',
|
|
164
|
-
};
|
|
165
|
-
content.items = content.items ?? [];
|
|
166
|
-
content.items.splice(pos, 0, newItem);
|
|
137
|
+
else if (this.mode === 'create') {
|
|
138
|
+
if (args.items && Array.isArray(args.items)) {
|
|
139
|
+
await applyTestimonialItemsAsync(content, args.items);
|
|
167
140
|
}
|
|
168
141
|
}
|
|
169
|
-
if (args.
|
|
170
|
-
|
|
171
|
-
|
|
172
|
-
|
|
173
|
-
const reordered = newOrder
|
|
174
|
-
.filter((idx) => idx >= 0 && idx < content.items.length)
|
|
175
|
-
.map((idx) => content.items[idx]);
|
|
176
|
-
if (reordered.length === content.items.length) {
|
|
177
|
-
content.items = reordered;
|
|
178
|
-
}
|
|
179
|
-
}
|
|
142
|
+
else if ((args.items && Array.isArray(args.items)) ||
|
|
143
|
+
args._remove_item_ids?.length) {
|
|
144
|
+
// Update: id-based add / edit / move / remove in a single pass.
|
|
145
|
+
await mergeTestimonialItemsAsync(content, args.items ?? [], args._remove_item_ids);
|
|
180
146
|
}
|
|
181
147
|
// Post-merge cap check. itemCapCheck only fires for create / update with
|
|
182
|
-
// _replace_items, so
|
|
183
|
-
// the array. Surface as an error so the AI retry loop gets a signal
|
|
184
|
-
// can reissue with
|
|
148
|
+
// _replace_items, so adding new items to an already-full section silently
|
|
149
|
+
// bloats the array. Surface as an error so the AI retry loop gets a signal
|
|
150
|
+
// and can reissue with _remove_item_ids or fewer additions.
|
|
185
151
|
// brandSite key mirrors base-section-builder's hardcoded brandPageType.
|
|
186
152
|
const cap = TESTIMONIAL_ITEM_CAP.brandSite;
|
|
187
153
|
if (content.items && content.items.length > cap) {
|
|
@@ -3,6 +3,7 @@ import { isTiptapDocument, } from '../../parsers/section-tool-arguments';
|
|
|
3
3
|
import { applyScalarFields, applyStyleFields, resolveGlobalPresetIntoStyle, } from '../section-field-utils';
|
|
4
4
|
import { BaseSectionBuilder } from './base-section-builder';
|
|
5
5
|
import { validateTextSection } from '../section-rules/text-section.rules';
|
|
6
|
+
import { ensureItemIds, generateItemId, removeItemsByIds, repositionItemByAnchor, } from '../item-id-utils';
|
|
6
7
|
/** Resolve a RichTextField (string or TiptapDocument) to a plain HTML string. */
|
|
7
8
|
const resolveText = (value) => {
|
|
8
9
|
if (isTiptapDocument(value))
|
|
@@ -16,55 +17,58 @@ const createTextItem = (item, baseStyle, textStyleOptions) => {
|
|
|
16
17
|
const textStyle = (item.text_style ? { ...baseStyle, ...item.text_style } : { ...baseStyle });
|
|
17
18
|
const { html, wasTiptap } = resolveText(item.text);
|
|
18
19
|
return {
|
|
20
|
+
id: item.item_id || generateItemId(),
|
|
19
21
|
text: html,
|
|
20
22
|
textStyle: clearTextStyleTypeIfTiptap(textStyle, wasTiptap, textStyleOptions),
|
|
21
23
|
};
|
|
22
24
|
};
|
|
25
|
+
/**
|
|
26
|
+
* Full replacement: discard existing items and rebuild from the payload,
|
|
27
|
+
* assigning a stable id to each new item.
|
|
28
|
+
*/
|
|
23
29
|
const applyTextItems = (content, items, textStyleOptions) => {
|
|
24
30
|
content.textItems = items.map((item) => createTextItem(item, content.textStyle || {}, textStyleOptions));
|
|
25
31
|
};
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
32
|
+
/**
|
|
33
|
+
* Id-based merge (BP-5603): mirrors the section-level id contract one level
|
|
34
|
+
* deeper.
|
|
35
|
+
* - item with `item_id` matching an existing item → update in place and
|
|
36
|
+
* reposition if `move_before_item_id` is set; unknown id is skipped.
|
|
37
|
+
* - item without `item_id` → add a new item,
|
|
38
|
+
* positioned by `move_before_item_id`.
|
|
39
|
+
* - `removeIds` → delete by id.
|
|
40
|
+
*
|
|
41
|
+
* Existing items are id-backfilled first so legacy sections without ids
|
|
42
|
+
* become referenceable the moment this builder processes them.
|
|
43
|
+
*/
|
|
44
|
+
const mergeTextItems = (content, items, removeIds, textStyleOptions) => {
|
|
45
|
+
ensureItemIds(content.textItems);
|
|
46
|
+
content.textItems = removeItemsByIds(content.textItems, removeIds);
|
|
47
|
+
for (const item of items) {
|
|
48
|
+
if (item.item_id) {
|
|
49
|
+
const existing = content.textItems?.find((i) => i.id === item.item_id);
|
|
50
|
+
// Unknown id — skip rather than guess at a position.
|
|
51
|
+
if (!existing)
|
|
34
52
|
continue;
|
|
35
|
-
const existing = content.textItems[targetIndex];
|
|
36
53
|
if (item.text !== undefined) {
|
|
37
54
|
const { html, wasTiptap } = resolveText(item.text);
|
|
38
55
|
existing.text = html;
|
|
39
56
|
existing.textStyle = clearTextStyleTypeIfTiptap(existing.textStyle || {}, wasTiptap, textStyleOptions);
|
|
40
57
|
}
|
|
41
58
|
if (item.text_style && typeof item.text_style === 'object') {
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
59
|
+
existing.textStyle = {
|
|
60
|
+
...(existing.textStyle || {}),
|
|
61
|
+
...item.text_style,
|
|
62
|
+
};
|
|
46
63
|
}
|
|
64
|
+
repositionItemByAnchor(content.textItems, existing, item.move_before_item_id);
|
|
65
|
+
}
|
|
66
|
+
else {
|
|
67
|
+
const newItem = createTextItem(item, content.textStyle || {}, textStyleOptions);
|
|
68
|
+
content.textItems = content.textItems ?? [];
|
|
69
|
+
repositionItemByAnchor(content.textItems, newItem, item.move_before_item_id);
|
|
47
70
|
}
|
|
48
|
-
return;
|
|
49
|
-
}
|
|
50
|
-
const itemsToMerge = items.filter((item) => item.insert_at === undefined);
|
|
51
|
-
const updatedItems = itemsToMerge.map((item, index) => {
|
|
52
|
-
const existing = content.textItems?.[index];
|
|
53
|
-
const baseStyle = existing?.textStyle || content.textStyle || {};
|
|
54
|
-
const mergedStyle = (item.text_style ? { ...baseStyle, ...item.text_style } : baseStyle);
|
|
55
|
-
const resolved = item.text !== undefined ? resolveText(item.text) : null;
|
|
56
|
-
const text = resolved ? resolved.html : (existing?.text ?? '');
|
|
57
|
-
return {
|
|
58
|
-
text,
|
|
59
|
-
textStyle: clearTextStyleTypeIfTiptap(mergedStyle, resolved?.wasTiptap ?? false, textStyleOptions),
|
|
60
|
-
};
|
|
61
|
-
});
|
|
62
|
-
if (!replaceAll &&
|
|
63
|
-
content.textItems &&
|
|
64
|
-
content.textItems.length > itemsToMerge.length) {
|
|
65
|
-
updatedItems.push(...content.textItems.slice(itemsToMerge.length));
|
|
66
71
|
}
|
|
67
|
-
content.textItems = updatedItems;
|
|
68
72
|
};
|
|
69
73
|
/**
|
|
70
74
|
* Handles the single `text` + `text_style` fields (BrandPage/BrandContact
|
|
@@ -121,56 +125,27 @@ export class TextSectionBuilder extends BaseSectionBuilder {
|
|
|
121
125
|
applyScalarFields(content, this.args, this.sectionType);
|
|
122
126
|
applyStyleFields(content, this.args, this.sectionType, this.getGlobalTextStyles(model));
|
|
123
127
|
const args = this.args;
|
|
124
|
-
if (args.items && Array.isArray(args.items)) {
|
|
125
|
-
|
|
128
|
+
if (args._replace_items && args.items && Array.isArray(args.items)) {
|
|
129
|
+
// Full replacement: discard existing items and rebuild from the payload.
|
|
130
|
+
applyTextItems(content, args.items, textStyleOptions);
|
|
131
|
+
}
|
|
132
|
+
else if (this.mode === 'create') {
|
|
133
|
+
if (args.items && Array.isArray(args.items)) {
|
|
126
134
|
applyTextItems(content, args.items, textStyleOptions);
|
|
127
135
|
}
|
|
128
136
|
else {
|
|
129
|
-
|
|
137
|
+
applySingleTextField(content, args, textStyleOptions);
|
|
130
138
|
}
|
|
131
139
|
}
|
|
140
|
+
else if ((args.items && Array.isArray(args.items)) ||
|
|
141
|
+
args._remove_item_ids?.length) {
|
|
142
|
+
// Update: id-based add / edit / move / remove in a single pass.
|
|
143
|
+
mergeTextItems(content, args.items ?? [], args._remove_item_ids, textStyleOptions);
|
|
144
|
+
}
|
|
132
145
|
else {
|
|
146
|
+
// No items array: apply the single text/text_style shorthand fields.
|
|
133
147
|
applySingleTextField(content, args, textStyleOptions);
|
|
134
148
|
}
|
|
135
|
-
// Phase 2: Item operations (remove, insert, reorder)
|
|
136
|
-
if (args._remove_item_indices?.length && content.textItems) {
|
|
137
|
-
const sorted = [...args._remove_item_indices].sort((a, b) => b - a);
|
|
138
|
-
for (const idx of sorted) {
|
|
139
|
-
if (idx >= 0 && idx < content.textItems.length) {
|
|
140
|
-
content.textItems.splice(idx, 1);
|
|
141
|
-
}
|
|
142
|
-
}
|
|
143
|
-
}
|
|
144
|
-
if (args.items && Array.isArray(args.items)) {
|
|
145
|
-
const insertItems = args.items.filter((item) => item.insert_at !== undefined && item.item_index === undefined);
|
|
146
|
-
const sortedInserts = [...insertItems].sort((a, b) => (b.insert_at ?? 0) - (a.insert_at ?? 0));
|
|
147
|
-
for (const item of sortedInserts) {
|
|
148
|
-
const pos = Math.max(0, Math.min(item.insert_at ?? 0, content.textItems?.length ?? 0));
|
|
149
|
-
const baseStyle = content.textStyle || {};
|
|
150
|
-
const textStyle = (item.text_style
|
|
151
|
-
? { ...baseStyle, ...item.text_style }
|
|
152
|
-
: { ...baseStyle });
|
|
153
|
-
const { html, wasTiptap } = resolveText(item.text);
|
|
154
|
-
const newItem = {
|
|
155
|
-
text: html,
|
|
156
|
-
textStyle: clearTextStyleTypeIfTiptap(textStyle, wasTiptap, textStyleOptions),
|
|
157
|
-
};
|
|
158
|
-
content.textItems = content.textItems ?? [];
|
|
159
|
-
content.textItems.splice(pos, 0, newItem);
|
|
160
|
-
}
|
|
161
|
-
}
|
|
162
|
-
if (args._reorder_items?.length && content.textItems) {
|
|
163
|
-
const newOrder = args._reorder_items;
|
|
164
|
-
const unique = new Set(newOrder);
|
|
165
|
-
if (unique.size === newOrder.length) {
|
|
166
|
-
const reordered = newOrder
|
|
167
|
-
.filter((idx) => idx >= 0 && idx < content.textItems.length)
|
|
168
|
-
.map((idx) => content.textItems[idx]);
|
|
169
|
-
if (reordered.length === content.textItems.length) {
|
|
170
|
-
content.textItems = reordered;
|
|
171
|
-
}
|
|
172
|
-
}
|
|
173
|
-
}
|
|
174
149
|
if (args.background_color !== undefined) {
|
|
175
150
|
content.backgroundColor = {
|
|
176
151
|
...content.backgroundColor,
|
|
@@ -21,13 +21,6 @@ interface ButtonLinkArgs {
|
|
|
21
21
|
*/
|
|
22
22
|
export declare const applyButtonLink: (content: ButtonLinkContent, args: ButtonLinkArgs) => void;
|
|
23
23
|
export declare const applyScalarFields: (content: Content, args: SectionToolArguments, sectionType: string) => void;
|
|
24
|
-
/**
|
|
25
|
-
* Convert AI-sent style value to the format expected by the model.
|
|
26
|
-
* - letterSpacing: unitless 0-100 → em string (e.g., 50 → '0.5em')
|
|
27
|
-
* - null → '' (explicitly clear/reset the property)
|
|
28
|
-
* - everything else passes through as-is
|
|
29
|
-
*/
|
|
30
|
-
export declare const normalizeStyleValue: (key: string, value: unknown) => unknown;
|
|
31
24
|
/**
|
|
32
25
|
* When an executor is about to mark a content-level text style "custom" by
|
|
33
26
|
* clearing `textStyleType`, the resolved preset values (font, size, spacing,
|
|
@@ -58,7 +58,7 @@ export const applyScalarFields = (content, args, sectionType) => {
|
|
|
58
58
|
* - null → '' (explicitly clear/reset the property)
|
|
59
59
|
* - everything else passes through as-is
|
|
60
60
|
*/
|
|
61
|
-
|
|
61
|
+
const normalizeStyleValue = (key, value) => {
|
|
62
62
|
if (value === null)
|
|
63
63
|
return '';
|
|
64
64
|
if (value === undefined)
|
|
@@ -48,5 +48,5 @@ export const applyColorThemeToReplacements = (replacements, colorTheme) => repla
|
|
|
48
48
|
...r,
|
|
49
49
|
replacementColor: replacements.length === 1
|
|
50
50
|
? colorTheme
|
|
51
|
-
:
|
|
51
|
+
: getNewColorBasedOnTargetColorTheme(r.originalColor, colorTheme)?.toString() ?? colorTheme,
|
|
52
52
|
}));
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import type { AiAssistantToolCall } from '../../clients/ai-assistant-client';
|
|
2
2
|
import type { FooterDisplayStyle, HeaderDisplayStyle, NavigationDisplayType } from '../../brand-page/constants';
|
|
3
|
-
import type { SectionType
|
|
3
|
+
import type { SectionType } from './section-tool-arguments';
|
|
4
4
|
export declare const AI_ASSISTANT_TOOL_NAMES: {
|
|
5
5
|
readonly UPDATE_TEXT: "updateText";
|
|
6
6
|
readonly UPDATE_STYLE: "updateStyle";
|
|
@@ -99,8 +99,17 @@ export interface ReorderPagesArguments {
|
|
|
99
99
|
export interface UndoArguments {
|
|
100
100
|
}
|
|
101
101
|
export interface FooterSocialLinkItem {
|
|
102
|
-
|
|
103
|
-
|
|
102
|
+
/**
|
|
103
|
+
* Stable id of the existing link to update or move. Omit to ADD a new link.
|
|
104
|
+
* Mirrors the section-level item_id convention (BP-5603).
|
|
105
|
+
*/
|
|
106
|
+
item_id?: string;
|
|
107
|
+
/**
|
|
108
|
+
* Id of an existing link to position this link before (insert for new links,
|
|
109
|
+
* move for existing ones). Use "__end__" for the end of the list. Omit to
|
|
110
|
+
* leave an existing link in place / append a new link.
|
|
111
|
+
*/
|
|
112
|
+
move_before_item_id?: string;
|
|
104
113
|
social_link_icon?: string;
|
|
105
114
|
url?: string;
|
|
106
115
|
}
|
|
@@ -111,6 +120,7 @@ export interface FooterSocialLinkItem {
|
|
|
111
120
|
export interface ViewportFooterOverrides {
|
|
112
121
|
display_style?: FooterDisplayStyle;
|
|
113
122
|
background_color?: string | null;
|
|
123
|
+
copyright_text_color?: string;
|
|
114
124
|
icon_color?: string;
|
|
115
125
|
is_logo_visible?: boolean;
|
|
116
126
|
logo_image_height?: string;
|
|
@@ -118,12 +128,11 @@ export interface ViewportFooterOverrides {
|
|
|
118
128
|
}
|
|
119
129
|
export interface UpdateFooterArguments {
|
|
120
130
|
copyright_text?: string;
|
|
121
|
-
|
|
122
|
-
copyright_text_style?: TextStyleArguments;
|
|
131
|
+
copyright_text_font_family?: string;
|
|
123
132
|
social_links?: FooterSocialLinkItem[];
|
|
124
133
|
_replace_social_links?: boolean;
|
|
125
|
-
_remove_social_link_indices
|
|
126
|
-
|
|
134
|
+
/** Stable ids of social links to remove. Order-independent (replaces index-based _remove_social_link_indices). */
|
|
135
|
+
_remove_social_link_ids?: string[];
|
|
127
136
|
/** Desktop-only styling (display_style, background_color, icon_color, is_logo_visible, logo sizes). */
|
|
128
137
|
desktop?: ViewportFooterOverrides;
|
|
129
138
|
/** Mobile-only styling (display_style, background_color, icon_color, is_logo_visible, logo sizes). */
|
|
@@ -92,10 +92,15 @@ export interface ProfileSectionArguments {
|
|
|
92
92
|
background_color?: string | null;
|
|
93
93
|
}
|
|
94
94
|
export interface TextSectionItem {
|
|
95
|
-
/**
|
|
96
|
-
|
|
97
|
-
/**
|
|
98
|
-
|
|
95
|
+
/** Stable id of the existing item to update or move. Omit to ADD a new item. */
|
|
96
|
+
item_id?: string;
|
|
97
|
+
/**
|
|
98
|
+
* Id of an existing item to position this item before (insert for new items,
|
|
99
|
+
* move for existing ones). Use "__end__" for the end of the list. Omit to
|
|
100
|
+
* leave an existing item in place / append a new item. Mirrors the
|
|
101
|
+
* section-level move_before_content_id.
|
|
102
|
+
*/
|
|
103
|
+
move_before_item_id?: string;
|
|
99
104
|
text?: RichTextField;
|
|
100
105
|
text_style?: TextStyleArguments;
|
|
101
106
|
}
|
|
@@ -108,10 +113,8 @@ export interface TextSectionArguments {
|
|
|
108
113
|
/** Multiple text items (BrandSite) */
|
|
109
114
|
items?: TextSectionItem[];
|
|
110
115
|
_replace_items?: boolean;
|
|
111
|
-
/**
|
|
112
|
-
|
|
113
|
-
/** New order as array of current 0-based indices */
|
|
114
|
-
_reorder_items?: number[];
|
|
116
|
+
/** Stable ids of items to remove. Order-independent (no index shifting). */
|
|
117
|
+
_remove_item_ids?: string[];
|
|
115
118
|
background_color?: string | null;
|
|
116
119
|
}
|
|
117
120
|
export interface ImageSectionArguments {
|
|
@@ -119,10 +122,15 @@ export interface ImageSectionArguments {
|
|
|
119
122
|
image_title?: string;
|
|
120
123
|
}
|
|
121
124
|
export interface ImageGalleryItem {
|
|
122
|
-
/**
|
|
123
|
-
|
|
124
|
-
/**
|
|
125
|
-
|
|
125
|
+
/** Stable id of the existing item to update or move. Omit to ADD a new item. */
|
|
126
|
+
item_id?: string;
|
|
127
|
+
/**
|
|
128
|
+
* Id of an existing item to position this item before (insert for new items,
|
|
129
|
+
* move for existing ones). Use "__end__" for the end of the list. Omit to
|
|
130
|
+
* leave an existing item in place / append a new item. Mirrors the
|
|
131
|
+
* section-level move_before_content_id.
|
|
132
|
+
*/
|
|
133
|
+
move_before_item_id?: string;
|
|
126
134
|
image_url?: string;
|
|
127
135
|
caption?: string;
|
|
128
136
|
}
|
|
@@ -131,10 +139,8 @@ export interface ImageGallerySectionArguments {
|
|
|
131
139
|
gallery_type?: 'grid' | 'carousel' | 'masonry';
|
|
132
140
|
is_full_width?: boolean;
|
|
133
141
|
_replace_items?: boolean;
|
|
134
|
-
/**
|
|
135
|
-
|
|
136
|
-
/** New order as array of current 0-based indices */
|
|
137
|
-
_reorder_items?: number[];
|
|
142
|
+
/** Stable ids of items to remove. Order-independent (no index shifting). */
|
|
143
|
+
_remove_item_ids?: string[];
|
|
138
144
|
}
|
|
139
145
|
export interface GeneralLinkSectionArguments {
|
|
140
146
|
title?: string;
|
|
@@ -189,10 +195,15 @@ export interface TiktokSectionArguments {
|
|
|
189
195
|
url?: string;
|
|
190
196
|
}
|
|
191
197
|
export interface SocialLink {
|
|
192
|
-
/**
|
|
193
|
-
|
|
194
|
-
/**
|
|
195
|
-
|
|
198
|
+
/** Stable id of the existing item to update or move. Omit to ADD a new item. */
|
|
199
|
+
item_id?: string;
|
|
200
|
+
/**
|
|
201
|
+
* Id of an existing item to position this item before (insert for new items,
|
|
202
|
+
* move for existing ones). Use "__end__" for the end of the list. Omit to
|
|
203
|
+
* leave an existing item in place / append a new item. Mirrors the
|
|
204
|
+
* section-level move_before_content_id.
|
|
205
|
+
*/
|
|
206
|
+
move_before_item_id?: string;
|
|
196
207
|
platform?: 'facebook' | 'x' | 'instagram' | 'youtube' | 'linkedin' | 'pinterest' | 'twitch' | 'tiktok';
|
|
197
208
|
url?: string;
|
|
198
209
|
}
|
|
@@ -204,10 +215,8 @@ export interface SocialLinksSectionArguments {
|
|
|
204
215
|
/** Style for the icon container background (used when icon_style is 'square' or 'circle'). */
|
|
205
216
|
icon_background_style?: TextStyleArguments;
|
|
206
217
|
_replace_items?: boolean;
|
|
207
|
-
/**
|
|
208
|
-
|
|
209
|
-
/** New order as array of current 0-based indices */
|
|
210
|
-
_reorder_items?: number[];
|
|
218
|
+
/** Stable ids of items to remove. Order-independent (no index shifting). */
|
|
219
|
+
_remove_item_ids?: string[];
|
|
211
220
|
}
|
|
212
221
|
export interface MailingListSectionArguments {
|
|
213
222
|
title?: RichTextField;
|
|
@@ -268,10 +277,15 @@ export interface AboutSectionArguments {
|
|
|
268
277
|
background_color?: string | null;
|
|
269
278
|
}
|
|
270
279
|
export interface ImagesSectionItem {
|
|
271
|
-
/**
|
|
272
|
-
|
|
273
|
-
/**
|
|
274
|
-
|
|
280
|
+
/** Stable id of the existing item to update or move. Omit to ADD a new item. */
|
|
281
|
+
item_id?: string;
|
|
282
|
+
/**
|
|
283
|
+
* Id of an existing item to position this item before (insert for new items,
|
|
284
|
+
* move for existing ones). Use "__end__" for the end of the list. Omit to
|
|
285
|
+
* leave an existing item in place / append a new item. Mirrors the
|
|
286
|
+
* section-level move_before_content_id.
|
|
287
|
+
*/
|
|
288
|
+
move_before_item_id?: string;
|
|
275
289
|
image_url?: string;
|
|
276
290
|
heading?: string;
|
|
277
291
|
text?: string;
|
|
@@ -283,10 +297,8 @@ export interface ImagesSectionArguments {
|
|
|
283
297
|
items?: ImagesSectionItem[];
|
|
284
298
|
display_style?: 'left-aligned' | 'right-aligned' | 'centered' | 'media-only' | 'center-card-aligned-image' | 'alternate-image';
|
|
285
299
|
_replace_items?: boolean;
|
|
286
|
-
/**
|
|
287
|
-
|
|
288
|
-
/** New order as array of current 0-based indices */
|
|
289
|
-
_reorder_items?: number[];
|
|
300
|
+
/** Stable ids of items to remove. Order-independent (no index shifting). */
|
|
301
|
+
_remove_item_ids?: string[];
|
|
290
302
|
title_style?: TextStyleArguments;
|
|
291
303
|
description_style?: TextStyleArguments;
|
|
292
304
|
heading_style?: TextStyleArguments;
|
|
@@ -298,10 +310,15 @@ export interface ImagesSectionArguments {
|
|
|
298
310
|
card_style?: CardStyleArguments;
|
|
299
311
|
}
|
|
300
312
|
export interface TestimonialItem {
|
|
301
|
-
/**
|
|
302
|
-
|
|
303
|
-
/**
|
|
304
|
-
|
|
313
|
+
/** Stable id of the existing item to update or move. Omit to ADD a new item. */
|
|
314
|
+
item_id?: string;
|
|
315
|
+
/**
|
|
316
|
+
* Id of an existing item to position this item before (insert for new items,
|
|
317
|
+
* move for existing ones). Use "__end__" for the end of the list. Omit to
|
|
318
|
+
* leave an existing item in place / append a new item. Mirrors the
|
|
319
|
+
* section-level move_before_content_id.
|
|
320
|
+
*/
|
|
321
|
+
move_before_item_id?: string;
|
|
305
322
|
testimonial?: string;
|
|
306
323
|
name?: string;
|
|
307
324
|
position?: string;
|
|
@@ -314,10 +331,8 @@ export interface TestimonialSectionArguments {
|
|
|
314
331
|
items?: TestimonialItem[];
|
|
315
332
|
display_style?: 'centered' | 'big-image' | 'columns';
|
|
316
333
|
_replace_items?: boolean;
|
|
317
|
-
/**
|
|
318
|
-
|
|
319
|
-
/** New order as array of current 0-based indices */
|
|
320
|
-
_reorder_items?: number[];
|
|
334
|
+
/** Stable ids of items to remove. Order-independent (no index shifting). */
|
|
335
|
+
_remove_item_ids?: string[];
|
|
321
336
|
title_style?: TextStyleArguments;
|
|
322
337
|
testimonial_style?: TextStyleArguments;
|
|
323
338
|
name_style?: TextStyleArguments;
|
|
@@ -326,10 +341,15 @@ export interface TestimonialSectionArguments {
|
|
|
326
341
|
card_style?: CardStyleArguments;
|
|
327
342
|
}
|
|
328
343
|
export interface ShapesSectionItem {
|
|
329
|
-
/**
|
|
330
|
-
|
|
331
|
-
/**
|
|
332
|
-
|
|
344
|
+
/** Stable id of the existing item to update or move. Omit to ADD a new item. */
|
|
345
|
+
item_id?: string;
|
|
346
|
+
/**
|
|
347
|
+
* Id of an existing item to position this item before (insert for new items,
|
|
348
|
+
* move for existing ones). Use "__end__" for the end of the list. Omit to
|
|
349
|
+
* leave an existing item in place / append a new item. Mirrors the
|
|
350
|
+
* section-level move_before_content_id.
|
|
351
|
+
*/
|
|
352
|
+
move_before_item_id?: string;
|
|
333
353
|
icon_image_url?: string;
|
|
334
354
|
shape_url?: string;
|
|
335
355
|
color_theme?: string;
|
|
@@ -342,10 +362,8 @@ export interface ShapesSectionArguments {
|
|
|
342
362
|
items?: ShapesSectionItem[];
|
|
343
363
|
display_style?: 'left-aligned' | 'right-aligned' | 'centered' | 'media-only' | 'center-card-aligned-image' | 'alternate-image';
|
|
344
364
|
_replace_items?: boolean;
|
|
345
|
-
/**
|
|
346
|
-
|
|
347
|
-
/** New order as array of current 0-based indices */
|
|
348
|
-
_reorder_items?: number[];
|
|
365
|
+
/** Stable ids of items to remove. Order-independent (no index shifting). */
|
|
366
|
+
_remove_item_ids?: string[];
|
|
349
367
|
title_style?: TextStyleArguments;
|
|
350
368
|
description_style?: TextStyleArguments;
|
|
351
369
|
heading_style?: TextStyleArguments;
|
|
@@ -15,7 +15,7 @@ export interface AddressDetails {
|
|
|
15
15
|
export declare class GoogleMapsPlugin {
|
|
16
16
|
private initialised;
|
|
17
17
|
private initialising;
|
|
18
|
-
private readonly
|
|
18
|
+
private readonly _options;
|
|
19
19
|
constructor(options: GoogleMapsPluginOptions);
|
|
20
20
|
private initialise;
|
|
21
21
|
private getPlacesLibrary;
|