@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
@@ -1,5 +1,5 @@
1
1
  // src/config/validation.ts
2
- import { z as z69 } from "zod";
2
+ import { z as z70 } from "zod";
3
3
 
4
4
  // ../api/src/apiEndpointTypes.ts
5
5
  function blockedDemoMutationPolicy(classification, publicMessage) {
@@ -1751,7 +1751,16 @@ var ENDPOINT_DEFINITIONS = {
1751
1751
  revalidate: 60,
1752
1752
  tags: ["site-{siteId}", "content-{siteId}-{type}"],
1753
1753
  auth: "user",
1754
- responseKind: "json"
1754
+ responseKind: "json",
1755
+ errors: ["validation:invalid_input", "resource:not_found", "resource:conflict", "server:internal_error"]
1756
+ },
1757
+ reorderContentEntries: {
1758
+ path: "/sites/{siteId}/content/{type}/order",
1759
+ method: "POST",
1760
+ tags: ["site-{siteId}", "content-{siteId}-{type}"],
1761
+ auth: "user",
1762
+ responseKind: "json",
1763
+ errors: ["validation:invalid_input", "resource:not_found", "resource:conflict", "server:internal_error"]
1755
1764
  },
1756
1765
  getContentTemplate: {
1757
1766
  path: "/sites/{siteId}/content/types/{type}/template",
@@ -3903,6 +3912,14 @@ var ENDPOINT_DEFINITIONS = {
3903
3912
  responseKind: "json",
3904
3913
  errors: []
3905
3914
  },
3915
+ applyDiscountCode: {
3916
+ path: "/public/sites/{siteId}/bookings/discounts/apply",
3917
+ method: "POST",
3918
+ tags: ["site-{siteId}", "booking-discounts"],
3919
+ auth: "public",
3920
+ responseKind: "json",
3921
+ errors: ["validation:invalid_input", "rate_limit:exceeded"]
3922
+ },
3906
3923
  // Batch endpoint for block loader requests (reduces SSR fan-out)
3907
3924
  batchBlockLoaders: {
3908
3925
  path: "/public/sites/{siteId}/block-loaders/batch",
@@ -6242,6 +6259,27 @@ var ENDPOINT_DEFINITIONS = {
6242
6259
  }
6243
6260
  };
6244
6261
 
6262
+ // ../core/src/location.ts
6263
+ function normalizeLocationAddressText(value) {
6264
+ if (typeof value !== "string") {
6265
+ return null;
6266
+ }
6267
+ const trimmed = value.trim();
6268
+ return trimmed ? trimmed : null;
6269
+ }
6270
+ function hasLocationCoordinates(value) {
6271
+ return typeof value?.lat === "number" && typeof value?.lng === "number";
6272
+ }
6273
+ function toLocationCoordinates(value) {
6274
+ if (!hasLocationCoordinates(value)) {
6275
+ return null;
6276
+ }
6277
+ return {
6278
+ lat: value.lat,
6279
+ lng: value.lng
6280
+ };
6281
+ }
6282
+
6245
6283
  // ../api/src/accessAdmin.ts
6246
6284
  import { z } from "zod";
6247
6285
  var managedDomainAddOnPricingSnapshotSchema = z.object({
@@ -6384,27 +6422,6 @@ function formatKeyAsLabel(key) {
6384
6422
  // ../blocks/src/system/manifest/schema.ts
6385
6423
  import { z as z4 } from "zod";
6386
6424
 
6387
- // ../core/src/location.ts
6388
- function normalizeLocationAddressText(value) {
6389
- if (typeof value !== "string") {
6390
- return null;
6391
- }
6392
- const trimmed = value.trim();
6393
- return trimmed ? trimmed : null;
6394
- }
6395
- function hasLocationCoordinates(value) {
6396
- return typeof value?.lat === "number" && typeof value?.lng === "number";
6397
- }
6398
- function toLocationCoordinates(value) {
6399
- if (!hasLocationCoordinates(value)) {
6400
- return null;
6401
- }
6402
- return {
6403
- lat: value.lat,
6404
- lng: value.lng
6405
- };
6406
- }
6407
-
6408
6425
  // ../media-core/src/transformRect.ts
6409
6426
  function isValidTransformRectStructure(rect) {
6410
6427
  if (!Array.isArray(rect) || rect.length !== 4) return false;
@@ -6487,14 +6504,14 @@ function rotateNormalizedPoint(point, rotation) {
6487
6504
  const x = point.x;
6488
6505
  const y = point.y;
6489
6506
  switch (rotation) {
6507
+ case 0:
6508
+ return { x, y };
6490
6509
  case 90:
6491
6510
  return { x: 1 - y, y: x };
6492
6511
  case 180:
6493
6512
  return { x: 1 - x, y: 1 - y };
6494
6513
  case 270:
6495
6514
  return { x: y, y: 1 - x };
6496
- default:
6497
- return { x, y };
6498
6515
  }
6499
6516
  }
6500
6517
 
@@ -6787,6 +6804,8 @@ var uiSchema = z4.object({
6787
6804
  mediaPickerAutoOpen: z4.boolean().optional(),
6788
6805
  showMediaPreview: z4.boolean().optional(),
6789
6806
  showMediaOverlayActions: z4.boolean().optional(),
6807
+ mediaPreviewMaxWidth: z4.enum(["xs", "sm", "md", "none"]).optional(),
6808
+ preventMediaPreviewUpscale: z4.boolean().optional(),
6790
6809
  mediaDelivery: mediaDeliverySchema.optional(),
6791
6810
  mediaDeliveryByVariant: z4.record(z4.string(), mediaDeliverySchema).optional(),
6792
6811
  // Optional input hints for validators/widgets
@@ -7036,6 +7055,9 @@ var repeaterFieldSchema = baseFieldSchema.extend({
7036
7055
  type: z4.literal("repeater"),
7037
7056
  itemLabel: z4.string().default("Item"),
7038
7057
  itemLabelSource: z4.string().optional(),
7058
+ showSummary: z4.boolean().optional(),
7059
+ summaryFields: z4.string().array().optional(),
7060
+ summaryMaxChars: z4.number().int().positive().optional(),
7039
7061
  minItems: z4.number().int().min(0).default(0),
7040
7062
  maxItems: z4.number().int().positive().optional(),
7041
7063
  // Monomorphic mode
@@ -7529,6 +7551,9 @@ function makeBoundaryId(previousBlockId, nextBlockId) {
7529
7551
  const next = encodeURIComponent(nextBlockId);
7530
7552
  return asDesignBoundaryId(`boundary:${previous}:${next}`);
7531
7553
  }
7554
+ function assertNever(value, message = "Unhandled Theme V2 variant") {
7555
+ throw new Error(`${message}: ${String(value)}`);
7556
+ }
7532
7557
  function brandNonEmptyString(value, label) {
7533
7558
  if (value.length === 0) {
7534
7559
  throw new Error(`${label} must be a non-empty string.`);
@@ -7556,6 +7581,10 @@ var tileTreatmentValues = [
7556
7581
  "quiet",
7557
7582
  "brand-depth"
7558
7583
  ];
7584
+ var eventListTreatmentValues = [
7585
+ "plain",
7586
+ "lined-panel"
7587
+ ];
7559
7588
  var eyebrowTreatmentValues = [
7560
7589
  "plain",
7561
7590
  "pill",
@@ -7613,6 +7642,7 @@ function defineBlockDesignCapability(capability) {
7613
7642
  imageSurfaceMotions: capability.imageSurfaceMotions ?? ["static"],
7614
7643
  testimonialCardTreatments: capability.testimonialCardTreatments ?? ["default"],
7615
7644
  tileTreatments: capability.tileTreatments ?? ["default"],
7645
+ eventListTreatments: capability.eventListTreatments ?? ["plain"],
7616
7646
  eyebrowTreatments: capability.eyebrowTreatments ?? ["plain"],
7617
7647
  ...capability.headingDecorations ? { headingDecorations: capability.headingDecorations } : {},
7618
7648
  ...capability.accordionIconSets ? { accordionIconSets: capability.accordionIconSets } : {}
@@ -7637,9 +7667,98 @@ var blockAppearancePresets = [
7637
7667
  transitionAfter: "soft-fade-short",
7638
7668
  emphasis: "high",
7639
7669
  sectionHeight: "hero",
7670
+ heroComposition: "center",
7671
+ heroTypographyScale: "display",
7640
7672
  imageSurfaceTreatment: { kind: "neutral-wash" }
7641
7673
  }
7642
7674
  }),
7675
+ defineBlockAppearancePreset({
7676
+ kind: "block-design",
7677
+ id: "hero-bottom-left-panel",
7678
+ target: "hero",
7679
+ label: "Bottom-left panel hero",
7680
+ blockKinds: ["block.hero"],
7681
+ constraints: {
7682
+ layoutFamilies: ["centered", "compact"]
7683
+ },
7684
+ optionGroups: [
7685
+ {
7686
+ id: "image-surface-treatment",
7687
+ label: "Treatment",
7688
+ selectedOptionId: "neutral-scrim",
7689
+ options: [
7690
+ {
7691
+ id: "neutral-scrim",
7692
+ label: "Neutral scrim",
7693
+ designPatch: {
7694
+ imageSurfaceTreatment: { kind: "neutral-scrim", intensity: "balanced" }
7695
+ }
7696
+ },
7697
+ {
7698
+ id: "brand-scrim-primary",
7699
+ label: "Brand scrim",
7700
+ designPatch: {
7701
+ imageSurfaceTreatment: { kind: "brand-scrim", token: "primary", intensity: "balanced" }
7702
+ }
7703
+ }
7704
+ ]
7705
+ }
7706
+ ],
7707
+ layoutPatches: [
7708
+ {
7709
+ constraints: {
7710
+ layoutVariantKeys: ["micro"]
7711
+ },
7712
+ designPatch: {
7713
+ sectionHeight: "banner",
7714
+ heroTypographyScale: "editorial"
7715
+ }
7716
+ }
7717
+ ],
7718
+ design: {
7719
+ sectionSurface: "hero-image",
7720
+ contentFrame: panelFrame("raised"),
7721
+ itemSurface: "none",
7722
+ transitionAfter: "soft-fade-short",
7723
+ emphasis: "high",
7724
+ sectionHeight: "immersive",
7725
+ heroComposition: "bottom-left",
7726
+ heroTypographyScale: "display",
7727
+ imageSurfaceTreatment: { kind: "neutral-scrim", intensity: "balanced" }
7728
+ }
7729
+ }),
7730
+ defineBlockAppearancePreset({
7731
+ kind: "block-design",
7732
+ id: "hero-poster-image",
7733
+ target: "hero",
7734
+ label: "Poster image hero",
7735
+ blockKinds: ["block.hero"],
7736
+ constraints: {
7737
+ layoutFamilies: ["centered", "compact"]
7738
+ },
7739
+ layoutPatches: [
7740
+ {
7741
+ constraints: {
7742
+ layoutVariantKeys: ["micro"]
7743
+ },
7744
+ designPatch: {
7745
+ sectionHeight: "banner",
7746
+ heroTypographyScale: "display"
7747
+ }
7748
+ }
7749
+ ],
7750
+ design: {
7751
+ sectionSurface: "hero-image",
7752
+ contentFrame: plainFrame,
7753
+ itemSurface: "none",
7754
+ transitionAfter: "soft-fade-short",
7755
+ emphasis: "high",
7756
+ sectionHeight: "immersive",
7757
+ heroComposition: "center",
7758
+ heroTypographyScale: "poster",
7759
+ imageSurfaceTreatment: { kind: "brand-scrim", token: "primary", intensity: "strong" }
7760
+ }
7761
+ }),
7643
7762
  defineBlockAppearancePreset({
7644
7763
  kind: "block-design",
7645
7764
  id: "hero-brand-scrim",
@@ -7689,6 +7808,8 @@ var blockAppearancePresets = [
7689
7808
  transitionAfter: "soft-fade-short",
7690
7809
  emphasis: "high",
7691
7810
  sectionHeight: "immersive",
7811
+ heroComposition: "center",
7812
+ heroTypographyScale: "display",
7692
7813
  imageSurfaceTreatment: { kind: "brand-scrim", token: "primary" }
7693
7814
  }
7694
7815
  }),
@@ -7741,6 +7862,8 @@ var blockAppearancePresets = [
7741
7862
  transitionAfter: "soft-fade-short",
7742
7863
  emphasis: "high",
7743
7864
  sectionHeight: "immersive",
7865
+ heroComposition: "center",
7866
+ heroTypographyScale: "display",
7744
7867
  imageSurfaceTreatment: { kind: "brand-scrim", token: "primary" },
7745
7868
  imageSurfaceMotion: "fixed-frame",
7746
7869
  eyebrowTreatment: "accent-pill-bounce"
@@ -7761,6 +7884,8 @@ var blockAppearancePresets = [
7761
7884
  itemSurface: "none",
7762
7885
  transitionAfter: "soft-fade-short",
7763
7886
  emphasis: "high",
7887
+ heroComposition: "center",
7888
+ heroTypographyScale: "editorial",
7764
7889
  eyebrowTreatment: "accent-pill-bounce"
7765
7890
  }
7766
7891
  }),
@@ -7775,7 +7900,82 @@ var blockAppearancePresets = [
7775
7900
  contentFrame: panelFrame("inset"),
7776
7901
  itemSurface: "none",
7777
7902
  transitionAfter: "none",
7778
- emphasis: "high"
7903
+ emphasis: "high",
7904
+ heroComposition: "center",
7905
+ heroTypographyScale: "editorial"
7906
+ }
7907
+ }),
7908
+ defineBlockAppearancePreset({
7909
+ kind: "block-design",
7910
+ id: "hero-split-editorial",
7911
+ target: "hero",
7912
+ label: "Editorial split hero",
7913
+ blockKinds: ["block.hero"],
7914
+ constraints: {
7915
+ layoutFamilies: ["split"]
7916
+ },
7917
+ design: {
7918
+ sectionSurface: "base",
7919
+ contentFrame: plainFrame,
7920
+ itemSurface: "none",
7921
+ transitionAfter: "soft-fade-short",
7922
+ emphasis: "high",
7923
+ heroTypographyScale: "editorial"
7924
+ }
7925
+ }),
7926
+ defineBlockAppearancePreset({
7927
+ kind: "block-design",
7928
+ id: "hero-split-brand",
7929
+ target: "hero",
7930
+ label: "Brand split hero",
7931
+ blockKinds: ["block.hero"],
7932
+ constraints: {
7933
+ layoutFamilies: ["split"]
7934
+ },
7935
+ design: {
7936
+ sectionSurface: "brand-depth-band",
7937
+ contentFrame: plainFrame,
7938
+ itemSurface: "none",
7939
+ transitionAfter: "soft-fade-short",
7940
+ emphasis: "high",
7941
+ heroTypographyScale: "display",
7942
+ eyebrowTreatment: "accent-pill-bounce"
7943
+ }
7944
+ }),
7945
+ defineBlockAppearancePreset({
7946
+ kind: "block-design",
7947
+ id: "hero-split-soft-panel",
7948
+ target: "hero",
7949
+ label: "Soft panel split hero",
7950
+ blockKinds: ["block.hero"],
7951
+ constraints: {
7952
+ layoutFamilies: ["split"]
7953
+ },
7954
+ design: {
7955
+ sectionSurface: "muted-band",
7956
+ contentFrame: panelFrame("raised"),
7957
+ itemSurface: "none",
7958
+ transitionAfter: "soft-fade-short",
7959
+ emphasis: "high",
7960
+ heroTypographyScale: "editorial"
7961
+ }
7962
+ }),
7963
+ defineBlockAppearancePreset({
7964
+ kind: "block-design",
7965
+ id: "hero-split-accent",
7966
+ target: "hero",
7967
+ label: "Accent split hero",
7968
+ blockKinds: ["block.hero"],
7969
+ constraints: {
7970
+ layoutFamilies: ["split"]
7971
+ },
7972
+ design: {
7973
+ sectionSurface: "accent-band",
7974
+ contentFrame: panelFrame("raised"),
7975
+ itemSurface: "none",
7976
+ transitionAfter: "soft-fade-short",
7977
+ emphasis: "high",
7978
+ heroTypographyScale: "display"
7779
7979
  }
7780
7980
  }),
7781
7981
  defineBlockAppearancePreset({
@@ -7808,9 +8008,9 @@ var blockAppearancePresets = [
7808
8008
  }),
7809
8009
  defineBlockAppearancePreset({
7810
8010
  kind: "block-design",
7811
- id: "intro-soft-earth-statement",
8011
+ id: "intro-organic-statement",
7812
8012
  target: "intro",
7813
- label: "Soft Earth intro statement",
8013
+ label: "Organic intro statement",
7814
8014
  blockKinds: ["block.intro"],
7815
8015
  design: {
7816
8016
  sectionSurface: "base",
@@ -7841,9 +8041,9 @@ var blockAppearancePresets = [
7841
8041
  }),
7842
8042
  defineBlockAppearancePreset({
7843
8043
  kind: "block-design",
7844
- id: "feature-cards-soft-earth-offerings",
8044
+ id: "feature-cards-raised-rule",
7845
8045
  target: "feature-cards",
7846
- label: "Soft Earth offering cards",
8046
+ label: "Raised cards with rule",
7847
8047
  blockKinds: ["block.feature-cards"],
7848
8048
  design: {
7849
8049
  sectionSurface: "base",
@@ -7872,6 +8072,21 @@ var blockAppearancePresets = [
7872
8072
  emphasis: "medium"
7873
8073
  }
7874
8074
  }),
8075
+ defineBlockAppearancePreset({
8076
+ kind: "block-design",
8077
+ id: "events-lined-panel",
8078
+ target: "events",
8079
+ label: "Lined event panel",
8080
+ blockKinds: ["block.event-calendar", "block.event-listing"],
8081
+ design: {
8082
+ sectionSurface: "base",
8083
+ contentFrame: plainFrame,
8084
+ itemSurface: "none",
8085
+ transitionAfter: "none",
8086
+ emphasis: "medium",
8087
+ eventListTreatment: "lined-panel"
8088
+ }
8089
+ }),
7875
8090
  defineBlockAppearancePreset({
7876
8091
  kind: "block-design",
7877
8092
  id: "schedule-details-accent-section",
@@ -7931,9 +8146,9 @@ var blockAppearancePresets = [
7931
8146
  }),
7932
8147
  defineBlockAppearancePreset({
7933
8148
  kind: "block-design",
7934
- id: "testimonials-carded-proof",
8149
+ id: "testimonials-simple-cards",
7935
8150
  target: "testimonials",
7936
- label: "Carded social proof",
8151
+ label: "Simple testimonial cards",
7937
8152
  blockKinds: ["block.testimonials"],
7938
8153
  design: {
7939
8154
  sectionSurface: "base",
@@ -7945,9 +8160,9 @@ var blockAppearancePresets = [
7945
8160
  }),
7946
8161
  defineBlockAppearancePreset({
7947
8162
  kind: "block-design",
7948
- id: "testimonials-contained-proof",
8163
+ id: "testimonials-raised-panel",
7949
8164
  target: "testimonials",
7950
- label: "Contained social proof",
8165
+ label: "Raised testimonial panel",
7951
8166
  blockKinds: ["block.testimonials"],
7952
8167
  design: {
7953
8168
  sectionSurface: "muted-band",
@@ -7959,9 +8174,9 @@ var blockAppearancePresets = [
7959
8174
  }),
7960
8175
  defineBlockAppearancePreset({
7961
8176
  kind: "block-design",
7962
- id: "testimonials-dark-proof",
8177
+ id: "testimonials-accent-panel",
7963
8178
  target: "testimonials",
7964
- label: "Dark proof panel",
8179
+ label: "Accent testimonial panel",
7965
8180
  blockKinds: ["block.testimonials"],
7966
8181
  design: {
7967
8182
  sectionSurface: "accent-band",
@@ -7973,9 +8188,9 @@ var blockAppearancePresets = [
7973
8188
  }),
7974
8189
  defineBlockAppearancePreset({
7975
8190
  kind: "block-design",
7976
- id: "testimonials-accent-quote-proof",
8191
+ id: "testimonials-accent-quote-cards",
7977
8192
  target: "testimonials",
7978
- label: "Accent quote proof",
8193
+ label: "Accent quote cards",
7979
8194
  blockKinds: ["block.testimonials"],
7980
8195
  design: {
7981
8196
  sectionSurface: "accent-band",
@@ -7988,9 +8203,9 @@ var blockAppearancePresets = [
7988
8203
  }),
7989
8204
  defineBlockAppearancePreset({
7990
8205
  kind: "block-design",
7991
- id: "testimonials-soft-earth-proof-band",
8206
+ id: "testimonials-brand-background-quotes",
7992
8207
  target: "testimonials",
7993
- label: "Soft Earth proof band",
8208
+ label: "Brand background quotes",
7994
8209
  blockKinds: ["block.testimonials"],
7995
8210
  design: {
7996
8211
  sectionSurface: "brand-depth-band",
@@ -8034,25 +8249,6 @@ var blockAppearancePresets = [
8034
8249
  emphasis: "low"
8035
8250
  }
8036
8251
  }),
8037
- defineBlockAppearancePreset({
8038
- kind: "block-design",
8039
- id: "faq-soft-earth-two-column",
8040
- target: "faq",
8041
- label: "Soft Earth two-column FAQ",
8042
- blockKinds: ["block.faq"],
8043
- design: {
8044
- sectionSurface: "base",
8045
- contentFrame: plainFrame,
8046
- itemSurface: "flat",
8047
- transitionAfter: "none",
8048
- emphasis: "medium",
8049
- accordionIconTreatment: {
8050
- iconSet: "plus",
8051
- colorToken: "primary",
8052
- motion: "swap"
8053
- }
8054
- }
8055
- }),
8056
8252
  defineBlockAppearancePreset({
8057
8253
  kind: "block-design",
8058
8254
  id: "contact-form-panel",
@@ -9431,7 +9627,8 @@ var accordionSystemSchema = z12.object({
9431
9627
  icon: z12.object({
9432
9628
  style: accordionIconSchema,
9433
9629
  position: z12.enum(["left", "right"]),
9434
- size: z12.enum(["sm", "md", "lg"])
9630
+ size: z12.enum(["sm", "md", "lg"]),
9631
+ colorToken: themeColorTokenSchema.optional()
9435
9632
  }),
9436
9633
  // Trigger (question) styling
9437
9634
  trigger: z12.object({
@@ -9565,6 +9762,7 @@ var navLinkPaddingXSchema = z16.enum(["none", "tight", "compact", "default", "re
9565
9762
  var navLinkBorderRadiusSchema = z16.enum(["none", "sm", "md", "full"]);
9566
9763
  var navLinkTextSizeSchema = z16.enum(["xs", "sm", "base", "lg"]);
9567
9764
  var navLinkLetterSpacingSchema = z16.enum(["normal", "wide", "wider", "widest"]);
9765
+ var navLinkContrastTreatmentSchema = z16.enum(["none", "soft-glow"]);
9568
9766
  var navLinkStyleSchema = z16.object({
9569
9767
  /** Display name for the style */
9570
9768
  name: z16.string().min(1).max(30).optional(),
@@ -9576,6 +9774,8 @@ var navLinkStyleSchema = z16.object({
9576
9774
  textSize: navLinkTextSizeSchema.optional(),
9577
9775
  /** Optional letter spacing override */
9578
9776
  letterSpacing: navLinkLetterSpacingSchema.optional(),
9777
+ /** Optional text-only contrast treatment for transparent/overlay navigation */
9778
+ contrastTreatment: navLinkContrastTreatmentSchema.optional(),
9579
9779
  /** Hover/active color token (for color-change effects) */
9580
9780
  hoverColorToken: themeColorTokenSchema.nullable().optional(),
9581
9781
  /** Padding preset */
@@ -10005,6 +10205,7 @@ var sectionStylesOverrideSchema = z21.object({
10005
10205
  spacing: semanticSpacingSchema.nullable().optional(),
10006
10206
  minHeight: z21.enum(["none", "banner", "hero", "immersive"]).nullable().optional(),
10007
10207
  tileTreatment: z21.enum(tileTreatmentValues).nullable().optional(),
10208
+ eventListTreatment: z21.enum(eventListTreatmentValues).nullable().optional(),
10008
10209
  eyebrowTreatment: z21.enum(eyebrowTreatmentValues).nullable().optional(),
10009
10210
  headingDecoration: headingDecorationSchema.nullable().optional(),
10010
10211
  // Author-level override consumed by later block/editor rendering phases.
@@ -10838,6 +11039,34 @@ var paletteVariantsById = new Map(
10838
11039
  paletteVariants.map((v) => [v.id, v])
10839
11040
  );
10840
11041
 
11042
+ // ../theme-core/src/accordions/siteStyleDefaults.ts
11043
+ var softEarthAccordionSystem = {
11044
+ background: {
11045
+ type: "solid",
11046
+ colorToken: "background"
11047
+ },
11048
+ spacing: "comfortable",
11049
+ corners: "square",
11050
+ border: null,
11051
+ shadow: null,
11052
+ icon: {
11053
+ style: "plus-minus",
11054
+ position: "right",
11055
+ size: "md",
11056
+ colorToken: "primary"
11057
+ },
11058
+ trigger: {
11059
+ textColorToken: "text",
11060
+ fontWeight: "medium"
11061
+ },
11062
+ hover: {
11063
+ textColorToken: "primary"
11064
+ },
11065
+ content: {
11066
+ textColorToken: "neutral-700"
11067
+ }
11068
+ };
11069
+
10841
11070
  // ../theme-core/src/site-styles/headerLooks.ts
10842
11071
  function asHeaderLookId(value) {
10843
11072
  return value;
@@ -10893,7 +11122,7 @@ var headerLayoutCatalog = [
10893
11122
  description: "Detached header chrome that sits over the opening section.",
10894
11123
  structure: "floating-shell",
10895
11124
  variant: "floating",
10896
- defaultPositioning: "fixed",
11125
+ defaultPositioning: "sticky",
10897
11126
  shrinkOnScroll: true,
10898
11127
  maxRecommendedNavItems: 5,
10899
11128
  allowedLogoShapes: ["none", "text-only", "horizontal"]
@@ -10910,7 +11139,9 @@ var headerStyleCatalog = [
10910
11139
  supportedLayoutIds: supportedLayouts(["classic", "centered"]),
10911
11140
  navInteraction: "color-change",
10912
11141
  surface: "neutral",
10913
- navTypography: "plain"
11142
+ defaultDepth: "none",
11143
+ navTypography: "plain",
11144
+ moods: ["calm", "professional", "editorial"]
10914
11145
  },
10915
11146
  {
10916
11147
  id: asHeaderStyleId("fine-line"),
@@ -10919,7 +11150,9 @@ var headerStyleCatalog = [
10919
11150
  supportedLayoutIds: supportedLayouts(["classic", "centered"]),
10920
11151
  navInteraction: "underline-grow",
10921
11152
  surface: "bordered",
10922
- navTypography: "plain"
11153
+ defaultDepth: "line",
11154
+ navTypography: "plain",
11155
+ moods: ["calm", "professional", "editorial"]
10923
11156
  },
10924
11157
  {
10925
11158
  id: asHeaderStyleId("soft-bar"),
@@ -10928,7 +11161,9 @@ var headerStyleCatalog = [
10928
11161
  supportedLayoutIds: supportedLayouts(["classic", "centered"]),
10929
11162
  navInteraction: "pill-background",
10930
11163
  surface: "soft",
10931
- navTypography: "plain"
11164
+ defaultDepth: "line",
11165
+ navTypography: "plain",
11166
+ moods: ["calm", "professional"]
10932
11167
  },
10933
11168
  {
10934
11169
  id: asHeaderStyleId("pill-nav"),
@@ -10937,7 +11172,9 @@ var headerStyleCatalog = [
10937
11172
  supportedLayoutIds: supportedLayouts(["classic", "centered"]),
10938
11173
  navInteraction: "pill-background",
10939
11174
  surface: "soft",
10940
- navTypography: "plain"
11175
+ defaultDepth: "none",
11176
+ navTypography: "plain",
11177
+ moods: ["calm"]
10941
11178
  },
10942
11179
  {
10943
11180
  id: asHeaderStyleId("brand-bar"),
@@ -10946,7 +11183,9 @@ var headerStyleCatalog = [
10946
11183
  supportedLayoutIds: supportedLayouts(["classic", "centered"]),
10947
11184
  navInteraction: "color-change",
10948
11185
  surface: "brand-solid",
10949
- navTypography: "brand-caps"
11186
+ defaultDepth: "none",
11187
+ navTypography: "brand-caps",
11188
+ moods: ["professional", "expressive", "utility"]
10950
11189
  },
10951
11190
  {
10952
11191
  id: asHeaderStyleId("brand-underline"),
@@ -10955,7 +11194,9 @@ var headerStyleCatalog = [
10955
11194
  supportedLayoutIds: supportedLayouts(["classic"]),
10956
11195
  navInteraction: "underline-grow",
10957
11196
  surface: "brand-solid",
10958
- navTypography: "brand-caps"
11197
+ defaultDepth: "none",
11198
+ navTypography: "brand-caps",
11199
+ moods: ["expressive"]
10959
11200
  },
10960
11201
  {
10961
11202
  id: asHeaderStyleId("brand-pill"),
@@ -10964,7 +11205,9 @@ var headerStyleCatalog = [
10964
11205
  supportedLayoutIds: supportedLayouts(["classic", "centered", "floating"]),
10965
11206
  navInteraction: "pill-background",
10966
11207
  surface: "brand-solid",
10967
- navTypography: "brand-caps"
11208
+ defaultDepth: "none",
11209
+ navTypography: "brand-caps",
11210
+ moods: ["expressive"]
10968
11211
  },
10969
11212
  {
10970
11213
  id: asHeaderStyleId("serif-line"),
@@ -10973,7 +11216,9 @@ var headerStyleCatalog = [
10973
11216
  supportedLayoutIds: supportedLayouts(["classic", "centered"]),
10974
11217
  navInteraction: "underline-grow",
10975
11218
  surface: "bordered",
10976
- navTypography: "heading"
11219
+ defaultDepth: "line",
11220
+ navTypography: "heading",
11221
+ moods: ["editorial", "calm"]
10977
11222
  },
10978
11223
  {
10979
11224
  id: asHeaderStyleId("flat-tabs"),
@@ -10982,16 +11227,20 @@ var headerStyleCatalog = [
10982
11227
  supportedLayoutIds: supportedLayouts(["classic", "centered"]),
10983
11228
  navInteraction: "flat-block",
10984
11229
  surface: "bordered",
10985
- navTypography: "quiet-caps"
11230
+ defaultDepth: "shadow",
11231
+ navTypography: "quiet-caps",
11232
+ moods: ["professional", "utility", "expressive"]
10986
11233
  },
10987
11234
  {
10988
11235
  id: asHeaderStyleId("glass"),
10989
11236
  label: "Glass",
10990
11237
  description: "Translucent chrome with frosted navigation backing.",
10991
- supportedLayoutIds: supportedLayouts(["classic", "floating"]),
11238
+ supportedLayoutIds: supportedLayouts(["floating"]),
10992
11239
  navInteraction: "glass-backed",
10993
11240
  surface: "floating",
10994
- navTypography: "plain"
11241
+ defaultDepth: "shadow",
11242
+ navTypography: "plain",
11243
+ moods: ["expressive", "calm"]
10995
11244
  },
10996
11245
  {
10997
11246
  id: asHeaderStyleId("minimal-surface"),
@@ -11000,7 +11249,9 @@ var headerStyleCatalog = [
11000
11249
  supportedLayoutIds: supportedLayouts(["floating"]),
11001
11250
  navInteraction: "color-change",
11002
11251
  surface: "floating",
11003
- navTypography: "plain"
11252
+ defaultDepth: "none",
11253
+ navTypography: "plain",
11254
+ moods: ["editorial", "calm"]
11004
11255
  },
11005
11256
  {
11006
11257
  id: asHeaderStyleId("soft-shell"),
@@ -11009,7 +11260,9 @@ var headerStyleCatalog = [
11009
11260
  supportedLayoutIds: supportedLayouts(["floating"]),
11010
11261
  navInteraction: "pill-background",
11011
11262
  surface: "floating",
11012
- navTypography: "plain"
11263
+ defaultDepth: "shadow",
11264
+ navTypography: "plain",
11265
+ moods: ["calm", "professional"]
11013
11266
  },
11014
11267
  {
11015
11268
  id: asHeaderStyleId("split-glass"),
@@ -11018,7 +11271,9 @@ var headerStyleCatalog = [
11018
11271
  supportedLayoutIds: supportedLayouts(["floating"]),
11019
11272
  navInteraction: "glass-backed",
11020
11273
  surface: "floating",
11021
- navTypography: "quiet-caps"
11274
+ defaultDepth: "shadow",
11275
+ navTypography: "quiet-caps",
11276
+ moods: ["expressive"]
11022
11277
  },
11023
11278
  {
11024
11279
  id: asHeaderStyleId("split-pill"),
@@ -11027,7 +11282,9 @@ var headerStyleCatalog = [
11027
11282
  supportedLayoutIds: supportedLayouts(["floating"]),
11028
11283
  navInteraction: "pill-background",
11029
11284
  surface: "floating",
11030
- navTypography: "heading"
11285
+ defaultDepth: "shadow",
11286
+ navTypography: "heading",
11287
+ moods: ["calm", "editorial"]
11031
11288
  }
11032
11289
  ];
11033
11290
  var headerLayoutsById = new Map(
@@ -11041,7 +11298,6 @@ var headerStyleCompatibilityOrder = /* @__PURE__ */ new Map([
11041
11298
  asHeaderLayoutId("classic"),
11042
11299
  headerStyleRepairChain([
11043
11300
  "minimal",
11044
- "glass",
11045
11301
  "fine-line",
11046
11302
  "soft-bar",
11047
11303
  "pill-nav",
@@ -11108,7 +11364,13 @@ var headerStyleRepairOrder = /* @__PURE__ */ new Map(
11108
11364
  ],
11109
11365
  [
11110
11366
  asHeaderStyleId("glass"),
11111
- headerStyleRepairChain(["glass", "minimal-surface", "minimal"])
11367
+ headerStyleRepairChain([
11368
+ "glass",
11369
+ "soft-shell",
11370
+ "fine-line",
11371
+ "minimal-surface",
11372
+ "minimal"
11373
+ ])
11112
11374
  ],
11113
11375
  [
11114
11376
  asHeaderStyleId("soft-shell"),
@@ -11220,6 +11482,23 @@ function getCompatibleHeaderStyleIds(layoutId) {
11220
11482
  }
11221
11483
  );
11222
11484
  }
11485
+ function themedHeaderShadow(theme) {
11486
+ switch (theme.shadow.elevation) {
11487
+ case "none":
11488
+ return void 0;
11489
+ case "low":
11490
+ return { elevation: "sm" };
11491
+ case "medium":
11492
+ return { elevation: "md" };
11493
+ case "high":
11494
+ return { elevation: "lg" };
11495
+ default:
11496
+ return assertNever(
11497
+ theme.shadow.elevation,
11498
+ "Unhandled theme shadow elevation"
11499
+ );
11500
+ }
11501
+ }
11223
11502
  function solidBrandHeader(theme) {
11224
11503
  const ctaVariant = resolveHeaderCtaVariant(theme, "inverted");
11225
11504
  return {
@@ -11369,9 +11648,7 @@ function practicalUtilityHeader(theme) {
11369
11648
  navColor: "text",
11370
11649
  navStyle: "solid",
11371
11650
  navWeight: "semibold",
11372
- shadow: {
11373
- elevation: "sm"
11374
- },
11651
+ shadow: themedHeaderShadow(theme),
11375
11652
  border: {
11376
11653
  style: "solid",
11377
11654
  width: "thin",
@@ -11440,6 +11717,7 @@ function floatingGlassHeader(theme) {
11440
11717
  return {
11441
11718
  ...transparentOverlayHeader(theme),
11442
11719
  variant: "floating",
11720
+ positioning: "sticky",
11443
11721
  navStyle: "frosted",
11444
11722
  navContainer: {
11445
11723
  type: "glass",
@@ -11955,7 +12233,7 @@ var typographyPresets = [
11955
12233
  heroTypography: {
11956
12234
  headlineSize: "6xl",
11957
12235
  headlineLineHeight: "tight",
11958
- subheadlineSize: "editorial",
12236
+ subheadlineSize: "2xl",
11959
12237
  subheadlineLineHeight: "normal",
11960
12238
  microHeadlineSize: "6xl",
11961
12239
  microHeadlineLineHeight: "tight",
@@ -11973,6 +12251,8 @@ var typographyPresetsById = new Map(
11973
12251
  );
11974
12252
 
11975
12253
  // ../theme-core/src/site-styles/curatedSiteStyles.ts
12254
+ var SOFT_EARTH_SITE_STYLE_ID_VALUE = "site-style:soft-earth";
12255
+ var SOFT_EARTH_SITE_STYLE_ID = asSiteStyleId(SOFT_EARTH_SITE_STYLE_ID_VALUE);
11976
12256
  var curatedSiteStyleIdValues = [
11977
12257
  "site-style:calm-studio",
11978
12258
  "site-style:clear-professional",
@@ -11984,7 +12264,7 @@ var curatedSiteStyleIdValues = [
11984
12264
  "site-style:personal-retreat-journal",
11985
12265
  "site-style:tactile-workshop",
11986
12266
  "site-style:modern-wellness",
11987
- "site-style:soft-earth",
12267
+ SOFT_EARTH_SITE_STYLE_ID_VALUE,
11988
12268
  "site-style:bold-launch",
11989
12269
  "site-style:south-west-twerk-school"
11990
12270
  ];
@@ -12066,7 +12346,10 @@ function uniqueContentFrameKinds() {
12066
12346
  var generatedContentFrameKinds = uniqueContentFrameKinds();
12067
12347
  function defineCuratedSiteStyle(input) {
12068
12348
  const legacyHeaderLookIds = input.recommendedHeaderLookIds ?? ["clean-base"];
12069
- const inferredHeaderCuration = inferHeaderCurationFromLegacyLooks(legacyHeaderLookIds);
12349
+ const inferredHeaderCuration = inferHeaderCurationFromLegacyLooks(
12350
+ legacyHeaderLookIds,
12351
+ input.tokenRecipes
12352
+ );
12070
12353
  const typographyPresetChoices = input.typographyPresetChoices ?? defaultTypographyPresetChoicesForRecipe(input.tokenRecipes.typography);
12071
12354
  const defaultTypographyPresetId = input.defaultTypographyPresetId ? asTypographyPresetId(input.defaultTypographyPresetId) : typographyPresetChoices[0].id;
12072
12355
  if (!typographyPresetChoices.some(
@@ -12099,6 +12382,7 @@ function defineCuratedSiteStyle(input) {
12099
12382
  supportedTransitions: generatedDesignOptionCatalog.transitions
12100
12383
  },
12101
12384
  ...input.themeOverrides ? { themeOverrides: input.themeOverrides } : {},
12385
+ ...input.defaultBlockVariants ? { defaultBlockVariants: input.defaultBlockVariants } : {},
12102
12386
  recommendedAppearancePresetIds: (input.recommendedAppearancePresetIds ?? []).map(asAppearancePresetId),
12103
12387
  defaultHeaderSelection: input.defaultHeaderSelection ? {
12104
12388
  layoutId: asHeaderLayoutId(input.defaultHeaderSelection.layoutId),
@@ -12157,7 +12441,69 @@ function nonEmptyHeaderStyleChoices(choices, fallbackLayoutId) {
12157
12441
  };
12158
12442
  return [first, ...choices.slice(1)];
12159
12443
  }
12160
- function inferHeaderCurationFromLegacyLooks(lookIds) {
12444
+ function uniqueCompatibleHeaderStyleChoices(choices, fallbackLayoutId) {
12445
+ const compatible = new Set(getCompatibleHeaderStyleIds(fallbackLayoutId));
12446
+ const seen = /* @__PURE__ */ new Set();
12447
+ const unique = choices.filter((choice) => {
12448
+ if (!compatible.has(choice.id)) return false;
12449
+ if (seen.has(choice.id)) return false;
12450
+ seen.add(choice.id);
12451
+ return true;
12452
+ });
12453
+ return nonEmptyHeaderStyleChoices(unique, fallbackLayoutId);
12454
+ }
12455
+ function inferredHeaderStyleValuesForRecipes(layoutId, recipes) {
12456
+ switch (layoutId) {
12457
+ case "classic":
12458
+ if (isExpressiveRecipe(recipes)) {
12459
+ return [
12460
+ "brand-bar",
12461
+ "brand-underline",
12462
+ "flat-tabs",
12463
+ "brand-pill",
12464
+ "fine-line"
12465
+ ];
12466
+ }
12467
+ if (recipes.spacing === "compact") {
12468
+ return ["flat-tabs", "fine-line", "minimal", "brand-bar"];
12469
+ }
12470
+ if (isSerifTypographyRecipe(recipes)) {
12471
+ return ["serif-line", "fine-line", "minimal", "soft-bar"];
12472
+ }
12473
+ if (recipes.radius === "rounded" || recipes.radius === "pill") {
12474
+ return ["soft-bar", "pill-nav", "fine-line", "minimal"];
12475
+ }
12476
+ return ["fine-line", "minimal", "soft-bar", "brand-bar"];
12477
+ case "centered":
12478
+ if (isSerifTypographyRecipe(recipes)) {
12479
+ return ["serif-line", "fine-line", "minimal", "soft-bar"];
12480
+ }
12481
+ if (isExpressiveRecipe(recipes)) {
12482
+ return ["brand-pill", "flat-tabs", "brand-bar", "fine-line"];
12483
+ }
12484
+ if (recipes.radius === "rounded" || recipes.radius === "pill") {
12485
+ return ["soft-bar", "pill-nav", "fine-line", "minimal"];
12486
+ }
12487
+ return ["minimal", "fine-line", "soft-bar"];
12488
+ case "floating":
12489
+ if (isExpressiveRecipe(recipes)) {
12490
+ return ["glass", "split-glass", "brand-pill", "soft-shell"];
12491
+ }
12492
+ if (isSerifTypographyRecipe(recipes)) {
12493
+ return ["split-pill", "minimal-surface", "soft-shell"];
12494
+ }
12495
+ return ["soft-shell", "minimal-surface", "glass"];
12496
+ default:
12497
+ return [];
12498
+ }
12499
+ }
12500
+ function isExpressiveRecipe(recipes) {
12501
+ return recipes.contrast === "maximum" || recipes.shadow === "layered" || recipes.motion === "expressive";
12502
+ }
12503
+ function isSerifTypographyRecipe(recipes) {
12504
+ return recipes.typography === "serif-editorial" || recipes.typography === "classic-serif";
12505
+ }
12506
+ function inferHeaderCurationFromLegacyLooks(lookIds, recipes) {
12161
12507
  const selections = lookIds.map((lookId) => resolveLegacyHeaderLookAlias(asHeaderLookId(lookId))).filter(
12162
12508
  (selection) => Boolean(selection)
12163
12509
  );
@@ -12170,8 +12516,15 @@ function inferHeaderCurationFromLegacyLooks(lookIds) {
12170
12516
  );
12171
12517
  const stylesByLayout = {};
12172
12518
  for (const layoutChoice of layoutChoices) {
12173
- const styleChoices = selections.filter((selection) => selection.layoutId === layoutChoice.id).map((selection) => headerStyleChoice(selection.styleId));
12174
- stylesByLayout[unbrandHeaderLayoutId(layoutChoice.id)] = nonEmptyHeaderStyleChoices(styleChoices, layoutChoice.id);
12519
+ const legacyStyleChoices = selections.filter((selection) => selection.layoutId === layoutChoice.id).map((selection) => headerStyleChoice(selection.styleId));
12520
+ const inferredStyleChoices = inferredHeaderStyleValuesForRecipes(
12521
+ layoutChoice.id,
12522
+ recipes
12523
+ ).map((styleId) => headerStyleChoice(styleId));
12524
+ stylesByLayout[unbrandHeaderLayoutId(layoutChoice.id)] = uniqueCompatibleHeaderStyleChoices(
12525
+ [...legacyStyleChoices, ...inferredStyleChoices],
12526
+ layoutChoice.id
12527
+ );
12175
12528
  }
12176
12529
  return {
12177
12530
  defaultHeaderSelection,
@@ -12591,10 +12944,10 @@ var curatedSiteStyles = [
12591
12944
  ]
12592
12945
  }),
12593
12946
  defineCuratedSiteStyle({
12594
- id: "site-style:soft-earth",
12947
+ id: SOFT_EARTH_SITE_STYLE_ID,
12595
12948
  name: "Soft Earth",
12596
12949
  description: "Warm, grounded, and editorial for yoga studios, retreats, and wellbeing communities.",
12597
- 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.",
12950
+ 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.",
12598
12951
  siteCreatorSelection: {
12599
12952
  kind: "site_creator_keyword_heuristic",
12600
12953
  priority: 45
@@ -12664,14 +13017,18 @@ var curatedSiteStyles = [
12664
13017
  paragraphSize: "default",
12665
13018
  headingSize: "editorial"
12666
13019
  }
12667
- }
13020
+ },
13021
+ accordions: softEarthAccordionSystem
13022
+ },
13023
+ defaultBlockVariants: {
13024
+ "block.faq": "question-columns"
12668
13025
  },
12669
13026
  recommendedAppearancePresetIds: [
12670
13027
  "hero-brand-scrim",
12671
- "intro-soft-earth-statement",
12672
- "feature-cards-soft-earth-offerings",
12673
- "testimonials-soft-earth-proof-band",
12674
- "faq-soft-earth-two-column",
13028
+ "intro-organic-statement",
13029
+ "feature-cards-raised-rule",
13030
+ "events-lined-panel",
13031
+ "testimonials-brand-background-quotes",
12675
13032
  "contact-form-panel"
12676
13033
  ],
12677
13034
  recommendedHeaderLookIds: [
@@ -12775,7 +13132,7 @@ var curatedSiteStyles = [
12775
13132
  "hero-brand-scrim-fixed-frame",
12776
13133
  "body-text-editorial-intro",
12777
13134
  "schedule-details-brand-depth",
12778
- "testimonials-accent-quote-proof",
13135
+ "testimonials-accent-quote-cards",
12779
13136
  "contact-form-brand-depth-card"
12780
13137
  ],
12781
13138
  recommendedHeaderLookIds: [
@@ -12870,6 +13227,7 @@ var themeV2RuntimeStyleFieldNames = [
12870
13227
  ];
12871
13228
  var themeV2BlockSpecificRawStyleFieldNames = [
12872
13229
  "_contentCardStyles",
13230
+ "_heroLayoutStyles",
12873
13231
  "_textCardStyles"
12874
13232
  ];
12875
13233
  var themeV2NormalEditorRawStyleFieldNames = [
@@ -12879,6 +13237,10 @@ var themeV2NormalEditorRawStyleFieldNames = [
12879
13237
  var themeV2NormalEditorRawStyleFieldNameSet = new Set(
12880
13238
  themeV2NormalEditorRawStyleFieldNames
12881
13239
  );
13240
+ var themeV2CompilerOwnedFieldNames = [
13241
+ ...themeV2RuntimeStyleFieldNames,
13242
+ ...themeV2BlockSpecificRawStyleFieldNames
13243
+ ];
12882
13244
 
12883
13245
  // ../theme-core/src/site-styles/designState.ts
12884
13246
  var themeV2DesignStateSchemaVersion = 1;
@@ -12893,6 +13255,16 @@ var heroLegibilityStrategySchema = z23.enum([
12893
13255
  "scrim-gradient",
12894
13256
  "solid-panel"
12895
13257
  ]);
13258
+ var heroCompositionIntentSchema = z23.enum([
13259
+ "center",
13260
+ "bottom-left"
13261
+ ]);
13262
+ var heroTypographyScaleIntentSchema = z23.enum([
13263
+ "quiet",
13264
+ "editorial",
13265
+ "display",
13266
+ "poster"
13267
+ ]);
12896
13268
  var sectionHeightIntentSchema = z23.enum([
12897
13269
  "default",
12898
13270
  "banner",
@@ -12928,6 +13300,7 @@ var imageSurfaceTreatmentSchema = z23.discriminatedUnion("kind", [
12928
13300
  ]);
12929
13301
  var testimonialCardTreatmentSchema = z23.enum(["default", "accent-quote"]);
12930
13302
  var tileTreatmentSchema = z23.enum(tileTreatmentValues);
13303
+ var eventListTreatmentSchema = z23.enum(eventListTreatmentValues);
12931
13304
  var eyebrowTreatmentSchema = z23.enum(eyebrowTreatmentValues);
12932
13305
  function uniqueNonEmpty(values) {
12933
13306
  const uniqueValues = [...new Set(values)];
@@ -12969,10 +13342,13 @@ var blockDesignPlanSchema = z23.object({
12969
13342
  emphasis: z23.enum(userDesignOptionCatalog.emphases),
12970
13343
  sectionHeight: sectionHeightIntentSchema.optional(),
12971
13344
  heroLegibility: heroLegibilityStrategySchema.optional(),
13345
+ heroComposition: heroCompositionIntentSchema.optional(),
13346
+ heroTypographyScale: heroTypographyScaleIntentSchema.optional(),
12972
13347
  imageSurfaceTreatment: imageSurfaceTreatmentSchema.optional(),
12973
13348
  imageSurfaceMotion: imageSurfaceMotionSchema.optional(),
12974
13349
  testimonialCardTreatment: testimonialCardTreatmentSchema.optional(),
12975
13350
  tileTreatment: tileTreatmentSchema.optional(),
13351
+ eventListTreatment: eventListTreatmentSchema.optional(),
12976
13352
  eyebrowTreatment: eyebrowTreatmentSchema.optional()
12977
13353
  }).strict();
12978
13354
  var styleAuthoritySchema = z23.discriminatedUnion("kind", [
@@ -14372,6 +14748,7 @@ function styledSection(config) {
14372
14748
  renderBackgroundImage = true,
14373
14749
  backgroundImageLoading,
14374
14750
  backgroundImageFetchPriority,
14751
+ allowOverflow = false,
14375
14752
  fullWidthPath
14376
14753
  } = config;
14377
14754
  const renderedBackgroundNodes = backgroundLayer(`${bindFrom}.background`, {
@@ -14406,7 +14783,7 @@ function styledSection(config) {
14406
14783
  // No fallback needed - transform handles all cases via defaultSpacing
14407
14784
  }
14408
14785
  },
14409
- allowOverflow: {
14786
+ allowOverflow: allowOverflow ? true : {
14410
14787
  $bind: {
14411
14788
  from: `${bindFrom}.background`,
14412
14789
  transforms: [{ id: "background.resolveAllowOverflow" }],
@@ -15090,6 +15467,14 @@ var tileTreatmentSet = new Set(tileTreatmentValues);
15090
15467
  function isTileTreatment(value) {
15091
15468
  return typeof value === "string" && tileTreatmentSet.has(value);
15092
15469
  }
15470
+ var eventListTreatmentClassMap = {
15471
+ plain: "",
15472
+ "lined-panel": "rb-event-list-treatment-lined-panel"
15473
+ };
15474
+ var eventListTreatmentSet = new Set(eventListTreatmentValues);
15475
+ function isEventListTreatment(value) {
15476
+ return typeof value === "string" && eventListTreatmentSet.has(value);
15477
+ }
15093
15478
  var sectionClassNameTransform = {
15094
15479
  id: "sectionStyles.resolveClassName",
15095
15480
  kind: "string",
@@ -15157,6 +15542,17 @@ var sectionClassNameTransform = {
15157
15542
  `[sectionStyles] Invalid tileTreatment value in _sectionStyles: "${tileTreatment}". Expected one of: ${tileTreatmentValues.join(", ")}.`
15158
15543
  );
15159
15544
  }
15545
+ const eventListTreatment = input?.eventListTreatment;
15546
+ if (isEventListTreatment(eventListTreatment)) {
15547
+ const eventListTreatmentClass = eventListTreatmentClassMap[eventListTreatment];
15548
+ if (eventListTreatmentClass) {
15549
+ classes.push(eventListTreatmentClass);
15550
+ }
15551
+ } else if (typeof eventListTreatment === "string" && process.env.NODE_ENV !== "production") {
15552
+ console.warn(
15553
+ `[sectionStyles] Invalid eventListTreatment value in _sectionStyles: "${eventListTreatment}". Expected one of: ${eventListTreatmentValues.join(", ")}.`
15554
+ );
15555
+ }
15160
15556
  if (hasFixedFrameBackgroundMotion(input)) {
15161
15557
  classes.push(fixedFrameScopeClass);
15162
15558
  }
@@ -15592,6 +15988,35 @@ function sectionState(opts) {
15592
15988
  );
15593
15989
  }
15594
15990
 
15991
+ // ../blocks/src/system/node/fragments/headingDecoration.ts
15992
+ var defaultBindFrom = "_sectionStyles.headingDecoration";
15993
+ function headingDecoration({
15994
+ bindFrom = defaultBindFrom,
15995
+ family,
15996
+ placement,
15997
+ className
15998
+ }) {
15999
+ return el(
16000
+ "div",
16001
+ {
16002
+ "aria-hidden": "true",
16003
+ className: {
16004
+ $bind: {
16005
+ from: bindFrom,
16006
+ transforms: [
16007
+ {
16008
+ id: "ui.headingDecorationClassName",
16009
+ options: { baseClass: className, family }
16010
+ }
16011
+ ]
16012
+ }
16013
+ }
16014
+ },
16015
+ null,
16016
+ when(`${bindFrom}.placement`, { equals: placement })
16017
+ );
16018
+ }
16019
+
15595
16020
  // ../blocks/src/system/fragments/types.ts
15596
16021
  import { z as z27 } from "zod";
15597
16022
  var FRAGMENT_ID_PATTERN = /^[a-z0-9](?:[a-z0-9._-]*[a-z0-9])?$/i;
@@ -15677,47 +16102,48 @@ function validateFieldDefinitions(fields3, fragmentId) {
15677
16102
  function prefixFieldId(field, scope) {
15678
16103
  const cloned = cloneFieldDefinition2(field);
15679
16104
  cloned.id = `${scope}.${field.id}`;
15680
- cloned.defaultValue = cloneUnknown(cloned.defaultValue);
16105
+ const defaultValue = cloned.defaultValue;
16106
+ cloned.defaultValue = cloneUnknown(defaultValue);
15681
16107
  cloned.visibleRoles = cloned.visibleRoles ? [...cloned.visibleRoles] : void 0;
15682
16108
  cloned.ui = cloneUnknown(cloned.ui);
15683
16109
  return cloned;
15684
16110
  }
15685
16111
  function cloneFieldDefinition2(field) {
15686
- switch (field.type) {
15687
- case "repeater":
15688
- if (field.polymorphic && field.itemTypes) {
15689
- return {
15690
- ...field,
15691
- polymorphic: true,
15692
- itemTypes: Object.fromEntries(
15693
- Object.entries(field.itemTypes).map(([key, itemType]) => [
15694
- key,
15695
- {
15696
- ...itemType,
15697
- fields: itemType.fields.map(cloneFieldDefinition2)
15698
- }
15699
- ])
15700
- )
15701
- };
15702
- } else if (field.schema) {
15703
- return {
15704
- ...field,
15705
- schema: {
15706
- fields: field.schema.fields.map(cloneFieldDefinition2)
15707
- }
15708
- };
15709
- }
15710
- return { ...field };
15711
- case "group":
16112
+ if (field.type === "repeater") {
16113
+ if (field.polymorphic && field.itemTypes) {
16114
+ return {
16115
+ ...field,
16116
+ polymorphic: true,
16117
+ itemTypes: Object.fromEntries(
16118
+ Object.entries(field.itemTypes).map(([key, itemType]) => [
16119
+ key,
16120
+ {
16121
+ ...itemType,
16122
+ fields: itemType.fields.map(cloneFieldDefinition2)
16123
+ }
16124
+ ])
16125
+ )
16126
+ };
16127
+ }
16128
+ if (field.schema) {
15712
16129
  return {
15713
16130
  ...field,
15714
16131
  schema: {
15715
16132
  fields: field.schema.fields.map(cloneFieldDefinition2)
15716
16133
  }
15717
16134
  };
15718
- default:
15719
- return { ...field };
16135
+ }
16136
+ return { ...field };
16137
+ }
16138
+ if (field.type === "group") {
16139
+ return {
16140
+ ...field,
16141
+ schema: {
16142
+ fields: field.schema.fields.map(cloneFieldDefinition2)
16143
+ }
16144
+ };
15720
16145
  }
16146
+ return { ...field };
15721
16147
  }
15722
16148
  function cloneUnknown(value) {
15723
16149
  if (value == null || typeof value !== "object") {
@@ -16370,6 +16796,10 @@ var testimonialsHeadingFragment = defineFragment({
16370
16796
  when("content.heading"),
16371
16797
  bind("content.heading")
16372
16798
  ),
16799
+ headingDecoration({
16800
+ family: "short-center-rule",
16801
+ placement: "under-centered-heading"
16802
+ }),
16373
16803
  text(
16374
16804
  {
16375
16805
  as: "p",
@@ -17041,6 +17471,41 @@ var faqHeadingFragment = defineFragment({
17041
17471
  });
17042
17472
 
17043
17473
  // ../blocks/src/system/fragments/library/faqAccordion.ts
17474
+ function createFaqAccordionLayout(options = {}) {
17475
+ return accordionList({
17476
+ collection: "content.items",
17477
+ itemName: "faqItem",
17478
+ indexName: "faqIndex",
17479
+ accordionProps: {
17480
+ className: options.rootClassName ?? "accordion-root",
17481
+ type: "single",
17482
+ collapsible: true
17483
+ },
17484
+ itemProps: {
17485
+ className: {
17486
+ $bind: {
17487
+ from: "content._cardStyles",
17488
+ transforms: [
17489
+ {
17490
+ id: "boxStyles.all",
17491
+ options: {
17492
+ axis: "all",
17493
+ includeSpacing: false,
17494
+ baseClass: "rb-faq-item rb-relative rb-isolate rb-overflow-hidden"
17495
+ }
17496
+ }
17497
+ ]
17498
+ },
17499
+ fallback: "rb-faq-item"
17500
+ },
17501
+ iconStyle: { $bind: { from: "theme.accordions.icon.style" } },
17502
+ // Legacy theme accordion style
17503
+ iconTreatment: { $bind: { from: "content._sectionStyles.accordionIconTreatment" } }
17504
+ },
17505
+ triggerFrom: "faqItem.question",
17506
+ contentFrom: "faqItem.answer"
17507
+ });
17508
+ }
17044
17509
  var faqAccordionFragment = defineFragment({
17045
17510
  id: "faqAccordion",
17046
17511
  title: "FAQ Accordion",
@@ -17074,40 +17539,7 @@ var faqAccordionFragment = defineFragment({
17074
17539
  }
17075
17540
  }
17076
17541
  ],
17077
- layout: accordionList({
17078
- collection: "content.items",
17079
- itemName: "faqItem",
17080
- indexName: "faqIndex",
17081
- accordionProps: {
17082
- className: "accordion-root",
17083
- // CSS-first: all styling handled by theme CSS
17084
- type: "single",
17085
- collapsible: true
17086
- },
17087
- itemProps: {
17088
- className: {
17089
- $bind: {
17090
- from: "content._cardStyles",
17091
- transforms: [
17092
- {
17093
- id: "boxStyles.all",
17094
- options: {
17095
- axis: "all",
17096
- includeSpacing: false,
17097
- baseClass: "rb-faq-item rb-relative rb-isolate rb-overflow-hidden rb-border"
17098
- }
17099
- }
17100
- ]
17101
- },
17102
- fallback: "rb-faq-item"
17103
- },
17104
- iconStyle: { $bind: { from: "theme.accordions.icon.style" } },
17105
- // Legacy theme accordion style
17106
- iconTreatment: { $bind: { from: "content._sectionStyles.accordionIconTreatment" } }
17107
- },
17108
- triggerFrom: "faqItem.question",
17109
- contentFrom: "faqItem.answer"
17110
- })
17542
+ layout: createFaqAccordionLayout()
17111
17543
  });
17112
17544
 
17113
17545
  // ../blocks/src/system/fragments/library/card.ts
@@ -18054,7 +18486,8 @@ function createBlockManifestWithContentShape(config, _contentShape) {
18054
18486
  return createBlockManifest(config);
18055
18487
  }
18056
18488
  function normalizeBlockLayout(layout) {
18057
- return Array.isArray(layout) ? [...layout] : layout;
18489
+ const rawLayout = layout;
18490
+ return Array.isArray(rawLayout) ? rawLayout : rawLayout;
18058
18491
  }
18059
18492
  function deriveComponentName(id) {
18060
18493
  const base = id.replace(/^block\./, "");
@@ -18160,6 +18593,7 @@ var microLayout = styledSection({
18160
18593
  function splitLayoutWith(children) {
18161
18594
  return styledSection({
18162
18595
  children: styledContainer({
18596
+ baseClassName: "rb-relative rb-isolate rb-overflow-visible",
18163
18597
  children: {
18164
18598
  type: "grid",
18165
18599
  props: {
@@ -18184,6 +18618,7 @@ function splitLayoutWith(children) {
18184
18618
  // The split variants render the image as a real grid column, so suppress
18185
18619
  // the default absolute background image layer while keeping color/overlay.
18186
18620
  renderBackgroundImage: false,
18621
+ allowOverflow: true,
18187
18622
  baseClass: ""
18188
18623
  });
18189
18624
  }
@@ -18337,6 +18772,21 @@ function introHeading(className) {
18337
18772
  bind("content.title")
18338
18773
  );
18339
18774
  }
18775
+ function introHeadingGroup(className) {
18776
+ return stack(
18777
+ {
18778
+ gap: "sm",
18779
+ className: "rb-intro-heading-group"
18780
+ },
18781
+ [
18782
+ introHeading(className),
18783
+ headingDecoration({
18784
+ family: "organic-squiggle",
18785
+ placement: "after-heading"
18786
+ })
18787
+ ]
18788
+ );
18789
+ }
18340
18790
  function introBody(className = "rb-prose rb-max-w-none") {
18341
18791
  return richText({ className }, bind("content.body"));
18342
18792
  }
@@ -18355,6 +18805,10 @@ function introCopyStack(options = {}) {
18355
18805
  },
18356
18806
  [
18357
18807
  introHeading(options.headingClassName ?? "rb-intro-title"),
18808
+ headingDecoration({
18809
+ family: "organic-squiggle",
18810
+ placement: "after-heading"
18811
+ }),
18358
18812
  introBody(options.bodyClassName),
18359
18813
  introCtas(options.ctaJustify)
18360
18814
  ]
@@ -18394,7 +18848,7 @@ var statementCopyLayout = styledSection({
18394
18848
  className: "rb-intro rb-intro-statement rb-grid rb-grid-cols-1 rb-gap-8 rb-md-grid-cols-2 rb-md-items-start"
18395
18849
  },
18396
18850
  [
18397
- introHeading("rb-intro-title rb-max-w-xl"),
18851
+ introHeadingGroup("rb-intro-title rb-max-w-xl"),
18398
18852
  stack({ gap: "md", className: "rb-intro-copy rb-max-w-xl" }, [
18399
18853
  introBody(),
18400
18854
  introCtas("start")
@@ -18415,7 +18869,7 @@ var statementMediaLayout = styledSection({
18415
18869
  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"
18416
18870
  },
18417
18871
  [
18418
- introHeading("rb-intro-title rb-max-w-xl"),
18872
+ introHeadingGroup("rb-intro-title rb-max-w-xl"),
18419
18873
  stack({ gap: "md", className: "rb-intro-copy rb-max-w-xl" }, [
18420
18874
  introBody(),
18421
18875
  introCtas("start")
@@ -19417,6 +19871,9 @@ function isNodeDefinitionArray(layout) {
19417
19871
  }
19418
19872
  var headingLayout = fragmentLayoutNode(faqHeadingFragment.layout);
19419
19873
  var accordionLayout = fragmentLayoutNode(faqAccordionFragment.layout);
19874
+ var questionColumnsAccordionLayout = createFaqAccordionLayout({
19875
+ rootClassName: "accordion-root rb-faq-question-columns rb-grid rb-grid-cols-1 rb-gap-4 rb-lg-grid-cols-2"
19876
+ });
19420
19877
  var defaultLayout = styledSection({
19421
19878
  children: styledContainer({
19422
19879
  baseClassName: "rb-relative rb-isolate",
@@ -19430,11 +19887,24 @@ var twoColumnLayout = styledSection({
19430
19887
  children: el(
19431
19888
  "div",
19432
19889
  {
19433
- className: "rb-faq-two-column rb-grid rb-grid-cols-1 rb-gap-8 rb-lg-grid-cols-2 rb-lg-items-start"
19890
+ className: "rb-faq-split-heading rb-grid rb-grid-cols-1 rb-gap-8 rb-lg-grid-cols-2 rb-lg-items-start"
19434
19891
  },
19435
19892
  [
19436
- el("div", { className: "rb-faq-two-column-heading" }, [headingLayout]),
19437
- el("div", { className: "rb-faq-two-column-accordion" }, [accordionLayout])
19893
+ el("div", { className: "rb-faq-split-heading-copy" }, [headingLayout]),
19894
+ el("div", { className: "rb-faq-split-heading-accordion" }, [accordionLayout])
19895
+ ]
19896
+ )
19897
+ }),
19898
+ baseClass: ""
19899
+ });
19900
+ var questionColumnsLayout = styledSection({
19901
+ children: styledContainer({
19902
+ baseClassName: "rb-relative rb-isolate",
19903
+ children: stack(
19904
+ { gap: "xl", className: "rb-w-full" },
19905
+ [
19906
+ headingLayout,
19907
+ questionColumnsAccordionLayout
19438
19908
  ]
19439
19909
  )
19440
19910
  }),
@@ -19459,7 +19929,8 @@ var faqManifest = createBlockManifest({
19459
19929
  layout: defaultLayout,
19460
19930
  variants: {
19461
19931
  default: defaultLayout,
19462
- "two-column": twoColumnLayout
19932
+ "two-column": twoColumnLayout,
19933
+ "question-columns": questionColumnsLayout
19463
19934
  },
19464
19935
  defaultVariant: "default",
19465
19936
  variantOptions: {
@@ -19470,6 +19941,10 @@ var faqManifest = createBlockManifest({
19470
19941
  "two-column": {
19471
19942
  label: "Two column",
19472
19943
  description: "A left heading column with FAQ items on the right."
19944
+ },
19945
+ "question-columns": {
19946
+ label: "Question columns",
19947
+ description: "A full-width heading above FAQ items split into two columns."
19473
19948
  }
19474
19949
  },
19475
19950
  description: "Accordion of frequently asked questions and answers.",
@@ -19558,16 +20033,20 @@ var marqueeLoopTransform = {
19558
20033
  summary: "Repeat an array to a minimum length, then duplicate it for seamless marquee looping",
19559
20034
  schema: marqueeLoopOptionsSchema,
19560
20035
  run: (value, options) => {
19561
- if (!Array.isArray(value) || value.length === 0) return [];
20036
+ const items = toUnknownArray(value);
20037
+ if (items.length === 0) return [];
19562
20038
  const minItems = options?.minItems ?? 10;
19563
20039
  const base = [];
19564
20040
  while (base.length < minItems) {
19565
- base.push(...value);
20041
+ base.push(...items);
19566
20042
  if (base.length > 1e3) break;
19567
20043
  }
19568
20044
  return [...base, ...base];
19569
20045
  }
19570
20046
  };
20047
+ function toUnknownArray(value) {
20048
+ return Array.isArray(value) ? value : [];
20049
+ }
19571
20050
  var formattingTransforms = [
19572
20051
  uppercaseTransform,
19573
20052
  fallbackTransform,
@@ -19591,9 +20070,21 @@ var eyebrowTreatmentClassMap = {
19591
20070
  "accent-pill-bounce": "rb-eyebrow-treatment-pill rb-eyebrow-treatment-accent rb-eyebrow-treatment-pill-bounce"
19592
20071
  };
19593
20072
  var eyebrowTreatmentSet = new Set(eyebrowTreatmentValues);
20073
+ var headingDecorationFamilySet = new Set(visibleHeadingDecorationFamilyValues);
20074
+ var headingDecorationPlacementSet = new Set(visibleHeadingDecorationPlacementValues);
20075
+ var headingDecorationColorTokenSet = new Set(headingDecorationColorTokenValues);
19594
20076
  function isEyebrowTreatment(value) {
19595
20077
  return typeof value === "string" && eyebrowTreatmentSet.has(value);
19596
20078
  }
20079
+ function isHeadingDecorationFamily(value) {
20080
+ return typeof value === "string" && headingDecorationFamilySet.has(value);
20081
+ }
20082
+ function isHeadingDecorationPlacement(value) {
20083
+ return typeof value === "string" && headingDecorationPlacementSet.has(value);
20084
+ }
20085
+ function isHeadingDecorationColorToken(value) {
20086
+ return typeof value === "string" && headingDecorationColorTokenSet.has(value);
20087
+ }
19597
20088
  var imageGalleryCornerClassMap = {
19598
20089
  none: "",
19599
20090
  sm: "rb-rounded-sm",
@@ -19697,6 +20188,10 @@ var sectionStateToneTransform = {
19697
20188
  summary: "Map semantic section-state kind to feedback tone",
19698
20189
  run: (value) => sectionStateToneFromUnknown(value)
19699
20190
  };
20191
+ var heroTitleLengthThresholds = {
20192
+ medium: { maxCharacters: 42, maxWords: 6 },
20193
+ long: { maxCharacters: 78, maxWords: 11 }
20194
+ };
19700
20195
  function isPlainObject(value) {
19701
20196
  return Boolean(value) && typeof value === "object" && !Array.isArray(value);
19702
20197
  }
@@ -19704,6 +20199,14 @@ function readString(obj, key) {
19704
20199
  const v = obj[key];
19705
20200
  return typeof v === "string" ? v : void 0;
19706
20201
  }
20202
+ function resolveGeneratedHeroLayoutStyles(content) {
20203
+ const raw = content._heroLayoutStyles;
20204
+ return isPlainObject(raw) ? raw : null;
20205
+ }
20206
+ function readHeroLayoutString(content, generatedKey, fallbackKey = generatedKey) {
20207
+ const generated = resolveGeneratedHeroLayoutStyles(content);
20208
+ return generated && typeof generated[generatedKey] === "string" ? generated[generatedKey] : readString(content, fallbackKey);
20209
+ }
19707
20210
  function resolveHeroVariant(content) {
19708
20211
  const variant = readString(content, "variant");
19709
20212
  if (variant && variant.trim()) return variant.trim();
@@ -19712,14 +20215,14 @@ function resolveHeroVariant(content) {
19712
20215
  return null;
19713
20216
  }
19714
20217
  function resolveHeroContentAlignment(content) {
19715
- const raw = readString(content, "contentAlignment");
20218
+ const raw = readHeroLayoutString(content, "contentAlignment");
19716
20219
  if (raw === "left" || raw === "center" || raw === "right") return raw;
19717
20220
  const variant = resolveHeroVariant(content);
19718
20221
  if (variant === "split" || variant === "splitReverse") return "left";
19719
20222
  return "center";
19720
20223
  }
19721
20224
  function resolveHeroVerticalAlignment(content) {
19722
- const raw = readString(content, "verticalAlignment");
20225
+ const raw = readHeroLayoutString(content, "verticalAlignment");
19723
20226
  if (raw === "top" || raw === "center" || raw === "bottom") return raw;
19724
20227
  const sectionStyles = asPartialObject(content._sectionStyles);
19725
20228
  const minHeight = sectionStyles?.minHeight;
@@ -19729,11 +20232,29 @@ function resolveHeroVerticalAlignment(content) {
19729
20232
  return "top";
19730
20233
  }
19731
20234
  function resolveHeroContentMaxWidth(content) {
19732
- const raw = readString(content, "contentMaxWidth");
20235
+ const raw = readHeroLayoutString(content, "contentMaxWidth");
19733
20236
  if (raw === "default" || raw === "narrow" || raw === "medium" || raw === "wide")
19734
20237
  return raw;
19735
20238
  return "default";
19736
20239
  }
20240
+ function resolveHeroTypographyScale(content) {
20241
+ const raw = readHeroLayoutString(
20242
+ content,
20243
+ "typographyScale",
20244
+ "heroTypographyScale"
20245
+ );
20246
+ if (raw === "quiet" || raw === "editorial" || raw === "display" || raw === "poster") {
20247
+ return raw;
20248
+ }
20249
+ return null;
20250
+ }
20251
+ function resolveHeroTitleLength(content) {
20252
+ const headline = readString(content, "headline")?.trim() ?? "";
20253
+ const wordCount = headline.length === 0 ? 0 : headline.split(/\s+/).length;
20254
+ if (headline.length > heroTitleLengthThresholds.long.maxCharacters || wordCount > heroTitleLengthThresholds.long.maxWords) return "long";
20255
+ if (headline.length > heroTitleLengthThresholds.medium.maxCharacters || wordCount > heroTitleLengthThresholds.medium.maxWords) return "medium";
20256
+ return "short";
20257
+ }
19737
20258
  var heroContentWrapperClassSchema = z33.object({
19738
20259
  base: z33.string().optional()
19739
20260
  });
@@ -19746,6 +20267,8 @@ var heroContentWrapperClassTransform = {
19746
20267
  const content = isPlainObject(value) ? value : isPlainObject(context.data) ? context.data : {};
19747
20268
  const alignment = resolveHeroContentAlignment(content);
19748
20269
  const maxWidth = resolveHeroContentMaxWidth(content);
20270
+ const typographyScale = resolveHeroTypographyScale(content);
20271
+ const titleLength = resolveHeroTitleLength(content);
19749
20272
  const textAlignClass = alignment === "center" ? "rb-text-center" : alignment === "right" ? "rb-text-right" : "rb-text-left";
19750
20273
  const maxWidthClass = maxWidth === "narrow" ? "rb-max-w-2xl" : maxWidth === "medium" ? "rb-max-w-3xl" : maxWidth === "wide" ? "rb-max-w-5xl" : "";
19751
20274
  const positionClass = alignment === "center" ? "rb-mx-auto" : alignment === "right" ? "rb-ml-auto" : "";
@@ -19753,7 +20276,9 @@ var heroContentWrapperClassTransform = {
19753
20276
  options?.base,
19754
20277
  textAlignClass,
19755
20278
  maxWidthClass,
19756
- positionClass
20279
+ positionClass,
20280
+ typographyScale ? `rb-hero-typography-${typographyScale}` : "",
20281
+ `rb-hero-title-${titleLength}`
19757
20282
  ]);
19758
20283
  }
19759
20284
  };
@@ -20053,11 +20578,67 @@ var uiTransforms = [
20053
20578
  const treatment = isEyebrowTreatment(value) ? value : "plain";
20054
20579
  return joinClasses3([baseClass, eyebrowTreatmentClassMap[treatment]]);
20055
20580
  }
20581
+ },
20582
+ {
20583
+ id: "ui.headingDecorationClassName",
20584
+ kind: "string",
20585
+ summary: "Apply constrained Theme V2 heading decoration classes",
20586
+ run: (value, options) => {
20587
+ const baseClass = typeof options?.baseClass === "string" && options.baseClass.trim() ? options.baseClass : "rb-heading-decoration";
20588
+ const decoration = asPartialObject(value);
20589
+ const family = isHeadingDecorationFamily(decoration?.family) ? decoration.family : null;
20590
+ const allowedFamily = isHeadingDecorationFamily(options?.family) ? options.family : null;
20591
+ const placement = isHeadingDecorationPlacement(decoration?.placement) ? decoration.placement : null;
20592
+ const colorToken = isHeadingDecorationColorToken(decoration?.colorToken) ? decoration.colorToken : "primary";
20593
+ if (!family || !placement) return "rb-hidden";
20594
+ if (allowedFamily && family !== allowedFamily) return "rb-hidden";
20595
+ return joinClasses3([
20596
+ baseClass,
20597
+ `rb-heading-decoration-${family}`,
20598
+ `rb-heading-decoration-placement-${placement}`,
20599
+ `rb-heading-decoration-color-${colorToken}`
20600
+ ]);
20601
+ }
20056
20602
  }
20057
20603
  ];
20058
20604
 
20059
20605
  // ../blocks/src/system/transforms/registry/layout.ts
20060
20606
  import { z as z34 } from "zod";
20607
+
20608
+ // ../theme-core/src/siteChromePlacement.ts
20609
+ var HEADER_POSITIONINGS = ["static", "sticky", "fixed"];
20610
+ function parseHeaderPositioning(value) {
20611
+ return isHeaderPositioning(value) ? value : "static";
20612
+ }
20613
+ function isHeaderPositioning(value) {
20614
+ return typeof value === "string" && HEADER_POSITIONINGS.includes(value);
20615
+ }
20616
+ function planSiteChromePlacement(positioning) {
20617
+ switch (positioning) {
20618
+ case "static":
20619
+ return {
20620
+ kind: "static",
20621
+ headerRootClassName: null,
20622
+ standaloneShellClassName: null
20623
+ };
20624
+ case "sticky":
20625
+ return {
20626
+ kind: "sticky",
20627
+ headerRootClassName: "rb-sticky rb-top-0",
20628
+ standaloneShellClassName: "sticky top-0 z-40 w-full"
20629
+ };
20630
+ case "fixed":
20631
+ return {
20632
+ kind: "fixed",
20633
+ headerRootClassName: "rb-fixed rb-top-0 rb-left-0 rb-right-0",
20634
+ standaloneShellClassName: "fixed left-0 right-0 top-0 z-40 w-full"
20635
+ };
20636
+ default:
20637
+ return assertNever(positioning);
20638
+ }
20639
+ }
20640
+
20641
+ // ../blocks/src/system/transforms/registry/layout.ts
20061
20642
  var joinClasses4 = (parts) => parts.filter(
20062
20643
  (part) => typeof part === "string" && part.trim().length > 0
20063
20644
  ).join(" ").replace(/\s+/g, " ").trim();
@@ -20173,7 +20754,8 @@ var headerRootClassTransform = {
20173
20754
  ...options
20174
20755
  };
20175
20756
  const content = asPartialObject(value) ?? {};
20176
- const positioning = typeof content.positioning === "string" ? content.positioning : "static";
20757
+ const positioning = parseHeaderPositioning(content.positioning);
20758
+ const placement = planSiteChromePlacement(positioning);
20177
20759
  const shrinkOnScroll = Boolean(content.shrinkOnScroll);
20178
20760
  const header = asPartialObject(value);
20179
20761
  const visuals = resolveHeaderVisualStyles(header, context.theme);
@@ -20185,14 +20767,14 @@ var headerRootClassTransform = {
20185
20767
  if (config.blur) classes.push(config.blur);
20186
20768
  if (config.blurSupport) classes.push(config.blurSupport);
20187
20769
  }
20188
- if (positioning === "sticky") {
20770
+ if (placement.kind === "sticky") {
20189
20771
  classes.push(
20190
20772
  visuals.isTransparent ? config.stickyTransparent : config.sticky
20191
20773
  );
20192
- } else if (positioning === "fixed") {
20774
+ } else if (placement.kind === "fixed") {
20193
20775
  classes.push(config.fixed);
20194
20776
  }
20195
- if (shrinkOnScroll && (positioning === "sticky" || positioning === "fixed")) {
20777
+ if (shrinkOnScroll && placement.kind !== "static") {
20196
20778
  classes.push(config.shrink);
20197
20779
  }
20198
20780
  const VALID_VARIANTS = [
@@ -20724,6 +21306,10 @@ function desktopOnlyDisplay(display) {
20724
21306
  return `rb-hidden ${LARGE_DISPLAY_CLASSES[display]}`;
20725
21307
  }
20726
21308
 
21309
+ // ../theme-core/src/siteChromeOverlayClearance.ts
21310
+ var SITE_CHROME_VISIBLE_HEADER_ATTR = "data-site-chrome-visible-header";
21311
+ var SITE_CHROME_VISIBLE_HEADER_SELECTOR = `[${SITE_CHROME_VISIBLE_HEADER_ATTR}="true"]`;
21312
+
20727
21313
  // ../blocks/src/system/blocks/site-header.ts
20728
21314
  var logoRow = link(
20729
21315
  {
@@ -20996,6 +21582,7 @@ var transparentLayout = inline(
20996
21582
  );
20997
21583
  var floatingLayout = inline(
20998
21584
  {
21585
+ [SITE_CHROME_VISIBLE_HEADER_ATTR]: "true",
20999
21586
  className: bindProp("$root.theme.header.maxWidth", {
21000
21587
  transforms: pipe(
21001
21588
  tx("layout.maxWidthClass", {
@@ -21941,6 +22528,10 @@ var sectionHeading = stack(
21941
22528
  when("content.title"),
21942
22529
  bind("content.title")
21943
22530
  ),
22531
+ headingDecoration({
22532
+ family: "short-center-rule",
22533
+ placement: "under-centered-heading"
22534
+ }),
21944
22535
  richText(
21945
22536
  {
21946
22537
  className: "rb-feature-cards-description rb-prose rb-mx-auto rb-max-w-none",
@@ -23122,8 +23713,8 @@ var eventSurfaceScopeValues = [
23122
23713
  "custom"
23123
23714
  ];
23124
23715
  var eventScheduleScopeValues = ["any", "recurring", "oneOff"];
23125
- var asEventCategoryId = (value) => value;
23126
- var asVenueId = (value) => value;
23716
+ var unsafeAsEventCategoryId = (value) => value;
23717
+ var unsafeAsVenueId = (value) => value;
23127
23718
  function normalizeEventBlockKind(value) {
23128
23719
  return value === "courses" || value === "events" ? value : "all";
23129
23720
  }
@@ -23149,10 +23740,10 @@ function normalizeEventCategoryIds(value) {
23149
23740
  if (Array.isArray(value)) {
23150
23741
  return normalizeIdList(
23151
23742
  value.filter((entry) => typeof entry === "string")
23152
- ).map(asEventCategoryId);
23743
+ ).map(unsafeAsEventCategoryId);
23153
23744
  }
23154
23745
  if (typeof value === "string") {
23155
- return normalizeIdList(value.split(",")).map(asEventCategoryId);
23746
+ return normalizeIdList(value.split(",")).map(unsafeAsEventCategoryId);
23156
23747
  }
23157
23748
  return [];
23158
23749
  }
@@ -23165,7 +23756,7 @@ function normalizeEventVenueId(value) {
23165
23756
  return null;
23166
23757
  }
23167
23758
  const trimmed = value.trim();
23168
- return trimmed ? asVenueId(trimmed) : null;
23759
+ return trimmed ? unsafeAsVenueId(trimmed) : null;
23169
23760
  }
23170
23761
  function normalizeEventStaffMemberId(value) {
23171
23762
  if (typeof value !== "string") {
@@ -24364,7 +24955,7 @@ var COLUMN_CLASSES = {
24364
24955
  };
24365
24956
  function getContainerClass(layout, columns) {
24366
24957
  if (layout === "compact") {
24367
- return "event-listing-compact-container rb-flex rb-flex-col rb-gap-2";
24958
+ return "event-listing-compact-container rb-flex rb-flex-col";
24368
24959
  }
24369
24960
  if (layout === "stack") {
24370
24961
  return "rb-flex rb-flex-col rb-gap-6";
@@ -27192,6 +27783,7 @@ import { z as z53 } from "zod";
27192
27783
  var storedProductCartItemSchema = z53.object({
27193
27784
  kind: z53.literal("product"),
27194
27785
  productId: z53.string().min(1),
27786
+ productCategoryId: z53.string().min(1).optional().nullable(),
27195
27787
  variantId: z53.string().min(1).optional().nullable(),
27196
27788
  title: z53.string().min(1),
27197
27789
  variantTitle: z53.string().optional().nullable(),
@@ -29696,6 +30288,10 @@ var scheduleTileTreatments = [
29696
30288
  "quiet",
29697
30289
  "brand-depth"
29698
30290
  ];
30291
+ var eventListTreatments = [
30292
+ "plain",
30293
+ "lined-panel"
30294
+ ];
29699
30295
  function scheduleDetailsCapable() {
29700
30296
  return declareBlockDesignCapability({
29701
30297
  sectionSurfaces: "supported",
@@ -29704,6 +30300,14 @@ function scheduleDetailsCapable() {
29704
30300
  tileTreatments: scheduleTileTreatments
29705
30301
  });
29706
30302
  }
30303
+ function eventListCapable() {
30304
+ return declareBlockDesignCapability({
30305
+ sectionSurfaces: "supported",
30306
+ contentFrames: ["plain"],
30307
+ itemSurfaces: "unsupported",
30308
+ eventListTreatments
30309
+ });
30310
+ }
29707
30311
  function defaultBoundaryBias(visualWeight) {
29708
30312
  return visualWeight === "featured" || visualWeight === "immersive" ? "clear" : "soft";
29709
30313
  }
@@ -29923,7 +30527,8 @@ var systemBlockDefinitionsRaw = [
29923
30527
  flow: bodyFlow,
29924
30528
  layoutProfiles: [
29925
30529
  layoutProfile({ variantKey: "default", family: "stack", weight: "standard" }),
29926
- layoutProfile({ variantKey: "two-column", family: "split", weight: "standard" })
30530
+ layoutProfile({ variantKey: "two-column", family: "split", weight: "standard" }),
30531
+ layoutProfile({ variantKey: "question-columns", family: "grid", weight: "standard" })
29927
30532
  ]
29928
30533
  })),
29929
30534
  withDesignCapability("block.site-header", siteHeaderBlockDefinition, declareNoBlockDesignCapability("site-chrome"), defineBlockDesignMetadata({
@@ -30017,11 +30622,11 @@ var systemBlockDefinitionsRaw = [
30017
30622
  flow: offeringsFlow,
30018
30623
  layoutProfiles: [layoutProfile({ variantKey: "default", family: "centered", weight: "featured" })]
30019
30624
  })),
30020
- withDesignCapability("block.event-listing", eventListingBlockDefinition, sectionOnly(), defineBlockDesignMetadata({
30625
+ withDesignCapability("block.event-listing", eventListingBlockDefinition, eventListCapable(), defineBlockDesignMetadata({
30021
30626
  flow: offeringsFlow,
30022
30627
  layoutProfiles: [layoutProfile({ variantKey: "default", family: "stack", weight: "standard" })]
30023
30628
  })),
30024
- withDesignCapability("block.event-calendar", eventCalendarBlockDefinition, sectionOnly(), defineBlockDesignMetadata({
30629
+ withDesignCapability("block.event-calendar", eventCalendarBlockDefinition, eventListCapable(), defineBlockDesignMetadata({
30025
30630
  flow: offeringsFlow,
30026
30631
  layoutProfiles: [
30027
30632
  layoutProfile({ variantKey: "combined", family: "grid", weight: "standard" }),
@@ -31093,6 +31698,15 @@ ${root} {
31093
31698
  `;
31094
31699
  }
31095
31700
 
31701
+ // ../theme-core/src/runtime/themeCssVarNames.ts
31702
+ var THEME_RADIUS_CSS_VARS = {
31703
+ block: "--rb-block-radius",
31704
+ button: "--rb-button-radius",
31705
+ input: "--rb-input-radius",
31706
+ legacyCard: "--radius-card",
31707
+ legacyControl: "--radius-control"
31708
+ };
31709
+
31096
31710
  // ../theme-core/src/blocks/vars/customer-portal.ts
31097
31711
  function generateCustomerPortalVars({
31098
31712
  themeId
@@ -31106,6 +31720,11 @@ ${root} {
31106
31720
  --cp-muted: rgb(var(--tb-mutedText));
31107
31721
  --cp-border: rgb(var(--tb-border));
31108
31722
  --cp-shadow: var(--shadow-elev);
31723
+ --cp-primary: rgb(var(--tb-primary));
31724
+ --cp-primary-hover: rgb(var(--tb-primary-700, var(--tb-primary)));
31725
+ --cp-error: rgb(var(--tb-destructive));
31726
+ --cp-card-radius: var(${THEME_RADIUS_CSS_VARS.block}, var(${THEME_RADIUS_CSS_VARS.legacyCard}, 0.75rem));
31727
+ --cp-control-radius: var(${THEME_RADIUS_CSS_VARS.input}, var(${THEME_RADIUS_CSS_VARS.legacyControl}, 0.5rem));
31109
31728
 
31110
31729
  /* Shared tab bar (underline style) */
31111
31730
  --rb-tab-border-width: 1px;
@@ -31156,7 +31775,7 @@ ${root} {
31156
31775
  --rb-modal-bg: var(--cp-card-bg);
31157
31776
  --rb-modal-border: var(--cp-card-border);
31158
31777
  --rb-modal-shadow: var(--shadow-lg, var(--shadow-elev));
31159
- --rb-modal-radius: var(--radius-card);
31778
+ --rb-modal-radius: var(--cp-card-radius);
31160
31779
  --rb-modal-max-width: 560px;
31161
31780
 
31162
31781
  /* Header */
@@ -32537,6 +33156,9 @@ import { jsx as jsx5 } from "react/jsx-runtime";
32537
33156
  import * as React from "react";
32538
33157
  import { Fragment, jsx as jsx6, jsxs as jsxs4 } from "react/jsx-runtime";
32539
33158
 
33159
+ // ../theme-core/src/fonts/uploadFormat.ts
33160
+ var MAX_FONT_UPLOAD_BYTES = 5 * 1024 * 1024;
33161
+
32540
33162
  // ../theme-core/src/runtime/buildThemeRuntimeFromBridge.ts
32541
33163
  import { z as z60 } from "zod";
32542
33164
  var themeBridgeConfigSchema = z60.object({
@@ -32619,10 +33241,16 @@ var dashboardConfigSchema = z61.object({
32619
33241
  var fieldDefinitionInputSchema = unsafeRetypeZodSchema(fieldSchema);
32620
33242
  var nodeDefinitionSchema = unsafeRetypeZodSchema(NodeSchema);
32621
33243
  var sdkLoaderEndpointSchema = z61.enum(SUPPORTED_LOADER_ENDPOINTS);
33244
+ var loaderFallbackScalarSchema = z61.union([
33245
+ z61.string(),
33246
+ z61.number(),
33247
+ z61.boolean(),
33248
+ z61.null()
33249
+ ]);
32622
33250
  var loaderParamBindingSchema = z61.object({
32623
33251
  $bind: z61.object({
32624
33252
  from: z61.string().min(1, "Binding path is required"),
32625
- fallback: z61.string().optional()
33253
+ fallback: loaderFallbackScalarSchema.optional()
32626
33254
  })
32627
33255
  });
32628
33256
  var loaderParamValueSchema = z61.union([
@@ -32768,9 +33396,13 @@ var sdkBlockFieldOptionsMapSchema = z61.record(
32768
33396
  var sdkContentTypeTemplateConfigSchema = z61.object({
32769
33397
  blocks: z61.array(z61.unknown())
32770
33398
  }).passthrough();
33399
+ var sdkContentTypeOrderingConfigSchema = z61.object({
33400
+ mode: z61.enum(["default", "manual"]).optional()
33401
+ }).optional();
32771
33402
  var sdkContentTypeConfigSchema = z61.object({
32772
33403
  key: z61.string().min(1),
32773
33404
  fields: z61.array(z61.unknown()),
33405
+ ordering: sdkContentTypeOrderingConfigSchema,
32774
33406
  template: sdkContentTypeTemplateConfigSchema.nullable().optional()
32775
33407
  }).passthrough();
32776
33408
  var sdkContentConfigSchema = z61.object({
@@ -32983,6 +33615,7 @@ var COURSE_ENROLLMENT_REFUND_FAILED_CODES = [
32983
33615
  ];
32984
33616
 
32985
33617
  // ../api/src/bookingVerticals.ts
33618
+ import { z as z63 } from "zod";
32986
33619
  var VERTICAL_IDS = [
32987
33620
  "yoga_wellness",
32988
33621
  "fitness_pt",
@@ -33061,6 +33694,132 @@ var VERTICAL_ID_SET = new Set(VERTICAL_IDS);
33061
33694
  var VERTICAL_PRESET_ID_SET = new Set(
33062
33695
  VERTICAL_BOOKING_PRESETS.map((presetDefinition) => presetDefinition.id)
33063
33696
  );
33697
+ function parseVerticalId(value) {
33698
+ return typeof value === "string" && VERTICAL_ID_SET.has(value) ? value : null;
33699
+ }
33700
+ function parseVerticalPresetId(value) {
33701
+ return typeof value === "string" && VERTICAL_PRESET_ID_SET.has(value) ? value : null;
33702
+ }
33703
+ function getVerticalPresetDefinition(presetId) {
33704
+ const definition = VERTICAL_BOOKING_PRESETS.find((presetDefinition) => presetDefinition.id === presetId);
33705
+ if (!definition) {
33706
+ throw new Error(`Unhandled vertical preset id: ${presetId}`);
33707
+ }
33708
+ return definition;
33709
+ }
33710
+ function toNonEmptyVerticalPresetIds(presetIds) {
33711
+ const firstPresetId = presetIds[0];
33712
+ return firstPresetId ? [firstPresetId, ...presetIds.slice(1)] : null;
33713
+ }
33714
+ function createConfiguredSiteVerticalBookingConfig(verticalId, selectedPresetIds) {
33715
+ return {
33716
+ verticalId,
33717
+ selectedPresetIds
33718
+ };
33719
+ }
33720
+ function createSiteVerticalBookingConfig(verticalId, selectedPresetIds) {
33721
+ const nonEmptyPresetIds = toNonEmptyVerticalPresetIds(selectedPresetIds);
33722
+ return nonEmptyPresetIds ? createConfiguredSiteVerticalBookingConfig(verticalId, nonEmptyPresetIds) : null;
33723
+ }
33724
+ function resolveSiteVerticalBookingConfig(rawConfig) {
33725
+ if (!rawConfig) {
33726
+ return { kind: "unconfigured", config: DEFAULT_SITE_VERTICAL_BOOKING_CONFIG };
33727
+ }
33728
+ const verticalId = parseVerticalId(rawConfig.verticalId);
33729
+ const rawPresetIds = Array.isArray(rawConfig.selectedPresetIds) ? rawConfig.selectedPresetIds : [];
33730
+ const selectedPresetIds = rawPresetIds.map(parseVerticalPresetId).filter((presetId) => Boolean(presetId));
33731
+ const config = {
33732
+ verticalId,
33733
+ selectedPresetIds
33734
+ };
33735
+ if (!verticalId && selectedPresetIds.length === 0) {
33736
+ return { kind: "unconfigured", config: DEFAULT_SITE_VERTICAL_BOOKING_CONFIG };
33737
+ }
33738
+ const issues = getSiteVerticalConfigIssues(rawConfig, config);
33739
+ if (issues.length > 0) {
33740
+ return { kind: "invalid", config, issues };
33741
+ }
33742
+ const configuredConfig = verticalId ? createSiteVerticalBookingConfig(verticalId, selectedPresetIds) : null;
33743
+ if (!configuredConfig) {
33744
+ return { kind: "invalid", config, issues: ["empty_selected_presets"] };
33745
+ }
33746
+ return {
33747
+ kind: "configured",
33748
+ config: configuredConfig,
33749
+ selectedPresets: configuredConfig.selectedPresetIds.map(getVerticalPresetDefinition)
33750
+ };
33751
+ }
33752
+ function getSiteVerticalConfigIssues(rawConfig, config) {
33753
+ const issues = /* @__PURE__ */ new Set();
33754
+ if (rawConfig.verticalId != null && !config.verticalId) {
33755
+ issues.add("unknown_vertical");
33756
+ }
33757
+ if (!config.verticalId && config.selectedPresetIds.length > 0) {
33758
+ issues.add("missing_vertical");
33759
+ }
33760
+ const rawPresetIds = Array.isArray(rawConfig.selectedPresetIds) ? rawConfig.selectedPresetIds : [];
33761
+ if (rawPresetIds.some((presetId) => parseVerticalPresetId(presetId) === null)) {
33762
+ issues.add("unknown_preset");
33763
+ }
33764
+ if (config.verticalId && config.selectedPresetIds.length === 0) {
33765
+ issues.add("empty_selected_presets");
33766
+ }
33767
+ const seenBehaviours = /* @__PURE__ */ new Set();
33768
+ for (const presetId of config.selectedPresetIds) {
33769
+ const presetDefinition = getVerticalPresetDefinition(presetId);
33770
+ if (config.verticalId && presetDefinition.verticalId !== config.verticalId) {
33771
+ issues.add("preset_vertical_mismatch");
33772
+ }
33773
+ if (presetDefinition.availability === "future") {
33774
+ issues.add("future_preset_selected");
33775
+ }
33776
+ if (seenBehaviours.has(presetDefinition.canonicalBehaviour)) {
33777
+ issues.add("duplicate_canonical_behaviour");
33778
+ }
33779
+ seenBehaviours.add(presetDefinition.canonicalBehaviour);
33780
+ }
33781
+ return [...issues];
33782
+ }
33783
+ var VerticalIdSchema = z63.string().trim().transform((value, ctx) => {
33784
+ const parsed = parseVerticalId(value);
33785
+ if (!parsed) {
33786
+ ctx.addIssue({
33787
+ code: z63.ZodIssueCode.custom,
33788
+ message: "Unknown booking vertical"
33789
+ });
33790
+ return z63.NEVER;
33791
+ }
33792
+ return parsed;
33793
+ });
33794
+ var VerticalPresetIdSchema = z63.string().trim().transform((value, ctx) => {
33795
+ const parsed = parseVerticalPresetId(value);
33796
+ if (!parsed) {
33797
+ ctx.addIssue({
33798
+ code: z63.ZodIssueCode.custom,
33799
+ message: "Unknown booking preset"
33800
+ });
33801
+ return z63.NEVER;
33802
+ }
33803
+ return parsed;
33804
+ });
33805
+ var BookingVerticalConfigSchema = z63.object({
33806
+ verticalId: VerticalIdSchema.nullable(),
33807
+ selectedPresetIds: z63.array(VerticalPresetIdSchema).max(20)
33808
+ }).transform((value, ctx) => {
33809
+ const resolved = resolveSiteVerticalBookingConfig(value);
33810
+ if (resolved.kind === "invalid") {
33811
+ ctx.addIssue({
33812
+ code: z63.ZodIssueCode.custom,
33813
+ message: `Invalid booking vertical config: ${resolved.issues.join(", ")}`
33814
+ });
33815
+ return z63.NEVER;
33816
+ }
33817
+ return resolved.config;
33818
+ });
33819
+ var DEFAULT_SITE_VERTICAL_BOOKING_CONFIG = {
33820
+ verticalId: null,
33821
+ selectedPresetIds: []
33822
+ };
33064
33823
  function preset(id, verticalId, canonicalBehaviour, label, pluralLabel, description, availability = "onboarding") {
33065
33824
  return {
33066
33825
  id,
@@ -33080,51 +33839,51 @@ function isRecord3(value) {
33080
33839
  }
33081
33840
 
33082
33841
  // ../api/src/appointmentSetup.ts
33083
- import { z as z63 } from "zod";
33842
+ import { z as z64 } from "zod";
33084
33843
  var APPOINTMENT_SETUP_MAX_MINUTES = 1440;
33085
- var appointmentSetupRefSchema = z63.discriminatedUnion("kind", [
33086
- z63.object({ kind: z63.literal("existing"), id: z63.string().min(1) }),
33087
- z63.object({ kind: z63.literal("new"), draftId: z63.string().min(1) })
33844
+ var appointmentSetupRefSchema = z64.discriminatedUnion("kind", [
33845
+ z64.object({ kind: z64.literal("existing"), id: z64.string().min(1) }),
33846
+ z64.object({ kind: z64.literal("new"), draftId: z64.string().min(1) })
33088
33847
  ]);
33089
- var appointmentSetupVenueChoiceSchema = z63.discriminatedUnion("kind", [
33090
- z63.object({ kind: z63.literal("none") }),
33091
- z63.object({ kind: z63.literal("existing"), venueId: z63.string().min(1) }),
33092
- z63.object({
33093
- kind: z63.literal("create"),
33094
- draftId: z63.string().min(1),
33095
- title: z63.string().trim().min(1),
33096
- description: z63.string().nullable(),
33097
- timezone: z63.string().trim().min(1).nullable(),
33098
- addressJson: z63.record(z63.string(), z63.unknown()),
33099
- locationJson: z63.object({ lat: z63.number(), lng: z63.number() }).nullable()
33848
+ var appointmentSetupVenueChoiceSchema = z64.discriminatedUnion("kind", [
33849
+ z64.object({ kind: z64.literal("none") }),
33850
+ z64.object({ kind: z64.literal("existing"), venueId: z64.string().min(1) }),
33851
+ z64.object({
33852
+ kind: z64.literal("create"),
33853
+ draftId: z64.string().min(1),
33854
+ title: z64.string().trim().min(1),
33855
+ description: z64.string().nullable(),
33856
+ timezone: z64.string().trim().min(1).nullable(),
33857
+ addressJson: z64.record(z64.string(), z64.unknown()),
33858
+ locationJson: z64.object({ lat: z64.number(), lng: z64.number() }).nullable()
33100
33859
  })
33101
33860
  ]);
33102
- var appointmentSetupPaymentDraftSchema = z63.object({
33103
- priceType: z63.union([z63.literal("free"), z63.literal("paid")])
33104
- });
33105
- var appointmentSetupServiceAssignmentDraftSchema = z63.discriminatedUnion("kind", [
33106
- z63.object({ kind: z63.literal("all_practitioners") }),
33107
- z63.object({
33108
- kind: z63.literal("selected_practitioners"),
33109
- resourceRefs: z63.array(appointmentSetupRefSchema)
33861
+ var appointmentSetupPaymentDraftSchema = z64.object({
33862
+ priceType: z64.union([z64.literal("free"), z64.literal("paid")])
33863
+ });
33864
+ var appointmentSetupServiceAssignmentDraftSchema = z64.discriminatedUnion("kind", [
33865
+ z64.object({ kind: z64.literal("all_practitioners") }),
33866
+ z64.object({
33867
+ kind: z64.literal("selected_practitioners"),
33868
+ resourceRefs: z64.array(appointmentSetupRefSchema)
33110
33869
  })
33111
33870
  ]);
33112
- var appointmentSetupServiceDraftSchema = z63.object({
33871
+ var appointmentSetupServiceDraftSchema = z64.object({
33113
33872
  ref: appointmentSetupRefSchema,
33114
- title: z63.string().trim().min(1),
33115
- description: z63.string().nullable(),
33116
- durationMinutes: z63.number().int().positive().max(APPOINTMENT_SETUP_MAX_MINUTES),
33117
- prepMinutes: z63.number().int().nonnegative().max(APPOINTMENT_SETUP_MAX_MINUTES).default(0),
33118
- cleanupMinutes: z63.number().int().nonnegative().max(APPOINTMENT_SETUP_MAX_MINUTES).default(0),
33119
- priceAmount: z63.number().int().nonnegative().nullable(),
33120
- isActive: z63.boolean(),
33121
- locationType: z63.union([
33122
- z63.literal("virtual"),
33123
- z63.literal("in_person"),
33124
- z63.literal("hybrid")
33873
+ title: z64.string().trim().min(1),
33874
+ description: z64.string().nullable(),
33875
+ durationMinutes: z64.number().int().positive().max(APPOINTMENT_SETUP_MAX_MINUTES),
33876
+ prepMinutes: z64.number().int().nonnegative().max(APPOINTMENT_SETUP_MAX_MINUTES).default(0),
33877
+ cleanupMinutes: z64.number().int().nonnegative().max(APPOINTMENT_SETUP_MAX_MINUTES).default(0),
33878
+ priceAmount: z64.number().int().nonnegative().nullable(),
33879
+ isActive: z64.boolean(),
33880
+ locationType: z64.union([
33881
+ z64.literal("virtual"),
33882
+ z64.literal("in_person"),
33883
+ z64.literal("hybrid")
33125
33884
  ]),
33126
33885
  venue: appointmentSetupVenueChoiceSchema,
33127
- timezone: z63.string().trim().min(1).nullable(),
33886
+ timezone: z64.string().trim().min(1).nullable(),
33128
33887
  payment: appointmentSetupPaymentDraftSchema,
33129
33888
  assignment: appointmentSetupServiceAssignmentDraftSchema
33130
33889
  }).superRefine((service, ctx) => {
@@ -33143,49 +33902,49 @@ var appointmentSetupServiceDraftSchema = z63.object({
33143
33902
  });
33144
33903
  }
33145
33904
  });
33146
- var appointmentSetupPractitionerDraftSchema = z63.object({
33905
+ var appointmentSetupPractitionerDraftSchema = z64.object({
33147
33906
  ref: appointmentSetupRefSchema,
33148
- displayName: z63.string().trim().min(1),
33149
- bio: z63.string().nullable(),
33150
- timezone: z63.string().trim().min(1),
33151
- colorHex: z63.string().nullable()
33152
- });
33153
- var appointmentSetupWeeklyWindowDraftSchema = z63.object({
33154
- weekday: z63.number().int().min(0).max(6),
33155
- startTime: z63.string(),
33156
- endTime: z63.string()
33157
- });
33158
- var appointmentSetupStartTimePolicyDraftSchema = z63.discriminatedUnion("kind", [
33159
- z63.object({ kind: z63.literal("automatic_spacing") }),
33160
- z63.object({
33161
- kind: z63.literal("regular_interval"),
33162
- intervalMinutes: z63.union([
33163
- z63.literal(10),
33164
- z63.literal(15),
33165
- z63.literal(20),
33166
- z63.literal(30),
33167
- z63.literal(45),
33168
- z63.literal(60)
33907
+ displayName: z64.string().trim().min(1),
33908
+ bio: z64.string().nullable(),
33909
+ timezone: z64.string().trim().min(1),
33910
+ colorHex: z64.string().nullable()
33911
+ });
33912
+ var appointmentSetupWeeklyWindowDraftSchema = z64.object({
33913
+ weekday: z64.number().int().min(0).max(6),
33914
+ startTime: z64.string(),
33915
+ endTime: z64.string()
33916
+ });
33917
+ var appointmentSetupStartTimePolicyDraftSchema = z64.discriminatedUnion("kind", [
33918
+ z64.object({ kind: z64.literal("automatic_spacing") }),
33919
+ z64.object({
33920
+ kind: z64.literal("regular_interval"),
33921
+ intervalMinutes: z64.union([
33922
+ z64.literal(10),
33923
+ z64.literal(15),
33924
+ z64.literal(20),
33925
+ z64.literal(30),
33926
+ z64.literal(45),
33927
+ z64.literal(60)
33169
33928
  ])
33170
33929
  })
33171
33930
  ]);
33172
- var appointmentSetupAvailabilityDraftSchema = z63.object({
33173
- kind: z63.literal("weekly_windows"),
33931
+ var appointmentSetupAvailabilityDraftSchema = z64.object({
33932
+ kind: z64.literal("weekly_windows"),
33174
33933
  resourceRef: appointmentSetupRefSchema,
33175
33934
  serviceRef: appointmentSetupRefSchema.nullable(),
33176
- windows: z63.array(appointmentSetupWeeklyWindowDraftSchema),
33935
+ windows: z64.array(appointmentSetupWeeklyWindowDraftSchema),
33177
33936
  startTimePolicy: appointmentSetupStartTimePolicyDraftSchema.optional()
33178
33937
  });
33179
33938
  var APPOINTMENT_DEFAULT_MIN_LEAD_MINUTES_MAX = 28 * 24 * 60;
33180
33939
  var APPOINTMENT_DEFAULT_MAX_BOOKING_NOTICE_MINUTES_MAX = 10 * 365 * 24 * 60;
33181
- var appointmentSetupBookingNoticeSchema = z63.object({
33182
- minLeadMinutes: z63.number().int().nonnegative().max(APPOINTMENT_DEFAULT_MIN_LEAD_MINUTES_MAX),
33183
- maxBookingNoticeMinutes: z63.number().int().nonnegative().max(APPOINTMENT_DEFAULT_MAX_BOOKING_NOTICE_MINUTES_MAX)
33184
- });
33185
- var applyAppointmentSetupRequestSchema = z63.object({
33186
- services: z63.array(appointmentSetupServiceDraftSchema),
33187
- practitioners: z63.array(appointmentSetupPractitionerDraftSchema),
33188
- availability: z63.array(appointmentSetupAvailabilityDraftSchema),
33940
+ var appointmentSetupBookingNoticeSchema = z64.object({
33941
+ minLeadMinutes: z64.number().int().nonnegative().max(APPOINTMENT_DEFAULT_MIN_LEAD_MINUTES_MAX),
33942
+ maxBookingNoticeMinutes: z64.number().int().nonnegative().max(APPOINTMENT_DEFAULT_MAX_BOOKING_NOTICE_MINUTES_MAX)
33943
+ });
33944
+ var applyAppointmentSetupRequestSchema = z64.object({
33945
+ services: z64.array(appointmentSetupServiceDraftSchema),
33946
+ practitioners: z64.array(appointmentSetupPractitionerDraftSchema),
33947
+ availability: z64.array(appointmentSetupAvailabilityDraftSchema),
33189
33948
  bookingNotice: appointmentSetupBookingNoticeSchema
33190
33949
  });
33191
33950
 
@@ -33218,24 +33977,24 @@ var STAFF_CANCELLATION_CONTEXT_CATEGORIES = [
33218
33977
  ];
33219
33978
 
33220
33979
  // ../api/src/siteBanner.ts
33221
- import { z as z64 } from "zod";
33980
+ import { z as z65 } from "zod";
33222
33981
  var SITE_BANNER_SCOPE_VALUES = ["homepage", "all-pages"];
33223
33982
  var SITE_BANNER_TONE_VALUES = ["announcement", "promotion", "notice", "warning"];
33224
33983
  var SITE_BANNER_MAX_TEXT_LENGTH = 320;
33225
33984
  var SITE_BANNER_MAX_PARAGRAPHS = 2;
33226
- var siteBannerScopeSchema = z64.enum(SITE_BANNER_SCOPE_VALUES);
33227
- var siteBannerToneSchema = z64.enum(SITE_BANNER_TONE_VALUES);
33228
- var siteBannerBodySchema = z64.unknown().transform(unwrapRichTextValue);
33229
- var siteBannerCtaSchema = z64.object({
33230
- label: z64.string().trim().min(1),
33985
+ var siteBannerScopeSchema = z65.enum(SITE_BANNER_SCOPE_VALUES);
33986
+ var siteBannerToneSchema = z65.enum(SITE_BANNER_TONE_VALUES);
33987
+ var siteBannerBodySchema = z65.unknown().transform(unwrapRichTextValue);
33988
+ var siteBannerCtaSchema = z65.object({
33989
+ label: z65.string().trim().min(1),
33231
33990
  link: linkPayloadSchema
33232
33991
  });
33233
- var siteBannerSettingsSchema = z64.discriminatedUnion("enabled", [
33234
- z64.object({
33235
- enabled: z64.literal(false)
33992
+ var siteBannerSettingsSchema = z65.discriminatedUnion("enabled", [
33993
+ z65.object({
33994
+ enabled: z65.literal(false)
33236
33995
  }),
33237
- z64.object({
33238
- enabled: z64.literal(true),
33996
+ z65.object({
33997
+ enabled: z65.literal(true),
33239
33998
  scope: siteBannerScopeSchema,
33240
33999
  tone: siteBannerToneSchema,
33241
34000
  body: siteBannerBodySchema,
@@ -33249,7 +34008,7 @@ var siteBannerSettingsInputSchema = siteBannerSettingsSchema.superRefine((value,
33249
34008
  const analysis = analyzeSiteBannerBody(value.body);
33250
34009
  for (const issue of analysis.issues) {
33251
34010
  ctx.addIssue({
33252
- code: z64.ZodIssueCode.custom,
34011
+ code: z65.ZodIssueCode.custom,
33253
34012
  path: ["body"],
33254
34013
  message: siteBannerBodyIssueMessage(issue)
33255
34014
  });
@@ -33517,76 +34276,109 @@ function isNavigationMenuValidationItem(value) {
33517
34276
  return typeof value.label === "string";
33518
34277
  }
33519
34278
 
34279
+ // ../api/src/navigation/dashboardSiteNav.ts
34280
+ var hiddenDemoSiteNavSurfaceIds = [
34281
+ "site.newsletter"
34282
+ ];
34283
+ var hiddenDemoSiteNavIds = new Set(
34284
+ hiddenDemoSiteNavSurfaceIds
34285
+ );
34286
+ var websiteSurfaceIds = [
34287
+ "site.content",
34288
+ "site.footerBlocks",
34289
+ "site.navigation",
34290
+ "site.media",
34291
+ "site.style",
34292
+ "site.performance"
34293
+ ];
34294
+ var websiteSurfaceIdSet = new Set(
34295
+ websiteSurfaceIds
34296
+ );
34297
+
34298
+ // ../api/src/navigation/dashboardSettingsNav.ts
34299
+ var hiddenDemoSettingsNavSurfaceIds = [
34300
+ "settings.features",
34301
+ "settings.domains",
34302
+ "settings.bookings",
34303
+ "settings.emails",
34304
+ "settings.team",
34305
+ "settings.billing",
34306
+ "settings.developer",
34307
+ "settings.apiKeys",
34308
+ "settings.backup"
34309
+ ];
34310
+ var hiddenDemoSettingsNavIds = new Set(hiddenDemoSettingsNavSurfaceIds);
34311
+
33520
34312
  // ../api/src/aiPlayground.ts
33521
- import { z as z65 } from "zod";
33522
- var Rfc6902PatchOp = z65.discriminatedUnion("op", [
34313
+ import { z as z66 } from "zod";
34314
+ var Rfc6902PatchOp = z66.discriminatedUnion("op", [
33523
34315
  // Standard RFC-6902 operations
33524
- z65.object({
33525
- op: z65.literal("add"),
33526
- path: z65.string(),
33527
- value: z65.unknown()
34316
+ z66.object({
34317
+ op: z66.literal("add"),
34318
+ path: z66.string(),
34319
+ value: z66.unknown()
33528
34320
  }),
33529
- z65.object({
33530
- op: z65.literal("remove"),
33531
- path: z65.string()
34321
+ z66.object({
34322
+ op: z66.literal("remove"),
34323
+ path: z66.string()
33532
34324
  }),
33533
- z65.object({
33534
- op: z65.literal("replace"),
33535
- path: z65.string(),
33536
- value: z65.unknown()
34325
+ z66.object({
34326
+ op: z66.literal("replace"),
34327
+ path: z66.string(),
34328
+ value: z66.unknown()
33537
34329
  }),
33538
- z65.object({
33539
- op: z65.literal("move"),
33540
- from: z65.string(),
33541
- path: z65.string()
34330
+ z66.object({
34331
+ op: z66.literal("move"),
34332
+ from: z66.string(),
34333
+ path: z66.string()
33542
34334
  }),
33543
- z65.object({
33544
- op: z65.literal("copy"),
33545
- from: z65.string(),
33546
- path: z65.string()
34335
+ z66.object({
34336
+ op: z66.literal("copy"),
34337
+ from: z66.string(),
34338
+ path: z66.string()
33547
34339
  }),
33548
34340
  // Block-level operations (Phase 2)
33549
- z65.object({
33550
- op: z65.literal("add_block"),
33551
- blockKind: z65.string(),
33552
- afterBlockId: z65.string().nullable(),
33553
- content: z65.record(z65.string(), z65.unknown()),
33554
- rationale: z65.string()
34341
+ z66.object({
34342
+ op: z66.literal("add_block"),
34343
+ blockKind: z66.string(),
34344
+ afterBlockId: z66.string().nullable(),
34345
+ content: z66.record(z66.string(), z66.unknown()),
34346
+ rationale: z66.string()
33555
34347
  }),
33556
- z65.object({
33557
- op: z65.literal("delete_block"),
33558
- blockId: z65.string(),
33559
- rationale: z65.string()
34348
+ z66.object({
34349
+ op: z66.literal("delete_block"),
34350
+ blockId: z66.string(),
34351
+ rationale: z66.string()
33560
34352
  }),
33561
- z65.object({
33562
- op: z65.literal("reorder_block"),
33563
- blockId: z65.string(),
33564
- afterBlockId: z65.string().nullable(),
33565
- rationale: z65.string()
34353
+ z66.object({
34354
+ op: z66.literal("reorder_block"),
34355
+ blockId: z66.string(),
34356
+ afterBlockId: z66.string().nullable(),
34357
+ rationale: z66.string()
33566
34358
  })
33567
34359
  ]);
33568
- var PlaygroundProposeRequest = z65.object({
33569
- request: z65.string().min(1).max(2e3)
34360
+ var PlaygroundProposeRequest = z66.object({
34361
+ request: z66.string().min(1).max(2e3)
33570
34362
  });
33571
- var MultiPagePatchEnvelope = z65.object({
33572
- pageId: z65.string(),
33573
- blockId: z65.string().optional(),
34363
+ var MultiPagePatchEnvelope = z66.object({
34364
+ pageId: z66.string(),
34365
+ blockId: z66.string().optional(),
33574
34366
  // Not present for page-level ops
33575
- blockKind: z65.string().optional(),
33576
- blockPurpose: z65.string().optional().nullable(),
33577
- ops: z65.array(Rfc6902PatchOp),
33578
- rationale: z65.string(),
33579
- currentContent: z65.record(z65.string(), z65.unknown()).optional()
34367
+ blockKind: z66.string().optional(),
34368
+ blockPurpose: z66.string().optional().nullable(),
34369
+ ops: z66.array(Rfc6902PatchOp),
34370
+ rationale: z66.string(),
34371
+ currentContent: z66.record(z66.string(), z66.unknown()).optional()
33580
34372
  });
33581
- var MultiPageUpdateResponse = z65.object({
33582
- patches: z65.array(MultiPagePatchEnvelope),
33583
- assistantMessage: z65.string(),
33584
- pagesModified: z65.number(),
33585
- toolCallsUsed: z65.number()
34373
+ var MultiPageUpdateResponse = z66.object({
34374
+ patches: z66.array(MultiPagePatchEnvelope),
34375
+ assistantMessage: z66.string(),
34376
+ pagesModified: z66.number(),
34377
+ toolCallsUsed: z66.number()
33586
34378
  });
33587
34379
 
33588
34380
  // src/config/content-validation.ts
33589
- import { z as z66 } from "zod";
34381
+ import { z as z67 } from "zod";
33590
34382
 
33591
34383
  // src/types/block-kinds.ts
33592
34384
  var SYSTEM_BLOCK_KINDS = [
@@ -33740,32 +34532,36 @@ function describeInvalidBindingTransform(transform) {
33740
34532
  }
33741
34533
 
33742
34534
  // src/config/content-validation.ts
33743
- var jsonDataSchema = z66.record(z66.string(), z66.any());
33744
- var contentTypeKeySchema = z66.string().min(1).regex(
34535
+ var jsonDataSchema = z67.record(z67.string(), z67.any());
34536
+ var contentTypeKeySchema = z67.string().min(1).regex(
33745
34537
  /^[a-z][a-z0-9-]*$/,
33746
34538
  "Key must be lowercase, start with a letter, and contain only letters, numbers, and hyphens"
33747
34539
  );
33748
- var templateConfigSchemaForward = z66.object({
33749
- blocks: z66.array(
33750
- z66.object({
33751
- identifier: z66.string().min(1),
33752
- kind: z66.string(),
33753
- scope: z66.enum(["entry", "template"]),
33754
- bindings: z66.record(z66.string(), z66.any()).optional(),
33755
- content: z66.record(z66.string(), z66.any()).optional()
34540
+ var templateConfigSchemaForward = z67.object({
34541
+ blocks: z67.array(
34542
+ z67.object({
34543
+ identifier: z67.string().min(1),
34544
+ kind: z67.string(),
34545
+ scope: z67.enum(["entry", "template"]),
34546
+ bindings: z67.record(z67.string(), z67.any()).optional(),
34547
+ content: z67.record(z67.string(), z67.any()).optional()
33756
34548
  })
33757
34549
  )
33758
34550
  }).optional();
33759
- var contentTypeConfigSchema = z66.object({
34551
+ var contentTypeOrderingSchema = z67.object({
34552
+ mode: z67.enum(["default", "manual"]).optional()
34553
+ }).optional();
34554
+ var contentTypeConfigSchema = z67.object({
33760
34555
  key: contentTypeKeySchema,
33761
- name: z66.string().min(1),
33762
- description: z66.string().optional(),
33763
- hasPages: z66.boolean(),
33764
- routePattern: z66.string().optional(),
34556
+ name: z67.string().min(1),
34557
+ description: z67.string().optional(),
34558
+ hasPages: z67.boolean(),
34559
+ routePattern: z67.string().optional(),
33765
34560
  // Fields are validated as unknown[] here - deep field validation happens in @riverbankcms/blocks
33766
- fields: z66.array(z66.any()).min(1, "At least one field is required"),
33767
- titleField: z66.string().optional(),
33768
- isSingleton: z66.boolean().optional().default(false),
34561
+ fields: z67.array(z67.any()).min(1, "At least one field is required"),
34562
+ titleField: z67.string().optional(),
34563
+ ordering: contentTypeOrderingSchema,
34564
+ isSingleton: z67.boolean().optional().default(false),
33769
34565
  template: templateConfigSchemaForward
33770
34566
  }).refine(
33771
34567
  (data) => {
@@ -33787,7 +34583,7 @@ var contentTypeConfigSchema = z66.object({
33787
34583
  }
33788
34584
  if (!data.routePattern) {
33789
34585
  ctx.addIssue({
33790
- code: z66.ZodIssueCode.custom,
34586
+ code: z67.ZodIssueCode.custom,
33791
34587
  path: ["routePattern"],
33792
34588
  message: "routePattern is required when hasPages is true. Non-singleton types must include {slug} placeholder."
33793
34589
  });
@@ -33796,7 +34592,7 @@ var contentTypeConfigSchema = z66.object({
33796
34592
  const parseResult = safeParseRouteTemplate(data.routePattern);
33797
34593
  if (!parseResult.success) {
33798
34594
  ctx.addIssue({
33799
- code: z66.ZodIssueCode.custom,
34595
+ code: z67.ZodIssueCode.custom,
33800
34596
  path: ["routePattern"],
33801
34597
  message: describeRouteTemplateParseError(parseResult.error)
33802
34598
  });
@@ -33804,44 +34600,44 @@ var contentTypeConfigSchema = z66.object({
33804
34600
  }
33805
34601
  if (!data.isSingleton && parseResult.routeTemplate.kind !== "slug-template") {
33806
34602
  ctx.addIssue({
33807
- code: z66.ZodIssueCode.custom,
34603
+ code: z67.ZodIssueCode.custom,
33808
34604
  path: ["routePattern"],
33809
34605
  message: "routePattern is required when hasPages is true. Non-singleton types must include {slug} placeholder."
33810
34606
  });
33811
34607
  }
33812
34608
  });
33813
- var fieldBindingSchema = z66.object({
33814
- source: z66.literal("field"),
33815
- path: z66.string().min(1, "Field path is required")
34609
+ var fieldBindingSchema = z67.object({
34610
+ source: z67.literal("field"),
34611
+ path: z67.string().min(1, "Field path is required")
33816
34612
  });
33817
- var metaBindingSchema = z66.object({
33818
- source: z66.literal("meta"),
33819
- path: z66.enum(TEMPLATE_BINDING_META_PATHS, {
34613
+ var metaBindingSchema = z67.object({
34614
+ source: z67.literal("meta"),
34615
+ path: z67.enum(TEMPLATE_BINDING_META_PATHS, {
33820
34616
  error: (issue) => describeInvalidTemplateBindingMetaPath(String(issue.input))
33821
34617
  })
33822
34618
  });
33823
- var literalBindingSchema = z66.object({
33824
- source: z66.literal("literal"),
33825
- value: z66.unknown()
34619
+ var literalBindingSchema = z67.object({
34620
+ source: z67.literal("literal"),
34621
+ value: z67.unknown()
33826
34622
  });
33827
- var transformBindingSchema = z66.object({
33828
- source: z66.literal("transform"),
33829
- path: z66.string().min(1, "Transform path is required"),
33830
- transform: z66.enum(BINDING_TRANSFORM_VALUES, {
34623
+ var transformBindingSchema = z67.object({
34624
+ source: z67.literal("transform"),
34625
+ path: z67.string().min(1, "Transform path is required"),
34626
+ transform: z67.enum(BINDING_TRANSFORM_VALUES, {
33831
34627
  error: (issue) => describeInvalidBindingTransform(String(issue.input))
33832
34628
  })
33833
34629
  });
33834
- var baseBindingSchema = z66.discriminatedUnion("source", [
34630
+ var baseBindingSchema = z67.discriminatedUnion("source", [
33835
34631
  fieldBindingSchema,
33836
34632
  metaBindingSchema,
33837
34633
  literalBindingSchema,
33838
34634
  transformBindingSchema
33839
34635
  ]);
33840
- var fallbackBindingSchema = z66.object({
33841
- source: z66.literal("fallback"),
33842
- sources: z66.array(z66.lazy(() => bindingSourceSchema)).min(1, "Fallback must have at least one source")
34636
+ var fallbackBindingSchema = z67.object({
34637
+ source: z67.literal("fallback"),
34638
+ sources: z67.array(z67.lazy(() => bindingSourceSchema)).min(1, "Fallback must have at least one source")
33843
34639
  });
33844
- var bindingSourceSchema = z66.union([
34640
+ var bindingSourceSchema = z67.union([
33845
34641
  baseBindingSchema,
33846
34642
  fallbackBindingSchema
33847
34643
  ]);
@@ -33855,12 +34651,12 @@ function isValidBlockKind(kind) {
33855
34651
  return false;
33856
34652
  }
33857
34653
  var BLOCK_KIND_ERROR_MESSAGE = 'Block kind must be a system block (e.g., "block.hero") or a custom block (e.g., "custom.myBlock")';
33858
- var blockKindSchema = z66.string().refine(isValidBlockKind, { message: BLOCK_KIND_ERROR_MESSAGE });
33859
- var templateBlockConfigSchema = z66.object({
33860
- identifier: z66.string().min(1, "Block identifier is required"),
34654
+ var blockKindSchema = z67.string().refine(isValidBlockKind, { message: BLOCK_KIND_ERROR_MESSAGE });
34655
+ var templateBlockConfigSchema = z67.object({
34656
+ identifier: z67.string().min(1, "Block identifier is required"),
33861
34657
  kind: blockKindSchema,
33862
- scope: z66.enum(["entry", "template"]),
33863
- bindings: z66.record(z66.string(), bindingSourceSchema).optional(),
34658
+ scope: z67.enum(["entry", "template"]),
34659
+ bindings: z67.record(z67.string(), bindingSourceSchema).optional(),
33864
34660
  content: jsonDataSchema.optional()
33865
34661
  }).refine(
33866
34662
  (data) => {
@@ -33879,8 +34675,8 @@ var templateBlockConfigSchema = z66.object({
33879
34675
  },
33880
34676
  { message: "Template-scoped blocks should define static content, not bindings" }
33881
34677
  );
33882
- var templateConfigSchema = z66.object({
33883
- blocks: z66.array(templateBlockConfigSchema).min(1, "Template must have at least one block")
34678
+ var templateConfigSchema = z67.object({
34679
+ blocks: z67.array(templateBlockConfigSchema).min(1, "Template must have at least one block")
33884
34680
  }).refine(
33885
34681
  (data) => {
33886
34682
  const identifiers = data.blocks.map((b) => b.identifier);
@@ -33889,77 +34685,77 @@ var templateConfigSchema = z66.object({
33889
34685
  },
33890
34686
  { message: "Template block identifiers must be unique" }
33891
34687
  );
33892
- var blockConfigSchema = z66.object({
34688
+ var blockConfigSchema = z67.object({
33893
34689
  kind: blockKindSchema,
33894
34690
  content: jsonDataSchema,
33895
- orderIndex: z66.number().optional()
33896
- });
33897
- var pageConfigSchema = z66.object({
33898
- identifier: z66.string().min(1, "Identifier is required"),
33899
- title: z66.string().min(1, "Title is required"),
33900
- path: z66.string().regex(/^\//, "Path must start with /"),
33901
- purpose: z66.string().default("content"),
33902
- blocks: z66.array(blockConfigSchema).optional(),
33903
- status: z66.enum(["draft", "published"]).default("draft"),
33904
- metaTitle: z66.string().optional(),
33905
- metaDescription: z66.string().optional()
33906
- });
33907
- var entryConfigSchema = z66.object({
33908
- identifier: z66.string().min(1, "Identifier is required"),
33909
- contentType: z66.string().min(1, "Content type is required"),
34691
+ orderIndex: z67.number().optional()
34692
+ });
34693
+ var pageConfigSchema = z67.object({
34694
+ identifier: z67.string().min(1, "Identifier is required"),
34695
+ title: z67.string().min(1, "Title is required"),
34696
+ path: z67.string().regex(/^\//, "Path must start with /"),
34697
+ purpose: z67.string().default("content"),
34698
+ blocks: z67.array(blockConfigSchema).optional(),
34699
+ status: z67.enum(["draft", "published"]).default("draft"),
34700
+ metaTitle: z67.string().optional(),
34701
+ metaDescription: z67.string().optional()
34702
+ });
34703
+ var entryConfigSchema = z67.object({
34704
+ identifier: z67.string().min(1, "Identifier is required"),
34705
+ contentType: z67.string().min(1, "Content type is required"),
33910
34706
  data: jsonDataSchema,
33911
- status: z66.enum(["draft", "published"]).default("draft"),
33912
- slug: z66.string().optional(),
33913
- summary: z66.string().optional(),
34707
+ status: z67.enum(["draft", "published"]).default("draft"),
34708
+ slug: z67.string().optional(),
34709
+ summary: z67.string().optional(),
33914
34710
  // Hard remove legacy config-only titles: titles must live in entry `data`.
33915
- title: z66.any().optional().refine((value) => value === void 0, {
34711
+ title: z67.any().optional().refine((value) => value === void 0, {
33916
34712
  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."
33917
34713
  }),
33918
- metaTitle: z66.string().optional(),
33919
- metaDescription: z66.string().optional()
34714
+ metaTitle: z67.string().optional(),
34715
+ metaDescription: z67.string().optional()
33920
34716
  });
33921
- var dropdownLinkSchema = z66.object({
33922
- kind: z66.literal("dropdown")
34717
+ var dropdownLinkSchema = z67.object({
34718
+ kind: z67.literal("dropdown")
33923
34719
  });
33924
- var navigationLinkSchema = z66.discriminatedUnion("kind", [
34720
+ var navigationLinkSchema = z67.discriminatedUnion("kind", [
33925
34721
  ...navigationLinkInputSchemaOptions,
33926
34722
  dropdownLinkSchema
33927
34723
  ]);
33928
- var baseNavigationItemSchema = z66.object({
33929
- label: z66.string().min(1, "Label is required"),
34724
+ var baseNavigationItemSchema = z67.object({
34725
+ label: z67.string().min(1, "Label is required"),
33930
34726
  link: navigationLinkSchema,
33931
- isCta: z66.boolean().optional()
34727
+ isCta: z67.boolean().optional()
33932
34728
  });
33933
34729
  var navigationItemConfigSchema = baseNavigationItemSchema.extend({
33934
- children: z66.lazy(() => z66.array(navigationItemConfigSchema)).optional()
33935
- });
33936
- var navigationMenuConfigSchema = z66.object({
33937
- identifier: z66.string().min(1, "Identifier is required"),
33938
- name: z66.string().min(1, "Name is required"),
33939
- isPrimary: z66.boolean().optional(),
33940
- isFooter: z66.boolean().optional(),
33941
- items: z66.array(navigationItemConfigSchema)
34730
+ children: z67.lazy(() => z67.array(navigationItemConfigSchema)).optional()
34731
+ });
34732
+ var navigationMenuConfigSchema = z67.object({
34733
+ identifier: z67.string().min(1, "Identifier is required"),
34734
+ name: z67.string().min(1, "Name is required"),
34735
+ isPrimary: z67.boolean().optional(),
34736
+ isFooter: z67.boolean().optional(),
34737
+ items: z67.array(navigationItemConfigSchema)
33942
34738
  }).superRefine((menu, ctx) => {
33943
34739
  const portalStats = collectPortalLinkStats(
33944
34740
  menu.items
33945
34741
  );
33946
34742
  if (portalStats.count > 1) {
33947
34743
  ctx.addIssue({
33948
- code: z66.ZodIssueCode.custom,
34744
+ code: z67.ZodIssueCode.custom,
33949
34745
  message: "Only one portal link is allowed per navigation menu",
33950
34746
  path: ["items"]
33951
34747
  });
33952
34748
  }
33953
34749
  if (portalStats.nestedLabels.length > 0) {
33954
34750
  ctx.addIssue({
33955
- code: z66.ZodIssueCode.custom,
34751
+ code: z67.ZodIssueCode.custom,
33956
34752
  message: `Portal links must be root-level items: ${portalStats.nestedLabels.join(", ")}`,
33957
34753
  path: ["items"]
33958
34754
  });
33959
34755
  }
33960
34756
  if (portalStats.withChildrenLabels.length > 0) {
33961
34757
  ctx.addIssue({
33962
- code: z66.ZodIssueCode.custom,
34758
+ code: z67.ZodIssueCode.custom,
33963
34759
  message: `Portal links cannot contain child items: ${portalStats.withChildrenLabels.join(", ")}`,
33964
34760
  path: ["items"]
33965
34761
  });
@@ -33969,44 +34765,44 @@ var navigationMenuConfigSchema = z66.object({
33969
34765
  );
33970
34766
  if (cartStats.nestedLabels.length > 0) {
33971
34767
  ctx.addIssue({
33972
- code: z66.ZodIssueCode.custom,
34768
+ code: z67.ZodIssueCode.custom,
33973
34769
  message: `Cart links must be root-level items: ${cartStats.nestedLabels.join(", ")}`,
33974
34770
  path: ["items"]
33975
34771
  });
33976
34772
  }
33977
34773
  if (cartStats.withChildrenLabels.length > 0) {
33978
34774
  ctx.addIssue({
33979
- code: z66.ZodIssueCode.custom,
34775
+ code: z67.ZodIssueCode.custom,
33980
34776
  message: `Cart links cannot contain child items: ${cartStats.withChildrenLabels.join(", ")}`,
33981
34777
  path: ["items"]
33982
34778
  });
33983
34779
  }
33984
34780
  if (cartStats.ctaLabels.length > 0) {
33985
34781
  ctx.addIssue({
33986
- code: z66.ZodIssueCode.custom,
34782
+ code: z67.ZodIssueCode.custom,
33987
34783
  message: `Cart links cannot be marked as CTA: ${cartStats.ctaLabels.join(", ")}`,
33988
34784
  path: ["items"]
33989
34785
  });
33990
34786
  }
33991
34787
  if (cartStats.missingVisibleTextLabels.length > 0) {
33992
34788
  ctx.addIssue({
33993
- code: z66.ZodIssueCode.custom,
34789
+ code: z67.ZodIssueCode.custom,
33994
34790
  message: `Cart links with icon-with-label must provide a visible label: ${cartStats.missingVisibleTextLabels.join(", ")}`,
33995
34791
  path: ["items"]
33996
34792
  });
33997
34793
  }
33998
34794
  });
33999
- var siteSettingsConfigSchema = z66.object({
34000
- homepagePath: z66.string().optional(),
34001
- siteTitle: z66.string().optional(),
34002
- siteDescription: z66.string().optional(),
34003
- defaultTemplates: z66.record(z66.string(), z66.string()).optional()
34795
+ var siteSettingsConfigSchema = z67.object({
34796
+ homepagePath: z67.string().optional(),
34797
+ siteTitle: z67.string().optional(),
34798
+ siteDescription: z67.string().optional(),
34799
+ defaultTemplates: z67.record(z67.string(), z67.string()).optional()
34004
34800
  });
34005
- var contentConfigBaseSchema = z66.object({
34006
- contentTypes: z66.array(contentTypeConfigSchema).optional(),
34007
- entries: z66.array(entryConfigSchema).optional(),
34008
- pages: z66.array(pageConfigSchema).optional(),
34009
- navigationMenus: z66.array(navigationMenuConfigSchema).optional(),
34801
+ var contentConfigBaseSchema = z67.object({
34802
+ contentTypes: z67.array(contentTypeConfigSchema).optional(),
34803
+ entries: z67.array(entryConfigSchema).optional(),
34804
+ pages: z67.array(pageConfigSchema).optional(),
34805
+ navigationMenus: z67.array(navigationMenuConfigSchema).optional(),
34010
34806
  settings: siteSettingsConfigSchema.optional()
34011
34807
  });
34012
34808
  var contentConfigSchema = contentConfigBaseSchema.superRefine((data, ctx) => {
@@ -34015,7 +34811,7 @@ var contentConfigSchema = contentConfigBaseSchema.superRefine((data, ctx) => {
34015
34811
  const duplicateKeys = keys.filter((key, i) => keys.indexOf(key) !== i);
34016
34812
  if (duplicateKeys.length > 0) {
34017
34813
  ctx.addIssue({
34018
- code: z66.ZodIssueCode.custom,
34814
+ code: z67.ZodIssueCode.custom,
34019
34815
  message: `Content type keys must be unique. Duplicates: ${duplicateKeys.join(", ")}`,
34020
34816
  path: ["contentTypes"]
34021
34817
  });
@@ -34026,7 +34822,7 @@ var contentConfigSchema = contentConfigBaseSchema.superRefine((data, ctx) => {
34026
34822
  const duplicateIds = identifiers.filter((id, i) => identifiers.indexOf(id) !== i);
34027
34823
  if (duplicateIds.length > 0) {
34028
34824
  ctx.addIssue({
34029
- code: z66.ZodIssueCode.custom,
34825
+ code: z67.ZodIssueCode.custom,
34030
34826
  message: `Page identifiers must be unique. Duplicates: ${duplicateIds.join(", ")}`,
34031
34827
  path: ["pages"]
34032
34828
  });
@@ -34035,7 +34831,7 @@ var contentConfigSchema = contentConfigBaseSchema.superRefine((data, ctx) => {
34035
34831
  const duplicatePaths = paths.filter((path, i) => paths.indexOf(path) !== i);
34036
34832
  if (duplicatePaths.length > 0) {
34037
34833
  ctx.addIssue({
34038
- code: z66.ZodIssueCode.custom,
34834
+ code: z67.ZodIssueCode.custom,
34039
34835
  message: `Page paths must be unique. Duplicates: ${duplicatePaths.join(", ")}`,
34040
34836
  path: ["pages"]
34041
34837
  });
@@ -34046,7 +34842,7 @@ var contentConfigSchema = contentConfigBaseSchema.superRefine((data, ctx) => {
34046
34842
  const duplicateIds = identifiers.filter((id, i) => identifiers.indexOf(id) !== i);
34047
34843
  if (duplicateIds.length > 0) {
34048
34844
  ctx.addIssue({
34049
- code: z66.ZodIssueCode.custom,
34845
+ code: z67.ZodIssueCode.custom,
34050
34846
  message: `Entry identifiers must be unique. Duplicates: ${duplicateIds.join(", ")}`,
34051
34847
  path: ["entries"]
34052
34848
  });
@@ -34057,7 +34853,7 @@ var contentConfigSchema = contentConfigBaseSchema.superRefine((data, ctx) => {
34057
34853
  const duplicateIds = identifiers.filter((id, i) => identifiers.indexOf(id) !== i);
34058
34854
  if (duplicateIds.length > 0) {
34059
34855
  ctx.addIssue({
34060
- code: z66.ZodIssueCode.custom,
34856
+ code: z67.ZodIssueCode.custom,
34061
34857
  message: `Navigation menu identifiers must be unique. Duplicates: ${duplicateIds.join(", ")}`,
34062
34858
  path: ["navigationMenus"]
34063
34859
  });
@@ -34071,7 +34867,7 @@ var contentConfigSchema = contentConfigBaseSchema.superRefine((data, ctx) => {
34071
34867
  const entriesForType = data.entries.filter((e) => e.contentType === singletonKey);
34072
34868
  if (entriesForType.length > 1) {
34073
34869
  ctx.addIssue({
34074
- code: z66.ZodIssueCode.custom,
34870
+ code: z67.ZodIssueCode.custom,
34075
34871
  message: `Singleton content type "${singletonKey}" cannot have more than one entry. Found ${entriesForType.length} entries.`,
34076
34872
  path: ["entries"]
34077
34873
  });
@@ -34184,18 +34980,18 @@ function validateLayout(layout) {
34184
34980
  }
34185
34981
 
34186
34982
  // src/config/dashboard-validation.ts
34187
- import { z as z67 } from "zod";
34188
- var navIdListSchema2 = z67.preprocess((value) => {
34983
+ import { z as z68 } from "zod";
34984
+ var navIdListSchema2 = z68.preprocess((value) => {
34189
34985
  if (!Array.isArray(value)) return void 0;
34190
34986
  const filtered = value.filter((v) => typeof v === "string" && v.trim().length > 0);
34191
34987
  return filtered.length > 0 ? filtered : void 0;
34192
- }, z67.array(z67.string()).max(200, "Maximum 200 nav IDs").optional());
34193
- var dashboardNavVisibilityBaseSchema2 = z67.object({
34194
- mode: z67.enum(["augment", "restrict"]).optional(),
34988
+ }, z68.array(z68.string()).max(200, "Maximum 200 nav IDs").optional());
34989
+ var dashboardNavVisibilityBaseSchema2 = z68.object({
34990
+ mode: z68.enum(["augment", "restrict"]).optional(),
34195
34991
  allowIds: navIdListSchema2,
34196
34992
  denyIds: navIdListSchema2
34197
34993
  }).strip();
34198
- var dashboardNavVisibilityRolesSchema2 = z67.object({
34994
+ var dashboardNavVisibilityRolesSchema2 = z68.object({
34199
34995
  administrator: dashboardNavVisibilityBaseSchema2.optional(),
34200
34996
  editor: dashboardNavVisibilityBaseSchema2.optional(),
34201
34997
  team_member: dashboardNavVisibilityBaseSchema2.optional()
@@ -34203,20 +34999,20 @@ var dashboardNavVisibilityRolesSchema2 = z67.object({
34203
34999
  var dashboardNavVisibilitySchema2 = dashboardNavVisibilityBaseSchema2.extend({
34204
35000
  roles: dashboardNavVisibilityRolesSchema2
34205
35001
  }).strip();
34206
- var dashboardNavigationConfigSchema2 = z67.object({
35002
+ var dashboardNavigationConfigSchema2 = z68.object({
34207
35003
  siteNav: dashboardNavVisibilitySchema2.optional(),
34208
35004
  settingsNav: dashboardNavVisibilitySchema2.optional()
34209
35005
  }).strip();
34210
- var dashboardConfigSchema2 = z67.object({
34211
- previewEditingEnabled: z67.boolean().optional(),
35006
+ var dashboardConfigSchema2 = z68.object({
35007
+ previewEditingEnabled: z68.boolean().optional(),
34212
35008
  navigation: dashboardNavigationConfigSchema2.optional()
34213
35009
  }).strip();
34214
35010
 
34215
35011
  // src/zod/titleSourceSchema.ts
34216
- import { z as z68 } from "zod";
34217
- var titleSourceValueSchema = z68.union([
34218
- z68.string().min(1),
34219
- z68.array(z68.string().min(1)).min(1)
35012
+ import { z as z69 } from "zod";
35013
+ var titleSourceValueSchema = z69.union([
35014
+ z69.string().min(1),
35015
+ z69.array(z69.string().min(1)).min(1)
34220
35016
  ]);
34221
35017
 
34222
35018
  // src/data/prefetchBlockData.ts
@@ -34235,11 +35031,11 @@ var SUPPORTED_LOADER_ENDPOINTS2 = [
34235
35031
  ];
34236
35032
 
34237
35033
  // src/config/validation.ts
34238
- var sdkThemePaletteSchema2 = z69.record(z69.string(), z69.string());
34239
- var sdkThemeConfigSchema2 = z69.object({
35034
+ var sdkThemePaletteSchema2 = z70.record(z70.string(), z70.string());
35035
+ var sdkThemeConfigSchema2 = z70.object({
34240
35036
  palette: sdkThemePaletteSchema2
34241
35037
  });
34242
- var sdkSiteUrlSchema = z69.string().url("Must be a valid URL").refine((url) => {
35038
+ var sdkSiteUrlSchema = z70.string().url("Must be a valid URL").refine((url) => {
34243
35039
  try {
34244
35040
  const parsed = new URL(url);
34245
35041
  const isLocal = parsed.hostname === "localhost" || parsed.hostname.endsWith(".localhost") || parsed.hostname.endsWith(".local") || parsed.hostname.endsWith(".test");
@@ -34248,97 +35044,97 @@ var sdkSiteUrlSchema = z69.string().url("Must be a valid URL").refine((url) => {
34248
35044
  return false;
34249
35045
  }
34250
35046
  }, { message: "Production URLs must use HTTPS" }).transform((url) => url.replace(/\/$/, ""));
34251
- var sectionBackgroundSchema = z69.object({
34252
- id: z69.string(),
34253
- label: z69.string(),
34254
- token: z69.string()
35047
+ var sectionBackgroundSchema = z70.object({
35048
+ id: z70.string(),
35049
+ label: z70.string(),
35050
+ token: z70.string()
34255
35051
  // Reference to theme palette token
34256
35052
  });
34257
- var sectionSpacingSchema = z69.enum(["compact", "default", "spacious"]);
34258
- var containerMaxWidthSchema = z69.enum(["narrow", "default", "wide", "full"]);
34259
- var containerAlignmentSchema = z69.enum(["left", "center", "right"]);
34260
- var sectionOptionsSchema = z69.object({
34261
- backgroundColor: z69.boolean().optional(),
34262
- backgroundImage: z69.boolean().optional(),
34263
- backgroundGradient: z69.boolean().optional(),
34264
- spacing: z69.union([
34265
- z69.array(sectionSpacingSchema),
34266
- z69.boolean()
35053
+ var sectionSpacingSchema = z70.enum(["compact", "default", "spacious"]);
35054
+ var containerMaxWidthSchema = z70.enum(["narrow", "default", "wide", "full"]);
35055
+ var containerAlignmentSchema = z70.enum(["left", "center", "right"]);
35056
+ var sectionOptionsSchema = z70.object({
35057
+ backgroundColor: z70.boolean().optional(),
35058
+ backgroundImage: z70.boolean().optional(),
35059
+ backgroundGradient: z70.boolean().optional(),
35060
+ spacing: z70.union([
35061
+ z70.array(sectionSpacingSchema),
35062
+ z70.boolean()
34267
35063
  ]).optional(),
34268
- textColor: z69.boolean().optional()
35064
+ textColor: z70.boolean().optional()
34269
35065
  }).optional();
34270
- var containerOptionsSchema = z69.object({
34271
- maxWidth: z69.union([
34272
- z69.array(containerMaxWidthSchema),
34273
- z69.boolean()
35066
+ var containerOptionsSchema = z70.object({
35067
+ maxWidth: z70.union([
35068
+ z70.array(containerMaxWidthSchema),
35069
+ z70.boolean()
34274
35070
  ]).optional(),
34275
- alignment: z69.union([
34276
- z69.array(containerAlignmentSchema),
34277
- z69.boolean()
35071
+ alignment: z70.union([
35072
+ z70.array(containerAlignmentSchema),
35073
+ z70.boolean()
34278
35074
  ]).optional()
34279
35075
  }).optional();
34280
- var siteStyleConfigSchema = z69.object({
34281
- sectionBackgrounds: z69.array(sectionBackgroundSchema).optional(),
35076
+ var siteStyleConfigSchema = z70.object({
35077
+ sectionBackgrounds: z70.array(sectionBackgroundSchema).optional(),
34282
35078
  sectionOptions: sectionOptionsSchema,
34283
35079
  containerOptions: containerOptionsSchema
34284
35080
  }).optional();
34285
- var sdkLoaderEndpointSchema2 = z69.enum(SUPPORTED_LOADER_ENDPOINTS2);
35081
+ var sdkLoaderEndpointSchema2 = z70.enum(SUPPORTED_LOADER_ENDPOINTS2);
34286
35082
  var allowedTransformIds = new Set(builtinTransformDefinitions.map((transform) => transform.id));
34287
- var loaderTransformStepSchema = z69.object({
34288
- id: z69.string().refine((id) => allowedTransformIds.has(id), {
35083
+ var loaderTransformStepSchema = z70.object({
35084
+ id: z70.string().refine((id) => allowedTransformIds.has(id), {
34289
35085
  message: "Unknown transform id"
34290
35086
  }),
34291
- options: z69.record(z69.string(), z69.unknown()).optional()
35087
+ options: z70.record(z70.string(), z70.unknown()).optional()
34292
35088
  });
34293
- var loaderParamBindingSchema2 = z69.object({
34294
- $bind: z69.object({
34295
- from: z69.string().min(1, "Binding path is required"),
35089
+ var loaderParamBindingSchema2 = z70.object({
35090
+ $bind: z70.object({
35091
+ from: z70.string().min(1, "Binding path is required"),
34296
35092
  // Loader params are ultimately string-normalized for query strings, so fallbacks should
34297
35093
  // stay scalar. Use transforms (e.g. `value.jsonArray`) when you need to serialize
34298
35094
  // more complex values into a string.
34299
- fallback: z69.union([z69.string(), z69.number(), z69.boolean(), z69.null()]).optional(),
34300
- transforms: z69.array(loaderTransformStepSchema).default([]),
34301
- pick: z69.enum(["value", "collection", "context"]).default("value"),
34302
- coerce: z69.enum(["number", "boolean", "string"]).optional()
35095
+ fallback: loaderFallbackScalarSchema.optional(),
35096
+ transforms: z70.array(loaderTransformStepSchema).default([]),
35097
+ pick: z70.enum(["value", "collection", "context"]).default("value"),
35098
+ coerce: z70.enum(["number", "boolean", "string"]).optional()
34303
35099
  })
34304
35100
  });
34305
- var loaderParamValueSchema2 = z69.union([
34306
- z69.string(),
34307
- z69.number(),
34308
- z69.boolean(),
35101
+ var loaderParamValueSchema2 = z70.union([
35102
+ z70.string(),
35103
+ z70.number(),
35104
+ z70.boolean(),
34309
35105
  loaderParamBindingSchema2
34310
35106
  ]);
34311
- var loaderWhenValueSchema = z69.union([
34312
- z69.boolean(),
35107
+ var loaderWhenValueSchema = z70.union([
35108
+ z70.boolean(),
34313
35109
  loaderParamBindingSchema2
34314
35110
  ]);
34315
- var sdkConfigLoaderSchema2 = z69.object({
35111
+ var sdkConfigLoaderSchema2 = z70.object({
34316
35112
  endpoint: sdkLoaderEndpointSchema2,
34317
- params: z69.record(z69.string(), loaderParamValueSchema2),
34318
- mode: z69.enum(["server", "client"]).default("server"),
35113
+ params: z70.record(z70.string(), loaderParamValueSchema2),
35114
+ mode: z70.enum(["server", "client"]).default("server"),
34319
35115
  when: loaderWhenValueSchema.optional()
34320
35116
  });
34321
- var sdkDataLoadersSchema2 = z69.record(z69.string(), sdkConfigLoaderSchema2).refine(
35117
+ var sdkDataLoadersSchema2 = z70.record(z70.string(), sdkConfigLoaderSchema2).refine(
34322
35118
  (loaders) => Object.keys(loaders).length <= 5,
34323
35119
  { message: "Maximum 5 data loaders per block" }
34324
35120
  ).optional();
34325
- var fieldSelectOptionSchema = z69.object({
34326
- value: z69.string().min(1, "Option value is required"),
34327
- label: z69.string().min(1, "Option label is required")
35121
+ var fieldSelectOptionSchema = z70.object({
35122
+ value: z70.string().min(1, "Option value is required"),
35123
+ label: z70.string().min(1, "Option label is required")
34328
35124
  });
34329
- var blockFieldConfigSchema = z69.object({
34330
- options: z69.array(fieldSelectOptionSchema).min(1, "At least one option is required").optional()
35125
+ var blockFieldConfigSchema = z70.object({
35126
+ options: z70.array(fieldSelectOptionSchema).min(1, "At least one option is required").optional()
34331
35127
  });
34332
- var blockFieldOptionsSchema = z69.record(
34333
- z69.string().regex(/^(block\.|custom\.)[a-z][a-z0-9-]*$/, {
35128
+ var blockFieldOptionsSchema = z70.record(
35129
+ z70.string().regex(/^(block\.|custom\.)[a-z][a-z0-9-]*$/, {
34334
35130
  message: "Block ID must be 'block.*' or 'custom.*' format"
34335
35131
  }),
34336
- z69.record(
34337
- z69.string().min(1, "Field ID is required"),
35132
+ z70.record(
35133
+ z70.string().min(1, "Field ID is required"),
34338
35134
  blockFieldConfigSchema
34339
35135
  )
34340
35136
  ).optional();
34341
- var blockFieldExtensionSchema = z69.object({
35137
+ var blockFieldExtensionSchema = z70.object({
34342
35138
  fields: fieldSchema.array().min(1, "At least one field is required")
34343
35139
  }).refine(
34344
35140
  (data) => {
@@ -34352,10 +35148,10 @@ var blockFieldExtensionSchema = z69.object({
34352
35148
  message: "Required fields must have a defaultValue to support existing blocks"
34353
35149
  }
34354
35150
  );
34355
- var blockFieldExtensionsMapSchema = z69.record(
35151
+ var blockFieldExtensionsMapSchema = z70.record(
34356
35152
  // System blocks are kebab-case: block.body-text, block.event-calendar, ...
34357
35153
  // Enforce: lowercase alphanumerics with single hyphens (no trailing hyphen, no consecutive hyphens).
34358
- z69.string().regex(/^block\.[a-z][a-z0-9]*(?:-[a-z0-9]+)*$/, {
35154
+ z70.string().regex(/^block\.[a-z][a-z0-9]*(?:-[a-z0-9]+)*$/, {
34359
35155
  message: "Block ID must be 'block.*' format (system blocks only)"
34360
35156
  }),
34361
35157
  blockFieldExtensionSchema
@@ -34371,7 +35167,7 @@ var blockFieldExtensionsMapSchema = z69.record(
34371
35167
  (field) => field.id === collision.fieldId
34372
35168
  );
34373
35169
  ctx.addIssue({
34374
- code: z69.ZodIssueCode.custom,
35170
+ code: z70.ZodIssueCode.custom,
34375
35171
  message: collision.message,
34376
35172
  path: [
34377
35173
  APPOINTMENT_BOOKING_BLOCK_ID,
@@ -34437,24 +35233,24 @@ function validateFieldIdConflicts(blockFieldExtensions) {
34437
35233
  }
34438
35234
  return conflicts;
34439
35235
  }
34440
- var syncConfigSchema = z69.object({
34441
- existingEntries: z69.enum(["skip", "update"]).optional()
35236
+ var syncConfigSchema = z70.object({
35237
+ existingEntries: z70.enum(["skip", "update"]).optional()
34442
35238
  }).optional();
34443
- var deployConfigSchema = z69.object({
34444
- verifyCommand: z69.string().optional(),
34445
- prebuildOutput: z69.string().optional()
35239
+ var deployConfigSchema = z70.object({
35240
+ verifyCommand: z70.string().optional(),
35241
+ prebuildOutput: z70.string().optional()
34446
35242
  }).optional();
34447
- var sdkCustomBlockSchema = z69.object({
35243
+ var sdkCustomBlockSchema = z70.object({
34448
35244
  // Block ID must start with 'custom.'
34449
- id: z69.string().min(8).regex(/^custom\.[a-z][a-z0-9-]*$/, {
35245
+ id: z70.string().min(8).regex(/^custom\.[a-z][a-z0-9-]*$/, {
34450
35246
  message: "Block ID must start with 'custom.' followed by lowercase letters, numbers, or hyphens"
34451
35247
  }),
34452
- title: z69.string().min(1, "Title is required"),
35248
+ title: z70.string().min(1, "Title is required"),
34453
35249
  titleSource: titleSourceValueSchema.optional(),
34454
- description: z69.string().optional(),
35250
+ description: z70.string().optional(),
34455
35251
  category: blockCategoryEnum,
34456
- icon: z69.string().optional(),
34457
- tags: z69.array(z69.string()).optional(),
35252
+ icon: z70.string().optional(),
35253
+ tags: z70.array(z70.string()).optional(),
34458
35254
  // Reuse the exact field schema from @riverbankcms/blocks - all field types supported
34459
35255
  fields: fieldSchema.array().min(1, "Custom blocks must have at least one field"),
34460
35256
  // Data loaders for CMS endpoints
@@ -34462,14 +35258,14 @@ var sdkCustomBlockSchema = z69.object({
34462
35258
  // Optional declarative layout - when present, block can render without React override
34463
35259
  layout: NodeSchema.optional(),
34464
35260
  // Optional variants system (preferred when a block has multiple structural layouts)
34465
- variants: z69.record(z69.string().min(1), NodeSchema).optional(),
34466
- defaultVariant: z69.string().min(1).optional(),
34467
- variantOptions: z69.record(
34468
- z69.string().min(1),
34469
- z69.object({
34470
- label: z69.string().min(1).optional(),
34471
- description: z69.string().min(1).optional(),
34472
- icon: z69.string().min(1).optional()
35261
+ variants: z70.record(z70.string().min(1), NodeSchema).optional(),
35262
+ defaultVariant: z70.string().min(1).optional(),
35263
+ variantOptions: z70.record(
35264
+ z70.string().min(1),
35265
+ z70.object({
35266
+ label: z70.string().min(1).optional(),
35267
+ description: z70.string().min(1).optional(),
35268
+ icon: z70.string().min(1).optional()
34473
35269
  })
34474
35270
  ).optional()
34475
35271
  }).superRefine((data, ctx) => {
@@ -34480,7 +35276,7 @@ var sdkCustomBlockSchema = z69.object({
34480
35276
  const exists = fields3.some((field) => field.id === source);
34481
35277
  if (!exists) {
34482
35278
  ctx.addIssue({
34483
- code: z69.ZodIssueCode.custom,
35279
+ code: z70.ZodIssueCode.custom,
34484
35280
  message: `titleSource must reference a valid field ID (got "${source}")`,
34485
35281
  path: Array.isArray(data.titleSource) ? ["titleSource", index] : ["titleSource"]
34486
35282
  });
@@ -34489,7 +35285,7 @@ var sdkCustomBlockSchema = z69.object({
34489
35285
  }
34490
35286
  if (data.layout && data.variants) {
34491
35287
  ctx.addIssue({
34492
- code: z69.ZodIssueCode.custom,
35288
+ code: z70.ZodIssueCode.custom,
34493
35289
  message: "Custom block must define either `layout` or `variants`, not both",
34494
35290
  path: ["variants"]
34495
35291
  });
@@ -34499,7 +35295,7 @@ var sdkCustomBlockSchema = z69.object({
34499
35295
  if (!result.valid) {
34500
35296
  for (const error of result.errors) {
34501
35297
  ctx.addIssue({
34502
- code: z69.ZodIssueCode.custom,
35298
+ code: z70.ZodIssueCode.custom,
34503
35299
  message: error.message,
34504
35300
  path: ["layout"]
34505
35301
  });
@@ -34510,14 +35306,14 @@ var sdkCustomBlockSchema = z69.object({
34510
35306
  const keys = Object.keys(data.variants);
34511
35307
  if (keys.length === 0) {
34512
35308
  ctx.addIssue({
34513
- code: z69.ZodIssueCode.custom,
35309
+ code: z70.ZodIssueCode.custom,
34514
35310
  message: "`variants` must contain at least one variant key",
34515
35311
  path: ["variants"]
34516
35312
  });
34517
35313
  }
34518
35314
  if (data.defaultVariant && !Object.prototype.hasOwnProperty.call(data.variants, data.defaultVariant)) {
34519
35315
  ctx.addIssue({
34520
- code: z69.ZodIssueCode.custom,
35316
+ code: z70.ZodIssueCode.custom,
34521
35317
  message: "`defaultVariant` must be a key present in `variants`",
34522
35318
  path: ["defaultVariant"]
34523
35319
  });
@@ -34527,7 +35323,7 @@ var sdkCustomBlockSchema = z69.object({
34527
35323
  if (!result.valid) {
34528
35324
  for (const error of result.errors) {
34529
35325
  ctx.addIssue({
34530
- code: z69.ZodIssueCode.custom,
35326
+ code: z70.ZodIssueCode.custom,
34531
35327
  message: `${key}: ${error.message}`,
34532
35328
  path: ["variants", key]
34533
35329
  });
@@ -34538,7 +35334,7 @@ var sdkCustomBlockSchema = z69.object({
34538
35334
  for (const key of Object.keys(data.variantOptions)) {
34539
35335
  if (!Object.prototype.hasOwnProperty.call(data.variants, key)) {
34540
35336
  ctx.addIssue({
34541
- code: z69.ZodIssueCode.custom,
35337
+ code: z70.ZodIssueCode.custom,
34542
35338
  message: "`variantOptions` key must exist in `variants`",
34543
35339
  path: ["variantOptions", key]
34544
35340
  });
@@ -34547,58 +35343,58 @@ var sdkCustomBlockSchema = z69.object({
34547
35343
  }
34548
35344
  }
34549
35345
  });
34550
- var themeSourceSchema = z69.enum(["local", "cms"]).optional();
34551
- var activeThemeSchema = z69.string().regex(/^[a-z0-9][a-z0-9-_]*$/, {
35346
+ var themeSourceSchema = z70.enum(["local", "cms"]).optional();
35347
+ var activeThemeSchema = z70.string().regex(/^[a-z0-9][a-z0-9-_]*$/, {
34552
35348
  message: "Theme name must be lowercase alphanumeric with hyphens/underscores"
34553
35349
  }).max(64, "Theme name too long").optional();
34554
35350
  function isValidConfigBlockKind(kind) {
34555
35351
  if (getBlockDefinition(kind)) return true;
34556
35352
  return /^custom\.[a-z][a-z0-9-]*$/.test(kind);
34557
35353
  }
34558
- var layoutBlockKindSchema = z69.string().refine(isValidConfigBlockKind, {
35354
+ var layoutBlockKindSchema = z70.string().refine(isValidConfigBlockKind, {
34559
35355
  message: 'Block kind must be a system block (e.g., "block.hero") or a custom block (e.g., "custom.my-block")'
34560
35356
  });
34561
- var layoutFooterBlockSchema = z69.object({
34562
- id: z69.string().min(1).optional(),
35357
+ var layoutFooterBlockSchema = z70.object({
35358
+ id: z70.string().min(1).optional(),
34563
35359
  kind: layoutBlockKindSchema,
34564
35360
  // Allow omitted content for blocks that rely on defaults.
34565
- content: z69.record(z69.string(), z69.unknown()).optional()
35361
+ content: z70.record(z70.string(), z70.unknown()).optional()
34566
35362
  }).strict();
34567
- var layoutConfigSchema = z69.object({
34568
- footerBlocks: z69.array(layoutFooterBlockSchema).optional()
35363
+ var layoutConfigSchema = z70.object({
35364
+ footerBlocks: z70.array(layoutFooterBlockSchema).optional()
34569
35365
  }).strict();
34570
- var sdkWorkflowIdSchema2 = z69.string().min(1).max(SDK_WORKFLOW_ID_MAX_LENGTH).regex(SDK_WORKFLOW_ID_PATTERN, {
35366
+ var sdkWorkflowIdSchema2 = z70.string().min(1).max(SDK_WORKFLOW_ID_MAX_LENGTH).regex(SDK_WORKFLOW_ID_PATTERN, {
34571
35367
  message: "Workflow ID must start with a lowercase letter and use lowercase letters, numbers, dots, underscores, or hyphens"
34572
35368
  });
34573
- 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 "/"' });
34574
- var sdkWorkflowTriggerSchema2 = z69.discriminatedUnion("type", [
34575
- z69.object({ type: z69.literal("manual") }).strict()
35369
+ 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 "/"' });
35370
+ var sdkWorkflowTriggerSchema2 = z70.discriminatedUnion("type", [
35371
+ z70.object({ type: z70.literal("manual") }).strict()
34576
35372
  ]);
34577
- var sdkWorkflowConfirmationSchema2 = z69.object({
34578
- title: z69.string().trim().min(1).max(SDK_WORKFLOW_CONFIRMATION_TITLE_MAX_LENGTH),
34579
- body: z69.string().trim().min(1).max(SDK_WORKFLOW_CONFIRMATION_BODY_MAX_LENGTH).optional()
35373
+ var sdkWorkflowConfirmationSchema2 = z70.object({
35374
+ title: z70.string().trim().min(1).max(SDK_WORKFLOW_CONFIRMATION_TITLE_MAX_LENGTH),
35375
+ body: z70.string().trim().min(1).max(SDK_WORKFLOW_CONFIRMATION_BODY_MAX_LENGTH).optional()
34580
35376
  }).strict();
34581
- var sdkWorkflowConfigSchema2 = z69.object({
35377
+ var sdkWorkflowConfigSchema2 = z70.object({
34582
35378
  id: sdkWorkflowIdSchema2,
34583
- title: z69.string().trim().min(1).max(SDK_WORKFLOW_TITLE_MAX_LENGTH),
34584
- description: z69.string().trim().min(1).max(SDK_WORKFLOW_DESCRIPTION_MAX_LENGTH).optional(),
34585
- contentType: z69.string().trim().min(1).max(SDK_WORKFLOW_CONTENT_TYPE_MAX_LENGTH),
35379
+ title: z70.string().trim().min(1).max(SDK_WORKFLOW_TITLE_MAX_LENGTH),
35380
+ description: z70.string().trim().min(1).max(SDK_WORKFLOW_DESCRIPTION_MAX_LENGTH).optional(),
35381
+ contentType: z70.string().trim().min(1).max(SDK_WORKFLOW_CONTENT_TYPE_MAX_LENGTH),
34586
35382
  endpoint: sdkWorkflowEndpointSchema2,
34587
- triggers: z69.array(sdkWorkflowTriggerSchema2).min(1).max(SDK_WORKFLOW_TRIGGER_MAX_COUNT),
35383
+ triggers: z70.array(sdkWorkflowTriggerSchema2).min(1).max(SDK_WORKFLOW_TRIGGER_MAX_COUNT),
34588
35384
  confirmation: sdkWorkflowConfirmationSchema2.optional()
34589
35385
  }).strict();
34590
- var sdkWorkflowsSchema2 = z69.array(sdkWorkflowConfigSchema2).max(SDK_WORKFLOW_MAX_COUNT, "Maximum 50 workflows per site").refine((workflows) => {
35386
+ var sdkWorkflowsSchema2 = z70.array(sdkWorkflowConfigSchema2).max(SDK_WORKFLOW_MAX_COUNT, "Maximum 50 workflows per site").refine((workflows) => {
34591
35387
  const ids = workflows.map((workflow) => workflow.id);
34592
35388
  return ids.length === new Set(ids).size;
34593
35389
  }, { message: "Workflow IDs must be unique" }).optional();
34594
- var riverbankSiteConfigSchema = z69.object({
34595
- siteId: z69.string().uuid(),
35390
+ var riverbankSiteConfigSchema = z70.object({
35391
+ siteId: z70.string().uuid(),
34596
35392
  previewUrl: sdkSiteUrlSchema.optional(),
34597
35393
  liveUrl: sdkSiteUrlSchema.optional(),
34598
35394
  theme: sdkThemeConfigSchema2.optional(),
34599
35395
  styles: siteStyleConfigSchema,
34600
35396
  layout: layoutConfigSchema.optional(),
34601
- customBlocks: z69.array(sdkCustomBlockSchema).max(100, "Maximum 100 custom blocks per site").refine(
35397
+ customBlocks: z70.array(sdkCustomBlockSchema).max(100, "Maximum 100 custom blocks per site").refine(
34602
35398
  // Ensure unique block IDs
34603
35399
  (blocks) => {
34604
35400
  const ids = blocks.map((b) => b.id);
@@ -34611,7 +35407,7 @@ var riverbankSiteConfigSchema = z69.object({
34611
35407
  workflows: sdkWorkflowsSchema2,
34612
35408
  content: contentConfigSchema.optional(),
34613
35409
  // CLI-related configuration (Phase 4)
34614
- contentDir: z69.string().optional(),
35410
+ contentDir: z70.string().optional(),
34615
35411
  sync: syncConfigSchema,
34616
35412
  deploy: deployConfigSchema,
34617
35413
  // Theme sync configuration (Phase 5)