@riverbankcms/sdk 0.77.1 → 0.78.2

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 (295) hide show
  1. package/README.md +114 -43
  2. package/dist/{PreviewEditorSidebar-DVUG7GK4.mjs → PreviewEditorSidebar-4DXLYX2V.mjs} +4962 -4885
  3. package/dist/{PreviewEditorUI-P7RN4CDS.mjs → PreviewEditorUI-CS5P4N3P.mjs} +4 -4
  4. package/dist/SdkPreviewModeRuntime-IJDHTW4W.mjs +8 -0
  5. package/dist/_dts/ai/src/contracts/proposals.d.ts +190 -154
  6. package/dist/_dts/api/src/accessAdmin.d.ts +5 -0
  7. package/dist/_dts/api/src/billing.d.ts +3 -26
  8. package/dist/_dts/api/src/bookingVerticals.d.ts +4 -0
  9. package/dist/_dts/api/src/content-editor.d.ts +1 -0
  10. package/dist/_dts/api/src/contentRuntime.d.ts +1 -0
  11. package/dist/_dts/api/src/demoDashboardMutationSurfaces.d.ts +46 -0
  12. package/dist/_dts/api/src/endpoints.d.ts +17 -0
  13. package/dist/_dts/api/src/index.d.ts +16 -4
  14. package/dist/_dts/api/src/navigation/dashboardBookingsNav.d.ts +87 -0
  15. package/dist/_dts/api/src/navigation/dashboardDemoNav.d.ts +5 -0
  16. package/dist/_dts/api/src/navigation/dashboardSettingsNav.d.ts +45 -0
  17. package/dist/_dts/api/src/navigation/dashboardSiteNav.d.ts +42 -0
  18. package/dist/_dts/api/src/navigation/dashboardTeamMemberNav.d.ts +24 -0
  19. package/dist/_dts/api/src/navigation/linkUrlType.d.ts +3 -0
  20. package/dist/_dts/api/src/navigation.d.ts +12 -0
  21. package/dist/_dts/api/src/public/types.d.ts +1 -1
  22. package/dist/_dts/api/src/publicExperienceEndpoints.d.ts +55 -26
  23. package/dist/_dts/api/src/request.d.ts +3 -11
  24. package/dist/_dts/api/src/sdkConfig/contracts.d.ts +1 -0
  25. package/dist/_dts/api/src/sdkContracts.d.ts +7 -1
  26. package/dist/_dts/api/src/siteManagementEndpoints.d.ts +10 -0
  27. package/dist/_dts/api/src/sitePlatformEndpoints.d.ts +1 -0
  28. package/dist/_dts/api/src/siteRuntimeEndpoints.d.ts +15 -19
  29. package/dist/_dts/api/src/staffAccess.d.ts +79 -0
  30. package/dist/_dts/api/src/types.d.ts +14 -27
  31. package/dist/_dts/api/src/workflows/automaticWorkflowTriggers.d.ts +21 -0
  32. package/dist/_dts/block-form/src/fields/types.d.ts +6 -0
  33. package/dist/_dts/block-form/src/widgets/RepeaterField/components/RepeaterList.d.ts +3 -2
  34. package/dist/_dts/block-form/src/widgets/RepeaterField/components/RepeaterRow.d.ts +6 -3
  35. package/dist/_dts/block-form/src/widgets/RepeaterField/components/RepeaterRowActions.d.ts +8 -3
  36. package/dist/_dts/block-form/src/widgets/RepeaterField/hooks/index.d.ts +1 -1
  37. package/dist/_dts/block-form/src/widgets/RepeaterField/hooks/useLinearRepeaterDnd.d.ts +1 -0
  38. package/dist/_dts/block-form/src/widgets/RepeaterField/hooks/useRepeaterPointerDragCapability.d.ts +1 -0
  39. package/dist/_dts/block-form/src/widgets/RepeaterField/hooks/useResolvedItemLabel.d.ts +7 -0
  40. package/dist/_dts/block-form/src/widgets/RepeaterField/utils/buildSummary.d.ts +1 -0
  41. package/dist/_dts/block-form/src/widgets/RepeaterField/utils/index.d.ts +3 -1
  42. package/dist/_dts/block-form/src/widgets/RepeaterField/utils/repeaterDndDomain.d.ts +1 -1
  43. package/dist/_dts/block-form/src/widgets/RepeaterField/utils/repeaterLabelSource.d.ts +15 -0
  44. package/dist/_dts/block-form/src/widgets/RepeaterField/utils/repeaterRowActionsDomain.d.ts +50 -0
  45. package/dist/_dts/blocks/src/client/site-chrome.d.ts +4 -1
  46. package/dist/_dts/blocks/src/index.d.ts +1 -0
  47. package/dist/_dts/blocks/src/system/blocks/appointment-booking.d.ts +879 -288
  48. package/dist/_dts/blocks/src/system/blocks/blog-listing.d.ts +879 -288
  49. package/dist/_dts/blocks/src/system/blocks/cart.d.ts +879 -288
  50. package/dist/_dts/blocks/src/system/blocks/checkout.d.ts +879 -288
  51. package/dist/_dts/blocks/src/system/blocks/collection.d.ts +879 -288
  52. package/dist/_dts/blocks/src/system/blocks/courses/shared/schemas.d.ts +2 -2
  53. package/dist/_dts/blocks/src/system/blocks/faq.d.ts +885 -289
  54. package/dist/_dts/blocks/src/system/blocks/gifting.d.ts +879 -288
  55. package/dist/_dts/blocks/src/system/blocks/location-map.d.ts +3 -1
  56. package/dist/_dts/blocks/src/system/blocks/media-text.d.ts +68 -21
  57. package/dist/_dts/blocks/src/system/blocks/product-detail.d.ts +879 -288
  58. package/dist/_dts/blocks/src/system/blocks/product-list.d.ts +879 -288
  59. package/dist/_dts/blocks/src/system/blocks/shop.d.ts +879 -288
  60. package/dist/_dts/blocks/src/system/blocks/team-members.d.ts +3 -0
  61. package/dist/_dts/blocks/src/system/data/index.d.ts +5 -3
  62. package/dist/_dts/blocks/src/system/data/previewResolvedDataState.d.ts +45 -0
  63. package/dist/_dts/blocks/src/system/fields/boxStyles.d.ts +2 -1
  64. package/dist/_dts/blocks/src/system/fragments/library/faqAccordion.d.ts +5 -0
  65. package/dist/_dts/blocks/src/system/manifest/schema.d.ts +193 -29
  66. package/dist/_dts/blocks/src/system/node/fragments/headingDecoration.d.ts +10 -0
  67. package/dist/_dts/blocks/src/system/node/fragments/index.d.ts +1 -0
  68. package/dist/_dts/blocks/src/system/node/fragments/styledSection.d.ts +9 -0
  69. package/dist/_dts/blocks/src/system/runtime/api/client.d.ts +3 -2
  70. package/dist/_dts/blocks/src/system/runtime/api/endpoints.d.ts +8 -0
  71. package/dist/_dts/blocks/src/system/runtime/api/index.d.ts +1 -1
  72. package/dist/_dts/blocks/src/system/runtime/api/types.d.ts +43 -8
  73. package/dist/_dts/blocks/src/system/runtime/header/shared.d.ts +8 -7
  74. package/dist/_dts/blocks/src/system/runtime/hooks/useHeadlessBookingFlow.state.d.ts +1 -1
  75. package/dist/_dts/blocks/src/system/runtime/nodes/booking-form.headless.state.d.ts +1 -1
  76. package/dist/_dts/blocks/src/system/runtime/nodes/events/shared/EventCompactRow.d.ts +1 -4
  77. package/dist/_dts/blocks/src/system/runtime/nodes/events/shared/utils.d.ts +7 -0
  78. package/dist/_dts/blocks/src/system/runtime/nodes/header-section.client.d.ts +2 -8
  79. package/dist/_dts/blocks/src/system/runtime/nodes/header-section.server.d.ts +2 -9
  80. package/dist/_dts/blocks/src/system/runtime/nodes/shop-cart-discount-ui.d.ts +5 -0
  81. package/dist/_dts/blocks/src/system/runtime/nodes/shop-checkout-form.d.ts +76 -0
  82. package/dist/_dts/blocks/src/system/runtime/nodes/shop-checkout.state.d.ts +1 -4
  83. package/dist/_dts/blocks/src/system/runtime/nodes/shop-commerce-store.d.ts +2 -0
  84. package/dist/_dts/blocks/src/system/runtime/nodes/shop-commerce.shared.d.ts +1 -0
  85. package/dist/_dts/blocks/src/system/runtime/nodes/shop-discount-apply.state.d.ts +52 -0
  86. package/dist/_dts/blocks/src/system/runtime/nodes/shop.state.d.ts +2 -4
  87. package/dist/_dts/blocks/src/system/runtime/nodes/useDiscountApply.d.ts +21 -0
  88. package/dist/_dts/blocks/src/system/runtime/shared/components/DiscountCodeDisclosure.d.ts +54 -0
  89. package/dist/_dts/blocks/src/system/runtime/shared/components/index.d.ts +2 -0
  90. package/dist/_dts/blocks/src/system/runtime/shared/index.d.ts +2 -2
  91. package/dist/_dts/blocks/src/system/transforms/registry/ui.d.ts +1 -1
  92. package/dist/_dts/blocks/src/system/transforms/typed.d.ts +1 -1
  93. package/dist/_dts/content-editor/src/contentTypeEditorContentState.d.ts +26 -0
  94. package/dist/_dts/content-editor/src/definitions/factory.d.ts +75 -0
  95. package/dist/_dts/content-editor/src/entryWorkflows.d.ts +2 -0
  96. package/dist/_dts/content-editor/src/footerBlocksEditorState.d.ts +76 -0
  97. package/dist/_dts/content-editor/src/index.d.ts +6 -1
  98. package/dist/_dts/content-editor/src/pageWorkflowContent.d.ts +29 -0
  99. package/dist/_dts/content-editor/src/ui/editorSnapshot.d.ts +2 -2
  100. package/dist/_dts/content-model/src/content-types/schema.d.ts +17 -3
  101. package/dist/_dts/content-model/src/index.d.ts +1 -0
  102. package/dist/_dts/content-model/src/routeTemplate.d.ts +4 -0
  103. package/dist/_dts/content-model/src/templates/bindingTypeCompatibility.d.ts +3 -1
  104. package/dist/_dts/content-model/src/templates/bindingValidation.d.ts +10 -4
  105. package/dist/_dts/content-model/src/templates/editorState.d.ts +25 -0
  106. package/dist/_dts/content-model/src/templates/fieldPaths.d.ts +20 -0
  107. package/dist/_dts/content-model/src/templates/manifestAdapter.d.ts +5 -2
  108. package/dist/_dts/core/src/branded.d.ts +108 -85
  109. package/dist/_dts/core/src/csv-cells.d.ts +10 -0
  110. package/dist/_dts/core/src/csv-date-filter.d.ts +27 -0
  111. package/dist/_dts/core/src/csv-escape.d.ts +1 -0
  112. package/dist/_dts/core/src/csv-filename.d.ts +18 -0
  113. package/dist/_dts/core/src/csv-render.d.ts +4 -0
  114. package/dist/_dts/core/src/csv-types.d.ts +116 -0
  115. package/dist/_dts/core/src/currency-format.d.ts +4 -0
  116. package/dist/_dts/core/src/demo-capability-policy.d.ts +29 -0
  117. package/dist/_dts/core/src/demo-claim-access.d.ts +14 -0
  118. package/dist/_dts/core/src/demo-lifecycle-status.d.ts +11 -0
  119. package/dist/_dts/core/src/demo-runtime.d.ts +47 -0
  120. package/dist/_dts/core/src/duration.d.ts +14 -0
  121. package/dist/_dts/core/src/editor-state.d.ts +7 -7
  122. package/dist/_dts/core/src/email-format.d.ts +10 -0
  123. package/dist/_dts/core/src/field-errors.d.ts +1 -0
  124. package/dist/_dts/core/src/form-submission-preview.d.ts +24 -0
  125. package/dist/_dts/core/src/index.d.ts +20 -0
  126. package/dist/_dts/core/src/number-input.d.ts +22 -0
  127. package/dist/_dts/core/src/participants.d.ts +2 -2
  128. package/dist/_dts/core/src/public-url-validation.d.ts +12 -0
  129. package/dist/_dts/core/src/slug.d.ts +39 -0
  130. package/dist/_dts/core/src/string.d.ts +19 -0
  131. package/dist/_dts/core/src/uuid.d.ts +6 -0
  132. package/dist/_dts/db/src/generated/supabase/database.types.d.ts +11 -0
  133. package/dist/_dts/db/src/schemas/forms.d.ts +50 -50
  134. package/dist/_dts/editor-blocks/src/blockPayload.d.ts +1 -1
  135. package/dist/_dts/media-core/src/assetsInUseSummary.d.ts +34 -0
  136. package/dist/_dts/media-core/src/bulkDeletePlanning.d.ts +24 -0
  137. package/dist/_dts/media-core/src/canonicalCropReview.d.ts +66 -0
  138. package/dist/_dts/media-core/src/classifyAllPlanning.d.ts +48 -0
  139. package/dist/_dts/media-core/src/filename.d.ts +1 -0
  140. package/dist/_dts/media-core/src/index.d.ts +10 -0
  141. package/dist/_dts/media-core/src/mediaAssetUsageStatus.d.ts +47 -0
  142. package/dist/_dts/media-core/src/mediaSettingsState.d.ts +3 -0
  143. package/dist/_dts/media-core/src/portableMediaReferences.d.ts +38 -0
  144. package/dist/_dts/media-core/src/uploadVerificationContract.d.ts +28 -0
  145. package/dist/_dts/media-core/src/videoAssetRepair.d.ts +38 -0
  146. package/dist/_dts/media-editor/src/MediaEditor.d.ts +3 -1
  147. package/dist/_dts/media-editor/src/MediaPreview.d.ts +3 -1
  148. package/dist/_dts/media-editor/src/fieldUi.d.ts +5 -0
  149. package/dist/_dts/media-editor/src/index.d.ts +1 -1
  150. package/dist/_dts/media-editor/src/mediaEditorDebug.d.ts +1 -0
  151. package/dist/_dts/path-utils/src/index.d.ts +8 -0
  152. package/dist/_dts/path-utils/src/redirectPaths.d.ts +26 -0
  153. package/dist/_dts/path-utils/src/safeAppPath.d.ts +26 -0
  154. package/dist/_dts/preview-next/src/client/preview/SiteChromeCustomizeButton.d.ts +2 -1
  155. package/dist/_dts/preview-next/src/client/preview/SiteChromeCustomizeContext.d.ts +4 -0
  156. package/dist/_dts/preview-next/src/client/preview/previewDocumentFrame.d.ts +31 -0
  157. package/dist/_dts/sdk/src/cli/commands/push/consts.d.ts +1 -1
  158. package/dist/_dts/sdk/src/cli/commands/push/metadata.d.ts +2 -0
  159. package/dist/_dts/sdk/src/cli/commands/push/stale.d.ts +3 -3
  160. package/dist/_dts/sdk/src/cli/commands/push-execute.d.ts +7 -0
  161. package/dist/_dts/sdk/src/cli/commands/push.d.ts +2 -0
  162. package/dist/_dts/sdk/src/cli/content/reader.d.ts +13 -0
  163. package/dist/_dts/sdk/src/cli/content/writer.d.ts +2 -1
  164. package/dist/_dts/sdk/src/cli/helpers.d.ts +2 -0
  165. package/dist/_dts/sdk/src/cli/site-commands/commandKeys.d.ts +6 -6
  166. package/dist/_dts/sdk/src/cli/site-commands/commandRuntime.d.ts +5 -0
  167. package/dist/_dts/sdk/src/cli/site-commands/commandSurfaceDispatch.d.ts +4 -0
  168. package/dist/_dts/sdk/src/cli/site-commands/pageCommands.d.ts +5 -2
  169. package/dist/_dts/sdk/src/cli/site-commands/pushExecution.d.ts +10 -1
  170. package/dist/_dts/sdk/src/cli/site-commands/pushExecutionTypes.d.ts +1 -1
  171. package/dist/_dts/sdk/src/client/error.d.ts +3 -0
  172. package/dist/_dts/sdk/src/client/index.d.ts +2 -2
  173. package/dist/_dts/sdk/src/client/management/types.d.ts +6 -0
  174. package/dist/_dts/sdk/src/client/types.d.ts +39 -21
  175. package/dist/_dts/sdk/src/config/content-types.d.ts +7 -0
  176. package/dist/_dts/sdk/src/config/field-definitions.d.ts +2 -0
  177. package/dist/_dts/sdk/src/index.d.ts +2 -2
  178. package/dist/_dts/sdk/src/manifest/passes/pass1-fields.d.ts +16 -16
  179. package/dist/_dts/sdk/src/next/content-load-failure.d.ts +51 -0
  180. package/dist/_dts/sdk/src/next/index.d.ts +2 -1
  181. package/dist/_dts/sdk/src/next/types.d.ts +19 -0
  182. package/dist/_dts/sdk/src/portal/redirects.d.ts +1 -1
  183. package/dist/_dts/sdk/src/routing/index.d.ts +3 -2
  184. package/dist/_dts/sdk/src/routing/resolvePageContent.d.ts +71 -6
  185. package/dist/_dts/sdk/src/version.d.ts +1 -1
  186. package/dist/_dts/site-commands/src/commands.d.ts +15 -12
  187. package/dist/_dts/site-commands/src/index.d.ts +1 -0
  188. package/dist/_dts/site-commands/src/pagePaths.d.ts +6 -0
  189. package/dist/_dts/theme-core/src/accordions/siteStyleDefaults.d.ts +26 -0
  190. package/dist/_dts/theme-core/src/accordions/types.d.ts +1 -0
  191. package/dist/_dts/theme-core/src/blocks/vars/index.d.ts +1 -0
  192. package/dist/_dts/theme-core/src/fonts/index.d.ts +1 -0
  193. package/dist/_dts/theme-core/src/fonts/uploadFormat.d.ts +44 -0
  194. package/dist/_dts/theme-core/src/generated/containerResponsiveThemeCss.d.ts +1 -1
  195. package/dist/_dts/theme-core/src/index.d.ts +3 -1
  196. package/dist/_dts/theme-core/src/mock-themes/all.d.ts +36 -24
  197. package/dist/_dts/theme-core/src/navigation/generateNavLinkCSS.d.ts +6 -1
  198. package/dist/_dts/theme-core/src/navigation/types.d.ts +12 -0
  199. package/dist/_dts/theme-core/src/palette/variants/types.d.ts +3 -3
  200. package/dist/_dts/theme-core/src/runtime/themeCssVarNames.d.ts +7 -0
  201. package/dist/_dts/theme-core/src/schema.d.ts +64 -18
  202. package/dist/_dts/theme-core/src/site-styles/appearancePresetCatalog.d.ts +214 -34
  203. package/dist/_dts/theme-core/src/site-styles/appearancePresetTypes.d.ts +5 -2
  204. package/dist/_dts/theme-core/src/site-styles/blockAppearancePresets.d.ts +214 -34
  205. package/dist/_dts/theme-core/src/site-styles/curatedSiteStyles.d.ts +24 -0
  206. package/dist/_dts/theme-core/src/site-styles/designState.d.ts +31 -3
  207. package/dist/_dts/theme-core/src/site-styles/generatedSchemas.d.ts +4 -4
  208. package/dist/_dts/theme-core/src/site-styles/headerLooks.d.ts +33 -1
  209. package/dist/_dts/theme-core/src/site-styles/rawStyleFields.d.ts +4 -2
  210. package/dist/_dts/theme-core/src/site-styles/runtimeCompiler.d.ts +9 -1
  211. package/dist/_dts/theme-core/src/site-styles/types.d.ts +27 -2
  212. package/dist/_dts/theme-core/src/siteChrome.d.ts +17 -34
  213. package/dist/_dts/theme-core/src/siteChromeOverlayClearance.d.ts +22 -0
  214. package/dist/_dts/theme-core/src/siteChromePlacement.d.ts +22 -0
  215. package/dist/_dts/theme-core/src/siteChromePlanning.d.ts +32 -0
  216. package/dist/_dts/theme-core/src/tokens/themeColorTokens.d.ts +2 -2
  217. package/dist/{altcha-B5XGSXP5.mjs → altcha-EKUEQ4RP.mjs} +1 -1
  218. package/dist/{chunk-IENWFSLO.mjs → chunk-4QEGTLK6.mjs} +1 -1
  219. package/dist/{chunk-ZYEJLCTN.mjs → chunk-6HYXHRAI.mjs} +5 -5
  220. package/dist/{chunk-VX7B5VAC.mjs → chunk-CR5HKAGU.mjs} +32 -5
  221. package/dist/{chunk-KWJPDZH2.mjs → chunk-MCRQMPET.mjs} +3793 -1201
  222. package/dist/{chunk-6SMUFTXD.mjs → chunk-OKMBEAXY.mjs} +1 -1
  223. package/dist/{chunk-XGB3TDIC.mjs → chunk-R7POPVJR.mjs} +2 -8
  224. package/dist/{chunk-2SPENC5M.mjs → chunk-RGTOD4AJ.mjs} +242 -57
  225. package/dist/cli/index.mjs +2361 -668
  226. package/dist/cli/init-docs/content/cli-reference.md +3 -2
  227. package/dist/cli/init-docs/content/content-management.md +2 -2
  228. package/dist/cli/init-docs/content/workflow-preview-mode.md +68 -2
  229. package/dist/client/{accordion-RZMQSYLR.mjs → accordion-PLYNJIIM.mjs} +2 -2
  230. package/dist/client/analytics.mjs +1 -1
  231. package/dist/client/{bookingForm-NF4ASVNV.mjs → bookingForm-BXAP6AO7.mjs} +76 -72
  232. package/dist/client/bookings.mjs +3765 -310
  233. package/dist/client/{carousel-LDX47ZIK.mjs → carousel-TRBXDHGF.mjs} +3 -4
  234. package/dist/client/{cart-RGXDS5F4.mjs → cart-Z7H3HJRS.mjs} +8 -8
  235. package/dist/client/{checkout-P7WWSNNY.mjs → checkout-WAFCUBIX.mjs} +8 -8
  236. package/dist/client/{chunk-II7O4XN3.mjs → chunk-75OUS5MT.mjs} +2 -2
  237. package/dist/client/{chunk-PMAIXMAB.mjs → chunk-AUJ5DBZJ.mjs} +42 -37
  238. package/dist/client/{chunk-TQ5MSPDX.mjs → chunk-CE7IBGVW.mjs} +3 -1
  239. package/dist/client/{chunk-E2TDNXCL.mjs → chunk-CWGTG37I.mjs} +2 -1
  240. package/dist/client/{chunk-UFSWADAO.mjs → chunk-DNRGY432.mjs} +6 -67
  241. package/dist/client/{chunk-GMVTOKYG.mjs → chunk-FUXW6VW2.mjs} +512 -66
  242. package/dist/client/{chunk-R56FQ3RR.mjs → chunk-JGXPTEI2.mjs} +322 -106
  243. package/dist/client/{chunk-L3DNHIJX.mjs → chunk-JRDUHZCT.mjs} +53 -53
  244. package/dist/client/{chunk-M3L3KYYR.mjs → chunk-UDNSI5PY.mjs} +12 -0
  245. package/dist/client/{chunk-JEZECJ3W.mjs → chunk-UVQEJJTN.mjs} +129 -3
  246. package/dist/client/{chunk-F7LHOKEH.mjs → chunk-XSV6KW4D.mjs} +1 -1
  247. package/dist/client/chunk-ZFHRN6W2.mjs +66 -0
  248. package/dist/client/{chunk-JNC7CGHX.mjs → chunk-ZI3LLBPZ.mjs} +3 -3
  249. package/dist/client/client.mjs +7577 -4979
  250. package/dist/client/{courseRegistration-7F65K5ZR.mjs → courseRegistration-AHFQHWIJ.mjs} +19 -16
  251. package/dist/client/{eventCalendar-GLSC5KTL.mjs → eventCalendar-LDXTV5R7.mjs} +10 -10
  252. package/dist/client/{eventCombined-ZHK4WKUR.mjs → eventCombined-A4JGTNJO.mjs} +10 -10
  253. package/dist/client/{eventDetails-E3PJYBIN.mjs → eventDetails-4YXTZ7EG.mjs} +10 -10
  254. package/dist/client/{eventListing-EMS3WC3E.mjs → eventListing-P72TPFFM.mjs} +10 -10
  255. package/dist/client/{eventRegistration-NZOTVNPI.mjs → eventRegistration-LSYJHGMT.mjs} +10 -10
  256. package/dist/client/{form-ETFZFATW.mjs → form-AOPYOKOW.mjs} +10 -7
  257. package/dist/client/{headerSection-4LBP7ULT.mjs → headerSection-5TFYDFVQ.mjs} +3 -3
  258. package/dist/client/hooks.mjs +1119 -327
  259. package/dist/client/{locationMap-5M655YSJ.mjs → locationMap-QSZ3ZVAZ.mjs} +3 -3
  260. package/dist/client/{newsletterForm-QOUYW44O.mjs → newsletterForm-KTRHZY52.mjs} +3 -3
  261. package/dist/client/{productDetail-O4DOCWQG.mjs → productDetail-N4E775RG.mjs} +8 -8
  262. package/dist/client/{productList-A5RO5WIS.mjs → productList-UGUQ2S45.mjs} +8 -8
  263. package/dist/client/rendering/client.mjs +7262 -2775
  264. package/dist/client/rendering/islands.mjs +19 -19
  265. package/dist/client/rendering.mjs +6964 -4587
  266. package/dist/client/{shop-L4MZH4I2.mjs → shop-VHSZEEQ2.mjs} +8 -8
  267. package/dist/preview-next/before-render.mjs +18 -1
  268. package/dist/preview-next/client/runtime.mjs +6 -6
  269. package/dist/preview-next/editor-chrome.css +10 -0
  270. package/dist/preview-next/middleware.mjs +18 -1
  271. package/dist/preview-next/tailwind-sources.css +1 -0
  272. package/dist/sdk-runtime-WHPJEF5G.mjs +8 -0
  273. package/dist/server/components.mjs +2736 -1316
  274. package/dist/server/config-template-validation.mjs +221 -15
  275. package/dist/server/config-validation.mjs +1346 -550
  276. package/dist/server/config.mjs +1346 -550
  277. package/dist/server/data.mjs +1118 -326
  278. package/dist/server/index.mjs +514 -251
  279. package/dist/server/next.mjs +4446 -2444
  280. package/dist/server/page-converter.mjs +631 -155
  281. package/dist/server/prebuild.mjs +1 -1
  282. package/dist/server/rendering/server.mjs +2743 -1323
  283. package/dist/server/rendering.mjs +2764 -1328
  284. package/dist/server/routing.mjs +1860 -590
  285. package/dist/server/server.mjs +1622 -575
  286. package/dist/server/theme-bridge.mjs +3151 -131
  287. package/dist/server/theme.mjs +10 -1
  288. package/dist/styles/index.css +488 -48
  289. package/package.json +2 -1
  290. package/dist/SdkPreviewModeRuntime-KLPX47SE.mjs +0 -8
  291. package/dist/_dts/blocks/src/system/runtime/nodes/course-registration/DiscountCodeSection.d.ts +0 -7
  292. package/dist/_dts/preview-next/src/client/widgets/PreviewMediaField.d.ts +0 -4
  293. package/dist/client/chunk-OJPZEZU2.mjs +0 -31
  294. package/dist/client/chunk-RTZ3JKKX.mjs +0 -178
  295. package/dist/sdk-runtime-6UT2S7KZ.mjs +0 -8
