@designcrowd/library.brand-page 5.17.28 → 5.18.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (380) hide show
  1. package/lib/src/{CreatedOnBrandCrowd-de-de-CJZpKPNH.js → CreatedOnBrandCrowd-de-de-xmkupPus.js} +1 -1
  2. package/lib/src/{CreatedOnBrandCrowd-en-us-DkIa7iEb.js → CreatedOnBrandCrowd-en-us-Ck7EdTtb.js} +1 -1
  3. package/lib/src/{CreatedOnBrandCrowd-es-es-CE2p6XHz.js → CreatedOnBrandCrowd-es-es-BC8sJuDH.js} +1 -1
  4. package/lib/src/{CreatedOnBrandCrowd-fr-fr-BBjOZS3M.js → CreatedOnBrandCrowd-fr-ca-CN-UBe1q.js} +1 -1
  5. package/lib/src/{CreatedOnBrandCrowd-fr-ca-BBjOZS3M.js → CreatedOnBrandCrowd-fr-fr-CN-UBe1q.js} +1 -1
  6. package/lib/src/{CreatedOnBrandCrowd-pt-pt-Dayzl4BZ.js → CreatedOnBrandCrowd-pt-br-CajQyNkx.js} +1 -1
  7. package/lib/src/{CreatedOnBrandCrowd-pt-br-Dayzl4BZ.js → CreatedOnBrandCrowd-pt-pt-CajQyNkx.js} +1 -1
  8. package/lib/src/{CreatedOnDcom-de-de-CFzDqfCb.js → CreatedOnDcom-de-de-BRCNMmDq.js} +1 -1
  9. package/lib/src/{CreatedOnDcom-en-us-C2jIPBDY.js → CreatedOnDcom-en-us-BzQDtZhc.js} +1 -1
  10. package/lib/src/{CreatedOnDcom-es-es-qejpzqho.js → CreatedOnDcom-es-es-D-qAM4Cd.js} +1 -1
  11. package/lib/src/{CreatedOnDcom-fr-ca-DMO9Ld7K.js → CreatedOnDcom-fr-ca-CZ1irFOc.js} +1 -1
  12. package/lib/src/{CreatedOnDcom-fr-fr-BFWN9qTP.js → CreatedOnDcom-fr-fr-Gb5BCF0N.js} +1 -1
  13. package/lib/src/{CreatedOnDcom-pt-br-CneD3ghF.js → CreatedOnDcom-pt-br-CAQV0q6o.js} +1 -1
  14. package/lib/src/{CreatedOnDcom-pt-pt-Cg1B7s0o.js → CreatedOnDcom-pt-pt-D6tQdQFh.js} +1 -1
  15. package/lib/src/brand-page/components/image-gallery/ImageGalleryModal.mixin.js +2 -2
  16. package/lib/src/brand-page/models/brand-page-context.model.d.ts +0 -2
  17. package/lib/src/brand-page/models/brand-page-context.model.js +1 -11
  18. package/lib/src/brand-page/models/index.d.ts +1 -0
  19. package/lib/src/brand-page/models/index.js +1 -0
  20. package/lib/src/brand-page/utils/color.util.js +23 -3
  21. package/lib/src/brand-page/utils/raygun.util.d.ts +5 -1
  22. package/lib/src/brand-page/utils/raygun.util.js +7 -2
  23. package/lib/src/brand-page/utils/svg-color.util.js +1 -2
  24. package/lib/src/brand-page/utils/view-model.util.js +1 -1
  25. package/lib/src/brand-page-maker/components/brand-page-maker/BrandPageMaker.mixin.d.ts +1 -31
  26. package/lib/src/brand-page-maker/components/brand-page-maker/__fixtures__/brand-page-examples.js +0 -2
  27. package/lib/src/brand-page-maker/components/brandpage-maker-page/BrandPageMakerPage.mixin.d.ts +2 -31
  28. package/lib/src/brand-page-maker/components/preview/Preview.mixin.d.ts +0 -14
  29. package/lib/src/brand-page-maker/components/quick-link-bar/QuickLinkBar.mixin.d.ts +0 -28
  30. package/lib/src/brand-page-maker/components/seo-settings/SeoPageSettings.mixin.d.ts +0 -28
  31. package/lib/src/brand-page-maker/components/seo-settings/UrlSettings.mixin.d.ts +0 -28
  32. package/lib/src/brand-page-maker/components/seo-settings/UseExistingDomainModal.mixin.d.ts +0 -28
  33. package/lib/src/brand-page-maker/components/template-preview/TemplatePreview.mixin.d.ts +0 -28
  34. package/lib/src/brand-page-maker/components/upgrade-to-premium-button/UpgradeToPremiumButton.mixin.d.ts +0 -28
  35. package/lib/src/brand-page-maker/composables/ai-chat/aiErrorCopy.d.ts +35 -0
  36. package/lib/src/brand-page-maker/composables/ai-chat/aiErrorCopy.js +108 -0
  37. package/lib/src/brand-page-maker/composables/ai-chat/{useAiChat.d.ts → types.d.ts} +5 -13
  38. package/lib/src/brand-page-maker/composables/ai-chat/types.js +1 -0
  39. package/lib/src/brand-page-maker/composables/ai-chat/useAiMetadataBuilder.d.ts +19 -0
  40. package/lib/src/brand-page-maker/composables/ai-chat/useAiMetadataBuilder.js +1 -0
  41. package/lib/src/brand-page-maker/composables/ai-chat/useAiWebsiteBuilderChat.d.ts +1 -1
  42. package/lib/src/brand-page-maker/composables/ai-chat/useAiWebsiteBuilderChat.js +488 -82
  43. package/lib/src/brand-page-maker/composables/rich-text-editor/useRichTextEditor.js +5 -5
  44. package/lib/src/brand-page-maker/composables/useEventTracker.d.ts +6 -16
  45. package/lib/src/brand-page-maker/composables/useEventTracker.js +19 -21
  46. package/lib/src/brand-page-maker/constants/sidebar-constant.d.ts +0 -1
  47. package/lib/src/brand-page-maker/constants/sidebar-constant.js +7 -15
  48. package/lib/src/brand-page-maker/convertors/image-aspect-ratio.convertor.js +2 -2
  49. package/lib/src/brand-page-maker/convertors/text-size-value.convertor.js +3 -1
  50. package/lib/src/brand-page-maker/stores/ai-checkpoint/ai-checkpoint-store.d.ts +30660 -0
  51. package/lib/src/brand-page-maker/stores/ai-checkpoint/ai-checkpoint-store.js +34 -0
  52. package/lib/src/brand-page-maker/stores/ai-thread/ai-website-builder-thread-store.d.ts +1 -1
  53. package/lib/src/brand-page-maker/stores/brandpage-container/brand-page-container-store.d.ts +0 -28
  54. package/lib/src/brand-page-maker/stores/brandpage-maker/brandpage-maker-store.js +42 -2
  55. package/lib/src/brand-page-maker/stores/index.d.ts +1 -1
  56. package/lib/src/brand-page-maker/stores/index.js +1 -1
  57. package/lib/src/brand-page-maker/stores/user/user-store.js +0 -1
  58. package/lib/src/bundled-translations-CnareLWC.js +175 -0
  59. package/lib/src/bundled-translations.de-DE-2Ys7epLO.js +175 -0
  60. package/lib/src/bundled-translations.es-ES-Cjp-G8rT.js +175 -0
  61. package/lib/src/bundled-translations.fr-CA-CsaW4Oae.js +175 -0
  62. package/lib/src/bundled-translations.fr-FR-DIT2dd8J.js +175 -0
  63. package/lib/src/bundled-translations.pt-BR-BamoBpDW.js +175 -0
  64. package/lib/src/bundled-translations.pt-PT-C9A4hY_e.js +175 -0
  65. package/lib/src/bundles/bundled-translations.de-DE.json +1 -20
  66. package/lib/src/bundles/bundled-translations.es-ES.json +1 -20
  67. package/lib/src/bundles/bundled-translations.fr-CA.json +1 -20
  68. package/lib/src/bundles/bundled-translations.fr-FR.json +1 -20
  69. package/lib/src/bundles/bundled-translations.json +1 -20
  70. package/lib/src/bundles/bundled-translations.pt-BR.json +1 -20
  71. package/lib/src/bundles/bundled-translations.pt-PT.json +1 -20
  72. package/lib/src/clients/ai-assistant-client.d.ts +30 -29
  73. package/lib/src/clients/ai-assistant-client.js +16 -16
  74. package/lib/src/clients/design-template-client.d.ts +0 -2
  75. package/lib/src/clients/design-template-client.js +0 -38
  76. package/lib/src/clients/websocket-gateway-client.d.ts +9 -1
  77. package/lib/src/composables/useTranslate.d.ts +2 -1
  78. package/lib/src/composables/useTranslate.js +2 -1
  79. package/lib/src/constants/ui.d.ts +0 -1
  80. package/lib/src/css/library.brand-page-brandCrowd.min.css +225 -134
  81. package/lib/src/css/library.brand-page-brandPage.min.css +227 -121
  82. package/lib/src/css/library.brand-page-designCom.min.css +225 -134
  83. package/lib/src/css/library.brand-page-preview.min.css +225 -118
  84. package/lib/src/index.d.ts +1 -1
  85. package/lib/src/index.mjs +1 -1
  86. package/lib/src/{lib-33w_DBny.js → lib-CSRUPpSo.js} +30887 -29395
  87. package/lib/src/metadata-builder/ai-metadata-executor.d.ts +21 -0
  88. package/lib/src/metadata-builder/ai-metadata-executor.js +56 -3
  89. package/lib/src/metadata-builder/builders/add-page-builder.d.ts +2 -4
  90. package/lib/src/metadata-builder/builders/add-page-builder.js +5 -8
  91. package/lib/src/metadata-builder/builders/footer-builder.d.ts +11 -0
  92. package/lib/src/metadata-builder/builders/footer-builder.js +151 -0
  93. package/lib/src/metadata-builder/builders/global-styles-builder.d.ts +15 -0
  94. package/lib/src/metadata-builder/builders/global-styles-builder.js +129 -0
  95. package/lib/src/metadata-builder/builders/header-builder.d.ts +11 -0
  96. package/lib/src/metadata-builder/builders/header-builder.js +167 -0
  97. package/lib/src/metadata-builder/builders/rename-page-builder.d.ts +12 -0
  98. package/lib/src/metadata-builder/builders/rename-page-builder.js +49 -0
  99. package/lib/src/metadata-builder/builders/section-builders/about-section-builder.d.ts +2 -0
  100. package/lib/src/metadata-builder/builders/section-builders/about-section-builder.js +44 -4
  101. package/lib/src/metadata-builder/builders/section-builders/banner-section-builder.d.ts +2 -0
  102. package/lib/src/metadata-builder/builders/section-builders/banner-section-builder.js +70 -6
  103. package/lib/src/metadata-builder/builders/section-builders/base-section-builder.d.ts +36 -4
  104. package/lib/src/metadata-builder/builders/section-builders/base-section-builder.js +102 -12
  105. package/lib/src/metadata-builder/builders/section-builders/booking-section-builder.d.ts +8 -0
  106. package/lib/src/metadata-builder/builders/section-builders/booking-section-builder.js +50 -0
  107. package/lib/src/metadata-builder/builders/section-builders/button-section-builder.d.ts +2 -0
  108. package/lib/src/metadata-builder/builders/section-builders/button-section-builder.js +5 -1
  109. package/lib/src/metadata-builder/builders/section-builders/contact-form-builder.d.ts +2 -0
  110. package/lib/src/metadata-builder/builders/section-builders/contact-form-builder.js +47 -3
  111. package/lib/src/metadata-builder/builders/section-builders/delete-section-builder.d.ts +2 -1
  112. package/lib/src/metadata-builder/builders/section-builders/delete-section-builder.js +5 -2
  113. package/lib/src/metadata-builder/builders/section-builders/divider-section-builder.d.ts +2 -0
  114. package/lib/src/metadata-builder/builders/section-builders/divider-section-builder.js +11 -1
  115. package/lib/src/metadata-builder/builders/section-builders/image-gallery-builder.d.ts +2 -0
  116. package/lib/src/metadata-builder/builders/section-builders/image-gallery-builder.js +52 -13
  117. package/lib/src/metadata-builder/builders/section-builders/images-section-builder.d.ts +2 -0
  118. package/lib/src/metadata-builder/builders/section-builders/images-section-builder.js +47 -17
  119. package/lib/src/metadata-builder/builders/section-builders/index.d.ts +1 -0
  120. package/lib/src/metadata-builder/builders/section-builders/index.js +1 -0
  121. package/lib/src/metadata-builder/builders/section-builders/mailing-list-builder.d.ts +2 -0
  122. package/lib/src/metadata-builder/builders/section-builders/mailing-list-builder.js +20 -2
  123. package/lib/src/metadata-builder/builders/section-builders/mailing-list-section-builder.d.ts +2 -0
  124. package/lib/src/metadata-builder/builders/section-builders/mailing-list-section-builder.js +20 -2
  125. package/lib/src/metadata-builder/builders/section-builders/profile-section-builder.d.ts +2 -0
  126. package/lib/src/metadata-builder/builders/section-builders/profile-section-builder.js +36 -2
  127. package/lib/src/metadata-builder/builders/section-builders/shapes-section-builder.d.ts +2 -0
  128. package/lib/src/metadata-builder/builders/section-builders/shapes-section-builder.js +70 -27
  129. package/lib/src/metadata-builder/builders/section-builders/social-links-builder.d.ts +2 -0
  130. package/lib/src/metadata-builder/builders/section-builders/social-links-builder.js +7 -2
  131. package/lib/src/metadata-builder/builders/section-builders/testimonial-section-builder.d.ts +2 -0
  132. package/lib/src/metadata-builder/builders/section-builders/testimonial-section-builder.js +91 -26
  133. package/lib/src/metadata-builder/builders/section-builders/text-section-builder.d.ts +2 -0
  134. package/lib/src/metadata-builder/builders/section-builders/text-section-builder.js +69 -31
  135. package/lib/src/metadata-builder/builders/section-content-factory.d.ts +2 -2
  136. package/lib/src/metadata-builder/builders/section-content-factory.js +8 -2
  137. package/lib/src/metadata-builder/builders/section-field-maps.js +30 -2
  138. package/lib/src/metadata-builder/builders/section-field-utils.d.ts +46 -7
  139. package/lib/src/metadata-builder/builders/section-field-utils.js +86 -62
  140. package/lib/src/metadata-builder/builders/section-rules/about-section.rules.d.ts +2 -0
  141. package/lib/src/metadata-builder/builders/section-rules/about-section.rules.js +20 -0
  142. package/lib/src/metadata-builder/builders/section-rules/add-page.rules.d.ts +7 -0
  143. package/lib/src/metadata-builder/builders/section-rules/add-page.rules.js +8 -0
  144. package/lib/src/metadata-builder/builders/section-rules/banner-section.rules.d.ts +2 -0
  145. package/lib/src/metadata-builder/builders/section-rules/banner-section.rules.js +27 -0
  146. package/lib/src/metadata-builder/builders/section-rules/booking-section.rules.d.ts +2 -0
  147. package/lib/src/metadata-builder/builders/section-rules/booking-section.rules.js +16 -0
  148. package/lib/src/metadata-builder/builders/section-rules/button-section.rules.d.ts +2 -0
  149. package/lib/src/metadata-builder/builders/section-rules/button-section.rules.js +13 -0
  150. package/lib/src/metadata-builder/builders/section-rules/contact-form.rules.d.ts +2 -0
  151. package/lib/src/metadata-builder/builders/section-rules/contact-form.rules.js +16 -0
  152. package/lib/src/metadata-builder/builders/section-rules/divider-section.rules.d.ts +2 -0
  153. package/lib/src/metadata-builder/builders/section-rules/divider-section.rules.js +7 -0
  154. package/lib/src/metadata-builder/builders/section-rules/footer.rules.d.ts +4 -0
  155. package/lib/src/metadata-builder/builders/section-rules/footer.rules.js +5 -0
  156. package/lib/src/metadata-builder/builders/section-rules/global-styles.rules.d.ts +6 -0
  157. package/lib/src/metadata-builder/builders/section-rules/global-styles.rules.js +26 -0
  158. package/lib/src/metadata-builder/builders/section-rules/header.rules.d.ts +4 -0
  159. package/lib/src/metadata-builder/builders/section-rules/header.rules.js +41 -0
  160. package/lib/src/metadata-builder/builders/section-rules/image-gallery.rules.d.ts +2 -0
  161. package/lib/src/metadata-builder/builders/section-rules/image-gallery.rules.js +10 -0
  162. package/lib/src/metadata-builder/builders/section-rules/images-section.rules.d.ts +2 -0
  163. package/lib/src/metadata-builder/builders/section-rules/images-section.rules.js +31 -0
  164. package/lib/src/metadata-builder/builders/section-rules/mailing-list.rules.d.ts +2 -0
  165. package/lib/src/metadata-builder/builders/section-rules/mailing-list.rules.js +11 -0
  166. package/lib/src/metadata-builder/builders/section-rules/profile.rules.d.ts +2 -0
  167. package/lib/src/metadata-builder/builders/section-rules/profile.rules.js +14 -0
  168. package/lib/src/metadata-builder/builders/section-rules/rename-page.rules.d.ts +7 -0
  169. package/lib/src/metadata-builder/builders/section-rules/rename-page.rules.js +8 -0
  170. package/lib/src/metadata-builder/builders/section-rules/shapes-section.rules.d.ts +2 -0
  171. package/lib/src/metadata-builder/builders/section-rules/shapes-section.rules.js +27 -0
  172. package/lib/src/metadata-builder/builders/section-rules/social-links.rules.d.ts +2 -0
  173. package/lib/src/metadata-builder/builders/section-rules/social-links.rules.js +9 -0
  174. package/lib/src/metadata-builder/builders/section-rules/testimonial-section.rules.d.ts +7 -0
  175. package/lib/src/metadata-builder/builders/section-rules/testimonial-section.rules.js +26 -0
  176. package/lib/src/metadata-builder/builders/section-rules/text-section.rules.d.ts +2 -0
  177. package/lib/src/metadata-builder/builders/section-rules/text-section.rules.js +14 -0
  178. package/lib/src/metadata-builder/builders/shape-color-utils.d.ts +26 -0
  179. package/lib/src/metadata-builder/builders/shape-color-utils.js +52 -0
  180. package/lib/src/metadata-builder/builders/undo-builder.d.ts +48 -0
  181. package/lib/src/metadata-builder/builders/undo-builder.js +58 -0
  182. package/lib/src/metadata-builder/builders/update-content-text-style-builder.js +5 -1
  183. package/lib/src/metadata-builder/helpers/rte.helpers.d.ts +15 -4
  184. package/lib/src/metadata-builder/helpers/rte.helpers.js +24 -10
  185. package/lib/src/metadata-builder/metadata-executor.d.ts +2 -1
  186. package/lib/src/metadata-builder/metadata-executor.js +32 -5
  187. package/lib/src/metadata-builder/models.d.ts +26 -1
  188. package/lib/src/metadata-builder/models.js +14 -1
  189. package/lib/src/metadata-builder/parsers/ai-toolcall-parser.d.ts +144 -0
  190. package/lib/src/metadata-builder/parsers/ai-toolcall-parser.js +17 -0
  191. package/lib/src/metadata-builder/parsers/section-tool-arguments.d.ts +113 -24
  192. package/lib/src/metadata-builder/parsers/section-tool-arguments.js +5 -1
  193. package/lib/src/metadata-builder/sanitizers/rte-schema-check.d.ts +22 -0
  194. package/lib/src/metadata-builder/sanitizers/rte-schema-check.js +84 -0
  195. package/lib/src/metadata-builder/sanitizers/sanitizer-rules.d.ts +47 -0
  196. package/lib/src/metadata-builder/sanitizers/sanitizer-rules.js +60 -0
  197. package/lib/src/metadata-builder/sanitizers/section-args-validator.d.ts +41 -0
  198. package/lib/src/metadata-builder/sanitizers/section-args-validator.js +274 -0
  199. package/lib/src/shared/content-settings/components/content-settings/ContentSettings.mixin.d.ts +2 -1
  200. package/lib/src/shared/content-settings/components/content-settings/ContentSettings.mixin.js +2 -16
  201. package/lib/src/shared/content-settings/components/content-settings/ContentSettings.stories.js +0 -1
  202. package/lib/src/shared/content-settings/components/content-settings/ReplaceImageSettingsForContent.mixin.d.ts +2 -1
  203. package/lib/src/shared/content-settings/components/content-settings-item/ContentSettingsItem.mixin.d.ts +2 -3
  204. package/lib/src/shared/content-settings/components/content-settings-item/ContentSettingsItemField.mixin.d.ts +0 -4
  205. package/lib/src/shared/content-settings/components/content-settings-item/ContentSettingsItemField.mixin.js +6 -8
  206. package/lib/src/shared/content-settings/components/payment-config-field/PaymentConfigField.mixin.d.ts +0 -28
  207. package/lib/src/shared/logo-settings/components/EditLogoSettings.mixin.d.ts +2 -1
  208. package/lib/src/shared/logo-settings/components/LogoSettings.mixin.d.ts +0 -28
  209. package/lib/src/shared/navigation-style-settings/store/index.js +1 -0
  210. package/lib/src/shared/page-navigation/store/page-navigation-store.js +1 -20
  211. package/lib/src/shared/page-navigation/utils/nav-order-utils.d.ts +3 -0
  212. package/lib/src/shared/page-navigation/utils/nav-order-utils.js +20 -0
  213. package/lib/src/shared/page-settings/components/page-settings/PageSettings.mixin.d.ts +2 -30
  214. package/lib/src/shared/page-settings/components/page-settings-section-styles/PageSettingsSectionStyles.mixin.d.ts +0 -28
  215. package/lib/src/shared/publish-brand-page-with-state/PublishBrandPageModalWithState.mixin.d.ts +2 -43
  216. package/lib/src/shared/side-bar/components/SideBar.mixin.d.ts +0 -30
  217. package/lib/src/shared/side-bar/components/SideBarTabButton.mixin.d.ts +2 -3
  218. package/lib/src/shared/side-bar/store/side-bar-store.d.ts +0 -12
  219. package/lib/src/shared/side-bar/store/side-bar-store.js +0 -7
  220. package/lib/src/shared/style-settings/components/StyleSettings.mixin.d.ts +2 -29
  221. package/lib/src/shared/template-settings/components/TemplatesSettings.mixin.d.ts +2 -1
  222. package/lib/src/utils/build-asset-manifest.d.ts +26 -0
  223. package/lib/src/utils/build-asset-manifest.js +114 -0
  224. package/lib/src/utils/minify-brand-page-metadata.d.ts +49 -1
  225. package/lib/src/utils/minify-brand-page-metadata.js +216 -129
  226. package/package.json +1 -1
  227. package/src/brand-page/components/banner-section/BannerSection.vue +1 -1
  228. package/src/brand-page/components/contact-form/ContactForm.vue +29 -26
  229. package/src/brand-page/components/image-gallery/ImageGalleryModal.mixin.ts +6 -2
  230. package/src/brand-page/components/text-media-section/TextMediaSection.vue +1 -5
  231. package/src/brand-page/models/brand-page-context.model.ts +1 -25
  232. package/src/brand-page/models/index.ts +1 -0
  233. package/src/brand-page/utils/color.util.test.ts +48 -0
  234. package/src/brand-page/utils/color.util.ts +29 -4
  235. package/src/brand-page/utils/raygun.util.ts +11 -2
  236. package/src/brand-page/utils/svg-color.util.ts +1 -3
  237. package/src/brand-page/utils/view-model.util.ts +1 -4
  238. package/src/brand-page-maker/components/ai-text-edit/AiChatbox.vue +2 -2
  239. package/src/brand-page-maker/components/ai-text-edit/AiProgressFeed.vue +162 -0
  240. package/src/brand-page-maker/components/ai-text-edit/TextBubble.vue +57 -5
  241. package/src/brand-page-maker/components/ai-text-edit/i18n/generate-ai.de-DE.json +0 -20
  242. package/src/brand-page-maker/components/ai-text-edit/i18n/generate-ai.es-ES.json +0 -20
  243. package/src/brand-page-maker/components/ai-text-edit/i18n/generate-ai.fr-CA.json +0 -20
  244. package/src/brand-page-maker/components/ai-text-edit/i18n/generate-ai.fr-FR.json +0 -20
  245. package/src/brand-page-maker/components/ai-text-edit/i18n/generate-ai.json +0 -20
  246. package/src/brand-page-maker/components/ai-text-edit/i18n/generate-ai.pt-BR.json +0 -20
  247. package/src/brand-page-maker/components/ai-text-edit/i18n/generate-ai.pt-PT.json +0 -20
  248. package/src/brand-page-maker/components/ai-website-builder/AiWebsiteBuilder.vue +1 -2
  249. package/src/brand-page-maker/components/ai-website-builder/i18n/ai-website-builder.de-DE.json +3 -0
  250. package/src/brand-page-maker/components/ai-website-builder/i18n/ai-website-builder.es-ES.json +3 -0
  251. package/src/brand-page-maker/components/ai-website-builder/i18n/ai-website-builder.fr-CA.json +3 -0
  252. package/src/brand-page-maker/components/ai-website-builder/i18n/ai-website-builder.fr-FR.json +3 -0
  253. package/src/brand-page-maker/components/ai-website-builder/i18n/ai-website-builder.json +3 -0
  254. package/src/brand-page-maker/components/ai-website-builder/i18n/ai-website-builder.pt-BR.json +3 -0
  255. package/src/brand-page-maker/components/ai-website-builder/i18n/ai-website-builder.pt-PT.json +3 -0
  256. package/src/brand-page-maker/components/brand-page-maker/BrandPageMaker.vue +3 -28
  257. package/src/brand-page-maker/components/brand-page-maker/__fixtures__/brand-page-examples.ts +0 -2
  258. package/src/brand-page-maker/composables/ai-chat/aiErrorCopy.test.ts +229 -0
  259. package/src/brand-page-maker/composables/ai-chat/aiErrorCopy.ts +164 -0
  260. package/src/brand-page-maker/composables/ai-chat/types.ts +49 -0
  261. package/src/brand-page-maker/composables/ai-chat/useAiMetadataBuilder.ts +20 -0
  262. package/src/brand-page-maker/composables/ai-chat/useAiWebsiteBuilderChat.ts +651 -94
  263. package/src/brand-page-maker/composables/rich-text-editor/useRichTextEditor.ts +9 -9
  264. package/src/brand-page-maker/composables/useEventTracker.ts +31 -25
  265. package/src/brand-page-maker/constants/sidebar-constant.ts +7 -15
  266. package/src/brand-page-maker/convertors/image-aspect-ratio.convertor.ts +2 -2
  267. package/src/brand-page-maker/convertors/text-size-value.convertor.ts +3 -3
  268. package/src/brand-page-maker/stores/ai-checkpoint/ai-checkpoint-store.ts +54 -0
  269. package/src/brand-page-maker/stores/brandpage-maker/brandpage-maker-store.ts +76 -0
  270. package/src/brand-page-maker/stores/index.ts +1 -1
  271. package/src/brand-page-maker/stores/user/user-store.ts +0 -1
  272. package/src/bundles/bundled-translations.de-DE.json +1 -20
  273. package/src/bundles/bundled-translations.es-ES.json +1 -20
  274. package/src/bundles/bundled-translations.fr-CA.json +1 -20
  275. package/src/bundles/bundled-translations.fr-FR.json +1 -20
  276. package/src/bundles/bundled-translations.json +1 -20
  277. package/src/bundles/bundled-translations.pt-BR.json +1 -20
  278. package/src/bundles/bundled-translations.pt-PT.json +1 -20
  279. package/src/clients/ai-assistant-client.ts +59 -46
  280. package/src/clients/design-template-client.ts +0 -66
  281. package/src/clients/websocket-gateway-client.ts +17 -1
  282. package/src/composables/useTranslate.ts +3 -0
  283. package/src/constants/ui.ts +0 -1
  284. package/src/lib.ts +1 -0
  285. package/src/metadata-builder/ai-metadata-executor.ts +94 -1
  286. package/src/metadata-builder/builders/add-page-builder.ts +9 -13
  287. package/src/metadata-builder/builders/footer-builder.test.ts +76 -0
  288. package/src/metadata-builder/builders/footer-builder.ts +226 -0
  289. package/src/metadata-builder/builders/global-styles-builder.ts +187 -0
  290. package/src/metadata-builder/builders/header-builder.test.ts +106 -0
  291. package/src/metadata-builder/builders/header-builder.ts +254 -0
  292. package/src/metadata-builder/builders/rename-page-builder.ts +79 -0
  293. package/src/metadata-builder/builders/section-builders/about-section-builder.ts +73 -5
  294. package/src/metadata-builder/builders/section-builders/banner-section-builder.ts +112 -7
  295. package/src/metadata-builder/builders/section-builders/base-section-builder.ts +149 -11
  296. package/src/metadata-builder/builders/section-builders/booking-section-builder.ts +87 -0
  297. package/src/metadata-builder/builders/section-builders/button-section-builder.ts +6 -1
  298. package/src/metadata-builder/builders/section-builders/contact-form-builder.ts +74 -4
  299. package/src/metadata-builder/builders/section-builders/delete-section-builder.ts +15 -1
  300. package/src/metadata-builder/builders/section-builders/divider-section-builder.ts +13 -1
  301. package/src/metadata-builder/builders/section-builders/image-gallery-builder.ts +91 -31
  302. package/src/metadata-builder/builders/section-builders/images-section-builder.ts +102 -48
  303. package/src/metadata-builder/builders/section-builders/index.ts +1 -0
  304. package/src/metadata-builder/builders/section-builders/mailing-list-builder.ts +38 -2
  305. package/src/metadata-builder/builders/section-builders/mailing-list-section-builder.ts +38 -2
  306. package/src/metadata-builder/builders/section-builders/profile-section-builder.ts +55 -3
  307. package/src/metadata-builder/builders/section-builders/shapes-section-builder.ts +170 -77
  308. package/src/metadata-builder/builders/section-builders/social-links-builder.test.ts +119 -0
  309. package/src/metadata-builder/builders/section-builders/social-links-builder.ts +13 -2
  310. package/src/metadata-builder/builders/section-builders/testimonial-section-builder.ts +178 -57
  311. package/src/metadata-builder/builders/section-builders/text-section-builder.ts +130 -30
  312. package/src/metadata-builder/builders/section-content-factory.ts +15 -2
  313. package/src/metadata-builder/builders/section-field-maps.ts +34 -1
  314. package/src/metadata-builder/builders/section-field-utils.ts +131 -72
  315. package/src/metadata-builder/builders/section-rules/about-section.rules.ts +38 -0
  316. package/src/metadata-builder/builders/section-rules/add-page.rules.ts +17 -0
  317. package/src/metadata-builder/builders/section-rules/banner-section.rules.ts +49 -0
  318. package/src/metadata-builder/builders/section-rules/booking-section.rules.ts +34 -0
  319. package/src/metadata-builder/builders/section-rules/button-section.rules.ts +22 -0
  320. package/src/metadata-builder/builders/section-rules/contact-form.rules.ts +30 -0
  321. package/src/metadata-builder/builders/section-rules/divider-section.rules.ts +17 -0
  322. package/src/metadata-builder/builders/section-rules/footer.rules.ts +21 -0
  323. package/src/metadata-builder/builders/section-rules/global-styles.rules.ts +44 -0
  324. package/src/metadata-builder/builders/section-rules/header.rules.ts +75 -0
  325. package/src/metadata-builder/builders/section-rules/image-gallery.rules.ts +22 -0
  326. package/src/metadata-builder/builders/section-rules/images-section.rules.ts +55 -0
  327. package/src/metadata-builder/builders/section-rules/mailing-list.rules.ts +21 -0
  328. package/src/metadata-builder/builders/section-rules/profile.rules.ts +27 -0
  329. package/src/metadata-builder/builders/section-rules/rename-page.rules.ts +17 -0
  330. package/src/metadata-builder/builders/section-rules/shapes-section.rules.ts +51 -0
  331. package/src/metadata-builder/builders/section-rules/social-links.rules.ts +27 -0
  332. package/src/metadata-builder/builders/section-rules/testimonial-section.rules.ts +48 -0
  333. package/src/metadata-builder/builders/section-rules/text-section.rules.ts +28 -0
  334. package/src/metadata-builder/builders/shape-color-utils.test.ts +115 -0
  335. package/src/metadata-builder/builders/shape-color-utils.ts +75 -0
  336. package/src/metadata-builder/builders/undo-builder.ts +105 -0
  337. package/src/metadata-builder/builders/update-content-text-style-builder.ts +4 -1
  338. package/src/metadata-builder/helpers/rte.helpers.ts +27 -13
  339. package/src/metadata-builder/metadata-executor.ts +42 -2
  340. package/src/metadata-builder/models.ts +39 -1
  341. package/src/metadata-builder/parsers/ai-toolcall-parser.ts +152 -0
  342. package/src/metadata-builder/parsers/section-tool-arguments.ts +138 -24
  343. package/src/metadata-builder/sanitizers/__tests__/section-args-validator.test.ts +659 -0
  344. package/src/metadata-builder/sanitizers/rte-schema-check.ts +99 -0
  345. package/src/metadata-builder/sanitizers/sanitizer-rules.ts +97 -0
  346. package/src/metadata-builder/sanitizers/section-args-validator.ts +445 -0
  347. package/src/shared/content-settings/components/content-settings/ContentSettings.mixin.ts +10 -16
  348. package/src/shared/content-settings/components/content-settings/ContentSettings.stories.ts +0 -1
  349. package/src/shared/content-settings/components/content-settings-item/ContentSettingsItemField.mixin.ts +6 -10
  350. package/src/shared/content-settings/components/content-settings-item/ContentSettingsItemField.vue +1 -23
  351. package/src/shared/content-settings/components/testimonial-items-field/TestimonialItemsField.vue +0 -15
  352. package/src/shared/content-settings/components/text-items-field/TextItemsField.vue +0 -15
  353. package/src/shared/navigation-style-settings/store/index.ts +5 -0
  354. package/src/shared/page-navigation/store/page-navigation-store.ts +4 -31
  355. package/src/shared/page-navigation/utils/nav-order-utils.ts +32 -0
  356. package/src/shared/side-bar/components/SideBar.vue +14 -1
  357. package/src/shared/side-bar/store/side-bar-store.ts +0 -20
  358. package/src/utils/build-asset-manifest.ts +153 -0
  359. package/src/utils/minify-brand-page-metadata.ts +362 -130
  360. package/lib/src/brand-page-maker/composables/ai-chat/useAiChat.js +0 -368
  361. package/lib/src/brand-page-maker/composables/ai-chat/useAiTextEditPrompts.d.ts +0 -18
  362. package/lib/src/brand-page-maker/composables/ai-chat/useAiTextEditPrompts.js +0 -144
  363. package/lib/src/brand-page-maker/stores/ai-thread/ai-thread-store.d.ts +0 -155
  364. package/lib/src/brand-page-maker/stores/ai-thread/ai-thread-store.js +0 -25
  365. package/lib/src/brand-page-maker/utils/mixpanel.util.d.ts +0 -1
  366. package/lib/src/brand-page-maker/utils/mixpanel.util.js +0 -29
  367. package/lib/src/bundled-translations-CNK7l6_v.js +0 -173
  368. package/lib/src/bundled-translations.de-DE-BLE4_y0H.js +0 -173
  369. package/lib/src/bundled-translations.es-ES-thO9osbg.js +0 -173
  370. package/lib/src/bundled-translations.fr-CA-BZkhiNgU.js +0 -173
  371. package/lib/src/bundled-translations.fr-FR-bhDLPKgZ.js +0 -173
  372. package/lib/src/bundled-translations.pt-BR-CI9a5Bq1.js +0 -173
  373. package/lib/src/bundled-translations.pt-PT-DBoErBaq.js +0 -173
  374. package/src/brand-page-maker/components/ai-text-edit/AiTextEdit.vue +0 -154
  375. package/src/brand-page-maker/composables/ai-chat/useAiChat.ts +0 -562
  376. package/src/brand-page-maker/composables/ai-chat/useAiTextEditPrompts.ts +0 -196
  377. package/src/brand-page-maker/stores/ai-thread/ai-thread-store.ts +0 -31
  378. package/src/brand-page-maker/utils/mixpanel.util.ts +0 -42
  379. package/src/shared/content-settings/components/generate-ai-button/GenerateAiButton.vue +0 -114
  380. package/src/shared/content-settings/components/generate-ai-modal/GenerateAiModal.vue +0 -761
