@designcrowd/library.brand-page 5.19.1-error-html2canvas-1 → 5.19.1-error-html2canvas-3

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.
Files changed (361) hide show
  1. package/lib/src/{CreatedOnBrandCrowd-de-de-CxCJU9cc.js → CreatedOnBrandCrowd-de-de-BPP1Wtpt.js} +3 -3
  2. package/lib/src/{CreatedOnBrandCrowd-en-us-zDJCWP5n.js → CreatedOnBrandCrowd-en-us-BlfpQiIg.js} +3 -3
  3. package/lib/src/{CreatedOnBrandCrowd-es-es-DNna1Sh9.js → CreatedOnBrandCrowd-es-es-Tldy_pIo.js} +3 -3
  4. package/lib/src/{CreatedOnBrandCrowd-fr-fr-C5XVf_hD.js → CreatedOnBrandCrowd-fr-ca-CHmb3VQE.js} +3 -3
  5. package/lib/src/{CreatedOnBrandCrowd-fr-ca-C5XVf_hD.js → CreatedOnBrandCrowd-fr-fr-CHmb3VQE.js} +3 -3
  6. package/lib/src/{CreatedOnBrandCrowd-pt-pt-9eUHV_M3.js → CreatedOnBrandCrowd-pt-br-XbU3eK3Z.js} +3 -3
  7. package/lib/src/{CreatedOnBrandCrowd-pt-br-9eUHV_M3.js → CreatedOnBrandCrowd-pt-pt-XbU3eK3Z.js} +3 -3
  8. package/lib/src/{CreatedOnDcom-de-de-D9HMpK8Q.js → CreatedOnDcom-de-de-BVMFbVbI.js} +3 -3
  9. package/lib/src/{CreatedOnDcom-en-us-BCTkchV5.js → CreatedOnDcom-en-us--kaKb1kI.js} +3 -3
  10. package/lib/src/{CreatedOnDcom-es-es-B0N7VoTp.js → CreatedOnDcom-es-es-XXVLpF2I.js} +3 -3
  11. package/lib/src/{CreatedOnDcom-fr-ca-Gi4oz_Mm.js → CreatedOnDcom-fr-ca-D-7vtMZ5.js} +3 -3
  12. package/lib/src/{CreatedOnDcom-fr-fr-DJI8eJo1.js → CreatedOnDcom-fr-fr-CM9oQk77.js} +3 -3
  13. package/lib/src/{CreatedOnDcom-pt-br-YNWMAuQf.js → CreatedOnDcom-pt-br-VVgu3BEa.js} +3 -3
  14. package/lib/src/{CreatedOnDcom-pt-pt-DCIIK3sy.js → CreatedOnDcom-pt-pt-CWhA8Vla.js} +3 -3
  15. package/lib/src/brand-page/clients/brand-page.client.d.ts +9 -9
  16. package/lib/src/brand-page/components/banner-section/BannerSection.mixin.d.ts +103 -0
  17. package/lib/src/brand-page/components/banner-section/BannerSection.mixin.js +178 -0
  18. package/lib/src/brand-page/components/image-gallery/masonry/MasonryGallery.mixin.d.ts +0 -1
  19. package/lib/src/brand-page/components/navigation/hamburger/HamburgerNavigation.mixin.d.ts +4 -2
  20. package/lib/src/brand-page/components/navigation/hamburger/HamburgerNavigation.mixin.js +1 -0
  21. package/lib/src/brand-page/components/navigation/navigation-side-menu/NavigationSideMenu.mixin.d.ts +4 -2
  22. package/lib/src/brand-page/components/navigation/navigation-side-menu/NavigationSideMenu.mixin.js +5 -4
  23. package/lib/src/brand-page/components/page/Page.mixin.d.ts +1 -1
  24. package/lib/src/brand-page/components/page/PageComponent.mixin.d.ts +1 -1
  25. package/lib/src/brand-page/components/payment/Payment.mixin.d.ts +3 -3
  26. package/lib/src/brand-page/components/payment/__fixtures__/request-payment.d.ts +13 -13
  27. package/lib/src/brand-page/components/payment/__fixtures__/support-me.d.ts +13 -13
  28. package/lib/src/brand-page/constants/sections/footer-display.constants.js +1 -1
  29. package/lib/src/brand-page/models/index.d.ts +2 -1
  30. package/lib/src/brand-page/models/index.js +3 -0
  31. package/lib/src/brand-page/models/payment.model.d.ts +1 -1
  32. package/lib/src/brand-page/utils/personalisation.util.js +72 -14
  33. package/lib/src/brand-page-maker/components/action-bar/ActionBar.mixin.d.ts +21 -19
  34. package/lib/src/brand-page-maker/components/action-bar/ActionBar.mixin.js +1 -0
  35. package/lib/src/brand-page-maker/components/admin-background-settings/AdminBackgroundSettings.mixin.d.ts +16 -10
  36. package/lib/src/brand-page-maker/components/admin-logo-settings/AdminLogoSettings.mixin.d.ts +3 -3
  37. package/lib/src/brand-page-maker/components/brand-page-maker/BrandPageMaker.mixin.d.ts +181 -170
  38. package/lib/src/brand-page-maker/components/brand-page-maker/BrandPageMaker.mixin.js +3 -0
  39. package/lib/src/brand-page-maker/components/brand-page-maker/BrandPageMaker.stories.js +1 -0
  40. package/lib/src/brand-page-maker/components/brand-page-maker/BrandPageMakerTemplateSettings.mixin.d.ts +12 -12
  41. package/lib/src/brand-page-maker/components/brand-page-maker/BrandPageMakerTemplateSettings.stories.js +2 -2
  42. package/lib/src/brand-page-maker/components/brand-page-maker/__fixtures__/brand-page-payment.js +0 -7
  43. package/lib/src/brand-page-maker/components/brandpage-maker-page/BrandPageMakerPage.mixin.d.ts +148 -149
  44. package/lib/src/brand-page-maker/components/brandpage-settings/ReplaceImageSettingsForBrandPageSettings.mixin.d.ts +21 -21
  45. package/lib/src/brand-page-maker/components/brandpage-settings/ReplaceImageSettingsForBrandPageSettings.mixin.js +1 -1
  46. package/lib/src/brand-page-maker/components/color-picker/components/ColorModeSelect.mixin.d.ts +4 -2
  47. package/lib/src/brand-page-maker/components/color-picker/components/ColorModeSelect.mixin.js +1 -0
  48. package/lib/src/brand-page-maker/components/color-picker/components/GradientColorSlider.mixin.d.ts +4 -2
  49. package/lib/src/brand-page-maker/components/color-picker/components/GradientColorSlider.mixin.js +1 -0
  50. package/lib/src/brand-page-maker/components/color-picker/components/GradientColorSliderHandler.mixin.d.ts +5 -2
  51. package/lib/src/brand-page-maker/components/color-picker/components/GradientColorSliderHandler.mixin.js +1 -0
  52. package/lib/src/brand-page-maker/components/color-picker/components/GradientTypeSelector.mixin.d.ts +4 -2
  53. package/lib/src/brand-page-maker/components/color-picker/components/GradientTypeSelector.mixin.js +1 -0
  54. package/lib/src/brand-page-maker/components/device/Device.mixin.d.ts +4 -2
  55. package/lib/src/brand-page-maker/components/device/Device.mixin.js +1 -0
  56. package/lib/src/brand-page-maker/components/navigation/Navigation.mixin.d.ts +4 -2
  57. package/lib/src/brand-page-maker/components/navigation/Navigation.mixin.js +1 -0
  58. package/lib/src/brand-page-maker/components/preview/Preview.mixin.d.ts +3 -3
  59. package/lib/src/brand-page-maker/components/quick-link-bar/QuickLinkBar.mixin.d.ts +11 -11
  60. package/lib/src/brand-page-maker/components/seo-settings/SeoPageSettings.mixin.d.ts +27 -25
  61. package/lib/src/brand-page-maker/components/seo-settings/SeoPageSettings.mixin.js +1 -0
  62. package/lib/src/brand-page-maker/components/seo-settings/UrlSettings.mixin.d.ts +27 -27
  63. package/lib/src/brand-page-maker/components/seo-settings/UrlSettings.mixin.js +1 -1
  64. package/lib/src/brand-page-maker/components/seo-settings/UseExistingDomainModal.mixin.d.ts +17 -12
  65. package/lib/src/brand-page-maker/components/social-share/SocialShare.mixin.d.ts +12 -12
  66. package/lib/src/brand-page-maker/components/template-preview/TemplatePreview.mixin.d.ts +30 -32
  67. package/lib/src/brand-page-maker/components/template-preview/TemplatePreview.mixin.js +16 -5
  68. package/lib/src/brand-page-maker/components/upgrade-to-premium-button/UpgradeToPremiumButton.mixin.d.ts +11 -11
  69. package/lib/src/brand-page-maker/composables/ai-chat/useAiWebsiteBuilderChat.js +1 -1
  70. package/lib/src/brand-page-maker/composables/rich-text-editor/useRichTextEditor.d.ts +1 -1
  71. package/lib/src/brand-page-maker/composables/rich-text-editor/useRichTextEditor.js +6 -6
  72. package/lib/src/brand-page-maker/composables/useEventTracker.d.ts +2 -2
  73. package/lib/src/brand-page-maker/constants/config-settings-constant.d.ts +6 -6
  74. package/lib/src/brand-page-maker/constants/config-settings-constant.js +1 -1
  75. package/lib/src/brand-page-maker/convertors/text-image-display-style.convertor.d.ts +1 -1
  76. package/lib/src/brand-page-maker/convertors/text-image-display-style.convertor.js +1 -1
  77. package/lib/src/brand-page-maker/models/content-settings.d.ts +1 -1
  78. package/lib/src/brand-page-maker/models/navigation-style-configs.js +1 -1
  79. package/lib/src/brand-page-maker/routing/brand-page-maker-router.d.ts +1 -2
  80. package/lib/src/brand-page-maker/stores/ai-checkpoint/ai-checkpoint-store.d.ts +366 -360
  81. package/lib/src/brand-page-maker/stores/brandpage-container/brand-page-container-store.d.ts +5 -4
  82. package/lib/src/brand-page-maker/stores/brandpage-container/brand-page-container-store.js +8 -5
  83. package/lib/src/brand-page-maker/stores/brandpage-maker/brandpage-maker-store.d.ts +3 -1
  84. package/lib/src/brand-page-maker/stores/brandpage-maker/brandpage-maker-store.js +7 -3
  85. package/lib/src/brand-page-maker/stores/history/history-store.d.ts +15 -15
  86. package/lib/src/brand-page-maker/stores/ui/ui-store.d.ts +6 -0
  87. package/lib/src/brand-page-maker/stores/ui/ui-store.js +8 -0
  88. package/lib/src/brand-page-maker/utils/content-settings.util.js +1 -1
  89. package/lib/src/brand-page-maker/utils/rich-text-editor.util.d.ts +1 -1
  90. package/lib/src/brand-page-maker/utils/rich-text-editor.util.js +4 -4
  91. package/lib/src/clients/brand-page-client.d.ts +16 -15
  92. package/lib/src/clients/design-template-client.d.ts +3 -0
  93. package/lib/src/clients/media-client.d.ts +2 -2
  94. package/lib/src/clients/models.d.ts +2 -0
  95. package/lib/src/css/library.brand-page-brandCrowd.min.css +342 -324
  96. package/lib/src/css/library.brand-page-brandPage.min.css +620 -324
  97. package/lib/src/css/library.brand-page-designCom.min.css +342 -324
  98. package/lib/src/css/library.brand-page-preview.min.css +598 -324
  99. package/lib/src/index.d.ts +1 -1
  100. package/lib/src/index.mjs +16 -15
  101. package/lib/src/{lib-CaY174HB.js → lib-yEV1yYI5.js} +35293 -32254
  102. package/lib/src/lib.js +1 -1
  103. package/lib/src/metadata-builder/builders/footer-builder.js +103 -70
  104. package/lib/src/metadata-builder/builders/section-builders/image-gallery-builder.js +1 -1
  105. package/lib/src/metadata-builder/builders/section-builders/images-section-builder.js +1 -1
  106. package/lib/src/metadata-builder/builders/section-builders/testimonial-section-builder.js +1 -1
  107. package/lib/src/metadata-builder/builders/section-builders/text-section-builder.js +1 -1
  108. package/lib/src/metadata-builder/builders/section-field-utils.d.ts +7 -0
  109. package/lib/src/metadata-builder/builders/section-field-utils.js +1 -1
  110. package/lib/src/metadata-builder/builders/shape-color-utils.js +1 -1
  111. package/lib/src/metadata-builder/parsers/ai-toolcall-parser.d.ts +3 -3
  112. package/lib/src/plugins/google-maps-plugin/google-maps-plugin.d.ts +1 -1
  113. package/lib/src/plugins/google-maps-plugin/google-maps-plugin.js +8 -8
  114. package/lib/src/shared/background-settings/components/background-shapes/BackgroundShapeSettings.mixin.d.ts +13 -13
  115. package/lib/src/shared/background-settings/store/background-settings-store.d.ts +3 -3
  116. package/lib/src/shared/color-picker/components/ColorPicker.mixin.d.ts +4 -2
  117. package/lib/src/shared/color-picker/components/ColorPicker.mixin.js +2 -2
  118. package/lib/src/shared/color-picker/components/ColorPickerSwatch.mixin.d.ts +4 -2
  119. package/lib/src/shared/color-picker/components/ColorPickerSwatch.mixin.js +1 -0
  120. package/lib/src/shared/confirm-modal/ConfirmModal.mixin.d.ts +5 -2
  121. package/lib/src/shared/confirm-modal/ConfirmModal.mixin.js +1 -0
  122. package/lib/src/shared/content-settings/components/GenericTextInput.mixin.d.ts +0 -1
  123. package/lib/src/shared/content-settings/components/content-settings/ContentSettings.mixin.d.ts +131 -129
  124. package/lib/src/shared/content-settings/components/content-settings/ContentSettings.mixin.js +2 -1
  125. package/lib/src/shared/content-settings/components/content-settings/ReplaceImageSettingsForContent.mixin.d.ts +111 -110
  126. package/lib/src/shared/content-settings/components/content-settings-item/ContentSettingsItem.mixin.d.ts +84 -81
  127. package/lib/src/shared/content-settings/components/content-settings-item/ContentSettingsItem.mixin.js +5 -0
  128. package/lib/src/shared/content-settings/components/content-settings-item/ContentSettingsItemField.mixin.d.ts +117 -109
  129. package/lib/src/shared/content-settings/components/content-settings-item/ContentSettingsItemField.mixin.js +1 -14
  130. package/lib/src/shared/content-settings/components/email-field/EmailField.mixin.d.ts +0 -1
  131. package/lib/src/shared/content-settings/components/focused-content-item-settings/FocusedContentItemSettings.mixin.d.ts +72 -70
  132. package/lib/src/shared/content-settings/components/focused-content-item-settings/FocusedContentItemSettings.mixin.js +4 -3
  133. package/lib/src/shared/content-settings/components/form-fields-field/FormFieldsField.mixin.d.ts +4 -4
  134. package/lib/src/shared/content-settings/components/icon-library/IconLibrary.mixin.d.ts +3 -1
  135. package/lib/src/shared/content-settings/components/icon-library/IconLibrary.mixin.js +1 -0
  136. package/lib/src/shared/content-settings/components/images-field/ImagesField.mixin.d.ts +2 -2
  137. package/lib/src/shared/content-settings/components/items-field/ItemsField.mixin.d.ts +4 -3
  138. package/lib/src/shared/content-settings/components/items-field/ItemsField.mixin.js +1 -1
  139. package/lib/src/shared/content-settings/components/payment-config-field/PaymentConfigField.mixin.d.ts +40 -40
  140. package/lib/src/shared/content-settings/components/payment-config-field/PaymentConfigOptionField.mixin.d.ts +5 -6
  141. package/lib/src/shared/content-settings/components/shape-field/ShapeField.mixin.d.ts +0 -1
  142. package/lib/src/shared/content-settings/components/slider-field/SliderField.mixin.d.ts +2 -2
  143. package/lib/src/shared/content-settings/components/tel-field/TelField.mixin.d.ts +0 -1
  144. package/lib/src/shared/content-settings/components/testimonial-items-field/TestimonialItemsField.mixin.d.ts +1 -2
  145. package/lib/src/shared/content-settings/components/text-field/TextField.mixin.d.ts +0 -1
  146. package/lib/src/shared/content-settings/components/text-items-field/TextItemsField.mixin.d.ts +1 -2
  147. package/lib/src/shared/content-settings/components/text-items-field/TextItemsField.mixin.js +1 -1
  148. package/lib/src/shared/content-settings/components/text-style-field/TextStyleField.mixin.d.ts +28 -28
  149. package/lib/src/shared/content-settings/components/textarea-field/TextareaField.mixin.d.ts +0 -1
  150. package/lib/src/shared/content-settings/components/toggle-field/ToggleField.mixin.d.ts +2 -2
  151. package/lib/src/shared/content-settings/components/url-field/UrlField.mixin.d.ts +0 -1
  152. package/lib/src/shared/content-settings/components/youtube-video-field/YoutubeVideoField.mixin.d.ts +0 -1
  153. package/lib/src/shared/content-settings/store/content-settings-store.d.ts +39 -39
  154. package/lib/src/shared/content-settings/utils.js +0 -1
  155. package/lib/src/shared/font-family-selector/FontFamilySelector.mixin.d.ts +6 -4
  156. package/lib/src/shared/font-family-selector/FontFamilySelector.mixin.js +1 -0
  157. package/lib/src/shared/image-gallery-style-settings/ImageGalleryStyleSettings.mixin.d.ts +4 -2
  158. package/lib/src/shared/image-gallery-style-settings/ImageGalleryStyleSettings.mixin.js +1 -0
  159. package/lib/src/shared/logo-settings/components/EditLogoSettings.mixin.d.ts +29 -21
  160. package/lib/src/shared/logo-settings/components/EditLogoSettings.mixin.js +1 -1
  161. package/lib/src/shared/logo-settings/components/LogoSettings.mixin.d.ts +50 -51
  162. package/lib/src/shared/logo-settings/components/LogoSettingsHeader.mixin.d.ts +6 -4
  163. package/lib/src/shared/logo-settings/components/LogoSettingsHeader.mixin.js +1 -0
  164. package/lib/src/shared/logo-settings/store/editable-logo-store.js +1 -1
  165. package/lib/src/shared/logo-settings/store/logo-settings-store.d.ts +1 -1
  166. package/lib/src/shared/logo-versions/LogoVersions.mixin.d.ts +13 -5
  167. package/lib/src/shared/logo-versions/LogoVersions.mixin.js +1 -0
  168. package/lib/src/shared/models.d.ts +2 -0
  169. package/lib/src/shared/my-designs/MyDesigns.mixin.d.ts +14 -6
  170. package/lib/src/shared/my-designs/MyDesigns.mixin.js +1 -0
  171. package/lib/src/shared/my-uploads/MyMedia.mixin.d.ts +14 -5
  172. package/lib/src/shared/my-uploads/MyMedia.mixin.js +1 -0
  173. package/lib/src/shared/my-uploads/MyUploads.mixin.d.ts +14 -5
  174. package/lib/src/shared/my-uploads/MyUploads.mixin.js +1 -0
  175. package/lib/src/shared/navigation-style-settings/components/navigation-style-settings/NavigationStyleSettings.mixin.d.ts +5 -3
  176. package/lib/src/shared/navigation-style-settings/components/navigation-style-settings/NavigationStyleSettings.mixin.js +1 -0
  177. package/lib/src/shared/navigation-style-settings/store/index.d.ts +2 -2
  178. package/lib/src/shared/page-navigation/store/page-navigation-store.d.ts +2 -2
  179. package/lib/src/shared/page-settings/components/new-page-modal/NewPageModal.mixin.d.ts +27 -28
  180. package/lib/src/shared/page-settings/components/new-page-modal/NewPageModal.mixin.js +0 -2
  181. package/lib/src/shared/page-settings/components/page-settings/PageSettings.mixin.d.ts +188 -177
  182. package/lib/src/shared/page-settings/components/page-settings-section-styles/PageSettingsSectionStyles.mixin.d.ts +181 -175
  183. package/lib/src/shared/page-settings/components/page-settings-section-styles/PageSettingsSectionStyles.mixin.js +1 -1
  184. package/lib/src/shared/page-settings/store/page-settings-store.d.ts +9 -9
  185. package/lib/src/shared/publish-brand-page-with-state/PublishBrandPageModalWithState.mixin.d.ts +39 -39
  186. package/lib/src/shared/publish-brand-page-with-state/PublishBrandPageModalWithState.mixin.js +0 -1
  187. package/lib/src/shared/side-bar/components/SideBar.mixin.d.ts +18 -18
  188. package/lib/src/shared/side-bar/components/SideBarTabButton.mixin.d.ts +6 -6
  189. package/lib/src/shared/style-settings/components/StyleSettings.mixin.d.ts +66 -60
  190. package/lib/src/shared/style-settings/store/style-settings-store.d.ts +1 -1
  191. package/lib/src/shared/style-settings/store/style-settings-store.js +1 -1
  192. package/lib/src/shared/template-settings/components/TemplatesSettings.mixin.d.ts +20 -450
  193. package/lib/src/shared/template-settings/components/TemplatesSettings.mixin.js +2 -2
  194. package/lib/src/shared/template-settings/models.d.ts +1 -0
  195. package/lib/src/shared/template-settings/store/template-settings-store.d.ts +4 -0
  196. package/lib/src/shared/template-settings/store/template-settings-store.js +79 -11
  197. package/lib/src/shared/unsplash-library/UnsplashLibrary.mixin.d.ts +9 -4
  198. package/package.json +61 -57
  199. package/src/brand-page/components/about-section/AboutSection.vue.test.ts +7 -5
  200. package/src/brand-page/components/banner-section/BannerSection.mixin.ts +210 -0
  201. package/src/brand-page/components/brand-page-footer/BrandPageFooter.vue +1 -1
  202. package/src/brand-page/components/image/Image.mixin.ts +1 -1
  203. package/src/brand-page/components/image/Image.test.ts +1 -1
  204. package/src/brand-page/components/images-section/ImagesSection.vue +0 -1
  205. package/src/brand-page/components/logo/LogoRender.vue +188 -188
  206. package/src/brand-page/components/navigation/hamburger/HamburgerNavigation.mixin.ts +1 -0
  207. package/src/brand-page/components/navigation/navigation-side-menu/NavigationSideMenu.mixin.ts +15 -6
  208. package/src/brand-page/components/page-footer/PageFooter.vue +1 -0
  209. package/src/brand-page/components/page-header/HeaderLayout.vue +12 -6
  210. package/src/brand-page/components/page-header/PageHeader.vue +1 -0
  211. package/src/brand-page/components/shapes-section/ShapesSection.vue +1 -1
  212. package/src/brand-page/components/shop/CartModal.vue +1 -3
  213. package/src/brand-page/components/shop/FeaturedDisplay.vue +2 -2
  214. package/src/brand-page/components/shop/PaymentModal.vue +1 -5
  215. package/src/brand-page/components/shop/ProductDetailModal.vue +1 -1
  216. package/src/brand-page/components/shop/Shop.vue +1 -1
  217. package/src/brand-page/components/shop/TextDisplay.vue +1 -1
  218. package/src/brand-page/components/shop/ThumbnailDisplay.vue +2 -2
  219. package/src/brand-page/components/testimonial-section/TestimonialSection.vue +3 -3
  220. package/src/brand-page/components/text-wrapper/TextWrapper.vue +3 -1
  221. package/src/brand-page/constants/sections/footer-display.constants.ts +1 -1
  222. package/src/brand-page/models/index.ts +4 -0
  223. package/src/brand-page/models/payment.model.ts +2 -1
  224. package/src/brand-page/models/shop.model.ts +0 -2
  225. package/src/brand-page/models/user-personalisation.model.ts +1 -2
  226. package/src/brand-page/utils/__snapshots__/migration.util.test.ts.snap +3 -0
  227. package/src/brand-page/utils/__snapshots__/migration2.util.test.ts.snap +1 -0
  228. package/src/brand-page/utils/__snapshots__/model.util.test.ts.snap +2 -0
  229. package/src/brand-page/utils/migration/migration-01_1.ts +1 -1
  230. package/src/brand-page/utils/migration/migration-02.ts +0 -1
  231. package/src/brand-page/utils/migration/migration-03.ts +0 -1
  232. package/src/brand-page/utils/migration/migration-04.ts +0 -1
  233. package/src/brand-page/utils/migration/migration-05.ts +1 -5
  234. package/src/brand-page/utils/migration/migration-05_2.ts +1 -1
  235. package/src/brand-page/utils/migration/migration-08.test.ts +1 -1
  236. package/src/brand-page/utils/personalisation.util.test.ts +35 -0
  237. package/src/brand-page/utils/personalisation.util.ts +119 -23
  238. package/src/brand-page/view-models.ts +38 -56
  239. package/src/brand-page-maker/assessors/banner-section-description-visibility.assessor.ts +6 -6
  240. package/src/brand-page-maker/assessors/color-replacement-icon-visibility.assessor.ts +2 -2
  241. package/src/brand-page-maker/assessors/color-replacement-profile-visibility.assessor.ts +2 -2
  242. package/src/brand-page-maker/assessors/color-replacement-visibility.assessor.ts +2 -2
  243. package/src/brand-page-maker/assessors/contact-form-visibility.assessor.ts +14 -14
  244. package/src/brand-page-maker/components/action-bar/ActionBar.mixin.ts +1 -0
  245. package/src/brand-page-maker/components/ai-text-edit/TextBubble.vue +1 -0
  246. package/src/brand-page-maker/components/brand-page-maker/BrandPageMaker.mixin.ts +5 -1
  247. package/src/brand-page-maker/components/brand-page-maker/BrandPageMaker.stories.ts +1 -0
  248. package/src/brand-page-maker/components/brand-page-maker/BrandPageMakerTemplateSettings.stories.ts +2 -5
  249. package/src/brand-page-maker/components/brand-page-maker/__fixtures__/brand-page-examples.ts +0 -5
  250. package/src/brand-page-maker/components/brand-page-maker/__fixtures__/brand-page-payment.ts +0 -8
  251. package/src/brand-page-maker/components/brand-page-maker/__fixtures__/brand-site-template.examples.ts +0 -2
  252. package/src/brand-page-maker/components/brandpage-maker-page/BrandPageMakerPage.vue +1 -0
  253. package/src/brand-page-maker/components/brandpage-settings/ReplaceImageSettingsForBrandPageSettings.mixin.ts +1 -1
  254. package/src/brand-page-maker/components/color-palette/BpColorPalette.vue +1 -2
  255. package/src/brand-page-maker/components/color-picker/components/ColorModeSelect.mixin.ts +1 -0
  256. package/src/brand-page-maker/components/color-picker/components/GradientColorSlider.mixin.ts +1 -0
  257. package/src/brand-page-maker/components/color-picker/components/GradientColorSliderHandler.mixin.ts +1 -0
  258. package/src/brand-page-maker/components/color-picker/components/GradientTypeSelector.mixin.ts +1 -0
  259. package/src/brand-page-maker/components/device/Device.mixin.ts +1 -0
  260. package/src/brand-page-maker/components/navigation/Navigation.mixin.ts +1 -0
  261. package/src/brand-page-maker/components/rich-text-editor/RichTextEditor.vue +3 -1
  262. package/src/brand-page-maker/components/sensitive-content/SensitiveContent.vue +1 -4
  263. package/src/brand-page-maker/components/seo-settings/DeleteDomainModal.vue +1 -1
  264. package/src/brand-page-maker/components/seo-settings/SeoPageSettings.mixin.ts +1 -0
  265. package/src/brand-page-maker/components/seo-settings/SeoPageSettings.vue +1 -1
  266. package/src/brand-page-maker/components/seo-settings/UrlSettings.mixin.ts +0 -1
  267. package/src/brand-page-maker/components/seo-settings/UrlSettings.vue +0 -1
  268. package/src/brand-page-maker/components/seo-settings/UseExistingDomainModal.vue +1 -5
  269. package/src/brand-page-maker/components/shop/AddOrEditProductContainer.vue +1 -1
  270. package/src/brand-page-maker/components/shop/ReplaceImageSettingsForShop.vue +1 -1
  271. package/src/brand-page-maker/components/social-share/SocialShare.vue +1 -1
  272. package/src/brand-page-maker/components/template-preview/TemplatePreview.mixin.ts +22 -8
  273. package/src/brand-page-maker/components/template-preview/TemplatePreview.vue +5 -10
  274. package/src/brand-page-maker/components/template-preview/TemplatePreviewAiBadge.vue +12 -0
  275. package/src/brand-page-maker/components/video-play/VideoPlayButton.vue +1 -1
  276. package/src/brand-page-maker/composables/ai-chat/useAiWebsiteBuilderChat.ts +1 -1
  277. package/src/brand-page-maker/composables/rich-text-editor/useRichTextEditor.ts +6 -6
  278. package/src/brand-page-maker/constants/config-settings-constant.ts +3 -3
  279. package/src/brand-page-maker/convertors/text-image-display-style.convertor.ts +1 -1
  280. package/src/brand-page-maker/models/button-styles-config.ts +4 -2
  281. package/src/brand-page-maker/models/content-settings-configs.ts +4 -2
  282. package/src/brand-page-maker/models/navigation-style-configs.ts +5 -6
  283. package/src/brand-page-maker/stores/admin-logo-settings/admin-logo-settings-store.ts +0 -1
  284. package/src/brand-page-maker/stores/brandpage-container/brand-page-container-store.ts +8 -5
  285. package/src/brand-page-maker/stores/brandpage-maker/brandpage-maker-store.test.ts +1 -3
  286. package/src/brand-page-maker/stores/brandpage-maker/brandpage-maker-store.ts +12 -4
  287. package/src/brand-page-maker/stores/ui/ui-store.ts +16 -0
  288. package/src/brand-page-maker/utils/content-settings.util.ts +1 -1
  289. package/src/brand-page-maker/utils/rich-text-editor.util.ts +4 -4
  290. package/src/clients/design-template-client.ts +3 -0
  291. package/src/clients/models.ts +2 -0
  292. package/src/lib.ts +1 -0
  293. package/src/metadata-builder/builders/footer-builder.test.ts +200 -1
  294. package/src/metadata-builder/builders/footer-builder.ts +151 -95
  295. package/src/metadata-builder/builders/section-builders/image-gallery-builder.ts +1 -1
  296. package/src/metadata-builder/builders/section-builders/images-section-builder.ts +1 -1
  297. package/src/metadata-builder/builders/section-builders/testimonial-section-builder.ts +1 -1
  298. package/src/metadata-builder/builders/section-builders/text-section-builder.ts +1 -1
  299. package/src/metadata-builder/builders/section-field-utils.ts +1 -1
  300. package/src/metadata-builder/builders/shape-color-utils.ts +2 -2
  301. package/src/metadata-builder/parsers/ai-toolcall-parser.ts +3 -3
  302. package/src/plugins/google-maps-plugin/google-maps-plugin.ts +8 -8
  303. package/src/shared/background-settings/components/BackgroundSettings.vue +1 -1
  304. package/src/shared/background-settings/components/background-color/BackgroundColorSettings.vue +1 -1
  305. package/src/shared/color-picker/components/ColorPicker.mixin.ts +2 -7
  306. package/src/shared/color-picker/components/ColorPickerSwatch.mixin.ts +1 -0
  307. package/src/shared/common/NumberInput.vue +1 -0
  308. package/src/shared/common/SideBarSettingsHeader.vue +2 -2
  309. package/src/shared/confirm-modal/ConfirmModal.mixin.ts +1 -0
  310. package/src/shared/content-settings/components/booking-url-field/BookingUrlField.vue +1 -0
  311. package/src/shared/content-settings/components/button-configuration-field/ButtonConfigurationField.vue +1 -0
  312. package/src/shared/content-settings/components/color-field/ColorField.vue +3 -10
  313. package/src/shared/content-settings/components/content-settings/ContentSettings.mixin.ts +1 -1
  314. package/src/shared/content-settings/components/content-settings/ContentSettingsLockedButton.vue +1 -0
  315. package/src/shared/content-settings/components/content-settings-item/ContentSettingsItem.mixin.ts +5 -0
  316. package/src/shared/content-settings/components/content-settings-item/ContentSettingsItemField.mixin.ts +1 -14
  317. package/src/shared/content-settings/components/focused-content-item-settings/FocusedContentItemSettings.mixin.ts +4 -6
  318. package/src/shared/content-settings/components/icon-library/IconLibrary.mixin.ts +1 -0
  319. package/src/shared/content-settings/components/items-field/ItemsField.mixin.ts +1 -1
  320. package/src/shared/content-settings/components/logo-selection-field/LogoSelectionField.vue +1 -1
  321. package/src/shared/content-settings/components/logo-size-field/LogoSizeSliderField.vue +1 -1
  322. package/src/shared/content-settings/components/page-dropdown-field/PageDropdownField.vue +1 -1
  323. package/src/shared/content-settings/components/personalisation-role-field/PersonalisationRoleField.vue +4 -4
  324. package/src/shared/content-settings/components/text-image-field/TextImageField.vue +2 -8
  325. package/src/shared/content-settings/components/text-items-field/TextItemsField.mixin.ts +1 -1
  326. package/src/shared/content-settings/models.ts +3 -2
  327. package/src/shared/content-settings/utils.ts +0 -1
  328. package/src/shared/dropzone-image-uploader/components/DropzoneImageUploader.vue +1 -0
  329. package/src/shared/ecommerce-settings/store/cart-store.test.ts +1 -1
  330. package/src/shared/font-family-selector/FontFamilySelector.mixin.ts +1 -0
  331. package/src/shared/image-gallery-style-settings/ImageGalleryStyleSettings.mixin.ts +1 -0
  332. package/src/shared/logo-settings/components/EditLogoSettings.mixin.ts +1 -1
  333. package/src/shared/logo-settings/components/LogoSettings.mixin.ts +0 -1
  334. package/src/shared/logo-settings/components/LogoSettingsHeader.mixin.ts +1 -0
  335. package/src/shared/logo-settings/components/LogoStyleSettingsWithState.vue +2 -2
  336. package/src/shared/logo-settings/components/LogoTemplateSearch.vue +1 -1
  337. package/src/shared/logo-settings/store/editable-logo-store.ts +1 -1
  338. package/src/shared/logo-settings/store/logo-settings-store.test.ts +4 -4
  339. package/src/shared/logo-versions/LogoVersions.mixin.ts +1 -0
  340. package/src/shared/models.ts +6 -0
  341. package/src/shared/my-designs/MyDesigns.mixin.ts +1 -0
  342. package/src/shared/my-uploads/MyMedia.mixin.ts +1 -0
  343. package/src/shared/my-uploads/MyMediaSelectionItem.vue +2 -1
  344. package/src/shared/my-uploads/MyUploads.mixin.ts +1 -0
  345. package/src/shared/my-uploads/models.ts +1 -2
  346. package/src/shared/navigation-style-settings/components/navigation-style-settings/NavigationStyleSettings.mixin.ts +1 -0
  347. package/src/shared/navigation-style-settings/components/navigation-style-settings/NavigationStyleSettings.vue +1 -1
  348. package/src/shared/page-settings/components/new-page-modal/NewPageModal.mixin.ts +0 -3
  349. package/src/shared/page-settings/components/page-settings/NestedDraggable.vue +1 -1
  350. package/src/shared/page-settings/components/page-settings/PageSettings.vue +1 -2
  351. package/src/shared/page-settings/components/page-settings-section-styles/HeaderDisplayStyle.vue +1 -1
  352. package/src/shared/page-settings/components/page-settings-section-styles/PageSettingsSectionStyles.mixin.ts +1 -1
  353. package/src/shared/page-settings/store/page-settings-store.test.ts +4 -8
  354. package/src/shared/publish-brand-page-with-state/PublishBrandPageModalWithState.mixin.ts +0 -1
  355. package/src/shared/shape-library/ShapeLibrary.vue +2 -2
  356. package/src/shared/style-settings/store/style-settings-store.ts +1 -1
  357. package/src/shared/template-settings/components/TemplatesSettings.mixin.ts +2 -2
  358. package/src/shared/template-settings/models.ts +1 -0
  359. package/src/shared/template-settings/store/template-settings-store.ts +105 -18
  360. package/src/shared/unsplash-library/UnsplashLibrary.vue +2 -6
  361. package/src/shared/video-library/VideoLibrary.vue +1 -1
