@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
@@ -1,3 +1,4 @@
1
+ <!-- eslint-disable vue/no-v-html -->
1
2
  <template>
2
3
  <div v-if="sanitizeText" class="tw-w-full" :style="data.wrapperStyle">
3
4
  <div
@@ -39,6 +40,7 @@ interface Props {
39
40
  const props = withDefaults(defineProps<Props>(), {
40
41
  element: 'p',
41
42
  textStyle: {} as any,
43
+ slug: undefined,
42
44
  });
43
45
 
44
46
  const data = reactive<{
@@ -60,7 +62,7 @@ const textStyles = computed(() => {
60
62
  });
61
63
 
62
64
  const style = computed<any>(() => {
63
- const { backgroundColor, ...textStyle } = props.textStyle;
65
+ const { backgroundColor: _backgroundColor, ...textStyle } = props.textStyle;
64
66
 
65
67
  return textStyle;
66
68
  });
@@ -1,6 +1,6 @@
1
1
  import { ALIGN_CENTERED, ALIGN_JUSTIFIED } from '../misc.constants';
2
2
  import type { ButtonGroupOption } from '@brand-page-maker/models/button-group.model';
3
- import { tr, commonTr } from '@src/composables/useTranslate';
3
+ import { commonTr } from '@src/composables/useTranslate';
4
4
 
5
5
  export const FOOTER_DISPLAY = {
6
6
  /** @deprecated */
@@ -929,6 +929,10 @@ export class BrandPageModel {
929
929
  // Model version
930
930
  v: number;
931
931
 
932
+ // AI personalisation key persisted with the draft so previews survive login/checkout-back/
933
+ // refresh - content is retrieved by this token (user-agnostic), not regenerated (bp-5742).
934
+ userPromptContentKey?: string;
935
+
932
936
  styles: PageStyles;
933
937
 
934
938
  /** @deprecated */
@@ -44,7 +44,8 @@ export const isStripePaymentIntent = (
44
44
  );
45
45
  };
46
46
 
47
- export interface CreateCartResult<T> {
47
+ // eslint-disable-next-line @typescript-eslint/no-unused-vars
48
+ export interface CreateCartResult<T = unknown> {
48
49
  cartId: string;
49
50
  paymentProviderName: string;
50
51
  paymentProviderExternalId: string;
@@ -1,5 +1,3 @@
1
- import type { PaymentConfig } from './payment.model';
2
-
3
1
  export interface VariantOptionModel {
4
2
  id: string;
5
3
  name: string;
@@ -84,8 +84,7 @@ export type ContentPersonalisationMapping<T extends Content> = {
84
84
  | keyof UserPersonalisationSection
85
85
  | keyof UserPersonalisationItem]?: (keyof T)[];
86
86
  };
87
- export interface UserPersonalisationSectionWithIndices
88
- extends UserPersonalisationSection {
87
+ export interface UserPersonalisationSectionWithIndices extends UserPersonalisationSection {
89
88
  imageIndex: number;
90
89
  shapeIndex: number;
91
90
  itemTitleIndex: number;
@@ -456,6 +456,7 @@ exports[`migration.util > Banner Contents - text Align and Font Family should no
456
456
  },
457
457
  },
458
458
  },
459
+ "userPromptContentKey": undefined,
459
460
  "v": 17,
460
461
  },
461
462
  "useOldLogoRenderSize": true,
@@ -901,6 +902,7 @@ exports[`migration.util > migrateBrandPageModel should return brand page model w
901
902
  },
902
903
  },
903
904
  },
905
+ "userPromptContentKey": undefined,
904
906
  "v": 17,
905
907
  },
906
908
  "useOldLogoRenderSize": true,
@@ -1353,6 +1355,7 @@ exports[`migration.util > migrateBrandPageModel should return brand page model w
1353
1355
  },
1354
1356
  },
1355
1357
  },
1358
+ "userPromptContentKey": undefined,
1356
1359
  "v": 17,
1357
1360
  },
1358
1361
  "useOldLogoRenderSize": true,
@@ -472,6 +472,7 @@ exports[`migration02.ts > migration02 should return converted letterspacing 1`]
472
472
  },
473
473
  },
474
474
  },
475
+ "userPromptContentKey": undefined,
475
476
  "v": 0,
476
477
  },
477
478
  "useOldLogoRenderSize": false,
@@ -446,6 +446,7 @@ BrandPageModel {
446
446
  },
447
447
  },
448
448
  },
449
+ "userPromptContentKey": undefined,
449
450
  "v": 0,
450
451
  }
451
452
  `;
@@ -911,6 +912,7 @@ BrandPageModel {
911
912
  },
912
913
  },
913
914
  },
915
+ "userPromptContentKey": undefined,
914
916
  "v": 0,
915
917
  }
916
918
  `;
@@ -1,4 +1,4 @@
1
- import type { BrandPageModel, LogoImageModel } from '../..';
1
+ import type { LogoImageModel } from '../..';
2
2
  import type { MigrationData } from '../migration.util';
3
3
 
4
4
  import { migrateLogoImage } from './logo/logo.migration.util';
@@ -3,7 +3,6 @@ import {
3
3
  FONT_SIZE_HEADINGS,
4
4
  type AboutSectionContent,
5
5
  type BannerSectionContent,
6
- type BrandPageModel,
7
6
  type ButtonContent,
8
7
  type ContactFormContent,
9
8
  type GlobalTextStyleDeclaration,
@@ -2,7 +2,6 @@ import {
2
2
  BRAND_PAGE_TYPES,
3
3
  type AboutSectionContent,
4
4
  type BannerSectionContent,
5
- type BrandPageModel,
6
5
  type BrandPageType,
7
6
  type ButtonContent,
8
7
  type ContactFormContent,
@@ -1,7 +1,6 @@
1
1
  import {
2
2
  type AboutSectionContent,
3
3
  type BannerSectionContent,
4
- type BrandPageModel,
5
4
  type ButtonContent,
6
5
  type ContactFormContent,
7
6
  type Content,
@@ -1,8 +1,4 @@
1
- import {
2
- type BrandPageModel,
3
- type TextContent,
4
- type LogoImageModel,
5
- } from '../..';
1
+ import { type TextContent, type LogoImageModel } from '../..';
6
2
  import type { MigrationData } from '../migration.util';
7
3
  import { isTextContent } from '../model.util';
8
4
 
@@ -1,4 +1,4 @@
1
- import { type BrandPageModel, type ButtonContent } from '../..';
1
+ import { type ButtonContent } from '../..';
2
2
  import type { MigrationData } from '../migration.util';
3
3
 
4
4
  export const migration05_2 = (
@@ -341,7 +341,7 @@ describe('migration08', () => {
341
341
  data: 'test-template-svg-data',
342
342
  });
343
343
 
344
- const result = await migration08(migrationData, {
344
+ const _result = await migration08(migrationData, {
345
345
  isServerRender: false,
346
346
  isUserDraft: false,
347
347
  });
@@ -701,6 +701,41 @@ describe('personalisation.util', async () => {
701
701
  ).toBe(title);
702
702
  });
703
703
 
704
+ test('applyUserPersonalisationToBrandPageModelAsync should fall back to a populated section when the block section was not generated', async () => {
705
+ // Arrange - simulate userPrompt AI content that only generated the core sections
706
+ // (profile/about/information/media); email/website/phone are never generated.
707
+ const personalisation = {
708
+ ...PERSONALISATION,
709
+ websiteSection: undefined,
710
+ emailSection: undefined,
711
+ phoneSection: undefined,
712
+ } as unknown as typeof PERSONALISATION;
713
+
714
+ // A block whose role points at the ungenerated website section - without the fallback
715
+ // this renders the designer's placeholder instead of personalised content.
716
+ const model = new BrandPageModel({
717
+ brandPageType: BRAND_PAGE_TYPES.brandSite,
718
+ styles: {
719
+ backgroundStyles: {
720
+ backgroundImageUrl: faker.internet.url(),
721
+ personalisationRole: 'website',
722
+ },
723
+ },
724
+ });
725
+
726
+ // Act
727
+ const result = await applyUserPersonalisationToBrandPageModelAsync(
728
+ personalisation,
729
+ model,
730
+ );
731
+
732
+ // Assert - it borrowed the first populated fallback section (profile).
733
+ expect(result.isModified).toBe(true);
734
+ expect(result.model.styles.backgroundStyles.backgroundImageUrl).toBe(
735
+ PERSONALISATION.profileSection.imageUrls?.[0].imageUrl,
736
+ );
737
+ });
738
+
704
739
  test('applyUserPersonalisationToBrandPageModelAsync should return modified text items when input has text with multiple items', async () => {
705
740
  // Arrange
706
741
  const textContent = {
@@ -326,6 +326,84 @@ const getPersonalisationValueAsync = async (
326
326
  return { value: propertyValue, section };
327
327
  };
328
328
 
329
+ // The userPrompt AI content generation only populates these content-bearing sections
330
+ // (see GenerateAiDesignMakerContentService / GenerateWebsiteContentService - About,
331
+ // Information, Profile, Media). Sections like email/website/phone are never generated, so
332
+ // blocks whose role points at an ungenerated section fall back to this pool.
333
+ const PERSONALISATION_FALLBACK_ROLES: PersonalisationRole[] = [
334
+ 'profile',
335
+ 'about',
336
+ 'information',
337
+ 'media',
338
+ ];
339
+
340
+ // "Effectively empty" = no renderable content (ungenerated userPrompt sections like
341
+ // email/website/phone). A section that has data but lacks one property is NOT empty - it
342
+ // intentionally keeps its original content.
343
+ const isSectionEffectivelyEmpty = (
344
+ section: UserPersonalisationSectionWithIndices | undefined,
345
+ ): boolean => {
346
+ if (!section) {
347
+ return true;
348
+ }
349
+
350
+ return (
351
+ !section.title &&
352
+ !section.name &&
353
+ !section.url &&
354
+ !section.description &&
355
+ !section.descriptionShort &&
356
+ !section.ctaTitle &&
357
+ !section.imageUrls?.length &&
358
+ !section.shapes?.length &&
359
+ !section.items?.length &&
360
+ !section.mainShapesCollection?.tall?.length &&
361
+ !section.mainShapesCollection?.square?.length &&
362
+ !section.mainShapesCollection?.wide?.length
363
+ );
364
+ };
365
+
366
+ // Resolve a property from a specific role's section. Returns null when that section is
367
+ // ungenerated (effectively empty) or cannot supply the property, so the caller can try the
368
+ // next role.
369
+ const resolvePersonalisationValueForRoleAsync = async (
370
+ role: PersonalisationRole,
371
+ property: keyof UserPersonalisationSection | keyof UserPersonalisationItem,
372
+ personalisation: UserPersonalisationWithIndices,
373
+ ): Promise<{
374
+ value: any;
375
+ personalisation: UserPersonalisationWithIndices;
376
+ valuesToUpdate?: Record<string, any>;
377
+ } | null> => {
378
+ const key = `${role}Section` as keyof UserPersonalisationWithIndices;
379
+ const section = personalisation[key] as
380
+ | UserPersonalisationSectionWithIndices
381
+ | undefined;
382
+
383
+ if (isSectionEffectivelyEmpty(section)) {
384
+ return null;
385
+ }
386
+
387
+ const {
388
+ value,
389
+ section: updatedSection,
390
+ valuesToUpdate,
391
+ } = await getPersonalisationValueAsync(
392
+ section as UserPersonalisationSectionWithIndices,
393
+ property,
394
+ );
395
+
396
+ if (value === undefined || value === null) {
397
+ return null;
398
+ }
399
+
400
+ return {
401
+ value,
402
+ personalisation: { ...personalisation, [key]: updatedSection },
403
+ valuesToUpdate,
404
+ };
405
+ };
406
+
329
407
  const getPersonalisationValueFromPropertyAsync = async (
330
408
  propertyKey: string,
331
409
  propertyValue: any,
@@ -342,16 +420,6 @@ const getPersonalisationValueFromPropertyAsync = async (
342
420
  return { value: undefined, personalisation };
343
421
  }
344
422
 
345
- const matchingValue = Object.entries(personalisation).find(
346
- ([key]) => key === `${personalisationRole}Section`,
347
- );
348
-
349
- if (!matchingValue) {
350
- return { value: undefined, personalisation };
351
- }
352
-
353
- const section = matchingValue[1] as UserPersonalisationSectionWithIndices;
354
-
355
423
  const mapping = getPersonalisationMappingForContentType(contentType);
356
424
 
357
425
  const matchingProperty = Object.entries(mapping).find(([, value]) =>
@@ -372,20 +440,48 @@ const getPersonalisationValueFromPropertyAsync = async (
372
440
  typeof propertyValue === 'string' && propertyValue.endsWith('.svg'),
373
441
  });
374
442
 
375
- const {
376
- value,
377
- section: updatedSection,
378
- valuesToUpdate,
379
- } = await getPersonalisationValueAsync(section, property);
443
+ const primaryKey =
444
+ `${personalisationRole}Section` as keyof UserPersonalisationWithIndices;
445
+ const primarySection = personalisation[primaryKey] as
446
+ | UserPersonalisationSectionWithIndices
447
+ | undefined;
448
+
449
+ // When the block's own section has content, use it as-is - this preserves existing
450
+ // behaviour, including legitimately keeping the original when that section lacks a
451
+ // specific property (e.g. no items, or an invalid shape).
452
+ if (!isSectionEffectivelyEmpty(primarySection)) {
453
+ const {
454
+ value,
455
+ section: updatedSection,
456
+ valuesToUpdate,
457
+ } = await getPersonalisationValueAsync(
458
+ primarySection as UserPersonalisationSectionWithIndices,
459
+ property,
460
+ );
380
461
 
381
- return {
382
- value,
383
- personalisation: {
384
- ...personalisation,
385
- [`${personalisationRole}Section`]: updatedSection,
386
- },
387
- valuesToUpdate,
388
- };
462
+ return {
463
+ value,
464
+ personalisation: { ...personalisation, [primaryKey]: updatedSection },
465
+ valuesToUpdate,
466
+ };
467
+ }
468
+
469
+ // The block's section was never generated - fall back to the first populated section that
470
+ // can supply this property, so it doesn't render the "should be AI generated" placeholder.
471
+ // Never reached when the section exists (above) or all are populated (AI Website Builder).
472
+ for (const role of PERSONALISATION_FALLBACK_ROLES) {
473
+ const resolved = await resolvePersonalisationValueForRoleAsync(
474
+ role,
475
+ property,
476
+ personalisation,
477
+ );
478
+
479
+ if (resolved) {
480
+ return resolved;
481
+ }
482
+ }
483
+
484
+ return { value: undefined, personalisation };
389
485
  };
390
486
 
391
487
  type ContentProperty = Record<string, string | any>;
@@ -1,5 +1,4 @@
1
1
  import type {
2
- PageStyles,
3
2
  ButtonWithModalContent,
4
3
  ProfileContent,
5
4
  TextContent,
@@ -32,11 +31,9 @@ import type {
32
31
  TextShapeItem,
33
32
  TextStyleDeclaration,
34
33
  AspectRatio,
35
- LogoVariation,
36
34
  LogoImageModel,
37
35
  LogoTemplateImageModel,
38
36
  CookieOptions,
39
- SensitiveContent,
40
37
  BookingSectionContent,
41
38
  MediaTypes,
42
39
  TextStyles,
@@ -84,8 +81,7 @@ export interface PageViewModel {
84
81
  }
85
82
 
86
83
  export interface ButtonViewModel
87
- extends ContentViewModel,
88
- Omit<ButtonWithModalContent, 'type'> {
84
+ extends ContentViewModel, Omit<ButtonWithModalContent, 'type'> {
89
85
  styles: Omit<ButtonStyles, 'templates'>;
90
86
  onClicked: (vm: ButtonViewModel) => void;
91
87
  buttonLinkType: ButtonLinkType;
@@ -95,7 +91,8 @@ export interface ButtonViewModel
95
91
  export type ImageViewModel = ContentViewModel & Omit<ImageContent, 'type'>;
96
92
 
97
93
  export interface ImageGalleryViewModel
98
- extends ContentViewModel,
94
+ extends
95
+ ContentViewModel,
99
96
  Omit<ImageGalleryContent, 'type' | 'galleryStyles'> {
100
97
  styles: GalleryStyles;
101
98
  }
@@ -114,14 +111,12 @@ export interface LogoViewModel extends ContentViewModel {
114
111
  }
115
112
 
116
113
  export interface ProfileViewModel
117
- extends ContentViewModel,
118
- Omit<ProfileContent, 'type'> {
114
+ extends ContentViewModel, Omit<ProfileContent, 'type'> {
119
115
  containerStyle?: BrandPageCssStyle;
120
116
  }
121
117
 
122
118
  export interface ShapesSectionViewModel
123
- extends ContentViewModel,
124
- Omit<ShapesSectionContent, 'type' | 'items'> {
119
+ extends ContentViewModel, Omit<ShapesSectionContent, 'type' | 'items'> {
125
120
  items: TextShapeItem[];
126
121
  isFullWidth: boolean;
127
122
  }
@@ -140,41 +135,35 @@ export type VideoViewModel = ContentViewModel &
140
135
  export type MapViewModel = ContentViewModel & Omit<MapContent, 'type'>;
141
136
 
142
137
  export interface MailingListViewModel
143
- extends ContentViewModel,
144
- Omit<MailingListContent, 'type'> {
138
+ extends ContentViewModel, Omit<MailingListContent, 'type'> {
145
139
  styles: Omit<ButtonStyles, 'templates'>;
146
140
  }
147
141
 
148
142
  export interface SupportMeViewModel
149
- extends ContentViewModel,
150
- Omit<SupportMeContent, 'type'> {
143
+ extends ContentViewModel, Omit<SupportMeContent, 'type'> {
151
144
  buttonStyles: ButtonStyles;
152
145
  }
153
146
 
154
147
  export interface RequestPaymentViewModel
155
- extends ContentViewModel,
156
- Omit<RequestPaymentContent, 'type'> {
148
+ extends ContentViewModel, Omit<RequestPaymentContent, 'type'> {
157
149
  buttonStyles: ButtonStyles;
158
150
  }
159
151
 
160
152
  export interface ShopViewModel
161
- extends ContentViewModel,
162
- Omit<ShopContent, 'type'> {
153
+ extends ContentViewModel, Omit<ShopContent, 'type'> {
163
154
  buttonStyles: ButtonStyles;
164
155
  isFullWidth: boolean;
165
156
  isShippingEnabled: boolean;
166
157
  }
167
158
 
168
159
  export interface ContactFormViewModel
169
- extends ContentViewModel,
170
- Omit<ContactFormContent, 'type'> {
160
+ extends ContentViewModel, Omit<ContactFormContent, 'type'> {
171
161
  buttonStyles: ButtonStyles;
172
162
  isFullWidth: boolean;
173
163
  }
174
164
 
175
165
  export interface BannerSectionViewModel
176
- extends ContentViewModel,
177
- Omit<BannerSectionContent, 'type'> {
166
+ extends ContentViewModel, Omit<BannerSectionContent, 'type'> {
178
167
  buttonViewModel: ButtonViewModel;
179
168
  isFullWidth: boolean;
180
169
  isBigImageType: boolean;
@@ -225,64 +214,57 @@ export interface TextImageSectionViewModel {
225
214
  }
226
215
 
227
216
  export interface TestimonialSectionViewModel
228
- extends ContentViewModel,
229
- Omit<TestimonialSectionContent, 'type'> {
217
+ extends ContentViewModel, Omit<TestimonialSectionContent, 'type'> {
230
218
  isFullWidth: boolean;
231
219
  }
232
220
 
233
221
  export interface AboutSectionViewModel
234
- extends ContentViewModel,
235
- Omit<AboutSectionContent, 'type'> {
222
+ extends ContentViewModel, Omit<AboutSectionContent, 'type'> {
236
223
  isFullWidth: boolean;
237
224
  }
238
225
 
239
226
  export interface SocialLinksViewModel
240
- extends ContentViewModel,
241
- Omit<SocialLinksContent, 'type'> {
227
+ extends ContentViewModel, Omit<SocialLinksContent, 'type'> {
242
228
  isFullWidth: boolean;
243
229
  }
244
230
 
245
231
  export interface DividerSectionViewModel
246
- extends ContentViewModel,
247
- Omit<DividerSectionContent, 'type'> {
232
+ extends ContentViewModel, Omit<DividerSectionContent, 'type'> {
248
233
  isFullWidth: boolean;
249
234
  }
250
235
 
251
236
  export interface BookingSectionViewModel
252
- extends ContentViewModel,
253
- Omit<BookingSectionContent, 'type'> {
237
+ extends ContentViewModel, Omit<BookingSectionContent, 'type'> {
254
238
  buttonViewModel: ButtonViewModel;
255
239
  isFullWidth: boolean;
256
240
  }
257
241
 
258
- export interface PageHeaderViewModel
259
- extends Omit<
260
- PageHeaderDesktop | PageHeaderMobile,
261
- | 'logoImage'
262
- | 'logoImageStyle'
263
- | 'isLogoOptional'
264
- | 'viewport'
265
- | 'isLogoVisible'
266
- | 'logoTemplateImage'
267
- | 'logoImageHeight'
268
- | 'logoImageWidth'
269
- > {
242
+ export interface PageHeaderViewModel extends Omit<
243
+ PageHeaderDesktop | PageHeaderMobile,
244
+ | 'logoImage'
245
+ | 'logoImageStyle'
246
+ | 'isLogoOptional'
247
+ | 'viewport'
248
+ | 'isLogoVisible'
249
+ | 'logoTemplateImage'
250
+ | 'logoImageHeight'
251
+ | 'logoImageWidth'
252
+ > {
270
253
  logo: LogoViewModel;
271
254
  pages: PageViewModel[];
272
255
  }
273
256
 
274
- export interface PageFooterViewModel
275
- extends Omit<
276
- PageFooterDesktop | PageFooterMobile,
277
- | 'logoImage'
278
- | 'logoImageStyle'
279
- | 'isLogoOptional'
280
- | 'viewport'
281
- | 'isLogoVisible'
282
- | 'logoTemplateImage'
283
- | 'logoImageHeight'
284
- | 'logoImageWidth'
285
- > {
257
+ export interface PageFooterViewModel extends Omit<
258
+ PageFooterDesktop | PageFooterMobile,
259
+ | 'logoImage'
260
+ | 'logoImageStyle'
261
+ | 'isLogoOptional'
262
+ | 'viewport'
263
+ | 'isLogoVisible'
264
+ | 'logoTemplateImage'
265
+ | 'logoImageHeight'
266
+ | 'logoImageWidth'
267
+ > {
286
268
  logo: LogoViewModel;
287
269
  }
288
270
 
@@ -48,11 +48,11 @@ export const bannerOverlayOptionsVisibilityAssessor: VisibilityAssessor<
48
48
  > = (content) => {
49
49
  return Boolean(
50
50
  (content.media?.type === 'getty-video' || content.imageUrl) &&
51
- [
52
- ALIGN_CARD_CENTER_IMAGE,
53
- ALIGN_CARD_LEFT_IMAGE,
54
- BIG_IMAGE,
55
- ALIGN_LEFT_BIG_IMAGE,
56
- ].includes(content.displayStyle),
51
+ [
52
+ ALIGN_CARD_CENTER_IMAGE,
53
+ ALIGN_CARD_LEFT_IMAGE,
54
+ BIG_IMAGE,
55
+ ALIGN_LEFT_BIG_IMAGE,
56
+ ].includes(content.displayStyle),
57
57
  );
58
58
  };
@@ -6,7 +6,7 @@ export const colorReplacementIconVisibilityTypeAssessor: VisibilityAssessor<
6
6
  > = (content) => {
7
7
  return Boolean(
8
8
  content?.colorReplacements &&
9
- content?.iconUrl &&
10
- content?.mediaType === 'shape',
9
+ content?.iconUrl &&
10
+ content?.mediaType === 'shape',
11
11
  );
12
12
  };
@@ -6,7 +6,7 @@ export const colorReplacementProfileVisibilityTypeAssessor: VisibilityAssessor<
6
6
  > = (content) => {
7
7
  return Boolean(
8
8
  content?.colorReplacements &&
9
- content?.avatarImageUrl &&
10
- content?.mediaType === 'shape',
9
+ content?.avatarImageUrl &&
10
+ content?.mediaType === 'shape',
11
11
  );
12
12
  };
@@ -10,7 +10,7 @@ export const colorReplacementVisibilityTypeAssessor: VisibilityAssessor<
10
10
  > = (content) => {
11
11
  return Boolean(
12
12
  content?.colorReplacements &&
13
- content?.imageUrl &&
14
- content?.mediaType === 'shape',
13
+ content?.imageUrl &&
14
+ content?.mediaType === 'shape',
15
15
  );
16
16
  };