@@ -1,8 +1,29 @@
1
1
  import { type BrandPageModel } from '../brand-page/models';
2
+ import type { EventTracker } from '../brand-page-maker/composables/useEventTracker';
3
+ import type { UndoHandler } from './builders/undo-builder';
2
4
  import type { Logger } from './logger';
3
5
  import { type MetadataExecutorResult } from './models';
4
6
  import { type ParsedToolCall } from './parsers/ai-toolcall-parser';
5
7
  export declare const executeToolCallsAsync: (metadata: BrandPageModel, toolcalls: ParsedToolCall[], options: {
6
8
  logger?: Logger;
7
9
  maxCharacters?: number;
10
+ /**
11
+ * Callback invoked by the UndoBuilder at execution time to resolve the
12
+ * pre-prompt snapshot to restore to. The library is agnostic about where
13
+ * the snapshot lives — the caller decides (e.g. read from a Pinia store,
14
+ * IndexedDB, remote API). Return `null` when no snapshot is available;
15
+ * the UndoBuilder will surface a clear error.
16
+ *
17
+ * Required when the toolcalls include an `undo` call. If omitted, the
18
+ * library substitutes a `() => null` handler so undo produces a
19
+ * well-defined error rather than a cryptic failure.
20
+ */
21
+ undoHandler?: UndoHandler;
22
+ /**
23
+ * Optional AI-prompt-originated event tracker. When provided, builders
24
+ * that add or remove sections invoke the tracker at the mutation point.
25
+ * Passed by reference so thread/build IDs and user plan can be resolved
26
+ * fresh at fire time by the composable layer.
27
+ */
28
+ eventTracker?: EventTracker;
8
29
  }) => Promise<MetadataExecutorResult>;