@@ -44,7 +44,7 @@ function fallbackBinding(...sources) {
44
44
  }
45
45
 
46
46
  // src/config/validation.ts
47
- import { z as z69 } from "zod";
47
+ import { z as z70 } from "zod";
48
48
 
49
49
  // ../api/src/apiEndpointTypes.ts
50
50
  function blockedDemoMutationPolicy(classification, publicMessage) {
@@ -1796,7 +1796,16 @@ var ENDPOINT_DEFINITIONS = {
1796
1796
  revalidate: 60,
1797
1797
  tags: ["site-{siteId}", "content-{siteId}-{type}"],
1798
1798
  auth: "user",
1799
- responseKind: "json"
1799
+ responseKind: "json",
1800
+ errors: ["validation:invalid_input", "resource:not_found", "resource:conflict", "server:internal_error"]
1801
+ },
1802
+ reorderContentEntries: {
1803
+ path: "/sites/{siteId}/content/{type}/order",
1804
+ method: "POST",
1805
+ tags: ["site-{siteId}", "content-{siteId}-{type}"],
1806
+ auth: "user",
1807
+ responseKind: "json",
1808
+ errors: ["validation:invalid_input", "resource:not_found", "resource:conflict", "server:internal_error"]
1800
1809
  },
1801
1810
  getContentTemplate: {
1802
1811
  path: "/sites/{siteId}/content/types/{type}/template",
@@ -3948,6 +3957,14 @@ var ENDPOINT_DEFINITIONS = {
3948
3957
  responseKind: "json",
3949
3958
  errors: []
3950
3959
  },
3960
+ applyDiscountCode: {
3961
+ path: "/public/sites/{siteId}/bookings/discounts/apply",
3962
+ method: "POST",
3963
+ tags: ["site-{siteId}", "booking-discounts"],
3964
+ auth: "public",
3965
+ responseKind: "json",
3966
+ errors: ["validation:invalid_input", "rate_limit:exceeded"]
3967
+ },
3951
3968
  // Batch endpoint for block loader requests (reduces SSR fan-out)
3952
3969
  batchBlockLoaders: {
3953
3970
  path: "/public/sites/{siteId}/block-loaders/batch",
@@ -6287,6 +6304,27 @@ var ENDPOINT_DEFINITIONS = {
6287
6304
  }
6288
6305
  };
6289
6306
 
6307
+ // ../core/src/location.ts
6308
+ function normalizeLocationAddressText(value) {
6309
+ if (typeof value !== "string") {
6310
+ return null;
6311
+ }
6312
+ const trimmed = value.trim();
6313
+ return trimmed ? trimmed : null;
6314
+ }
6315
+ function hasLocationCoordinates(value) {
6316
+ return typeof value?.lat === "number" && typeof value?.lng === "number";
6317
+ }
6318
+ function toLocationCoordinates(value) {
6319
+ if (!hasLocationCoordinates(value)) {
6320
+ return null;
6321
+ }
6322
+ return {
6323
+ lat: value.lat,
6324
+ lng: value.lng
6325
+ };
6326
+ }
6327
+
6290
6328
  // ../api/src/accessAdmin.ts
6291
6329
  import { z } from "zod";
6292
6330
  var managedDomainAddOnPricingSnapshotSchema = z.object({
@@ -6429,27 +6467,6 @@ function formatKeyAsLabel(key) {
6429
6467
  // ../blocks/src/system/manifest/schema.ts
6430
6468
  import { z as z4 } from "zod";
6431
6469
 
6432
- // ../core/src/location.ts
6433
- function normalizeLocationAddressText(value) {
6434
- if (typeof value !== "string") {
6435
- return null;
6436
- }
6437
- const trimmed = value.trim();
6438
- return trimmed ? trimmed : null;
6439
- }
6440
- function hasLocationCoordinates(value) {
6441
- return typeof value?.lat === "number" && typeof value?.lng === "number";
6442
- }
6443
- function toLocationCoordinates(value) {
6444
- if (!hasLocationCoordinates(value)) {
6445
- return null;
6446
- }
6447
- return {
6448
- lat: value.lat,
6449
- lng: value.lng
6450
- };
6451
- }
6452
-
6453
6470
  // ../media-core/src/transformRect.ts
6454
6471
  function isValidTransformRectStructure(rect) {
6455
6472
  if (!Array.isArray(rect) || rect.length !== 4) return false;
@@ -6532,14 +6549,14 @@ function rotateNormalizedPoint(point, rotation) {
6532
6549
  const x = point.x;
6533
6550
  const y = point.y;
6534
6551
  switch (rotation) {
6552
+ case 0:
6553
+ return { x, y };
6535
6554
  case 90:
6536
6555
  return { x: 1 - y, y: x };
6537
6556
  case 180:
6538
6557
  return { x: 1 - x, y: 1 - y };
6539
6558
  case 270:
6540
6559
  return { x: y, y: 1 - x };
6541
- default:
6542
- return { x, y };
6543
6560
  }
6544
6561
  }
6545
6562
 
@@ -6832,6 +6849,8 @@ var uiSchema = z4.object({
6832
6849
  mediaPickerAutoOpen: z4.boolean().optional(),
6833
6850
  showMediaPreview: z4.boolean().optional(),
6834
6851
  showMediaOverlayActions: z4.boolean().optional(),
6852
+ mediaPreviewMaxWidth: z4.enum(["xs", "sm", "md", "none"]).optional(),
6853
+ preventMediaPreviewUpscale: z4.boolean().optional(),
6835
6854
  mediaDelivery: mediaDeliverySchema.optional(),
6836
6855
  mediaDeliveryByVariant: z4.record(z4.string(), mediaDeliverySchema).optional(),
6837
6856
  // Optional input hints for validators/widgets
@@ -7081,6 +7100,9 @@ var repeaterFieldSchema = baseFieldSchema.extend({
7081
7100
  type: z4.literal("repeater"),
7082
7101
  itemLabel: z4.string().default("Item"),
7083
7102
  itemLabelSource: z4.string().optional(),
7103
+ showSummary: z4.boolean().optional(),
7104
+ summaryFields: z4.string().array().optional(),
7105
+ summaryMaxChars: z4.number().int().positive().optional(),
7084
7106
  minItems: z4.number().int().min(0).default(0),
7085
7107
  maxItems: z4.number().int().positive().optional(),
7086
7108
  // Monomorphic mode
@@ -7574,6 +7596,9 @@ function makeBoundaryId(previousBlockId, nextBlockId) {
7574
7596
  const next = encodeURIComponent(nextBlockId);
7575
7597
  return asDesignBoundaryId(`boundary:${previous}:${next}`);
7576
7598
  }
7599
+ function assertNever(value, message = "Unhandled Theme V2 variant") {
7600
+ throw new Error(`${message}: ${String(value)}`);
7601
+ }
7577
7602
  function brandNonEmptyString(value, label) {
7578
7603
  if (value.length === 0) {
7579
7604
  throw new Error(`${label} must be a non-empty string.`);
@@ -7601,6 +7626,10 @@ var tileTreatmentValues = [
7601
7626
  "quiet",
7602
7627
  "brand-depth"
7603
7628
  ];
7629
+ var eventListTreatmentValues = [
7630
+ "plain",
7631
+ "lined-panel"
7632
+ ];
7604
7633
  var eyebrowTreatmentValues = [
7605
7634
  "plain",
7606
7635
  "pill",
@@ -7658,6 +7687,7 @@ function defineBlockDesignCapability(capability) {
7658
7687
  imageSurfaceMotions: capability.imageSurfaceMotions ?? ["static"],
7659
7688
  testimonialCardTreatments: capability.testimonialCardTreatments ?? ["default"],
7660
7689
  tileTreatments: capability.tileTreatments ?? ["default"],
7690
+ eventListTreatments: capability.eventListTreatments ?? ["plain"],
7661
7691
  eyebrowTreatments: capability.eyebrowTreatments ?? ["plain"],
7662
7692
  ...capability.headingDecorations ? { headingDecorations: capability.headingDecorations } : {},
7663
7693
  ...capability.accordionIconSets ? { accordionIconSets: capability.accordionIconSets } : {}
@@ -7682,9 +7712,98 @@ var blockAppearancePresets = [
7682
7712
  transitionAfter: "soft-fade-short",
7683
7713
  emphasis: "high",
7684
7714
  sectionHeight: "hero",
7715
+ heroComposition: "center",
7716
+ heroTypographyScale: "display",
7685
7717
  imageSurfaceTreatment: { kind: "neutral-wash" }
7686
7718
  }
7687
7719
  }),
7720
+ defineBlockAppearancePreset({
7721
+ kind: "block-design",
7722
+ id: "hero-bottom-left-panel",
7723
+ target: "hero",
7724
+ label: "Bottom-left panel hero",
7725
+ blockKinds: ["block.hero"],
7726
+ constraints: {
7727
+ layoutFamilies: ["centered", "compact"]
7728
+ },
7729
+ optionGroups: [
7730
+ {
7731
+ id: "image-surface-treatment",
7732
+ label: "Treatment",
7733
+ selectedOptionId: "neutral-scrim",
7734
+ options: [
7735
+ {
7736
+ id: "neutral-scrim",
7737
+ label: "Neutral scrim",
7738
+ designPatch: {
7739
+ imageSurfaceTreatment: { kind: "neutral-scrim", intensity: "balanced" }
7740
+ }
7741
+ },
7742
+ {
7743
+ id: "brand-scrim-primary",
7744
+ label: "Brand scrim",
7745
+ designPatch: {
7746
+ imageSurfaceTreatment: { kind: "brand-scrim", token: "primary", intensity: "balanced" }
7747
+ }
7748
+ }
7749
+ ]
7750
+ }
7751
+ ],
7752
+ layoutPatches: [
7753
+ {
7754
+ constraints: {
7755
+ layoutVariantKeys: ["micro"]
7756
+ },
7757
+ designPatch: {
7758
+ sectionHeight: "banner",
7759
+ heroTypographyScale: "editorial"
7760
+ }
7761
+ }
7762
+ ],
7763
+ design: {
7764
+ sectionSurface: "hero-image",
7765
+ contentFrame: panelFrame("raised"),
7766
+ itemSurface: "none",
7767
+ transitionAfter: "soft-fade-short",
7768
+ emphasis: "high",
7769
+ sectionHeight: "immersive",
7770
+ heroComposition: "bottom-left",
7771
+ heroTypographyScale: "display",
7772
+ imageSurfaceTreatment: { kind: "neutral-scrim", intensity: "balanced" }
7773
+ }
7774
+ }),
7775
+ defineBlockAppearancePreset({
7776
+ kind: "block-design",
7777
+ id: "hero-poster-image",
7778
+ target: "hero",
7779
+ label: "Poster image hero",
7780
+ blockKinds: ["block.hero"],
7781
+ constraints: {
7782
+ layoutFamilies: ["centered", "compact"]
7783
+ },
7784
+ layoutPatches: [
7785
+ {
7786
+ constraints: {
7787
+ layoutVariantKeys: ["micro"]
7788
+ },
7789
+ designPatch: {
7790
+ sectionHeight: "banner",
7791
+ heroTypographyScale: "display"
7792
+ }
7793
+ }
7794
+ ],
7795
+ design: {
7796
+ sectionSurface: "hero-image",
7797
+ contentFrame: plainFrame,
7798
+ itemSurface: "none",
7799
+ transitionAfter: "soft-fade-short",
7800
+ emphasis: "high",
7801
+ sectionHeight: "immersive",
7802
+ heroComposition: "center",
7803
+ heroTypographyScale: "poster",
7804
+ imageSurfaceTreatment: { kind: "brand-scrim", token: "primary", intensity: "strong" }
7805
+ }
7806
+ }),
7688
7807
  defineBlockAppearancePreset({
7689
7808
  kind: "block-design",
7690
7809
  id: "hero-brand-scrim",
@@ -7734,6 +7853,8 @@ var blockAppearancePresets = [
7734
7853
  transitionAfter: "soft-fade-short",
7735
7854
  emphasis: "high",
7736
7855
  sectionHeight: "immersive",
7856
+ heroComposition: "center",
7857
+ heroTypographyScale: "display",
7737
7858
  imageSurfaceTreatment: { kind: "brand-scrim", token: "primary" }
7738
7859
  }
7739
7860
  }),
@@ -7786,6 +7907,8 @@ var blockAppearancePresets = [
7786
7907
  transitionAfter: "soft-fade-short",
7787
7908
  emphasis: "high",
7788
7909
  sectionHeight: "immersive",
7910
+ heroComposition: "center",
7911
+ heroTypographyScale: "display",
7789
7912
  imageSurfaceTreatment: { kind: "brand-scrim", token: "primary" },
7790
7913
  imageSurfaceMotion: "fixed-frame",
7791
7914
  eyebrowTreatment: "accent-pill-bounce"
@@ -7806,6 +7929,8 @@ var blockAppearancePresets = [
7806
7929
  itemSurface: "none",
7807
7930
  transitionAfter: "soft-fade-short",
7808
7931
  emphasis: "high",
7932
+ heroComposition: "center",
7933
+ heroTypographyScale: "editorial",
7809
7934
  eyebrowTreatment: "accent-pill-bounce"
7810
7935
  }
7811
7936
  }),
@@ -7820,7 +7945,82 @@ var blockAppearancePresets = [
7820
7945
  contentFrame: panelFrame("inset"),
7821
7946
  itemSurface: "none",
7822
7947
  transitionAfter: "none",
7823
- emphasis: "high"
7948
+ emphasis: "high",
7949
+ heroComposition: "center",
7950
+ heroTypographyScale: "editorial"
7951
+ }
7952
+ }),
7953
+ defineBlockAppearancePreset({
7954
+ kind: "block-design",
7955
+ id: "hero-split-editorial",
7956
+ target: "hero",
7957
+ label: "Editorial split hero",
7958
+ blockKinds: ["block.hero"],
7959
+ constraints: {
7960
+ layoutFamilies: ["split"]
7961
+ },
7962
+ design: {
7963
+ sectionSurface: "base",
7964
+ contentFrame: plainFrame,
7965
+ itemSurface: "none",
7966
+ transitionAfter: "soft-fade-short",
7967
+ emphasis: "high",
7968
+ heroTypographyScale: "editorial"
7969
+ }
7970
+ }),
7971
+ defineBlockAppearancePreset({
7972
+ kind: "block-design",
7973
+ id: "hero-split-brand",
7974
+ target: "hero",
7975
+ label: "Brand split hero",
7976
+ blockKinds: ["block.hero"],
7977
+ constraints: {
7978
+ layoutFamilies: ["split"]
7979
+ },
7980
+ design: {
7981
+ sectionSurface: "brand-depth-band",
7982
+ contentFrame: plainFrame,
7983
+ itemSurface: "none",
7984
+ transitionAfter: "soft-fade-short",
7985
+ emphasis: "high",
7986
+ heroTypographyScale: "display",
7987
+ eyebrowTreatment: "accent-pill-bounce"
7988
+ }
7989
+ }),
7990
+ defineBlockAppearancePreset({
7991
+ kind: "block-design",
7992
+ id: "hero-split-soft-panel",
7993
+ target: "hero",
7994
+ label: "Soft panel split hero",
7995
+ blockKinds: ["block.hero"],
7996
+ constraints: {
7997
+ layoutFamilies: ["split"]
7998
+ },
7999
+ design: {
8000
+ sectionSurface: "muted-band",
8001
+ contentFrame: panelFrame("raised"),
8002
+ itemSurface: "none",
8003
+ transitionAfter: "soft-fade-short",
8004
+ emphasis: "high",
8005
+ heroTypographyScale: "editorial"
8006
+ }
8007
+ }),
8008
+ defineBlockAppearancePreset({
8009
+ kind: "block-design",
8010
+ id: "hero-split-accent",
8011
+ target: "hero",
8012
+ label: "Accent split hero",
8013
+ blockKinds: ["block.hero"],
8014
+ constraints: {
8015
+ layoutFamilies: ["split"]
8016
+ },
8017
+ design: {
8018
+ sectionSurface: "accent-band",
8019
+ contentFrame: panelFrame("raised"),
8020
+ itemSurface: "none",
8021
+ transitionAfter: "soft-fade-short",
8022
+ emphasis: "high",
8023
+ heroTypographyScale: "display"
7824
8024
  }
7825
8025
  }),
7826
8026
  defineBlockAppearancePreset({
@@ -7853,9 +8053,9 @@ var blockAppearancePresets = [
7853
8053
  }),
7854
8054
  defineBlockAppearancePreset({
7855
8055
  kind: "block-design",
7856
- id: "intro-soft-earth-statement",
8056
+ id: "intro-organic-statement",
7857
8057
  target: "intro",
7858
- label: "Soft Earth intro statement",
8058
+ label: "Organic intro statement",
7859
8059
  blockKinds: ["block.intro"],
7860
8060
  design: {
7861
8061
  sectionSurface: "base",
@@ -7886,9 +8086,9 @@ var blockAppearancePresets = [
7886
8086
  }),
7887
8087
  defineBlockAppearancePreset({
7888
8088
  kind: "block-design",
7889
- id: "feature-cards-soft-earth-offerings",
8089
+ id: "feature-cards-raised-rule",
7890
8090
  target: "feature-cards",
7891
- label: "Soft Earth offering cards",
8091
+ label: "Raised cards with rule",
7892
8092
  blockKinds: ["block.feature-cards"],
7893
8093
  design: {
7894
8094
  sectionSurface: "base",
@@ -7917,6 +8117,21 @@ var blockAppearancePresets = [
7917
8117
  emphasis: "medium"
7918
8118
  }
7919
8119
  }),
8120
+ defineBlockAppearancePreset({
8121
+ kind: "block-design",
8122
+ id: "events-lined-panel",
8123
+ target: "events",
8124
+ label: "Lined event panel",
8125
+ blockKinds: ["block.event-calendar", "block.event-listing"],
8126
+ design: {
8127
+ sectionSurface: "base",
8128
+ contentFrame: plainFrame,
8129
+ itemSurface: "none",
8130
+ transitionAfter: "none",
8131
+ emphasis: "medium",
8132
+ eventListTreatment: "lined-panel"
8133
+ }
8134
+ }),
7920
8135
  defineBlockAppearancePreset({
7921
8136
  kind: "block-design",
7922
8137
  id: "schedule-details-accent-section",
@@ -7976,9 +8191,9 @@ var blockAppearancePresets = [
7976
8191
  }),
7977
8192
  defineBlockAppearancePreset({
7978
8193
  kind: "block-design",
7979
- id: "testimonials-carded-proof",
8194
+ id: "testimonials-simple-cards",
7980
8195
  target: "testimonials",
7981
- label: "Carded social proof",
8196
+ label: "Simple testimonial cards",
7982
8197
  blockKinds: ["block.testimonials"],
7983
8198
  design: {
7984
8199
  sectionSurface: "base",
@@ -7990,9 +8205,9 @@ var blockAppearancePresets = [
7990
8205
  }),
7991
8206
  defineBlockAppearancePreset({
7992
8207
  kind: "block-design",
7993
- id: "testimonials-contained-proof",
8208
+ id: "testimonials-raised-panel",
7994
8209
  target: "testimonials",
7995
- label: "Contained social proof",
8210
+ label: "Raised testimonial panel",
7996
8211
  blockKinds: ["block.testimonials"],
7997
8212
  design: {
7998
8213
  sectionSurface: "muted-band",
@@ -8004,9 +8219,9 @@ var blockAppearancePresets = [
8004
8219
  }),
8005
8220
  defineBlockAppearancePreset({
8006
8221
  kind: "block-design",
8007
- id: "testimonials-dark-proof",
8222
+ id: "testimonials-accent-panel",
8008
8223
  target: "testimonials",
8009
- label: "Dark proof panel",
8224
+ label: "Accent testimonial panel",
8010
8225
  blockKinds: ["block.testimonials"],
8011
8226
  design: {
8012
8227
  sectionSurface: "accent-band",
@@ -8018,9 +8233,9 @@ var blockAppearancePresets = [
8018
8233
  }),
8019
8234
  defineBlockAppearancePreset({
8020
8235
  kind: "block-design",
8021
- id: "testimonials-accent-quote-proof",
8236
+ id: "testimonials-accent-quote-cards",
8022
8237
  target: "testimonials",
8023
- label: "Accent quote proof",
8238
+ label: "Accent quote cards",
8024
8239
  blockKinds: ["block.testimonials"],
8025
8240
  design: {
8026
8241
  sectionSurface: "accent-band",
@@ -8033,9 +8248,9 @@ var blockAppearancePresets = [
8033
8248
  }),
8034
8249
  defineBlockAppearancePreset({
8035
8250
  kind: "block-design",
8036
- id: "testimonials-soft-earth-proof-band",
8251
+ id: "testimonials-brand-background-quotes",
8037
8252
  target: "testimonials",
8038
- label: "Soft Earth proof band",
8253
+ label: "Brand background quotes",
8039
8254
  blockKinds: ["block.testimonials"],
8040
8255
  design: {
8041
8256
  sectionSurface: "brand-depth-band",
@@ -8079,25 +8294,6 @@ var blockAppearancePresets = [
8079
8294
  emphasis: "low"
8080
8295
  }
8081
8296
  }),
8082
- defineBlockAppearancePreset({
8083
- kind: "block-design",
8084
- id: "faq-soft-earth-two-column",
8085
- target: "faq",
8086
- label: "Soft Earth two-column FAQ",
8087
- blockKinds: ["block.faq"],
8088
- design: {
8089
- sectionSurface: "base",
8090
- contentFrame: plainFrame,
8091
- itemSurface: "flat",
8092
- transitionAfter: "none",
8093
- emphasis: "medium",
8094
- accordionIconTreatment: {
8095
- iconSet: "plus",
8096
- colorToken: "primary",
8097
- motion: "swap"
8098
- }
8099
- }
8100
- }),
8101
8297
  defineBlockAppearancePreset({
8102
8298
  kind: "block-design",
8103
8299
  id: "contact-form-panel",
@@ -9476,7 +9672,8 @@ var accordionSystemSchema = z12.object({
9476
9672
  icon: z12.object({
9477
9673
  style: accordionIconSchema,
9478
9674
  position: z12.enum(["left", "right"]),
9479
- size: z12.enum(["sm", "md", "lg"])
9675
+ size: z12.enum(["sm", "md", "lg"]),
9676
+ colorToken: themeColorTokenSchema.optional()
9480
9677
  }),
9481
9678
  // Trigger (question) styling
9482
9679
  trigger: z12.object({
@@ -9610,6 +9807,7 @@ var navLinkPaddingXSchema = z16.enum(["none", "tight", "compact", "default", "re
9610
9807
  var navLinkBorderRadiusSchema = z16.enum(["none", "sm", "md", "full"]);
9611
9808
  var navLinkTextSizeSchema = z16.enum(["xs", "sm", "base", "lg"]);
9612
9809
  var navLinkLetterSpacingSchema = z16.enum(["normal", "wide", "wider", "widest"]);
9810
+ var navLinkContrastTreatmentSchema = z16.enum(["none", "soft-glow"]);
9613
9811
  var navLinkStyleSchema = z16.object({
9614
9812
  /** Display name for the style */
9615
9813
  name: z16.string().min(1).max(30).optional(),
@@ -9621,6 +9819,8 @@ var navLinkStyleSchema = z16.object({
9621
9819
  textSize: navLinkTextSizeSchema.optional(),
9622
9820
  /** Optional letter spacing override */
9623
9821
  letterSpacing: navLinkLetterSpacingSchema.optional(),
9822
+ /** Optional text-only contrast treatment for transparent/overlay navigation */
9823
+ contrastTreatment: navLinkContrastTreatmentSchema.optional(),
9624
9824
  /** Hover/active color token (for color-change effects) */
9625
9825
  hoverColorToken: themeColorTokenSchema.nullable().optional(),
9626
9826
  /** Padding preset */
@@ -10050,6 +10250,7 @@ var sectionStylesOverrideSchema = z21.object({
10050
10250
  spacing: semanticSpacingSchema.nullable().optional(),
10051
10251
  minHeight: z21.enum(["none", "banner", "hero", "immersive"]).nullable().optional(),
10052
10252
  tileTreatment: z21.enum(tileTreatmentValues).nullable().optional(),
10253
+ eventListTreatment: z21.enum(eventListTreatmentValues).nullable().optional(),
10053
10254
  eyebrowTreatment: z21.enum(eyebrowTreatmentValues).nullable().optional(),
10054
10255
  headingDecoration: headingDecorationSchema.nullable().optional(),
10055
10256
  // Author-level override consumed by later block/editor rendering phases.
@@ -10883,6 +11084,34 @@ var paletteVariantsById = new Map(
10883
11084
  paletteVariants.map((v) => [v.id, v])
10884
11085
  );
10885
11086
 
11087
+ // ../theme-core/src/accordions/siteStyleDefaults.ts
11088
+ var softEarthAccordionSystem = {
11089
+ background: {
11090
+ type: "solid",
11091
+ colorToken: "background"
11092
+ },
11093
+ spacing: "comfortable",
11094
+ corners: "square",
11095
+ border: null,
11096
+ shadow: null,
11097
+ icon: {
11098
+ style: "plus-minus",
11099
+ position: "right",
11100
+ size: "md",
11101
+ colorToken: "primary"
11102
+ },
11103
+ trigger: {
11104
+ textColorToken: "text",
11105
+ fontWeight: "medium"
11106
+ },
11107
+ hover: {
11108
+ textColorToken: "primary"
11109
+ },
11110
+ content: {
11111
+ textColorToken: "neutral-700"
11112
+ }
11113
+ };
11114
+
10886
11115
  // ../theme-core/src/site-styles/headerLooks.ts
10887
11116
  function asHeaderLookId(value) {
10888
11117
  return value;
@@ -10938,7 +11167,7 @@ var headerLayoutCatalog = [
10938
11167
  description: "Detached header chrome that sits over the opening section.",
10939
11168
  structure: "floating-shell",
10940
11169
  variant: "floating",
10941
- defaultPositioning: "fixed",
11170
+ defaultPositioning: "sticky",
10942
11171
  shrinkOnScroll: true,
10943
11172
  maxRecommendedNavItems: 5,
10944
11173
  allowedLogoShapes: ["none", "text-only", "horizontal"]
@@ -10955,7 +11184,9 @@ var headerStyleCatalog = [
10955
11184
  supportedLayoutIds: supportedLayouts(["classic", "centered"]),
10956
11185
  navInteraction: "color-change",
10957
11186
  surface: "neutral",
10958
- navTypography: "plain"
11187
+ defaultDepth: "none",
11188
+ navTypography: "plain",
11189
+ moods: ["calm", "professional", "editorial"]
10959
11190
  },
10960
11191
  {
10961
11192
  id: asHeaderStyleId("fine-line"),
@@ -10964,7 +11195,9 @@ var headerStyleCatalog = [
10964
11195
  supportedLayoutIds: supportedLayouts(["classic", "centered"]),
10965
11196
  navInteraction: "underline-grow",
10966
11197
  surface: "bordered",
10967
- navTypography: "plain"
11198
+ defaultDepth: "line",
11199
+ navTypography: "plain",
11200
+ moods: ["calm", "professional", "editorial"]
10968
11201
  },
10969
11202
  {
10970
11203
  id: asHeaderStyleId("soft-bar"),
@@ -10973,7 +11206,9 @@ var headerStyleCatalog = [
10973
11206
  supportedLayoutIds: supportedLayouts(["classic", "centered"]),
10974
11207
  navInteraction: "pill-background",
10975
11208
  surface: "soft",
10976
- navTypography: "plain"
11209
+ defaultDepth: "line",
11210
+ navTypography: "plain",
11211
+ moods: ["calm", "professional"]
10977
11212
  },
10978
11213
  {
10979
11214
  id: asHeaderStyleId("pill-nav"),
@@ -10982,7 +11217,9 @@ var headerStyleCatalog = [
10982
11217
  supportedLayoutIds: supportedLayouts(["classic", "centered"]),
10983
11218
  navInteraction: "pill-background",
10984
11219
  surface: "soft",
10985
- navTypography: "plain"
11220
+ defaultDepth: "none",
11221
+ navTypography: "plain",
11222
+ moods: ["calm"]
10986
11223
  },
10987
11224
  {
10988
11225
  id: asHeaderStyleId("brand-bar"),
@@ -10991,7 +11228,9 @@ var headerStyleCatalog = [
10991
11228
  supportedLayoutIds: supportedLayouts(["classic", "centered"]),
10992
11229
  navInteraction: "color-change",
10993
11230
  surface: "brand-solid",
10994
- navTypography: "brand-caps"
11231
+ defaultDepth: "none",
11232
+ navTypography: "brand-caps",
11233
+ moods: ["professional", "expressive", "utility"]
10995
11234
  },
10996
11235
  {
10997
11236
  id: asHeaderStyleId("brand-underline"),
@@ -11000,7 +11239,9 @@ var headerStyleCatalog = [
11000
11239
  supportedLayoutIds: supportedLayouts(["classic"]),
11001
11240
  navInteraction: "underline-grow",
11002
11241
  surface: "brand-solid",
11003
- navTypography: "brand-caps"
11242
+ defaultDepth: "none",
11243
+ navTypography: "brand-caps",
11244
+ moods: ["expressive"]
11004
11245
  },
11005
11246
  {
11006
11247
  id: asHeaderStyleId("brand-pill"),
@@ -11009,7 +11250,9 @@ var headerStyleCatalog = [
11009
11250
  supportedLayoutIds: supportedLayouts(["classic", "centered", "floating"]),
11010
11251
  navInteraction: "pill-background",
11011
11252
  surface: "brand-solid",
11012
- navTypography: "brand-caps"
11253
+ defaultDepth: "none",
11254
+ navTypography: "brand-caps",
11255
+ moods: ["expressive"]
11013
11256
  },
11014
11257
  {
11015
11258
  id: asHeaderStyleId("serif-line"),
@@ -11018,7 +11261,9 @@ var headerStyleCatalog = [
11018
11261
  supportedLayoutIds: supportedLayouts(["classic", "centered"]),
11019
11262
  navInteraction: "underline-grow",
11020
11263
  surface: "bordered",
11021
- navTypography: "heading"
11264
+ defaultDepth: "line",
11265
+ navTypography: "heading",
11266
+ moods: ["editorial", "calm"]
11022
11267
  },
11023
11268
  {
11024
11269
  id: asHeaderStyleId("flat-tabs"),
@@ -11027,16 +11272,20 @@ var headerStyleCatalog = [
11027
11272
  supportedLayoutIds: supportedLayouts(["classic", "centered"]),
11028
11273
  navInteraction: "flat-block",
11029
11274
  surface: "bordered",
11030
- navTypography: "quiet-caps"
11275
+ defaultDepth: "shadow",
11276
+ navTypography: "quiet-caps",
11277
+ moods: ["professional", "utility", "expressive"]
11031
11278
  },
11032
11279
  {
11033
11280
  id: asHeaderStyleId("glass"),
11034
11281
  label: "Glass",
11035
11282
  description: "Translucent chrome with frosted navigation backing.",
11036
- supportedLayoutIds: supportedLayouts(["classic", "floating"]),
11283
+ supportedLayoutIds: supportedLayouts(["floating"]),
11037
11284
  navInteraction: "glass-backed",
11038
11285
  surface: "floating",
11039
- navTypography: "plain"
11286
+ defaultDepth: "shadow",
11287
+ navTypography: "plain",
11288
+ moods: ["expressive", "calm"]
11040
11289
  },
11041
11290
  {
11042
11291
  id: asHeaderStyleId("minimal-surface"),
@@ -11045,7 +11294,9 @@ var headerStyleCatalog = [
11045
11294
  supportedLayoutIds: supportedLayouts(["floating"]),
11046
11295
  navInteraction: "color-change",
11047
11296
  surface: "floating",
11048
- navTypography: "plain"
11297
+ defaultDepth: "none",
11298
+ navTypography: "plain",
11299
+ moods: ["editorial", "calm"]
11049
11300
  },
11050
11301
  {
11051
11302
  id: asHeaderStyleId("soft-shell"),
@@ -11054,7 +11305,9 @@ var headerStyleCatalog = [
11054
11305
  supportedLayoutIds: supportedLayouts(["floating"]),
11055
11306
  navInteraction: "pill-background",
11056
11307
  surface: "floating",
11057
- navTypography: "plain"
11308
+ defaultDepth: "shadow",
11309
+ navTypography: "plain",
11310
+ moods: ["calm", "professional"]
11058
11311
  },
11059
11312
  {
11060
11313
  id: asHeaderStyleId("split-glass"),
@@ -11063,7 +11316,9 @@ var headerStyleCatalog = [
11063
11316
  supportedLayoutIds: supportedLayouts(["floating"]),
11064
11317
  navInteraction: "glass-backed",
11065
11318
  surface: "floating",
11066
- navTypography: "quiet-caps"
11319
+ defaultDepth: "shadow",
11320
+ navTypography: "quiet-caps",
11321
+ moods: ["expressive"]
11067
11322
  },
11068
11323
  {
11069
11324
  id: asHeaderStyleId("split-pill"),
@@ -11072,7 +11327,9 @@ var headerStyleCatalog = [
11072
11327
  supportedLayoutIds: supportedLayouts(["floating"]),
11073
11328
  navInteraction: "pill-background",
11074
11329
  surface: "floating",
11075
- navTypography: "heading"
11330
+ defaultDepth: "shadow",
11331
+ navTypography: "heading",
11332
+ moods: ["calm", "editorial"]
11076
11333
  }
11077
11334
  ];
11078
11335
  var headerLayoutsById = new Map(
@@ -11086,7 +11343,6 @@ var headerStyleCompatibilityOrder = /* @__PURE__ */ new Map([
11086
11343
  asHeaderLayoutId("classic"),
11087
11344
  headerStyleRepairChain([
11088
11345
  "minimal",
11089
- "glass",
11090
11346
  "fine-line",
11091
11347
  "soft-bar",
11092
11348
  "pill-nav",
@@ -11153,7 +11409,13 @@ var headerStyleRepairOrder = /* @__PURE__ */ new Map(
11153
11409
  ],
11154
11410
  [
11155
11411
  asHeaderStyleId("glass"),
11156
- headerStyleRepairChain(["glass", "minimal-surface", "minimal"])
11412
+ headerStyleRepairChain([
11413
+ "glass",
11414
+ "soft-shell",
11415
+ "fine-line",
11416
+ "minimal-surface",
11417
+ "minimal"
11418
+ ])
11157
11419
  ],
11158
11420
  [
11159
11421
  asHeaderStyleId("soft-shell"),
@@ -11265,6 +11527,23 @@ function getCompatibleHeaderStyleIds(layoutId) {
11265
11527
  }
11266
11528
  );
11267
11529
  }
11530
+ function themedHeaderShadow(theme) {
11531
+ switch (theme.shadow.elevation) {
11532
+ case "none":
11533
+ return void 0;
11534
+ case "low":
11535
+ return { elevation: "sm" };
11536
+ case "medium":
11537
+ return { elevation: "md" };
11538
+ case "high":
11539
+ return { elevation: "lg" };
11540
+ default:
11541
+ return assertNever(
11542
+ theme.shadow.elevation,
11543
+ "Unhandled theme shadow elevation"
11544
+ );
11545
+ }
11546
+ }
11268
11547
  function solidBrandHeader(theme) {
11269
11548
  const ctaVariant = resolveHeaderCtaVariant(theme, "inverted");
11270
11549
  return {
@@ -11414,9 +11693,7 @@ function practicalUtilityHeader(theme) {
11414
11693
  navColor: "text",
11415
11694
  navStyle: "solid",
11416
11695
  navWeight: "semibold",
11417
- shadow: {
11418
- elevation: "sm"
11419
- },
11696
+ shadow: themedHeaderShadow(theme),
11420
11697
  border: {
11421
11698
  style: "solid",
11422
11699
  width: "thin",
@@ -11485,6 +11762,7 @@ function floatingGlassHeader(theme) {
11485
11762
  return {
11486
11763
  ...transparentOverlayHeader(theme),
11487
11764
  variant: "floating",
11765
+ positioning: "sticky",
11488
11766
  navStyle: "frosted",
11489
11767
  navContainer: {
11490
11768
  type: "glass",
@@ -12000,7 +12278,7 @@ var typographyPresets = [
12000
12278
  heroTypography: {
12001
12279
  headlineSize: "6xl",
12002
12280
  headlineLineHeight: "tight",
12003
- subheadlineSize: "editorial",
12281
+ subheadlineSize: "2xl",
12004
12282
  subheadlineLineHeight: "normal",
12005
12283
  microHeadlineSize: "6xl",
12006
12284
  microHeadlineLineHeight: "tight",
@@ -12018,6 +12296,8 @@ var typographyPresetsById = new Map(
12018
12296
  );
12019
12297
 
12020
12298
  // ../theme-core/src/site-styles/curatedSiteStyles.ts
12299
+ var SOFT_EARTH_SITE_STYLE_ID_VALUE = "site-style:soft-earth";
12300
+ var SOFT_EARTH_SITE_STYLE_ID = asSiteStyleId(SOFT_EARTH_SITE_STYLE_ID_VALUE);
12021
12301
  var curatedSiteStyleIdValues = [
12022
12302
  "site-style:calm-studio",
12023
12303
  "site-style:clear-professional",
@@ -12029,7 +12309,7 @@ var curatedSiteStyleIdValues = [
12029
12309
  "site-style:personal-retreat-journal",
12030
12310
  "site-style:tactile-workshop",
12031
12311
  "site-style:modern-wellness",
12032
- "site-style:soft-earth",
12312
+ SOFT_EARTH_SITE_STYLE_ID_VALUE,
12033
12313
  "site-style:bold-launch",
12034
12314
  "site-style:south-west-twerk-school"
12035
12315
  ];
@@ -12111,7 +12391,10 @@ function uniqueContentFrameKinds() {
12111
12391
  var generatedContentFrameKinds = uniqueContentFrameKinds();
12112
12392
  function defineCuratedSiteStyle(input) {
12113
12393
  const legacyHeaderLookIds = input.recommendedHeaderLookIds ?? ["clean-base"];
12114
- const inferredHeaderCuration = inferHeaderCurationFromLegacyLooks(legacyHeaderLookIds);
12394
+ const inferredHeaderCuration = inferHeaderCurationFromLegacyLooks(
12395
+ legacyHeaderLookIds,
12396
+ input.tokenRecipes
12397
+ );
12115
12398
  const typographyPresetChoices = input.typographyPresetChoices ?? defaultTypographyPresetChoicesForRecipe(input.tokenRecipes.typography);
12116
12399
  const defaultTypographyPresetId = input.defaultTypographyPresetId ? asTypographyPresetId(input.defaultTypographyPresetId) : typographyPresetChoices[0].id;
12117
12400
  if (!typographyPresetChoices.some(
@@ -12144,6 +12427,7 @@ function defineCuratedSiteStyle(input) {
12144
12427
  supportedTransitions: generatedDesignOptionCatalog.transitions
12145
12428
  },
12146
12429
  ...input.themeOverrides ? { themeOverrides: input.themeOverrides } : {},
12430
+ ...input.defaultBlockVariants ? { defaultBlockVariants: input.defaultBlockVariants } : {},
12147
12431
  recommendedAppearancePresetIds: (input.recommendedAppearancePresetIds ?? []).map(asAppearancePresetId),
12148
12432
  defaultHeaderSelection: input.defaultHeaderSelection ? {
12149
12433
  layoutId: asHeaderLayoutId(input.defaultHeaderSelection.layoutId),
@@ -12202,7 +12486,69 @@ function nonEmptyHeaderStyleChoices(choices, fallbackLayoutId) {
12202
12486
  };
12203
12487
  return [first, ...choices.slice(1)];
12204
12488
  }
12205
- function inferHeaderCurationFromLegacyLooks(lookIds) {
12489
+ function uniqueCompatibleHeaderStyleChoices(choices, fallbackLayoutId) {
12490
+ const compatible = new Set(getCompatibleHeaderStyleIds(fallbackLayoutId));
12491
+ const seen = /* @__PURE__ */ new Set();
12492
+ const unique = choices.filter((choice) => {
12493
+ if (!compatible.has(choice.id)) return false;
12494
+ if (seen.has(choice.id)) return false;
12495
+ seen.add(choice.id);
12496
+ return true;
12497
+ });
12498
+ return nonEmptyHeaderStyleChoices(unique, fallbackLayoutId);
12499
+ }
12500
+ function inferredHeaderStyleValuesForRecipes(layoutId, recipes) {
12501
+ switch (layoutId) {
12502
+ case "classic":
12503
+ if (isExpressiveRecipe(recipes)) {
12504
+ return [
12505
+ "brand-bar",
12506
+ "brand-underline",
12507
+ "flat-tabs",
12508
+ "brand-pill",
12509
+ "fine-line"
12510
+ ];
12511
+ }
12512
+ if (recipes.spacing === "compact") {
12513
+ return ["flat-tabs", "fine-line", "minimal", "brand-bar"];
12514
+ }
12515
+ if (isSerifTypographyRecipe(recipes)) {
12516
+ return ["serif-line", "fine-line", "minimal", "soft-bar"];
12517
+ }
12518
+ if (recipes.radius === "rounded" || recipes.radius === "pill") {
12519
+ return ["soft-bar", "pill-nav", "fine-line", "minimal"];
12520
+ }
12521
+ return ["fine-line", "minimal", "soft-bar", "brand-bar"];
12522
+ case "centered":
12523
+ if (isSerifTypographyRecipe(recipes)) {
12524
+ return ["serif-line", "fine-line", "minimal", "soft-bar"];
12525
+ }
12526
+ if (isExpressiveRecipe(recipes)) {
12527
+ return ["brand-pill", "flat-tabs", "brand-bar", "fine-line"];
12528
+ }
12529
+ if (recipes.radius === "rounded" || recipes.radius === "pill") {
12530
+ return ["soft-bar", "pill-nav", "fine-line", "minimal"];
12531
+ }
12532
+ return ["minimal", "fine-line", "soft-bar"];
12533
+ case "floating":
12534
+ if (isExpressiveRecipe(recipes)) {
12535
+ return ["glass", "split-glass", "brand-pill", "soft-shell"];
12536
+ }
12537
+ if (isSerifTypographyRecipe(recipes)) {
12538
+ return ["split-pill", "minimal-surface", "soft-shell"];
12539
+ }
12540
+ return ["soft-shell", "minimal-surface", "glass"];
12541
+ default:
12542
+ return [];
12543
+ }
12544
+ }
12545
+ function isExpressiveRecipe(recipes) {
12546
+ return recipes.contrast === "maximum" || recipes.shadow === "layered" || recipes.motion === "expressive";
12547
+ }
12548
+ function isSerifTypographyRecipe(recipes) {
12549
+ return recipes.typography === "serif-editorial" || recipes.typography === "classic-serif";
12550
+ }
12551
+ function inferHeaderCurationFromLegacyLooks(lookIds, recipes) {
12206
12552
  const selections = lookIds.map((lookId) => resolveLegacyHeaderLookAlias(asHeaderLookId(lookId))).filter(
12207
12553
  (selection) => Boolean(selection)
12208
12554
  );
@@ -12215,8 +12561,15 @@ function inferHeaderCurationFromLegacyLooks(lookIds) {
12215
12561
  );
12216
12562
  const stylesByLayout = {};
12217
12563
  for (const layoutChoice of layoutChoices) {
12218
- const styleChoices = selections.filter((selection) => selection.layoutId === layoutChoice.id).map((selection) => headerStyleChoice(selection.styleId));
12219
- stylesByLayout[unbrandHeaderLayoutId(layoutChoice.id)] = nonEmptyHeaderStyleChoices(styleChoices, layoutChoice.id);
12564
+ const legacyStyleChoices = selections.filter((selection) => selection.layoutId === layoutChoice.id).map((selection) => headerStyleChoice(selection.styleId));
12565
+ const inferredStyleChoices = inferredHeaderStyleValuesForRecipes(
12566
+ layoutChoice.id,
12567
+ recipes
12568
+ ).map((styleId) => headerStyleChoice(styleId));
12569
+ stylesByLayout[unbrandHeaderLayoutId(layoutChoice.id)] = uniqueCompatibleHeaderStyleChoices(
12570
+ [...legacyStyleChoices, ...inferredStyleChoices],
12571
+ layoutChoice.id
12572
+ );
12220
12573
  }
12221
12574
  return {
12222
12575
  defaultHeaderSelection,
@@ -12636,10 +12989,10 @@ var curatedSiteStyles = [
12636
12989
  ]
12637
12990
  }),
12638
12991
  defineCuratedSiteStyle({
12639
- id: "site-style:soft-earth",
12992
+ id: SOFT_EARTH_SITE_STYLE_ID,
12640
12993
  name: "Soft Earth",
12641
12994
  description: "Warm, grounded, and editorial for yoga studios, retreats, and wellbeing communities.",
12642
- generationBrief: "Use cream space, terracotta CTAs, olive proof bands, natural imagery, generous but composed spacing, and editorial serif headings. Prefer a real intro section, image-led offering cards, warm community proof, and a simple two-column FAQ when content allows.",
12995
+ generationBrief: "Use cream space, terracotta CTAs, olive quote bands, natural imagery, generous but composed spacing, and editorial serif headings. Prefer a real intro section, image-led offering cards, warm community quotes, and an FAQ with a full-width intro above two columns of questions when content allows.",
12643
12996
  siteCreatorSelection: {
12644
12997
  kind: "site_creator_keyword_heuristic",
12645
12998
  priority: 45
@@ -12709,14 +13062,18 @@ var curatedSiteStyles = [
12709
13062
  paragraphSize: "default",
12710
13063
  headingSize: "editorial"
12711
13064
  }
12712
- }
13065
+ },
13066
+ accordions: softEarthAccordionSystem
13067
+ },
13068
+ defaultBlockVariants: {
13069
+ "block.faq": "question-columns"
12713
13070
  },
12714
13071
  recommendedAppearancePresetIds: [
12715
13072
  "hero-brand-scrim",
12716
- "intro-soft-earth-statement",
12717
- "feature-cards-soft-earth-offerings",
12718
- "testimonials-soft-earth-proof-band",
12719
- "faq-soft-earth-two-column",
13073
+ "intro-organic-statement",
13074
+ "feature-cards-raised-rule",
13075
+ "events-lined-panel",
13076
+ "testimonials-brand-background-quotes",
12720
13077
  "contact-form-panel"
12721
13078
  ],
12722
13079
  recommendedHeaderLookIds: [
@@ -12820,7 +13177,7 @@ var curatedSiteStyles = [
12820
13177
  "hero-brand-scrim-fixed-frame",
12821
13178
  "body-text-editorial-intro",
12822
13179
  "schedule-details-brand-depth",
12823
- "testimonials-accent-quote-proof",
13180
+ "testimonials-accent-quote-cards",
12824
13181
  "contact-form-brand-depth-card"
12825
13182
  ],
12826
13183
  recommendedHeaderLookIds: [
@@ -12915,6 +13272,7 @@ var themeV2RuntimeStyleFieldNames = [
12915
13272
  ];
12916
13273
  var themeV2BlockSpecificRawStyleFieldNames = [
12917
13274
  "_contentCardStyles",
13275
+ "_heroLayoutStyles",
12918
13276
  "_textCardStyles"
12919
13277
  ];
12920
13278
  var themeV2NormalEditorRawStyleFieldNames = [
@@ -12924,6 +13282,10 @@ var themeV2NormalEditorRawStyleFieldNames = [
12924
13282
  var themeV2NormalEditorRawStyleFieldNameSet = new Set(
12925
13283
  themeV2NormalEditorRawStyleFieldNames
12926
13284
  );
13285
+ var themeV2CompilerOwnedFieldNames = [
13286
+ ...themeV2RuntimeStyleFieldNames,
13287
+ ...themeV2BlockSpecificRawStyleFieldNames
13288
+ ];
12927
13289
 
12928
13290
  // ../theme-core/src/site-styles/designState.ts
12929
13291
  var themeV2DesignStateSchemaVersion = 1;
@@ -12938,6 +13300,16 @@ var heroLegibilityStrategySchema = z23.enum([
12938
13300
  "scrim-gradient",
12939
13301
  "solid-panel"
12940
13302
  ]);
13303
+ var heroCompositionIntentSchema = z23.enum([
13304
+ "center",
13305
+ "bottom-left"
13306
+ ]);
13307
+ var heroTypographyScaleIntentSchema = z23.enum([
13308
+ "quiet",
13309
+ "editorial",
13310
+ "display",
13311
+ "poster"
13312
+ ]);
12941
13313
  var sectionHeightIntentSchema = z23.enum([
12942
13314
  "default",
12943
13315
  "banner",
@@ -12973,6 +13345,7 @@ var imageSurfaceTreatmentSchema = z23.discriminatedUnion("kind", [
12973
13345
  ]);
12974
13346
  var testimonialCardTreatmentSchema = z23.enum(["default", "accent-quote"]);
12975
13347
  var tileTreatmentSchema = z23.enum(tileTreatmentValues);
13348
+ var eventListTreatmentSchema = z23.enum(eventListTreatmentValues);
12976
13349
  var eyebrowTreatmentSchema = z23.enum(eyebrowTreatmentValues);
12977
13350
  function uniqueNonEmpty(values) {
12978
13351
  const uniqueValues = [...new Set(values)];
@@ -13014,10 +13387,13 @@ var blockDesignPlanSchema = z23.object({
13014
13387
  emphasis: z23.enum(userDesignOptionCatalog.emphases),
13015
13388
  sectionHeight: sectionHeightIntentSchema.optional(),
13016
13389
  heroLegibility: heroLegibilityStrategySchema.optional(),
13390
+ heroComposition: heroCompositionIntentSchema.optional(),
13391
+ heroTypographyScale: heroTypographyScaleIntentSchema.optional(),
13017
13392
  imageSurfaceTreatment: imageSurfaceTreatmentSchema.optional(),
13018
13393
  imageSurfaceMotion: imageSurfaceMotionSchema.optional(),
13019
13394
  testimonialCardTreatment: testimonialCardTreatmentSchema.optional(),
13020
13395
  tileTreatment: tileTreatmentSchema.optional(),
13396
+ eventListTreatment: eventListTreatmentSchema.optional(),
13021
13397
  eyebrowTreatment: eyebrowTreatmentSchema.optional()
13022
13398
  }).strict();
13023
13399
  var styleAuthoritySchema = z23.discriminatedUnion("kind", [
@@ -14417,6 +14793,7 @@ function styledSection(config) {
14417
14793
  renderBackgroundImage = true,
14418
14794
  backgroundImageLoading,
14419
14795
  backgroundImageFetchPriority,
14796
+ allowOverflow = false,
14420
14797
  fullWidthPath
14421
14798
  } = config;
14422
14799
  const renderedBackgroundNodes = backgroundLayer(`${bindFrom}.background`, {
@@ -14451,7 +14828,7 @@ function styledSection(config) {
14451
14828
  // No fallback needed - transform handles all cases via defaultSpacing
14452
14829
  }
14453
14830
  },
14454
- allowOverflow: {
14831
+ allowOverflow: allowOverflow ? true : {
14455
14832
  $bind: {
14456
14833
  from: `${bindFrom}.background`,
14457
14834
  transforms: [{ id: "background.resolveAllowOverflow" }],
@@ -15135,6 +15512,14 @@ var tileTreatmentSet = new Set(tileTreatmentValues);
15135
15512
  function isTileTreatment(value) {
15136
15513
  return typeof value === "string" && tileTreatmentSet.has(value);
15137
15514
  }
15515
+ var eventListTreatmentClassMap = {
15516
+ plain: "",
15517
+ "lined-panel": "rb-event-list-treatment-lined-panel"
15518
+ };
15519
+ var eventListTreatmentSet = new Set(eventListTreatmentValues);
15520
+ function isEventListTreatment(value) {
15521
+ return typeof value === "string" && eventListTreatmentSet.has(value);
15522
+ }
15138
15523
  var sectionClassNameTransform = {
15139
15524
  id: "sectionStyles.resolveClassName",
15140
15525
  kind: "string",
@@ -15202,6 +15587,17 @@ var sectionClassNameTransform = {
15202
15587
  `[sectionStyles] Invalid tileTreatment value in _sectionStyles: "${tileTreatment}". Expected one of: ${tileTreatmentValues.join(", ")}.`
15203
15588
  );
15204
15589
  }
15590
+ const eventListTreatment = input?.eventListTreatment;
15591
+ if (isEventListTreatment(eventListTreatment)) {
15592
+ const eventListTreatmentClass = eventListTreatmentClassMap[eventListTreatment];
15593
+ if (eventListTreatmentClass) {
15594
+ classes.push(eventListTreatmentClass);
15595
+ }
15596
+ } else if (typeof eventListTreatment === "string" && process.env.NODE_ENV !== "production") {
15597
+ console.warn(
15598
+ `[sectionStyles] Invalid eventListTreatment value in _sectionStyles: "${eventListTreatment}". Expected one of: ${eventListTreatmentValues.join(", ")}.`
15599
+ );
15600
+ }
15205
15601
  if (hasFixedFrameBackgroundMotion(input)) {
15206
15602
  classes.push(fixedFrameScopeClass);
15207
15603
  }
@@ -15637,6 +16033,35 @@ function sectionState(opts) {
15637
16033
  );
15638
16034
  }
15639
16035
 
16036
+ // ../blocks/src/system/node/fragments/headingDecoration.ts
16037
+ var defaultBindFrom = "_sectionStyles.headingDecoration";
16038
+ function headingDecoration({
16039
+ bindFrom = defaultBindFrom,
16040
+ family,
16041
+ placement,
16042
+ className
16043
+ }) {
16044
+ return el(
16045
+ "div",
16046
+ {
16047
+ "aria-hidden": "true",
16048
+ className: {
16049
+ $bind: {
16050
+ from: bindFrom,
16051
+ transforms: [
16052
+ {
16053
+ id: "ui.headingDecorationClassName",
16054
+ options: { baseClass: className, family }
16055
+ }
16056
+ ]
16057
+ }
16058
+ }
16059
+ },
16060
+ null,
16061
+ when(`${bindFrom}.placement`, { equals: placement })
16062
+ );
16063
+ }
16064
+
15640
16065
  // ../blocks/src/system/fragments/types.ts
15641
16066
  import { z as z27 } from "zod";
15642
16067
  var FRAGMENT_ID_PATTERN = /^[a-z0-9](?:[a-z0-9._-]*[a-z0-9])?$/i;
@@ -15722,47 +16147,48 @@ function validateFieldDefinitions(fields3, fragmentId) {
15722
16147
  function prefixFieldId(field, scope) {
15723
16148
  const cloned = cloneFieldDefinition2(field);
15724
16149
  cloned.id = `${scope}.${field.id}`;
15725
- cloned.defaultValue = cloneUnknown(cloned.defaultValue);
16150
+ const defaultValue = cloned.defaultValue;
16151
+ cloned.defaultValue = cloneUnknown(defaultValue);
15726
16152
  cloned.visibleRoles = cloned.visibleRoles ? [...cloned.visibleRoles] : void 0;
15727
16153
  cloned.ui = cloneUnknown(cloned.ui);
15728
16154
  return cloned;
15729
16155
  }
15730
16156
  function cloneFieldDefinition2(field) {
15731
- switch (field.type) {
15732
- case "repeater":
15733
- if (field.polymorphic && field.itemTypes) {
15734
- return {
15735
- ...field,
15736
- polymorphic: true,
15737
- itemTypes: Object.fromEntries(
15738
- Object.entries(field.itemTypes).map(([key, itemType]) => [
15739
- key,
15740
- {
15741
- ...itemType,
15742
- fields: itemType.fields.map(cloneFieldDefinition2)
15743
- }
15744
- ])
15745
- )
15746
- };
15747
- } else if (field.schema) {
15748
- return {
15749
- ...field,
15750
- schema: {
15751
- fields: field.schema.fields.map(cloneFieldDefinition2)
15752
- }
15753
- };
15754
- }
15755
- return { ...field };
15756
- case "group":
16157
+ if (field.type === "repeater") {
16158
+ if (field.polymorphic && field.itemTypes) {
16159
+ return {
16160
+ ...field,
16161
+ polymorphic: true,
16162
+ itemTypes: Object.fromEntries(
16163
+ Object.entries(field.itemTypes).map(([key, itemType]) => [
16164
+ key,
16165
+ {
16166
+ ...itemType,
16167
+ fields: itemType.fields.map(cloneFieldDefinition2)
16168
+ }
16169
+ ])
16170
+ )
16171
+ };
16172
+ }
16173
+ if (field.schema) {
15757
16174
  return {
15758
16175
  ...field,
15759
16176
  schema: {
15760
16177
  fields: field.schema.fields.map(cloneFieldDefinition2)
15761
16178
  }
15762
16179
  };
15763
- default:
15764
- return { ...field };
16180
+ }
16181
+ return { ...field };
16182
+ }
16183
+ if (field.type === "group") {
16184
+ return {
16185
+ ...field,
16186
+ schema: {
16187
+ fields: field.schema.fields.map(cloneFieldDefinition2)
16188
+ }
16189
+ };
15765
16190
  }
16191
+ return { ...field };
15766
16192
  }
15767
16193
  function cloneUnknown(value) {
15768
16194
  if (value == null || typeof value !== "object") {
@@ -16415,6 +16841,10 @@ var testimonialsHeadingFragment = defineFragment({
16415
16841
  when("content.heading"),
16416
16842
  bind("content.heading")
16417
16843
  ),
16844
+ headingDecoration({
16845
+ family: "short-center-rule",
16846
+ placement: "under-centered-heading"
16847
+ }),
16418
16848
  text(
16419
16849
  {
16420
16850
  as: "p",
@@ -17086,6 +17516,41 @@ var faqHeadingFragment = defineFragment({
17086
17516
  });
17087
17517
 
17088
17518
  // ../blocks/src/system/fragments/library/faqAccordion.ts
17519
+ function createFaqAccordionLayout(options = {}) {
17520
+ return accordionList({
17521
+ collection: "content.items",
17522
+ itemName: "faqItem",
17523
+ indexName: "faqIndex",
17524
+ accordionProps: {
17525
+ className: options.rootClassName ?? "accordion-root",
17526
+ type: "single",
17527
+ collapsible: true
17528
+ },
17529
+ itemProps: {
17530
+ className: {
17531
+ $bind: {
17532
+ from: "content._cardStyles",
17533
+ transforms: [
17534
+ {
17535
+ id: "boxStyles.all",
17536
+ options: {
17537
+ axis: "all",
17538
+ includeSpacing: false,
17539
+ baseClass: "rb-faq-item rb-relative rb-isolate rb-overflow-hidden"
17540
+ }
17541
+ }
17542
+ ]
17543
+ },
17544
+ fallback: "rb-faq-item"
17545
+ },
17546
+ iconStyle: { $bind: { from: "theme.accordions.icon.style" } },
17547
+ // Legacy theme accordion style
17548
+ iconTreatment: { $bind: { from: "content._sectionStyles.accordionIconTreatment" } }
17549
+ },
17550
+ triggerFrom: "faqItem.question",
17551
+ contentFrom: "faqItem.answer"
17552
+ });
17553
+ }
17089
17554
  var faqAccordionFragment = defineFragment({
17090
17555
  id: "faqAccordion",
17091
17556
  title: "FAQ Accordion",
@@ -17119,40 +17584,7 @@ var faqAccordionFragment = defineFragment({
17119
17584
  }
17120
17585
  }
17121
17586
  ],
17122
- layout: accordionList({
17123
- collection: "content.items",
17124
- itemName: "faqItem",
17125
- indexName: "faqIndex",
17126
- accordionProps: {
17127
- className: "accordion-root",
17128
- // CSS-first: all styling handled by theme CSS
17129
- type: "single",
17130
- collapsible: true
17131
- },
17132
- itemProps: {
17133
- className: {
17134
- $bind: {
17135
- from: "content._cardStyles",
17136
- transforms: [
17137
- {
17138
- id: "boxStyles.all",
17139
- options: {
17140
- axis: "all",
17141
- includeSpacing: false,
17142
- baseClass: "rb-faq-item rb-relative rb-isolate rb-overflow-hidden rb-border"
17143
- }
17144
- }
17145
- ]
17146
- },
17147
- fallback: "rb-faq-item"
17148
- },
17149
- iconStyle: { $bind: { from: "theme.accordions.icon.style" } },
17150
- // Legacy theme accordion style
17151
- iconTreatment: { $bind: { from: "content._sectionStyles.accordionIconTreatment" } }
17152
- },
17153
- triggerFrom: "faqItem.question",
17154
- contentFrom: "faqItem.answer"
17155
- })
17587
+ layout: createFaqAccordionLayout()
17156
17588
  });
17157
17589
 
17158
17590
  // ../blocks/src/system/fragments/library/card.ts
@@ -18099,7 +18531,8 @@ function createBlockManifestWithContentShape(config, _contentShape) {
18099
18531
  return createBlockManifest(config);
18100
18532
  }
18101
18533
  function normalizeBlockLayout(layout) {
18102
- return Array.isArray(layout) ? [...layout] : layout;
18534
+ const rawLayout = layout;
18535
+ return Array.isArray(rawLayout) ? rawLayout : rawLayout;
18103
18536
  }
18104
18537
  function deriveComponentName(id) {
18105
18538
  const base = id.replace(/^block\./, "");
@@ -18205,6 +18638,7 @@ var microLayout = styledSection({
18205
18638
  function splitLayoutWith(children) {
18206
18639
  return styledSection({
18207
18640
  children: styledContainer({
18641
+ baseClassName: "rb-relative rb-isolate rb-overflow-visible",
18208
18642
  children: {
18209
18643
  type: "grid",
18210
18644
  props: {
@@ -18229,6 +18663,7 @@ function splitLayoutWith(children) {
18229
18663
  // The split variants render the image as a real grid column, so suppress
18230
18664
  // the default absolute background image layer while keeping color/overlay.
18231
18665
  renderBackgroundImage: false,
18666
+ allowOverflow: true,
18232
18667
  baseClass: ""
18233
18668
  });
18234
18669
  }
@@ -18382,6 +18817,21 @@ function introHeading(className) {
18382
18817
  bind("content.title")
18383
18818
  );
18384
18819
  }
18820
+ function introHeadingGroup(className) {
18821
+ return stack(
18822
+ {
18823
+ gap: "sm",
18824
+ className: "rb-intro-heading-group"
18825
+ },
18826
+ [
18827
+ introHeading(className),
18828
+ headingDecoration({
18829
+ family: "organic-squiggle",
18830
+ placement: "after-heading"
18831
+ })
18832
+ ]
18833
+ );
18834
+ }
18385
18835
  function introBody(className = "rb-prose rb-max-w-none") {
18386
18836
  return richText({ className }, bind("content.body"));
18387
18837
  }
@@ -18400,6 +18850,10 @@ function introCopyStack(options = {}) {
18400
18850
  },
18401
18851
  [
18402
18852
  introHeading(options.headingClassName ?? "rb-intro-title"),
18853
+ headingDecoration({
18854
+ family: "organic-squiggle",
18855
+ placement: "after-heading"
18856
+ }),
18403
18857
  introBody(options.bodyClassName),
18404
18858
  introCtas(options.ctaJustify)
18405
18859
  ]
@@ -18439,7 +18893,7 @@ var statementCopyLayout = styledSection({
18439
18893
  className: "rb-intro rb-intro-statement rb-grid rb-grid-cols-1 rb-gap-8 rb-md-grid-cols-2 rb-md-items-start"
18440
18894
  },
18441
18895
  [
18442
- introHeading("rb-intro-title rb-max-w-xl"),
18896
+ introHeadingGroup("rb-intro-title rb-max-w-xl"),
18443
18897
  stack({ gap: "md", className: "rb-intro-copy rb-max-w-xl" }, [
18444
18898
  introBody(),
18445
18899
  introCtas("start")
@@ -18460,7 +18914,7 @@ var statementMediaLayout = styledSection({
18460
18914
  className: "rb-intro rb-intro-statement-media rb-grid rb-grid-cols-1 rb-gap-8 rb-lg-grid-cols-3 rb-lg-items-center"
18461
18915
  },
18462
18916
  [
18463
- introHeading("rb-intro-title rb-max-w-xl"),
18917
+ introHeadingGroup("rb-intro-title rb-max-w-xl"),
18464
18918
  stack({ gap: "md", className: "rb-intro-copy rb-max-w-xl" }, [
18465
18919
  introBody(),
18466
18920
  introCtas("start")
@@ -19462,6 +19916,9 @@ function isNodeDefinitionArray(layout) {
19462
19916
  }
19463
19917
  var headingLayout = fragmentLayoutNode(faqHeadingFragment.layout);
19464
19918
  var accordionLayout = fragmentLayoutNode(faqAccordionFragment.layout);
19919
+ var questionColumnsAccordionLayout = createFaqAccordionLayout({
19920
+ rootClassName: "accordion-root rb-faq-question-columns rb-grid rb-grid-cols-1 rb-gap-4 rb-lg-grid-cols-2"
19921
+ });
19465
19922
  var defaultLayout = styledSection({
19466
19923
  children: styledContainer({
19467
19924
  baseClassName: "rb-relative rb-isolate",
@@ -19475,11 +19932,24 @@ var twoColumnLayout = styledSection({
19475
19932
  children: el(
19476
19933
  "div",
19477
19934
  {
19478
- className: "rb-faq-two-column rb-grid rb-grid-cols-1 rb-gap-8 rb-lg-grid-cols-2 rb-lg-items-start"
19935
+ className: "rb-faq-split-heading rb-grid rb-grid-cols-1 rb-gap-8 rb-lg-grid-cols-2 rb-lg-items-start"
19479
19936
  },
19480
19937
  [
19481
- el("div", { className: "rb-faq-two-column-heading" }, [headingLayout]),
19482
- el("div", { className: "rb-faq-two-column-accordion" }, [accordionLayout])
19938
+ el("div", { className: "rb-faq-split-heading-copy" }, [headingLayout]),
19939
+ el("div", { className: "rb-faq-split-heading-accordion" }, [accordionLayout])
19940
+ ]
19941
+ )
19942
+ }),
19943
+ baseClass: ""
19944
+ });
19945
+ var questionColumnsLayout = styledSection({
19946
+ children: styledContainer({
19947
+ baseClassName: "rb-relative rb-isolate",
19948
+ children: stack(
19949
+ { gap: "xl", className: "rb-w-full" },
19950
+ [
19951
+ headingLayout,
19952
+ questionColumnsAccordionLayout
19483
19953
  ]
19484
19954
  )
19485
19955
  }),
@@ -19504,7 +19974,8 @@ var faqManifest = createBlockManifest({
19504
19974
  layout: defaultLayout,
19505
19975
  variants: {
19506
19976
  default: defaultLayout,
19507
- "two-column": twoColumnLayout
19977
+ "two-column": twoColumnLayout,
19978
+ "question-columns": questionColumnsLayout
19508
19979
  },
19509
19980
  defaultVariant: "default",
19510
19981
  variantOptions: {
@@ -19515,6 +19986,10 @@ var faqManifest = createBlockManifest({
19515
19986
  "two-column": {
19516
19987
  label: "Two column",
19517
19988
  description: "A left heading column with FAQ items on the right."
19989
+ },
19990
+ "question-columns": {
19991
+ label: "Question columns",
19992
+ description: "A full-width heading above FAQ items split into two columns."
19518
19993
  }
19519
19994
  },
19520
19995
  description: "Accordion of frequently asked questions and answers.",
@@ -19603,16 +20078,20 @@ var marqueeLoopTransform = {
19603
20078
  summary: "Repeat an array to a minimum length, then duplicate it for seamless marquee looping",
19604
20079
  schema: marqueeLoopOptionsSchema,
19605
20080
  run: (value, options) => {
19606
- if (!Array.isArray(value) || value.length === 0) return [];
20081
+ const items = toUnknownArray(value);
20082
+ if (items.length === 0) return [];
19607
20083
  const minItems = options?.minItems ?? 10;
19608
20084
  const base = [];
19609
20085
  while (base.length < minItems) {
19610
- base.push(...value);
20086
+ base.push(...items);
19611
20087
  if (base.length > 1e3) break;
19612
20088
  }
19613
20089
  return [...base, ...base];
19614
20090
  }
19615
20091
  };
20092
+ function toUnknownArray(value) {
20093
+ return Array.isArray(value) ? value : [];
20094
+ }
19616
20095
  var formattingTransforms = [
19617
20096
  uppercaseTransform,
19618
20097
  fallbackTransform,
@@ -19636,9 +20115,21 @@ var eyebrowTreatmentClassMap = {
19636
20115
  "accent-pill-bounce": "rb-eyebrow-treatment-pill rb-eyebrow-treatment-accent rb-eyebrow-treatment-pill-bounce"
19637
20116
  };
19638
20117
  var eyebrowTreatmentSet = new Set(eyebrowTreatmentValues);
20118
+ var headingDecorationFamilySet = new Set(visibleHeadingDecorationFamilyValues);
20119
+ var headingDecorationPlacementSet = new Set(visibleHeadingDecorationPlacementValues);
20120
+ var headingDecorationColorTokenSet = new Set(headingDecorationColorTokenValues);
19639
20121
  function isEyebrowTreatment(value) {
19640
20122
  return typeof value === "string" && eyebrowTreatmentSet.has(value);
19641
20123
  }
20124
+ function isHeadingDecorationFamily(value) {
20125
+ return typeof value === "string" && headingDecorationFamilySet.has(value);
20126
+ }
20127
+ function isHeadingDecorationPlacement(value) {
20128
+ return typeof value === "string" && headingDecorationPlacementSet.has(value);
20129
+ }
20130
+ function isHeadingDecorationColorToken(value) {
20131
+ return typeof value === "string" && headingDecorationColorTokenSet.has(value);
20132
+ }
19642
20133
  var imageGalleryCornerClassMap = {
19643
20134
  none: "",
19644
20135
  sm: "rb-rounded-sm",
@@ -19742,6 +20233,10 @@ var sectionStateToneTransform = {
19742
20233
  summary: "Map semantic section-state kind to feedback tone",
19743
20234
  run: (value) => sectionStateToneFromUnknown(value)
19744
20235
  };
20236
+ var heroTitleLengthThresholds = {
20237
+ medium: { maxCharacters: 42, maxWords: 6 },
20238
+ long: { maxCharacters: 78, maxWords: 11 }
20239
+ };
19745
20240
  function isPlainObject(value) {
19746
20241
  return Boolean(value) && typeof value === "object" && !Array.isArray(value);
19747
20242
  }
@@ -19749,6 +20244,14 @@ function readString(obj, key) {
19749
20244
  const v = obj[key];
19750
20245
  return typeof v === "string" ? v : void 0;
19751
20246
  }
20247
+ function resolveGeneratedHeroLayoutStyles(content) {
20248
+ const raw = content._heroLayoutStyles;
20249
+ return isPlainObject(raw) ? raw : null;
20250
+ }
20251
+ function readHeroLayoutString(content, generatedKey, fallbackKey = generatedKey) {
20252
+ const generated = resolveGeneratedHeroLayoutStyles(content);
20253
+ return generated && typeof generated[generatedKey] === "string" ? generated[generatedKey] : readString(content, fallbackKey);
20254
+ }
19752
20255
  function resolveHeroVariant(content) {
19753
20256
  const variant = readString(content, "variant");
19754
20257
  if (variant && variant.trim()) return variant.trim();
@@ -19757,14 +20260,14 @@ function resolveHeroVariant(content) {
19757
20260
  return null;
19758
20261
  }
19759
20262
  function resolveHeroContentAlignment(content) {
19760
- const raw = readString(content, "contentAlignment");
20263
+ const raw = readHeroLayoutString(content, "contentAlignment");
19761
20264
  if (raw === "left" || raw === "center" || raw === "right") return raw;
19762
20265
  const variant = resolveHeroVariant(content);
19763
20266
  if (variant === "split" || variant === "splitReverse") return "left";
19764
20267
  return "center";
19765
20268
  }
19766
20269
  function resolveHeroVerticalAlignment(content) {
19767
- const raw = readString(content, "verticalAlignment");
20270
+ const raw = readHeroLayoutString(content, "verticalAlignment");
19768
20271
  if (raw === "top" || raw === "center" || raw === "bottom") return raw;
19769
20272
  const sectionStyles = asPartialObject(content._sectionStyles);
19770
20273
  const minHeight = sectionStyles?.minHeight;
@@ -19774,11 +20277,29 @@ function resolveHeroVerticalAlignment(content) {
19774
20277
  return "top";
19775
20278
  }
19776
20279
  function resolveHeroContentMaxWidth(content) {
19777
- const raw = readString(content, "contentMaxWidth");
20280
+ const raw = readHeroLayoutString(content, "contentMaxWidth");
19778
20281
  if (raw === "default" || raw === "narrow" || raw === "medium" || raw === "wide")
19779
20282
  return raw;
19780
20283
  return "default";
19781
20284
  }
20285
+ function resolveHeroTypographyScale(content) {
20286
+ const raw = readHeroLayoutString(
20287
+ content,
20288
+ "typographyScale",
20289
+ "heroTypographyScale"
20290
+ );
20291
+ if (raw === "quiet" || raw === "editorial" || raw === "display" || raw === "poster") {
20292
+ return raw;
20293
+ }
20294
+ return null;
20295
+ }
20296
+ function resolveHeroTitleLength(content) {
20297
+ const headline = readString(content, "headline")?.trim() ?? "";
20298
+ const wordCount = headline.length === 0 ? 0 : headline.split(/\s+/).length;
20299
+ if (headline.length > heroTitleLengthThresholds.long.maxCharacters || wordCount > heroTitleLengthThresholds.long.maxWords) return "long";
20300
+ if (headline.length > heroTitleLengthThresholds.medium.maxCharacters || wordCount > heroTitleLengthThresholds.medium.maxWords) return "medium";
20301
+ return "short";
20302
+ }
19782
20303
  var heroContentWrapperClassSchema = z33.object({
19783
20304
  base: z33.string().optional()
19784
20305
  });
@@ -19791,6 +20312,8 @@ var heroContentWrapperClassTransform = {
19791
20312
  const content = isPlainObject(value) ? value : isPlainObject(context.data) ? context.data : {};
19792
20313
  const alignment = resolveHeroContentAlignment(content);
19793
20314
  const maxWidth = resolveHeroContentMaxWidth(content);
20315
+ const typographyScale = resolveHeroTypographyScale(content);
20316
+ const titleLength = resolveHeroTitleLength(content);
19794
20317
  const textAlignClass = alignment === "center" ? "rb-text-center" : alignment === "right" ? "rb-text-right" : "rb-text-left";
19795
20318
  const maxWidthClass = maxWidth === "narrow" ? "rb-max-w-2xl" : maxWidth === "medium" ? "rb-max-w-3xl" : maxWidth === "wide" ? "rb-max-w-5xl" : "";
19796
20319
  const positionClass = alignment === "center" ? "rb-mx-auto" : alignment === "right" ? "rb-ml-auto" : "";
@@ -19798,7 +20321,9 @@ var heroContentWrapperClassTransform = {
19798
20321
  options?.base,
19799
20322
  textAlignClass,
19800
20323
  maxWidthClass,
19801
- positionClass
20324
+ positionClass,
20325
+ typographyScale ? `rb-hero-typography-${typographyScale}` : "",
20326
+ `rb-hero-title-${titleLength}`
19802
20327
  ]);
19803
20328
  }
19804
20329
  };
@@ -20098,11 +20623,67 @@ var uiTransforms = [
20098
20623
  const treatment = isEyebrowTreatment(value) ? value : "plain";
20099
20624
  return joinClasses3([baseClass, eyebrowTreatmentClassMap[treatment]]);
20100
20625
  }
20626
+ },
20627
+ {
20628
+ id: "ui.headingDecorationClassName",
20629
+ kind: "string",
20630
+ summary: "Apply constrained Theme V2 heading decoration classes",
20631
+ run: (value, options) => {
20632
+ const baseClass = typeof options?.baseClass === "string" && options.baseClass.trim() ? options.baseClass : "rb-heading-decoration";
20633
+ const decoration = asPartialObject(value);
20634
+ const family = isHeadingDecorationFamily(decoration?.family) ? decoration.family : null;
20635
+ const allowedFamily = isHeadingDecorationFamily(options?.family) ? options.family : null;
20636
+ const placement = isHeadingDecorationPlacement(decoration?.placement) ? decoration.placement : null;
20637
+ const colorToken = isHeadingDecorationColorToken(decoration?.colorToken) ? decoration.colorToken : "primary";
20638
+ if (!family || !placement) return "rb-hidden";
20639
+ if (allowedFamily && family !== allowedFamily) return "rb-hidden";
20640
+ return joinClasses3([
20641
+ baseClass,
20642
+ `rb-heading-decoration-${family}`,
20643
+ `rb-heading-decoration-placement-${placement}`,
20644
+ `rb-heading-decoration-color-${colorToken}`
20645
+ ]);
20646
+ }
20101
20647
  }
20102
20648
  ];
20103
20649
 
20104
20650
  // ../blocks/src/system/transforms/registry/layout.ts
20105
20651
  import { z as z34 } from "zod";
20652
+
20653
+ // ../theme-core/src/siteChromePlacement.ts
20654
+ var HEADER_POSITIONINGS = ["static", "sticky", "fixed"];
20655
+ function parseHeaderPositioning(value) {
20656
+ return isHeaderPositioning(value) ? value : "static";
20657
+ }
20658
+ function isHeaderPositioning(value) {
20659
+ return typeof value === "string" && HEADER_POSITIONINGS.includes(value);
20660
+ }
20661
+ function planSiteChromePlacement(positioning) {
20662
+ switch (positioning) {
20663
+ case "static":
20664
+ return {
20665
+ kind: "static",
20666
+ headerRootClassName: null,
20667
+ standaloneShellClassName: null
20668
+ };
20669
+ case "sticky":
20670
+ return {
20671
+ kind: "sticky",
20672
+ headerRootClassName: "rb-sticky rb-top-0",
20673
+ standaloneShellClassName: "sticky top-0 z-40 w-full"
20674
+ };
20675
+ case "fixed":
20676
+ return {
20677
+ kind: "fixed",
20678
+ headerRootClassName: "rb-fixed rb-top-0 rb-left-0 rb-right-0",
20679
+ standaloneShellClassName: "fixed left-0 right-0 top-0 z-40 w-full"
20680
+ };
20681
+ default:
20682
+ return assertNever(positioning);
20683
+ }
20684
+ }
20685
+
20686
+ // ../blocks/src/system/transforms/registry/layout.ts
20106
20687
  var joinClasses4 = (parts) => parts.filter(
20107
20688
  (part) => typeof part === "string" && part.trim().length > 0
20108
20689
  ).join(" ").replace(/\s+/g, " ").trim();
@@ -20218,7 +20799,8 @@ var headerRootClassTransform = {
20218
20799
  ...options
20219
20800
  };
20220
20801
  const content = asPartialObject(value) ?? {};
20221
- const positioning = typeof content.positioning === "string" ? content.positioning : "static";
20802
+ const positioning = parseHeaderPositioning(content.positioning);
20803
+ const placement = planSiteChromePlacement(positioning);
20222
20804
  const shrinkOnScroll = Boolean(content.shrinkOnScroll);
20223
20805
  const header = asPartialObject(value);
20224
20806
  const visuals = resolveHeaderVisualStyles(header, context.theme);
@@ -20230,14 +20812,14 @@ var headerRootClassTransform = {
20230
20812
  if (config.blur) classes.push(config.blur);
20231
20813
  if (config.blurSupport) classes.push(config.blurSupport);
20232
20814
  }
20233
- if (positioning === "sticky") {
20815
+ if (placement.kind === "sticky") {
20234
20816
  classes.push(
20235
20817
  visuals.isTransparent ? config.stickyTransparent : config.sticky
20236
20818
  );
20237
- } else if (positioning === "fixed") {
20819
+ } else if (placement.kind === "fixed") {
20238
20820
  classes.push(config.fixed);
20239
20821
  }
20240
- if (shrinkOnScroll && (positioning === "sticky" || positioning === "fixed")) {
20822
+ if (shrinkOnScroll && placement.kind !== "static") {
20241
20823
  classes.push(config.shrink);
20242
20824
  }
20243
20825
  const VALID_VARIANTS = [
@@ -20769,6 +21351,10 @@ function desktopOnlyDisplay(display) {
20769
21351
  return `rb-hidden ${LARGE_DISPLAY_CLASSES[display]}`;
20770
21352
  }
20771
21353
 
21354
+ // ../theme-core/src/siteChromeOverlayClearance.ts
21355
+ var SITE_CHROME_VISIBLE_HEADER_ATTR = "data-site-chrome-visible-header";
21356
+ var SITE_CHROME_VISIBLE_HEADER_SELECTOR = `[${SITE_CHROME_VISIBLE_HEADER_ATTR}="true"]`;
21357
+
20772
21358
  // ../blocks/src/system/blocks/site-header.ts
20773
21359
  var logoRow = link(
20774
21360
  {
@@ -21041,6 +21627,7 @@ var transparentLayout = inline(
21041
21627
  );
21042
21628
  var floatingLayout = inline(
21043
21629
  {
21630
+ [SITE_CHROME_VISIBLE_HEADER_ATTR]: "true",
21044
21631
  className: bindProp("$root.theme.header.maxWidth", {
21045
21632
  transforms: pipe(
21046
21633
  tx("layout.maxWidthClass", {
@@ -21986,6 +22573,10 @@ var sectionHeading = stack(
21986
22573
  when("content.title"),
21987
22574
  bind("content.title")
21988
22575
  ),
22576
+ headingDecoration({
22577
+ family: "short-center-rule",
22578
+ placement: "under-centered-heading"
22579
+ }),
21989
22580
  richText(
21990
22581
  {
21991
22582
  className: "rb-feature-cards-description rb-prose rb-mx-auto rb-max-w-none",
@@ -23167,8 +23758,8 @@ var eventSurfaceScopeValues = [
23167
23758
  "custom"
23168
23759
  ];
23169
23760
  var eventScheduleScopeValues = ["any", "recurring", "oneOff"];
23170
- var asEventCategoryId = (value) => value;
23171
- var asVenueId = (value) => value;
23761
+ var unsafeAsEventCategoryId = (value) => value;
23762
+ var unsafeAsVenueId = (value) => value;
23172
23763
  function normalizeEventBlockKind(value) {
23173
23764
  return value === "courses" || value === "events" ? value : "all";
23174
23765
  }
@@ -23194,10 +23785,10 @@ function normalizeEventCategoryIds(value) {
23194
23785
  if (Array.isArray(value)) {
23195
23786
  return normalizeIdList(
23196
23787
  value.filter((entry) => typeof entry === "string")
23197
- ).map(asEventCategoryId);
23788
+ ).map(unsafeAsEventCategoryId);
23198
23789
  }
23199
23790
  if (typeof value === "string") {
23200
- return normalizeIdList(value.split(",")).map(asEventCategoryId);
23791
+ return normalizeIdList(value.split(",")).map(unsafeAsEventCategoryId);
23201
23792
  }
23202
23793
  return [];
23203
23794
  }
@@ -23210,7 +23801,7 @@ function normalizeEventVenueId(value) {
23210
23801
  return null;
23211
23802
  }
23212
23803
  const trimmed = value.trim();
23213
- return trimmed ? asVenueId(trimmed) : null;
23804
+ return trimmed ? unsafeAsVenueId(trimmed) : null;
23214
23805
  }
23215
23806
  function normalizeEventStaffMemberId(value) {
23216
23807
  if (typeof value !== "string") {
@@ -24409,7 +25000,7 @@ var COLUMN_CLASSES = {
24409
25000
  };
24410
25001
  function getContainerClass(layout, columns) {
24411
25002
  if (layout === "compact") {
24412
- return "event-listing-compact-container rb-flex rb-flex-col rb-gap-2";
25003
+ return "event-listing-compact-container rb-flex rb-flex-col";
24413
25004
  }
24414
25005
  if (layout === "stack") {
24415
25006
  return "rb-flex rb-flex-col rb-gap-6";
@@ -27237,6 +27828,7 @@ import { z as z53 } from "zod";
27237
27828
  var storedProductCartItemSchema = z53.object({
27238
27829
  kind: z53.literal("product"),
27239
27830
  productId: z53.string().min(1),
27831
+ productCategoryId: z53.string().min(1).optional().nullable(),
27240
27832
  variantId: z53.string().min(1).optional().nullable(),
27241
27833
  title: z53.string().min(1),
27242
27834
  variantTitle: z53.string().optional().nullable(),
@@ -29741,6 +30333,10 @@ var scheduleTileTreatments = [
29741
30333
  "quiet",
29742
30334
  "brand-depth"
29743
30335
  ];
30336
+ var eventListTreatments = [
30337
+ "plain",
30338
+ "lined-panel"
30339
+ ];
29744
30340
  function scheduleDetailsCapable() {
29745
30341
  return declareBlockDesignCapability({
29746
30342
  sectionSurfaces: "supported",
@@ -29749,6 +30345,14 @@ function scheduleDetailsCapable() {
29749
30345
  tileTreatments: scheduleTileTreatments
29750
30346
  });
29751
30347
  }
30348
+ function eventListCapable() {
30349
+ return declareBlockDesignCapability({
30350
+ sectionSurfaces: "supported",
30351
+ contentFrames: ["plain"],
30352
+ itemSurfaces: "unsupported",
30353
+ eventListTreatments
30354
+ });
30355
+ }
29752
30356
  function defaultBoundaryBias(visualWeight) {
29753
30357
  return visualWeight === "featured" || visualWeight === "immersive" ? "clear" : "soft";
29754
30358
  }
@@ -29968,7 +30572,8 @@ var systemBlockDefinitionsRaw = [
29968
30572
  flow: bodyFlow,
29969
30573
  layoutProfiles: [
29970
30574
  layoutProfile({ variantKey: "default", family: "stack", weight: "standard" }),
29971
- layoutProfile({ variantKey: "two-column", family: "split", weight: "standard" })
30575
+ layoutProfile({ variantKey: "two-column", family: "split", weight: "standard" }),
30576
+ layoutProfile({ variantKey: "question-columns", family: "grid", weight: "standard" })
29972
30577
  ]
29973
30578
  })),
29974
30579
  withDesignCapability("block.site-header", siteHeaderBlockDefinition, declareNoBlockDesignCapability("site-chrome"), defineBlockDesignMetadata({
@@ -30062,11 +30667,11 @@ var systemBlockDefinitionsRaw = [
30062
30667
  flow: offeringsFlow,
30063
30668
  layoutProfiles: [layoutProfile({ variantKey: "default", family: "centered", weight: "featured" })]
30064
30669
  })),
30065
- withDesignCapability("block.event-listing", eventListingBlockDefinition, sectionOnly(), defineBlockDesignMetadata({
30670
+ withDesignCapability("block.event-listing", eventListingBlockDefinition, eventListCapable(), defineBlockDesignMetadata({
30066
30671
  flow: offeringsFlow,
30067
30672
  layoutProfiles: [layoutProfile({ variantKey: "default", family: "stack", weight: "standard" })]
30068
30673
  })),
30069
- withDesignCapability("block.event-calendar", eventCalendarBlockDefinition, sectionOnly(), defineBlockDesignMetadata({
30674
+ withDesignCapability("block.event-calendar", eventCalendarBlockDefinition, eventListCapable(), defineBlockDesignMetadata({
30070
30675
  flow: offeringsFlow,
30071
30676
  layoutProfiles: [
30072
30677
  layoutProfile({ variantKey: "combined", family: "grid", weight: "standard" }),
@@ -31138,6 +31743,15 @@ ${root} {
31138
31743
  `;
31139
31744
  }
31140
31745
 
31746
+ // ../theme-core/src/runtime/themeCssVarNames.ts
31747
+ var THEME_RADIUS_CSS_VARS = {
31748
+ block: "--rb-block-radius",
31749
+ button: "--rb-button-radius",
31750
+ input: "--rb-input-radius",
31751
+ legacyCard: "--radius-card",
31752
+ legacyControl: "--radius-control"
31753
+ };
31754
+
31141
31755
  // ../theme-core/src/blocks/vars/customer-portal.ts
31142
31756
  function generateCustomerPortalVars({
31143
31757
  themeId
@@ -31151,6 +31765,11 @@ ${root} {
31151
31765
  --cp-muted: rgb(var(--tb-mutedText));
31152
31766
  --cp-border: rgb(var(--tb-border));
31153
31767
  --cp-shadow: var(--shadow-elev);
31768
+ --cp-primary: rgb(var(--tb-primary));
31769
+ --cp-primary-hover: rgb(var(--tb-primary-700, var(--tb-primary)));
31770
+ --cp-error: rgb(var(--tb-destructive));
31771
+ --cp-card-radius: var(${THEME_RADIUS_CSS_VARS.block}, var(${THEME_RADIUS_CSS_VARS.legacyCard}, 0.75rem));
31772
+ --cp-control-radius: var(${THEME_RADIUS_CSS_VARS.input}, var(${THEME_RADIUS_CSS_VARS.legacyControl}, 0.5rem));
31154
31773
 
31155
31774
  /* Shared tab bar (underline style) */
31156
31775
  --rb-tab-border-width: 1px;
@@ -31201,7 +31820,7 @@ ${root} {
31201
31820
  --rb-modal-bg: var(--cp-card-bg);
31202
31821
  --rb-modal-border: var(--cp-card-border);
31203
31822
  --rb-modal-shadow: var(--shadow-lg, var(--shadow-elev));
31204
- --rb-modal-radius: var(--radius-card);
31823
+ --rb-modal-radius: var(--cp-card-radius);
31205
31824
  --rb-modal-max-width: 560px;
31206
31825
 
31207
31826
  /* Header */
@@ -32582,6 +33201,9 @@ import { jsx as jsx5 } from "react/jsx-runtime";
32582
33201
  import * as React from "react";
32583
33202
  import { Fragment, jsx as jsx6, jsxs as jsxs4 } from "react/jsx-runtime";
32584
33203
 
33204
+ // ../theme-core/src/fonts/uploadFormat.ts
33205
+ var MAX_FONT_UPLOAD_BYTES = 5 * 1024 * 1024;
33206
+
32585
33207
  // ../theme-core/src/runtime/buildThemeRuntimeFromBridge.ts
32586
33208
  import { z as z60 } from "zod";
32587
33209
  var themeBridgeConfigSchema = z60.object({
@@ -32664,10 +33286,16 @@ var dashboardConfigSchema = z61.object({
32664
33286
  var fieldDefinitionInputSchema = unsafeRetypeZodSchema(fieldSchema);
32665
33287
  var nodeDefinitionSchema = unsafeRetypeZodSchema(NodeSchema);
32666
33288
  var sdkLoaderEndpointSchema = z61.enum(SUPPORTED_LOADER_ENDPOINTS);
33289
+ var loaderFallbackScalarSchema = z61.union([
33290
+ z61.string(),
33291
+ z61.number(),
33292
+ z61.boolean(),
33293
+ z61.null()
33294
+ ]);
32667
33295
  var loaderParamBindingSchema = z61.object({
32668
33296
  $bind: z61.object({
32669
33297
  from: z61.string().min(1, "Binding path is required"),
32670
- fallback: z61.string().optional()
33298
+ fallback: loaderFallbackScalarSchema.optional()
32671
33299
  })
32672
33300
  });
32673
33301
  var loaderParamValueSchema = z61.union([
@@ -32813,9 +33441,13 @@ var sdkBlockFieldOptionsMapSchema = z61.record(
32813
33441
  var sdkContentTypeTemplateConfigSchema = z61.object({
32814
33442
  blocks: z61.array(z61.unknown())
32815
33443
  }).passthrough();
33444
+ var sdkContentTypeOrderingConfigSchema = z61.object({
33445
+ mode: z61.enum(["default", "manual"]).optional()
33446
+ }).optional();
32816
33447
  var sdkContentTypeConfigSchema = z61.object({
32817
33448
  key: z61.string().min(1),
32818
33449
  fields: z61.array(z61.unknown()),
33450
+ ordering: sdkContentTypeOrderingConfigSchema,
32819
33451
  template: sdkContentTypeTemplateConfigSchema.nullable().optional()
32820
33452
  }).passthrough();
32821
33453
  var sdkContentConfigSchema = z61.object({
@@ -33028,6 +33660,7 @@ var COURSE_ENROLLMENT_REFUND_FAILED_CODES = [
33028
33660
  ];
33029
33661
 
33030
33662
  // ../api/src/bookingVerticals.ts
33663
+ import { z as z63 } from "zod";
33031
33664
  var VERTICAL_IDS = [
33032
33665
  "yoga_wellness",
33033
33666
  "fitness_pt",
@@ -33106,6 +33739,132 @@ var VERTICAL_ID_SET = new Set(VERTICAL_IDS);
33106
33739
  var VERTICAL_PRESET_ID_SET = new Set(
33107
33740
  VERTICAL_BOOKING_PRESETS.map((presetDefinition) => presetDefinition.id)
33108
33741
  );
33742
+ function parseVerticalId(value) {
33743
+ return typeof value === "string" && VERTICAL_ID_SET.has(value) ? value : null;
33744
+ }
33745
+ function parseVerticalPresetId(value) {
33746
+ return typeof value === "string" && VERTICAL_PRESET_ID_SET.has(value) ? value : null;
33747
+ }
33748
+ function getVerticalPresetDefinition(presetId) {
33749
+ const definition = VERTICAL_BOOKING_PRESETS.find((presetDefinition) => presetDefinition.id === presetId);
33750
+ if (!definition) {
33751
+ throw new Error(`Unhandled vertical preset id: ${presetId}`);
33752
+ }
33753
+ return definition;
33754
+ }
33755
+ function toNonEmptyVerticalPresetIds(presetIds) {
33756
+ const firstPresetId = presetIds[0];
33757
+ return firstPresetId ? [firstPresetId, ...presetIds.slice(1)] : null;
33758
+ }
33759
+ function createConfiguredSiteVerticalBookingConfig(verticalId, selectedPresetIds) {
33760
+ return {
33761
+ verticalId,
33762
+ selectedPresetIds
33763
+ };
33764
+ }
33765
+ function createSiteVerticalBookingConfig(verticalId, selectedPresetIds) {
33766
+ const nonEmptyPresetIds = toNonEmptyVerticalPresetIds(selectedPresetIds);
33767
+ return nonEmptyPresetIds ? createConfiguredSiteVerticalBookingConfig(verticalId, nonEmptyPresetIds) : null;
33768
+ }
33769
+ function resolveSiteVerticalBookingConfig(rawConfig) {
33770
+ if (!rawConfig) {
33771
+ return { kind: "unconfigured", config: DEFAULT_SITE_VERTICAL_BOOKING_CONFIG };
33772
+ }
33773
+ const verticalId = parseVerticalId(rawConfig.verticalId);
33774
+ const rawPresetIds = Array.isArray(rawConfig.selectedPresetIds) ? rawConfig.selectedPresetIds : [];
33775
+ const selectedPresetIds = rawPresetIds.map(parseVerticalPresetId).filter((presetId) => Boolean(presetId));
33776
+ const config = {
33777
+ verticalId,
33778
+ selectedPresetIds
33779
+ };
33780
+ if (!verticalId && selectedPresetIds.length === 0) {
33781
+ return { kind: "unconfigured", config: DEFAULT_SITE_VERTICAL_BOOKING_CONFIG };
33782
+ }
33783
+ const issues = getSiteVerticalConfigIssues(rawConfig, config);
33784
+ if (issues.length > 0) {
33785
+ return { kind: "invalid", config, issues };
33786
+ }
33787
+ const configuredConfig = verticalId ? createSiteVerticalBookingConfig(verticalId, selectedPresetIds) : null;
33788
+ if (!configuredConfig) {
33789
+ return { kind: "invalid", config, issues: ["empty_selected_presets"] };
33790
+ }
33791
+ return {
33792
+ kind: "configured",
33793
+ config: configuredConfig,
33794
+ selectedPresets: configuredConfig.selectedPresetIds.map(getVerticalPresetDefinition)
33795
+ };
33796
+ }
33797
+ function getSiteVerticalConfigIssues(rawConfig, config) {
33798
+ const issues = /* @__PURE__ */ new Set();
33799
+ if (rawConfig.verticalId != null && !config.verticalId) {
33800
+ issues.add("unknown_vertical");
33801
+ }
33802
+ if (!config.verticalId && config.selectedPresetIds.length > 0) {
33803
+ issues.add("missing_vertical");
33804
+ }
33805
+ const rawPresetIds = Array.isArray(rawConfig.selectedPresetIds) ? rawConfig.selectedPresetIds : [];
33806
+ if (rawPresetIds.some((presetId) => parseVerticalPresetId(presetId) === null)) {
33807
+ issues.add("unknown_preset");
33808
+ }
33809
+ if (config.verticalId && config.selectedPresetIds.length === 0) {
33810
+ issues.add("empty_selected_presets");
33811
+ }
33812
+ const seenBehaviours = /* @__PURE__ */ new Set();
33813
+ for (const presetId of config.selectedPresetIds) {
33814
+ const presetDefinition = getVerticalPresetDefinition(presetId);
33815
+ if (config.verticalId && presetDefinition.verticalId !== config.verticalId) {
33816
+ issues.add("preset_vertical_mismatch");
33817
+ }
33818
+ if (presetDefinition.availability === "future") {
33819
+ issues.add("future_preset_selected");
33820
+ }
33821
+ if (seenBehaviours.has(presetDefinition.canonicalBehaviour)) {
33822
+ issues.add("duplicate_canonical_behaviour");
33823
+ }
33824
+ seenBehaviours.add(presetDefinition.canonicalBehaviour);
33825
+ }
33826
+ return [...issues];
33827
+ }
33828
+ var VerticalIdSchema = z63.string().trim().transform((value, ctx) => {
33829
+ const parsed = parseVerticalId(value);
33830
+ if (!parsed) {
33831
+ ctx.addIssue({
33832
+ code: z63.ZodIssueCode.custom,
33833
+ message: "Unknown booking vertical"
33834
+ });
33835
+ return z63.NEVER;
33836
+ }
33837
+ return parsed;
33838
+ });
33839
+ var VerticalPresetIdSchema = z63.string().trim().transform((value, ctx) => {
33840
+ const parsed = parseVerticalPresetId(value);
33841
+ if (!parsed) {
33842
+ ctx.addIssue({
33843
+ code: z63.ZodIssueCode.custom,
33844
+ message: "Unknown booking preset"
33845
+ });
33846
+ return z63.NEVER;
33847
+ }
33848
+ return parsed;
33849
+ });
33850
+ var BookingVerticalConfigSchema = z63.object({
33851
+ verticalId: VerticalIdSchema.nullable(),
33852
+ selectedPresetIds: z63.array(VerticalPresetIdSchema).max(20)
33853
+ }).transform((value, ctx) => {
33854
+ const resolved = resolveSiteVerticalBookingConfig(value);
33855
+ if (resolved.kind === "invalid") {
33856
+ ctx.addIssue({
33857
+ code: z63.ZodIssueCode.custom,
33858
+ message: `Invalid booking vertical config: ${resolved.issues.join(", ")}`
33859
+ });
33860
+ return z63.NEVER;
33861
+ }
33862
+ return resolved.config;
33863
+ });
33864
+ var DEFAULT_SITE_VERTICAL_BOOKING_CONFIG = {
33865
+ verticalId: null,
33866
+ selectedPresetIds: []
33867
+ };
33109
33868
  function preset(id, verticalId, canonicalBehaviour, label, pluralLabel, description, availability = "onboarding") {
33110
33869
  return {
33111
33870
  id,
@@ -33125,51 +33884,51 @@ function isRecord3(value) {
33125
33884
  }
33126
33885
 
33127
33886
  // ../api/src/appointmentSetup.ts
33128
- import { z as z63 } from "zod";
33887
+ import { z as z64 } from "zod";
33129
33888
  var APPOINTMENT_SETUP_MAX_MINUTES = 1440;
33130
- var appointmentSetupRefSchema = z63.discriminatedUnion("kind", [
33131
- z63.object({ kind: z63.literal("existing"), id: z63.string().min(1) }),
33132
- z63.object({ kind: z63.literal("new"), draftId: z63.string().min(1) })
33889
+ var appointmentSetupRefSchema = z64.discriminatedUnion("kind", [
33890
+ z64.object({ kind: z64.literal("existing"), id: z64.string().min(1) }),
33891
+ z64.object({ kind: z64.literal("new"), draftId: z64.string().min(1) })
33133
33892
  ]);
33134
- var appointmentSetupVenueChoiceSchema = z63.discriminatedUnion("kind", [
33135
- z63.object({ kind: z63.literal("none") }),
33136
- z63.object({ kind: z63.literal("existing"), venueId: z63.string().min(1) }),
33137
- z63.object({
33138
- kind: z63.literal("create"),
33139
- draftId: z63.string().min(1),
33140
- title: z63.string().trim().min(1),
33141
- description: z63.string().nullable(),
33142
- timezone: z63.string().trim().min(1).nullable(),
33143
- addressJson: z63.record(z63.string(), z63.unknown()),
33144
- locationJson: z63.object({ lat: z63.number(), lng: z63.number() }).nullable()
33893
+ var appointmentSetupVenueChoiceSchema = z64.discriminatedUnion("kind", [
33894
+ z64.object({ kind: z64.literal("none") }),
33895
+ z64.object({ kind: z64.literal("existing"), venueId: z64.string().min(1) }),
33896
+ z64.object({
33897
+ kind: z64.literal("create"),
33898
+ draftId: z64.string().min(1),
33899
+ title: z64.string().trim().min(1),
33900
+ description: z64.string().nullable(),
33901
+ timezone: z64.string().trim().min(1).nullable(),
33902
+ addressJson: z64.record(z64.string(), z64.unknown()),
33903
+ locationJson: z64.object({ lat: z64.number(), lng: z64.number() }).nullable()
33145
33904
  })
33146
33905
  ]);
33147
- var appointmentSetupPaymentDraftSchema = z63.object({
33148
- priceType: z63.union([z63.literal("free"), z63.literal("paid")])
33149
- });
33150
- var appointmentSetupServiceAssignmentDraftSchema = z63.discriminatedUnion("kind", [
33151
- z63.object({ kind: z63.literal("all_practitioners") }),
33152
- z63.object({
33153
- kind: z63.literal("selected_practitioners"),
33154
- resourceRefs: z63.array(appointmentSetupRefSchema)
33906
+ var appointmentSetupPaymentDraftSchema = z64.object({
33907
+ priceType: z64.union([z64.literal("free"), z64.literal("paid")])
33908
+ });
33909
+ var appointmentSetupServiceAssignmentDraftSchema = z64.discriminatedUnion("kind", [
33910
+ z64.object({ kind: z64.literal("all_practitioners") }),
33911
+ z64.object({
33912
+ kind: z64.literal("selected_practitioners"),
33913
+ resourceRefs: z64.array(appointmentSetupRefSchema)
33155
33914
  })
33156
33915
  ]);
33157
- var appointmentSetupServiceDraftSchema = z63.object({
33916
+ var appointmentSetupServiceDraftSchema = z64.object({
33158
33917
  ref: appointmentSetupRefSchema,
33159
- title: z63.string().trim().min(1),
33160
- description: z63.string().nullable(),
33161
- durationMinutes: z63.number().int().positive().max(APPOINTMENT_SETUP_MAX_MINUTES),
33162
- prepMinutes: z63.number().int().nonnegative().max(APPOINTMENT_SETUP_MAX_MINUTES).default(0),
33163
- cleanupMinutes: z63.number().int().nonnegative().max(APPOINTMENT_SETUP_MAX_MINUTES).default(0),
33164
- priceAmount: z63.number().int().nonnegative().nullable(),
33165
- isActive: z63.boolean(),
33166
- locationType: z63.union([
33167
- z63.literal("virtual"),
33168
- z63.literal("in_person"),
33169
- z63.literal("hybrid")
33918
+ title: z64.string().trim().min(1),
33919
+ description: z64.string().nullable(),
33920
+ durationMinutes: z64.number().int().positive().max(APPOINTMENT_SETUP_MAX_MINUTES),
33921
+ prepMinutes: z64.number().int().nonnegative().max(APPOINTMENT_SETUP_MAX_MINUTES).default(0),
33922
+ cleanupMinutes: z64.number().int().nonnegative().max(APPOINTMENT_SETUP_MAX_MINUTES).default(0),
33923
+ priceAmount: z64.number().int().nonnegative().nullable(),
33924
+ isActive: z64.boolean(),
33925
+ locationType: z64.union([
33926
+ z64.literal("virtual"),
33927
+ z64.literal("in_person"),
33928
+ z64.literal("hybrid")
33170
33929
  ]),
33171
33930
  venue: appointmentSetupVenueChoiceSchema,
33172
- timezone: z63.string().trim().min(1).nullable(),
33931
+ timezone: z64.string().trim().min(1).nullable(),
33173
33932
  payment: appointmentSetupPaymentDraftSchema,
33174
33933
  assignment: appointmentSetupServiceAssignmentDraftSchema
33175
33934
  }).superRefine((service, ctx) => {
@@ -33188,49 +33947,49 @@ var appointmentSetupServiceDraftSchema = z63.object({
33188
33947
  });
33189
33948
  }
33190
33949
  });
33191
- var appointmentSetupPractitionerDraftSchema = z63.object({
33950
+ var appointmentSetupPractitionerDraftSchema = z64.object({
33192
33951
  ref: appointmentSetupRefSchema,
33193
- displayName: z63.string().trim().min(1),
33194
- bio: z63.string().nullable(),
33195
- timezone: z63.string().trim().min(1),
33196
- colorHex: z63.string().nullable()
33197
- });
33198
- var appointmentSetupWeeklyWindowDraftSchema = z63.object({
33199
- weekday: z63.number().int().min(0).max(6),
33200
- startTime: z63.string(),
33201
- endTime: z63.string()
33202
- });
33203
- var appointmentSetupStartTimePolicyDraftSchema = z63.discriminatedUnion("kind", [
33204
- z63.object({ kind: z63.literal("automatic_spacing") }),
33205
- z63.object({
33206
- kind: z63.literal("regular_interval"),
33207
- intervalMinutes: z63.union([
33208
- z63.literal(10),
33209
- z63.literal(15),
33210
- z63.literal(20),
33211
- z63.literal(30),
33212
- z63.literal(45),
33213
- z63.literal(60)
33952
+ displayName: z64.string().trim().min(1),
33953
+ bio: z64.string().nullable(),
33954
+ timezone: z64.string().trim().min(1),
33955
+ colorHex: z64.string().nullable()
33956
+ });
33957
+ var appointmentSetupWeeklyWindowDraftSchema = z64.object({
33958
+ weekday: z64.number().int().min(0).max(6),
33959
+ startTime: z64.string(),
33960
+ endTime: z64.string()
33961
+ });
33962
+ var appointmentSetupStartTimePolicyDraftSchema = z64.discriminatedUnion("kind", [
33963
+ z64.object({ kind: z64.literal("automatic_spacing") }),
33964
+ z64.object({
33965
+ kind: z64.literal("regular_interval"),
33966
+ intervalMinutes: z64.union([
33967
+ z64.literal(10),
33968
+ z64.literal(15),
33969
+ z64.literal(20),
33970
+ z64.literal(30),
33971
+ z64.literal(45),
33972
+ z64.literal(60)
33214
33973
  ])
33215
33974
  })
33216
33975
  ]);
33217
- var appointmentSetupAvailabilityDraftSchema = z63.object({
33218
- kind: z63.literal("weekly_windows"),
33976
+ var appointmentSetupAvailabilityDraftSchema = z64.object({
33977
+ kind: z64.literal("weekly_windows"),
33219
33978
  resourceRef: appointmentSetupRefSchema,
33220
33979
  serviceRef: appointmentSetupRefSchema.nullable(),
33221
- windows: z63.array(appointmentSetupWeeklyWindowDraftSchema),
33980
+ windows: z64.array(appointmentSetupWeeklyWindowDraftSchema),
33222
33981
  startTimePolicy: appointmentSetupStartTimePolicyDraftSchema.optional()
33223
33982
  });
33224
33983
  var APPOINTMENT_DEFAULT_MIN_LEAD_MINUTES_MAX = 28 * 24 * 60;
33225
33984
  var APPOINTMENT_DEFAULT_MAX_BOOKING_NOTICE_MINUTES_MAX = 10 * 365 * 24 * 60;
33226
- var appointmentSetupBookingNoticeSchema = z63.object({
33227
- minLeadMinutes: z63.number().int().nonnegative().max(APPOINTMENT_DEFAULT_MIN_LEAD_MINUTES_MAX),
33228
- maxBookingNoticeMinutes: z63.number().int().nonnegative().max(APPOINTMENT_DEFAULT_MAX_BOOKING_NOTICE_MINUTES_MAX)
33229
- });
33230
- var applyAppointmentSetupRequestSchema = z63.object({
33231
- services: z63.array(appointmentSetupServiceDraftSchema),
33232
- practitioners: z63.array(appointmentSetupPractitionerDraftSchema),
33233
- availability: z63.array(appointmentSetupAvailabilityDraftSchema),
33985
+ var appointmentSetupBookingNoticeSchema = z64.object({
33986
+ minLeadMinutes: z64.number().int().nonnegative().max(APPOINTMENT_DEFAULT_MIN_LEAD_MINUTES_MAX),
33987
+ maxBookingNoticeMinutes: z64.number().int().nonnegative().max(APPOINTMENT_DEFAULT_MAX_BOOKING_NOTICE_MINUTES_MAX)
33988
+ });
33989
+ var applyAppointmentSetupRequestSchema = z64.object({
33990
+ services: z64.array(appointmentSetupServiceDraftSchema),
33991
+ practitioners: z64.array(appointmentSetupPractitionerDraftSchema),
33992
+ availability: z64.array(appointmentSetupAvailabilityDraftSchema),
33234
33993
  bookingNotice: appointmentSetupBookingNoticeSchema
33235
33994
  });
33236
33995
 
@@ -33263,24 +34022,24 @@ var STAFF_CANCELLATION_CONTEXT_CATEGORIES = [
33263
34022
  ];
33264
34023
 
33265
34024
  // ../api/src/siteBanner.ts
33266
- import { z as z64 } from "zod";
34025
+ import { z as z65 } from "zod";
33267
34026
  var SITE_BANNER_SCOPE_VALUES = ["homepage", "all-pages"];
33268
34027
  var SITE_BANNER_TONE_VALUES = ["announcement", "promotion", "notice", "warning"];
33269
34028
  var SITE_BANNER_MAX_TEXT_LENGTH = 320;
33270
34029
  var SITE_BANNER_MAX_PARAGRAPHS = 2;
33271
- var siteBannerScopeSchema = z64.enum(SITE_BANNER_SCOPE_VALUES);
33272
- var siteBannerToneSchema = z64.enum(SITE_BANNER_TONE_VALUES);
33273
- var siteBannerBodySchema = z64.unknown().transform(unwrapRichTextValue);
33274
- var siteBannerCtaSchema = z64.object({
33275
- label: z64.string().trim().min(1),
34030
+ var siteBannerScopeSchema = z65.enum(SITE_BANNER_SCOPE_VALUES);
34031
+ var siteBannerToneSchema = z65.enum(SITE_BANNER_TONE_VALUES);
34032
+ var siteBannerBodySchema = z65.unknown().transform(unwrapRichTextValue);
34033
+ var siteBannerCtaSchema = z65.object({
34034
+ label: z65.string().trim().min(1),
33276
34035
  link: linkPayloadSchema
33277
34036
  });
33278
- var siteBannerSettingsSchema = z64.discriminatedUnion("enabled", [
33279
- z64.object({
33280
- enabled: z64.literal(false)
34037
+ var siteBannerSettingsSchema = z65.discriminatedUnion("enabled", [
34038
+ z65.object({
34039
+ enabled: z65.literal(false)
33281
34040
  }),
33282
- z64.object({
33283
- enabled: z64.literal(true),
34041
+ z65.object({
34042
+ enabled: z65.literal(true),
33284
34043
  scope: siteBannerScopeSchema,
33285
34044
  tone: siteBannerToneSchema,
33286
34045
  body: siteBannerBodySchema,
@@ -33294,7 +34053,7 @@ var siteBannerSettingsInputSchema = siteBannerSettingsSchema.superRefine((value,
33294
34053
  const analysis = analyzeSiteBannerBody(value.body);
33295
34054
  for (const issue of analysis.issues) {
33296
34055
  ctx.addIssue({
33297
- code: z64.ZodIssueCode.custom,
34056
+ code: z65.ZodIssueCode.custom,
33298
34057
  path: ["body"],
33299
34058
  message: siteBannerBodyIssueMessage(issue)
33300
34059
  });
@@ -33562,76 +34321,109 @@ function isNavigationMenuValidationItem(value) {
33562
34321
  return typeof value.label === "string";
33563
34322
  }
33564
34323
 
34324
+ // ../api/src/navigation/dashboardSiteNav.ts
34325
+ var hiddenDemoSiteNavSurfaceIds = [
34326
+ "site.newsletter"
34327
+ ];
34328
+ var hiddenDemoSiteNavIds = new Set(
34329
+ hiddenDemoSiteNavSurfaceIds
34330
+ );
34331
+ var websiteSurfaceIds = [
34332
+ "site.content",
34333
+ "site.footerBlocks",
34334
+ "site.navigation",
34335
+ "site.media",
34336
+ "site.style",
34337
+ "site.performance"
34338
+ ];
34339
+ var websiteSurfaceIdSet = new Set(
34340
+ websiteSurfaceIds
34341
+ );
34342
+
34343
+ // ../api/src/navigation/dashboardSettingsNav.ts
34344
+ var hiddenDemoSettingsNavSurfaceIds = [
34345
+ "settings.features",
34346
+ "settings.domains",
34347
+ "settings.bookings",
34348
+ "settings.emails",
34349
+ "settings.team",
34350
+ "settings.billing",
34351
+ "settings.developer",
34352
+ "settings.apiKeys",
34353
+ "settings.backup"
34354
+ ];
34355
+ var hiddenDemoSettingsNavIds = new Set(hiddenDemoSettingsNavSurfaceIds);
34356
+
33565
34357
  // ../api/src/aiPlayground.ts
33566
- import { z as z65 } from "zod";
33567
- var Rfc6902PatchOp = z65.discriminatedUnion("op", [
34358
+ import { z as z66 } from "zod";
34359
+ var Rfc6902PatchOp = z66.discriminatedUnion("op", [
33568
34360
  // Standard RFC-6902 operations
33569
- z65.object({
33570
- op: z65.literal("add"),
33571
- path: z65.string(),
33572
- value: z65.unknown()
34361
+ z66.object({
34362
+ op: z66.literal("add"),
34363
+ path: z66.string(),
34364
+ value: z66.unknown()
33573
34365
  }),
33574
- z65.object({
33575
- op: z65.literal("remove"),
33576
- path: z65.string()
34366
+ z66.object({
34367
+ op: z66.literal("remove"),
34368
+ path: z66.string()
33577
34369
  }),
33578
- z65.object({
33579
- op: z65.literal("replace"),
33580
- path: z65.string(),
33581
- value: z65.unknown()
34370
+ z66.object({
34371
+ op: z66.literal("replace"),
34372
+ path: z66.string(),
34373
+ value: z66.unknown()
33582
34374
  }),
33583
- z65.object({
33584
- op: z65.literal("move"),
33585
- from: z65.string(),
33586
- path: z65.string()
34375
+ z66.object({
34376
+ op: z66.literal("move"),
34377
+ from: z66.string(),
34378
+ path: z66.string()
33587
34379
  }),
33588
- z65.object({
33589
- op: z65.literal("copy"),
33590
- from: z65.string(),
33591
- path: z65.string()
34380
+ z66.object({
34381
+ op: z66.literal("copy"),
34382
+ from: z66.string(),
34383
+ path: z66.string()
33592
34384
  }),
33593
34385
  // Block-level operations (Phase 2)
33594
- z65.object({
33595
- op: z65.literal("add_block"),
33596
- blockKind: z65.string(),
33597
- afterBlockId: z65.string().nullable(),
33598
- content: z65.record(z65.string(), z65.unknown()),
33599
- rationale: z65.string()
34386
+ z66.object({
34387
+ op: z66.literal("add_block"),
34388
+ blockKind: z66.string(),
34389
+ afterBlockId: z66.string().nullable(),
34390
+ content: z66.record(z66.string(), z66.unknown()),
34391
+ rationale: z66.string()
33600
34392
  }),
33601
- z65.object({
33602
- op: z65.literal("delete_block"),
33603
- blockId: z65.string(),
33604
- rationale: z65.string()
34393
+ z66.object({
34394
+ op: z66.literal("delete_block"),
34395
+ blockId: z66.string(),
34396
+ rationale: z66.string()
33605
34397
  }),
33606
- z65.object({
33607
- op: z65.literal("reorder_block"),
33608
- blockId: z65.string(),
33609
- afterBlockId: z65.string().nullable(),
33610
- rationale: z65.string()
34398
+ z66.object({
34399
+ op: z66.literal("reorder_block"),
34400
+ blockId: z66.string(),
34401
+ afterBlockId: z66.string().nullable(),
34402
+ rationale: z66.string()
33611
34403
  })
33612
34404
  ]);
33613
- var PlaygroundProposeRequest = z65.object({
33614
- request: z65.string().min(1).max(2e3)
34405
+ var PlaygroundProposeRequest = z66.object({
34406
+ request: z66.string().min(1).max(2e3)
33615
34407
  });
33616
- var MultiPagePatchEnvelope = z65.object({
33617
- pageId: z65.string(),
33618
- blockId: z65.string().optional(),
34408
+ var MultiPagePatchEnvelope = z66.object({
34409
+ pageId: z66.string(),
34410
+ blockId: z66.string().optional(),
33619
34411
  // Not present for page-level ops
33620
- blockKind: z65.string().optional(),
33621
- blockPurpose: z65.string().optional().nullable(),
33622
- ops: z65.array(Rfc6902PatchOp),
33623
- rationale: z65.string(),
33624
- currentContent: z65.record(z65.string(), z65.unknown()).optional()
34412
+ blockKind: z66.string().optional(),
34413
+ blockPurpose: z66.string().optional().nullable(),
34414
+ ops: z66.array(Rfc6902PatchOp),
34415
+ rationale: z66.string(),
34416
+ currentContent: z66.record(z66.string(), z66.unknown()).optional()
33625
34417
  });
33626
- var MultiPageUpdateResponse = z65.object({
33627
- patches: z65.array(MultiPagePatchEnvelope),
33628
- assistantMessage: z65.string(),
33629
- pagesModified: z65.number(),
33630
- toolCallsUsed: z65.number()
34418
+ var MultiPageUpdateResponse = z66.object({
34419
+ patches: z66.array(MultiPagePatchEnvelope),
34420
+ assistantMessage: z66.string(),
34421
+ pagesModified: z66.number(),
34422
+ toolCallsUsed: z66.number()
33631
34423
  });
33632
34424
 
33633
34425
  // src/config/content-validation.ts
33634
- import { z as z66 } from "zod";
34426
+ import { z as z67 } from "zod";
33635
34427
 
33636
34428
  // src/types/block-kinds.ts
33637
34429
  var SYSTEM_BLOCK_KINDS = [
@@ -33773,32 +34565,36 @@ function describeInvalidBindingTransform(transform) {
33773
34565
  }
33774
34566
 
33775
34567
  // src/config/content-validation.ts
33776
- var jsonDataSchema = z66.record(z66.string(), z66.any());
33777
- var contentTypeKeySchema = z66.string().min(1).regex(
34568
+ var jsonDataSchema = z67.record(z67.string(), z67.any());
34569
+ var contentTypeKeySchema = z67.string().min(1).regex(
33778
34570
  /^[a-z][a-z0-9-]*$/,
33779
34571
  "Key must be lowercase, start with a letter, and contain only letters, numbers, and hyphens"
33780
34572
  );
33781
- var templateConfigSchemaForward = z66.object({
33782
- blocks: z66.array(
33783
- z66.object({
33784
- identifier: z66.string().min(1),
33785
- kind: z66.string(),
33786
- scope: z66.enum(["entry", "template"]),
33787
- bindings: z66.record(z66.string(), z66.any()).optional(),
33788
- content: z66.record(z66.string(), z66.any()).optional()
34573
+ var templateConfigSchemaForward = z67.object({
34574
+ blocks: z67.array(
34575
+ z67.object({
34576
+ identifier: z67.string().min(1),
34577
+ kind: z67.string(),
34578
+ scope: z67.enum(["entry", "template"]),
34579
+ bindings: z67.record(z67.string(), z67.any()).optional(),
34580
+ content: z67.record(z67.string(), z67.any()).optional()
33789
34581
  })
33790
34582
  )
33791
34583
  }).optional();
33792
- var contentTypeConfigSchema = z66.object({
34584
+ var contentTypeOrderingSchema = z67.object({
34585
+ mode: z67.enum(["default", "manual"]).optional()
34586
+ }).optional();
34587
+ var contentTypeConfigSchema = z67.object({
33793
34588
  key: contentTypeKeySchema,
33794
- name: z66.string().min(1),
33795
- description: z66.string().optional(),
33796
- hasPages: z66.boolean(),
33797
- routePattern: z66.string().optional(),
34589
+ name: z67.string().min(1),
34590
+ description: z67.string().optional(),
34591
+ hasPages: z67.boolean(),
34592
+ routePattern: z67.string().optional(),
33798
34593
  // Fields are validated as unknown[] here - deep field validation happens in @riverbankcms/blocks
33799
- fields: z66.array(z66.any()).min(1, "At least one field is required"),
33800
- titleField: z66.string().optional(),
33801
- isSingleton: z66.boolean().optional().default(false),
34594
+ fields: z67.array(z67.any()).min(1, "At least one field is required"),
34595
+ titleField: z67.string().optional(),
34596
+ ordering: contentTypeOrderingSchema,
34597
+ isSingleton: z67.boolean().optional().default(false),
33802
34598
  template: templateConfigSchemaForward
33803
34599
  }).refine(
33804
34600
  (data) => {
@@ -33820,7 +34616,7 @@ var contentTypeConfigSchema = z66.object({
33820
34616
  }
33821
34617
  if (!data.routePattern) {
33822
34618
  ctx.addIssue({
33823
- code: z66.ZodIssueCode.custom,
34619
+ code: z67.ZodIssueCode.custom,
33824
34620
  path: ["routePattern"],
33825
34621
  message: "routePattern is required when hasPages is true. Non-singleton types must include {slug} placeholder."
33826
34622
  });
@@ -33829,7 +34625,7 @@ var contentTypeConfigSchema = z66.object({
33829
34625
  const parseResult = safeParseRouteTemplate(data.routePattern);
33830
34626
  if (!parseResult.success) {
33831
34627
  ctx.addIssue({
33832
- code: z66.ZodIssueCode.custom,
34628
+ code: z67.ZodIssueCode.custom,
33833
34629
  path: ["routePattern"],
33834
34630
  message: describeRouteTemplateParseError(parseResult.error)
33835
34631
  });
@@ -33837,44 +34633,44 @@ var contentTypeConfigSchema = z66.object({
33837
34633
  }
33838
34634
  if (!data.isSingleton && parseResult.routeTemplate.kind !== "slug-template") {
33839
34635
  ctx.addIssue({
33840
- code: z66.ZodIssueCode.custom,
34636
+ code: z67.ZodIssueCode.custom,
33841
34637
  path: ["routePattern"],
33842
34638
  message: "routePattern is required when hasPages is true. Non-singleton types must include {slug} placeholder."
33843
34639
  });
33844
34640
  }
33845
34641
  });
33846
- var fieldBindingSchema = z66.object({
33847
- source: z66.literal("field"),
33848
- path: z66.string().min(1, "Field path is required")
34642
+ var fieldBindingSchema = z67.object({
34643
+ source: z67.literal("field"),
34644
+ path: z67.string().min(1, "Field path is required")
33849
34645
  });
33850
- var metaBindingSchema = z66.object({
33851
- source: z66.literal("meta"),
33852
- path: z66.enum(TEMPLATE_BINDING_META_PATHS, {
34646
+ var metaBindingSchema = z67.object({
34647
+ source: z67.literal("meta"),
34648
+ path: z67.enum(TEMPLATE_BINDING_META_PATHS, {
33853
34649
  error: (issue) => describeInvalidTemplateBindingMetaPath(String(issue.input))
33854
34650
  })
33855
34651
  });
33856
- var literalBindingSchema = z66.object({
33857
- source: z66.literal("literal"),
33858
- value: z66.unknown()
34652
+ var literalBindingSchema = z67.object({
34653
+ source: z67.literal("literal"),
34654
+ value: z67.unknown()
33859
34655
  });
33860
- var transformBindingSchema = z66.object({
33861
- source: z66.literal("transform"),
33862
- path: z66.string().min(1, "Transform path is required"),
33863
- transform: z66.enum(BINDING_TRANSFORM_VALUES, {
34656
+ var transformBindingSchema = z67.object({
34657
+ source: z67.literal("transform"),
34658
+ path: z67.string().min(1, "Transform path is required"),
34659
+ transform: z67.enum(BINDING_TRANSFORM_VALUES, {
33864
34660
  error: (issue) => describeInvalidBindingTransform(String(issue.input))
33865
34661
  })
33866
34662
  });
33867
- var baseBindingSchema = z66.discriminatedUnion("source", [
34663
+ var baseBindingSchema = z67.discriminatedUnion("source", [
33868
34664
  fieldBindingSchema,
33869
34665
  metaBindingSchema,
33870
34666
  literalBindingSchema,
33871
34667
  transformBindingSchema
33872
34668
  ]);
33873
- var fallbackBindingSchema = z66.object({
33874
- source: z66.literal("fallback"),
33875
- sources: z66.array(z66.lazy(() => bindingSourceSchema)).min(1, "Fallback must have at least one source")
34669
+ var fallbackBindingSchema = z67.object({
34670
+ source: z67.literal("fallback"),
34671
+ sources: z67.array(z67.lazy(() => bindingSourceSchema)).min(1, "Fallback must have at least one source")
33876
34672
  });
33877
- var bindingSourceSchema = z66.union([
34673
+ var bindingSourceSchema = z67.union([
33878
34674
  baseBindingSchema,
33879
34675
  fallbackBindingSchema
33880
34676
  ]);
@@ -33888,12 +34684,12 @@ function isValidBlockKind(kind) {
33888
34684
  return false;
33889
34685
  }
33890
34686
  var BLOCK_KIND_ERROR_MESSAGE = 'Block kind must be a system block (e.g., "block.hero") or a custom block (e.g., "custom.myBlock")';
33891
- var blockKindSchema = z66.string().refine(isValidBlockKind, { message: BLOCK_KIND_ERROR_MESSAGE });
33892
- var templateBlockConfigSchema = z66.object({
33893
- identifier: z66.string().min(1, "Block identifier is required"),
34687
+ var blockKindSchema = z67.string().refine(isValidBlockKind, { message: BLOCK_KIND_ERROR_MESSAGE });
34688
+ var templateBlockConfigSchema = z67.object({
34689
+ identifier: z67.string().min(1, "Block identifier is required"),
33894
34690
  kind: blockKindSchema,
33895
- scope: z66.enum(["entry", "template"]),
33896
- bindings: z66.record(z66.string(), bindingSourceSchema).optional(),
34691
+ scope: z67.enum(["entry", "template"]),
34692
+ bindings: z67.record(z67.string(), bindingSourceSchema).optional(),
33897
34693
  content: jsonDataSchema.optional()
33898
34694
  }).refine(
33899
34695
  (data) => {
@@ -33912,8 +34708,8 @@ var templateBlockConfigSchema = z66.object({
33912
34708
  },
33913
34709
  { message: "Template-scoped blocks should define static content, not bindings" }
33914
34710
  );
33915
- var templateConfigSchema = z66.object({
33916
- blocks: z66.array(templateBlockConfigSchema).min(1, "Template must have at least one block")
34711
+ var templateConfigSchema = z67.object({
34712
+ blocks: z67.array(templateBlockConfigSchema).min(1, "Template must have at least one block")
33917
34713
  }).refine(
33918
34714
  (data) => {
33919
34715
  const identifiers = data.blocks.map((b) => b.identifier);
@@ -33922,77 +34718,77 @@ var templateConfigSchema = z66.object({
33922
34718
  },
33923
34719
  { message: "Template block identifiers must be unique" }
33924
34720
  );
33925
- var blockConfigSchema = z66.object({
34721
+ var blockConfigSchema = z67.object({
33926
34722
  kind: blockKindSchema,
33927
34723
  content: jsonDataSchema,
33928
- orderIndex: z66.number().optional()
33929
- });
33930
- var pageConfigSchema = z66.object({
33931
- identifier: z66.string().min(1, "Identifier is required"),
33932
- title: z66.string().min(1, "Title is required"),
33933
- path: z66.string().regex(/^\//, "Path must start with /"),
33934
- purpose: z66.string().default("content"),
33935
- blocks: z66.array(blockConfigSchema).optional(),
33936
- status: z66.enum(["draft", "published"]).default("draft"),
33937
- metaTitle: z66.string().optional(),
33938
- metaDescription: z66.string().optional()
33939
- });
33940
- var entryConfigSchema = z66.object({
33941
- identifier: z66.string().min(1, "Identifier is required"),
33942
- contentType: z66.string().min(1, "Content type is required"),
34724
+ orderIndex: z67.number().optional()
34725
+ });
34726
+ var pageConfigSchema = z67.object({
34727
+ identifier: z67.string().min(1, "Identifier is required"),
34728
+ title: z67.string().min(1, "Title is required"),
34729
+ path: z67.string().regex(/^\//, "Path must start with /"),
34730
+ purpose: z67.string().default("content"),
34731
+ blocks: z67.array(blockConfigSchema).optional(),
34732
+ status: z67.enum(["draft", "published"]).default("draft"),
34733
+ metaTitle: z67.string().optional(),
34734
+ metaDescription: z67.string().optional()
34735
+ });
34736
+ var entryConfigSchema = z67.object({
34737
+ identifier: z67.string().min(1, "Identifier is required"),
34738
+ contentType: z67.string().min(1, "Content type is required"),
33943
34739
  data: jsonDataSchema,
33944
- status: z66.enum(["draft", "published"]).default("draft"),
33945
- slug: z66.string().optional(),
33946
- summary: z66.string().optional(),
34740
+ status: z67.enum(["draft", "published"]).default("draft"),
34741
+ slug: z67.string().optional(),
34742
+ summary: z67.string().optional(),
33947
34743
  // Hard remove legacy config-only titles: titles must live in entry `data`.
33948
- title: z66.any().optional().refine((value) => value === void 0, {
34744
+ title: z67.any().optional().refine((value) => value === void 0, {
33949
34745
  message: "Entry titles are now derived from entry data. Remove `title` and move it into `data` (e.g. `data.title`, or your configured `titleField`). Run `riverbankcms migrate entries` for guided migration."
33950
34746
  }),
33951
- metaTitle: z66.string().optional(),
33952
- metaDescription: z66.string().optional()
34747
+ metaTitle: z67.string().optional(),
34748
+ metaDescription: z67.string().optional()
33953
34749
  });
33954
- var dropdownLinkSchema = z66.object({
33955
- kind: z66.literal("dropdown")
34750
+ var dropdownLinkSchema = z67.object({
34751
+ kind: z67.literal("dropdown")
33956
34752
  });
33957
- var navigationLinkSchema = z66.discriminatedUnion("kind", [
34753
+ var navigationLinkSchema = z67.discriminatedUnion("kind", [
33958
34754
  ...navigationLinkInputSchemaOptions,
33959
34755
  dropdownLinkSchema
33960
34756
  ]);
33961
- var baseNavigationItemSchema = z66.object({
33962
- label: z66.string().min(1, "Label is required"),
34757
+ var baseNavigationItemSchema = z67.object({
34758
+ label: z67.string().min(1, "Label is required"),
33963
34759
  link: navigationLinkSchema,
33964
- isCta: z66.boolean().optional()
34760
+ isCta: z67.boolean().optional()
33965
34761
  });
33966
34762
  var navigationItemConfigSchema = baseNavigationItemSchema.extend({
33967
- children: z66.lazy(() => z66.array(navigationItemConfigSchema)).optional()
33968
- });
33969
- var navigationMenuConfigSchema = z66.object({
33970
- identifier: z66.string().min(1, "Identifier is required"),
33971
- name: z66.string().min(1, "Name is required"),
33972
- isPrimary: z66.boolean().optional(),
33973
- isFooter: z66.boolean().optional(),
33974
- items: z66.array(navigationItemConfigSchema)
34763
+ children: z67.lazy(() => z67.array(navigationItemConfigSchema)).optional()
34764
+ });
34765
+ var navigationMenuConfigSchema = z67.object({
34766
+ identifier: z67.string().min(1, "Identifier is required"),
34767
+ name: z67.string().min(1, "Name is required"),
34768
+ isPrimary: z67.boolean().optional(),
34769
+ isFooter: z67.boolean().optional(),
34770
+ items: z67.array(navigationItemConfigSchema)
33975
34771
  }).superRefine((menu, ctx) => {
33976
34772
  const portalStats = collectPortalLinkStats(
33977
34773
  menu.items
33978
34774
  );
33979
34775
  if (portalStats.count > 1) {
33980
34776
  ctx.addIssue({
33981
- code: z66.ZodIssueCode.custom,
34777
+ code: z67.ZodIssueCode.custom,
33982
34778
  message: "Only one portal link is allowed per navigation menu",
33983
34779
  path: ["items"]
33984
34780
  });
33985
34781
  }
33986
34782
  if (portalStats.nestedLabels.length > 0) {
33987
34783
  ctx.addIssue({
33988
- code: z66.ZodIssueCode.custom,
34784
+ code: z67.ZodIssueCode.custom,
33989
34785
  message: `Portal links must be root-level items: ${portalStats.nestedLabels.join(", ")}`,
33990
34786
  path: ["items"]
33991
34787
  });
33992
34788
  }
33993
34789
  if (portalStats.withChildrenLabels.length > 0) {
33994
34790
  ctx.addIssue({
33995
- code: z66.ZodIssueCode.custom,
34791
+ code: z67.ZodIssueCode.custom,
33996
34792
  message: `Portal links cannot contain child items: ${portalStats.withChildrenLabels.join(", ")}`,
33997
34793
  path: ["items"]
33998
34794
  });
@@ -34002,44 +34798,44 @@ var navigationMenuConfigSchema = z66.object({
34002
34798
  );
34003
34799
  if (cartStats.nestedLabels.length > 0) {
34004
34800
  ctx.addIssue({
34005
- code: z66.ZodIssueCode.custom,
34801
+ code: z67.ZodIssueCode.custom,
34006
34802
  message: `Cart links must be root-level items: ${cartStats.nestedLabels.join(", ")}`,
34007
34803
  path: ["items"]
34008
34804
  });
34009
34805
  }
34010
34806
  if (cartStats.withChildrenLabels.length > 0) {
34011
34807
  ctx.addIssue({
34012
- code: z66.ZodIssueCode.custom,
34808
+ code: z67.ZodIssueCode.custom,
34013
34809
  message: `Cart links cannot contain child items: ${cartStats.withChildrenLabels.join(", ")}`,
34014
34810
  path: ["items"]
34015
34811
  });
34016
34812
  }
34017
34813
  if (cartStats.ctaLabels.length > 0) {
34018
34814
  ctx.addIssue({
34019
- code: z66.ZodIssueCode.custom,
34815
+ code: z67.ZodIssueCode.custom,
34020
34816
  message: `Cart links cannot be marked as CTA: ${cartStats.ctaLabels.join(", ")}`,
34021
34817
  path: ["items"]
34022
34818
  });
34023
34819
  }
34024
34820
  if (cartStats.missingVisibleTextLabels.length > 0) {
34025
34821
  ctx.addIssue({
34026
- code: z66.ZodIssueCode.custom,
34822
+ code: z67.ZodIssueCode.custom,
34027
34823
  message: `Cart links with icon-with-label must provide a visible label: ${cartStats.missingVisibleTextLabels.join(", ")}`,
34028
34824
  path: ["items"]
34029
34825
  });
34030
34826
  }
34031
34827
  });
34032
- var siteSettingsConfigSchema = z66.object({
34033
- homepagePath: z66.string().optional(),
34034
- siteTitle: z66.string().optional(),
34035
- siteDescription: z66.string().optional(),
34036
- defaultTemplates: z66.record(z66.string(), z66.string()).optional()
34828
+ var siteSettingsConfigSchema = z67.object({
34829
+ homepagePath: z67.string().optional(),
34830
+ siteTitle: z67.string().optional(),
34831
+ siteDescription: z67.string().optional(),
34832
+ defaultTemplates: z67.record(z67.string(), z67.string()).optional()
34037
34833
  });
34038
- var contentConfigBaseSchema = z66.object({
34039
- contentTypes: z66.array(contentTypeConfigSchema).optional(),
34040
- entries: z66.array(entryConfigSchema).optional(),
34041
- pages: z66.array(pageConfigSchema).optional(),
34042
- navigationMenus: z66.array(navigationMenuConfigSchema).optional(),
34834
+ var contentConfigBaseSchema = z67.object({
34835
+ contentTypes: z67.array(contentTypeConfigSchema).optional(),
34836
+ entries: z67.array(entryConfigSchema).optional(),
34837
+ pages: z67.array(pageConfigSchema).optional(),
34838
+ navigationMenus: z67.array(navigationMenuConfigSchema).optional(),
34043
34839
  settings: siteSettingsConfigSchema.optional()
34044
34840
  });
34045
34841
  var contentConfigSchema = contentConfigBaseSchema.superRefine((data, ctx) => {
@@ -34048,7 +34844,7 @@ var contentConfigSchema = contentConfigBaseSchema.superRefine((data, ctx) => {
34048
34844
  const duplicateKeys = keys.filter((key, i) => keys.indexOf(key) !== i);
34049
34845
  if (duplicateKeys.length > 0) {
34050
34846
  ctx.addIssue({
34051
- code: z66.ZodIssueCode.custom,
34847
+ code: z67.ZodIssueCode.custom,
34052
34848
  message: `Content type keys must be unique. Duplicates: ${duplicateKeys.join(", ")}`,
34053
34849
  path: ["contentTypes"]
34054
34850
  });
@@ -34059,7 +34855,7 @@ var contentConfigSchema = contentConfigBaseSchema.superRefine((data, ctx) => {
34059
34855
  const duplicateIds = identifiers.filter((id, i) => identifiers.indexOf(id) !== i);
34060
34856
  if (duplicateIds.length > 0) {
34061
34857
  ctx.addIssue({
34062
- code: z66.ZodIssueCode.custom,
34858
+ code: z67.ZodIssueCode.custom,
34063
34859
  message: `Page identifiers must be unique. Duplicates: ${duplicateIds.join(", ")}`,
34064
34860
  path: ["pages"]
34065
34861
  });
@@ -34068,7 +34864,7 @@ var contentConfigSchema = contentConfigBaseSchema.superRefine((data, ctx) => {
34068
34864
  const duplicatePaths = paths.filter((path, i) => paths.indexOf(path) !== i);
34069
34865
  if (duplicatePaths.length > 0) {
34070
34866
  ctx.addIssue({
34071
- code: z66.ZodIssueCode.custom,
34867
+ code: z67.ZodIssueCode.custom,
34072
34868
  message: `Page paths must be unique. Duplicates: ${duplicatePaths.join(", ")}`,
34073
34869
  path: ["pages"]
34074
34870
  });
@@ -34079,7 +34875,7 @@ var contentConfigSchema = contentConfigBaseSchema.superRefine((data, ctx) => {
34079
34875
  const duplicateIds = identifiers.filter((id, i) => identifiers.indexOf(id) !== i);
34080
34876
  if (duplicateIds.length > 0) {
34081
34877
  ctx.addIssue({
34082
- code: z66.ZodIssueCode.custom,
34878
+ code: z67.ZodIssueCode.custom,
34083
34879
  message: `Entry identifiers must be unique. Duplicates: ${duplicateIds.join(", ")}`,
34084
34880
  path: ["entries"]
34085
34881
  });
@@ -34090,7 +34886,7 @@ var contentConfigSchema = contentConfigBaseSchema.superRefine((data, ctx) => {
34090
34886
  const duplicateIds = identifiers.filter((id, i) => identifiers.indexOf(id) !== i);
34091
34887
  if (duplicateIds.length > 0) {
34092
34888
  ctx.addIssue({
34093
- code: z66.ZodIssueCode.custom,
34889
+ code: z67.ZodIssueCode.custom,
34094
34890
  message: `Navigation menu identifiers must be unique. Duplicates: ${duplicateIds.join(", ")}`,
34095
34891
  path: ["navigationMenus"]
34096
34892
  });
@@ -34104,7 +34900,7 @@ var contentConfigSchema = contentConfigBaseSchema.superRefine((data, ctx) => {
34104
34900
  const entriesForType = data.entries.filter((e) => e.contentType === singletonKey);
34105
34901
  if (entriesForType.length > 1) {
34106
34902
  ctx.addIssue({
34107
- code: z66.ZodIssueCode.custom,
34903
+ code: z67.ZodIssueCode.custom,
34108
34904
  message: `Singleton content type "${singletonKey}" cannot have more than one entry. Found ${entriesForType.length} entries.`,
34109
34905
  path: ["entries"]
34110
34906
  });
@@ -34217,18 +35013,18 @@ function validateLayout(layout) {
34217
35013
  }
34218
35014
 
34219
35015
  // src/config/dashboard-validation.ts
34220
- import { z as z67 } from "zod";
34221
- var navIdListSchema2 = z67.preprocess((value) => {
35016
+ import { z as z68 } from "zod";
35017
+ var navIdListSchema2 = z68.preprocess((value) => {
34222
35018
  if (!Array.isArray(value)) return void 0;
34223
35019
  const filtered = value.filter((v) => typeof v === "string" && v.trim().length > 0);
34224
35020
  return filtered.length > 0 ? filtered : void 0;
34225
- }, z67.array(z67.string()).max(200, "Maximum 200 nav IDs").optional());
34226
- var dashboardNavVisibilityBaseSchema2 = z67.object({
34227
- mode: z67.enum(["augment", "restrict"]).optional(),
35021
+ }, z68.array(z68.string()).max(200, "Maximum 200 nav IDs").optional());
35022
+ var dashboardNavVisibilityBaseSchema2 = z68.object({
35023
+ mode: z68.enum(["augment", "restrict"]).optional(),
34228
35024
  allowIds: navIdListSchema2,
34229
35025
  denyIds: navIdListSchema2
34230
35026
  }).strip();
34231
- var dashboardNavVisibilityRolesSchema2 = z67.object({
35027
+ var dashboardNavVisibilityRolesSchema2 = z68.object({
34232
35028
  administrator: dashboardNavVisibilityBaseSchema2.optional(),
34233
35029
  editor: dashboardNavVisibilityBaseSchema2.optional(),
34234
35030
  team_member: dashboardNavVisibilityBaseSchema2.optional()
@@ -34236,20 +35032,20 @@ var dashboardNavVisibilityRolesSchema2 = z67.object({
34236
35032
  var dashboardNavVisibilitySchema2 = dashboardNavVisibilityBaseSchema2.extend({
34237
35033
  roles: dashboardNavVisibilityRolesSchema2
34238
35034
  }).strip();
34239
- var dashboardNavigationConfigSchema2 = z67.object({
35035
+ var dashboardNavigationConfigSchema2 = z68.object({
34240
35036
  siteNav: dashboardNavVisibilitySchema2.optional(),
34241
35037
  settingsNav: dashboardNavVisibilitySchema2.optional()
34242
35038
  }).strip();
34243
- var dashboardConfigSchema2 = z67.object({
34244
- previewEditingEnabled: z67.boolean().optional(),
35039
+ var dashboardConfigSchema2 = z68.object({
35040
+ previewEditingEnabled: z68.boolean().optional(),
34245
35041
  navigation: dashboardNavigationConfigSchema2.optional()
34246
35042
  }).strip();
34247
35043
 
34248
35044
  // src/zod/titleSourceSchema.ts
34249
- import { z as z68 } from "zod";
34250
- var titleSourceValueSchema = z68.union([
34251
- z68.string().min(1),
34252
- z68.array(z68.string().min(1)).min(1)
35045
+ import { z as z69 } from "zod";
35046
+ var titleSourceValueSchema = z69.union([
35047
+ z69.string().min(1),
35048
+ z69.array(z69.string().min(1)).min(1)
34253
35049
  ]);
34254
35050
 
34255
35051
  // src/data/prefetchBlockData.ts
@@ -34268,11 +35064,11 @@ var SUPPORTED_LOADER_ENDPOINTS2 = [
34268
35064
  ];
34269
35065
 
34270
35066
  // src/config/validation.ts
34271
- var sdkThemePaletteSchema2 = z69.record(z69.string(), z69.string());
34272
- var sdkThemeConfigSchema2 = z69.object({
35067
+ var sdkThemePaletteSchema2 = z70.record(z70.string(), z70.string());
35068
+ var sdkThemeConfigSchema2 = z70.object({
34273
35069
  palette: sdkThemePaletteSchema2
34274
35070
  });
34275
- var sdkSiteUrlSchema = z69.string().url("Must be a valid URL").refine((url) => {
35071
+ var sdkSiteUrlSchema = z70.string().url("Must be a valid URL").refine((url) => {
34276
35072
  try {
34277
35073
  const parsed = new URL(url);
34278
35074
  const isLocal = parsed.hostname === "localhost" || parsed.hostname.endsWith(".localhost") || parsed.hostname.endsWith(".local") || parsed.hostname.endsWith(".test");
@@ -34281,97 +35077,97 @@ var sdkSiteUrlSchema = z69.string().url("Must be a valid URL").refine((url) => {
34281
35077
  return false;
34282
35078
  }
34283
35079
  }, { message: "Production URLs must use HTTPS" }).transform((url) => url.replace(/\/$/, ""));
34284
- var sectionBackgroundSchema = z69.object({
34285
- id: z69.string(),
34286
- label: z69.string(),
34287
- token: z69.string()
35080
+ var sectionBackgroundSchema = z70.object({
35081
+ id: z70.string(),
35082
+ label: z70.string(),
35083
+ token: z70.string()
34288
35084
  // Reference to theme palette token
34289
35085
  });
34290
- var sectionSpacingSchema = z69.enum(["compact", "default", "spacious"]);
34291
- var containerMaxWidthSchema = z69.enum(["narrow", "default", "wide", "full"]);
34292
- var containerAlignmentSchema = z69.enum(["left", "center", "right"]);
34293
- var sectionOptionsSchema = z69.object({
34294
- backgroundColor: z69.boolean().optional(),
34295
- backgroundImage: z69.boolean().optional(),
34296
- backgroundGradient: z69.boolean().optional(),
34297
- spacing: z69.union([
34298
- z69.array(sectionSpacingSchema),
34299
- z69.boolean()
35086
+ var sectionSpacingSchema = z70.enum(["compact", "default", "spacious"]);
35087
+ var containerMaxWidthSchema = z70.enum(["narrow", "default", "wide", "full"]);
35088
+ var containerAlignmentSchema = z70.enum(["left", "center", "right"]);
35089
+ var sectionOptionsSchema = z70.object({
35090
+ backgroundColor: z70.boolean().optional(),
35091
+ backgroundImage: z70.boolean().optional(),
35092
+ backgroundGradient: z70.boolean().optional(),
35093
+ spacing: z70.union([
35094
+ z70.array(sectionSpacingSchema),
35095
+ z70.boolean()
34300
35096
  ]).optional(),
34301
- textColor: z69.boolean().optional()
35097
+ textColor: z70.boolean().optional()
34302
35098
  }).optional();
34303
- var containerOptionsSchema = z69.object({
34304
- maxWidth: z69.union([
34305
- z69.array(containerMaxWidthSchema),
34306
- z69.boolean()
35099
+ var containerOptionsSchema = z70.object({
35100
+ maxWidth: z70.union([
35101
+ z70.array(containerMaxWidthSchema),
35102
+ z70.boolean()
34307
35103
  ]).optional(),
34308
- alignment: z69.union([
34309
- z69.array(containerAlignmentSchema),
34310
- z69.boolean()
35104
+ alignment: z70.union([
35105
+ z70.array(containerAlignmentSchema),
35106
+ z70.boolean()
34311
35107
  ]).optional()
34312
35108
  }).optional();
34313
- var siteStyleConfigSchema = z69.object({
34314
- sectionBackgrounds: z69.array(sectionBackgroundSchema).optional(),
35109
+ var siteStyleConfigSchema = z70.object({
35110
+ sectionBackgrounds: z70.array(sectionBackgroundSchema).optional(),
34315
35111
  sectionOptions: sectionOptionsSchema,
34316
35112
  containerOptions: containerOptionsSchema
34317
35113
  }).optional();
34318
- var sdkLoaderEndpointSchema2 = z69.enum(SUPPORTED_LOADER_ENDPOINTS2);
35114
+ var sdkLoaderEndpointSchema2 = z70.enum(SUPPORTED_LOADER_ENDPOINTS2);
34319
35115
  var allowedTransformIds = new Set(builtinTransformDefinitions.map((transform) => transform.id));
34320
- var loaderTransformStepSchema = z69.object({
34321
- id: z69.string().refine((id) => allowedTransformIds.has(id), {
35116
+ var loaderTransformStepSchema = z70.object({
35117
+ id: z70.string().refine((id) => allowedTransformIds.has(id), {
34322
35118
  message: "Unknown transform id"
34323
35119
  }),
34324
- options: z69.record(z69.string(), z69.unknown()).optional()
35120
+ options: z70.record(z70.string(), z70.unknown()).optional()
34325
35121
  });
34326
- var loaderParamBindingSchema2 = z69.object({
34327
- $bind: z69.object({
34328
- from: z69.string().min(1, "Binding path is required"),
35122
+ var loaderParamBindingSchema2 = z70.object({
35123
+ $bind: z70.object({
35124
+ from: z70.string().min(1, "Binding path is required"),
34329
35125
  // Loader params are ultimately string-normalized for query strings, so fallbacks should
34330
35126
  // stay scalar. Use transforms (e.g. `value.jsonArray`) when you need to serialize
34331
35127
  // more complex values into a string.
34332
- fallback: z69.union([z69.string(), z69.number(), z69.boolean(), z69.null()]).optional(),
34333
- transforms: z69.array(loaderTransformStepSchema).default([]),
34334
- pick: z69.enum(["value", "collection", "context"]).default("value"),
34335
- coerce: z69.enum(["number", "boolean", "string"]).optional()
35128
+ fallback: loaderFallbackScalarSchema.optional(),
35129
+ transforms: z70.array(loaderTransformStepSchema).default([]),
35130
+ pick: z70.enum(["value", "collection", "context"]).default("value"),
35131
+ coerce: z70.enum(["number", "boolean", "string"]).optional()
34336
35132
  })
34337
35133
  });
34338
- var loaderParamValueSchema2 = z69.union([
34339
- z69.string(),
34340
- z69.number(),
34341
- z69.boolean(),
35134
+ var loaderParamValueSchema2 = z70.union([
35135
+ z70.string(),
35136
+ z70.number(),
35137
+ z70.boolean(),
34342
35138
  loaderParamBindingSchema2
34343
35139
  ]);
34344
- var loaderWhenValueSchema = z69.union([
34345
- z69.boolean(),
35140
+ var loaderWhenValueSchema = z70.union([
35141
+ z70.boolean(),
34346
35142
  loaderParamBindingSchema2
34347
35143
  ]);
34348
- var sdkConfigLoaderSchema2 = z69.object({
35144
+ var sdkConfigLoaderSchema2 = z70.object({
34349
35145
  endpoint: sdkLoaderEndpointSchema2,
34350
- params: z69.record(z69.string(), loaderParamValueSchema2),
34351
- mode: z69.enum(["server", "client"]).default("server"),
35146
+ params: z70.record(z70.string(), loaderParamValueSchema2),
35147
+ mode: z70.enum(["server", "client"]).default("server"),
34352
35148
  when: loaderWhenValueSchema.optional()
34353
35149
  });
34354
- var sdkDataLoadersSchema2 = z69.record(z69.string(), sdkConfigLoaderSchema2).refine(
35150
+ var sdkDataLoadersSchema2 = z70.record(z70.string(), sdkConfigLoaderSchema2).refine(
34355
35151
  (loaders) => Object.keys(loaders).length <= 5,
34356
35152
  { message: "Maximum 5 data loaders per block" }
34357
35153
  ).optional();
34358
- var fieldSelectOptionSchema = z69.object({
34359
- value: z69.string().min(1, "Option value is required"),
34360
- label: z69.string().min(1, "Option label is required")
35154
+ var fieldSelectOptionSchema = z70.object({
35155
+ value: z70.string().min(1, "Option value is required"),
35156
+ label: z70.string().min(1, "Option label is required")
34361
35157
  });
34362
- var blockFieldConfigSchema = z69.object({
34363
- options: z69.array(fieldSelectOptionSchema).min(1, "At least one option is required").optional()
35158
+ var blockFieldConfigSchema = z70.object({
35159
+ options: z70.array(fieldSelectOptionSchema).min(1, "At least one option is required").optional()
34364
35160
  });
34365
- var blockFieldOptionsSchema = z69.record(
34366
- z69.string().regex(/^(block\.|custom\.)[a-z][a-z0-9-]*$/, {
35161
+ var blockFieldOptionsSchema = z70.record(
35162
+ z70.string().regex(/^(block\.|custom\.)[a-z][a-z0-9-]*$/, {
34367
35163
  message: "Block ID must be 'block.*' or 'custom.*' format"
34368
35164
  }),
34369
- z69.record(
34370
- z69.string().min(1, "Field ID is required"),
35165
+ z70.record(
35166
+ z70.string().min(1, "Field ID is required"),
34371
35167
  blockFieldConfigSchema
34372
35168
  )
34373
35169
  ).optional();
34374
- var blockFieldExtensionSchema = z69.object({
35170
+ var blockFieldExtensionSchema = z70.object({
34375
35171
  fields: fieldSchema.array().min(1, "At least one field is required")
34376
35172
  }).refine(
34377
35173
  (data) => {
@@ -34385,10 +35181,10 @@ var blockFieldExtensionSchema = z69.object({
34385
35181
  message: "Required fields must have a defaultValue to support existing blocks"
34386
35182
  }
34387
35183
  );
34388
- var blockFieldExtensionsMapSchema = z69.record(
35184
+ var blockFieldExtensionsMapSchema = z70.record(
34389
35185
  // System blocks are kebab-case: block.body-text, block.event-calendar, ...
34390
35186
  // Enforce: lowercase alphanumerics with single hyphens (no trailing hyphen, no consecutive hyphens).
34391
- z69.string().regex(/^block\.[a-z][a-z0-9]*(?:-[a-z0-9]+)*$/, {
35187
+ z70.string().regex(/^block\.[a-z][a-z0-9]*(?:-[a-z0-9]+)*$/, {
34392
35188
  message: "Block ID must be 'block.*' format (system blocks only)"
34393
35189
  }),
34394
35190
  blockFieldExtensionSchema
@@ -34404,7 +35200,7 @@ var blockFieldExtensionsMapSchema = z69.record(
34404
35200
  (field) => field.id === collision.fieldId
34405
35201
  );
34406
35202
  ctx.addIssue({
34407
- code: z69.ZodIssueCode.custom,
35203
+ code: z70.ZodIssueCode.custom,
34408
35204
  message: collision.message,
34409
35205
  path: [
34410
35206
  APPOINTMENT_BOOKING_BLOCK_ID,
@@ -34419,24 +35215,24 @@ var blockFieldExtensionsSchema = blockFieldExtensionsMapSchema.optional();
34419
35215
  function collectAppointmentBookingExtensionReservedFieldCollisions(extension) {
34420
35216
  return collectBookingReservedFieldCollisions(extension, { type: "booking" });
34421
35217
  }
34422
- var syncConfigSchema = z69.object({
34423
- existingEntries: z69.enum(["skip", "update"]).optional()
35218
+ var syncConfigSchema = z70.object({
35219
+ existingEntries: z70.enum(["skip", "update"]).optional()
34424
35220
  }).optional();
34425
- var deployConfigSchema = z69.object({
34426
- verifyCommand: z69.string().optional(),
34427
- prebuildOutput: z69.string().optional()
35221
+ var deployConfigSchema = z70.object({
35222
+ verifyCommand: z70.string().optional(),
35223
+ prebuildOutput: z70.string().optional()
34428
35224
  }).optional();
34429
- var sdkCustomBlockSchema = z69.object({
35225
+ var sdkCustomBlockSchema = z70.object({
34430
35226
  // Block ID must start with 'custom.'
34431
- id: z69.string().min(8).regex(/^custom\.[a-z][a-z0-9-]*$/, {
35227
+ id: z70.string().min(8).regex(/^custom\.[a-z][a-z0-9-]*$/, {
34432
35228
  message: "Block ID must start with 'custom.' followed by lowercase letters, numbers, or hyphens"
34433
35229
  }),
34434
- title: z69.string().min(1, "Title is required"),
35230
+ title: z70.string().min(1, "Title is required"),
34435
35231
  titleSource: titleSourceValueSchema.optional(),
34436
- description: z69.string().optional(),
35232
+ description: z70.string().optional(),
34437
35233
  category: blockCategoryEnum,
34438
- icon: z69.string().optional(),
34439
- tags: z69.array(z69.string()).optional(),
35234
+ icon: z70.string().optional(),
35235
+ tags: z70.array(z70.string()).optional(),
34440
35236
  // Reuse the exact field schema from @riverbankcms/blocks - all field types supported
34441
35237
  fields: fieldSchema.array().min(1, "Custom blocks must have at least one field"),
34442
35238
  // Data loaders for CMS endpoints
@@ -34444,14 +35240,14 @@ var sdkCustomBlockSchema = z69.object({
34444
35240
  // Optional declarative layout - when present, block can render without React override
34445
35241
  layout: NodeSchema.optional(),
34446
35242
  // Optional variants system (preferred when a block has multiple structural layouts)
34447
- variants: z69.record(z69.string().min(1), NodeSchema).optional(),
34448
- defaultVariant: z69.string().min(1).optional(),
34449
- variantOptions: z69.record(
34450
- z69.string().min(1),
34451
- z69.object({
34452
- label: z69.string().min(1).optional(),
34453
- description: z69.string().min(1).optional(),
34454
- icon: z69.string().min(1).optional()
35243
+ variants: z70.record(z70.string().min(1), NodeSchema).optional(),
35244
+ defaultVariant: z70.string().min(1).optional(),
35245
+ variantOptions: z70.record(
35246
+ z70.string().min(1),
35247
+ z70.object({
35248
+ label: z70.string().min(1).optional(),
35249
+ description: z70.string().min(1).optional(),
35250
+ icon: z70.string().min(1).optional()
34455
35251
  })
34456
35252
  ).optional()
34457
35253
  }).superRefine((data, ctx) => {
@@ -34462,7 +35258,7 @@ var sdkCustomBlockSchema = z69.object({
34462
35258
  const exists = fields3.some((field) => field.id === source);
34463
35259
  if (!exists) {
34464
35260
  ctx.addIssue({
34465
- code: z69.ZodIssueCode.custom,
35261
+ code: z70.ZodIssueCode.custom,
34466
35262
  message: `titleSource must reference a valid field ID (got "${source}")`,
34467
35263
  path: Array.isArray(data.titleSource) ? ["titleSource", index] : ["titleSource"]
34468
35264
  });
@@ -34471,7 +35267,7 @@ var sdkCustomBlockSchema = z69.object({
34471
35267
  }
34472
35268
  if (data.layout && data.variants) {
34473
35269
  ctx.addIssue({
34474
- code: z69.ZodIssueCode.custom,
35270
+ code: z70.ZodIssueCode.custom,
34475
35271
  message: "Custom block must define either `layout` or `variants`, not both",
34476
35272
  path: ["variants"]
34477
35273
  });
@@ -34481,7 +35277,7 @@ var sdkCustomBlockSchema = z69.object({
34481
35277
  if (!result.valid) {
34482
35278
  for (const error of result.errors) {
34483
35279
  ctx.addIssue({
34484
- code: z69.ZodIssueCode.custom,
35280
+ code: z70.ZodIssueCode.custom,
34485
35281
  message: error.message,
34486
35282
  path: ["layout"]
34487
35283
  });
@@ -34492,14 +35288,14 @@ var sdkCustomBlockSchema = z69.object({
34492
35288
  const keys = Object.keys(data.variants);
34493
35289
  if (keys.length === 0) {
34494
35290
  ctx.addIssue({
34495
- code: z69.ZodIssueCode.custom,
35291
+ code: z70.ZodIssueCode.custom,
34496
35292
  message: "`variants` must contain at least one variant key",
34497
35293
  path: ["variants"]
34498
35294
  });
34499
35295
  }
34500
35296
  if (data.defaultVariant && !Object.prototype.hasOwnProperty.call(data.variants, data.defaultVariant)) {
34501
35297
  ctx.addIssue({
34502
- code: z69.ZodIssueCode.custom,
35298
+ code: z70.ZodIssueCode.custom,
34503
35299
  message: "`defaultVariant` must be a key present in `variants`",
34504
35300
  path: ["defaultVariant"]
34505
35301
  });
@@ -34509,7 +35305,7 @@ var sdkCustomBlockSchema = z69.object({
34509
35305
  if (!result.valid) {
34510
35306
  for (const error of result.errors) {
34511
35307
  ctx.addIssue({
34512
- code: z69.ZodIssueCode.custom,
35308
+ code: z70.ZodIssueCode.custom,
34513
35309
  message: `${key}: ${error.message}`,
34514
35310
  path: ["variants", key]
34515
35311
  });
@@ -34520,7 +35316,7 @@ var sdkCustomBlockSchema = z69.object({
34520
35316
  for (const key of Object.keys(data.variantOptions)) {
34521
35317
  if (!Object.prototype.hasOwnProperty.call(data.variants, key)) {
34522
35318
  ctx.addIssue({
34523
- code: z69.ZodIssueCode.custom,
35319
+ code: z70.ZodIssueCode.custom,
34524
35320
  message: "`variantOptions` key must exist in `variants`",
34525
35321
  path: ["variantOptions", key]
34526
35322
  });
@@ -34529,58 +35325,58 @@ var sdkCustomBlockSchema = z69.object({
34529
35325
  }
34530
35326
  }
34531
35327
  });
34532
- var themeSourceSchema = z69.enum(["local", "cms"]).optional();
34533
- var activeThemeSchema = z69.string().regex(/^[a-z0-9][a-z0-9-_]*$/, {
35328
+ var themeSourceSchema = z70.enum(["local", "cms"]).optional();
35329
+ var activeThemeSchema = z70.string().regex(/^[a-z0-9][a-z0-9-_]*$/, {
34534
35330
  message: "Theme name must be lowercase alphanumeric with hyphens/underscores"
34535
35331
  }).max(64, "Theme name too long").optional();
34536
35332
  function isValidConfigBlockKind(kind) {
34537
35333
  if (getBlockDefinition(kind)) return true;
34538
35334
  return /^custom\.[a-z][a-z0-9-]*$/.test(kind);
34539
35335
  }
34540
- var layoutBlockKindSchema = z69.string().refine(isValidConfigBlockKind, {
35336
+ var layoutBlockKindSchema = z70.string().refine(isValidConfigBlockKind, {
34541
35337
  message: 'Block kind must be a system block (e.g., "block.hero") or a custom block (e.g., "custom.my-block")'
34542
35338
  });
34543
- var layoutFooterBlockSchema = z69.object({
34544
- id: z69.string().min(1).optional(),
35339
+ var layoutFooterBlockSchema = z70.object({
35340
+ id: z70.string().min(1).optional(),
34545
35341
  kind: layoutBlockKindSchema,
34546
35342
  // Allow omitted content for blocks that rely on defaults.
34547
- content: z69.record(z69.string(), z69.unknown()).optional()
35343
+ content: z70.record(z70.string(), z70.unknown()).optional()
34548
35344
  }).strict();
34549
- var layoutConfigSchema = z69.object({
34550
- footerBlocks: z69.array(layoutFooterBlockSchema).optional()
35345
+ var layoutConfigSchema = z70.object({
35346
+ footerBlocks: z70.array(layoutFooterBlockSchema).optional()
34551
35347
  }).strict();
34552
- var sdkWorkflowIdSchema2 = z69.string().min(1).max(SDK_WORKFLOW_ID_MAX_LENGTH).regex(SDK_WORKFLOW_ID_PATTERN, {
35348
+ var sdkWorkflowIdSchema2 = z70.string().min(1).max(SDK_WORKFLOW_ID_MAX_LENGTH).regex(SDK_WORKFLOW_ID_PATTERN, {
34553
35349
  message: "Workflow ID must start with a lowercase letter and use lowercase letters, numbers, dots, underscores, or hyphens"
34554
35350
  });
34555
- var sdkWorkflowEndpointSchema2 = z69.string().min(1).max(SDK_WORKFLOW_ENDPOINT_MAX_LENGTH).regex(SDK_WORKFLOW_ENDPOINT_PATTERN, { message: 'Workflow endpoint must be a site-relative path starting with "/"' });
34556
- var sdkWorkflowTriggerSchema2 = z69.discriminatedUnion("type", [
34557
- z69.object({ type: z69.literal("manual") }).strict()
35351
+ var sdkWorkflowEndpointSchema2 = z70.string().min(1).max(SDK_WORKFLOW_ENDPOINT_MAX_LENGTH).regex(SDK_WORKFLOW_ENDPOINT_PATTERN, { message: 'Workflow endpoint must be a site-relative path starting with "/"' });
35352
+ var sdkWorkflowTriggerSchema2 = z70.discriminatedUnion("type", [
35353
+ z70.object({ type: z70.literal("manual") }).strict()
34558
35354
  ]);
34559
- var sdkWorkflowConfirmationSchema2 = z69.object({
34560
- title: z69.string().trim().min(1).max(SDK_WORKFLOW_CONFIRMATION_TITLE_MAX_LENGTH),
34561
- body: z69.string().trim().min(1).max(SDK_WORKFLOW_CONFIRMATION_BODY_MAX_LENGTH).optional()
35355
+ var sdkWorkflowConfirmationSchema2 = z70.object({
35356
+ title: z70.string().trim().min(1).max(SDK_WORKFLOW_CONFIRMATION_TITLE_MAX_LENGTH),
35357
+ body: z70.string().trim().min(1).max(SDK_WORKFLOW_CONFIRMATION_BODY_MAX_LENGTH).optional()
34562
35358
  }).strict();
34563
- var sdkWorkflowConfigSchema2 = z69.object({
35359
+ var sdkWorkflowConfigSchema2 = z70.object({
34564
35360
  id: sdkWorkflowIdSchema2,
34565
- title: z69.string().trim().min(1).max(SDK_WORKFLOW_TITLE_MAX_LENGTH),
34566
- description: z69.string().trim().min(1).max(SDK_WORKFLOW_DESCRIPTION_MAX_LENGTH).optional(),
34567
- contentType: z69.string().trim().min(1).max(SDK_WORKFLOW_CONTENT_TYPE_MAX_LENGTH),
35361
+ title: z70.string().trim().min(1).max(SDK_WORKFLOW_TITLE_MAX_LENGTH),
35362
+ description: z70.string().trim().min(1).max(SDK_WORKFLOW_DESCRIPTION_MAX_LENGTH).optional(),
35363
+ contentType: z70.string().trim().min(1).max(SDK_WORKFLOW_CONTENT_TYPE_MAX_LENGTH),
34568
35364
  endpoint: sdkWorkflowEndpointSchema2,
34569
- triggers: z69.array(sdkWorkflowTriggerSchema2).min(1).max(SDK_WORKFLOW_TRIGGER_MAX_COUNT),
35365
+ triggers: z70.array(sdkWorkflowTriggerSchema2).min(1).max(SDK_WORKFLOW_TRIGGER_MAX_COUNT),
34570
35366
  confirmation: sdkWorkflowConfirmationSchema2.optional()
34571
35367
  }).strict();
34572
- var sdkWorkflowsSchema2 = z69.array(sdkWorkflowConfigSchema2).max(SDK_WORKFLOW_MAX_COUNT, "Maximum 50 workflows per site").refine((workflows) => {
35368
+ var sdkWorkflowsSchema2 = z70.array(sdkWorkflowConfigSchema2).max(SDK_WORKFLOW_MAX_COUNT, "Maximum 50 workflows per site").refine((workflows) => {
34573
35369
  const ids = workflows.map((workflow) => workflow.id);
34574
35370
  return ids.length === new Set(ids).size;
34575
35371
  }, { message: "Workflow IDs must be unique" }).optional();
34576
- var riverbankSiteConfigSchema = z69.object({
34577
- siteId: z69.string().uuid(),
35372
+ var riverbankSiteConfigSchema = z70.object({
35373
+ siteId: z70.string().uuid(),
34578
35374
  previewUrl: sdkSiteUrlSchema.optional(),
34579
35375
  liveUrl: sdkSiteUrlSchema.optional(),
34580
35376
  theme: sdkThemeConfigSchema2.optional(),
34581
35377
  styles: siteStyleConfigSchema,
34582
35378
  layout: layoutConfigSchema.optional(),
34583
- customBlocks: z69.array(sdkCustomBlockSchema).max(100, "Maximum 100 custom blocks per site").refine(
35379
+ customBlocks: z70.array(sdkCustomBlockSchema).max(100, "Maximum 100 custom blocks per site").refine(
34584
35380
  // Ensure unique block IDs
34585
35381
  (blocks) => {
34586
35382
  const ids = blocks.map((b) => b.id);
@@ -34593,7 +35389,7 @@ var riverbankSiteConfigSchema = z69.object({
34593
35389
  workflows: sdkWorkflowsSchema2,
34594
35390
  content: contentConfigSchema.optional(),
34595
35391
  // CLI-related configuration (Phase 4)
34596
- contentDir: z69.string().optional(),
35392
+ contentDir: z70.string().optional(),
34597
35393
  sync: syncConfigSchema,
34598
35394
  deploy: deployConfigSchema,
34599
35395
  // Theme sync configuration (Phase 5)