@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
@@ -1803,7 +1803,16 @@ var ENDPOINT_DEFINITIONS = {
1803
1803
  revalidate: 60,
1804
1804
  tags: ["site-{siteId}", "content-{siteId}-{type}"],
1805
1805
  auth: "user",
1806
- responseKind: "json"
1806
+ responseKind: "json",
1807
+ errors: ["validation:invalid_input", "resource:not_found", "resource:conflict", "server:internal_error"]
1808
+ },
1809
+ reorderContentEntries: {
1810
+ path: "/sites/{siteId}/content/{type}/order",
1811
+ method: "POST",
1812
+ tags: ["site-{siteId}", "content-{siteId}-{type}"],
1813
+ auth: "user",
1814
+ responseKind: "json",
1815
+ errors: ["validation:invalid_input", "resource:not_found", "resource:conflict", "server:internal_error"]
1807
1816
  },
1808
1817
  getContentTemplate: {
1809
1818
  path: "/sites/{siteId}/content/types/{type}/template",
@@ -3955,6 +3964,14 @@ var ENDPOINT_DEFINITIONS = {
3955
3964
  responseKind: "json",
3956
3965
  errors: []
3957
3966
  },
3967
+ applyDiscountCode: {
3968
+ path: "/public/sites/{siteId}/bookings/discounts/apply",
3969
+ method: "POST",
3970
+ tags: ["site-{siteId}", "booking-discounts"],
3971
+ auth: "public",
3972
+ responseKind: "json",
3973
+ errors: ["validation:invalid_input", "rate_limit:exceeded"]
3974
+ },
3958
3975
  // Batch endpoint for block loader requests (reduces SSR fan-out)
3959
3976
  batchBlockLoaders: {
3960
3977
  path: "/public/sites/{siteId}/block-loaders/batch",
@@ -6408,18 +6425,21 @@ function buildEndpointURL(baseURL, endpoint) {
6408
6425
  function isFormDataBody(value) {
6409
6426
  return typeof FormData !== "undefined" && value instanceof FormData;
6410
6427
  }
6428
+ function isUnknownArray(value) {
6429
+ return Array.isArray(value);
6430
+ }
6411
6431
  function appendQueryParam(queryParams, key, value) {
6412
6432
  if (value === void 0 || value === null) {
6413
6433
  return;
6414
6434
  }
6415
- if (Array.isArray(value)) {
6435
+ if (isUnknownArray(value)) {
6416
6436
  const stack2 = [...value].reverse();
6417
6437
  while (stack2.length > 0) {
6418
6438
  const item = stack2.pop();
6419
6439
  if (item === void 0 || item === null) {
6420
6440
  continue;
6421
6441
  }
6422
- if (Array.isArray(item)) {
6442
+ if (isUnknownArray(item)) {
6423
6443
  stack2.push(...[...item].reverse());
6424
6444
  continue;
6425
6445
  }
@@ -6429,6 +6449,12 @@ function appendQueryParam(queryParams, key, value) {
6429
6449
  }
6430
6450
  queryParams.append(key, String(value));
6431
6451
  }
6452
+ function serializePathParam(endpoint, key, value) {
6453
+ if (typeof value === "string") {
6454
+ return value;
6455
+ }
6456
+ throw new Error(`Invalid path param for endpoint ${String(endpoint)}: ${key} must be a string`);
6457
+ }
6432
6458
  function invalidateCacheTags(tags2, params) {
6433
6459
  const resolved = getRevalidateTag();
6434
6460
  if (typeof window !== "undefined" || !resolved || !tags2) return;
@@ -6567,8 +6593,9 @@ function createRawCMSClient(headers = {}, baseUrl) {
6567
6593
  const bracePlaceholder = `{${key}}`;
6568
6594
  const colonPlaceholder = `:${key}`;
6569
6595
  if (originalPath.includes(bracePlaceholder) || originalPath.includes(colonPlaceholder)) {
6570
- url = url.replace(bracePlaceholder, value);
6571
- url = url.replace(colonPlaceholder, value);
6596
+ const stringValue = serializePathParam(endpoint, key, value);
6597
+ url = url.replace(bracePlaceholder, stringValue);
6598
+ url = url.replace(colonPlaceholder, stringValue);
6572
6599
  } else {
6573
6600
  unusedParams[key] = value;
6574
6601
  }
@@ -6842,7 +6869,7 @@ var SimpleCache = class {
6842
6869
  };
6843
6870
 
6844
6871
  // src/version.ts
6845
- var SDK_VERSION = "0.77.1";
6872
+ var SDK_VERSION = "0.78.2";
6846
6873
 
6847
6874
  // src/client/error.ts
6848
6875
  var RiverbankApiError = class _RiverbankApiError extends Error {
@@ -6987,6 +7014,16 @@ var RiverbankApiError = class _RiverbankApiError extends Error {
6987
7014
  return lines.join("\n");
6988
7015
  }
6989
7016
  };
7017
+ var resilienceStatusSymbol = /* @__PURE__ */ Symbol.for("riverbankcms.sdk.resilienceStatus");
7018
+ function attachResilienceStatusToError(error, resilienceStatus) {
7019
+ const target = error !== null && (typeof error === "object" || typeof error === "function") ? error : new Error(error === void 0 ? "Unknown error" : String(error));
7020
+ Object.defineProperty(target, resilienceStatusSymbol, {
7021
+ configurable: true,
7022
+ enumerable: false,
7023
+ value: resilienceStatus
7024
+ });
7025
+ return target;
7026
+ }
6990
7027
 
6991
7028
  // src/client/resilience.ts
6992
7029
  var DEFAULT_RETRY_CONFIG = {
@@ -7245,7 +7282,10 @@ var CircuitOpenError = class extends Error {
7245
7282
  var prebuildModule = null;
7246
7283
  function tryRequire(modulePath) {
7247
7284
  try {
7248
- const req = Function('return typeof require === "function" ? require : null')();
7285
+ const getRequire = new Function(
7286
+ 'return typeof require === "function" ? require : null'
7287
+ );
7288
+ const req = getRequire();
7249
7289
  return req ? req(modulePath) : null;
7250
7290
  } catch {
7251
7291
  return null;
@@ -7264,7 +7304,9 @@ function getPrebuildModule() {
7264
7304
  return null;
7265
7305
  }
7266
7306
  try {
7267
- prebuildModule = tryRequire("../prebuild/loader");
7307
+ prebuildModule = tryRequire(
7308
+ "../prebuild/loader"
7309
+ );
7268
7310
  return prebuildModule;
7269
7311
  } catch {
7270
7312
  return null;
@@ -7324,7 +7366,9 @@ function normalizePublicFormResult(result) {
7324
7366
  }
7325
7367
  function normalizePublicFormsResponse(response) {
7326
7368
  return {
7327
- forms: response.forms.map((form2) => normalizePublicFormResponse({ form: form2 }).form)
7369
+ forms: response.forms.map(
7370
+ (form2) => normalizePublicFormResponse({ form: form2 }).form
7371
+ )
7328
7372
  };
7329
7373
  }
7330
7374
  function normalizePublicFormsResult(result) {
@@ -7523,7 +7567,10 @@ function createRiverbankClient(config) {
7523
7567
  isDegraded = nowDegraded;
7524
7568
  config.resilience?.onDegradedMode?.(nowDegraded, status);
7525
7569
  }
7526
- return data;
7570
+ return {
7571
+ data,
7572
+ resilience: status
7573
+ };
7527
7574
  }
7528
7575
  async function resilientFetch(cacheKey, fetcher, options) {
7529
7576
  const requestId = generateRequestId2();
@@ -7547,25 +7594,43 @@ function createRiverbankClient(config) {
7547
7594
  if (allowFallbacks && !isPreview && staleIfError) {
7548
7595
  const stale = cache.getStale(cacheKey);
7549
7596
  if (stale) {
7550
- return emitStatus("stale", stale.value, statusDetails({
7551
- staleAgeSec: stale.staleAgeSec,
7552
- error: { code: "circuit_open", message: "Circuit breaker is open" }
7553
- }));
7597
+ return emitStatus(
7598
+ "stale",
7599
+ stale.value,
7600
+ statusDetails({
7601
+ staleAgeSec: stale.staleAgeSec,
7602
+ error: {
7603
+ code: "circuit_open",
7604
+ message: "Circuit breaker is open"
7605
+ }
7606
+ })
7607
+ );
7554
7608
  }
7555
7609
  }
7556
7610
  if (allowFallbacks && !isPreview && options.prebuildFallback) {
7557
7611
  const prebuildResult = options.prebuildFallback();
7558
7612
  if (prebuildResult) {
7559
- return emitStatus("prebuild", prebuildResult.data, statusDetails({
7560
- prebuildAgeSec: prebuildResult.prebuildAgeSec,
7561
- error: { code: "circuit_open", message: "Circuit breaker is open" }
7562
- }));
7613
+ return emitStatus(
7614
+ "prebuild",
7615
+ prebuildResult.data,
7616
+ statusDetails({
7617
+ prebuildAgeSec: prebuildResult.prebuildAgeSec,
7618
+ error: {
7619
+ code: "circuit_open",
7620
+ message: "Circuit breaker is open"
7621
+ }
7622
+ })
7623
+ );
7563
7624
  }
7564
7625
  }
7565
7626
  const circuitState = circuitBreaker.getState();
7566
- emitStatus("error", null, statusDetails({
7567
- error: { code: "circuit_open", message: "Circuit breaker is open" }
7568
- }));
7627
+ emitStatus(
7628
+ "error",
7629
+ null,
7630
+ statusDetails({
7631
+ error: { code: "circuit_open", message: "Circuit breaker is open" }
7632
+ })
7633
+ );
7569
7634
  throw new CircuitOpenError(circuitState);
7570
7635
  }
7571
7636
  try {
@@ -7592,7 +7657,9 @@ function createRiverbankClient(config) {
7592
7657
  circuitBreaker.recordSuccess();
7593
7658
  } else {
7594
7659
  try {
7595
- const response = await fetcher(options.signal ?? new AbortController().signal);
7660
+ const response = await fetcher(
7661
+ options.signal ?? new AbortController().signal
7662
+ );
7596
7663
  data = unwrapResponse(response);
7597
7664
  } catch (error) {
7598
7665
  convertToTypedError(error);
@@ -7609,28 +7676,51 @@ function createRiverbankClient(config) {
7609
7676
  if (allowFallbacks && !isPreview && staleIfError && cacheEnabled) {
7610
7677
  const stale = cache.getStale(cacheKey);
7611
7678
  if (stale) {
7612
- const errorInfo2 = error instanceof RiverbankApiError ? { code: error.code, message: error.message } : { message: error.message };
7613
- return emitStatus("stale", stale.value, statusDetails({
7614
- staleAgeSec: stale.staleAgeSec,
7615
- error: errorInfo2
7616
- }));
7679
+ const errorInfo2 = error instanceof RiverbankApiError ? {
7680
+ code: error.code,
7681
+ message: error.message,
7682
+ status: error.status
7683
+ } : { message: error.message };
7684
+ return emitStatus(
7685
+ "stale",
7686
+ stale.value,
7687
+ statusDetails({
7688
+ staleAgeSec: stale.staleAgeSec,
7689
+ error: errorInfo2
7690
+ })
7691
+ );
7617
7692
  }
7618
7693
  }
7619
7694
  if (allowFallbacks && !isPreview && options.prebuildFallback) {
7620
7695
  const prebuildResult = options.prebuildFallback();
7621
7696
  if (prebuildResult) {
7622
- const errorInfo2 = error instanceof RiverbankApiError ? { code: error.code, message: error.message } : { message: error.message };
7623
- return emitStatus("prebuild", prebuildResult.data, statusDetails({
7624
- prebuildAgeSec: prebuildResult.prebuildAgeSec,
7625
- error: errorInfo2
7626
- }));
7697
+ const errorInfo2 = error instanceof RiverbankApiError ? {
7698
+ code: error.code,
7699
+ message: error.message,
7700
+ status: error.status
7701
+ } : { message: error.message };
7702
+ return emitStatus(
7703
+ "prebuild",
7704
+ prebuildResult.data,
7705
+ statusDetails({
7706
+ prebuildAgeSec: prebuildResult.prebuildAgeSec,
7707
+ error: errorInfo2
7708
+ })
7709
+ );
7627
7710
  }
7628
7711
  }
7629
- const errorInfo = error instanceof RiverbankApiError ? { code: error.code, message: error.message } : { message: error.message };
7630
- emitStatus("error", null, statusDetails({ error: errorInfo }));
7631
- throw error;
7712
+ const errorInfo = error instanceof RiverbankApiError ? { code: error.code, message: error.message, status: error.status } : { message: error.message };
7713
+ const failure = emitStatus(
7714
+ "error",
7715
+ null,
7716
+ statusDetails({ error: errorInfo })
7717
+ );
7718
+ throw attachResilienceStatusToError(error, failure.resilience);
7632
7719
  }
7633
7720
  }
7721
+ async function resilientFetchData(cacheKey, fetcher, options) {
7722
+ return (await resilientFetch(cacheKey, fetcher, options)).data;
7723
+ }
7634
7724
  function combineAbortSignals(...signals) {
7635
7725
  const controller = new AbortController();
7636
7726
  for (const signal of signals) {
@@ -7638,32 +7728,45 @@ function createRiverbankClient(config) {
7638
7728
  controller.abort(signal.reason);
7639
7729
  break;
7640
7730
  }
7641
- signal.addEventListener("abort", () => controller.abort(signal.reason), { once: true });
7731
+ signal.addEventListener("abort", () => controller.abort(signal.reason), {
7732
+ once: true
7733
+ });
7642
7734
  }
7643
7735
  return controller.signal;
7644
7736
  }
7645
7737
  async function resolveEntrySubrouteInternal(args) {
7646
7738
  const { siteId, entryId, kind, segment, stage, signal } = args;
7647
7739
  const cacheKey = `entry-subroute:${siteId}:${entryId}:${kind}:${segment}:${stage ?? "published"}`;
7648
- return resilientFetch(cacheKey, async (sig) => {
7649
- return await apiClient({
7650
- endpoint: "resolveEntrySubroute",
7651
- params: { siteId, entryId, kind, segment, ...stage ? { stage } : {} },
7652
- options: { signal: sig }
7653
- });
7654
- }, { signal });
7740
+ return resilientFetchData(
7741
+ cacheKey,
7742
+ async (sig) => {
7743
+ return await apiClient({
7744
+ endpoint: "resolveEntrySubroute",
7745
+ params: {
7746
+ siteId,
7747
+ entryId,
7748
+ kind,
7749
+ segment,
7750
+ ...stage ? { stage } : {}
7751
+ },
7752
+ options: { signal: sig }
7753
+ });
7754
+ },
7755
+ { signal }
7756
+ );
7655
7757
  }
7656
- return {
7657
- async getSite(params) {
7658
- const { slug, domain, id, signal, force, currentPath } = params;
7659
- if (!slug && !domain && !id) {
7660
- throw new Error(
7661
- `getSite() requires at least one identifier: slug, domain, or id. Received: ${JSON.stringify(params)}`
7662
- );
7663
- }
7664
- const cacheKey = `site:${slug || domain || id}:${currentPath ?? ""}`;
7665
- const siteId = id || slug || domain;
7666
- return resilientFetch(cacheKey, async (sig) => {
7758
+ async function getSiteWithResilienceInternal(params) {
7759
+ const { slug, domain, id, signal, force, currentPath } = params;
7760
+ if (!slug && !domain && !id) {
7761
+ throw new Error(
7762
+ `getSite() requires at least one identifier: slug, domain, or id. Received: ${JSON.stringify(params)}`
7763
+ );
7764
+ }
7765
+ const cacheKey = `site:${slug || domain || id}:${currentPath ?? ""}`;
7766
+ const siteId = id || slug || domain;
7767
+ return resilientFetch(
7768
+ cacheKey,
7769
+ async (sig) => {
7667
7770
  const apiParams = {};
7668
7771
  if (params.slug) apiParams.slug = params.slug;
7669
7772
  if (params.domain) apiParams.domain = params.domain;
@@ -7674,66 +7777,121 @@ function createRiverbankClient(config) {
7674
7777
  endpoint: "getSite",
7675
7778
  params: apiParams,
7676
7779
  // When force=true, bypass Next.js fetch caching (revalidate) as well.
7677
- options: { signal: sig, ...force ? { cache: "no-store" } : {} }
7780
+ options: {
7781
+ signal: sig,
7782
+ ...force ? { cache: "no-store" } : {}
7783
+ }
7678
7784
  });
7679
- }, {
7785
+ },
7786
+ {
7680
7787
  signal,
7681
7788
  force,
7682
7789
  prebuildFallback: prebuildLoader && siteId ? () => prebuildLoader.loadSite(siteId) : void 0
7683
- });
7684
- },
7685
- async getPage(params) {
7686
- const { siteId, path, preview = false, signal } = params;
7687
- const cacheKey = `page:${siteId}:${path}:${preview}`;
7688
- return resilientFetch(cacheKey, async (sig) => {
7689
- return await apiClient({ endpoint: "getContentByPath", params: { siteId }, body: { path, preview }, options: { signal: sig } });
7690
- }, {
7790
+ }
7791
+ );
7792
+ }
7793
+ async function getPageWithResilienceInternal(params) {
7794
+ const { siteId, path, preview = false, signal } = params;
7795
+ const cacheKey = `page:${siteId}:${path}:${preview}`;
7796
+ return resilientFetch(
7797
+ cacheKey,
7798
+ async (sig) => {
7799
+ return await apiClient({
7800
+ endpoint: "getContentByPath",
7801
+ params: { siteId, path, preview: String(preview) },
7802
+ options: { signal: sig }
7803
+ });
7804
+ },
7805
+ {
7691
7806
  preview,
7692
7807
  signal,
7693
7808
  // Prebuild fallback only for published pages (not preview)
7694
7809
  prebuildFallback: prebuildLoader && !preview ? () => prebuildLoader.loadPage(siteId, path) : void 0
7695
- });
7810
+ }
7811
+ );
7812
+ }
7813
+ return {
7814
+ async getSite(params) {
7815
+ return (await getSiteWithResilienceInternal(params)).data;
7816
+ },
7817
+ async getSiteWithResilience(params) {
7818
+ return getSiteWithResilienceInternal(params);
7819
+ },
7820
+ async getPage(params) {
7821
+ return (await getPageWithResilienceInternal(params)).data;
7822
+ },
7823
+ async getPageWithResilience(params) {
7824
+ return getPageWithResilienceInternal(params);
7696
7825
  },
7697
7826
  async getEntries(params) {
7698
- const { siteId, contentType, limit, offset, order, preview = false, mode, entryIds, includeMeta, signal } = params;
7827
+ const {
7828
+ siteId,
7829
+ contentType,
7830
+ limit,
7831
+ offset,
7832
+ order,
7833
+ preview = false,
7834
+ mode,
7835
+ entryIds,
7836
+ includeMeta,
7837
+ signal
7838
+ } = params;
7699
7839
  const entryIdsCacheKey = mode === "manual" && entryIds?.length ? entryIds.join(",") : "";
7700
7840
  const cacheKey = `entries:${siteId}:${contentType}:${limit ?? ""}:${offset ?? ""}:${order ?? ""}:${preview}:${mode ?? ""}:${entryIdsCacheKey}:${includeMeta ?? ""}`;
7701
- return resilientFetch(cacheKey, async (sig) => {
7702
- let orderParam;
7703
- if (order === "newest") {
7704
- orderParam = "published_at.desc";
7705
- } else if (order === "oldest") {
7706
- orderParam = "published_at.asc";
7707
- } else if (order === "title") {
7708
- orderParam = "title.asc";
7709
- }
7710
- const apiParams = {
7711
- siteId,
7712
- type: contentType,
7713
- ...typeof limit === "number" && { limit: String(limit) },
7714
- ...typeof offset === "number" && { offset: String(offset) },
7715
- ...includeMeta && { meta: "true" },
7716
- ...orderParam && { order: orderParam },
7717
- ...preview && { stage: "preview" },
7718
- ...mode === "manual" && entryIds?.length && {
7719
- mode: "manual",
7720
- entryIds: JSON.stringify(entryIds)
7841
+ return resilientFetchData(
7842
+ cacheKey,
7843
+ async (sig) => {
7844
+ let orderParam;
7845
+ if (order === "newest") {
7846
+ orderParam = "published_at.desc";
7847
+ } else if (order === "oldest") {
7848
+ orderParam = "published_at.asc";
7849
+ } else if (order === "title") {
7850
+ orderParam = "title.asc";
7851
+ } else if (order === "manual") {
7852
+ orderParam = "manual.asc";
7721
7853
  }
7722
- };
7723
- return await apiClient({ endpoint: "listPublishedEntries", params: apiParams, options: { signal: sig } });
7724
- }, {
7725
- preview,
7726
- signal,
7727
- // Prebuild fallback only for published entries (not preview, not manual mode)
7728
- prebuildFallback: prebuildLoader && !preview ? () => prebuildLoader.loadEntries(siteId, params) : void 0
7729
- });
7854
+ const apiParams = {
7855
+ siteId,
7856
+ type: contentType,
7857
+ ...typeof limit === "number" && { limit: String(limit) },
7858
+ ...typeof offset === "number" && { offset: String(offset) },
7859
+ ...includeMeta && { meta: "true" },
7860
+ ...orderParam && { order: orderParam },
7861
+ ...preview && { stage: "preview" },
7862
+ ...mode === "manual" && entryIds?.length && {
7863
+ mode: "manual",
7864
+ entryIds: JSON.stringify(entryIds)
7865
+ }
7866
+ };
7867
+ return await apiClient({
7868
+ endpoint: "listPublishedEntries",
7869
+ params: apiParams,
7870
+ options: { signal: sig }
7871
+ });
7872
+ },
7873
+ {
7874
+ preview,
7875
+ signal,
7876
+ // Prebuild fallback only for published entries (not preview, not manual mode)
7877
+ prebuildFallback: prebuildLoader && !preview ? () => prebuildLoader.loadEntries(siteId, params) : void 0
7878
+ }
7879
+ );
7730
7880
  },
7731
7881
  async getEntry(params) {
7732
7882
  const { siteId, contentType, slug, signal } = params;
7733
7883
  const cacheKey = `entry:${siteId}:${contentType}:${slug}`;
7734
- return resilientFetch(cacheKey, async (sig) => {
7735
- return await apiClient({ endpoint: "getPublishedEntryPreview", params: { siteId, type: contentType, slug }, options: { signal: sig } });
7736
- }, { signal });
7884
+ return resilientFetchData(
7885
+ cacheKey,
7886
+ async (sig) => {
7887
+ return await apiClient({
7888
+ endpoint: "getPublishedEntryPreview",
7889
+ params: { siteId, type: contentType, slug },
7890
+ options: { signal: sig }
7891
+ });
7892
+ },
7893
+ { signal }
7894
+ );
7737
7895
  },
7738
7896
  async getPublicFormById(params) {
7739
7897
  const { formId, siteId, signal } = params;
@@ -7741,10 +7899,18 @@ function createRiverbankClient(config) {
7741
7899
  throw new Error("getPublicFormById() requires formId and siteId");
7742
7900
  }
7743
7901
  const cacheKey = `public-form:${siteId}:${formId}`;
7744
- return resilientFetch(cacheKey, async (sig) => {
7745
- const response = await apiClient({ endpoint: "getPublicFormById", params: { formId, siteId }, options: { signal: sig } });
7746
- return normalizePublicFormResult(response);
7747
- }, { signal });
7902
+ return resilientFetchData(
7903
+ cacheKey,
7904
+ async (sig) => {
7905
+ const response = await apiClient({
7906
+ endpoint: "getPublicFormById",
7907
+ params: { formId, siteId },
7908
+ options: { signal: sig }
7909
+ });
7910
+ return normalizePublicFormResult(response);
7911
+ },
7912
+ { signal }
7913
+ );
7748
7914
  },
7749
7915
  async getForms(params) {
7750
7916
  const { siteId, signal } = params;
@@ -7752,34 +7918,42 @@ function createRiverbankClient(config) {
7752
7918
  throw new Error("getForms() requires siteId");
7753
7919
  }
7754
7920
  const cacheKey = `forms:${siteId}`;
7755
- return resilientFetch(cacheKey, async (sig) => {
7756
- const response = await apiClient({ endpoint: "listPublicForms", params: { siteId }, options: { signal: sig } });
7757
- return normalizePublicFormsResult(response);
7758
- }, {
7759
- signal,
7760
- prebuildFallback: prebuildLoader ? () => {
7761
- const result = prebuildLoader.loadForms();
7762
- if (result) {
7763
- return {
7764
- data: {
7765
- forms: result.data.map((form2) => ({
7766
- id: form2.id,
7767
- slug: form2.slug,
7768
- name: form2.name,
7769
- schema: form2.schema,
7770
- settings: form2.settings,
7771
- schemaJson: form2.schema,
7772
- settingsJson: form2.settings,
7773
- createdAt: null,
7774
- updatedAt: null
7775
- }))
7776
- },
7777
- prebuildAgeSec: result.prebuildAgeSec
7778
- };
7779
- }
7780
- return null;
7781
- } : void 0
7782
- });
7921
+ return resilientFetchData(
7922
+ cacheKey,
7923
+ async (sig) => {
7924
+ const response = await apiClient({
7925
+ endpoint: "listPublicForms",
7926
+ params: { siteId },
7927
+ options: { signal: sig }
7928
+ });
7929
+ return normalizePublicFormsResult(response);
7930
+ },
7931
+ {
7932
+ signal,
7933
+ prebuildFallback: prebuildLoader ? () => {
7934
+ const result = prebuildLoader.loadForms();
7935
+ if (result) {
7936
+ return {
7937
+ data: {
7938
+ forms: result.data.map((form2) => ({
7939
+ id: form2.id,
7940
+ slug: form2.slug,
7941
+ name: form2.name,
7942
+ schema: form2.schema,
7943
+ settings: form2.settings,
7944
+ schemaJson: form2.schema,
7945
+ settingsJson: form2.settings,
7946
+ createdAt: null,
7947
+ updatedAt: null
7948
+ }))
7949
+ },
7950
+ prebuildAgeSec: result.prebuildAgeSec
7951
+ };
7952
+ }
7953
+ return null;
7954
+ } : void 0
7955
+ }
7956
+ );
7783
7957
  },
7784
7958
  async getPublicBookingServices(params) {
7785
7959
  const { siteId, ids, signal } = params;
@@ -7787,13 +7961,21 @@ function createRiverbankClient(config) {
7787
7961
  throw new Error("getPublicBookingServices() requires siteId");
7788
7962
  }
7789
7963
  const cacheKey = `public-booking-services:${siteId}:${ids ?? ""}`;
7790
- return resilientFetch(cacheKey, async (sig) => {
7791
- const apiParams = {
7792
- siteId,
7793
- ...ids && { ids }
7794
- };
7795
- return await apiClient({ endpoint: "getPublicBookingServices", params: apiParams, options: { signal: sig } });
7796
- }, { signal });
7964
+ return resilientFetchData(
7965
+ cacheKey,
7966
+ async (sig) => {
7967
+ const apiParams = {
7968
+ siteId,
7969
+ ...ids && { ids }
7970
+ };
7971
+ return await apiClient({
7972
+ endpoint: "getPublicBookingServices",
7973
+ params: apiParams,
7974
+ options: { signal: sig }
7975
+ });
7976
+ },
7977
+ { signal }
7978
+ );
7797
7979
  },
7798
7980
  async listPublicEvents(params) {
7799
7981
  const {
@@ -7814,22 +7996,30 @@ function createRiverbankClient(config) {
7814
7996
  throw new Error("listPublicEvents() requires siteId");
7815
7997
  }
7816
7998
  const cacheKey = `public-events:${siteId}:${limit ?? ""}:${from ?? ""}:${to ?? ""}:${stage ?? ""}:${categoryIds ?? ""}:${venueId ?? ""}:${kind ?? ""}:${entryId ?? ""}:${seriesId ?? ""}:${includeOccurrenceId ?? ""}`;
7817
- return resilientFetch(cacheKey, async (sig) => {
7818
- const apiParams = {
7819
- siteId,
7820
- ...typeof limit === "number" && { limit: String(limit) },
7821
- ...from && { from },
7822
- ...to && { to },
7823
- ...stage && { stage },
7824
- ...categoryIds && { categoryIds },
7825
- ...venueId && { venueId },
7826
- ...kind && { kind },
7827
- ...entryId && { entryId },
7828
- ...seriesId && { seriesId },
7829
- ...includeOccurrenceId && { includeOccurrenceId }
7830
- };
7831
- return await apiClient({ endpoint: "listPublicEvents", params: apiParams, options: { signal: sig } });
7832
- }, { signal });
7999
+ return resilientFetchData(
8000
+ cacheKey,
8001
+ async (sig) => {
8002
+ const apiParams = {
8003
+ siteId,
8004
+ ...typeof limit === "number" && { limit: String(limit) },
8005
+ ...from && { from },
8006
+ ...to && { to },
8007
+ ...stage && { stage },
8008
+ ...categoryIds && { categoryIds },
8009
+ ...venueId && { venueId },
8010
+ ...kind && { kind },
8011
+ ...entryId && { entryId },
8012
+ ...seriesId && { seriesId },
8013
+ ...includeOccurrenceId && { includeOccurrenceId }
8014
+ };
8015
+ return await apiClient({
8016
+ endpoint: "listPublicEvents",
8017
+ params: apiParams,
8018
+ options: { signal: sig }
8019
+ });
8020
+ },
8021
+ { signal }
8022
+ );
7833
8023
  },
7834
8024
  async getPublicEventDetails(params) {
7835
8025
  const {
@@ -7853,37 +8043,44 @@ function createRiverbankClient(config) {
7853
8043
  throw new Error("getPublicEventDetails() requires siteId");
7854
8044
  }
7855
8045
  const cacheKey = `public-event-details:${siteId}:${limit ?? ""}:${from ?? ""}:${to ?? ""}:${afterStartsAt ?? ""}:${afterId ?? ""}:${stage ?? ""}:${categoryIds ?? ""}:${venueId ?? ""}:${staffMemberId ?? ""}:${kind ?? ""}:${entryId ?? ""}:${seriesId ?? ""}:${includeOccurrenceId ?? ""}`;
7856
- return resilientFetch(cacheKey, async (sig) => {
7857
- const requestId = "eventDetails";
7858
- const response = await apiClient({
7859
- endpoint: "batchBlockLoaders",
7860
- params: { siteId, ...stage && { stage } },
7861
- body: {
7862
- requests: [
7863
- {
7864
- id: requestId,
7865
- endpoint: "getPublicEventDetails",
7866
- params: {
7867
- ...typeof limit === "number" && { limit: String(limit) },
7868
- ...from && { from },
7869
- ...to && { to },
7870
- ...afterStartsAt && { afterStartsAt },
7871
- ...afterId && { afterId },
7872
- ...categoryIds && { categoryIds },
7873
- ...venueId && { venueId },
7874
- ...staffMemberId && { staffMemberId },
7875
- ...kind && { kind },
7876
- ...entryId && { entryId },
7877
- ...seriesId && { seriesId },
7878
- ...includeOccurrenceId && { includeOccurrenceId }
8046
+ return resilientFetchData(
8047
+ cacheKey,
8048
+ async (sig) => {
8049
+ const requestId = "eventDetails";
8050
+ const response = await apiClient({
8051
+ endpoint: "batchBlockLoaders",
8052
+ params: { siteId, ...stage && { stage } },
8053
+ body: {
8054
+ requests: [
8055
+ {
8056
+ id: requestId,
8057
+ endpoint: "getPublicEventDetails",
8058
+ params: {
8059
+ ...typeof limit === "number" && { limit: String(limit) },
8060
+ ...from && { from },
8061
+ ...to && { to },
8062
+ ...afterStartsAt && { afterStartsAt },
8063
+ ...afterId && { afterId },
8064
+ ...categoryIds && { categoryIds },
8065
+ ...venueId && { venueId },
8066
+ ...staffMemberId && { staffMemberId },
8067
+ ...kind && { kind },
8068
+ ...entryId && { entryId },
8069
+ ...seriesId && { seriesId },
8070
+ ...includeOccurrenceId && { includeOccurrenceId }
8071
+ }
7879
8072
  }
7880
- }
7881
- ]
7882
- },
7883
- options: { signal: sig }
7884
- });
7885
- return normalizeBatchBlockLoaderResult(response, requestId);
7886
- }, { signal });
8073
+ ]
8074
+ },
8075
+ options: { signal: sig }
8076
+ });
8077
+ return normalizeBatchBlockLoaderResult(
8078
+ response,
8079
+ requestId
8080
+ );
8081
+ },
8082
+ { signal }
8083
+ );
7887
8084
  },
7888
8085
  async listPublicCourses(params) {
7889
8086
  const { siteId, limit, stage, signal } = params;
@@ -7891,14 +8088,22 @@ function createRiverbankClient(config) {
7891
8088
  throw new Error("listPublicCourses() requires siteId");
7892
8089
  }
7893
8090
  const cacheKey = `public-courses:${siteId}:${limit ?? ""}:${stage ?? ""}`;
7894
- return resilientFetch(cacheKey, async (sig) => {
7895
- const apiParams = {
7896
- siteId,
7897
- ...typeof limit === "number" && { limit: String(limit) },
7898
- ...stage && { stage }
7899
- };
7900
- return await apiClient({ endpoint: "listPublicCourses", params: apiParams, options: { signal: sig } });
7901
- }, { signal });
8091
+ return resilientFetchData(
8092
+ cacheKey,
8093
+ async (sig) => {
8094
+ const apiParams = {
8095
+ siteId,
8096
+ ...typeof limit === "number" && { limit: String(limit) },
8097
+ ...stage && { stage }
8098
+ };
8099
+ return await apiClient({
8100
+ endpoint: "listPublicCourses",
8101
+ params: apiParams,
8102
+ options: { signal: sig }
8103
+ });
8104
+ },
8105
+ { signal }
8106
+ );
7902
8107
  },
7903
8108
  async listPublicTeamMembers(params) {
7904
8109
  const { siteId, stage, signal } = params;
@@ -7906,17 +8111,21 @@ function createRiverbankClient(config) {
7906
8111
  throw new Error("listPublicTeamMembers() requires siteId");
7907
8112
  }
7908
8113
  const cacheKey = `public-team-members:${siteId}:${stage ?? ""}`;
7909
- return resilientFetch(cacheKey, async (sig) => {
7910
- const apiParams = {
7911
- siteId,
7912
- ...stage && { stage }
7913
- };
7914
- return await apiClient({
7915
- endpoint: "listPublicTeamMembers",
7916
- params: apiParams,
7917
- options: { signal: sig }
7918
- });
7919
- }, { signal });
8114
+ return resilientFetchData(
8115
+ cacheKey,
8116
+ async (sig) => {
8117
+ const apiParams = {
8118
+ siteId,
8119
+ ...stage && { stage }
8120
+ };
8121
+ return await apiClient({
8122
+ endpoint: "listPublicTeamMembers",
8123
+ params: apiParams,
8124
+ options: { signal: sig }
8125
+ });
8126
+ },
8127
+ { signal }
8128
+ );
7920
8129
  },
7921
8130
  async listPublicProducts(params) {
7922
8131
  const { siteId, stage, categorySelector, signal } = params;
@@ -7925,14 +8134,22 @@ function createRiverbankClient(config) {
7925
8134
  }
7926
8135
  const selectorKey = categorySelector ? categorySelector.kind === "category" ? `category:${categorySelector.productCategoryId}` : `current-category-page:${categorySelector.productCategoryEntryId}` : "";
7927
8136
  const cacheKey = `public-products:${siteId}:${stage ?? ""}:${selectorKey}`;
7928
- return resilientFetch(cacheKey, async (sig) => {
7929
- const apiParams = {
7930
- siteId,
7931
- ...stage && { stage },
7932
- ...encodePublicProductCategorySelector(categorySelector)
7933
- };
7934
- return await apiClient({ endpoint: "listPublicProducts", params: apiParams, options: { signal: sig } });
7935
- }, { signal });
8137
+ return resilientFetchData(
8138
+ cacheKey,
8139
+ async (sig) => {
8140
+ const apiParams = {
8141
+ siteId,
8142
+ ...stage && { stage },
8143
+ ...encodePublicProductCategorySelector(categorySelector)
8144
+ };
8145
+ return await apiClient({
8146
+ endpoint: "listPublicProducts",
8147
+ params: apiParams,
8148
+ options: { signal: sig }
8149
+ });
8150
+ },
8151
+ { signal }
8152
+ );
7936
8153
  },
7937
8154
  async listPublicPasses(params) {
7938
8155
  const { siteId, categories, signal } = params;
@@ -7940,13 +8157,21 @@ function createRiverbankClient(config) {
7940
8157
  throw new Error("listPublicPasses() requires siteId");
7941
8158
  }
7942
8159
  const cacheKey = `public-passes:${siteId}:${categories ?? ""}`;
7943
- return resilientFetch(cacheKey, async (sig) => {
7944
- const apiParams = {
7945
- siteId,
7946
- ...categories && { categories }
7947
- };
7948
- return await apiClient({ endpoint: "listPublicPasses", params: apiParams, options: { signal: sig } });
7949
- }, { signal });
8160
+ return resilientFetchData(
8161
+ cacheKey,
8162
+ async (sig) => {
8163
+ const apiParams = {
8164
+ siteId,
8165
+ ...categories && { categories }
8166
+ };
8167
+ return await apiClient({
8168
+ endpoint: "listPublicPasses",
8169
+ params: apiParams,
8170
+ options: { signal: sig }
8171
+ });
8172
+ },
8173
+ { signal }
8174
+ );
7950
8175
  },
7951
8176
  async listPublicMemberships(params) {
7952
8177
  const { siteId, categories, signal } = params;
@@ -7954,25 +8179,44 @@ function createRiverbankClient(config) {
7954
8179
  throw new Error("listPublicMemberships() requires siteId");
7955
8180
  }
7956
8181
  const cacheKey = `public-memberships:${siteId}:${categories ?? ""}`;
7957
- return resilientFetch(cacheKey, async (sig) => {
7958
- const apiParams = {
7959
- siteId,
7960
- ...categories && { categories }
7961
- };
7962
- return await apiClient({ endpoint: "listPublicMemberships", params: apiParams, options: { signal: sig } });
7963
- }, { signal });
8182
+ return resilientFetchData(
8183
+ cacheKey,
8184
+ async (sig) => {
8185
+ const apiParams = {
8186
+ siteId,
8187
+ ...categories && { categories }
8188
+ };
8189
+ return await apiClient({
8190
+ endpoint: "listPublicMemberships",
8191
+ params: apiParams,
8192
+ options: { signal: sig }
8193
+ });
8194
+ },
8195
+ { signal }
8196
+ );
7964
8197
  },
7965
8198
  async resolveEntrySubroute(params) {
7966
8199
  const { siteId, entryId, kind, segment, stage, signal } = params;
7967
8200
  if (!siteId || !entryId || !kind || !segment) {
7968
- throw new Error("resolveEntrySubroute() requires siteId, entryId, kind, and segment");
8201
+ throw new Error(
8202
+ "resolveEntrySubroute() requires siteId, entryId, kind, and segment"
8203
+ );
7969
8204
  }
7970
- return resolveEntrySubrouteInternal({ siteId, entryId, kind, segment, stage, signal });
8205
+ return resolveEntrySubrouteInternal({
8206
+ siteId,
8207
+ entryId,
8208
+ kind,
8209
+ segment,
8210
+ stage,
8211
+ signal
8212
+ });
7971
8213
  },
7972
8214
  async resolveEventOccurrence(params) {
7973
8215
  const { siteId, entryId, segment, signal } = params;
7974
8216
  if (!siteId || !entryId || !segment) {
7975
- throw new Error("resolveEventOccurrence() requires siteId, entryId, and segment");
8217
+ throw new Error(
8218
+ "resolveEventOccurrence() requires siteId, entryId, and segment"
8219
+ );
7976
8220
  }
7977
8221
  const result = await resolveEntrySubrouteInternal({
7978
8222
  siteId,
@@ -7991,13 +8235,17 @@ function createRiverbankClient(config) {
7991
8235
  throw new Error("checkRedirect() requires siteId and path");
7992
8236
  }
7993
8237
  const cacheKey = `redirect:${siteId}:${path}`;
7994
- return resilientFetch(cacheKey, async (sig) => {
7995
- return await apiClient({
7996
- endpoint: "checkRedirect",
7997
- params: { site: siteId, path },
7998
- options: { signal: sig }
7999
- });
8000
- }, { signal });
8238
+ return resilientFetchData(
8239
+ cacheKey,
8240
+ async (sig) => {
8241
+ return await apiClient({
8242
+ endpoint: "checkRedirect",
8243
+ params: { site: siteId, path },
8244
+ options: { signal: sig }
8245
+ });
8246
+ },
8247
+ { signal }
8248
+ );
8001
8249
  },
8002
8250
  async getAllPublishedRoutes(params) {
8003
8251
  const { siteId, signal } = params;
@@ -8005,13 +8253,17 @@ function createRiverbankClient(config) {
8005
8253
  throw new Error("getAllPublishedRoutes() requires siteId");
8006
8254
  }
8007
8255
  const cacheKey = `routable-content:${siteId}:published`;
8008
- return resilientFetch(cacheKey, async (sig) => {
8009
- return await apiClient({
8010
- endpoint: "getPublicRoutableContent",
8011
- params: { siteId, publishedOnly: "true" },
8012
- options: { signal: sig }
8013
- });
8014
- }, { signal });
8256
+ return resilientFetchData(
8257
+ cacheKey,
8258
+ async (sig) => {
8259
+ return await apiClient({
8260
+ endpoint: "getPublicRoutableContent",
8261
+ params: { siteId, publishedOnly: "true" },
8262
+ options: { signal: sig }
8263
+ });
8264
+ },
8265
+ { signal }
8266
+ );
8015
8267
  },
8016
8268
  async getSitemapRoutes(params) {
8017
8269
  const { siteId, page, pageSize, signal } = params;
@@ -8019,17 +8271,21 @@ function createRiverbankClient(config) {
8019
8271
  throw new Error("getSitemapRoutes() requires siteId");
8020
8272
  }
8021
8273
  const cacheKey = `sitemap:${siteId}:${page ?? 1}:${pageSize ?? "default"}`;
8022
- return resilientFetch(cacheKey, async (sig) => {
8023
- return await apiClient({
8024
- endpoint: "getPublicSitemapRoutes",
8025
- params: {
8026
- siteId,
8027
- ...page ? { page: String(page) } : {},
8028
- ...pageSize ? { pageSize: String(pageSize) } : {}
8029
- },
8030
- options: { signal: sig }
8031
- });
8032
- }, { signal });
8274
+ return resilientFetchData(
8275
+ cacheKey,
8276
+ async (sig) => {
8277
+ return await apiClient({
8278
+ endpoint: "getPublicSitemapRoutes",
8279
+ params: {
8280
+ siteId,
8281
+ ...page ? { page: String(page) } : {},
8282
+ ...pageSize ? { pageSize: String(pageSize) } : {}
8283
+ },
8284
+ options: { signal: sig }
8285
+ });
8286
+ },
8287
+ { signal }
8288
+ );
8033
8289
  },
8034
8290
  clearCache() {
8035
8291
  cache.clear();
@@ -8049,6 +8305,27 @@ function createRiverbankClient(config) {
8049
8305
  };
8050
8306
  }
8051
8307
 
8308
+ // ../core/src/location.ts
8309
+ function normalizeLocationAddressText(value) {
8310
+ if (typeof value !== "string") {
8311
+ return null;
8312
+ }
8313
+ const trimmed = value.trim();
8314
+ return trimmed ? trimmed : null;
8315
+ }
8316
+ function hasLocationCoordinates(value) {
8317
+ return typeof value?.lat === "number" && typeof value?.lng === "number";
8318
+ }
8319
+ function toLocationCoordinates(value) {
8320
+ if (!hasLocationCoordinates(value)) {
8321
+ return null;
8322
+ }
8323
+ return {
8324
+ lat: value.lat,
8325
+ lng: value.lng
8326
+ };
8327
+ }
8328
+
8052
8329
  // ../api/src/accessAdmin.ts
8053
8330
  import { z } from "zod";
8054
8331
  var managedDomainAddOnPricingSnapshotSchema = z.object({
@@ -8191,27 +8468,6 @@ function formatKeyAsLabel(key) {
8191
8468
  // ../blocks/src/system/manifest/schema.ts
8192
8469
  import { z as z4 } from "zod";
8193
8470
 
8194
- // ../core/src/location.ts
8195
- function normalizeLocationAddressText(value) {
8196
- if (typeof value !== "string") {
8197
- return null;
8198
- }
8199
- const trimmed = value.trim();
8200
- return trimmed ? trimmed : null;
8201
- }
8202
- function hasLocationCoordinates(value) {
8203
- return typeof value?.lat === "number" && typeof value?.lng === "number";
8204
- }
8205
- function toLocationCoordinates(value) {
8206
- if (!hasLocationCoordinates(value)) {
8207
- return null;
8208
- }
8209
- return {
8210
- lat: value.lat,
8211
- lng: value.lng
8212
- };
8213
- }
8214
-
8215
8471
  // ../media-core/src/transformRect.ts
8216
8472
  function isValidTransformRectStructure(rect) {
8217
8473
  if (!Array.isArray(rect) || rect.length !== 4) return false;
@@ -8294,14 +8550,14 @@ function rotateNormalizedPoint(point, rotation) {
8294
8550
  const x = point.x;
8295
8551
  const y = point.y;
8296
8552
  switch (rotation) {
8553
+ case 0:
8554
+ return { x, y };
8297
8555
  case 90:
8298
8556
  return { x: 1 - y, y: x };
8299
8557
  case 180:
8300
8558
  return { x: 1 - x, y: 1 - y };
8301
8559
  case 270:
8302
8560
  return { x: y, y: 1 - x };
8303
- default:
8304
- return { x, y };
8305
8561
  }
8306
8562
  }
8307
8563
 
@@ -8494,6 +8750,8 @@ var uiSchema = z4.object({
8494
8750
  mediaPickerAutoOpen: z4.boolean().optional(),
8495
8751
  showMediaPreview: z4.boolean().optional(),
8496
8752
  showMediaOverlayActions: z4.boolean().optional(),
8753
+ mediaPreviewMaxWidth: z4.enum(["xs", "sm", "md", "none"]).optional(),
8754
+ preventMediaPreviewUpscale: z4.boolean().optional(),
8497
8755
  mediaDelivery: mediaDeliverySchema.optional(),
8498
8756
  mediaDeliveryByVariant: z4.record(z4.string(), mediaDeliverySchema).optional(),
8499
8757
  // Optional input hints for validators/widgets
@@ -8743,6 +9001,9 @@ var repeaterFieldSchema = baseFieldSchema.extend({
8743
9001
  type: z4.literal("repeater"),
8744
9002
  itemLabel: z4.string().default("Item"),
8745
9003
  itemLabelSource: z4.string().optional(),
9004
+ showSummary: z4.boolean().optional(),
9005
+ summaryFields: z4.string().array().optional(),
9006
+ summaryMaxChars: z4.number().int().positive().optional(),
8746
9007
  minItems: z4.number().int().min(0).default(0),
8747
9008
  maxItems: z4.number().int().positive().optional(),
8748
9009
  // Monomorphic mode
@@ -9236,6 +9497,9 @@ function makeBoundaryId(previousBlockId, nextBlockId) {
9236
9497
  const next = encodeURIComponent(nextBlockId);
9237
9498
  return asDesignBoundaryId(`boundary:${previous}:${next}`);
9238
9499
  }
9500
+ function assertNever(value, message = "Unhandled Theme V2 variant") {
9501
+ throw new Error(`${message}: ${String(value)}`);
9502
+ }
9239
9503
  function brandNonEmptyString(value, label) {
9240
9504
  if (value.length === 0) {
9241
9505
  throw new Error(`${label} must be a non-empty string.`);
@@ -9263,6 +9527,10 @@ var tileTreatmentValues = [
9263
9527
  "quiet",
9264
9528
  "brand-depth"
9265
9529
  ];
9530
+ var eventListTreatmentValues = [
9531
+ "plain",
9532
+ "lined-panel"
9533
+ ];
9266
9534
  var eyebrowTreatmentValues = [
9267
9535
  "plain",
9268
9536
  "pill",
@@ -9320,6 +9588,7 @@ function defineBlockDesignCapability(capability) {
9320
9588
  imageSurfaceMotions: capability.imageSurfaceMotions ?? ["static"],
9321
9589
  testimonialCardTreatments: capability.testimonialCardTreatments ?? ["default"],
9322
9590
  tileTreatments: capability.tileTreatments ?? ["default"],
9591
+ eventListTreatments: capability.eventListTreatments ?? ["plain"],
9323
9592
  eyebrowTreatments: capability.eyebrowTreatments ?? ["plain"],
9324
9593
  ...capability.headingDecorations ? { headingDecorations: capability.headingDecorations } : {},
9325
9594
  ...capability.accordionIconSets ? { accordionIconSets: capability.accordionIconSets } : {}
@@ -9344,9 +9613,98 @@ var blockAppearancePresets = [
9344
9613
  transitionAfter: "soft-fade-short",
9345
9614
  emphasis: "high",
9346
9615
  sectionHeight: "hero",
9616
+ heroComposition: "center",
9617
+ heroTypographyScale: "display",
9347
9618
  imageSurfaceTreatment: { kind: "neutral-wash" }
9348
9619
  }
9349
9620
  }),
9621
+ defineBlockAppearancePreset({
9622
+ kind: "block-design",
9623
+ id: "hero-bottom-left-panel",
9624
+ target: "hero",
9625
+ label: "Bottom-left panel hero",
9626
+ blockKinds: ["block.hero"],
9627
+ constraints: {
9628
+ layoutFamilies: ["centered", "compact"]
9629
+ },
9630
+ optionGroups: [
9631
+ {
9632
+ id: "image-surface-treatment",
9633
+ label: "Treatment",
9634
+ selectedOptionId: "neutral-scrim",
9635
+ options: [
9636
+ {
9637
+ id: "neutral-scrim",
9638
+ label: "Neutral scrim",
9639
+ designPatch: {
9640
+ imageSurfaceTreatment: { kind: "neutral-scrim", intensity: "balanced" }
9641
+ }
9642
+ },
9643
+ {
9644
+ id: "brand-scrim-primary",
9645
+ label: "Brand scrim",
9646
+ designPatch: {
9647
+ imageSurfaceTreatment: { kind: "brand-scrim", token: "primary", intensity: "balanced" }
9648
+ }
9649
+ }
9650
+ ]
9651
+ }
9652
+ ],
9653
+ layoutPatches: [
9654
+ {
9655
+ constraints: {
9656
+ layoutVariantKeys: ["micro"]
9657
+ },
9658
+ designPatch: {
9659
+ sectionHeight: "banner",
9660
+ heroTypographyScale: "editorial"
9661
+ }
9662
+ }
9663
+ ],
9664
+ design: {
9665
+ sectionSurface: "hero-image",
9666
+ contentFrame: panelFrame("raised"),
9667
+ itemSurface: "none",
9668
+ transitionAfter: "soft-fade-short",
9669
+ emphasis: "high",
9670
+ sectionHeight: "immersive",
9671
+ heroComposition: "bottom-left",
9672
+ heroTypographyScale: "display",
9673
+ imageSurfaceTreatment: { kind: "neutral-scrim", intensity: "balanced" }
9674
+ }
9675
+ }),
9676
+ defineBlockAppearancePreset({
9677
+ kind: "block-design",
9678
+ id: "hero-poster-image",
9679
+ target: "hero",
9680
+ label: "Poster image hero",
9681
+ blockKinds: ["block.hero"],
9682
+ constraints: {
9683
+ layoutFamilies: ["centered", "compact"]
9684
+ },
9685
+ layoutPatches: [
9686
+ {
9687
+ constraints: {
9688
+ layoutVariantKeys: ["micro"]
9689
+ },
9690
+ designPatch: {
9691
+ sectionHeight: "banner",
9692
+ heroTypographyScale: "display"
9693
+ }
9694
+ }
9695
+ ],
9696
+ design: {
9697
+ sectionSurface: "hero-image",
9698
+ contentFrame: plainFrame,
9699
+ itemSurface: "none",
9700
+ transitionAfter: "soft-fade-short",
9701
+ emphasis: "high",
9702
+ sectionHeight: "immersive",
9703
+ heroComposition: "center",
9704
+ heroTypographyScale: "poster",
9705
+ imageSurfaceTreatment: { kind: "brand-scrim", token: "primary", intensity: "strong" }
9706
+ }
9707
+ }),
9350
9708
  defineBlockAppearancePreset({
9351
9709
  kind: "block-design",
9352
9710
  id: "hero-brand-scrim",
@@ -9396,6 +9754,8 @@ var blockAppearancePresets = [
9396
9754
  transitionAfter: "soft-fade-short",
9397
9755
  emphasis: "high",
9398
9756
  sectionHeight: "immersive",
9757
+ heroComposition: "center",
9758
+ heroTypographyScale: "display",
9399
9759
  imageSurfaceTreatment: { kind: "brand-scrim", token: "primary" }
9400
9760
  }
9401
9761
  }),
@@ -9448,6 +9808,8 @@ var blockAppearancePresets = [
9448
9808
  transitionAfter: "soft-fade-short",
9449
9809
  emphasis: "high",
9450
9810
  sectionHeight: "immersive",
9811
+ heroComposition: "center",
9812
+ heroTypographyScale: "display",
9451
9813
  imageSurfaceTreatment: { kind: "brand-scrim", token: "primary" },
9452
9814
  imageSurfaceMotion: "fixed-frame",
9453
9815
  eyebrowTreatment: "accent-pill-bounce"
@@ -9468,6 +9830,8 @@ var blockAppearancePresets = [
9468
9830
  itemSurface: "none",
9469
9831
  transitionAfter: "soft-fade-short",
9470
9832
  emphasis: "high",
9833
+ heroComposition: "center",
9834
+ heroTypographyScale: "editorial",
9471
9835
  eyebrowTreatment: "accent-pill-bounce"
9472
9836
  }
9473
9837
  }),
@@ -9482,7 +9846,82 @@ var blockAppearancePresets = [
9482
9846
  contentFrame: panelFrame("inset"),
9483
9847
  itemSurface: "none",
9484
9848
  transitionAfter: "none",
9485
- emphasis: "high"
9849
+ emphasis: "high",
9850
+ heroComposition: "center",
9851
+ heroTypographyScale: "editorial"
9852
+ }
9853
+ }),
9854
+ defineBlockAppearancePreset({
9855
+ kind: "block-design",
9856
+ id: "hero-split-editorial",
9857
+ target: "hero",
9858
+ label: "Editorial split hero",
9859
+ blockKinds: ["block.hero"],
9860
+ constraints: {
9861
+ layoutFamilies: ["split"]
9862
+ },
9863
+ design: {
9864
+ sectionSurface: "base",
9865
+ contentFrame: plainFrame,
9866
+ itemSurface: "none",
9867
+ transitionAfter: "soft-fade-short",
9868
+ emphasis: "high",
9869
+ heroTypographyScale: "editorial"
9870
+ }
9871
+ }),
9872
+ defineBlockAppearancePreset({
9873
+ kind: "block-design",
9874
+ id: "hero-split-brand",
9875
+ target: "hero",
9876
+ label: "Brand split hero",
9877
+ blockKinds: ["block.hero"],
9878
+ constraints: {
9879
+ layoutFamilies: ["split"]
9880
+ },
9881
+ design: {
9882
+ sectionSurface: "brand-depth-band",
9883
+ contentFrame: plainFrame,
9884
+ itemSurface: "none",
9885
+ transitionAfter: "soft-fade-short",
9886
+ emphasis: "high",
9887
+ heroTypographyScale: "display",
9888
+ eyebrowTreatment: "accent-pill-bounce"
9889
+ }
9890
+ }),
9891
+ defineBlockAppearancePreset({
9892
+ kind: "block-design",
9893
+ id: "hero-split-soft-panel",
9894
+ target: "hero",
9895
+ label: "Soft panel split hero",
9896
+ blockKinds: ["block.hero"],
9897
+ constraints: {
9898
+ layoutFamilies: ["split"]
9899
+ },
9900
+ design: {
9901
+ sectionSurface: "muted-band",
9902
+ contentFrame: panelFrame("raised"),
9903
+ itemSurface: "none",
9904
+ transitionAfter: "soft-fade-short",
9905
+ emphasis: "high",
9906
+ heroTypographyScale: "editorial"
9907
+ }
9908
+ }),
9909
+ defineBlockAppearancePreset({
9910
+ kind: "block-design",
9911
+ id: "hero-split-accent",
9912
+ target: "hero",
9913
+ label: "Accent split hero",
9914
+ blockKinds: ["block.hero"],
9915
+ constraints: {
9916
+ layoutFamilies: ["split"]
9917
+ },
9918
+ design: {
9919
+ sectionSurface: "accent-band",
9920
+ contentFrame: panelFrame("raised"),
9921
+ itemSurface: "none",
9922
+ transitionAfter: "soft-fade-short",
9923
+ emphasis: "high",
9924
+ heroTypographyScale: "display"
9486
9925
  }
9487
9926
  }),
9488
9927
  defineBlockAppearancePreset({
@@ -9515,9 +9954,9 @@ var blockAppearancePresets = [
9515
9954
  }),
9516
9955
  defineBlockAppearancePreset({
9517
9956
  kind: "block-design",
9518
- id: "intro-soft-earth-statement",
9957
+ id: "intro-organic-statement",
9519
9958
  target: "intro",
9520
- label: "Soft Earth intro statement",
9959
+ label: "Organic intro statement",
9521
9960
  blockKinds: ["block.intro"],
9522
9961
  design: {
9523
9962
  sectionSurface: "base",
@@ -9548,9 +9987,9 @@ var blockAppearancePresets = [
9548
9987
  }),
9549
9988
  defineBlockAppearancePreset({
9550
9989
  kind: "block-design",
9551
- id: "feature-cards-soft-earth-offerings",
9990
+ id: "feature-cards-raised-rule",
9552
9991
  target: "feature-cards",
9553
- label: "Soft Earth offering cards",
9992
+ label: "Raised cards with rule",
9554
9993
  blockKinds: ["block.feature-cards"],
9555
9994
  design: {
9556
9995
  sectionSurface: "base",
@@ -9579,6 +10018,21 @@ var blockAppearancePresets = [
9579
10018
  emphasis: "medium"
9580
10019
  }
9581
10020
  }),
10021
+ defineBlockAppearancePreset({
10022
+ kind: "block-design",
10023
+ id: "events-lined-panel",
10024
+ target: "events",
10025
+ label: "Lined event panel",
10026
+ blockKinds: ["block.event-calendar", "block.event-listing"],
10027
+ design: {
10028
+ sectionSurface: "base",
10029
+ contentFrame: plainFrame,
10030
+ itemSurface: "none",
10031
+ transitionAfter: "none",
10032
+ emphasis: "medium",
10033
+ eventListTreatment: "lined-panel"
10034
+ }
10035
+ }),
9582
10036
  defineBlockAppearancePreset({
9583
10037
  kind: "block-design",
9584
10038
  id: "schedule-details-accent-section",
@@ -9638,9 +10092,9 @@ var blockAppearancePresets = [
9638
10092
  }),
9639
10093
  defineBlockAppearancePreset({
9640
10094
  kind: "block-design",
9641
- id: "testimonials-carded-proof",
10095
+ id: "testimonials-simple-cards",
9642
10096
  target: "testimonials",
9643
- label: "Carded social proof",
10097
+ label: "Simple testimonial cards",
9644
10098
  blockKinds: ["block.testimonials"],
9645
10099
  design: {
9646
10100
  sectionSurface: "base",
@@ -9652,9 +10106,9 @@ var blockAppearancePresets = [
9652
10106
  }),
9653
10107
  defineBlockAppearancePreset({
9654
10108
  kind: "block-design",
9655
- id: "testimonials-contained-proof",
10109
+ id: "testimonials-raised-panel",
9656
10110
  target: "testimonials",
9657
- label: "Contained social proof",
10111
+ label: "Raised testimonial panel",
9658
10112
  blockKinds: ["block.testimonials"],
9659
10113
  design: {
9660
10114
  sectionSurface: "muted-band",
@@ -9666,9 +10120,9 @@ var blockAppearancePresets = [
9666
10120
  }),
9667
10121
  defineBlockAppearancePreset({
9668
10122
  kind: "block-design",
9669
- id: "testimonials-dark-proof",
10123
+ id: "testimonials-accent-panel",
9670
10124
  target: "testimonials",
9671
- label: "Dark proof panel",
10125
+ label: "Accent testimonial panel",
9672
10126
  blockKinds: ["block.testimonials"],
9673
10127
  design: {
9674
10128
  sectionSurface: "accent-band",
@@ -9680,9 +10134,9 @@ var blockAppearancePresets = [
9680
10134
  }),
9681
10135
  defineBlockAppearancePreset({
9682
10136
  kind: "block-design",
9683
- id: "testimonials-accent-quote-proof",
10137
+ id: "testimonials-accent-quote-cards",
9684
10138
  target: "testimonials",
9685
- label: "Accent quote proof",
10139
+ label: "Accent quote cards",
9686
10140
  blockKinds: ["block.testimonials"],
9687
10141
  design: {
9688
10142
  sectionSurface: "accent-band",
@@ -9695,9 +10149,9 @@ var blockAppearancePresets = [
9695
10149
  }),
9696
10150
  defineBlockAppearancePreset({
9697
10151
  kind: "block-design",
9698
- id: "testimonials-soft-earth-proof-band",
10152
+ id: "testimonials-brand-background-quotes",
9699
10153
  target: "testimonials",
9700
- label: "Soft Earth proof band",
10154
+ label: "Brand background quotes",
9701
10155
  blockKinds: ["block.testimonials"],
9702
10156
  design: {
9703
10157
  sectionSurface: "brand-depth-band",
@@ -9741,25 +10195,6 @@ var blockAppearancePresets = [
9741
10195
  emphasis: "low"
9742
10196
  }
9743
10197
  }),
9744
- defineBlockAppearancePreset({
9745
- kind: "block-design",
9746
- id: "faq-soft-earth-two-column",
9747
- target: "faq",
9748
- label: "Soft Earth two-column FAQ",
9749
- blockKinds: ["block.faq"],
9750
- design: {
9751
- sectionSurface: "base",
9752
- contentFrame: plainFrame,
9753
- itemSurface: "flat",
9754
- transitionAfter: "none",
9755
- emphasis: "medium",
9756
- accordionIconTreatment: {
9757
- iconSet: "plus",
9758
- colorToken: "primary",
9759
- motion: "swap"
9760
- }
9761
- }
9762
- }),
9763
10198
  defineBlockAppearancePreset({
9764
10199
  kind: "block-design",
9765
10200
  id: "contact-form-panel",
@@ -11138,7 +11573,8 @@ var accordionSystemSchema = z12.object({
11138
11573
  icon: z12.object({
11139
11574
  style: accordionIconSchema,
11140
11575
  position: z12.enum(["left", "right"]),
11141
- size: z12.enum(["sm", "md", "lg"])
11576
+ size: z12.enum(["sm", "md", "lg"]),
11577
+ colorToken: themeColorTokenSchema.optional()
11142
11578
  }),
11143
11579
  // Trigger (question) styling
11144
11580
  trigger: z12.object({
@@ -11272,6 +11708,7 @@ var navLinkPaddingXSchema = z16.enum(["none", "tight", "compact", "default", "re
11272
11708
  var navLinkBorderRadiusSchema = z16.enum(["none", "sm", "md", "full"]);
11273
11709
  var navLinkTextSizeSchema = z16.enum(["xs", "sm", "base", "lg"]);
11274
11710
  var navLinkLetterSpacingSchema = z16.enum(["normal", "wide", "wider", "widest"]);
11711
+ var navLinkContrastTreatmentSchema = z16.enum(["none", "soft-glow"]);
11275
11712
  var navLinkStyleSchema = z16.object({
11276
11713
  /** Display name for the style */
11277
11714
  name: z16.string().min(1).max(30).optional(),
@@ -11283,6 +11720,8 @@ var navLinkStyleSchema = z16.object({
11283
11720
  textSize: navLinkTextSizeSchema.optional(),
11284
11721
  /** Optional letter spacing override */
11285
11722
  letterSpacing: navLinkLetterSpacingSchema.optional(),
11723
+ /** Optional text-only contrast treatment for transparent/overlay navigation */
11724
+ contrastTreatment: navLinkContrastTreatmentSchema.optional(),
11286
11725
  /** Hover/active color token (for color-change effects) */
11287
11726
  hoverColorToken: themeColorTokenSchema.nullable().optional(),
11288
11727
  /** Padding preset */
@@ -11712,6 +12151,7 @@ var sectionStylesOverrideSchema = z21.object({
11712
12151
  spacing: semanticSpacingSchema.nullable().optional(),
11713
12152
  minHeight: z21.enum(["none", "banner", "hero", "immersive"]).nullable().optional(),
11714
12153
  tileTreatment: z21.enum(tileTreatmentValues).nullable().optional(),
12154
+ eventListTreatment: z21.enum(eventListTreatmentValues).nullable().optional(),
11715
12155
  eyebrowTreatment: z21.enum(eyebrowTreatmentValues).nullable().optional(),
11716
12156
  headingDecoration: headingDecorationSchema.nullable().optional(),
11717
12157
  // Author-level override consumed by later block/editor rendering phases.
@@ -12545,6 +12985,34 @@ var paletteVariantsById = new Map(
12545
12985
  paletteVariants.map((v) => [v.id, v])
12546
12986
  );
12547
12987
 
12988
+ // ../theme-core/src/accordions/siteStyleDefaults.ts
12989
+ var softEarthAccordionSystem = {
12990
+ background: {
12991
+ type: "solid",
12992
+ colorToken: "background"
12993
+ },
12994
+ spacing: "comfortable",
12995
+ corners: "square",
12996
+ border: null,
12997
+ shadow: null,
12998
+ icon: {
12999
+ style: "plus-minus",
13000
+ position: "right",
13001
+ size: "md",
13002
+ colorToken: "primary"
13003
+ },
13004
+ trigger: {
13005
+ textColorToken: "text",
13006
+ fontWeight: "medium"
13007
+ },
13008
+ hover: {
13009
+ textColorToken: "primary"
13010
+ },
13011
+ content: {
13012
+ textColorToken: "neutral-700"
13013
+ }
13014
+ };
13015
+
12548
13016
  // ../theme-core/src/site-styles/headerLooks.ts
12549
13017
  function asHeaderLookId(value) {
12550
13018
  return value;
@@ -12600,7 +13068,7 @@ var headerLayoutCatalog = [
12600
13068
  description: "Detached header chrome that sits over the opening section.",
12601
13069
  structure: "floating-shell",
12602
13070
  variant: "floating",
12603
- defaultPositioning: "fixed",
13071
+ defaultPositioning: "sticky",
12604
13072
  shrinkOnScroll: true,
12605
13073
  maxRecommendedNavItems: 5,
12606
13074
  allowedLogoShapes: ["none", "text-only", "horizontal"]
@@ -12617,7 +13085,9 @@ var headerStyleCatalog = [
12617
13085
  supportedLayoutIds: supportedLayouts(["classic", "centered"]),
12618
13086
  navInteraction: "color-change",
12619
13087
  surface: "neutral",
12620
- navTypography: "plain"
13088
+ defaultDepth: "none",
13089
+ navTypography: "plain",
13090
+ moods: ["calm", "professional", "editorial"]
12621
13091
  },
12622
13092
  {
12623
13093
  id: asHeaderStyleId("fine-line"),
@@ -12626,7 +13096,9 @@ var headerStyleCatalog = [
12626
13096
  supportedLayoutIds: supportedLayouts(["classic", "centered"]),
12627
13097
  navInteraction: "underline-grow",
12628
13098
  surface: "bordered",
12629
- navTypography: "plain"
13099
+ defaultDepth: "line",
13100
+ navTypography: "plain",
13101
+ moods: ["calm", "professional", "editorial"]
12630
13102
  },
12631
13103
  {
12632
13104
  id: asHeaderStyleId("soft-bar"),
@@ -12635,7 +13107,9 @@ var headerStyleCatalog = [
12635
13107
  supportedLayoutIds: supportedLayouts(["classic", "centered"]),
12636
13108
  navInteraction: "pill-background",
12637
13109
  surface: "soft",
12638
- navTypography: "plain"
13110
+ defaultDepth: "line",
13111
+ navTypography: "plain",
13112
+ moods: ["calm", "professional"]
12639
13113
  },
12640
13114
  {
12641
13115
  id: asHeaderStyleId("pill-nav"),
@@ -12644,7 +13118,9 @@ var headerStyleCatalog = [
12644
13118
  supportedLayoutIds: supportedLayouts(["classic", "centered"]),
12645
13119
  navInteraction: "pill-background",
12646
13120
  surface: "soft",
12647
- navTypography: "plain"
13121
+ defaultDepth: "none",
13122
+ navTypography: "plain",
13123
+ moods: ["calm"]
12648
13124
  },
12649
13125
  {
12650
13126
  id: asHeaderStyleId("brand-bar"),
@@ -12653,7 +13129,9 @@ var headerStyleCatalog = [
12653
13129
  supportedLayoutIds: supportedLayouts(["classic", "centered"]),
12654
13130
  navInteraction: "color-change",
12655
13131
  surface: "brand-solid",
12656
- navTypography: "brand-caps"
13132
+ defaultDepth: "none",
13133
+ navTypography: "brand-caps",
13134
+ moods: ["professional", "expressive", "utility"]
12657
13135
  },
12658
13136
  {
12659
13137
  id: asHeaderStyleId("brand-underline"),
@@ -12662,7 +13140,9 @@ var headerStyleCatalog = [
12662
13140
  supportedLayoutIds: supportedLayouts(["classic"]),
12663
13141
  navInteraction: "underline-grow",
12664
13142
  surface: "brand-solid",
12665
- navTypography: "brand-caps"
13143
+ defaultDepth: "none",
13144
+ navTypography: "brand-caps",
13145
+ moods: ["expressive"]
12666
13146
  },
12667
13147
  {
12668
13148
  id: asHeaderStyleId("brand-pill"),
@@ -12671,7 +13151,9 @@ var headerStyleCatalog = [
12671
13151
  supportedLayoutIds: supportedLayouts(["classic", "centered", "floating"]),
12672
13152
  navInteraction: "pill-background",
12673
13153
  surface: "brand-solid",
12674
- navTypography: "brand-caps"
13154
+ defaultDepth: "none",
13155
+ navTypography: "brand-caps",
13156
+ moods: ["expressive"]
12675
13157
  },
12676
13158
  {
12677
13159
  id: asHeaderStyleId("serif-line"),
@@ -12680,7 +13162,9 @@ var headerStyleCatalog = [
12680
13162
  supportedLayoutIds: supportedLayouts(["classic", "centered"]),
12681
13163
  navInteraction: "underline-grow",
12682
13164
  surface: "bordered",
12683
- navTypography: "heading"
13165
+ defaultDepth: "line",
13166
+ navTypography: "heading",
13167
+ moods: ["editorial", "calm"]
12684
13168
  },
12685
13169
  {
12686
13170
  id: asHeaderStyleId("flat-tabs"),
@@ -12689,16 +13173,20 @@ var headerStyleCatalog = [
12689
13173
  supportedLayoutIds: supportedLayouts(["classic", "centered"]),
12690
13174
  navInteraction: "flat-block",
12691
13175
  surface: "bordered",
12692
- navTypography: "quiet-caps"
13176
+ defaultDepth: "shadow",
13177
+ navTypography: "quiet-caps",
13178
+ moods: ["professional", "utility", "expressive"]
12693
13179
  },
12694
13180
  {
12695
13181
  id: asHeaderStyleId("glass"),
12696
13182
  label: "Glass",
12697
13183
  description: "Translucent chrome with frosted navigation backing.",
12698
- supportedLayoutIds: supportedLayouts(["classic", "floating"]),
13184
+ supportedLayoutIds: supportedLayouts(["floating"]),
12699
13185
  navInteraction: "glass-backed",
12700
13186
  surface: "floating",
12701
- navTypography: "plain"
13187
+ defaultDepth: "shadow",
13188
+ navTypography: "plain",
13189
+ moods: ["expressive", "calm"]
12702
13190
  },
12703
13191
  {
12704
13192
  id: asHeaderStyleId("minimal-surface"),
@@ -12707,7 +13195,9 @@ var headerStyleCatalog = [
12707
13195
  supportedLayoutIds: supportedLayouts(["floating"]),
12708
13196
  navInteraction: "color-change",
12709
13197
  surface: "floating",
12710
- navTypography: "plain"
13198
+ defaultDepth: "none",
13199
+ navTypography: "plain",
13200
+ moods: ["editorial", "calm"]
12711
13201
  },
12712
13202
  {
12713
13203
  id: asHeaderStyleId("soft-shell"),
@@ -12716,7 +13206,9 @@ var headerStyleCatalog = [
12716
13206
  supportedLayoutIds: supportedLayouts(["floating"]),
12717
13207
  navInteraction: "pill-background",
12718
13208
  surface: "floating",
12719
- navTypography: "plain"
13209
+ defaultDepth: "shadow",
13210
+ navTypography: "plain",
13211
+ moods: ["calm", "professional"]
12720
13212
  },
12721
13213
  {
12722
13214
  id: asHeaderStyleId("split-glass"),
@@ -12725,7 +13217,9 @@ var headerStyleCatalog = [
12725
13217
  supportedLayoutIds: supportedLayouts(["floating"]),
12726
13218
  navInteraction: "glass-backed",
12727
13219
  surface: "floating",
12728
- navTypography: "quiet-caps"
13220
+ defaultDepth: "shadow",
13221
+ navTypography: "quiet-caps",
13222
+ moods: ["expressive"]
12729
13223
  },
12730
13224
  {
12731
13225
  id: asHeaderStyleId("split-pill"),
@@ -12734,7 +13228,9 @@ var headerStyleCatalog = [
12734
13228
  supportedLayoutIds: supportedLayouts(["floating"]),
12735
13229
  navInteraction: "pill-background",
12736
13230
  surface: "floating",
12737
- navTypography: "heading"
13231
+ defaultDepth: "shadow",
13232
+ navTypography: "heading",
13233
+ moods: ["calm", "editorial"]
12738
13234
  }
12739
13235
  ];
12740
13236
  var headerLayoutsById = new Map(
@@ -12748,7 +13244,6 @@ var headerStyleCompatibilityOrder = /* @__PURE__ */ new Map([
12748
13244
  asHeaderLayoutId("classic"),
12749
13245
  headerStyleRepairChain([
12750
13246
  "minimal",
12751
- "glass",
12752
13247
  "fine-line",
12753
13248
  "soft-bar",
12754
13249
  "pill-nav",
@@ -12815,7 +13310,13 @@ var headerStyleRepairOrder = /* @__PURE__ */ new Map(
12815
13310
  ],
12816
13311
  [
12817
13312
  asHeaderStyleId("glass"),
12818
- headerStyleRepairChain(["glass", "minimal-surface", "minimal"])
13313
+ headerStyleRepairChain([
13314
+ "glass",
13315
+ "soft-shell",
13316
+ "fine-line",
13317
+ "minimal-surface",
13318
+ "minimal"
13319
+ ])
12819
13320
  ],
12820
13321
  [
12821
13322
  asHeaderStyleId("soft-shell"),
@@ -12927,6 +13428,23 @@ function getCompatibleHeaderStyleIds(layoutId) {
12927
13428
  }
12928
13429
  );
12929
13430
  }
13431
+ function themedHeaderShadow(theme) {
13432
+ switch (theme.shadow.elevation) {
13433
+ case "none":
13434
+ return void 0;
13435
+ case "low":
13436
+ return { elevation: "sm" };
13437
+ case "medium":
13438
+ return { elevation: "md" };
13439
+ case "high":
13440
+ return { elevation: "lg" };
13441
+ default:
13442
+ return assertNever(
13443
+ theme.shadow.elevation,
13444
+ "Unhandled theme shadow elevation"
13445
+ );
13446
+ }
13447
+ }
12930
13448
  function solidBrandHeader(theme) {
12931
13449
  const ctaVariant = resolveHeaderCtaVariant(theme, "inverted");
12932
13450
  return {
@@ -13076,9 +13594,7 @@ function practicalUtilityHeader(theme) {
13076
13594
  navColor: "text",
13077
13595
  navStyle: "solid",
13078
13596
  navWeight: "semibold",
13079
- shadow: {
13080
- elevation: "sm"
13081
- },
13597
+ shadow: themedHeaderShadow(theme),
13082
13598
  border: {
13083
13599
  style: "solid",
13084
13600
  width: "thin",
@@ -13147,6 +13663,7 @@ function floatingGlassHeader(theme) {
13147
13663
  return {
13148
13664
  ...transparentOverlayHeader(theme),
13149
13665
  variant: "floating",
13666
+ positioning: "sticky",
13150
13667
  navStyle: "frosted",
13151
13668
  navContainer: {
13152
13669
  type: "glass",
@@ -13662,7 +14179,7 @@ var typographyPresets = [
13662
14179
  heroTypography: {
13663
14180
  headlineSize: "6xl",
13664
14181
  headlineLineHeight: "tight",
13665
- subheadlineSize: "editorial",
14182
+ subheadlineSize: "2xl",
13666
14183
  subheadlineLineHeight: "normal",
13667
14184
  microHeadlineSize: "6xl",
13668
14185
  microHeadlineLineHeight: "tight",
@@ -13680,6 +14197,8 @@ var typographyPresetsById = new Map(
13680
14197
  );
13681
14198
 
13682
14199
  // ../theme-core/src/site-styles/curatedSiteStyles.ts
14200
+ var SOFT_EARTH_SITE_STYLE_ID_VALUE = "site-style:soft-earth";
14201
+ var SOFT_EARTH_SITE_STYLE_ID = asSiteStyleId(SOFT_EARTH_SITE_STYLE_ID_VALUE);
13683
14202
  var curatedSiteStyleIdValues = [
13684
14203
  "site-style:calm-studio",
13685
14204
  "site-style:clear-professional",
@@ -13691,7 +14210,7 @@ var curatedSiteStyleIdValues = [
13691
14210
  "site-style:personal-retreat-journal",
13692
14211
  "site-style:tactile-workshop",
13693
14212
  "site-style:modern-wellness",
13694
- "site-style:soft-earth",
14213
+ SOFT_EARTH_SITE_STYLE_ID_VALUE,
13695
14214
  "site-style:bold-launch",
13696
14215
  "site-style:south-west-twerk-school"
13697
14216
  ];
@@ -13773,7 +14292,10 @@ function uniqueContentFrameKinds() {
13773
14292
  var generatedContentFrameKinds = uniqueContentFrameKinds();
13774
14293
  function defineCuratedSiteStyle(input) {
13775
14294
  const legacyHeaderLookIds = input.recommendedHeaderLookIds ?? ["clean-base"];
13776
- const inferredHeaderCuration = inferHeaderCurationFromLegacyLooks(legacyHeaderLookIds);
14295
+ const inferredHeaderCuration = inferHeaderCurationFromLegacyLooks(
14296
+ legacyHeaderLookIds,
14297
+ input.tokenRecipes
14298
+ );
13777
14299
  const typographyPresetChoices = input.typographyPresetChoices ?? defaultTypographyPresetChoicesForRecipe(input.tokenRecipes.typography);
13778
14300
  const defaultTypographyPresetId = input.defaultTypographyPresetId ? asTypographyPresetId(input.defaultTypographyPresetId) : typographyPresetChoices[0].id;
13779
14301
  if (!typographyPresetChoices.some(
@@ -13806,6 +14328,7 @@ function defineCuratedSiteStyle(input) {
13806
14328
  supportedTransitions: generatedDesignOptionCatalog.transitions
13807
14329
  },
13808
14330
  ...input.themeOverrides ? { themeOverrides: input.themeOverrides } : {},
14331
+ ...input.defaultBlockVariants ? { defaultBlockVariants: input.defaultBlockVariants } : {},
13809
14332
  recommendedAppearancePresetIds: (input.recommendedAppearancePresetIds ?? []).map(asAppearancePresetId),
13810
14333
  defaultHeaderSelection: input.defaultHeaderSelection ? {
13811
14334
  layoutId: asHeaderLayoutId(input.defaultHeaderSelection.layoutId),
@@ -13864,7 +14387,69 @@ function nonEmptyHeaderStyleChoices(choices, fallbackLayoutId) {
13864
14387
  };
13865
14388
  return [first, ...choices.slice(1)];
13866
14389
  }
13867
- function inferHeaderCurationFromLegacyLooks(lookIds) {
14390
+ function uniqueCompatibleHeaderStyleChoices(choices, fallbackLayoutId) {
14391
+ const compatible = new Set(getCompatibleHeaderStyleIds(fallbackLayoutId));
14392
+ const seen = /* @__PURE__ */ new Set();
14393
+ const unique = choices.filter((choice) => {
14394
+ if (!compatible.has(choice.id)) return false;
14395
+ if (seen.has(choice.id)) return false;
14396
+ seen.add(choice.id);
14397
+ return true;
14398
+ });
14399
+ return nonEmptyHeaderStyleChoices(unique, fallbackLayoutId);
14400
+ }
14401
+ function inferredHeaderStyleValuesForRecipes(layoutId, recipes) {
14402
+ switch (layoutId) {
14403
+ case "classic":
14404
+ if (isExpressiveRecipe(recipes)) {
14405
+ return [
14406
+ "brand-bar",
14407
+ "brand-underline",
14408
+ "flat-tabs",
14409
+ "brand-pill",
14410
+ "fine-line"
14411
+ ];
14412
+ }
14413
+ if (recipes.spacing === "compact") {
14414
+ return ["flat-tabs", "fine-line", "minimal", "brand-bar"];
14415
+ }
14416
+ if (isSerifTypographyRecipe(recipes)) {
14417
+ return ["serif-line", "fine-line", "minimal", "soft-bar"];
14418
+ }
14419
+ if (recipes.radius === "rounded" || recipes.radius === "pill") {
14420
+ return ["soft-bar", "pill-nav", "fine-line", "minimal"];
14421
+ }
14422
+ return ["fine-line", "minimal", "soft-bar", "brand-bar"];
14423
+ case "centered":
14424
+ if (isSerifTypographyRecipe(recipes)) {
14425
+ return ["serif-line", "fine-line", "minimal", "soft-bar"];
14426
+ }
14427
+ if (isExpressiveRecipe(recipes)) {
14428
+ return ["brand-pill", "flat-tabs", "brand-bar", "fine-line"];
14429
+ }
14430
+ if (recipes.radius === "rounded" || recipes.radius === "pill") {
14431
+ return ["soft-bar", "pill-nav", "fine-line", "minimal"];
14432
+ }
14433
+ return ["minimal", "fine-line", "soft-bar"];
14434
+ case "floating":
14435
+ if (isExpressiveRecipe(recipes)) {
14436
+ return ["glass", "split-glass", "brand-pill", "soft-shell"];
14437
+ }
14438
+ if (isSerifTypographyRecipe(recipes)) {
14439
+ return ["split-pill", "minimal-surface", "soft-shell"];
14440
+ }
14441
+ return ["soft-shell", "minimal-surface", "glass"];
14442
+ default:
14443
+ return [];
14444
+ }
14445
+ }
14446
+ function isExpressiveRecipe(recipes) {
14447
+ return recipes.contrast === "maximum" || recipes.shadow === "layered" || recipes.motion === "expressive";
14448
+ }
14449
+ function isSerifTypographyRecipe(recipes) {
14450
+ return recipes.typography === "serif-editorial" || recipes.typography === "classic-serif";
14451
+ }
14452
+ function inferHeaderCurationFromLegacyLooks(lookIds, recipes) {
13868
14453
  const selections = lookIds.map((lookId) => resolveLegacyHeaderLookAlias(asHeaderLookId(lookId))).filter(
13869
14454
  (selection) => Boolean(selection)
13870
14455
  );
@@ -13877,8 +14462,15 @@ function inferHeaderCurationFromLegacyLooks(lookIds) {
13877
14462
  );
13878
14463
  const stylesByLayout = {};
13879
14464
  for (const layoutChoice of layoutChoices) {
13880
- const styleChoices = selections.filter((selection) => selection.layoutId === layoutChoice.id).map((selection) => headerStyleChoice(selection.styleId));
13881
- stylesByLayout[unbrandHeaderLayoutId(layoutChoice.id)] = nonEmptyHeaderStyleChoices(styleChoices, layoutChoice.id);
14465
+ const legacyStyleChoices = selections.filter((selection) => selection.layoutId === layoutChoice.id).map((selection) => headerStyleChoice(selection.styleId));
14466
+ const inferredStyleChoices = inferredHeaderStyleValuesForRecipes(
14467
+ layoutChoice.id,
14468
+ recipes
14469
+ ).map((styleId) => headerStyleChoice(styleId));
14470
+ stylesByLayout[unbrandHeaderLayoutId(layoutChoice.id)] = uniqueCompatibleHeaderStyleChoices(
14471
+ [...legacyStyleChoices, ...inferredStyleChoices],
14472
+ layoutChoice.id
14473
+ );
13882
14474
  }
13883
14475
  return {
13884
14476
  defaultHeaderSelection,
@@ -14298,10 +14890,10 @@ var curatedSiteStyles = [
14298
14890
  ]
14299
14891
  }),
14300
14892
  defineCuratedSiteStyle({
14301
- id: "site-style:soft-earth",
14893
+ id: SOFT_EARTH_SITE_STYLE_ID,
14302
14894
  name: "Soft Earth",
14303
14895
  description: "Warm, grounded, and editorial for yoga studios, retreats, and wellbeing communities.",
14304
- 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.",
14896
+ 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.",
14305
14897
  siteCreatorSelection: {
14306
14898
  kind: "site_creator_keyword_heuristic",
14307
14899
  priority: 45
@@ -14371,14 +14963,18 @@ var curatedSiteStyles = [
14371
14963
  paragraphSize: "default",
14372
14964
  headingSize: "editorial"
14373
14965
  }
14374
- }
14966
+ },
14967
+ accordions: softEarthAccordionSystem
14968
+ },
14969
+ defaultBlockVariants: {
14970
+ "block.faq": "question-columns"
14375
14971
  },
14376
14972
  recommendedAppearancePresetIds: [
14377
14973
  "hero-brand-scrim",
14378
- "intro-soft-earth-statement",
14379
- "feature-cards-soft-earth-offerings",
14380
- "testimonials-soft-earth-proof-band",
14381
- "faq-soft-earth-two-column",
14974
+ "intro-organic-statement",
14975
+ "feature-cards-raised-rule",
14976
+ "events-lined-panel",
14977
+ "testimonials-brand-background-quotes",
14382
14978
  "contact-form-panel"
14383
14979
  ],
14384
14980
  recommendedHeaderLookIds: [
@@ -14482,7 +15078,7 @@ var curatedSiteStyles = [
14482
15078
  "hero-brand-scrim-fixed-frame",
14483
15079
  "body-text-editorial-intro",
14484
15080
  "schedule-details-brand-depth",
14485
- "testimonials-accent-quote-proof",
15081
+ "testimonials-accent-quote-cards",
14486
15082
  "contact-form-brand-depth-card"
14487
15083
  ],
14488
15084
  recommendedHeaderLookIds: [
@@ -14577,6 +15173,7 @@ var themeV2RuntimeStyleFieldNames = [
14577
15173
  ];
14578
15174
  var themeV2BlockSpecificRawStyleFieldNames = [
14579
15175
  "_contentCardStyles",
15176
+ "_heroLayoutStyles",
14580
15177
  "_textCardStyles"
14581
15178
  ];
14582
15179
  var themeV2NormalEditorRawStyleFieldNames = [
@@ -14586,6 +15183,10 @@ var themeV2NormalEditorRawStyleFieldNames = [
14586
15183
  var themeV2NormalEditorRawStyleFieldNameSet = new Set(
14587
15184
  themeV2NormalEditorRawStyleFieldNames
14588
15185
  );
15186
+ var themeV2CompilerOwnedFieldNames = [
15187
+ ...themeV2RuntimeStyleFieldNames,
15188
+ ...themeV2BlockSpecificRawStyleFieldNames
15189
+ ];
14589
15190
 
14590
15191
  // ../theme-core/src/site-styles/designState.ts
14591
15192
  var themeV2DesignStateSchemaVersion = 1;
@@ -14600,6 +15201,16 @@ var heroLegibilityStrategySchema = z23.enum([
14600
15201
  "scrim-gradient",
14601
15202
  "solid-panel"
14602
15203
  ]);
15204
+ var heroCompositionIntentSchema = z23.enum([
15205
+ "center",
15206
+ "bottom-left"
15207
+ ]);
15208
+ var heroTypographyScaleIntentSchema = z23.enum([
15209
+ "quiet",
15210
+ "editorial",
15211
+ "display",
15212
+ "poster"
15213
+ ]);
14603
15214
  var sectionHeightIntentSchema = z23.enum([
14604
15215
  "default",
14605
15216
  "banner",
@@ -14635,6 +15246,7 @@ var imageSurfaceTreatmentSchema = z23.discriminatedUnion("kind", [
14635
15246
  ]);
14636
15247
  var testimonialCardTreatmentSchema = z23.enum(["default", "accent-quote"]);
14637
15248
  var tileTreatmentSchema = z23.enum(tileTreatmentValues);
15249
+ var eventListTreatmentSchema = z23.enum(eventListTreatmentValues);
14638
15250
  var eyebrowTreatmentSchema = z23.enum(eyebrowTreatmentValues);
14639
15251
  function uniqueNonEmpty(values) {
14640
15252
  const uniqueValues = [...new Set(values)];
@@ -14676,10 +15288,13 @@ var blockDesignPlanSchema = z23.object({
14676
15288
  emphasis: z23.enum(userDesignOptionCatalog.emphases),
14677
15289
  sectionHeight: sectionHeightIntentSchema.optional(),
14678
15290
  heroLegibility: heroLegibilityStrategySchema.optional(),
15291
+ heroComposition: heroCompositionIntentSchema.optional(),
15292
+ heroTypographyScale: heroTypographyScaleIntentSchema.optional(),
14679
15293
  imageSurfaceTreatment: imageSurfaceTreatmentSchema.optional(),
14680
15294
  imageSurfaceMotion: imageSurfaceMotionSchema.optional(),
14681
15295
  testimonialCardTreatment: testimonialCardTreatmentSchema.optional(),
14682
15296
  tileTreatment: tileTreatmentSchema.optional(),
15297
+ eventListTreatment: eventListTreatmentSchema.optional(),
14683
15298
  eyebrowTreatment: eyebrowTreatmentSchema.optional()
14684
15299
  }).strict();
14685
15300
  var styleAuthoritySchema = z23.discriminatedUnion("kind", [
@@ -16079,6 +16694,7 @@ function styledSection(config) {
16079
16694
  renderBackgroundImage = true,
16080
16695
  backgroundImageLoading,
16081
16696
  backgroundImageFetchPriority,
16697
+ allowOverflow = false,
16082
16698
  fullWidthPath
16083
16699
  } = config;
16084
16700
  const renderedBackgroundNodes = backgroundLayer(`${bindFrom}.background`, {
@@ -16113,7 +16729,7 @@ function styledSection(config) {
16113
16729
  // No fallback needed - transform handles all cases via defaultSpacing
16114
16730
  }
16115
16731
  },
16116
- allowOverflow: {
16732
+ allowOverflow: allowOverflow ? true : {
16117
16733
  $bind: {
16118
16734
  from: `${bindFrom}.background`,
16119
16735
  transforms: [{ id: "background.resolveAllowOverflow" }],
@@ -16808,6 +17424,14 @@ var tileTreatmentSet = new Set(tileTreatmentValues);
16808
17424
  function isTileTreatment(value) {
16809
17425
  return typeof value === "string" && tileTreatmentSet.has(value);
16810
17426
  }
17427
+ var eventListTreatmentClassMap = {
17428
+ plain: "",
17429
+ "lined-panel": "rb-event-list-treatment-lined-panel"
17430
+ };
17431
+ var eventListTreatmentSet = new Set(eventListTreatmentValues);
17432
+ function isEventListTreatment(value) {
17433
+ return typeof value === "string" && eventListTreatmentSet.has(value);
17434
+ }
16811
17435
  var sectionClassNameTransform = {
16812
17436
  id: "sectionStyles.resolveClassName",
16813
17437
  kind: "string",
@@ -16875,6 +17499,17 @@ var sectionClassNameTransform = {
16875
17499
  `[sectionStyles] Invalid tileTreatment value in _sectionStyles: "${tileTreatment}". Expected one of: ${tileTreatmentValues.join(", ")}.`
16876
17500
  );
16877
17501
  }
17502
+ const eventListTreatment = input?.eventListTreatment;
17503
+ if (isEventListTreatment(eventListTreatment)) {
17504
+ const eventListTreatmentClass = eventListTreatmentClassMap[eventListTreatment];
17505
+ if (eventListTreatmentClass) {
17506
+ classes.push(eventListTreatmentClass);
17507
+ }
17508
+ } else if (typeof eventListTreatment === "string" && process.env.NODE_ENV !== "production") {
17509
+ console.warn(
17510
+ `[sectionStyles] Invalid eventListTreatment value in _sectionStyles: "${eventListTreatment}". Expected one of: ${eventListTreatmentValues.join(", ")}.`
17511
+ );
17512
+ }
16878
17513
  if (hasFixedFrameBackgroundMotion(input)) {
16879
17514
  classes.push(fixedFrameScopeClass);
16880
17515
  }
@@ -17310,6 +17945,35 @@ function sectionState(opts) {
17310
17945
  );
17311
17946
  }
17312
17947
 
17948
+ // ../blocks/src/system/node/fragments/headingDecoration.ts
17949
+ var defaultBindFrom = "_sectionStyles.headingDecoration";
17950
+ function headingDecoration({
17951
+ bindFrom = defaultBindFrom,
17952
+ family,
17953
+ placement,
17954
+ className
17955
+ }) {
17956
+ return el(
17957
+ "div",
17958
+ {
17959
+ "aria-hidden": "true",
17960
+ className: {
17961
+ $bind: {
17962
+ from: bindFrom,
17963
+ transforms: [
17964
+ {
17965
+ id: "ui.headingDecorationClassName",
17966
+ options: { baseClass: className, family }
17967
+ }
17968
+ ]
17969
+ }
17970
+ }
17971
+ },
17972
+ null,
17973
+ when(`${bindFrom}.placement`, { equals: placement })
17974
+ );
17975
+ }
17976
+
17313
17977
  // ../blocks/src/system/fragments/types.ts
17314
17978
  import { z as z27 } from "zod";
17315
17979
  var FRAGMENT_ID_PATTERN = /^[a-z0-9](?:[a-z0-9._-]*[a-z0-9])?$/i;
@@ -17395,47 +18059,48 @@ function validateFieldDefinitions(fields3, fragmentId) {
17395
18059
  function prefixFieldId(field, scope) {
17396
18060
  const cloned = cloneFieldDefinition2(field);
17397
18061
  cloned.id = `${scope}.${field.id}`;
17398
- cloned.defaultValue = cloneUnknown(cloned.defaultValue);
18062
+ const defaultValue = cloned.defaultValue;
18063
+ cloned.defaultValue = cloneUnknown(defaultValue);
17399
18064
  cloned.visibleRoles = cloned.visibleRoles ? [...cloned.visibleRoles] : void 0;
17400
18065
  cloned.ui = cloneUnknown(cloned.ui);
17401
18066
  return cloned;
17402
18067
  }
17403
18068
  function cloneFieldDefinition2(field) {
17404
- switch (field.type) {
17405
- case "repeater":
17406
- if (field.polymorphic && field.itemTypes) {
17407
- return {
17408
- ...field,
17409
- polymorphic: true,
17410
- itemTypes: Object.fromEntries(
17411
- Object.entries(field.itemTypes).map(([key, itemType]) => [
17412
- key,
17413
- {
17414
- ...itemType,
17415
- fields: itemType.fields.map(cloneFieldDefinition2)
17416
- }
17417
- ])
17418
- )
17419
- };
17420
- } else if (field.schema) {
17421
- return {
17422
- ...field,
17423
- schema: {
17424
- fields: field.schema.fields.map(cloneFieldDefinition2)
17425
- }
17426
- };
17427
- }
17428
- return { ...field };
17429
- case "group":
18069
+ if (field.type === "repeater") {
18070
+ if (field.polymorphic && field.itemTypes) {
18071
+ return {
18072
+ ...field,
18073
+ polymorphic: true,
18074
+ itemTypes: Object.fromEntries(
18075
+ Object.entries(field.itemTypes).map(([key, itemType]) => [
18076
+ key,
18077
+ {
18078
+ ...itemType,
18079
+ fields: itemType.fields.map(cloneFieldDefinition2)
18080
+ }
18081
+ ])
18082
+ )
18083
+ };
18084
+ }
18085
+ if (field.schema) {
17430
18086
  return {
17431
18087
  ...field,
17432
18088
  schema: {
17433
18089
  fields: field.schema.fields.map(cloneFieldDefinition2)
17434
18090
  }
17435
18091
  };
17436
- default:
17437
- return { ...field };
18092
+ }
18093
+ return { ...field };
18094
+ }
18095
+ if (field.type === "group") {
18096
+ return {
18097
+ ...field,
18098
+ schema: {
18099
+ fields: field.schema.fields.map(cloneFieldDefinition2)
18100
+ }
18101
+ };
17438
18102
  }
18103
+ return { ...field };
17439
18104
  }
17440
18105
  function cloneUnknown(value) {
17441
18106
  if (value == null || typeof value !== "object") {
@@ -18088,6 +18753,10 @@ var testimonialsHeadingFragment = defineFragment({
18088
18753
  when("content.heading"),
18089
18754
  bind("content.heading")
18090
18755
  ),
18756
+ headingDecoration({
18757
+ family: "short-center-rule",
18758
+ placement: "under-centered-heading"
18759
+ }),
18091
18760
  text(
18092
18761
  {
18093
18762
  as: "p",
@@ -18759,6 +19428,41 @@ var faqHeadingFragment = defineFragment({
18759
19428
  });
18760
19429
 
18761
19430
  // ../blocks/src/system/fragments/library/faqAccordion.ts
19431
+ function createFaqAccordionLayout(options = {}) {
19432
+ return accordionList({
19433
+ collection: "content.items",
19434
+ itemName: "faqItem",
19435
+ indexName: "faqIndex",
19436
+ accordionProps: {
19437
+ className: options.rootClassName ?? "accordion-root",
19438
+ type: "single",
19439
+ collapsible: true
19440
+ },
19441
+ itemProps: {
19442
+ className: {
19443
+ $bind: {
19444
+ from: "content._cardStyles",
19445
+ transforms: [
19446
+ {
19447
+ id: "boxStyles.all",
19448
+ options: {
19449
+ axis: "all",
19450
+ includeSpacing: false,
19451
+ baseClass: "rb-faq-item rb-relative rb-isolate rb-overflow-hidden"
19452
+ }
19453
+ }
19454
+ ]
19455
+ },
19456
+ fallback: "rb-faq-item"
19457
+ },
19458
+ iconStyle: { $bind: { from: "theme.accordions.icon.style" } },
19459
+ // Legacy theme accordion style
19460
+ iconTreatment: { $bind: { from: "content._sectionStyles.accordionIconTreatment" } }
19461
+ },
19462
+ triggerFrom: "faqItem.question",
19463
+ contentFrom: "faqItem.answer"
19464
+ });
19465
+ }
18762
19466
  var faqAccordionFragment = defineFragment({
18763
19467
  id: "faqAccordion",
18764
19468
  title: "FAQ Accordion",
@@ -18792,40 +19496,7 @@ var faqAccordionFragment = defineFragment({
18792
19496
  }
18793
19497
  }
18794
19498
  ],
18795
- layout: accordionList({
18796
- collection: "content.items",
18797
- itemName: "faqItem",
18798
- indexName: "faqIndex",
18799
- accordionProps: {
18800
- className: "accordion-root",
18801
- // CSS-first: all styling handled by theme CSS
18802
- type: "single",
18803
- collapsible: true
18804
- },
18805
- itemProps: {
18806
- className: {
18807
- $bind: {
18808
- from: "content._cardStyles",
18809
- transforms: [
18810
- {
18811
- id: "boxStyles.all",
18812
- options: {
18813
- axis: "all",
18814
- includeSpacing: false,
18815
- baseClass: "rb-faq-item rb-relative rb-isolate rb-overflow-hidden rb-border"
18816
- }
18817
- }
18818
- ]
18819
- },
18820
- fallback: "rb-faq-item"
18821
- },
18822
- iconStyle: { $bind: { from: "theme.accordions.icon.style" } },
18823
- // Legacy theme accordion style
18824
- iconTreatment: { $bind: { from: "content._sectionStyles.accordionIconTreatment" } }
18825
- },
18826
- triggerFrom: "faqItem.question",
18827
- contentFrom: "faqItem.answer"
18828
- })
19499
+ layout: createFaqAccordionLayout()
18829
19500
  });
18830
19501
 
18831
19502
  // ../blocks/src/system/fragments/library/card.ts
@@ -19772,7 +20443,8 @@ function createBlockManifestWithContentShape(config, _contentShape) {
19772
20443
  return createBlockManifest(config);
19773
20444
  }
19774
20445
  function normalizeBlockLayout(layout) {
19775
- return Array.isArray(layout) ? [...layout] : layout;
20446
+ const rawLayout = layout;
20447
+ return Array.isArray(rawLayout) ? rawLayout : rawLayout;
19776
20448
  }
19777
20449
  function deriveComponentName(id) {
19778
20450
  const base = id.replace(/^block\./, "");
@@ -19878,6 +20550,7 @@ var microLayout = styledSection({
19878
20550
  function splitLayoutWith(children) {
19879
20551
  return styledSection({
19880
20552
  children: styledContainer({
20553
+ baseClassName: "rb-relative rb-isolate rb-overflow-visible",
19881
20554
  children: {
19882
20555
  type: "grid",
19883
20556
  props: {
@@ -19902,6 +20575,7 @@ function splitLayoutWith(children) {
19902
20575
  // The split variants render the image as a real grid column, so suppress
19903
20576
  // the default absolute background image layer while keeping color/overlay.
19904
20577
  renderBackgroundImage: false,
20578
+ allowOverflow: true,
19905
20579
  baseClass: ""
19906
20580
  });
19907
20581
  }
@@ -20055,6 +20729,21 @@ function introHeading(className) {
20055
20729
  bind("content.title")
20056
20730
  );
20057
20731
  }
20732
+ function introHeadingGroup(className) {
20733
+ return stack(
20734
+ {
20735
+ gap: "sm",
20736
+ className: "rb-intro-heading-group"
20737
+ },
20738
+ [
20739
+ introHeading(className),
20740
+ headingDecoration({
20741
+ family: "organic-squiggle",
20742
+ placement: "after-heading"
20743
+ })
20744
+ ]
20745
+ );
20746
+ }
20058
20747
  function introBody(className = "rb-prose rb-max-w-none") {
20059
20748
  return richText({ className }, bind("content.body"));
20060
20749
  }
@@ -20073,6 +20762,10 @@ function introCopyStack(options = {}) {
20073
20762
  },
20074
20763
  [
20075
20764
  introHeading(options.headingClassName ?? "rb-intro-title"),
20765
+ headingDecoration({
20766
+ family: "organic-squiggle",
20767
+ placement: "after-heading"
20768
+ }),
20076
20769
  introBody(options.bodyClassName),
20077
20770
  introCtas(options.ctaJustify)
20078
20771
  ]
@@ -20112,7 +20805,7 @@ var statementCopyLayout = styledSection({
20112
20805
  className: "rb-intro rb-intro-statement rb-grid rb-grid-cols-1 rb-gap-8 rb-md-grid-cols-2 rb-md-items-start"
20113
20806
  },
20114
20807
  [
20115
- introHeading("rb-intro-title rb-max-w-xl"),
20808
+ introHeadingGroup("rb-intro-title rb-max-w-xl"),
20116
20809
  stack({ gap: "md", className: "rb-intro-copy rb-max-w-xl" }, [
20117
20810
  introBody(),
20118
20811
  introCtas("start")
@@ -20133,7 +20826,7 @@ var statementMediaLayout = styledSection({
20133
20826
  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"
20134
20827
  },
20135
20828
  [
20136
- introHeading("rb-intro-title rb-max-w-xl"),
20829
+ introHeadingGroup("rb-intro-title rb-max-w-xl"),
20137
20830
  stack({ gap: "md", className: "rb-intro-copy rb-max-w-xl" }, [
20138
20831
  introBody(),
20139
20832
  introCtas("start")
@@ -21135,6 +21828,9 @@ function isNodeDefinitionArray(layout) {
21135
21828
  }
21136
21829
  var headingLayout = fragmentLayoutNode(faqHeadingFragment.layout);
21137
21830
  var accordionLayout = fragmentLayoutNode(faqAccordionFragment.layout);
21831
+ var questionColumnsAccordionLayout = createFaqAccordionLayout({
21832
+ rootClassName: "accordion-root rb-faq-question-columns rb-grid rb-grid-cols-1 rb-gap-4 rb-lg-grid-cols-2"
21833
+ });
21138
21834
  var defaultLayout = styledSection({
21139
21835
  children: styledContainer({
21140
21836
  baseClassName: "rb-relative rb-isolate",
@@ -21148,11 +21844,24 @@ var twoColumnLayout = styledSection({
21148
21844
  children: el(
21149
21845
  "div",
21150
21846
  {
21151
- className: "rb-faq-two-column rb-grid rb-grid-cols-1 rb-gap-8 rb-lg-grid-cols-2 rb-lg-items-start"
21847
+ className: "rb-faq-split-heading rb-grid rb-grid-cols-1 rb-gap-8 rb-lg-grid-cols-2 rb-lg-items-start"
21152
21848
  },
21153
21849
  [
21154
- el("div", { className: "rb-faq-two-column-heading" }, [headingLayout]),
21155
- el("div", { className: "rb-faq-two-column-accordion" }, [accordionLayout])
21850
+ el("div", { className: "rb-faq-split-heading-copy" }, [headingLayout]),
21851
+ el("div", { className: "rb-faq-split-heading-accordion" }, [accordionLayout])
21852
+ ]
21853
+ )
21854
+ }),
21855
+ baseClass: ""
21856
+ });
21857
+ var questionColumnsLayout = styledSection({
21858
+ children: styledContainer({
21859
+ baseClassName: "rb-relative rb-isolate",
21860
+ children: stack(
21861
+ { gap: "xl", className: "rb-w-full" },
21862
+ [
21863
+ headingLayout,
21864
+ questionColumnsAccordionLayout
21156
21865
  ]
21157
21866
  )
21158
21867
  }),
@@ -21177,7 +21886,8 @@ var faqManifest = createBlockManifest({
21177
21886
  layout: defaultLayout,
21178
21887
  variants: {
21179
21888
  default: defaultLayout,
21180
- "two-column": twoColumnLayout
21889
+ "two-column": twoColumnLayout,
21890
+ "question-columns": questionColumnsLayout
21181
21891
  },
21182
21892
  defaultVariant: "default",
21183
21893
  variantOptions: {
@@ -21188,6 +21898,10 @@ var faqManifest = createBlockManifest({
21188
21898
  "two-column": {
21189
21899
  label: "Two column",
21190
21900
  description: "A left heading column with FAQ items on the right."
21901
+ },
21902
+ "question-columns": {
21903
+ label: "Question columns",
21904
+ description: "A full-width heading above FAQ items split into two columns."
21191
21905
  }
21192
21906
  },
21193
21907
  description: "Accordion of frequently asked questions and answers.",
@@ -21276,16 +21990,20 @@ var marqueeLoopTransform = {
21276
21990
  summary: "Repeat an array to a minimum length, then duplicate it for seamless marquee looping",
21277
21991
  schema: marqueeLoopOptionsSchema,
21278
21992
  run: (value, options) => {
21279
- if (!Array.isArray(value) || value.length === 0) return [];
21993
+ const items = toUnknownArray(value);
21994
+ if (items.length === 0) return [];
21280
21995
  const minItems = options?.minItems ?? 10;
21281
21996
  const base = [];
21282
21997
  while (base.length < minItems) {
21283
- base.push(...value);
21998
+ base.push(...items);
21284
21999
  if (base.length > 1e3) break;
21285
22000
  }
21286
22001
  return [...base, ...base];
21287
22002
  }
21288
22003
  };
22004
+ function toUnknownArray(value) {
22005
+ return Array.isArray(value) ? value : [];
22006
+ }
21289
22007
  var formattingTransforms = [
21290
22008
  uppercaseTransform,
21291
22009
  fallbackTransform,
@@ -21309,9 +22027,21 @@ var eyebrowTreatmentClassMap = {
21309
22027
  "accent-pill-bounce": "rb-eyebrow-treatment-pill rb-eyebrow-treatment-accent rb-eyebrow-treatment-pill-bounce"
21310
22028
  };
21311
22029
  var eyebrowTreatmentSet = new Set(eyebrowTreatmentValues);
22030
+ var headingDecorationFamilySet = new Set(visibleHeadingDecorationFamilyValues);
22031
+ var headingDecorationPlacementSet = new Set(visibleHeadingDecorationPlacementValues);
22032
+ var headingDecorationColorTokenSet = new Set(headingDecorationColorTokenValues);
21312
22033
  function isEyebrowTreatment(value) {
21313
22034
  return typeof value === "string" && eyebrowTreatmentSet.has(value);
21314
22035
  }
22036
+ function isHeadingDecorationFamily(value) {
22037
+ return typeof value === "string" && headingDecorationFamilySet.has(value);
22038
+ }
22039
+ function isHeadingDecorationPlacement(value) {
22040
+ return typeof value === "string" && headingDecorationPlacementSet.has(value);
22041
+ }
22042
+ function isHeadingDecorationColorToken(value) {
22043
+ return typeof value === "string" && headingDecorationColorTokenSet.has(value);
22044
+ }
21315
22045
  var imageGalleryCornerClassMap = {
21316
22046
  none: "",
21317
22047
  sm: "rb-rounded-sm",
@@ -21415,6 +22145,10 @@ var sectionStateToneTransform = {
21415
22145
  summary: "Map semantic section-state kind to feedback tone",
21416
22146
  run: (value) => sectionStateToneFromUnknown(value)
21417
22147
  };
22148
+ var heroTitleLengthThresholds = {
22149
+ medium: { maxCharacters: 42, maxWords: 6 },
22150
+ long: { maxCharacters: 78, maxWords: 11 }
22151
+ };
21418
22152
  function isPlainObject(value) {
21419
22153
  return Boolean(value) && typeof value === "object" && !Array.isArray(value);
21420
22154
  }
@@ -21422,6 +22156,14 @@ function readString(obj, key) {
21422
22156
  const v = obj[key];
21423
22157
  return typeof v === "string" ? v : void 0;
21424
22158
  }
22159
+ function resolveGeneratedHeroLayoutStyles(content) {
22160
+ const raw = content._heroLayoutStyles;
22161
+ return isPlainObject(raw) ? raw : null;
22162
+ }
22163
+ function readHeroLayoutString(content, generatedKey, fallbackKey = generatedKey) {
22164
+ const generated = resolveGeneratedHeroLayoutStyles(content);
22165
+ return generated && typeof generated[generatedKey] === "string" ? generated[generatedKey] : readString(content, fallbackKey);
22166
+ }
21425
22167
  function resolveHeroVariant(content) {
21426
22168
  const variant = readString(content, "variant");
21427
22169
  if (variant && variant.trim()) return variant.trim();
@@ -21430,14 +22172,14 @@ function resolveHeroVariant(content) {
21430
22172
  return null;
21431
22173
  }
21432
22174
  function resolveHeroContentAlignment(content) {
21433
- const raw = readString(content, "contentAlignment");
22175
+ const raw = readHeroLayoutString(content, "contentAlignment");
21434
22176
  if (raw === "left" || raw === "center" || raw === "right") return raw;
21435
22177
  const variant = resolveHeroVariant(content);
21436
22178
  if (variant === "split" || variant === "splitReverse") return "left";
21437
22179
  return "center";
21438
22180
  }
21439
22181
  function resolveHeroVerticalAlignment(content) {
21440
- const raw = readString(content, "verticalAlignment");
22182
+ const raw = readHeroLayoutString(content, "verticalAlignment");
21441
22183
  if (raw === "top" || raw === "center" || raw === "bottom") return raw;
21442
22184
  const sectionStyles = asPartialObject(content._sectionStyles);
21443
22185
  const minHeight = sectionStyles?.minHeight;
@@ -21447,11 +22189,29 @@ function resolveHeroVerticalAlignment(content) {
21447
22189
  return "top";
21448
22190
  }
21449
22191
  function resolveHeroContentMaxWidth(content) {
21450
- const raw = readString(content, "contentMaxWidth");
22192
+ const raw = readHeroLayoutString(content, "contentMaxWidth");
21451
22193
  if (raw === "default" || raw === "narrow" || raw === "medium" || raw === "wide")
21452
22194
  return raw;
21453
22195
  return "default";
21454
22196
  }
22197
+ function resolveHeroTypographyScale(content) {
22198
+ const raw = readHeroLayoutString(
22199
+ content,
22200
+ "typographyScale",
22201
+ "heroTypographyScale"
22202
+ );
22203
+ if (raw === "quiet" || raw === "editorial" || raw === "display" || raw === "poster") {
22204
+ return raw;
22205
+ }
22206
+ return null;
22207
+ }
22208
+ function resolveHeroTitleLength(content) {
22209
+ const headline = readString(content, "headline")?.trim() ?? "";
22210
+ const wordCount = headline.length === 0 ? 0 : headline.split(/\s+/).length;
22211
+ if (headline.length > heroTitleLengthThresholds.long.maxCharacters || wordCount > heroTitleLengthThresholds.long.maxWords) return "long";
22212
+ if (headline.length > heroTitleLengthThresholds.medium.maxCharacters || wordCount > heroTitleLengthThresholds.medium.maxWords) return "medium";
22213
+ return "short";
22214
+ }
21455
22215
  var heroContentWrapperClassSchema = z33.object({
21456
22216
  base: z33.string().optional()
21457
22217
  });
@@ -21464,6 +22224,8 @@ var heroContentWrapperClassTransform = {
21464
22224
  const content = isPlainObject(value) ? value : isPlainObject(context.data) ? context.data : {};
21465
22225
  const alignment = resolveHeroContentAlignment(content);
21466
22226
  const maxWidth = resolveHeroContentMaxWidth(content);
22227
+ const typographyScale = resolveHeroTypographyScale(content);
22228
+ const titleLength = resolveHeroTitleLength(content);
21467
22229
  const textAlignClass = alignment === "center" ? "rb-text-center" : alignment === "right" ? "rb-text-right" : "rb-text-left";
21468
22230
  const maxWidthClass = maxWidth === "narrow" ? "rb-max-w-2xl" : maxWidth === "medium" ? "rb-max-w-3xl" : maxWidth === "wide" ? "rb-max-w-5xl" : "";
21469
22231
  const positionClass = alignment === "center" ? "rb-mx-auto" : alignment === "right" ? "rb-ml-auto" : "";
@@ -21471,7 +22233,9 @@ var heroContentWrapperClassTransform = {
21471
22233
  options?.base,
21472
22234
  textAlignClass,
21473
22235
  maxWidthClass,
21474
- positionClass
22236
+ positionClass,
22237
+ typographyScale ? `rb-hero-typography-${typographyScale}` : "",
22238
+ `rb-hero-title-${titleLength}`
21475
22239
  ]);
21476
22240
  }
21477
22241
  };
@@ -21771,11 +22535,67 @@ var uiTransforms = [
21771
22535
  const treatment = isEyebrowTreatment(value) ? value : "plain";
21772
22536
  return joinClasses3([baseClass, eyebrowTreatmentClassMap[treatment]]);
21773
22537
  }
22538
+ },
22539
+ {
22540
+ id: "ui.headingDecorationClassName",
22541
+ kind: "string",
22542
+ summary: "Apply constrained Theme V2 heading decoration classes",
22543
+ run: (value, options) => {
22544
+ const baseClass = typeof options?.baseClass === "string" && options.baseClass.trim() ? options.baseClass : "rb-heading-decoration";
22545
+ const decoration = asPartialObject(value);
22546
+ const family = isHeadingDecorationFamily(decoration?.family) ? decoration.family : null;
22547
+ const allowedFamily = isHeadingDecorationFamily(options?.family) ? options.family : null;
22548
+ const placement = isHeadingDecorationPlacement(decoration?.placement) ? decoration.placement : null;
22549
+ const colorToken = isHeadingDecorationColorToken(decoration?.colorToken) ? decoration.colorToken : "primary";
22550
+ if (!family || !placement) return "rb-hidden";
22551
+ if (allowedFamily && family !== allowedFamily) return "rb-hidden";
22552
+ return joinClasses3([
22553
+ baseClass,
22554
+ `rb-heading-decoration-${family}`,
22555
+ `rb-heading-decoration-placement-${placement}`,
22556
+ `rb-heading-decoration-color-${colorToken}`
22557
+ ]);
22558
+ }
21774
22559
  }
21775
22560
  ];
21776
22561
 
21777
22562
  // ../blocks/src/system/transforms/registry/layout.ts
21778
22563
  import { z as z34 } from "zod";
22564
+
22565
+ // ../theme-core/src/siteChromePlacement.ts
22566
+ var HEADER_POSITIONINGS = ["static", "sticky", "fixed"];
22567
+ function parseHeaderPositioning(value) {
22568
+ return isHeaderPositioning(value) ? value : "static";
22569
+ }
22570
+ function isHeaderPositioning(value) {
22571
+ return typeof value === "string" && HEADER_POSITIONINGS.includes(value);
22572
+ }
22573
+ function planSiteChromePlacement(positioning) {
22574
+ switch (positioning) {
22575
+ case "static":
22576
+ return {
22577
+ kind: "static",
22578
+ headerRootClassName: null,
22579
+ standaloneShellClassName: null
22580
+ };
22581
+ case "sticky":
22582
+ return {
22583
+ kind: "sticky",
22584
+ headerRootClassName: "rb-sticky rb-top-0",
22585
+ standaloneShellClassName: "sticky top-0 z-40 w-full"
22586
+ };
22587
+ case "fixed":
22588
+ return {
22589
+ kind: "fixed",
22590
+ headerRootClassName: "rb-fixed rb-top-0 rb-left-0 rb-right-0",
22591
+ standaloneShellClassName: "fixed left-0 right-0 top-0 z-40 w-full"
22592
+ };
22593
+ default:
22594
+ return assertNever(positioning);
22595
+ }
22596
+ }
22597
+
22598
+ // ../blocks/src/system/transforms/registry/layout.ts
21779
22599
  var joinClasses4 = (parts) => parts.filter(
21780
22600
  (part) => typeof part === "string" && part.trim().length > 0
21781
22601
  ).join(" ").replace(/\s+/g, " ").trim();
@@ -21891,7 +22711,8 @@ var headerRootClassTransform = {
21891
22711
  ...options
21892
22712
  };
21893
22713
  const content = asPartialObject(value) ?? {};
21894
- const positioning = typeof content.positioning === "string" ? content.positioning : "static";
22714
+ const positioning = parseHeaderPositioning(content.positioning);
22715
+ const placement = planSiteChromePlacement(positioning);
21895
22716
  const shrinkOnScroll = Boolean(content.shrinkOnScroll);
21896
22717
  const header = asPartialObject(value);
21897
22718
  const visuals = resolveHeaderVisualStyles(header, context.theme);
@@ -21903,14 +22724,14 @@ var headerRootClassTransform = {
21903
22724
  if (config.blur) classes.push(config.blur);
21904
22725
  if (config.blurSupport) classes.push(config.blurSupport);
21905
22726
  }
21906
- if (positioning === "sticky") {
22727
+ if (placement.kind === "sticky") {
21907
22728
  classes.push(
21908
22729
  visuals.isTransparent ? config.stickyTransparent : config.sticky
21909
22730
  );
21910
- } else if (positioning === "fixed") {
22731
+ } else if (placement.kind === "fixed") {
21911
22732
  classes.push(config.fixed);
21912
22733
  }
21913
- if (shrinkOnScroll && (positioning === "sticky" || positioning === "fixed")) {
22734
+ if (shrinkOnScroll && placement.kind !== "static") {
21914
22735
  classes.push(config.shrink);
21915
22736
  }
21916
22737
  const VALID_VARIANTS = [
@@ -22445,6 +23266,10 @@ function desktopOnlyDisplay(display) {
22445
23266
  return `rb-hidden ${LARGE_DISPLAY_CLASSES[display]}`;
22446
23267
  }
22447
23268
 
23269
+ // ../theme-core/src/siteChromeOverlayClearance.ts
23270
+ var SITE_CHROME_VISIBLE_HEADER_ATTR = "data-site-chrome-visible-header";
23271
+ var SITE_CHROME_VISIBLE_HEADER_SELECTOR = `[${SITE_CHROME_VISIBLE_HEADER_ATTR}="true"]`;
23272
+
22448
23273
  // ../blocks/src/system/blocks/site-header.ts
22449
23274
  var logoRow = link(
22450
23275
  {
@@ -22717,6 +23542,7 @@ var transparentLayout = inline(
22717
23542
  );
22718
23543
  var floatingLayout = inline(
22719
23544
  {
23545
+ [SITE_CHROME_VISIBLE_HEADER_ATTR]: "true",
22720
23546
  className: bindProp("$root.theme.header.maxWidth", {
22721
23547
  transforms: pipe(
22722
23548
  tx("layout.maxWidthClass", {
@@ -23662,6 +24488,10 @@ var sectionHeading = stack(
23662
24488
  when("content.title"),
23663
24489
  bind("content.title")
23664
24490
  ),
24491
+ headingDecoration({
24492
+ family: "short-center-rule",
24493
+ placement: "under-centered-heading"
24494
+ }),
23665
24495
  richText(
23666
24496
  {
23667
24497
  className: "rb-feature-cards-description rb-prose rb-mx-auto rb-max-w-none",
@@ -24843,8 +25673,8 @@ var eventSurfaceScopeValues = [
24843
25673
  "custom"
24844
25674
  ];
24845
25675
  var eventScheduleScopeValues = ["any", "recurring", "oneOff"];
24846
- var asEventCategoryId = (value) => value;
24847
- var asVenueId = (value) => value;
25676
+ var unsafeAsEventCategoryId = (value) => value;
25677
+ var unsafeAsVenueId = (value) => value;
24848
25678
  function normalizeEventBlockKind(value) {
24849
25679
  return value === "courses" || value === "events" ? value : "all";
24850
25680
  }
@@ -24870,10 +25700,10 @@ function normalizeEventCategoryIds(value) {
24870
25700
  if (Array.isArray(value)) {
24871
25701
  return normalizeIdList(
24872
25702
  value.filter((entry) => typeof entry === "string")
24873
- ).map(asEventCategoryId);
25703
+ ).map(unsafeAsEventCategoryId);
24874
25704
  }
24875
25705
  if (typeof value === "string") {
24876
- return normalizeIdList(value.split(",")).map(asEventCategoryId);
25706
+ return normalizeIdList(value.split(",")).map(unsafeAsEventCategoryId);
24877
25707
  }
24878
25708
  return [];
24879
25709
  }
@@ -24886,7 +25716,7 @@ function normalizeEventVenueId(value) {
24886
25716
  return null;
24887
25717
  }
24888
25718
  const trimmed = value.trim();
24889
- return trimmed ? asVenueId(trimmed) : null;
25719
+ return trimmed ? unsafeAsVenueId(trimmed) : null;
24890
25720
  }
24891
25721
  function normalizeEventStaffMemberId(value) {
24892
25722
  if (typeof value !== "string") {
@@ -26085,7 +26915,7 @@ var COLUMN_CLASSES = {
26085
26915
  };
26086
26916
  function getContainerClass(layout, columns) {
26087
26917
  if (layout === "compact") {
26088
- return "event-listing-compact-container rb-flex rb-flex-col rb-gap-2";
26918
+ return "event-listing-compact-container rb-flex rb-flex-col";
26089
26919
  }
26090
26920
  if (layout === "stack") {
26091
26921
  return "rb-flex rb-flex-col rb-gap-6";
@@ -28913,6 +29743,7 @@ import { z as z53 } from "zod";
28913
29743
  var storedProductCartItemSchema = z53.object({
28914
29744
  kind: z53.literal("product"),
28915
29745
  productId: z53.string().min(1),
29746
+ productCategoryId: z53.string().min(1).optional().nullable(),
28916
29747
  variantId: z53.string().min(1).optional().nullable(),
28917
29748
  title: z53.string().min(1),
28918
29749
  variantTitle: z53.string().optional().nullable(),
@@ -31417,6 +32248,10 @@ var scheduleTileTreatments = [
31417
32248
  "quiet",
31418
32249
  "brand-depth"
31419
32250
  ];
32251
+ var eventListTreatments = [
32252
+ "plain",
32253
+ "lined-panel"
32254
+ ];
31420
32255
  function scheduleDetailsCapable() {
31421
32256
  return declareBlockDesignCapability({
31422
32257
  sectionSurfaces: "supported",
@@ -31425,6 +32260,14 @@ function scheduleDetailsCapable() {
31425
32260
  tileTreatments: scheduleTileTreatments
31426
32261
  });
31427
32262
  }
32263
+ function eventListCapable() {
32264
+ return declareBlockDesignCapability({
32265
+ sectionSurfaces: "supported",
32266
+ contentFrames: ["plain"],
32267
+ itemSurfaces: "unsupported",
32268
+ eventListTreatments
32269
+ });
32270
+ }
31428
32271
  function defaultBoundaryBias(visualWeight) {
31429
32272
  return visualWeight === "featured" || visualWeight === "immersive" ? "clear" : "soft";
31430
32273
  }
@@ -31644,7 +32487,8 @@ var systemBlockDefinitionsRaw = [
31644
32487
  flow: bodyFlow,
31645
32488
  layoutProfiles: [
31646
32489
  layoutProfile({ variantKey: "default", family: "stack", weight: "standard" }),
31647
- layoutProfile({ variantKey: "two-column", family: "split", weight: "standard" })
32490
+ layoutProfile({ variantKey: "two-column", family: "split", weight: "standard" }),
32491
+ layoutProfile({ variantKey: "question-columns", family: "grid", weight: "standard" })
31648
32492
  ]
31649
32493
  })),
31650
32494
  withDesignCapability("block.site-header", siteHeaderBlockDefinition, declareNoBlockDesignCapability("site-chrome"), defineBlockDesignMetadata({
@@ -31738,11 +32582,11 @@ var systemBlockDefinitionsRaw = [
31738
32582
  flow: offeringsFlow,
31739
32583
  layoutProfiles: [layoutProfile({ variantKey: "default", family: "centered", weight: "featured" })]
31740
32584
  })),
31741
- withDesignCapability("block.event-listing", eventListingBlockDefinition, sectionOnly(), defineBlockDesignMetadata({
32585
+ withDesignCapability("block.event-listing", eventListingBlockDefinition, eventListCapable(), defineBlockDesignMetadata({
31742
32586
  flow: offeringsFlow,
31743
32587
  layoutProfiles: [layoutProfile({ variantKey: "default", family: "stack", weight: "standard" })]
31744
32588
  })),
31745
- withDesignCapability("block.event-calendar", eventCalendarBlockDefinition, sectionOnly(), defineBlockDesignMetadata({
32589
+ withDesignCapability("block.event-calendar", eventCalendarBlockDefinition, eventListCapable(), defineBlockDesignMetadata({
31746
32590
  flow: offeringsFlow,
31747
32591
  layoutProfiles: [
31748
32592
  layoutProfile({ variantKey: "combined", family: "grid", weight: "standard" }),
@@ -32874,6 +33718,15 @@ ${root} {
32874
33718
  `;
32875
33719
  }
32876
33720
 
33721
+ // ../theme-core/src/runtime/themeCssVarNames.ts
33722
+ var THEME_RADIUS_CSS_VARS = {
33723
+ block: "--rb-block-radius",
33724
+ button: "--rb-button-radius",
33725
+ input: "--rb-input-radius",
33726
+ legacyCard: "--radius-card",
33727
+ legacyControl: "--radius-control"
33728
+ };
33729
+
32877
33730
  // ../theme-core/src/blocks/vars/customer-portal.ts
32878
33731
  function generateCustomerPortalVars({
32879
33732
  themeId
@@ -32887,6 +33740,11 @@ ${root} {
32887
33740
  --cp-muted: rgb(var(--tb-mutedText));
32888
33741
  --cp-border: rgb(var(--tb-border));
32889
33742
  --cp-shadow: var(--shadow-elev);
33743
+ --cp-primary: rgb(var(--tb-primary));
33744
+ --cp-primary-hover: rgb(var(--tb-primary-700, var(--tb-primary)));
33745
+ --cp-error: rgb(var(--tb-destructive));
33746
+ --cp-card-radius: var(${THEME_RADIUS_CSS_VARS.block}, var(${THEME_RADIUS_CSS_VARS.legacyCard}, 0.75rem));
33747
+ --cp-control-radius: var(${THEME_RADIUS_CSS_VARS.input}, var(${THEME_RADIUS_CSS_VARS.legacyControl}, 0.5rem));
32890
33748
 
32891
33749
  /* Shared tab bar (underline style) */
32892
33750
  --rb-tab-border-width: 1px;
@@ -32937,7 +33795,7 @@ ${root} {
32937
33795
  --rb-modal-bg: var(--cp-card-bg);
32938
33796
  --rb-modal-border: var(--cp-card-border);
32939
33797
  --rb-modal-shadow: var(--shadow-lg, var(--shadow-elev));
32940
- --rb-modal-radius: var(--radius-card);
33798
+ --rb-modal-radius: var(--cp-card-radius);
32941
33799
  --rb-modal-max-width: 560px;
32942
33800
 
32943
33801
  /* Header */
@@ -34318,6 +35176,9 @@ import { jsx as jsx5 } from "react/jsx-runtime";
34318
35176
  import * as React from "react";
34319
35177
  import { Fragment, jsx as jsx6, jsxs as jsxs4 } from "react/jsx-runtime";
34320
35178
 
35179
+ // ../theme-core/src/fonts/uploadFormat.ts
35180
+ var MAX_FONT_UPLOAD_BYTES = 5 * 1024 * 1024;
35181
+
34321
35182
  // ../theme-core/src/runtime/buildThemeRuntimeFromBridge.ts
34322
35183
  import { z as z61 } from "zod";
34323
35184
  var themeBridgeConfigSchema = z61.object({
@@ -34514,11 +35375,11 @@ function normalizeContent(block) {
34514
35375
  }
34515
35376
  function normalizeParams(input) {
34516
35377
  if (!input || typeof input !== "object") return {};
34517
- const entries = Object.entries(input).map(([key, value]) => [
34518
- key,
34519
- coerceToString(value)
34520
- ]);
34521
- return Object.fromEntries(entries);
35378
+ const output = {};
35379
+ for (const [key, value] of Object.entries(input)) {
35380
+ output[key] = coerceToString(value);
35381
+ }
35382
+ return output;
34522
35383
  }
34523
35384
  function isNonArrayObject(value) {
34524
35385
  return typeof value === "object" && value !== null && !Array.isArray(value);
@@ -34734,10 +35595,16 @@ var dashboardConfigSchema = z62.object({
34734
35595
  var fieldDefinitionInputSchema = unsafeRetypeZodSchema(fieldSchema);
34735
35596
  var nodeDefinitionSchema = unsafeRetypeZodSchema(NodeSchema);
34736
35597
  var sdkLoaderEndpointSchema = z62.enum(SUPPORTED_LOADER_ENDPOINTS);
35598
+ var loaderFallbackScalarSchema = z62.union([
35599
+ z62.string(),
35600
+ z62.number(),
35601
+ z62.boolean(),
35602
+ z62.null()
35603
+ ]);
34737
35604
  var loaderParamBindingSchema = z62.object({
34738
35605
  $bind: z62.object({
34739
35606
  from: z62.string().min(1, "Binding path is required"),
34740
- fallback: z62.string().optional()
35607
+ fallback: loaderFallbackScalarSchema.optional()
34741
35608
  })
34742
35609
  });
34743
35610
  var loaderParamValueSchema = z62.union([
@@ -34883,9 +35750,13 @@ var sdkBlockFieldOptionsMapSchema = z62.record(
34883
35750
  var sdkContentTypeTemplateConfigSchema = z62.object({
34884
35751
  blocks: z62.array(z62.unknown())
34885
35752
  }).passthrough();
35753
+ var sdkContentTypeOrderingConfigSchema = z62.object({
35754
+ mode: z62.enum(["default", "manual"]).optional()
35755
+ }).optional();
34886
35756
  var sdkContentTypeConfigSchema = z62.object({
34887
35757
  key: z62.string().min(1),
34888
35758
  fields: z62.array(z62.unknown()),
35759
+ ordering: sdkContentTypeOrderingConfigSchema,
34889
35760
  template: sdkContentTypeTemplateConfigSchema.nullable().optional()
34890
35761
  }).passthrough();
34891
35762
  var sdkContentConfigSchema = z62.object({
@@ -35091,6 +35962,7 @@ var COURSE_ENROLLMENT_REFUND_FAILED_CODES = [
35091
35962
  ];
35092
35963
 
35093
35964
  // ../api/src/bookingVerticals.ts
35965
+ import { z as z64 } from "zod";
35094
35966
  var VERTICAL_IDS = [
35095
35967
  "yoga_wellness",
35096
35968
  "fitness_pt",
@@ -35169,6 +36041,132 @@ var VERTICAL_ID_SET = new Set(VERTICAL_IDS);
35169
36041
  var VERTICAL_PRESET_ID_SET = new Set(
35170
36042
  VERTICAL_BOOKING_PRESETS.map((presetDefinition) => presetDefinition.id)
35171
36043
  );
36044
+ function parseVerticalId(value) {
36045
+ return typeof value === "string" && VERTICAL_ID_SET.has(value) ? value : null;
36046
+ }
36047
+ function parseVerticalPresetId(value) {
36048
+ return typeof value === "string" && VERTICAL_PRESET_ID_SET.has(value) ? value : null;
36049
+ }
36050
+ function getVerticalPresetDefinition(presetId) {
36051
+ const definition = VERTICAL_BOOKING_PRESETS.find((presetDefinition) => presetDefinition.id === presetId);
36052
+ if (!definition) {
36053
+ throw new Error(`Unhandled vertical preset id: ${presetId}`);
36054
+ }
36055
+ return definition;
36056
+ }
36057
+ function toNonEmptyVerticalPresetIds(presetIds) {
36058
+ const firstPresetId = presetIds[0];
36059
+ return firstPresetId ? [firstPresetId, ...presetIds.slice(1)] : null;
36060
+ }
36061
+ function createConfiguredSiteVerticalBookingConfig(verticalId, selectedPresetIds) {
36062
+ return {
36063
+ verticalId,
36064
+ selectedPresetIds
36065
+ };
36066
+ }
36067
+ function createSiteVerticalBookingConfig(verticalId, selectedPresetIds) {
36068
+ const nonEmptyPresetIds = toNonEmptyVerticalPresetIds(selectedPresetIds);
36069
+ return nonEmptyPresetIds ? createConfiguredSiteVerticalBookingConfig(verticalId, nonEmptyPresetIds) : null;
36070
+ }
36071
+ function resolveSiteVerticalBookingConfig(rawConfig) {
36072
+ if (!rawConfig) {
36073
+ return { kind: "unconfigured", config: DEFAULT_SITE_VERTICAL_BOOKING_CONFIG };
36074
+ }
36075
+ const verticalId = parseVerticalId(rawConfig.verticalId);
36076
+ const rawPresetIds = Array.isArray(rawConfig.selectedPresetIds) ? rawConfig.selectedPresetIds : [];
36077
+ const selectedPresetIds = rawPresetIds.map(parseVerticalPresetId).filter((presetId) => Boolean(presetId));
36078
+ const config = {
36079
+ verticalId,
36080
+ selectedPresetIds
36081
+ };
36082
+ if (!verticalId && selectedPresetIds.length === 0) {
36083
+ return { kind: "unconfigured", config: DEFAULT_SITE_VERTICAL_BOOKING_CONFIG };
36084
+ }
36085
+ const issues = getSiteVerticalConfigIssues(rawConfig, config);
36086
+ if (issues.length > 0) {
36087
+ return { kind: "invalid", config, issues };
36088
+ }
36089
+ const configuredConfig = verticalId ? createSiteVerticalBookingConfig(verticalId, selectedPresetIds) : null;
36090
+ if (!configuredConfig) {
36091
+ return { kind: "invalid", config, issues: ["empty_selected_presets"] };
36092
+ }
36093
+ return {
36094
+ kind: "configured",
36095
+ config: configuredConfig,
36096
+ selectedPresets: configuredConfig.selectedPresetIds.map(getVerticalPresetDefinition)
36097
+ };
36098
+ }
36099
+ function getSiteVerticalConfigIssues(rawConfig, config) {
36100
+ const issues = /* @__PURE__ */ new Set();
36101
+ if (rawConfig.verticalId != null && !config.verticalId) {
36102
+ issues.add("unknown_vertical");
36103
+ }
36104
+ if (!config.verticalId && config.selectedPresetIds.length > 0) {
36105
+ issues.add("missing_vertical");
36106
+ }
36107
+ const rawPresetIds = Array.isArray(rawConfig.selectedPresetIds) ? rawConfig.selectedPresetIds : [];
36108
+ if (rawPresetIds.some((presetId) => parseVerticalPresetId(presetId) === null)) {
36109
+ issues.add("unknown_preset");
36110
+ }
36111
+ if (config.verticalId && config.selectedPresetIds.length === 0) {
36112
+ issues.add("empty_selected_presets");
36113
+ }
36114
+ const seenBehaviours = /* @__PURE__ */ new Set();
36115
+ for (const presetId of config.selectedPresetIds) {
36116
+ const presetDefinition = getVerticalPresetDefinition(presetId);
36117
+ if (config.verticalId && presetDefinition.verticalId !== config.verticalId) {
36118
+ issues.add("preset_vertical_mismatch");
36119
+ }
36120
+ if (presetDefinition.availability === "future") {
36121
+ issues.add("future_preset_selected");
36122
+ }
36123
+ if (seenBehaviours.has(presetDefinition.canonicalBehaviour)) {
36124
+ issues.add("duplicate_canonical_behaviour");
36125
+ }
36126
+ seenBehaviours.add(presetDefinition.canonicalBehaviour);
36127
+ }
36128
+ return [...issues];
36129
+ }
36130
+ var VerticalIdSchema = z64.string().trim().transform((value, ctx) => {
36131
+ const parsed = parseVerticalId(value);
36132
+ if (!parsed) {
36133
+ ctx.addIssue({
36134
+ code: z64.ZodIssueCode.custom,
36135
+ message: "Unknown booking vertical"
36136
+ });
36137
+ return z64.NEVER;
36138
+ }
36139
+ return parsed;
36140
+ });
36141
+ var VerticalPresetIdSchema = z64.string().trim().transform((value, ctx) => {
36142
+ const parsed = parseVerticalPresetId(value);
36143
+ if (!parsed) {
36144
+ ctx.addIssue({
36145
+ code: z64.ZodIssueCode.custom,
36146
+ message: "Unknown booking preset"
36147
+ });
36148
+ return z64.NEVER;
36149
+ }
36150
+ return parsed;
36151
+ });
36152
+ var BookingVerticalConfigSchema = z64.object({
36153
+ verticalId: VerticalIdSchema.nullable(),
36154
+ selectedPresetIds: z64.array(VerticalPresetIdSchema).max(20)
36155
+ }).transform((value, ctx) => {
36156
+ const resolved = resolveSiteVerticalBookingConfig(value);
36157
+ if (resolved.kind === "invalid") {
36158
+ ctx.addIssue({
36159
+ code: z64.ZodIssueCode.custom,
36160
+ message: `Invalid booking vertical config: ${resolved.issues.join(", ")}`
36161
+ });
36162
+ return z64.NEVER;
36163
+ }
36164
+ return resolved.config;
36165
+ });
36166
+ var DEFAULT_SITE_VERTICAL_BOOKING_CONFIG = {
36167
+ verticalId: null,
36168
+ selectedPresetIds: []
36169
+ };
35172
36170
  function preset(id, verticalId, canonicalBehaviour, label, pluralLabel, description, availability = "onboarding") {
35173
36171
  return {
35174
36172
  id,
@@ -35188,51 +36186,51 @@ function isRecord3(value) {
35188
36186
  }
35189
36187
 
35190
36188
  // ../api/src/appointmentSetup.ts
35191
- import { z as z64 } from "zod";
36189
+ import { z as z65 } from "zod";
35192
36190
  var APPOINTMENT_SETUP_MAX_MINUTES = 1440;
35193
- var appointmentSetupRefSchema = z64.discriminatedUnion("kind", [
35194
- z64.object({ kind: z64.literal("existing"), id: z64.string().min(1) }),
35195
- z64.object({ kind: z64.literal("new"), draftId: z64.string().min(1) })
36191
+ var appointmentSetupRefSchema = z65.discriminatedUnion("kind", [
36192
+ z65.object({ kind: z65.literal("existing"), id: z65.string().min(1) }),
36193
+ z65.object({ kind: z65.literal("new"), draftId: z65.string().min(1) })
35196
36194
  ]);
35197
- var appointmentSetupVenueChoiceSchema = z64.discriminatedUnion("kind", [
35198
- z64.object({ kind: z64.literal("none") }),
35199
- z64.object({ kind: z64.literal("existing"), venueId: z64.string().min(1) }),
35200
- z64.object({
35201
- kind: z64.literal("create"),
35202
- draftId: z64.string().min(1),
35203
- title: z64.string().trim().min(1),
35204
- description: z64.string().nullable(),
35205
- timezone: z64.string().trim().min(1).nullable(),
35206
- addressJson: z64.record(z64.string(), z64.unknown()),
35207
- locationJson: z64.object({ lat: z64.number(), lng: z64.number() }).nullable()
36195
+ var appointmentSetupVenueChoiceSchema = z65.discriminatedUnion("kind", [
36196
+ z65.object({ kind: z65.literal("none") }),
36197
+ z65.object({ kind: z65.literal("existing"), venueId: z65.string().min(1) }),
36198
+ z65.object({
36199
+ kind: z65.literal("create"),
36200
+ draftId: z65.string().min(1),
36201
+ title: z65.string().trim().min(1),
36202
+ description: z65.string().nullable(),
36203
+ timezone: z65.string().trim().min(1).nullable(),
36204
+ addressJson: z65.record(z65.string(), z65.unknown()),
36205
+ locationJson: z65.object({ lat: z65.number(), lng: z65.number() }).nullable()
35208
36206
  })
35209
36207
  ]);
35210
- var appointmentSetupPaymentDraftSchema = z64.object({
35211
- priceType: z64.union([z64.literal("free"), z64.literal("paid")])
35212
- });
35213
- var appointmentSetupServiceAssignmentDraftSchema = z64.discriminatedUnion("kind", [
35214
- z64.object({ kind: z64.literal("all_practitioners") }),
35215
- z64.object({
35216
- kind: z64.literal("selected_practitioners"),
35217
- resourceRefs: z64.array(appointmentSetupRefSchema)
36208
+ var appointmentSetupPaymentDraftSchema = z65.object({
36209
+ priceType: z65.union([z65.literal("free"), z65.literal("paid")])
36210
+ });
36211
+ var appointmentSetupServiceAssignmentDraftSchema = z65.discriminatedUnion("kind", [
36212
+ z65.object({ kind: z65.literal("all_practitioners") }),
36213
+ z65.object({
36214
+ kind: z65.literal("selected_practitioners"),
36215
+ resourceRefs: z65.array(appointmentSetupRefSchema)
35218
36216
  })
35219
36217
  ]);
35220
- var appointmentSetupServiceDraftSchema = z64.object({
36218
+ var appointmentSetupServiceDraftSchema = z65.object({
35221
36219
  ref: appointmentSetupRefSchema,
35222
- title: z64.string().trim().min(1),
35223
- description: z64.string().nullable(),
35224
- durationMinutes: z64.number().int().positive().max(APPOINTMENT_SETUP_MAX_MINUTES),
35225
- prepMinutes: z64.number().int().nonnegative().max(APPOINTMENT_SETUP_MAX_MINUTES).default(0),
35226
- cleanupMinutes: z64.number().int().nonnegative().max(APPOINTMENT_SETUP_MAX_MINUTES).default(0),
35227
- priceAmount: z64.number().int().nonnegative().nullable(),
35228
- isActive: z64.boolean(),
35229
- locationType: z64.union([
35230
- z64.literal("virtual"),
35231
- z64.literal("in_person"),
35232
- z64.literal("hybrid")
36220
+ title: z65.string().trim().min(1),
36221
+ description: z65.string().nullable(),
36222
+ durationMinutes: z65.number().int().positive().max(APPOINTMENT_SETUP_MAX_MINUTES),
36223
+ prepMinutes: z65.number().int().nonnegative().max(APPOINTMENT_SETUP_MAX_MINUTES).default(0),
36224
+ cleanupMinutes: z65.number().int().nonnegative().max(APPOINTMENT_SETUP_MAX_MINUTES).default(0),
36225
+ priceAmount: z65.number().int().nonnegative().nullable(),
36226
+ isActive: z65.boolean(),
36227
+ locationType: z65.union([
36228
+ z65.literal("virtual"),
36229
+ z65.literal("in_person"),
36230
+ z65.literal("hybrid")
35233
36231
  ]),
35234
36232
  venue: appointmentSetupVenueChoiceSchema,
35235
- timezone: z64.string().trim().min(1).nullable(),
36233
+ timezone: z65.string().trim().min(1).nullable(),
35236
36234
  payment: appointmentSetupPaymentDraftSchema,
35237
36235
  assignment: appointmentSetupServiceAssignmentDraftSchema
35238
36236
  }).superRefine((service, ctx) => {
@@ -35251,49 +36249,49 @@ var appointmentSetupServiceDraftSchema = z64.object({
35251
36249
  });
35252
36250
  }
35253
36251
  });
35254
- var appointmentSetupPractitionerDraftSchema = z64.object({
36252
+ var appointmentSetupPractitionerDraftSchema = z65.object({
35255
36253
  ref: appointmentSetupRefSchema,
35256
- displayName: z64.string().trim().min(1),
35257
- bio: z64.string().nullable(),
35258
- timezone: z64.string().trim().min(1),
35259
- colorHex: z64.string().nullable()
35260
- });
35261
- var appointmentSetupWeeklyWindowDraftSchema = z64.object({
35262
- weekday: z64.number().int().min(0).max(6),
35263
- startTime: z64.string(),
35264
- endTime: z64.string()
35265
- });
35266
- var appointmentSetupStartTimePolicyDraftSchema = z64.discriminatedUnion("kind", [
35267
- z64.object({ kind: z64.literal("automatic_spacing") }),
35268
- z64.object({
35269
- kind: z64.literal("regular_interval"),
35270
- intervalMinutes: z64.union([
35271
- z64.literal(10),
35272
- z64.literal(15),
35273
- z64.literal(20),
35274
- z64.literal(30),
35275
- z64.literal(45),
35276
- z64.literal(60)
36254
+ displayName: z65.string().trim().min(1),
36255
+ bio: z65.string().nullable(),
36256
+ timezone: z65.string().trim().min(1),
36257
+ colorHex: z65.string().nullable()
36258
+ });
36259
+ var appointmentSetupWeeklyWindowDraftSchema = z65.object({
36260
+ weekday: z65.number().int().min(0).max(6),
36261
+ startTime: z65.string(),
36262
+ endTime: z65.string()
36263
+ });
36264
+ var appointmentSetupStartTimePolicyDraftSchema = z65.discriminatedUnion("kind", [
36265
+ z65.object({ kind: z65.literal("automatic_spacing") }),
36266
+ z65.object({
36267
+ kind: z65.literal("regular_interval"),
36268
+ intervalMinutes: z65.union([
36269
+ z65.literal(10),
36270
+ z65.literal(15),
36271
+ z65.literal(20),
36272
+ z65.literal(30),
36273
+ z65.literal(45),
36274
+ z65.literal(60)
35277
36275
  ])
35278
36276
  })
35279
36277
  ]);
35280
- var appointmentSetupAvailabilityDraftSchema = z64.object({
35281
- kind: z64.literal("weekly_windows"),
36278
+ var appointmentSetupAvailabilityDraftSchema = z65.object({
36279
+ kind: z65.literal("weekly_windows"),
35282
36280
  resourceRef: appointmentSetupRefSchema,
35283
36281
  serviceRef: appointmentSetupRefSchema.nullable(),
35284
- windows: z64.array(appointmentSetupWeeklyWindowDraftSchema),
36282
+ windows: z65.array(appointmentSetupWeeklyWindowDraftSchema),
35285
36283
  startTimePolicy: appointmentSetupStartTimePolicyDraftSchema.optional()
35286
36284
  });
35287
36285
  var APPOINTMENT_DEFAULT_MIN_LEAD_MINUTES_MAX = 28 * 24 * 60;
35288
36286
  var APPOINTMENT_DEFAULT_MAX_BOOKING_NOTICE_MINUTES_MAX = 10 * 365 * 24 * 60;
35289
- var appointmentSetupBookingNoticeSchema = z64.object({
35290
- minLeadMinutes: z64.number().int().nonnegative().max(APPOINTMENT_DEFAULT_MIN_LEAD_MINUTES_MAX),
35291
- maxBookingNoticeMinutes: z64.number().int().nonnegative().max(APPOINTMENT_DEFAULT_MAX_BOOKING_NOTICE_MINUTES_MAX)
35292
- });
35293
- var applyAppointmentSetupRequestSchema = z64.object({
35294
- services: z64.array(appointmentSetupServiceDraftSchema),
35295
- practitioners: z64.array(appointmentSetupPractitionerDraftSchema),
35296
- availability: z64.array(appointmentSetupAvailabilityDraftSchema),
36287
+ var appointmentSetupBookingNoticeSchema = z65.object({
36288
+ minLeadMinutes: z65.number().int().nonnegative().max(APPOINTMENT_DEFAULT_MIN_LEAD_MINUTES_MAX),
36289
+ maxBookingNoticeMinutes: z65.number().int().nonnegative().max(APPOINTMENT_DEFAULT_MAX_BOOKING_NOTICE_MINUTES_MAX)
36290
+ });
36291
+ var applyAppointmentSetupRequestSchema = z65.object({
36292
+ services: z65.array(appointmentSetupServiceDraftSchema),
36293
+ practitioners: z65.array(appointmentSetupPractitionerDraftSchema),
36294
+ availability: z65.array(appointmentSetupAvailabilityDraftSchema),
35297
36295
  bookingNotice: appointmentSetupBookingNoticeSchema
35298
36296
  });
35299
36297
 
@@ -35326,24 +36324,24 @@ var STAFF_CANCELLATION_CONTEXT_CATEGORIES = [
35326
36324
  ];
35327
36325
 
35328
36326
  // ../api/src/siteBanner.ts
35329
- import { z as z65 } from "zod";
36327
+ import { z as z66 } from "zod";
35330
36328
  var SITE_BANNER_SCOPE_VALUES = ["homepage", "all-pages"];
35331
36329
  var SITE_BANNER_TONE_VALUES = ["announcement", "promotion", "notice", "warning"];
35332
36330
  var SITE_BANNER_MAX_TEXT_LENGTH = 320;
35333
36331
  var SITE_BANNER_MAX_PARAGRAPHS = 2;
35334
- var siteBannerScopeSchema = z65.enum(SITE_BANNER_SCOPE_VALUES);
35335
- var siteBannerToneSchema = z65.enum(SITE_BANNER_TONE_VALUES);
35336
- var siteBannerBodySchema = z65.unknown().transform(unwrapRichTextValue);
35337
- var siteBannerCtaSchema = z65.object({
35338
- label: z65.string().trim().min(1),
36332
+ var siteBannerScopeSchema = z66.enum(SITE_BANNER_SCOPE_VALUES);
36333
+ var siteBannerToneSchema = z66.enum(SITE_BANNER_TONE_VALUES);
36334
+ var siteBannerBodySchema = z66.unknown().transform(unwrapRichTextValue);
36335
+ var siteBannerCtaSchema = z66.object({
36336
+ label: z66.string().trim().min(1),
35339
36337
  link: linkPayloadSchema
35340
36338
  });
35341
- var siteBannerSettingsSchema = z65.discriminatedUnion("enabled", [
35342
- z65.object({
35343
- enabled: z65.literal(false)
36339
+ var siteBannerSettingsSchema = z66.discriminatedUnion("enabled", [
36340
+ z66.object({
36341
+ enabled: z66.literal(false)
35344
36342
  }),
35345
- z65.object({
35346
- enabled: z65.literal(true),
36343
+ z66.object({
36344
+ enabled: z66.literal(true),
35347
36345
  scope: siteBannerScopeSchema,
35348
36346
  tone: siteBannerToneSchema,
35349
36347
  body: siteBannerBodySchema,
@@ -35357,7 +36355,7 @@ var siteBannerSettingsInputSchema = siteBannerSettingsSchema.superRefine((value,
35357
36355
  const analysis = analyzeSiteBannerBody(value.body);
35358
36356
  for (const issue of analysis.issues) {
35359
36357
  ctx.addIssue({
35360
- code: z65.ZodIssueCode.custom,
36358
+ code: z66.ZodIssueCode.custom,
35361
36359
  path: ["body"],
35362
36360
  message: siteBannerBodyIssueMessage(issue)
35363
36361
  });
@@ -35545,72 +36543,105 @@ function collectText(node) {
35545
36543
  return (node.content ?? []).map(collectText).join("");
35546
36544
  }
35547
36545
 
36546
+ // ../api/src/navigation/dashboardSiteNav.ts
36547
+ var hiddenDemoSiteNavSurfaceIds = [
36548
+ "site.newsletter"
36549
+ ];
36550
+ var hiddenDemoSiteNavIds = new Set(
36551
+ hiddenDemoSiteNavSurfaceIds
36552
+ );
36553
+ var websiteSurfaceIds = [
36554
+ "site.content",
36555
+ "site.footerBlocks",
36556
+ "site.navigation",
36557
+ "site.media",
36558
+ "site.style",
36559
+ "site.performance"
36560
+ ];
36561
+ var websiteSurfaceIdSet = new Set(
36562
+ websiteSurfaceIds
36563
+ );
36564
+
36565
+ // ../api/src/navigation/dashboardSettingsNav.ts
36566
+ var hiddenDemoSettingsNavSurfaceIds = [
36567
+ "settings.features",
36568
+ "settings.domains",
36569
+ "settings.bookings",
36570
+ "settings.emails",
36571
+ "settings.team",
36572
+ "settings.billing",
36573
+ "settings.developer",
36574
+ "settings.apiKeys",
36575
+ "settings.backup"
36576
+ ];
36577
+ var hiddenDemoSettingsNavIds = new Set(hiddenDemoSettingsNavSurfaceIds);
36578
+
35548
36579
  // ../api/src/aiPlayground.ts
35549
- import { z as z66 } from "zod";
35550
- var Rfc6902PatchOp = z66.discriminatedUnion("op", [
36580
+ import { z as z67 } from "zod";
36581
+ var Rfc6902PatchOp = z67.discriminatedUnion("op", [
35551
36582
  // Standard RFC-6902 operations
35552
- z66.object({
35553
- op: z66.literal("add"),
35554
- path: z66.string(),
35555
- value: z66.unknown()
36583
+ z67.object({
36584
+ op: z67.literal("add"),
36585
+ path: z67.string(),
36586
+ value: z67.unknown()
35556
36587
  }),
35557
- z66.object({
35558
- op: z66.literal("remove"),
35559
- path: z66.string()
36588
+ z67.object({
36589
+ op: z67.literal("remove"),
36590
+ path: z67.string()
35560
36591
  }),
35561
- z66.object({
35562
- op: z66.literal("replace"),
35563
- path: z66.string(),
35564
- value: z66.unknown()
36592
+ z67.object({
36593
+ op: z67.literal("replace"),
36594
+ path: z67.string(),
36595
+ value: z67.unknown()
35565
36596
  }),
35566
- z66.object({
35567
- op: z66.literal("move"),
35568
- from: z66.string(),
35569
- path: z66.string()
36597
+ z67.object({
36598
+ op: z67.literal("move"),
36599
+ from: z67.string(),
36600
+ path: z67.string()
35570
36601
  }),
35571
- z66.object({
35572
- op: z66.literal("copy"),
35573
- from: z66.string(),
35574
- path: z66.string()
36602
+ z67.object({
36603
+ op: z67.literal("copy"),
36604
+ from: z67.string(),
36605
+ path: z67.string()
35575
36606
  }),
35576
36607
  // Block-level operations (Phase 2)
35577
- z66.object({
35578
- op: z66.literal("add_block"),
35579
- blockKind: z66.string(),
35580
- afterBlockId: z66.string().nullable(),
35581
- content: z66.record(z66.string(), z66.unknown()),
35582
- rationale: z66.string()
36608
+ z67.object({
36609
+ op: z67.literal("add_block"),
36610
+ blockKind: z67.string(),
36611
+ afterBlockId: z67.string().nullable(),
36612
+ content: z67.record(z67.string(), z67.unknown()),
36613
+ rationale: z67.string()
35583
36614
  }),
35584
- z66.object({
35585
- op: z66.literal("delete_block"),
35586
- blockId: z66.string(),
35587
- rationale: z66.string()
36615
+ z67.object({
36616
+ op: z67.literal("delete_block"),
36617
+ blockId: z67.string(),
36618
+ rationale: z67.string()
35588
36619
  }),
35589
- z66.object({
35590
- op: z66.literal("reorder_block"),
35591
- blockId: z66.string(),
35592
- afterBlockId: z66.string().nullable(),
35593
- rationale: z66.string()
36620
+ z67.object({
36621
+ op: z67.literal("reorder_block"),
36622
+ blockId: z67.string(),
36623
+ afterBlockId: z67.string().nullable(),
36624
+ rationale: z67.string()
35594
36625
  })
35595
36626
  ]);
35596
- var PlaygroundProposeRequest = z66.object({
35597
- request: z66.string().min(1).max(2e3)
36627
+ var PlaygroundProposeRequest = z67.object({
36628
+ request: z67.string().min(1).max(2e3)
35598
36629
  });
35599
- var MultiPagePatchEnvelope = z66.object({
35600
- pageId: z66.string(),
35601
- blockId: z66.string().optional(),
36630
+ var MultiPagePatchEnvelope = z67.object({
36631
+ pageId: z67.string(),
36632
+ blockId: z67.string().optional(),
35602
36633
  // Not present for page-level ops
35603
- blockKind: z66.string().optional(),
35604
- blockPurpose: z66.string().optional().nullable(),
35605
- ops: z66.array(Rfc6902PatchOp),
35606
- rationale: z66.string(),
35607
- currentContent: z66.record(z66.string(), z66.unknown()).optional()
36634
+ blockKind: z67.string().optional(),
36635
+ blockPurpose: z67.string().optional().nullable(),
36636
+ ops: z67.array(Rfc6902PatchOp),
36637
+ rationale: z67.string(),
36638
+ currentContent: z67.record(z67.string(), z67.unknown()).optional()
35608
36639
  });
35609
- var MultiPageUpdateResponse = z66.object({
35610
- patches: z66.array(MultiPagePatchEnvelope),
35611
- assistantMessage: z66.string(),
35612
- pagesModified: z66.number(),
35613
- toolCallsUsed: z66.number()
36640
+ var MultiPageUpdateResponse = z67.object({
36641
+ patches: z67.array(MultiPagePatchEnvelope),
36642
+ assistantMessage: z67.string(),
36643
+ pagesModified: z67.number(),
36644
+ toolCallsUsed: z67.number()
35614
36645
  });
35615
36646
 
35616
36647
  // src/data/prefetchBlockData.ts
@@ -35683,7 +36714,7 @@ async function prefetchBlockData2(page, context, client, options) {
35683
36714
  throw new Error("listPublishedEntries requires siteId and type params");
35684
36715
  }
35685
36716
  const parsedLimit = typeof limit === "string" ? Number.parseInt(limit, 10) : typeof limit === "number" ? limit : void 0;
35686
- const order = orderBy === "newest" || orderBy === "oldest" || orderBy === "title" || orderBy === "order" ? orderBy : void 0;
36717
+ const order = orderBy === "order" ? "manual" : orderBy === "newest" || orderBy === "oldest" || orderBy === "title" ? orderBy : void 0;
35687
36718
  const parsedEntryIds = mode === "manual" ? parseManualEntryIds(entryIds) : void 0;
35688
36719
  if (mode === "manual" && (!parsedEntryIds || parsedEntryIds.length === 0)) {
35689
36720
  return { entries: [] };
@@ -36239,12 +37270,28 @@ function isPageContent(result) {
36239
37270
  function isEntryContent(result) {
36240
37271
  return result.type === "entry";
36241
37272
  }
37273
+ function isContentLoadNotFoundError(error) {
37274
+ if (typeof error !== "object" || error === null || !("status" in error)) {
37275
+ return false;
37276
+ }
37277
+ return Reflect.get(error, "status") === 404;
37278
+ }
37279
+ function getRejectedReason(result) {
37280
+ return result.reason;
37281
+ }
36242
37282
  async function loadContent(params) {
36243
37283
  const { client, siteId, path, preview = false, forceSite } = params;
36244
- const [site, contentResponse] = await Promise.all([
37284
+ const [siteResult, contentResult] = await Promise.allSettled([
36245
37285
  client.getSite({ id: siteId, ...forceSite ? { force: true } : {} }),
36246
37286
  client.getPage({ siteId, path, preview })
36247
37287
  ]);
37288
+ if (siteResult.status === "rejected" || contentResult.status === "rejected") {
37289
+ const failures = [siteResult, contentResult].filter((result) => result.status === "rejected").map(getRejectedReason);
37290
+ const upstreamFailure = failures.find((error) => !isContentLoadNotFoundError(error));
37291
+ throw upstreamFailure ?? failures[0];
37292
+ }
37293
+ const site = siteResult.value;
37294
+ const contentResponse = contentResult.value;
36248
37295
  const customBlocks = resolveSiteCustomBlocks(site);
36249
37296
  const mediaAssets = Array.isArray(contentResponse.mediaAssets) && contentResponse.mediaAssets.length > 0 ? contentResponse.mediaAssets : void 0;
36250
37297
  if (isEntryResponse(contentResponse)) {