@@ -3,7 +3,10 @@ import { buildUpdateTextRequest } from './builders/update-content-text-builder';
3
3
  import { buildUpdateTextStyleRequest } from './builders/update-content-text-style-builder';
4
4
  import { MetadataExecutor } from './metadata-executor';
5
5
  import { BUILDER_TYPES, } from './models';
6
- import { AI_ASSISTANT_TOOL_NAMES, SECTION_TOOL_MAP, } from './parsers/ai-toolcall-parser';
6
+ import { AI_ASSISTANT_TOOL_NAMES, SECTION_TOOL_MAP,
7
+ // UndoArguments intentionally not destructured here — the undo tool call has
8
+ // no fields. Its presence is the entire signal.
9
+ } from './parsers/ai-toolcall-parser';
7
10
  export const executeToolCallsAsync = async (metadata, toolcalls, options) => {
8
11
  const requests = toolcalls
9
12
  .map((toolcall) => {
@@ -68,13 +71,62 @@ export const executeToolCallsAsync = async (metadata, toolcalls, options) => {
68
71
  },
69
72
  };
70
73
  }
74
+ case AI_ASSISTANT_TOOL_NAMES.RENAME_PAGE: {
75
+ const arg = toolcall.arguments;
76
+ return {
77
+ id: toolcall.toolId,
78
+ type: BUILDER_TYPES.RENAME_PAGE,
79
+ payload: {
80
+ pageId: arg.page_id,
81
+ pageName: arg.page_name,
82
+ },
83
+ };
84
+ }
85
+ case AI_ASSISTANT_TOOL_NAMES.UPDATE_FOOTER: {
86
+ const arg = toolcall.arguments;
87
+ return {
88
+ id: toolcall.toolId,
89
+ type: BUILDER_TYPES.UPDATE_FOOTER,
90
+ payload: arg,
91
+ };
92
+ }
93
+ case AI_ASSISTANT_TOOL_NAMES.UPDATE_GLOBAL_STYLES: {
94
+ const arg = toolcall.arguments;
95
+ return {
96
+ id: toolcall.toolId,
97
+ type: BUILDER_TYPES.UPDATE_GLOBAL_STYLES,
98
+ payload: arg,
99
+ };
100
+ }
101
+ case AI_ASSISTANT_TOOL_NAMES.UPDATE_HEADER: {
102
+ const arg = toolcall.arguments;
103
+ return {
104
+ id: toolcall.toolId,
105
+ type: BUILDER_TYPES.UPDATE_HEADER,
106
+ payload: arg,
107
+ };
108
+ }
109
+ case AI_ASSISTANT_TOOL_NAMES.UNDO: {
110
+ // The undo tool has no wire arguments — the builder resolves the
111
+ // snapshot by invoking the caller-supplied undoHandler at execute
112
+ // time. If the caller didn't supply one, substitute a null-returning
113
+ // handler so the builder surfaces a clear "nothing to restore"
114
+ // error rather than a vaguer validation failure.
115
+ return {
116
+ id: toolcall.toolId,
117
+ type: BUILDER_TYPES.UNDO_WEBSITE,
118
+ payload: {
119
+ undoHandler: options.undoHandler ?? (() => null),
120
+ },
121
+ };
122
+ }
71
123
  default: {
72
124
  const sectionTool = SECTION_TOOL_MAP[toolcall.function];
73
125
  if (!sectionTool) {
74
126
  console.warn(`[executeToolCallsAsync] Skipping unsupported tool call: ${toolcall.function}`);
75
127
  return null;
76
128
  }
77
- const { mode, content_id: contentId, page_id: pageId, arguments: sectionArgs, } = toolcall.arguments;
129
+ const { mode, content_id: contentId, page_id: pageId, move_before_content_id: moveBeforeContentId, arguments: sectionArgs, } = toolcall.arguments;
78
130
  const builderType = `${mode}-${sectionTool.sectionType}`;
79
131
  return {
80
132
  id: toolcall.toolId,
@@ -84,6 +136,7 @@ export const executeToolCallsAsync = async (metadata, toolcalls, options) => {
84
136
  contentId: contentId,
85
137
  arguments: sectionArgs,
86
138
  pageId: pageId,
139
+ moveBeforeContentId: moveBeforeContentId,
87
140
  },
88
141
  };
89
142
  }
@@ -92,5 +145,5 @@ export const executeToolCallsAsync = async (metadata, toolcalls, options) => {
92
145
  .filter((r) => r !== null);
93
146
  options.logger?.log('executeToolCallsAsync', { requests });
94
147
  const executor = new MetadataExecutor();
95
- return await executor.executeAsync(metadata, requests, options.logger);
148
+ return await executor.executeAsync(metadata, requests, options.logger, options.eventTracker);
96
149
  };
@@ -1,10 +1,8 @@
1
1
  import { type BrandPageModel } from '../../brand-page/models';
2
2
  import { BaseMetadataBuilder, type BuilderResult, type MetadataBuilderRequest } from '../models';
3
3
  import type { Logger } from '../logger';
4
- export interface AddPagePayload {
5
- pageId: string;
6
- pageName: string;
7
- }
4
+ import { type AddPagePayload } from './section-rules/add-page.rules';
5
+ export type { AddPagePayload };
8
6
  export declare class AddPageBuilder extends BaseMetadataBuilder<AddPagePayload> {
9
7
  constructor(request: MetadataBuilderRequest<AddPagePayload>, logger?: Logger);
10
8
  validateAsync(): Promise<{
@@ -1,19 +1,16 @@
1
1
  import { PageModel } from '../../brand-page/models';
2
2
  import { getPageSlugFromPageTitle } from '../../brand-page-maker/utils/slug.util';
3
3
  import { BaseMetadataBuilder, } from '../models';
4
+ import { ADD_PAGE_CHECKS, } from './section-rules/add-page.rules';
4
5
  export class AddPageBuilder extends BaseMetadataBuilder {
5
6
  constructor(request, logger) {
6
7
  super(request, logger);
7
8
  }
8
9
  async validateAsync() {
9
- const errors = [];
10
- const payload = this.request.payload;
11
- if (!payload?.pageId) {
12
- errors.push('page_id is required for add_page');
13
- }
14
- if (!payload?.pageName) {
15
- errors.push('page_name is required for add_page');
16
- }
10
+ const errors = ADD_PAGE_CHECKS.flatMap((check) => {
11
+ const err = check(this.request.payload);
12
+ return err ? [err] : [];
13
+ });
17
14
  return { errors };
18
15
  }
19
16
  async buildAsync(model) {
@@ -0,0 +1,11 @@
1
+ import { type BrandPageModel } from '../../brand-page/models';
2
+ import { BaseMetadataBuilder, type BuilderResult, type MetadataBuilderRequest } from '../models';
3
+ import type { UpdateFooterArguments } from '../parsers/ai-toolcall-parser';
4
+ import type { Logger } from '../logger';
5
+ export declare class FooterBuilder extends BaseMetadataBuilder<UpdateFooterArguments> {
6
+ constructor(request: MetadataBuilderRequest<UpdateFooterArguments>, logger?: Logger);
7
+ validateAsync(): Promise<{
8
+ errors: string[];
9
+ }>;
10
+ buildAsync(model: BrandPageModel): Promise<BuilderResult>;
11
+ }
@@ -0,0 +1,151 @@
1
+ import {} from '../../brand-page/models';
2
+ import { BaseMetadataBuilder, } from '../models';
3
+ import { FOOTER_CHECKS } from './section-rules/footer.rules';
4
+ import { applyDetachedStyleOverride } from './section-field-utils';
5
+ const normaliseSocialUrl = (url) => {
6
+ for (const prefix of ['mailto:', 'tel:']) {
7
+ if (url.startsWith(prefix))
8
+ return url.slice(prefix.length);
9
+ }
10
+ return url;
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;
18
+ // _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.
21
+ 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
+ }));
30
+ }
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
+ }
54
+ }
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
+ });
69
+ }
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
+ }
80
+ }
81
+ }
82
+ };
83
+ const applyViewportFooterChanges = (footer, overrides) => {
84
+ if (overrides.display_style !== undefined)
85
+ footer.displayStyle = overrides.display_style;
86
+ if (overrides.background_color !== undefined) {
87
+ footer.backgroundStyle = {
88
+ ...footer.backgroundStyle,
89
+ backgroundColor: overrides.background_color ?? '',
90
+ };
91
+ }
92
+ if (overrides.icon_color !== undefined)
93
+ footer.iconStyle = {
94
+ ...footer.iconStyle,
95
+ color: overrides.icon_color,
96
+ fill: overrides.icon_color,
97
+ };
98
+ if (overrides.copyright_text_color !== undefined)
99
+ footer.copyrightStyle = {
100
+ ...footer.copyrightStyle,
101
+ color: overrides.copyright_text_color,
102
+ };
103
+ if (overrides.is_logo_visible !== undefined)
104
+ footer.isLogoVisible = overrides.is_logo_visible;
105
+ if (overrides.logo_image_height !== undefined)
106
+ footer.logoImageHeight = overrides.logo_image_height;
107
+ if (overrides.logo_image_width !== undefined)
108
+ footer.logoImageWidth = overrides.logo_image_width;
109
+ };
110
+ export class FooterBuilder extends BaseMetadataBuilder {
111
+ constructor(request, logger) {
112
+ super(request, logger);
113
+ }
114
+ async validateAsync() {
115
+ const args = this.request.payload ?? {};
116
+ try {
117
+ const errors = FOOTER_CHECKS.flatMap((check) => {
118
+ const err = check(args);
119
+ return err ? [err] : [];
120
+ });
121
+ return { errors };
122
+ }
123
+ catch (error) {
124
+ this.log({
125
+ message: 'Footer validation failed unexpectedly — skipping',
126
+ error,
127
+ });
128
+ return { errors: [] };
129
+ }
130
+ }
131
+ async buildAsync(model) {
132
+ this.log('Build called');
133
+ const validation = await this.validateAsync();
134
+ if (validation.errors.length) {
135
+ return { request: this.request, model, errors: validation.errors };
136
+ }
137
+ const args = this.request.payload ?? {};
138
+ const textStyleOptions = model.styles?.textStyles?.textStyleOptions;
139
+ // Global fields (copyright_text, social links) always apply to both viewports.
140
+ if (model.pageFooterDesktop)
141
+ applyGlobalFooterChanges(model.pageFooterDesktop, args, textStyleOptions);
142
+ if (model.pageFooterMobile)
143
+ applyGlobalFooterChanges(model.pageFooterMobile, args, textStyleOptions);
144
+ // Viewport-specific styling via explicit sub-objects.
145
+ if (args.desktop && model.pageFooterDesktop)
146
+ applyViewportFooterChanges(model.pageFooterDesktop, args.desktop);
147
+ if (args.mobile && model.pageFooterMobile)
148
+ applyViewportFooterChanges(model.pageFooterMobile, args.mobile);
149
+ return { request: this.request, model };
150
+ }
151
+ }
@@ -0,0 +1,15 @@
1
+ import { type BrandPageModel } from '../../brand-page/models';
2
+ import { BaseMetadataBuilder, type BuilderResult, type MetadataBuilderRequest } from '../models';
3
+ import type { UpdateGlobalStylesArguments } from '../parsers/ai-toolcall-parser';
4
+ import type { Logger } from '../logger';
5
+ export declare class GlobalStylesBuilder extends BaseMetadataBuilder<UpdateGlobalStylesArguments> {
6
+ constructor(request: MetadataBuilderRequest<UpdateGlobalStylesArguments>, logger?: Logger);
7
+ validateAsync(): Promise<{
8
+ errors: string[];
9
+ }>;
10
+ buildAsync(model: BrandPageModel): Promise<BuilderResult>;
11
+ private applyTextStyles;
12
+ private applyButtonStyles;
13
+ private applyBackgroundStyles;
14
+ private mergeStyleOptionStyle;
15
+ }
@@ -0,0 +1,129 @@
1
+ import {} from '../../brand-page/models';
2
+ import { BaseMetadataBuilder, } from '../models';
3
+ import { GLOBAL_STYLE_CHECKS, TEXT_STYLE_OPTION_KEYS, } from './section-rules/global-styles.rules';
4
+ export class GlobalStylesBuilder extends BaseMetadataBuilder {
5
+ constructor(request, logger) {
6
+ super(request, logger);
7
+ }
8
+ async validateAsync() {
9
+ const args = this.request.payload ?? {};
10
+ try {
11
+ const errors = GLOBAL_STYLE_CHECKS.flatMap((check) => {
12
+ const err = check(args);
13
+ return err ? [err] : [];
14
+ });
15
+ return { errors };
16
+ }
17
+ catch (error) {
18
+ this.log({
19
+ message: 'Global styles validation failed unexpectedly — skipping',
20
+ error,
21
+ });
22
+ return { errors: [] };
23
+ }
24
+ }
25
+ async buildAsync(model) {
26
+ this.log('Build called');
27
+ const args = this.request.payload ?? {};
28
+ if (args.backgroundStyles) {
29
+ this.applyBackgroundStyles(model, args.backgroundStyles);
30
+ }
31
+ if (args.textStyles) {
32
+ this.applyTextStyles(model, args.textStyles);
33
+ }
34
+ if (args.buttonStyles) {
35
+ this.applyButtonStyles(model, args.buttonStyles);
36
+ }
37
+ return { request: this.request, model };
38
+ }
39
+ applyTextStyles(model, textStyles) {
40
+ const ts = model.styles.textStyles;
41
+ // Deep-merge style (color)
42
+ if (textStyles.style) {
43
+ ts.style = { ...ts.style, ...textStyles.style };
44
+ }
45
+ // Merge textFontFamily
46
+ if (textStyles.textFontFamily !== undefined) {
47
+ ts.textFontFamily = textStyles.textFontFamily;
48
+ }
49
+ // Deep-merge textStyleOptions per category
50
+ if (textStyles.textStyleOptions) {
51
+ for (const key of TEXT_STYLE_OPTION_KEYS) {
52
+ const optionArgs = textStyles.textStyleOptions[key];
53
+ if (!optionArgs)
54
+ continue;
55
+ const existing = ts.textStyleOptions[key];
56
+ if (!existing)
57
+ continue;
58
+ if (optionArgs.style) {
59
+ this.mergeStyleOptionStyle(existing.style, optionArgs.style);
60
+ // Mark as modified when style properties change
61
+ existing.isModified = true;
62
+ }
63
+ if (optionArgs.isModified !== undefined) {
64
+ existing.isModified = optionArgs.isModified;
65
+ }
66
+ }
67
+ }
68
+ }
69
+ applyButtonStyles(model, buttonStyles) {
70
+ const bs = model.styles.buttonStyles;
71
+ // Deep-merge style (color, borderColor, backgroundColor)
72
+ if (buttonStyles.style) {
73
+ bs.style = { ...bs.style, ...buttonStyles.style };
74
+ }
75
+ // Deep-merge iconStyle (fill)
76
+ if (buttonStyles.iconStyle) {
77
+ bs.iconStyle = { ...bs.iconStyle, ...buttonStyles.iconStyle };
78
+ }
79
+ // Merge selectedButtonStyleId
80
+ if (buttonStyles.selectedButtonStyleId !== undefined) {
81
+ bs.selectedButtonStyleId = buttonStyles.selectedButtonStyleId;
82
+ }
83
+ }
84
+ applyBackgroundStyles(model, backgroundStyles) {
85
+ const bs = model.styles.backgroundStyles;
86
+ if (backgroundStyles.style) {
87
+ bs.style = { ...bs.style, ...backgroundStyles.style };
88
+ }
89
+ if (backgroundStyles.backgroundColor !== undefined) {
90
+ bs.style = { ...bs.style, background: backgroundStyles.backgroundColor };
91
+ }
92
+ if (backgroundStyles.shapeColor !== undefined) {
93
+ bs.backgroundShapeStyle = {
94
+ ...bs.backgroundShapeStyle,
95
+ color: backgroundStyles.shapeColor,
96
+ };
97
+ if (bs.backgroundShapes?.length) {
98
+ bs.backgroundShapes = bs.backgroundShapes.map((shape) => ({
99
+ ...shape,
100
+ style: { ...shape.style, color: backgroundStyles.shapeColor },
101
+ }));
102
+ }
103
+ }
104
+ if (backgroundStyles.backgroundImageUrl !== undefined) {
105
+ bs.backgroundImageUrl = backgroundStyles.backgroundImageUrl;
106
+ }
107
+ if (backgroundStyles.backgroundShapeUrl !== undefined) {
108
+ if (backgroundStyles.backgroundShapeUrl === '') {
109
+ bs.backgroundShapes = [];
110
+ }
111
+ else if (bs.backgroundShapes?.length) {
112
+ // Only update when shapes already exist — never add shapes to a site that has none.
113
+ // Update ALL shapes so every positional instance switches to the new shape type.
114
+ bs.backgroundShapes = bs.backgroundShapes.map((shape) => ({
115
+ ...shape,
116
+ name: backgroundStyles.backgroundShapeUrl,
117
+ }));
118
+ }
119
+ // If backgroundShapes is empty/absent: intentional no-op
120
+ }
121
+ }
122
+ mergeStyleOptionStyle(existing, incoming) {
123
+ for (const [key, value] of Object.entries(incoming)) {
124
+ if (value !== undefined) {
125
+ existing[key] = value;
126
+ }
127
+ }
128
+ }
129
+ }
@@ -0,0 +1,11 @@
1
+ import { type BrandPageModel } from '../../brand-page/models';
2
+ import { BaseMetadataBuilder, type BuilderResult, type MetadataBuilderRequest } from '../models';
3
+ import type { UpdateHeaderArguments } from '../parsers/ai-toolcall-parser';
4
+ import type { Logger } from '../logger';
5
+ export declare class HeaderBuilder extends BaseMetadataBuilder<UpdateHeaderArguments> {
6
+ constructor(request: MetadataBuilderRequest<UpdateHeaderArguments>, logger?: Logger);
7
+ validateAsync(): Promise<{
8
+ errors: string[];
9
+ }>;
10
+ buildAsync(model: BrandPageModel): Promise<BuilderResult>;
11
+ }
@@ -0,0 +1,167 @@
1
+ import {} from '../../brand-page/models';
2
+ import { BaseMetadataBuilder, } from '../models';
3
+ import { getPageSlugFromPageTitle } from '../../brand-page-maker/utils/slug.util';
4
+ import { HEADER_CHECKS } from './section-rules/header.rules';
5
+ import { applyDetachedStyleOverride } from './section-field-utils';
6
+ const applyViewportHeaderChanges = (header, overrides, textStyleOptions) => {
7
+ if (overrides.display_style !== undefined) {
8
+ header.displayStyle = overrides.display_style;
9
+ }
10
+ if (overrides.background_color !== undefined) {
11
+ header.backgroundStyle = {
12
+ ...header.backgroundStyle,
13
+ backgroundColor: overrides.background_color ?? '',
14
+ };
15
+ }
16
+ if (overrides.is_logo_visible !== undefined) {
17
+ header.isLogoVisible = overrides.is_logo_visible;
18
+ }
19
+ if (overrides.logo_image_height !== undefined) {
20
+ header.logoImageHeight = overrides.logo_image_height;
21
+ }
22
+ if (overrides.logo_image_width !== undefined) {
23
+ header.logoImageWidth = overrides.logo_image_width;
24
+ }
25
+ if (overrides.nav_display_type !== undefined && header.navigation) {
26
+ header.navigation.displayType = overrides.nav_display_type;
27
+ }
28
+ if (overrides.link_text_color !== undefined && header.navigation) {
29
+ header.navigation.defaultButtonStyle = {
30
+ ...header.navigation.defaultButtonStyle,
31
+ color: overrides.link_text_color,
32
+ };
33
+ }
34
+ if (overrides.link_text_font !== undefined && header.navigation) {
35
+ header.navigation.defaultButtonStyle = applyDetachedStyleOverride(header.navigation.defaultButtonStyle, { fontFamily: overrides.link_text_font }, textStyleOptions);
36
+ }
37
+ if (overrides.link_bg_color !== undefined && header.navigation) {
38
+ header.navigation.defaultButtonStyle = {
39
+ ...header.navigation.defaultButtonStyle,
40
+ backgroundColor: overrides.link_bg_color ?? '',
41
+ };
42
+ }
43
+ if (overrides.link_selected_color !== undefined && header.navigation) {
44
+ header.navigation.selectedButtonStyle = {
45
+ ...header.navigation.selectedButtonStyle,
46
+ color: overrides.link_selected_color,
47
+ };
48
+ }
49
+ if (overrides.link_selected_bg_color !== undefined && header.navigation) {
50
+ header.navigation.selectedButtonStyle = {
51
+ ...header.navigation.selectedButtonStyle,
52
+ backgroundColor: overrides.link_selected_bg_color ?? '',
53
+ };
54
+ }
55
+ if (overrides.link_selected_border_color !== undefined && header.navigation) {
56
+ header.navigation.selectedButtonStyle = {
57
+ ...header.navigation.selectedButtonStyle,
58
+ borderColor: overrides.link_selected_border_color,
59
+ };
60
+ }
61
+ if (overrides.link_default_border_color !== undefined && header.navigation) {
62
+ header.navigation.defaultButtonStyle = {
63
+ ...header.navigation.defaultButtonStyle,
64
+ borderColor: overrides.link_default_border_color ?? '',
65
+ };
66
+ }
67
+ if (overrides.hamburger_icon_color !== undefined &&
68
+ header.navigation?.hamburgerMenuStyle) {
69
+ header.navigation.hamburgerMenuStyle.iconStyle = {
70
+ ...header.navigation.hamburgerMenuStyle.iconStyle,
71
+ color: overrides.hamburger_icon_color,
72
+ };
73
+ }
74
+ if (overrides.hamburger_icon_bg_color !== undefined &&
75
+ header.navigation?.hamburgerMenuStyle) {
76
+ header.navigation.hamburgerMenuStyle.iconStyle = {
77
+ ...header.navigation.hamburgerMenuStyle.iconStyle,
78
+ backgroundColor: overrides.hamburger_icon_bg_color ?? '',
79
+ };
80
+ }
81
+ if (overrides.overlay_default_text_color !== undefined &&
82
+ header.navigation?.hamburgerMenuStyle) {
83
+ header.navigation.hamburgerMenuStyle.defaultButtonStyle = {
84
+ ...header.navigation.hamburgerMenuStyle.defaultButtonStyle,
85
+ color: overrides.overlay_default_text_color ?? '',
86
+ };
87
+ }
88
+ if (overrides.overlay_default_bg_color !== undefined &&
89
+ header.navigation?.hamburgerMenuStyle) {
90
+ header.navigation.hamburgerMenuStyle.defaultButtonStyle = {
91
+ ...header.navigation.hamburgerMenuStyle.defaultButtonStyle,
92
+ backgroundColor: overrides.overlay_default_bg_color ?? '',
93
+ };
94
+ }
95
+ if (overrides.overlay_selected_text_color !== undefined &&
96
+ header.navigation?.hamburgerMenuStyle) {
97
+ header.navigation.hamburgerMenuStyle.selectedButtonStyle = {
98
+ ...header.navigation.hamburgerMenuStyle.selectedButtonStyle,
99
+ color: overrides.overlay_selected_text_color ?? '',
100
+ };
101
+ }
102
+ if (overrides.overlay_selected_bg_color !== undefined &&
103
+ header.navigation?.hamburgerMenuStyle) {
104
+ header.navigation.hamburgerMenuStyle.selectedButtonStyle = {
105
+ ...header.navigation.hamburgerMenuStyle.selectedButtonStyle,
106
+ backgroundColor: overrides.overlay_selected_bg_color ?? '',
107
+ };
108
+ }
109
+ };
110
+ const applyNavRouteChanges = (model, routes) => {
111
+ for (const routeUpdate of routes) {
112
+ if (routeUpdate.route_index === undefined)
113
+ continue;
114
+ const target = model.nav?.routes?.[routeUpdate.route_index];
115
+ if (!target)
116
+ continue;
117
+ if (routeUpdate.display_name !== undefined) {
118
+ target.displayName = routeUpdate.display_name;
119
+ // Recalculate pageSlug based on new display name
120
+ const existingSlugs = (model.nav?.routes ?? []).map((r) => r.pageSlug);
121
+ target.pageSlug = getPageSlugFromPageTitle(routeUpdate.display_name, existingSlugs);
122
+ }
123
+ }
124
+ };
125
+ export class HeaderBuilder extends BaseMetadataBuilder {
126
+ constructor(request, logger) {
127
+ super(request, logger);
128
+ }
129
+ async validateAsync() {
130
+ const args = this.request.payload ?? {};
131
+ try {
132
+ const errors = HEADER_CHECKS.flatMap((check) => {
133
+ const err = check(args);
134
+ return err ? [err] : [];
135
+ });
136
+ return { errors };
137
+ }
138
+ catch (error) {
139
+ this.log({
140
+ message: 'Header validation failed unexpectedly — skipping',
141
+ error,
142
+ });
143
+ return { errors: [] };
144
+ }
145
+ }
146
+ async buildAsync(model) {
147
+ this.log('Build called');
148
+ const validation = await this.validateAsync();
149
+ if (validation.errors.length) {
150
+ return { request: this.request, model, errors: validation.errors };
151
+ }
152
+ const args = this.request.payload ?? {};
153
+ const textStyleOptions = model.styles?.textStyles?.textStyleOptions;
154
+ // Apply nav route changes first
155
+ if (args.nav_routes) {
156
+ applyNavRouteChanges(model, args.nav_routes);
157
+ }
158
+ // Apply viewport-specific styling via explicit sub-objects
159
+ if (args.desktop && model.pageHeaderDesktop) {
160
+ applyViewportHeaderChanges(model.pageHeaderDesktop, args.desktop, textStyleOptions);
161
+ }
162
+ if (args.mobile && model.pageHeaderMobile) {
163
+ applyViewportHeaderChanges(model.pageHeaderMobile, args.mobile, textStyleOptions);
164
+ }
165
+ return { request: this.request, model };
166
+ }
167
+ }
@@ -0,0 +1,12 @@
1
+ import { type BrandPageModel } from '../../brand-page/models';
2
+ import { BaseMetadataBuilder, type BuilderResult, type MetadataBuilderRequest } from '../models';
3
+ import type { Logger } from '../logger';
4
+ import { type RenamePagePayload } from './section-rules/rename-page.rules';
5
+ export type { RenamePagePayload };
6
+ export declare class RenamePageBuilder extends BaseMetadataBuilder<RenamePagePayload> {
7
+ constructor(request: MetadataBuilderRequest<RenamePagePayload>, logger?: Logger);
8
+ validateAsync(): Promise<{
9
+ errors: string[];
10
+ }>;
11
+ buildAsync(model: BrandPageModel): Promise<BuilderResult>;
12
+ }