@@ -13,9 +13,19 @@ import type {
13
13
  FooterSocialLinkItem,
14
14
  } from '../parsers/ai-toolcall-parser';
15
15
  import type { Logger } from '../logger';
16
- import type { TextStyleOptions } from '../../brand-page/models/styles.model';
16
+ import type {
17
+ TextStyleDeclaration,
18
+ TextStyleOptions,
19
+ } from '../../brand-page/models/styles.model';
17
20
  import { FOOTER_CHECKS } from './section-rules/footer.rules';
18
- import { applyDetachedStyleOverride } from './section-field-utils';
21
+ import {
22
+ applyDetachedStyleOverride,
23
+ normalizeStyleValue,
24
+ } from './section-field-utils';
25
+
26
+ type FooterSocialLink = NonNullable<
27
+ AbstractPageFooterStyles['socialLinks']
28
+ >[number];
19
29
 
20
30
  const normaliseSocialUrl = (url: string): string => {
21
31
  for (const prefix of ['mailto:', 'tel:']) {
@@ -25,107 +35,142 @@ const normaliseSocialUrl = (url: string): string => {
25
35
  return url;
26
36
  };
27
37
 
28
- const applyGlobalFooterChanges = (
29
- footer: AbstractPageFooterStyles,
38
+ const makeSocialLink = (
39
+ icon: string | undefined,
40
+ url: string | undefined,
41
+ ): FooterSocialLink =>
42
+ ({
43
+ imageUrl: icon || '',
44
+ url: normaliseSocialUrl(url || ''),
45
+ imageTitle: '',
46
+ width: 0,
47
+ height: 0,
48
+ imageLink: '',
49
+ }) as FooterSocialLink;
50
+
51
+ const hasSocialLinkMutation = (args: UpdateFooterArguments): boolean =>
52
+ args._replace_social_links === true ||
53
+ (args._remove_social_link_indices?.length ?? 0) > 0 ||
54
+ (args._reorder_social_links?.length ?? 0) > 0 ||
55
+ (args.social_links?.length ?? 0) > 0;
56
+
57
+ /**
58
+ * Social links are a GLOBAL footer concern — one logical list that both
59
+ * viewports render identically. Derive the new list ONCE from the current one
60
+ * WITHOUT mutating the input, so the caller can assign an independent copy to
61
+ * each viewport.
62
+ *
63
+ * Why this can't mutate per-viewport in place: footers migrated from the legacy
64
+ * single `footerStyles` model (migration-01) share ONE `socialLinks` array
65
+ * reference across pageFooterDesktop and pageFooterMobile, and `cloneDeep`
66
+ * preserves that shared reference. Running an in-place `splice` once per
67
+ * viewport therefore applies it TWICE to the same array — e.g. one requested
68
+ * removal index drops two links. Compute-once + assign-fresh is correct for
69
+ * both shared (legacy) and independent (new-model) footers.
70
+ */
71
+ const computeSocialLinks = (
72
+ current: FooterSocialLink[] | undefined,
30
73
  args: UpdateFooterArguments,
31
- textStyleOptions: TextStyleOptions | undefined,
32
- ): void => {
33
- if (args.copyright_text !== undefined)
34
- footer.copyrightText = args.copyright_text;
35
-
36
- if (args.copyright_text_font_family !== undefined)
37
- footer.copyrightStyle = applyDetachedStyleOverride(
38
- footer.copyrightStyle,
39
- { fontFamily: args.copyright_text_font_family },
40
- textStyleOptions,
74
+ ): FooterSocialLink[] => {
75
+ // _replace_social_links: replace entire list (empty/absent social_links = clear all).
76
+ // A replacement supersedes every other social link mutation.
77
+ if (args._replace_social_links) {
78
+ return (args.social_links ?? []).map((l) =>
79
+ makeSocialLink(l.social_link_icon, l.url),
41
80
  );
81
+ }
42
82
 
43
- const links = args.social_links;
83
+ const links: FooterSocialLink[] = [...(current ?? [])];
44
84
 
45
- // _replace_social_links: replace entire list (empty/absent social_links = clear all).
46
- // When replacing, all other social link mutations (remove, insert, reorder) are skipped —
47
- // they are superseded by the replacement and running them would cause duplicates.
48
- if (args._replace_social_links) {
49
- footer.socialLinks = (links ?? []).map((l) => ({
50
- imageUrl: l.social_link_icon || '',
51
- url: normaliseSocialUrl(l.url || ''),
52
- imageTitle: '',
53
- width: 0,
54
- height: 0,
55
- imageLink: '',
56
- }));
57
- } else {
58
- // Targeted mutations — only run when NOT replacing the entire list.
59
-
60
- // item_index-based updates for existing links
61
- if (links?.length) {
62
- for (const link of links) {
63
- if (link.item_index === undefined) continue;
64
-
65
- const existing = footer.socialLinks?.[link.item_index];
66
-
67
- if (!existing) continue;
68
-
69
- if (link.social_link_icon !== undefined)
70
- existing.imageUrl = link.social_link_icon;
71
-
72
- if (link.url !== undefined) existing.url = normaliseSocialUrl(link.url);
73
- }
74
- }
85
+ // item_index-based updates for existing links — replace the item reference
86
+ // (never mutate the original object, which may be shared across viewports).
87
+ for (const link of args.social_links ?? []) {
88
+ if (link.item_index === undefined) continue;
75
89
 
76
- // Remove by index (descending order to preserve indices during splice)
77
- if (args._remove_social_link_indices?.length && footer.socialLinks) {
78
- const sorted = [...args._remove_social_link_indices].sort(
79
- (a, b) => b - a,
80
- );
90
+ const existing = links[link.item_index];
91
+
92
+ if (!existing) continue;
93
+
94
+ links[link.item_index] = {
95
+ ...existing,
96
+ ...(link.social_link_icon !== undefined
97
+ ? { imageUrl: link.social_link_icon }
98
+ : {}),
99
+ ...(link.url !== undefined ? { url: normaliseSocialUrl(link.url) } : {}),
100
+ };
101
+ }
102
+
103
+ // Remove by index (descending order to preserve indices during splice).
104
+ if (args._remove_social_link_indices?.length) {
105
+ const sorted = [...args._remove_social_link_indices].sort((a, b) => b - a);
81
106
 
82
- for (const idx of sorted) {
83
- if (idx >= 0 && idx < footer.socialLinks.length)
84
- footer.socialLinks.splice(idx, 1);
85
- }
107
+ for (const idx of sorted) {
108
+ if (idx >= 0 && idx < links.length) links.splice(idx, 1);
86
109
  }
110
+ }
87
111
 
88
- // Insert new links (descending insert_at order to preserve positions during splice)
89
- const insertLinks = (links ?? []).filter(
90
- (l): l is FooterSocialLinkItem & { insert_at: number } =>
91
- l.insert_at !== undefined && l.item_index === undefined,
92
- );
93
- const sortedInserts = [...insertLinks].sort(
94
- (a, b) => b.insert_at - a.insert_at,
95
- );
112
+ // Insert new links (descending insert_at order to preserve positions).
113
+ const insertLinks = (args.social_links ?? []).filter(
114
+ (l): l is FooterSocialLinkItem & { insert_at: number } =>
115
+ l.insert_at !== undefined && l.item_index === undefined,
116
+ );
117
+ const sortedInserts = [...insertLinks].sort(
118
+ (a, b) => b.insert_at - a.insert_at,
119
+ );
96
120
 
97
- for (const link of sortedInserts) {
98
- const pos = Math.max(
99
- 0,
100
- Math.min(link.insert_at, footer.socialLinks?.length ?? 0),
101
- );
121
+ for (const link of sortedInserts) {
122
+ const pos = Math.max(0, Math.min(link.insert_at, links.length));
102
123
 
103
- footer.socialLinks = footer.socialLinks ?? [];
104
- footer.socialLinks.splice(pos, 0, {
105
- imageUrl: link.social_link_icon || '',
106
- url: normaliseSocialUrl(link.url || ''),
107
- imageTitle: '',
108
- width: 0,
109
- height: 0,
110
- imageLink: '',
111
- });
124
+ links.splice(pos, 0, makeSocialLink(link.social_link_icon, link.url));
125
+ }
126
+
127
+ // Reorder (requires ALL indices — partial reorder is not supported).
128
+ if (args._reorder_social_links?.length) {
129
+ const newOrder = args._reorder_social_links;
130
+ const unique = new Set(newOrder);
131
+
132
+ if (
133
+ unique.size === newOrder.length &&
134
+ newOrder.every((idx) => idx >= 0 && idx < links.length)
135
+ ) {
136
+ const reordered = newOrder.map((idx) => links[idx]);
137
+
138
+ if (reordered.length === links.length) return reordered;
112
139
  }
140
+ }
113
141
 
114
- // Reorder (requires ALL indices — partial reorder is not supported)
115
- if (args._reorder_social_links?.length && footer.socialLinks) {
116
- const newOrder = args._reorder_social_links;
117
- const unique = new Set(newOrder);
142
+ return links;
143
+ };
118
144
 
119
- if (
120
- unique.size === newOrder.length &&
121
- newOrder.every((idx) => idx >= 0 && idx < footer.socialLinks!.length)
122
- ) {
123
- const reordered = newOrder.map((idx) => footer.socialLinks![idx]);
145
+ const applyGlobalFooterChanges = (
146
+ footer: AbstractPageFooterStyles,
147
+ args: UpdateFooterArguments,
148
+ textStyleOptions: TextStyleOptions | undefined,
149
+ ): void => {
150
+ if (args.copyright_text !== undefined)
151
+ footer.copyrightText = args.copyright_text;
152
+
153
+ // copyright_text_style is the same text-style object sections use (typography
154
+ // + colour). Normalise each value the way section styles are normalised
155
+ // (letterSpacing int→em, lineHeight snap, null→''), then detach from the
156
+ // global preset via the override helper so a single call resolves the preset
157
+ // and clears textStyleType once — see resolveGlobalPresetIntoStyle (BP-5420).
158
+ if (args.copyright_text_style) {
159
+ const updates: Partial<TextStyleDeclaration> = {};
124
160
 
125
- if (reordered.length === footer.socialLinks.length)
126
- footer.socialLinks = reordered;
127
- }
161
+ for (const [key, value] of Object.entries(args.copyright_text_style)) {
162
+ const normalized = normalizeStyleValue(key, value);
163
+
164
+ if (normalized !== undefined)
165
+ (updates as Record<string, unknown>)[key] = normalized;
128
166
  }
167
+
168
+ if (Object.keys(updates).length > 0)
169
+ footer.copyrightStyle = applyDetachedStyleOverride(
170
+ footer.copyrightStyle,
171
+ updates,
172
+ textStyleOptions,
173
+ );
129
174
  }
130
175
  };
131
176
 
@@ -150,12 +195,6 @@ const applyViewportFooterChanges = (
150
195
  fill: overrides.icon_color,
151
196
  };
152
197
 
153
- if (overrides.copyright_text_color !== undefined)
154
- footer.copyrightStyle = {
155
- ...footer.copyrightStyle,
156
- color: overrides.copyright_text_color,
157
- };
158
-
159
198
  if (overrides.is_logo_visible !== undefined)
160
199
  footer.isLogoVisible = overrides.is_logo_visible;
161
200
 
@@ -207,13 +246,30 @@ export class FooterBuilder extends BaseMetadataBuilder<UpdateFooterArguments> {
207
246
  const args = this.request.payload ?? {};
208
247
  const textStyleOptions = model.styles?.textStyles?.textStyleOptions;
209
248
 
210
- // Global fields (copyright_text, social links) always apply to both viewports.
249
+ // Global scalar/style fields (copyright text + font) apply to both
250
+ // viewports. These are idempotent assignments, safe to run per-viewport.
211
251
  if (model.pageFooterDesktop)
212
252
  applyGlobalFooterChanges(model.pageFooterDesktop, args, textStyleOptions);
213
253
 
214
254
  if (model.pageFooterMobile)
215
255
  applyGlobalFooterChanges(model.pageFooterMobile, args, textStyleOptions);
216
256
 
257
+ // Social links are a single global list. Derive the new list ONCE, then
258
+ // assign an INDEPENDENT copy to each viewport — never mutate a (possibly
259
+ // shared) viewport array in place. See computeSocialLinks.
260
+ if (hasSocialLinkMutation(args)) {
261
+ const current =
262
+ model.pageFooterDesktop?.socialLinks ??
263
+ model.pageFooterMobile?.socialLinks;
264
+ const updated = computeSocialLinks(current, args);
265
+
266
+ if (model.pageFooterDesktop)
267
+ model.pageFooterDesktop.socialLinks = updated.map((l) => ({ ...l }));
268
+
269
+ if (model.pageFooterMobile)
270
+ model.pageFooterMobile.socialLinks = updated.map((l) => ({ ...l }));
271
+ }
272
+
217
273
  // Viewport-specific styling via explicit sub-objects.
218
274
  if (args.desktop && model.pageFooterDesktop)
219
275
  applyViewportFooterChanges(model.pageFooterDesktop, args.desktop);
@@ -46,7 +46,7 @@ const mergeGalleryImages = (
46
46
  const existing = content.images?.[index];
47
47
  const imageUrl = isValidUrl(img.image_url)
48
48
  ? img.image_url!
49
- : existing?.imageUrl ?? '';
49
+ : (existing?.imageUrl ?? '');
50
50
 
51
51
  return {
52
52
  ...(existing || {}),
@@ -80,7 +80,7 @@ const mergeImageItems = (
80
80
  ...(existing || {}),
81
81
  imageUrl: isValidUrl(item.image_url)
82
82
  ? item.image_url!
83
- : existing?.imageUrl ?? '',
83
+ : (existing?.imageUrl ?? ''),
84
84
  imageTitle: existing?.imageTitle ?? '',
85
85
  width: existing?.width ?? 0,
86
86
  height: existing?.height ?? 0,
@@ -128,7 +128,7 @@ const mergeTestimonialItemsAsync = async (
128
128
  ? 'shape'
129
129
  : item.avatar_image_url
130
130
  ? 'image'
131
- : existing?.mediaType ?? 'image';
131
+ : (existing?.mediaType ?? 'image');
132
132
 
133
133
  return {
134
134
  ...(existing || {}),
@@ -128,7 +128,7 @@ const mergeTextItems = (
128
128
  ) as TextStyleDeclaration;
129
129
 
130
130
  const resolved = item.text !== undefined ? resolveText(item.text) : null;
131
- const text = resolved ? resolved.html : existing?.text ?? '';
131
+ const text = resolved ? resolved.html : (existing?.text ?? '');
132
132
 
133
133
  return {
134
134
  text,
@@ -109,7 +109,7 @@ export const applyScalarFields = (
109
109
  * - null → '' (explicitly clear/reset the property)
110
110
  * - everything else passes through as-is
111
111
  */
112
- const normalizeStyleValue = (key: string, value: unknown): unknown => {
112
+ export const normalizeStyleValue = (key: string, value: unknown): unknown => {
113
113
  if (value === null) return '';
114
114
 
115
115
  if (value === undefined) return undefined;
@@ -68,8 +68,8 @@ export const applyColorThemeToReplacements = (
68
68
  replacementColor:
69
69
  replacements.length === 1
70
70
  ? colorTheme
71
- : getNewColorBasedOnTargetColorTheme(
71
+ : (getNewColorBasedOnTargetColorTheme(
72
72
  r.originalColor,
73
73
  colorTheme,
74
- )?.toString() ?? colorTheme,
74
+ )?.toString() ?? colorTheme),
75
75
  }));
@@ -4,7 +4,7 @@ import type {
4
4
  HeaderDisplayStyle,
5
5
  NavigationDisplayType,
6
6
  } from '../../brand-page/constants';
7
- import type { SectionType } from './section-tool-arguments';
7
+ import type { SectionType, TextStyleArguments } from './section-tool-arguments';
8
8
 
9
9
  // Tool names — must match the function names generated by the AI pipeline.
10
10
  // Text element tools use camelCase names.
@@ -215,7 +215,6 @@ export interface FooterSocialLinkItem {
215
215
  export interface ViewportFooterOverrides {
216
216
  display_style?: FooterDisplayStyle;
217
217
  background_color?: string | null;
218
- copyright_text_color?: string;
219
218
  icon_color?: string;
220
219
  is_logo_visible?: boolean;
221
220
  logo_image_height?: string;
@@ -224,7 +223,8 @@ export interface ViewportFooterOverrides {
224
223
 
225
224
  export interface UpdateFooterArguments {
226
225
  copyright_text?: string;
227
- copyright_text_font_family?: string;
226
+ /** Copyright line text-style object (typography + colour) — same shape as a section's *_style. Global: applies to both viewports. */
227
+ copyright_text_style?: TextStyleArguments;
228
228
  social_links?: FooterSocialLinkItem[];
229
229
  _replace_social_links?: boolean;
230
230
  _remove_social_link_indices?: number[];
@@ -31,10 +31,10 @@ export interface AddressDetails {
31
31
  export class GoogleMapsPlugin {
32
32
  private initialised = false;
33
33
  private initialising = false;
34
- private readonly _options: GoogleMapsPluginOptions;
34
+ private readonly options: GoogleMapsPluginOptions;
35
35
 
36
36
  constructor(options: GoogleMapsPluginOptions) {
37
- this._options = options;
37
+ this.options = options;
38
38
  }
39
39
 
40
40
  private async initialise(): Promise<void> {
@@ -111,7 +111,7 @@ export class GoogleMapsPlugin {
111
111
  const { PlaceAutocompleteElement } = await this.getPlacesLibrary();
112
112
 
113
113
  return new PlaceAutocompleteElement({
114
- requestedLanguage: this._options.locale,
114
+ requestedLanguage: this.options.locale,
115
115
  ...options,
116
116
  });
117
117
  }
@@ -149,17 +149,17 @@ export class GoogleMapsPlugin {
149
149
  }
150
150
 
151
151
  private getGoogleScriptUrl(): string {
152
- const baseUrl = `https://maps.googleapis.com/maps/api/js?key=${this._options.apiKey}&libraries=places&loading=async`;
152
+ const baseUrl = `https://maps.googleapis.com/maps/api/js?key=${this.options.apiKey}&libraries=places&loading=async`;
153
153
 
154
- return this._options.locale
155
- ? `${baseUrl}&language=${this._options.locale}`
154
+ return this.options.locale
155
+ ? `${baseUrl}&language=${this.options.locale}`
156
156
  : baseUrl;
157
157
  }
158
158
 
159
159
  getEmbedGoogleMapsSrc(options: GetEmbedGoogleMapsOptions): string {
160
160
  const mapMode = options.mapMode || MAP_MODE_PLACE;
161
- const locale = options.locale || this._options.locale;
162
- const baseUrl = `https://www.google.com/maps/embed/v1/${mapMode}?key=${this._options.apiKey}&q=${options.query}`;
161
+ const locale = options.locale || this.options.locale;
162
+ const baseUrl = `https://www.google.com/maps/embed/v1/${mapMode}?key=${this.options.apiKey}&q=${options.query}`;
163
163
 
164
164
  return locale ? `${baseUrl}&language=${locale}` : baseUrl;
165
165
  }
@@ -174,7 +174,7 @@ const isPersonalisationEnabled = computed(
174
174
  );
175
175
  const isDesignCom = computed(() => containerStore.isDesignCom);
176
176
 
177
- const emit = defineEmits(['on-intent-image-replace']);
177
+ defineEmits(['on-intent-image-replace']);
178
178
 
179
179
  const shapeTabs = [
180
180
  backgroundSettingsTr(`background`),
@@ -22,7 +22,7 @@
22
22
  </div>
23
23
  </template>
24
24
  <script setup lang="ts">
25
- import { computed, type PropType } from 'vue';
25
+ import { computed } from 'vue';
26
26
  import { HelloBar } from '@designcrowd/fe-shared-lib';
27
27
  import { useUiBackgroundSettingsStore } from '../../store';
28
28
  import ColorField from '../../../content-settings/components/color-field/ColorField.vue';
@@ -3,15 +3,9 @@ import { Icon } from '@designcrowd/fe-shared-lib';
3
3
  import ColorPickerSwatch from './ColorPickerSwatch.vue';
4
4
  import type { ColorValue, ColorGroupItem, ColorGroup } from '../models';
5
5
  import { DEFAULT_COLORS, DEFAULT_GRADIENT_COLORS } from '../constants';
6
- import {
7
- RGBAtoHex,
8
- hexToRGB,
9
- arrayToLinearGradient,
10
- isRgbColor,
11
- } from '@utils/helpers';
6
+ import { RGBAtoHex, arrayToLinearGradient, isRgbColor } from '@utils/helpers';
12
7
  import { normalizeColorToHex, colorsMatch } from '@brand-page/utils/style.util';
13
8
  import { colorPickerTr } from '@src/composables/useTranslate';
14
- import { useUiStyleSettingsStore } from '../../style-settings/store';
15
9
 
16
10
  // Simple session storage for newColors (persists during browser session, clears on refresh)
17
11
  let sessionNewColors: ColorGroupItem[] = [];
@@ -53,6 +47,7 @@ export default defineComponent({
53
47
  default: () => false,
54
48
  },
55
49
  },
50
+ emits: ['on-color-select'],
56
51
  data() {
57
52
  const groups: ColorGroup[] = [];
58
53
  const newColors: ColorGroupItem[] = [];
@@ -7,6 +7,7 @@ export default defineComponent({
7
7
  required: true,
8
8
  },
9
9
  },
10
+ emits: ['click'],
10
11
  data() {
11
12
  const styles: BrandPageCssStyle = this.color.styles;
12
13
 
@@ -53,6 +53,7 @@ export default {
53
53
  default: 1,
54
54
  },
55
55
  },
56
+ emits: ['update:model-value'],
56
57
  data() {
57
58
  return {
58
59
  priceValue: this.modelValue,
@@ -33,9 +33,9 @@
33
33
  </template>
34
34
  <script setup lang="ts">
35
35
  import { Button } from '@designcrowd/fe-shared-lib';
36
- import { tr, commonTr } from '@src/composables/useTranslate';
36
+ import { commonTr } from '@src/composables/useTranslate';
37
37
 
38
- const props = defineProps({
38
+ defineProps({
39
39
  showBackButton: {
40
40
  type: Boolean,
41
41
  required: false,
@@ -14,6 +14,7 @@ export default defineComponent({
14
14
  required: false,
15
15
  },
16
16
  },
17
+ emits: ['confirm', 'cancel'],
17
18
  setup() {
18
19
  const containerStore = useBrandPageContainerStore();
19
20
 
@@ -1,3 +1,4 @@
1
+ <!-- eslint-disable vue/no-v-html -->
1
2
  <template>
2
3
  <div data-component="booking-url-field">
3
4
  <div
@@ -137,6 +137,7 @@ const props = withDefaults(defineProps<Props>(), {
137
137
  titleLength: MAX_TITLE_LENGTH,
138
138
  descriptionLength: MAX_DESCRIPTION_LENGTH,
139
139
  isAdmin: false,
140
+ pages: undefined,
140
141
  });
141
142
 
142
143
  const pageSettingsStore = useUiPageSettingsStore();
@@ -70,14 +70,7 @@
70
70
  </template>
71
71
 
72
72
  <script setup lang="ts">
73
- import {
74
- ref,
75
- computed,
76
- watch,
77
- onMounted,
78
- onBeforeMount,
79
- type PropType,
80
- } from 'vue';
73
+ import { ref, computed, watch, onMounted, onBeforeMount } from 'vue';
81
74
  import { Toggle } from '@designcrowd/fe-shared-lib';
82
75
  import {
83
76
  addTransparentAlphaChannelToHex,
@@ -320,8 +313,8 @@ onBeforeMount(() => {
320
313
  onMounted(() => {
321
314
  const toggleState = Boolean(
322
315
  color.value &&
323
- typeof color.value === 'string' &&
324
- !isHexTransparent(color.value),
316
+ typeof color.value === 'string' &&
317
+ !isHexTransparent(color.value),
325
318
  );
326
319
 
327
320
  emit('on-toggle-state-change', toggleState);
@@ -17,7 +17,6 @@ import {
17
17
  import { SIDE_BAR_CONTENT_ID } from '../../constants';
18
18
  import type { ComponentPublicInstance } from '@vue/runtime-core';
19
19
  import {
20
- EVENTS,
21
20
  SELECT_LOCATIONS,
22
21
  useEventTracker,
23
22
  } from '@brand-page-maker/composables/useEventTracker';
@@ -37,6 +36,7 @@ interface CategoryTab {
37
36
  }
38
37
 
39
38
  export default defineComponent({
39
+ emits: ['capture-preview-snapshot'],
40
40
  setup() {
41
41
  const brandPageMakerStore = useBrandPageMakerStore();
42
42
  const contentSettingsStore = useUiContentSettingsStore();
@@ -41,6 +41,7 @@ export default {
41
41
  required: true,
42
42
  },
43
43
  },
44
+ emits: ['on-click'],
44
45
  methods: {
45
46
  onClick(ev) {
46
47
  this.$emit('on-click', ev);
@@ -49,6 +49,11 @@ export default defineComponent({
49
49
  required: true,
50
50
  },
51
51
  },
52
+ emits: [
53
+ 'on-delete',
54
+ 'capture-snapshot-before-modal',
55
+ 'capture-preview-snapshot',
56
+ ],
52
57
  setup() {
53
58
  const contentSettingsStore = useUiContentSettingsStore();
54
59
  const sideBarStore = useUiSideBarStore();
@@ -16,7 +16,6 @@ import { SIDE_BAR_TAB_NAMES } from '@brand-page-maker/constants';
16
16
  import { ITEM_FIELD_TYPES, type ItemFieldType } from '@brand-page-maker/models';
17
17
  import { useUiPageSettingsStore } from '../../../page-settings/store';
18
18
  import { PAGE_SECTIONS } from '../../../page-settings/models';
19
- import { commonTr } from '@src/composables/useTranslate';
20
19
  import {
21
20
  getPlainTextFromRTE,
22
21
  replaceTextInRTE,
@@ -26,19 +25,6 @@ import {
26
25
  import { isDefaultContentText } from '@shared/content-settings/utils';
27
26
  import { useUiLogoSettingsStore } from '../../../logo-settings/store';
28
27
 
29
- const RTE_DISALLOWED_STYLE_FIELD_NAMES = [
30
- 'descriptionStyle',
31
- 'titleStyle',
32
- 'textStyle',
33
- 'paragraphStyle',
34
- ];
35
- const AI_ALLOWED_SECTION_TYPES = [
36
- 'banner-section',
37
- 'text',
38
- 'about-section',
39
- 'testimonials-section',
40
- ];
41
- const AI_ALLOWED_FIELD_NAMES = ['description', 'title', 'text', 'paragraph'];
42
28
  const RTE_DISALLOWED_FIELD_NAMES = ['buttonText'];
43
29
 
44
30
  export default defineComponent({
@@ -62,6 +48,7 @@ export default defineComponent({
62
48
  default: undefined,
63
49
  },
64
50
  },
51
+ emits: ['capture-preview-snapshot'],
65
52
  setup() {
66
53
  const contentSettingsStore = useUiContentSettingsStore();
67
54
  const brandPageMakerStore = useBrandPageMakerStore();
@@ -25,20 +25,18 @@ import {
25
25
  type PersonalisationRole,
26
26
  } from '@brand-page';
27
27
  import { buildRelativePathFromParams } from '@brand-page/utils/route.util';
28
- import {
29
- switchAllContentToRTE,
30
- isRTEManagedStyleField,
31
- } from '@brand-page-maker/utils';
28
+ import { isRTEManagedStyleField } from '@brand-page-maker/utils';
32
29
  import { useUiPageSettingsStore } from '@shared/page-settings/store';
33
30
  import { useExternalRichTextEditor } from '@brand-page-maker/composables/rich-text-editor/useRichTextEditor';
34
31
  import { useUiStyleSettingsStore } from '@shared/style-settings/store';
35
32
 
36
33
  export default defineComponent({
34
+ emits: ['capture-preview-snapshot'],
37
35
  setup() {
38
36
  const contentSettingsStore = useUiContentSettingsStore();
39
37
  const brandPageMakerStore = useBrandPageMakerStore();
40
- const pageSettingsStore = useUiPageSettingsStore();
41
- const styleSettingsStore = useUiStyleSettingsStore();
38
+ const _pageSettingsStore = useUiPageSettingsStore();
39
+ const _styleSettingsStore = useUiStyleSettingsStore();
42
40
 
43
41
  const userStore = useBrandPageMakerUserStore();
44
42
  const uiStore = useUiStore();