@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
@@ -18,12 +18,20 @@ const bannerFields = defineFieldMap({
18
18
  button_text: 'buttonText',
19
19
  button_url: 'url',
20
20
  background_image_url: 'imageUrl',
21
+ background_shape_url: 'imageUrl',
21
22
  display_style: 'displayStyle',
22
23
  });
24
+ const bookingFields = defineFieldMap({
25
+ title: 'title',
26
+ description: 'description',
27
+ button_text: 'buttonText',
28
+ button_url: 'url',
29
+ });
23
30
  const aboutFields = defineFieldMap({
24
31
  title: 'title',
25
32
  paragraph: 'paragraph',
26
33
  about_image_url: 'imageUrl',
34
+ about_shape_url: 'imageUrl',
27
35
  display_style: 'displayStyle',
28
36
  });
29
37
  const testimonialFields = defineFieldMap({
@@ -67,8 +75,8 @@ const contactFormFields = defineFieldMap({
67
75
  layout_style: 'layoutStyle',
68
76
  });
69
77
  const mailingListFields = defineFieldMap({
70
- title: 'title',
71
78
  button_text: 'buttonText',
79
+ accepted_fields: 'acceptedFields',
72
80
  });
73
81
  const socialLinksFields = defineFieldMap({
74
82
  title: 'title',
@@ -77,13 +85,15 @@ const socialLinksFields = defineFieldMap({
77
85
  });
78
86
  const dividerFields = defineFieldMap({
79
87
  divider_style: 'dividerStyle',
88
+ padding: 'paddingStyle',
80
89
  });
81
90
  const imageFields = defineFieldMap({
82
91
  image_url: 'imageUrl',
83
92
  image_title: 'imageTitle',
84
93
  });
85
94
  const imageGalleryFields = defineFieldMap({
86
- // images handled separately
95
+ is_full_width: 'isFullWidth',
96
+ // images handled separately
87
97
  });
88
98
  const buttonWithIconFields = defineFieldMap({
89
99
  title: 'title',
@@ -106,6 +116,7 @@ const socialButtonFields = defineFieldMap({
106
116
  });
107
117
  export const SECTION_FIELD_MAPS = {
108
118
  'banner-section': bannerFields,
119
+ 'booking-section': bookingFields,
109
120
  'about-section': aboutFields,
110
121
  'testimonial-section': testimonialFields,
111
122
  'images-section': imagesSectionFields,
@@ -163,6 +174,7 @@ const imagesSectionStyleFields = defineFieldMap({
163
174
  description_style: 'descriptionStyle',
164
175
  heading_style: 'headingStyle',
165
176
  paragraph_style: 'paragraphStyle',
177
+ button_text_style: 'buttonTextStyle',
166
178
  });
167
179
  const shapesSectionStyleFields = defineFieldMap({
168
180
  title_style: 'titleStyle',
@@ -170,13 +182,29 @@ const shapesSectionStyleFields = defineFieldMap({
170
182
  heading_style: 'headingStyle',
171
183
  paragraph_style: 'paragraphStyle',
172
184
  });
185
+ const bookingStyleFields = defineFieldMap({
186
+ title_style: 'titleStyle',
187
+ description_style: 'descriptionStyle',
188
+ button_text_style: 'buttonTextStyle',
189
+ });
190
+ const mailingListStyleFields = defineFieldMap({
191
+ title_style: 'titleStyle',
192
+ button_text_style: 'buttonTextStyle',
193
+ });
194
+ const socialLinksStyleFields = defineFieldMap({
195
+ icon_fill_style: 'iconFillStyles',
196
+ icon_background_style: 'iconBackgroundStyles',
197
+ });
173
198
  export const STYLE_FIELD_MAPS = {
174
199
  'banner-section': bannerStyleFields,
200
+ 'booking-section': bookingStyleFields,
175
201
  'about-section': aboutStyleFields,
176
202
  text: textStyleFields,
177
203
  'testimonial-section': testimonialStyleFields,
178
204
  'contact-form': contactFormStyleFields,
179
205
  'images-section': imagesSectionStyleFields,
180
206
  'shapes-section': shapesSectionStyleFields,
207
+ 'mailing-list': mailingListStyleFields,
208
+ 'social-links': socialLinksStyleFields,
181
209
  };
182
210
  export const getStyleFieldMap = (sectionType) => STYLE_FIELD_MAPS[sectionType];
@@ -1,11 +1,50 @@
1
1
  import type { Content } from '../../brand-page/models';
2
- import type { SectionToolArguments } from '../parsers/section-tool-arguments';
2
+ import type { ButtonLinkType } from '../../brand-page/models';
3
+ import type { TextStyleOptions } from '../../brand-page/models/styles.model';
4
+ import { type SectionToolArguments } from '../parsers/section-tool-arguments';
5
+ export declare const isValidUrl: (value: unknown) => boolean;
6
+ interface ButtonLinkContent {
7
+ url: string;
8
+ email?: string;
9
+ tel?: string;
10
+ buttonPageId: string;
11
+ buttonLinkType: ButtonLinkType;
12
+ }
13
+ interface ButtonLinkArgs {
14
+ button_link_type?: 'url' | 'page' | 'mailTo' | 'tel';
15
+ button_url?: string;
16
+ }
17
+ /**
18
+ * Sets buttonLinkType and the corresponding link value field (url/email/tel/buttonPageId)
19
+ * on any section content that supports multiple button link types.
20
+ * Must be called after applyScalarFields() since that sets content.url as a baseline.
21
+ */
22
+ export declare const applyButtonLink: (content: ButtonLinkContent, args: ButtonLinkArgs) => void;
3
23
  export declare const applyScalarFields: (content: Content, args: SectionToolArguments, sectionType: string) => void;
4
- export declare const applyStyleFields: (content: Content, args: SectionToolArguments, sectionType: string) => void;
5
24
  /**
6
- * Re-applies merged styles to RTE content fields after applyStyleFields has
7
- * updated the style objects. Only runs for section types that support RTE
8
- * (defined by RTE_ALLOWED_SECTION_TYPES) and only touches fields in the
9
- * RTE_ALLOWED_FIELDS list.
25
+ * When an executor is about to mark a content-level text style "custom" by
26
+ * clearing `textStyleType`, the resolved preset values (font, size, spacing,
27
+ * etc.) must first be copied onto the style — otherwise the renderer falls
28
+ * back to browser defaults because `textStyleType` no longer points at a
29
+ * preset.
30
+ *
31
+ * The category is read from the existing `style.textStyleType`, which is the
32
+ * authoritative per-section + per-field reference set by the content factory.
33
+ * Existing style values win over preset defaults (the content may already
34
+ * carry user overrides on top of the preset).
35
+ */
36
+ export declare const resolveGlobalPresetIntoStyle: (style: object | undefined, textStyleOptions: TextStyleOptions | undefined) => Record<string, unknown>;
37
+ /**
38
+ * Applies per-element style overrides while detaching the element from any
39
+ * global text-style preset. When a style is bound to a `textStyleType` preset,
40
+ * the renderer (`getCopyrightTextStyle` / `getTextStyleByContentTextStyle`)
41
+ * replaces the whole style with that preset and discards per-element values such
42
+ * as `fontFamily`. Resolving the preset in and clearing `textStyleType` makes the
43
+ * override stick — the same disconnect rule section content follows.
44
+ *
45
+ * Idempotent: once `textStyleType` is cleared, subsequent calls just merge the
46
+ * updates without re-resolving a preset.
10
47
  */
11
- export declare const applyRTEStyles: (content: Content, args: SectionToolArguments, sectionType: string) => void;
48
+ export declare const applyDetachedStyleOverride: <T extends object>(current: T | undefined, updates: Partial<T>, textStyleOptions: TextStyleOptions | undefined) => T;
49
+ export declare const applyStyleFields: (content: Content, args: SectionToolArguments, sectionType: string, textStyleOptions?: TextStyleOptions) => void;
50
+ export {};
@@ -1,8 +1,8 @@
1
- import { RTE_ALLOWED_SECTION_TYPES } from '../../brand-page-maker/utils';
2
- import { updateRTEText } from '../helpers/rte.helpers';
1
+ import { BUTTON_LINK_TYPE } from '../../brand-page/models';
2
+ import { isTiptapDocument, } from '../parsers/section-tool-arguments';
3
3
  import { getSectionFieldMap, getStyleFieldMap } from './section-field-maps';
4
4
  const isUrlField = (aiKey) => aiKey.endsWith('_url');
5
- const isValidUrl = (value) => {
5
+ export const isValidUrl = (value) => {
6
6
  if (typeof value !== 'string' || !value)
7
7
  return false;
8
8
  try {
@@ -13,6 +13,27 @@ const isValidUrl = (value) => {
13
13
  return false;
14
14
  }
15
15
  };
16
+ /**
17
+ * Sets buttonLinkType and the corresponding link value field (url/email/tel/buttonPageId)
18
+ * on any section content that supports multiple button link types.
19
+ * Must be called after applyScalarFields() since that sets content.url as a baseline.
20
+ */
21
+ export const applyButtonLink = (content, args) => {
22
+ const { button_link_type: linkType, button_url: buttonUrl } = args;
23
+ if (!linkType || !buttonUrl)
24
+ return;
25
+ content.buttonLinkType = linkType;
26
+ switch (linkType) {
27
+ case BUTTON_LINK_TYPE.url:
28
+ case BUTTON_LINK_TYPE.mailTo:
29
+ case BUTTON_LINK_TYPE.tel:
30
+ content.url = buttonUrl;
31
+ break;
32
+ case BUTTON_LINK_TYPE.page:
33
+ content.buttonPageId = buttonUrl.replace('pageid:', '');
34
+ break;
35
+ }
36
+ };
16
37
  export const applyScalarFields = (content, args, sectionType) => {
17
38
  const fieldMap = getSectionFieldMap(sectionType);
18
39
  if (!fieldMap)
@@ -20,10 +41,14 @@ export const applyScalarFields = (content, args, sectionType) => {
20
41
  const record = content;
21
42
  for (const [aiKey, modelKey] of Object.entries(fieldMap)) {
22
43
  if (aiKey in args) {
44
+ const value = args[aiKey];
23
45
  // Skip invalid URLs — don't overwrite model with malformed values
24
- if (isUrlField(aiKey) && !isValidUrl(args[aiKey]))
46
+ if (isUrlField(aiKey) && !isValidUrl(value))
47
+ continue;
48
+ // Skip Tiptap JSON documents — each builder handles its own RTE fields
49
+ if (isTiptapDocument(value))
25
50
  continue;
26
- record[modelKey] = args[aiKey];
51
+ record[modelKey] = value;
27
52
  }
28
53
  }
29
54
  };
@@ -41,74 +66,73 @@ const normalizeStyleValue = (key, value) => {
41
66
  if (key === 'letterSpacing' && typeof value === 'number') {
42
67
  return `${value / 100}em`;
43
68
  }
44
- if (key === 'lineHeight' && typeof value === 'number') {
45
- return String(value);
69
+ if (key === 'lineHeight') {
70
+ // Snap to 0.1 increments to match the UI slider step
71
+ const num = typeof value === 'number' ? value : parseFloat(String(value));
72
+ if (!isNaN(num))
73
+ return String(Math.floor(num * 10) / 10);
46
74
  }
47
75
  return value;
48
76
  };
49
- export const applyStyleFields = (content, args, sectionType) => {
50
- const styleMap = getStyleFieldMap(sectionType);
51
- if (!styleMap)
52
- return;
53
- const record = content;
54
- for (const [aiKey, modelKey] of Object.entries(styleMap)) {
55
- if (aiKey in args && args[aiKey] && typeof args[aiKey] === 'object') {
56
- const existing = content[modelKey] || {};
57
- const aiStyle = args[aiKey];
58
- const filtered = {};
59
- for (const [k, v] of Object.entries(aiStyle)) {
60
- const normalized = normalizeStyleValue(k, v);
61
- if (normalized !== undefined)
62
- filtered[k] = normalized;
63
- }
64
- record[modelKey] = {
65
- ...existing,
66
- ...filtered,
67
- textStyleType: undefined,
68
- };
69
- }
70
- }
71
- };
72
77
  /**
73
- * RTE field → style field pairs for fields that support rich text editing.
74
- * Matches the RTE_ALLOWED_FIELDS constant from rich-text-editor.util.ts:
75
- * ['title', 'description', 'text', 'textItems']
78
+ * When an executor is about to mark a content-level text style "custom" by
79
+ * clearing `textStyleType`, the resolved preset values (font, size, spacing,
80
+ * etc.) must first be copied onto the style — otherwise the renderer falls
81
+ * back to browser defaults because `textStyleType` no longer points at a
82
+ * preset.
76
83
  *
77
- * textItems is excluded here because it requires per-item handling
78
- * (each TextItem has its own textStyle) — handled by TextSectionBuilder.
84
+ * The category is read from the existing `style.textStyleType`, which is the
85
+ * authoritative per-section + per-field reference set by the content factory.
86
+ * Existing style values win over preset defaults (the content may already
87
+ * carry user overrides on top of the preset).
79
88
  */
80
- const RTE_FIELD_STYLE_PAIRS = [
81
- { textField: 'title', styleField: 'titleStyle', argKey: 'title_style' },
82
- {
83
- textField: 'description',
84
- styleField: 'descriptionStyle',
85
- argKey: 'description_style',
86
- },
87
- { textField: 'text', styleField: 'textStyle', argKey: 'text_style' },
88
- {
89
- textField: 'paragraph',
90
- styleField: 'paragraphStyle',
91
- argKey: 'paragraph_style',
92
- },
93
- ];
89
+ export const resolveGlobalPresetIntoStyle = (style, textStyleOptions) => {
90
+ const base = { ...(style ?? {}) };
91
+ const currentTextStyleType = base.textStyleType;
92
+ if (!currentTextStyleType || !textStyleOptions?.[currentTextStyleType]) {
93
+ base.textStyleType = undefined;
94
+ return base;
95
+ }
96
+ const presetStyle = textStyleOptions[currentTextStyleType].style;
97
+ const presetDefaults = {};
98
+ for (const [k, v] of Object.entries(presetStyle)) {
99
+ if (k === 'textStyleType' || v === undefined)
100
+ continue;
101
+ presetDefaults[k] = v;
102
+ }
103
+ return { ...presetDefaults, ...base, textStyleType: undefined };
104
+ };
94
105
  /**
95
- * Re-applies merged styles to RTE content fields after applyStyleFields has
96
- * updated the style objects. Only runs for section types that support RTE
97
- * (defined by RTE_ALLOWED_SECTION_TYPES) and only touches fields in the
98
- * RTE_ALLOWED_FIELDS list.
106
+ * Applies per-element style overrides while detaching the element from any
107
+ * global text-style preset. When a style is bound to a `textStyleType` preset,
108
+ * the renderer (`getCopyrightTextStyle` / `getTextStyleByContentTextStyle`)
109
+ * replaces the whole style with that preset and discards per-element values such
110
+ * as `fontFamily`. Resolving the preset in and clearing `textStyleType` makes the
111
+ * override stick — the same disconnect rule section content follows.
112
+ *
113
+ * Idempotent: once `textStyleType` is cleared, subsequent calls just merge the
114
+ * updates without re-resolving a preset.
99
115
  */
100
- export const applyRTEStyles = (content, args, sectionType) => {
101
- if (!RTE_ALLOWED_SECTION_TYPES.includes(sectionType))
116
+ export const applyDetachedStyleOverride = (current, updates, textStyleOptions) => ({
117
+ ...resolveGlobalPresetIntoStyle(current, textStyleOptions),
118
+ ...updates,
119
+ });
120
+ export const applyStyleFields = (content, args, sectionType, textStyleOptions) => {
121
+ const styleMap = getStyleFieldMap(sectionType);
122
+ if (!styleMap)
102
123
  return;
103
124
  const record = content;
104
- const argsRecord = args;
105
- for (const { textField, styleField, argKey } of RTE_FIELD_STYLE_PAIRS) {
106
- if (!argsRecord[argKey])
125
+ for (const [aiKey, modelKey] of Object.entries(styleMap)) {
126
+ if (!(aiKey in args) || !args[aiKey] || typeof args[aiKey] !== 'object')
107
127
  continue;
108
- const text = record[textField];
109
- const style = record[styleField];
110
- if (typeof text === 'string' && style) {
111
- record[textField] = updateRTEText(text, style);
128
+ const aiStyle = args[aiKey];
129
+ const filtered = {};
130
+ for (const [k, v] of Object.entries(aiStyle)) {
131
+ const normalized = normalizeStyleValue(k, v);
132
+ if (normalized !== undefined)
133
+ filtered[k] = normalized;
112
134
  }
135
+ const resolved = resolveGlobalPresetIntoStyle(content[modelKey], textStyleOptions);
136
+ record[modelKey] = { ...resolved, ...filtered, textStyleType: undefined };
113
137
  }
114
138
  };
@@ -0,0 +1,2 @@
1
+ import { type ValidationContext } from '../../sanitizers/section-args-validator';
2
+ export declare function validateAboutSection(args: Record<string, unknown>, ctx: ValidationContext): string[];
@@ -0,0 +1,20 @@
1
+ import { MAX_TITLE_LENGTH, MAX_DESCRIPTION_LENGTH, } from '../../../brand-page/constants/font.constants';
2
+ import { enumCheck, runChecks, styleCheck, } from '../../sanitizers/section-args-validator';
3
+ import { textAndRteChecks } from '../../sanitizers/rte-schema-check';
4
+ const CHECKS = [
5
+ ...textAndRteChecks('title', MAX_TITLE_LENGTH),
6
+ ...textAndRteChecks('paragraph', MAX_DESCRIPTION_LENGTH),
7
+ styleCheck('title_style'),
8
+ styleCheck('paragraph_style'),
9
+ enumCheck('display_style', [
10
+ 'left-aligned',
11
+ 'right-aligned',
12
+ 'centered',
13
+ 'text-only',
14
+ 'left-aligned-full-image',
15
+ 'right-aligned-full-image',
16
+ ], 'about-section'),
17
+ ];
18
+ export function validateAboutSection(args, ctx) {
19
+ return runChecks(CHECKS, args, ctx);
20
+ }
@@ -0,0 +1,7 @@
1
+ export interface AddPagePayload {
2
+ pageId: string;
3
+ pageName: string;
4
+ }
5
+ type PageCheck = (payload: AddPagePayload | undefined) => string | null;
6
+ export declare const ADD_PAGE_CHECKS: PageCheck[];
7
+ export {};
@@ -0,0 +1,8 @@
1
+ import { PAGE_RULES } from '../../sanitizers/sanitizer-rules';
2
+ export const ADD_PAGE_CHECKS = [
3
+ (p) => (!p?.pageId ? 'page_id is required for add_page' : null),
4
+ (p) => (!p?.pageName ? 'page_name is required for add_page' : null),
5
+ (p) => p?.pageName && p.pageName.length > PAGE_RULES.pageName
6
+ ? `page_name exceeds the maximum length of ${PAGE_RULES.pageName} characters (got ${p.pageName.length})`
7
+ : null,
8
+ ];
@@ -0,0 +1,2 @@
1
+ import { type ValidationContext } from '../../sanitizers/section-args-validator';
2
+ export declare function validateBannerSection(args: Record<string, unknown>, ctx: ValidationContext): string[];
@@ -0,0 +1,27 @@
1
+ import { MAX_TITLE_LENGTH, MAX_DESCRIPTION_LENGTH, } from '../../../brand-page/constants/font.constants';
2
+ import { BUTTON_LINK_TYPE } from '../../../brand-page/models';
3
+ import { enumCheck, runChecks, styleCheck, } from '../../sanitizers/section-args-validator';
4
+ import { textAndRteChecks } from '../../sanitizers/rte-schema-check';
5
+ const CHECKS = [
6
+ ...textAndRteChecks('title', MAX_TITLE_LENGTH),
7
+ ...textAndRteChecks('description', MAX_DESCRIPTION_LENGTH),
8
+ ...textAndRteChecks('button_text', MAX_TITLE_LENGTH),
9
+ styleCheck('title_style'),
10
+ styleCheck('description_style'),
11
+ styleCheck('button_text_style'),
12
+ enumCheck('display_style', [
13
+ 'left-aligned',
14
+ 'right-aligned',
15
+ 'centered',
16
+ 'big-image',
17
+ 'left-aligned-big-image',
18
+ 'right-aligned-full-image',
19
+ 'left-aligned-full-image',
20
+ 'center-card-aligned-image',
21
+ 'left-card-aligned-image',
22
+ ], 'banner-section'),
23
+ enumCheck('button_link_type', Object.keys(BUTTON_LINK_TYPE), 'banner-section'),
24
+ ];
25
+ export function validateBannerSection(args, ctx) {
26
+ return runChecks(CHECKS, args, ctx);
27
+ }
@@ -0,0 +1,2 @@
1
+ import { type ValidationContext } from '../../sanitizers/section-args-validator';
2
+ export declare function validateBookingSection(args: Record<string, unknown>, ctx: ValidationContext): string[];
@@ -0,0 +1,16 @@
1
+ import { MAX_TITLE_LENGTH, MAX_DESCRIPTION_LENGTH, } from '../../../brand-page/constants/font.constants';
2
+ import { BUTTON_LINK_TYPE } from '../../../brand-page/models';
3
+ import { enumCheck, runChecks, styleCheck, } from '../../sanitizers/section-args-validator';
4
+ import { textAndRteChecks } from '../../sanitizers/rte-schema-check';
5
+ const CHECKS = [
6
+ ...textAndRteChecks('title', MAX_TITLE_LENGTH),
7
+ ...textAndRteChecks('description', MAX_DESCRIPTION_LENGTH),
8
+ ...textAndRteChecks('button_text', MAX_TITLE_LENGTH),
9
+ styleCheck('title_style'),
10
+ styleCheck('description_style'),
11
+ styleCheck('button_text_style'),
12
+ enumCheck('button_link_type', Object.keys(BUTTON_LINK_TYPE), 'booking-section'),
13
+ ];
14
+ export function validateBookingSection(args, ctx) {
15
+ return runChecks(CHECKS, args, ctx);
16
+ }
@@ -0,0 +1,2 @@
1
+ import { type ValidationContext } from '../../sanitizers/section-args-validator';
2
+ export declare function validateButtonSection(args: Record<string, unknown>, ctx: ValidationContext): string[];
@@ -0,0 +1,13 @@
1
+ import { MAX_TITLE_LENGTH } from '../../../brand-page/constants/font.constants';
2
+ import { runChecks, } from '../../sanitizers/section-args-validator';
3
+ import { textAndRteChecks } from '../../sanitizers/rte-schema-check';
4
+ /**
5
+ * Shared validation for all link/button section types:
6
+ * website, email, phone, general-link, facebook, x, instagram,
7
+ * youtube, linkedin, pinterest, twitch, tiktok.
8
+ * All use ButtonSectionBuilder and share the same title constraint.
9
+ */
10
+ const CHECKS = [...textAndRteChecks('title', MAX_TITLE_LENGTH)];
11
+ export function validateButtonSection(args, ctx) {
12
+ return runChecks(CHECKS, args, ctx);
13
+ }
@@ -0,0 +1,2 @@
1
+ import { type ValidationContext } from '../../sanitizers/section-args-validator';
2
+ export declare function validateContactForm(args: Record<string, unknown>, ctx: ValidationContext): string[];
@@ -0,0 +1,16 @@
1
+ import { MAX_TITLE_LENGTH, MAX_DESCRIPTION_LENGTH, } from '../../../brand-page/constants/font.constants';
2
+ import { enumCheck, runChecks, styleCheck, } from '../../sanitizers/section-args-validator';
3
+ import { textAndRteChecks } from '../../sanitizers/rte-schema-check';
4
+ const CHECKS = [
5
+ ...textAndRteChecks('title', MAX_TITLE_LENGTH),
6
+ ...textAndRteChecks('description', MAX_DESCRIPTION_LENGTH),
7
+ ...textAndRteChecks('button_text', MAX_TITLE_LENGTH),
8
+ ...textAndRteChecks('success_message', MAX_TITLE_LENGTH),
9
+ styleCheck('title_style'),
10
+ styleCheck('description_style'),
11
+ styleCheck('button_text_style'),
12
+ enumCheck('display_style', ['preview', 'collapsed'], 'contact-form'),
13
+ ];
14
+ export function validateContactForm(args, ctx) {
15
+ return runChecks(CHECKS, args, ctx);
16
+ }
@@ -0,0 +1,2 @@
1
+ import { type ValidationContext } from '../../sanitizers/section-args-validator';
2
+ export declare function validateDividerSection(args: Record<string, unknown>, ctx: ValidationContext): string[];
@@ -0,0 +1,7 @@
1
+ import { enumCheck, runChecks, } from '../../sanitizers/section-args-validator';
2
+ const CHECKS = [
3
+ enumCheck('divider_style', ['none', 'thin', 'thick'], 'divider-section'),
4
+ ];
5
+ export function validateDividerSection(args, ctx) {
6
+ return runChecks(CHECKS, args, ctx);
7
+ }
@@ -0,0 +1,4 @@
1
+ import type { UpdateFooterArguments } from '../../parsers/ai-toolcall-parser';
2
+ type FooterCheck = (args: UpdateFooterArguments) => string | null;
3
+ export declare const FOOTER_CHECKS: FooterCheck[];
4
+ export {};
@@ -0,0 +1,5 @@
1
+ import { validateLogoSize } from '../../sanitizers/section-args-validator';
2
+ export const FOOTER_CHECKS = ['desktop', 'mobile'].flatMap((viewport) => [
3
+ (args) => validateLogoSize(`${viewport}.logo_image_height`, args[viewport]?.logo_image_height, viewport),
4
+ (args) => validateLogoSize(`${viewport}.logo_image_width`, args[viewport]?.logo_image_width, viewport),
5
+ ]);
@@ -0,0 +1,6 @@
1
+ import type { UpdateGlobalStylesArguments } from '../../parsers/ai-toolcall-parser';
2
+ import type { TextStyleType } from '../../../brand-page/models/styles.model';
3
+ export declare const TEXT_STYLE_OPTION_KEYS: TextStyleType[];
4
+ type GlobalStyleCheck = (args: UpdateGlobalStylesArguments) => string | null;
5
+ export declare const GLOBAL_STYLE_CHECKS: GlobalStyleCheck[];
6
+ export {};
@@ -0,0 +1,26 @@
1
+ import { STYLE_RULES } from '../../sanitizers/sanitizer-rules';
2
+ import { validateStringStyleAttrs } from '../../sanitizers/section-args-validator';
3
+ export const TEXT_STYLE_OPTION_KEYS = [
4
+ 'titles',
5
+ 'headings',
6
+ 'paragraphs',
7
+ 'buttons',
8
+ ];
9
+ export const GLOBAL_STYLE_CHECKS = [
10
+ // textFontFamily: must be a recognized camelCase font key (e.g. 'playfairDisplay')
11
+ (args) => {
12
+ const font = args.textStyles?.textFontFamily;
13
+ if (font == null)
14
+ return null;
15
+ return !STYLE_RULES.fontFamilyKeys.has(font)
16
+ ? `"textFontFamily" "${font}" is not a recognized font family key`
17
+ : null;
18
+ },
19
+ // textStyleOptions[category].style — fontSize, fontFamily, lineHeight, letterSpacing
20
+ ...TEXT_STYLE_OPTION_KEYS.map((category) => (args) => {
21
+ const style = args.textStyles?.textStyleOptions?.[category]?.style;
22
+ if (!style)
23
+ return null;
24
+ return validateStringStyleAttrs(`textStyleOptions.${category}.style`, style);
25
+ }),
26
+ ];
@@ -0,0 +1,4 @@
1
+ import type { UpdateHeaderArguments } from '../../parsers/ai-toolcall-parser';
2
+ type HeaderCheck = (args: UpdateHeaderArguments) => string | null;
3
+ export declare const HEADER_CHECKS: HeaderCheck[];
4
+ export {};
@@ -0,0 +1,41 @@
1
+ import { HEADER_DISPLAY_STYLE_CONFIGS } from '../../../brand-page/constants/sections/header-display.constants';
2
+ import { validateLogoSize } from '../../sanitizers/section-args-validator';
3
+ import { PAGE_RULES, STYLE_RULES } from '../../sanitizers/sanitizer-rules';
4
+ export const HEADER_CHECKS = [
5
+ // Display style + nav type compatibility per viewport
6
+ ...['desktop', 'mobile'].map((viewport) => (args) => {
7
+ const overrides = args[viewport];
8
+ if (!overrides?.nav_display_type || !overrides?.display_style)
9
+ return null;
10
+ const compatible = HEADER_DISPLAY_STYLE_CONFIGS.some((c) => c.option.value === overrides.display_style &&
11
+ c.supportedNavTypes.includes(overrides.nav_display_type));
12
+ return compatible
13
+ ? null
14
+ : `Incompatible ${viewport} combination: display_style "${overrides.display_style}" is not compatible with nav_display_type "${overrides.nav_display_type}".`;
15
+ }),
16
+ // Nav link font per viewport
17
+ ...['desktop', 'mobile'].map((viewport) => (args) => {
18
+ const font = args[viewport]?.link_text_font;
19
+ if (font == null)
20
+ return null;
21
+ return !STYLE_RULES.fontFamilyNames.has(font)
22
+ ? `"${viewport}.link_text_font" "${font}" is not a recognized font family`
23
+ : null;
24
+ }),
25
+ // Logo sizes per viewport
26
+ ...['desktop', 'mobile'].flatMap((viewport) => [
27
+ (args) => validateLogoSize(`${viewport}.logo_image_height`, args[viewport]?.logo_image_height, viewport),
28
+ (args) => validateLogoSize(`${viewport}.logo_image_width`, args[viewport]?.logo_image_width, viewport),
29
+ ]),
30
+ // Nav route display name length (returns first violation — retry loop handles the rest)
31
+ (args) => {
32
+ for (let i = 0; i < (args.nav_routes ?? []).length; i++) {
33
+ const displayName = args.nav_routes[i].display_name;
34
+ if (displayName != null &&
35
+ displayName.length > PAGE_RULES.navDisplayName) {
36
+ return `nav_routes[${i}].display_name exceeds the maximum length of ${PAGE_RULES.navDisplayName} characters (got ${displayName.length})`;
37
+ }
38
+ }
39
+ return null;
40
+ },
41
+ ];
@@ -0,0 +1,2 @@
1
+ import { type ValidationContext } from '../../sanitizers/section-args-validator';
2
+ export declare function validateImageGallery(args: Record<string, unknown>, ctx: ValidationContext): string[];
@@ -0,0 +1,10 @@
1
+ import { MAX_TITLE_LENGTH } from '../../../brand-page/constants/font.constants';
2
+ import { enumCheck, itemRteStyleCheck, itemTextCheck, runChecks, } from '../../sanitizers/section-args-validator';
3
+ const CHECKS = [
4
+ itemTextCheck('images', 'caption', MAX_TITLE_LENGTH),
5
+ itemRteStyleCheck('images', 'caption'),
6
+ enumCheck('gallery_type', ['grid', 'carousel', 'masonry'], 'image-gallery'),
7
+ ];
8
+ export function validateImageGallery(args, ctx) {
9
+ return runChecks(CHECKS, args, ctx);
10
+ }
@@ -0,0 +1,2 @@
1
+ import { type ValidationContext } from '../../sanitizers/section-args-validator';
2
+ export declare function validateImagesSection(args: Record<string, unknown>, ctx: ValidationContext): string[];