@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
package/lib/src/lib.js CHANGED
@@ -32,7 +32,7 @@ export { getOptimalLogoSize, calculateOptimizedLogoDimensions, applyLogoImageBas
32
32
  export { sanitizeRTEHtml } from './brand-page-maker/utils';
33
33
  export { getPageSlugFromPageTitle } from './brand-page-maker/utils/slug.util';
34
34
  // stores
35
- export { useBrandPageMakerStore, useBrandPageMakerUserStore, useUiStore, useBrandPageContainerStore, useEventManagerStore, useLocalisedRouteStore, useVideoStore, } from './brand-page-maker/stores';
35
+ export { useBrandPageMakerStore, useBrandPageMakerUserStore, useUiStore, useBrandPageContainerStore, useEventManagerStore, useLocalisedRouteStore, useVideoStore, useRouteStore, } from './brand-page-maker/stores';
36
36
  export { useShopConfigStore } from './shared/ecommerce-settings/store/shop-settings-store';
37
37
  // for jest, need to set active pinia in library.brand-page as well
38
38
  import { createPinia, setActivePinia } from 'pinia';
@@ -1,7 +1,7 @@
1
1
  import {} from '../../brand-page/models';
2
2
  import { BaseMetadataBuilder, } from '../models';
3
3
  import { FOOTER_CHECKS } from './section-rules/footer.rules';
4
- import { applyDetachedStyleOverride } from './section-field-utils';
4
+ import { applyDetachedStyleOverride, normalizeStyleValue, } from './section-field-utils';
5
5
  const normaliseSocialUrl = (url) => {
6
6
  for (const prefix of ['mailto:', 'tel:']) {
7
7
  if (url.startsWith(prefix))
@@ -9,75 +9,100 @@ const normaliseSocialUrl = (url) => {
9
9
  }
10
10
  return url;
11
11
  };
12
- const applyGlobalFooterChanges = (footer, args, textStyleOptions) => {
13
- if (args.copyright_text !== undefined)
14
- footer.copyrightText = args.copyright_text;
15
- if (args.copyright_text_font_family !== undefined)
16
- footer.copyrightStyle = applyDetachedStyleOverride(footer.copyrightStyle, { fontFamily: args.copyright_text_font_family }, textStyleOptions);
17
- const links = args.social_links;
12
+ const makeSocialLink = (icon, url) => ({
13
+ imageUrl: icon || '',
14
+ url: normaliseSocialUrl(url || ''),
15
+ imageTitle: '',
16
+ width: 0,
17
+ height: 0,
18
+ imageLink: '',
19
+ });
20
+ const hasSocialLinkMutation = (args) => args._replace_social_links === true ||
21
+ (args._remove_social_link_indices?.length ?? 0) > 0 ||
22
+ (args._reorder_social_links?.length ?? 0) > 0 ||
23
+ (args.social_links?.length ?? 0) > 0;
24
+ /**
25
+ * Social links are a GLOBAL footer concern — one logical list that both
26
+ * viewports render identically. Derive the new list ONCE from the current one
27
+ * WITHOUT mutating the input, so the caller can assign an independent copy to
28
+ * each viewport.
29
+ *
30
+ * Why this can't mutate per-viewport in place: footers migrated from the legacy
31
+ * single `footerStyles` model (migration-01) share ONE `socialLinks` array
32
+ * reference across pageFooterDesktop and pageFooterMobile, and `cloneDeep`
33
+ * preserves that shared reference. Running an in-place `splice` once per
34
+ * viewport therefore applies it TWICE to the same array — e.g. one requested
35
+ * removal index drops two links. Compute-once + assign-fresh is correct for
36
+ * both shared (legacy) and independent (new-model) footers.
37
+ */
38
+ const computeSocialLinks = (current, args) => {
18
39
  // _replace_social_links: replace entire list (empty/absent social_links = clear all).
19
- // When replacing, all other social link mutations (remove, insert, reorder) are skipped —
20
- // they are superseded by the replacement and running them would cause duplicates.
40
+ // A replacement supersedes every other social link mutation.
21
41
  if (args._replace_social_links) {
22
- footer.socialLinks = (links ?? []).map((l) => ({
23
- imageUrl: l.social_link_icon || '',
24
- url: normaliseSocialUrl(l.url || ''),
25
- imageTitle: '',
26
- width: 0,
27
- height: 0,
28
- imageLink: '',
29
- }));
42
+ return (args.social_links ?? []).map((l) => makeSocialLink(l.social_link_icon, l.url));
30
43
  }
31
- else {
32
- // Targeted mutations — only run when NOT replacing the entire list.
33
- // item_index-based updates for existing links
34
- if (links?.length) {
35
- for (const link of links) {
36
- if (link.item_index === undefined)
37
- continue;
38
- const existing = footer.socialLinks?.[link.item_index];
39
- if (!existing)
40
- continue;
41
- if (link.social_link_icon !== undefined)
42
- existing.imageUrl = link.social_link_icon;
43
- if (link.url !== undefined)
44
- existing.url = normaliseSocialUrl(link.url);
45
- }
46
- }
47
- // Remove by index (descending order to preserve indices during splice)
48
- if (args._remove_social_link_indices?.length && footer.socialLinks) {
49
- const sorted = [...args._remove_social_link_indices].sort((a, b) => b - a);
50
- for (const idx of sorted) {
51
- if (idx >= 0 && idx < footer.socialLinks.length)
52
- footer.socialLinks.splice(idx, 1);
53
- }
44
+ const links = [...(current ?? [])];
45
+ // item_index-based updates for existing links — replace the item reference
46
+ // (never mutate the original object, which may be shared across viewports).
47
+ for (const link of args.social_links ?? []) {
48
+ if (link.item_index === undefined)
49
+ continue;
50
+ const existing = links[link.item_index];
51
+ if (!existing)
52
+ continue;
53
+ links[link.item_index] = {
54
+ ...existing,
55
+ ...(link.social_link_icon !== undefined
56
+ ? { imageUrl: link.social_link_icon }
57
+ : {}),
58
+ ...(link.url !== undefined ? { url: normaliseSocialUrl(link.url) } : {}),
59
+ };
60
+ }
61
+ // Remove by index (descending order to preserve indices during splice).
62
+ if (args._remove_social_link_indices?.length) {
63
+ const sorted = [...args._remove_social_link_indices].sort((a, b) => b - a);
64
+ for (const idx of sorted) {
65
+ if (idx >= 0 && idx < links.length)
66
+ links.splice(idx, 1);
54
67
  }
55
- // Insert new links (descending insert_at order to preserve positions during splice)
56
- const insertLinks = (links ?? []).filter((l) => l.insert_at !== undefined && l.item_index === undefined);
57
- const sortedInserts = [...insertLinks].sort((a, b) => b.insert_at - a.insert_at);
58
- for (const link of sortedInserts) {
59
- const pos = Math.max(0, Math.min(link.insert_at, footer.socialLinks?.length ?? 0));
60
- footer.socialLinks = footer.socialLinks ?? [];
61
- footer.socialLinks.splice(pos, 0, {
62
- imageUrl: link.social_link_icon || '',
63
- url: normaliseSocialUrl(link.url || ''),
64
- imageTitle: '',
65
- width: 0,
66
- height: 0,
67
- imageLink: '',
68
- });
68
+ }
69
+ // Insert new links (descending insert_at order to preserve positions).
70
+ const insertLinks = (args.social_links ?? []).filter((l) => l.insert_at !== undefined && l.item_index === undefined);
71
+ const sortedInserts = [...insertLinks].sort((a, b) => b.insert_at - a.insert_at);
72
+ for (const link of sortedInserts) {
73
+ const pos = Math.max(0, Math.min(link.insert_at, links.length));
74
+ links.splice(pos, 0, makeSocialLink(link.social_link_icon, link.url));
75
+ }
76
+ // Reorder (requires ALL indices — partial reorder is not supported).
77
+ if (args._reorder_social_links?.length) {
78
+ const newOrder = args._reorder_social_links;
79
+ const unique = new Set(newOrder);
80
+ if (unique.size === newOrder.length &&
81
+ newOrder.every((idx) => idx >= 0 && idx < links.length)) {
82
+ const reordered = newOrder.map((idx) => links[idx]);
83
+ if (reordered.length === links.length)
84
+ return reordered;
69
85
  }
70
- // Reorder (requires ALL indices — partial reorder is not supported)
71
- if (args._reorder_social_links?.length && footer.socialLinks) {
72
- const newOrder = args._reorder_social_links;
73
- const unique = new Set(newOrder);
74
- if (unique.size === newOrder.length &&
75
- newOrder.every((idx) => idx >= 0 && idx < footer.socialLinks.length)) {
76
- const reordered = newOrder.map((idx) => footer.socialLinks[idx]);
77
- if (reordered.length === footer.socialLinks.length)
78
- footer.socialLinks = reordered;
79
- }
86
+ }
87
+ return links;
88
+ };
89
+ const applyGlobalFooterChanges = (footer, args, textStyleOptions) => {
90
+ if (args.copyright_text !== undefined)
91
+ footer.copyrightText = args.copyright_text;
92
+ // copyright_text_style is the same text-style object sections use (typography
93
+ // + colour). Normalise each value the way section styles are normalised
94
+ // (letterSpacing int→em, lineHeight snap, null→''), then detach from the
95
+ // global preset via the override helper so a single call resolves the preset
96
+ // and clears textStyleType once — see resolveGlobalPresetIntoStyle (BP-5420).
97
+ if (args.copyright_text_style) {
98
+ const updates = {};
99
+ for (const [key, value] of Object.entries(args.copyright_text_style)) {
100
+ const normalized = normalizeStyleValue(key, value);
101
+ if (normalized !== undefined)
102
+ updates[key] = normalized;
80
103
  }
104
+ if (Object.keys(updates).length > 0)
105
+ footer.copyrightStyle = applyDetachedStyleOverride(footer.copyrightStyle, updates, textStyleOptions);
81
106
  }
82
107
  };
83
108
  const applyViewportFooterChanges = (footer, overrides) => {
@@ -95,11 +120,6 @@ const applyViewportFooterChanges = (footer, overrides) => {
95
120
  color: overrides.icon_color,
96
121
  fill: overrides.icon_color,
97
122
  };
98
- if (overrides.copyright_text_color !== undefined)
99
- footer.copyrightStyle = {
100
- ...footer.copyrightStyle,
101
- color: overrides.copyright_text_color,
102
- };
103
123
  if (overrides.is_logo_visible !== undefined)
104
124
  footer.isLogoVisible = overrides.is_logo_visible;
105
125
  if (overrides.logo_image_height !== undefined)
@@ -136,11 +156,24 @@ export class FooterBuilder extends BaseMetadataBuilder {
136
156
  }
137
157
  const args = this.request.payload ?? {};
138
158
  const textStyleOptions = model.styles?.textStyles?.textStyleOptions;
139
- // Global fields (copyright_text, social links) always apply to both viewports.
159
+ // Global scalar/style fields (copyright text + font) apply to both
160
+ // viewports. These are idempotent assignments, safe to run per-viewport.
140
161
  if (model.pageFooterDesktop)
141
162
  applyGlobalFooterChanges(model.pageFooterDesktop, args, textStyleOptions);
142
163
  if (model.pageFooterMobile)
143
164
  applyGlobalFooterChanges(model.pageFooterMobile, args, textStyleOptions);
165
+ // Social links are a single global list. Derive the new list ONCE, then
166
+ // assign an INDEPENDENT copy to each viewport — never mutate a (possibly
167
+ // shared) viewport array in place. See computeSocialLinks.
168
+ if (hasSocialLinkMutation(args)) {
169
+ const current = model.pageFooterDesktop?.socialLinks ??
170
+ model.pageFooterMobile?.socialLinks;
171
+ const updated = computeSocialLinks(current, args);
172
+ if (model.pageFooterDesktop)
173
+ model.pageFooterDesktop.socialLinks = updated.map((l) => ({ ...l }));
174
+ if (model.pageFooterMobile)
175
+ model.pageFooterMobile.socialLinks = updated.map((l) => ({ ...l }));
176
+ }
144
177
  // Viewport-specific styling via explicit sub-objects.
145
178
  if (args.desktop && model.pageFooterDesktop)
146
179
  applyViewportFooterChanges(model.pageFooterDesktop, args.desktop);
@@ -23,7 +23,7 @@ const mergeGalleryImages = (content, images, replaceAll) => {
23
23
  const existing = content.images?.[index];
24
24
  const imageUrl = isValidUrl(img.image_url)
25
25
  ? img.image_url
26
- : existing?.imageUrl ?? '';
26
+ : (existing?.imageUrl ?? '');
27
27
  return {
28
28
  ...(existing || {}),
29
29
  imageUrl,
@@ -46,7 +46,7 @@ const mergeImageItems = (content, items, replaceAll) => {
46
46
  ...(existing || {}),
47
47
  imageUrl: isValidUrl(item.image_url)
48
48
  ? item.image_url
49
- : existing?.imageUrl ?? '',
49
+ : (existing?.imageUrl ?? ''),
50
50
  imageTitle: existing?.imageTitle ?? '',
51
51
  width: existing?.width ?? 0,
52
52
  height: existing?.height ?? 0,
@@ -67,7 +67,7 @@ const mergeTestimonialItemsAsync = async (content, items, replaceAll) => {
67
67
  ? 'shape'
68
68
  : item.avatar_image_url
69
69
  ? 'image'
70
- : existing?.mediaType ?? 'image';
70
+ : (existing?.mediaType ?? 'image');
71
71
  return {
72
72
  ...(existing || {}),
73
73
  imageUrl,
@@ -53,7 +53,7 @@ const mergeTextItems = (content, items, replaceAll, textStyleOptions) => {
53
53
  const baseStyle = existing?.textStyle || content.textStyle || {};
54
54
  const mergedStyle = (item.text_style ? { ...baseStyle, ...item.text_style } : baseStyle);
55
55
  const resolved = item.text !== undefined ? resolveText(item.text) : null;
56
- const text = resolved ? resolved.html : existing?.text ?? '';
56
+ const text = resolved ? resolved.html : (existing?.text ?? '');
57
57
  return {
58
58
  text,
59
59
  textStyle: clearTextStyleTypeIfTiptap(mergedStyle, resolved?.wasTiptap ?? false, textStyleOptions),
@@ -21,6 +21,13 @@ 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;
24
31
  /**
25
32
  * When an executor is about to mark a content-level text style "custom" by
26
33
  * 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
- const normalizeStyleValue = (key, value) => {
61
+ export 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
- : getNewColorBasedOnTargetColorTheme(r.originalColor, colorTheme)?.toString() ?? colorTheme,
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 } from './section-tool-arguments';
3
+ import type { SectionType, TextStyleArguments } 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";
@@ -111,7 +111,6 @@ export interface FooterSocialLinkItem {
111
111
  export interface ViewportFooterOverrides {
112
112
  display_style?: FooterDisplayStyle;
113
113
  background_color?: string | null;
114
- copyright_text_color?: string;
115
114
  icon_color?: string;
116
115
  is_logo_visible?: boolean;
117
116
  logo_image_height?: string;
@@ -119,7 +118,8 @@ export interface ViewportFooterOverrides {
119
118
  }
120
119
  export interface UpdateFooterArguments {
121
120
  copyright_text?: string;
122
- copyright_text_font_family?: string;
121
+ /** Copyright line text-style object (typography + colour) — same shape as a section's *_style. Global: applies to both viewports. */
122
+ copyright_text_style?: TextStyleArguments;
123
123
  social_links?: FooterSocialLinkItem[];
124
124
  _replace_social_links?: boolean;
125
125
  _remove_social_link_indices?: number[];
@@ -15,7 +15,7 @@ export interface AddressDetails {
15
15
  export declare class GoogleMapsPlugin {
16
16
  private initialised;
17
17
  private initialising;
18
- private readonly _options;
18
+ private readonly options;
19
19
  constructor(options: GoogleMapsPluginOptions);
20
20
  private initialise;
21
21
  private getPlacesLibrary;
@@ -12,9 +12,9 @@ export const PLACE_ID_QUERY_PREFIX = 'place_id:';
12
12
  export class GoogleMapsPlugin {
13
13
  initialised = false;
14
14
  initialising = false;
15
- _options;
15
+ options;
16
16
  constructor(options) {
17
- this._options = options;
17
+ this.options = options;
18
18
  }
19
19
  async initialise() {
20
20
  if (this.initialised || this.initialising) {
@@ -71,7 +71,7 @@ export class GoogleMapsPlugin {
71
71
  async createPlaceAutocompleteElement(options) {
72
72
  const { PlaceAutocompleteElement } = await this.getPlacesLibrary();
73
73
  return new PlaceAutocompleteElement({
74
- requestedLanguage: this._options.locale,
74
+ requestedLanguage: this.options.locale,
75
75
  ...options,
76
76
  });
77
77
  }
@@ -97,15 +97,15 @@ export class GoogleMapsPlugin {
97
97
  return scriptElement;
98
98
  }
99
99
  getGoogleScriptUrl() {
100
- const baseUrl = `https://maps.googleapis.com/maps/api/js?key=${this._options.apiKey}&libraries=places&loading=async`;
101
- return this._options.locale
102
- ? `${baseUrl}&language=${this._options.locale}`
100
+ const baseUrl = `https://maps.googleapis.com/maps/api/js?key=${this.options.apiKey}&libraries=places&loading=async`;
101
+ return this.options.locale
102
+ ? `${baseUrl}&language=${this.options.locale}`
103
103
  : baseUrl;
104
104
  }
105
105
  getEmbedGoogleMapsSrc(options) {
106
106
  const mapMode = options.mapMode || MAP_MODE_PLACE;
107
- const locale = options.locale || this._options.locale;
108
- const baseUrl = `https://www.google.com/maps/embed/v1/${mapMode}?key=${this._options.apiKey}&q=${options.query}`;
107
+ const locale = options.locale || this.options.locale;
108
+ const baseUrl = `https://www.google.com/maps/embed/v1/${mapMode}?key=${this.options.apiKey}&q=${options.query}`;
109
109
  return locale ? `${baseUrl}&language=${locale}` : baseUrl;
110
110
  }
111
111
  }
@@ -148,7 +148,7 @@ declare const _default: import("vue").DefineComponent<import("vue").ExtractPropT
148
148
  wordBreak?: string | undefined;
149
149
  };
150
150
  }[];
151
- personalisationRole?: "website" | "email" | "phone" | "profile" | "about" | "information" | "media" | undefined;
151
+ personalisationRole?: import("../../../../brand-page").PersonalisationRole | undefined;
152
152
  media?: {
153
153
  type: import("../../../../brand-page").MediaTypes;
154
154
  } | undefined;
@@ -200,12 +200,12 @@ declare const _default: import("vue").DefineComponent<import("vue").ExtractPropT
200
200
  }>;
201
201
  userStore: import("pinia").Store<"brandPageMakerUser", import("@brand-page-maker/stores").UserState, {}, {
202
202
  setUserState(payload: {
203
- emailAddress?: string | undefined;
204
- userToken?: string | undefined;
205
- isAdmin?: boolean | undefined;
206
- hasPremiumSubscription?: boolean | undefined;
207
- brandPageCommissionPercentage?: number | undefined;
208
- features?: Partial<import("../../../../constants/ui").UIUserFeatures> | undefined;
203
+ emailAddress?: string;
204
+ userToken?: string;
205
+ isAdmin?: boolean;
206
+ hasPremiumSubscription?: boolean;
207
+ brandPageCommissionPercentage?: number;
208
+ features?: Partial<import("@brand-page-maker/stores").UserFeatures>;
209
209
  }): void;
210
210
  }>;
211
211
  backgroundSettingsStore: import("pinia").Store<"uiBackgroundSettings", import("../../store").BackgroundSettingsState, {
@@ -213,11 +213,11 @@ declare const _default: import("vue").DefineComponent<import("vue").ExtractPropT
213
213
  }, {
214
214
  onBackgroundChanged(): void;
215
215
  setBackgroundStyle({ backgroundStyle, }: {
216
- backgroundStyle: Partial<Omit<BrandPageCssStyle, "backgroundColor">>;
216
+ backgroundStyle: import("../../../../brand-page").BackgroundStyle;
217
217
  }): void;
218
218
  setBackgroundShapes(payload: import("../../../../brand-page").BackgroundShape[]): void;
219
219
  setBackgroundPersonalisationRole(payload: {
220
- personalisationRole: "website" | "email" | "phone" | "profile" | "about" | "information" | "media" | undefined;
220
+ personalisationRole: import("../../../../brand-page").PersonalisationRole | undefined;
221
221
  }): void;
222
222
  setBackgroundShapeStyle(payload: BrandPageCssStyle): void;
223
223
  setPrimaryBackgroundShapeStyle(payload: BrandPageCssStyle): void;
@@ -226,9 +226,9 @@ declare const _default: import("vue").DefineComponent<import("vue").ExtractPropT
226
226
  }): void;
227
227
  addBackgroundShape({ shapeUrl, width, height, aspectRatio, }: {
228
228
  shapeUrl: string;
229
- width?: number | undefined;
230
- height?: number | undefined;
231
- aspectRatio?: number | undefined;
229
+ width?: number;
230
+ height?: number;
231
+ aspectRatio?: number;
232
232
  }): void;
233
233
  deleteBackgroundShape({ shapeIndex }: {
234
234
  shapeIndex: number;
@@ -243,7 +243,7 @@ declare const _default: import("vue").DefineComponent<import("vue").ExtractPropT
243
243
  setBackgroundShapeSettings(payload: import("../../background-settings-models").SetBackgroundShapeSettingsPayload): void;
244
244
  setRecommendedLogoColors(payload: import("../../background-settings-models").SetRecommendedLogoColorsPayload): void;
245
245
  setBackgroundMode(payload: {
246
- backgroundMode: "images" | "edit";
246
+ backgroundMode: import("@brand-page-maker/stores").BrandPageSettingsMode;
247
247
  }): void;
248
248
  setBackgroundMedia(payload: import("../../../my-uploads/models").MediaBaseSelectedPayload): void;
249
249
  removeBackgroundVideo(): void;
@@ -29,9 +29,9 @@ export declare const useUiBackgroundSettingsStore: import("pinia").StoreDefiniti
29
29
  }): void;
30
30
  addBackgroundShape({ shapeUrl, width, height, aspectRatio, }: {
31
31
  shapeUrl: string;
32
- width?: number | undefined;
33
- height?: number | undefined;
34
- aspectRatio?: number | undefined;
32
+ width?: number;
33
+ height?: number;
34
+ aspectRatio?: number;
35
35
  }): void;
36
36
  deleteBackgroundShape({ shapeIndex }: {
37
37
  shapeIndex: number;
@@ -52,7 +52,7 @@ declare const _default: import("vue").DefineComponent<import("vue").ExtractPropT
52
52
  deselectAllColors(): void;
53
53
  onV2ColorPickerChanged(): void;
54
54
  dispatch(color: ColorValue): void;
55
- }, import("vue").ComponentOptionsMixin, import("vue").ComponentOptionsMixin, {}, string, import("vue").PublicProps, Readonly<import("vue").ExtractPropTypes<{
55
+ }, import("vue").ComponentOptionsMixin, import("vue").ComponentOptionsMixin, "on-color-select"[], "on-color-select", import("vue").PublicProps, Readonly<import("vue").ExtractPropTypes<{
56
56
  customGroups: {
57
57
  type: ArrayConstructor;
58
58
  required: false;
@@ -83,7 +83,9 @@ declare const _default: import("vue").DefineComponent<import("vue").ExtractPropT
83
83
  required: false;
84
84
  default: () => boolean;
85
85
  };
86
- }>> & Readonly<{}>, {
86
+ }>> & Readonly<{
87
+ "onOn-color-select"?: ((...args: any[]) => any) | undefined;
88
+ }>, {
87
89
  size: string;
88
90
  customGroups: unknown[];
89
91
  isNewColor: boolean;
@@ -2,10 +2,9 @@ import { defineComponent } from 'vue';
2
2
  import { Icon } from '@designcrowd/fe-shared-lib';
3
3
  import ColorPickerSwatch from './ColorPickerSwatch.vue';
4
4
  import { DEFAULT_COLORS, DEFAULT_GRADIENT_COLORS } from '../constants';
5
- import { RGBAtoHex, hexToRGB, arrayToLinearGradient, isRgbColor, } from '@utils/helpers';
5
+ import { RGBAtoHex, arrayToLinearGradient, isRgbColor } from '@utils/helpers';
6
6
  import { normalizeColorToHex, colorsMatch } from '@brand-page/utils/style.util';
7
7
  import { colorPickerTr } from '@src/composables/useTranslate';
8
- import { useUiStyleSettingsStore } from '../../style-settings/store';
9
8
  // Simple session storage for newColors (persists during browser session, clears on refresh)
10
9
  let sessionNewColors = [];
11
10
  export default defineComponent({
@@ -45,6 +44,7 @@ export default defineComponent({
45
44
  default: () => false,
46
45
  },
47
46
  },
47
+ emits: ['on-color-select'],
48
48
  data() {
49
49
  const groups = [];
50
50
  const newColors = [];
@@ -9,10 +9,12 @@ declare const _default: import("vue").DefineComponent<import("vue").ExtractPropT
9
9
  isTransparent(): boolean;
10
10
  }, {
11
11
  onClick(): void;
12
- }, import("vue").ComponentOptionsMixin, import("vue").ComponentOptionsMixin, {}, string, import("vue").PublicProps, Readonly<import("vue").ExtractPropTypes<{
12
+ }, import("vue").ComponentOptionsMixin, import("vue").ComponentOptionsMixin, "click"[], "click", import("vue").PublicProps, Readonly<import("vue").ExtractPropTypes<{
13
13
  color: {
14
14
  type: ObjectConstructor;
15
15
  required: true;
16
16
  };
17
- }>> & Readonly<{}>, {}, {}, {}, {}, string, import("vue").ComponentProvideOptions, true, {}, any>;
17
+ }>> & Readonly<{
18
+ onClick?: ((...args: any[]) => any) | undefined;
19
+ }>, {}, {}, {}, {}, string, import("vue").ComponentProvideOptions, true, {}, any>;
18
20
  export default _default;
@@ -6,6 +6,7 @@ export default defineComponent({
6
6
  required: true,
7
7
  },
8
8
  },
9
+ emits: ['click'],
9
10
  data() {
10
11
  const styles = this.color.styles;
11
12
  return {
@@ -14,7 +14,7 @@ declare const _default: import("vue").DefineComponent<import("vue").ExtractPropT
14
14
  }, {}, {}, {
15
15
  onCancel(): void;
16
16
  onConfirm(): void;
17
- }, import("vue").ComponentOptionsMixin, import("vue").ComponentOptionsMixin, {}, string, import("vue").PublicProps, Readonly<import("vue").ExtractPropTypes<{
17
+ }, import("vue").ComponentOptionsMixin, import("vue").ComponentOptionsMixin, ("cancel" | "confirm")[], "cancel" | "confirm", import("vue").PublicProps, Readonly<import("vue").ExtractPropTypes<{
18
18
  visible: {
19
19
  type: BooleanConstructor;
20
20
  default: boolean;
@@ -24,7 +24,10 @@ declare const _default: import("vue").DefineComponent<import("vue").ExtractPropT
24
24
  default: undefined;
25
25
  required: false;
26
26
  };
27
- }>> & Readonly<{}>, {
27
+ }>> & Readonly<{
28
+ onCancel?: ((...args: any[]) => any) | undefined;
29
+ onConfirm?: ((...args: any[]) => any) | undefined;
30
+ }>, {
28
31
  description: string;
29
32
  visible: boolean;
30
33
  }, {}, {}, {}, string, import("vue").ComponentProvideOptions, true, {}, any>;
@@ -13,6 +13,7 @@ export default defineComponent({
13
13
  required: false,
14
14
  },
15
15
  },
16
+ emits: ['confirm', 'cancel'],
16
17
  setup() {
17
18
  const containerStore = useBrandPageContainerStore();
18
19
  return {
@@ -1,4 +1,3 @@
1
- /// <reference types="types/lodash-shims" />
2
1
  import type { DebounceHandle } from 'lodash.debounce';
3
2
  import type { PropType } from 'vue';
4
3
  import type { ContentItemFieldSettings } from '../models';