@riverbankcms/sdk 0.80.0 → 0.81.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (265) hide show
  1. package/dist/{PreviewEditorSidebar-QZG37QIF.mjs → PreviewEditorSidebar-RDCMEXIJ.mjs} +763 -255
  2. package/dist/{PreviewEditorUI-AXIKSMZA.mjs → PreviewEditorUI-NYGQ6K7B.mjs} +170 -29
  3. package/dist/SdkPreviewModeRuntime-AKCSCZEC.mjs +8 -0
  4. package/dist/_dts/api/src/contentRuntime.d.ts +12 -0
  5. package/dist/_dts/api/src/contentTypes.d.ts +6 -0
  6. package/dist/_dts/api/src/index.d.ts +2 -2
  7. package/dist/_dts/api/src/publicExperienceEndpoints.d.ts +53 -0
  8. package/dist/_dts/block-form/src/backend/store-backend.d.ts +3 -1
  9. package/dist/_dts/block-form/src/backend/types.d.ts +3 -3
  10. package/dist/_dts/blocks/src/PageRenderer.d.ts +3 -0
  11. package/dist/_dts/blocks/src/contracts/proof-block-islands.d.ts +20 -28
  12. package/dist/_dts/blocks/src/index.d.ts +6 -4
  13. package/dist/_dts/blocks/src/primitives/content/components/Text.d.ts +1 -1
  14. package/dist/_dts/blocks/src/primitives/content/primitives.d.ts +1 -0
  15. package/dist/_dts/blocks/src/server.d.ts +1 -1
  16. package/dist/_dts/blocks/src/system/blocks/events/event-calendar.d.ts +3 -2
  17. package/dist/_dts/blocks/src/system/blocks/events/shared/schemas.d.ts +135 -0
  18. package/dist/_dts/blocks/src/system/blocks/events/shared/types.d.ts +5 -0
  19. package/dist/_dts/blocks/src/system/blocks/feature-cards.d.ts +2 -0
  20. package/dist/_dts/blocks/src/system/blocks/form.d.ts +20 -1
  21. package/dist/_dts/blocks/src/system/blocks/hero.d.ts +2 -0
  22. package/dist/_dts/blocks/src/system/blocks/offerings-preview/index.d.ts +19 -0
  23. package/dist/_dts/blocks/src/system/blocks/offerings-preview/model.d.ts +134 -0
  24. package/dist/_dts/blocks/src/system/componentFactory.d.ts +1 -0
  25. package/dist/_dts/blocks/src/system/constants/background.d.ts +1 -1
  26. package/dist/_dts/blocks/src/system/constants/blockKinds.d.ts +1 -1
  27. package/dist/_dts/blocks/src/system/customize/backgrounds.d.ts +13 -3
  28. package/dist/_dts/blocks/src/system/data/index.d.ts +2 -0
  29. package/dist/_dts/blocks/src/system/data/linkedContentEntries.d.ts +64 -0
  30. package/dist/_dts/blocks/src/system/data/loaderEndpoints.d.ts +1 -1
  31. package/dist/_dts/blocks/src/system/designCapabilities.d.ts +2 -2
  32. package/dist/_dts/blocks/src/system/fields/boxStyles.d.ts +6 -1
  33. package/dist/_dts/blocks/src/system/fragments/library/faqHeading.d.ts +0 -1
  34. package/dist/_dts/blocks/src/system/media/slotContracts.d.ts +2 -0
  35. package/dist/_dts/blocks/src/system/node/types.d.ts +8 -1
  36. package/dist/_dts/blocks/src/system/node/validation-constants.d.ts +1 -1
  37. package/dist/_dts/blocks/src/system/registry.d.ts +1 -0
  38. package/dist/_dts/blocks/src/system/runtime/components/registry.client.d.ts +44 -50
  39. package/dist/_dts/blocks/src/system/runtime/components/runtime-backed-blocks.d.ts +21 -24
  40. package/dist/_dts/blocks/src/system/runtime/headingDecoration.d.ts +21 -0
  41. package/dist/_dts/blocks/src/system/runtime/hooks/useCalendarEvents.d.ts +45 -14
  42. package/dist/_dts/blocks/src/system/runtime/hooks/useEventFilters.d.ts +2 -9
  43. package/dist/_dts/blocks/src/system/runtime/hooks/useEventPagination.d.ts +1 -10
  44. package/dist/_dts/blocks/src/system/runtime/nodes/basic.d.ts +1 -0
  45. package/dist/_dts/blocks/src/system/runtime/nodes/events/EventCalendar.interactive.d.ts +21 -16
  46. package/dist/_dts/blocks/src/system/runtime/nodes/events/EventCombined.client.d.ts +3 -2
  47. package/dist/_dts/blocks/src/system/runtime/nodes/events/EventCombined.interactive.d.ts +21 -16
  48. package/dist/_dts/blocks/src/system/runtime/nodes/events/EventListing.interactive.d.ts +17 -28
  49. package/dist/_dts/blocks/src/system/runtime/nodes/events/shared/EventPaginatedListView.client.d.ts +2 -3
  50. package/dist/_dts/blocks/src/system/runtime/nodes/events/shared/WeekAgendaView.d.ts +3 -3
  51. package/dist/_dts/blocks/src/system/runtime/nodes/events/shared/listOptions.d.ts +50 -0
  52. package/dist/_dts/blocks/src/system/runtime/nodes/events/shared/utils.d.ts +2 -1
  53. package/dist/_dts/blocks/src/system/runtime/nodes/media.d.ts +29 -14
  54. package/dist/_dts/blocks/src/system/runtime/nodes/offerings-preview.d.ts +21 -0
  55. package/dist/_dts/blocks/src/system/runtime/resolver.d.ts +7 -0
  56. package/dist/_dts/blocks/src/system/transforms/registry/_utils/sectionForegroundStyles.d.ts +2 -0
  57. package/dist/_dts/blocks/src/system/transforms/registry/boxStyles.d.ts +4 -2
  58. package/dist/_dts/calendar/src/grid.d.ts +27 -0
  59. package/dist/_dts/calendar/src/index.d.ts +2 -2
  60. package/dist/_dts/content-editor/src/controller/useAutosaveTriggers.d.ts +3 -1
  61. package/dist/_dts/content-editor/src/editorTransactionState.d.ts +1 -0
  62. package/dist/_dts/content-editor/src/hooks/autosaveScopePlanning.d.ts +26 -0
  63. package/dist/_dts/content-editor/src/hooks/publishability.d.ts +1 -0
  64. package/dist/_dts/content-editor/src/hooks/useLinkedEntryAutosave.d.ts +23 -0
  65. package/dist/_dts/content-editor/src/hooks/useReactiveToolbar.d.ts +1 -1
  66. package/dist/_dts/content-editor/src/hooks/useSimpleAutosave.d.ts +2 -2
  67. package/dist/_dts/content-editor/src/index.d.ts +3 -1
  68. package/dist/_dts/content-editor/src/lib/json.d.ts +2 -0
  69. package/dist/_dts/content-editor/src/linkedEntries/domain.d.ts +8 -0
  70. package/dist/_dts/content-editor/src/ui/editorSnapshot.d.ts +58 -0
  71. package/dist/_dts/content-editor/src/ui/editorTransactionState.d.ts +93 -0
  72. package/dist/_dts/content-editor/src/ui/editorUiStore.d.ts +60 -3
  73. package/dist/_dts/content-editor/src/ui/stores/autosaveStore.d.ts +2 -0
  74. package/dist/_dts/content-editor/src/ui/stores/types.d.ts +1 -1
  75. package/dist/_dts/content-model/src/content-types/builtins.d.ts +43 -0
  76. package/dist/_dts/content-model/src/metadataConfig.d.ts +87 -47
  77. package/dist/_dts/core/src/branded.d.ts +5 -0
  78. package/dist/_dts/core/src/index.d.ts +1 -0
  79. package/dist/_dts/core/src/stable-json.d.ts +1 -0
  80. package/dist/_dts/editor/src/EditorProvider.d.ts +26 -0
  81. package/dist/_dts/editor/src/chrome/EditorChrome.d.ts +26 -0
  82. package/dist/_dts/editor/src/chrome/EditorStatusBar.d.ts +45 -0
  83. package/dist/_dts/editor/src/chrome/statusBarPresentation.d.ts +25 -0
  84. package/dist/_dts/editor/src/components/EditingToggle.d.ts +9 -0
  85. package/dist/_dts/editor/src/hooks/useEditableElement.d.ts +18 -0
  86. package/dist/_dts/editor/src/index.d.ts +29 -0
  87. package/dist/_dts/editor/src/inline/InlineTextEditor.d.ts +1 -0
  88. package/dist/_dts/editor/src/lib/utils.d.ts +1 -0
  89. package/dist/_dts/editor/src/primitives/EditorPrimitivesProvider.d.ts +20 -0
  90. package/dist/_dts/editor/src/primitives/InlineFieldContext.d.ts +11 -0
  91. package/dist/_dts/editor/src/primitives/SaveContext.d.ts +12 -0
  92. package/dist/_dts/editor/src/primitives/helpers.d.ts +1 -0
  93. package/dist/_dts/editor/src/primitives/rich-text/RichTextEditorSurface.d.ts +26 -0
  94. package/dist/_dts/editor/src/primitives/rich-text/RichTextToolbar.d.ts +16 -0
  95. package/dist/_dts/editor/src/primitives/rich-text/config.d.ts +23 -0
  96. package/dist/_dts/editor/src/primitives/rich-text/extensions/RichTextImage.d.ts +2 -0
  97. package/dist/_dts/editor/src/primitives/rich-text/extensions/RichTextLink.d.ts +1 -0
  98. package/dist/_dts/editor/src/primitives/rich-text/imageActions.d.ts +22 -0
  99. package/dist/_dts/editor/src/primitives/rich-text/sanitize.d.ts +23 -0
  100. package/dist/_dts/editor/src/primitives/rich-text/toolbar/BlockTypeDropdown.d.ts +6 -0
  101. package/dist/_dts/editor/src/primitives/rich-text/toolbar/LinkPopover.d.ts +10 -0
  102. package/dist/_dts/editor/src/primitives/rich-text/toolbar/ToolbarIconButton.d.ts +11 -0
  103. package/dist/_dts/editor/src/primitives/rich-text/toolbar/linkPopoverUtils.d.ts +58 -0
  104. package/dist/_dts/editor/src/primitives/rich-text/useRichTextEditor.d.ts +19 -0
  105. package/dist/_dts/editor/src/primitives/rich-text/utils.d.ts +20 -0
  106. package/dist/_dts/editor/src/utils/optimisticTokens.d.ts +27 -0
  107. package/dist/_dts/editor-blocks/src/BlockEditor.d.ts +2 -2
  108. package/dist/_dts/editor-blocks/src/block-editor/BlockCard.d.ts +3 -3
  109. package/dist/_dts/editor-blocks/src/block-editor/BlockCardHeader.d.ts +4 -4
  110. package/dist/_dts/editor-blocks/src/block-editor/SortableBlockItem.d.ts +2 -2
  111. package/dist/_dts/editor-blocks/src/block-editor/actionPresentation.d.ts +15 -0
  112. package/dist/_dts/editor-blocks/src/block-editor/blockHeaderActionPlan.d.ts +49 -0
  113. package/dist/_dts/editor-blocks/src/widgets/index.d.ts +1 -0
  114. package/dist/_dts/editor-blocks/src/widgets/rich-text/RichTextWidgetProvider.d.ts +1 -1
  115. package/dist/_dts/editor-blocks/src/widgets/rich-text/useImagePicker.d.ts +1 -1
  116. package/dist/_dts/editor-blocks/src/widgets/site-option-picker/SiteOptionPickerField.d.ts +3 -0
  117. package/dist/_dts/editor-blocks/src/widgets/site-option-picker/SiteOptionWidgetProvider.d.ts +14 -0
  118. package/dist/_dts/editor-blocks/src/widgets/site-option-picker/index.d.ts +6 -0
  119. package/dist/_dts/editor-blocks/src/widgets/site-option-picker/loaders.d.ts +51 -0
  120. package/dist/_dts/editor-blocks/src/widgets/site-option-picker/types.d.ts +20 -0
  121. package/dist/_dts/editor-blocks/src/widgets/site-option-picker/utils.d.ts +5 -0
  122. package/dist/_dts/media-core/src/index.d.ts +1 -0
  123. package/dist/_dts/media-core/src/renderableMediaAsset.d.ts +18 -0
  124. package/dist/_dts/media-editor/src/MediaEditor.d.ts +4 -1
  125. package/dist/_dts/media-editor/src/MediaPickerDialog.d.ts +2 -1
  126. package/dist/_dts/media-editor/src/index.d.ts +1 -1
  127. package/dist/_dts/preview-next/src/client/blocks/BlockToolbar.d.ts +3 -2
  128. package/dist/_dts/preview-next/src/client/blocks/EditablePageRenderer.d.ts +5 -1
  129. package/dist/_dts/preview-next/src/client/blocks/blockCustomizePopoverRows.d.ts +25 -0
  130. package/dist/_dts/preview-next/src/client/blocks/composer/mergeDrafts.d.ts +2 -1
  131. package/dist/_dts/preview-next/src/client/blocks/composer/types.d.ts +4 -30
  132. package/dist/_dts/preview-next/src/client/blocks/linkedEntryRenderOverlay.d.ts +11 -0
  133. package/dist/_dts/preview-next/src/client/blocks/previewCustomizeActions.d.ts +3 -9
  134. package/dist/_dts/preview-next/src/client/blocks/useBlockCustomizeControls.d.ts +2 -1
  135. package/dist/_dts/preview-next/src/client/index.d.ts +0 -1
  136. package/dist/_dts/preview-next/src/client/preview/EntryEditorPanel.d.ts +3 -1
  137. package/dist/_dts/preview-next/src/client/preview/LinkedEntryEditEventBridge.d.ts +1 -0
  138. package/dist/_dts/preview-next/src/client/preview/PageBlockEditorPanel.d.ts +3 -1
  139. package/dist/_dts/preview-next/src/client/preview/PreviewChromeLayer.d.ts +20 -0
  140. package/dist/_dts/preview-next/src/client/preview/PreviewDesignHistoryOrderContext.d.ts +13 -0
  141. package/dist/_dts/preview-next/src/client/preview/PreviewOpenEditorButton.d.ts +1 -1
  142. package/dist/_dts/preview-next/src/client/preview/PreviewShell.d.ts +19 -19
  143. package/dist/_dts/preview-next/src/client/preview/PreviewSidebarSection.d.ts +13 -0
  144. package/dist/_dts/preview-next/src/client/preview/SiteChromeCustomizeContext.d.ts +47 -4
  145. package/dist/_dts/preview-next/src/client/preview/StyleConfigurator.state.d.ts +14 -1
  146. package/dist/_dts/preview-next/src/client/preview/linkedEntryEditEvents.d.ts +5 -0
  147. package/dist/_dts/preview-next/src/client/preview/previewChromePlacement.d.ts +46 -0
  148. package/dist/_dts/preview-next/src/client/preview/previewCustomizeControls.d.ts +68 -0
  149. package/dist/_dts/preview-next/src/client/preview/previewCustomizeHistory.d.ts +8 -1
  150. package/dist/_dts/preview-next/src/client/preview/previewCustomizeWorkflowState.d.ts +11 -9
  151. package/dist/_dts/preview-next/src/client/preview/previewDesignHistoryOrder.d.ts +18 -0
  152. package/dist/_dts/preview-next/src/client/preview/previewUndoDomains.d.ts +1 -1
  153. package/dist/_dts/preview-next/src/client/preview/siteChromeBrandPreferences.d.ts +41 -0
  154. package/dist/_dts/preview-next/src/client/preview/siteChromeQuickControlHistoryState.d.ts +101 -0
  155. package/dist/_dts/preview-next/src/client/preview/siteChromeSavePlan.d.ts +29 -0
  156. package/dist/_dts/preview-next/src/client/preview/siteStyleHistoryState.d.ts +55 -0
  157. package/dist/_dts/preview-next/src/client/preview/styleConfiguratorApplyPayload.d.ts +1 -0
  158. package/dist/_dts/preview-next/src/client/widgets/widgetAdapters.d.ts +2 -1
  159. package/dist/_dts/preview-next/src/client/widgets/widgetOverrides.d.ts +3 -2
  160. package/dist/_dts/preview-next/src/constants.d.ts +0 -1
  161. package/dist/_dts/sdk/src/cli/config-loader.d.ts +3 -1
  162. package/dist/_dts/sdk/src/cli/content/reader.d.ts +5 -3
  163. package/dist/_dts/sdk/src/cli/site-commands/commandSurfaceDispatch.d.ts +1 -0
  164. package/dist/_dts/sdk/src/cli/site-commands/pageCommands.d.ts +3 -1
  165. package/dist/_dts/sdk/src/cli/site-commands/pushExecution.d.ts +1 -0
  166. package/dist/_dts/sdk/src/config/types.d.ts +1 -1
  167. package/dist/_dts/sdk/src/config/validation.d.ts +3 -3
  168. package/dist/_dts/sdk/src/contracts/system-block-content.d.ts +28 -2
  169. package/dist/_dts/sdk/src/public-api/contracts.d.ts +10 -0
  170. package/dist/_dts/sdk/src/rendering/islands/types.d.ts +42 -0
  171. package/dist/_dts/sdk/src/rendering/mediaAssets.d.ts +4 -0
  172. package/dist/_dts/sdk/src/types/block-kinds.d.ts +1 -1
  173. package/dist/_dts/sdk/src/version.d.ts +1 -1
  174. package/dist/_dts/theme-core/src/buttons/constants.d.ts +26 -1
  175. package/dist/_dts/theme-core/src/buttons/personalities/index.d.ts +11 -0
  176. package/dist/_dts/theme-core/src/buttons/personalities/joy-stamp.d.ts +22 -0
  177. package/dist/_dts/theme-core/src/buttons/personalities/types.d.ts +1 -0
  178. package/dist/_dts/theme-core/src/buttons/types.d.ts +9 -0
  179. package/dist/_dts/theme-core/src/cards/siteStyleDefaults.d.ts +44 -0
  180. package/dist/_dts/theme-core/src/generated/containerResponsiveThemeCss.d.ts +1 -1
  181. package/dist/_dts/theme-core/src/interactive/types.d.ts +10 -0
  182. package/dist/_dts/theme-core/src/mock-themes/all.d.ts +27 -6
  183. package/dist/_dts/theme-core/src/palette/variants/index.d.ts +15 -0
  184. package/dist/_dts/theme-core/src/palette/variants/warm-dark.d.ts +27 -0
  185. package/dist/_dts/theme-core/src/schema.d.ts +40 -3
  186. package/dist/_dts/theme-core/src/site-styles/accessibleSurfaces.d.ts +4 -1
  187. package/dist/_dts/theme-core/src/site-styles/appearancePresetCatalog.d.ts +87 -31
  188. package/dist/_dts/theme-core/src/site-styles/appearancePresetResolution.d.ts +6 -2
  189. package/dist/_dts/theme-core/src/site-styles/blockAppearancePresets.d.ts +87 -31
  190. package/dist/_dts/theme-core/src/site-styles/curatedSiteStyles.d.ts +30 -1
  191. package/dist/_dts/theme-core/src/site-styles/designState.d.ts +18 -2
  192. package/dist/_dts/theme-core/src/site-styles/generatedSchemas.d.ts +6 -2
  193. package/dist/_dts/theme-core/src/site-styles/headerLooks.d.ts +5 -0
  194. package/dist/_dts/theme-core/src/site-styles/index.d.ts +1 -0
  195. package/dist/_dts/theme-core/src/site-styles/pageDesignEditorModel.d.ts +3 -23
  196. package/dist/_dts/theme-core/src/site-styles/pageDesignIntent.d.ts +276 -4
  197. package/dist/_dts/theme-core/src/site-styles/runtimeCompiler.d.ts +33 -3
  198. package/dist/_dts/theme-core/src/site-styles/sectionTransitions.d.ts +508 -0
  199. package/dist/_dts/theme-core/src/site-styles/sourceCatalogs.d.ts +10 -10
  200. package/dist/_dts/theme-core/src/site-styles/types.d.ts +24 -6
  201. package/dist/_dts/theme-core/src/site-styles/typographyPresets.d.ts +16 -1
  202. package/dist/{chunk-7PCYG6YV.mjs → chunk-3PTVPAT4.mjs} +1863 -1099
  203. package/dist/{chunk-5NZGBSJF.mjs → chunk-3QWQ2MUQ.mjs} +469 -1000
  204. package/dist/{chunk-HTB4BMKD.mjs → chunk-3VT7LZY2.mjs} +321 -113
  205. package/dist/{chunk-MPBNEVPB.mjs → chunk-4T5JIPWY.mjs} +1 -1
  206. package/dist/{chunk-BBLZSQEY.mjs → chunk-E3NZYEKF.mjs} +1 -7
  207. package/dist/{chunk-GYXKAUFV.mjs → chunk-WUHKQBB6.mjs} +9509 -2658
  208. package/dist/cli/index.mjs +1347 -324
  209. package/dist/client/{accordion-QFZMNB7O.mjs → accordion-SFIIZWNH.mjs} +2 -2
  210. package/dist/client/{bookingForm-NCIXFWIG.mjs → bookingForm-CFKZVWGA.mjs} +5 -5
  211. package/dist/client/bookings.mjs +281 -19
  212. package/dist/client/{carousel-EO4BJMWD.mjs → carousel-ELXWSBLA.mjs} +3 -3
  213. package/dist/client/{cart-FTYCLYUW.mjs → cart-6SSCPYY5.mjs} +6 -6
  214. package/dist/client/{checkout-NFGLVCOX.mjs → checkout-UFQ34HPV.mjs} +6 -6
  215. package/dist/client/{chunk-6GVVWSPU.mjs → chunk-76JUETXQ.mjs} +139 -186
  216. package/dist/client/{chunk-AUJ5DBZJ.mjs → chunk-7BXX7WXH.mjs} +112 -28
  217. package/dist/client/{chunk-IWFZSQNZ.mjs → chunk-G56BSZAM.mjs} +2 -2
  218. package/dist/client/{chunk-VDS5YFLX.mjs → chunk-IUEDYLFJ.mjs} +1 -1
  219. package/dist/client/{chunk-PYRBIURC.mjs → chunk-NP47RHIX.mjs} +5 -5
  220. package/dist/client/{chunk-PUOELU4O.mjs → chunk-NX6X3GRF.mjs} +330 -80
  221. package/dist/client/{chunk-Y37KDO7P.mjs → chunk-PA2LJH2M.mjs} +2 -2
  222. package/dist/client/{chunk-CE7IBGVW.mjs → chunk-RMWMT3ZD.mjs} +1 -1
  223. package/dist/client/{chunk-4W66ALYT.mjs → chunk-TCJS3NY5.mjs} +1 -1
  224. package/dist/client/{chunk-T6UIP6UZ.mjs → chunk-V6XI4M2Q.mjs} +1 -1
  225. package/dist/client/client.mjs +5924 -3138
  226. package/dist/client/{courseRegistration-2EORROPS.mjs → courseRegistration-HJIISAAG.mjs} +5 -5
  227. package/dist/client/{eventCalendar-WZI4VL6N.mjs → eventCalendar-F6YVUCZR.mjs} +7 -7
  228. package/dist/client/{eventCombined-QCB2TCNL.mjs → eventCombined-B5DSTIOK.mjs} +7 -7
  229. package/dist/client/{eventDetails-TFTATAPH.mjs → eventDetails-SEJDDHQC.mjs} +7 -7
  230. package/dist/client/{eventListing-A2CQEHEQ.mjs → eventListing-TPMWIIBO.mjs} +7 -7
  231. package/dist/client/{eventRegistration-OELPVLUY.mjs → eventRegistration-QU6W2PV6.mjs} +7 -7
  232. package/dist/client/{form-NTIFD6WQ.mjs → form-LVTYNTDE.mjs} +2 -2
  233. package/dist/client/{headerSection-7TBNKCLA.mjs → headerSection-SO3MFC4U.mjs} +54 -13
  234. package/dist/client/hooks.mjs +2266 -1179
  235. package/dist/client/{locationMap-LRLB5A3H.mjs → locationMap-5E5FLAKO.mjs} +2 -2
  236. package/dist/client/{newsletterForm-XI52RZSN.mjs → newsletterForm-GN32JEBQ.mjs} +2 -2
  237. package/dist/client/{productDetail-GSNKBFLY.mjs → productDetail-Q346KSVR.mjs} +6 -6
  238. package/dist/client/{productList-BGCGT4KZ.mjs → productList-DTDMQYGZ.mjs} +6 -6
  239. package/dist/client/rendering/client.mjs +4618 -3318
  240. package/dist/client/rendering/islands.mjs +32 -20
  241. package/dist/client/rendering.mjs +4898 -2108
  242. package/dist/client/{shop-RQHUCLNY.mjs → shop-OFUW7KPN.mjs} +6 -6
  243. package/dist/preview-next/client/runtime.mjs +5 -5
  244. package/dist/preview-next/constants.mjs +0 -2
  245. package/dist/preview-next/index.mjs +0 -2
  246. package/dist/{sdk-runtime-A4LHT2RS.mjs → sdk-runtime-2GIX6I7X.mjs} +6 -6
  247. package/dist/server/components.mjs +4377 -1852
  248. package/dist/server/config-validation.mjs +2283 -1303
  249. package/dist/server/config.mjs +2283 -1303
  250. package/dist/server/data.mjs +2267 -1180
  251. package/dist/server/index.mjs +2 -1
  252. package/dist/server/next.mjs +4394 -1773
  253. package/dist/server/page-converter.mjs +1999 -1015
  254. package/dist/server/prebuild.mjs +1 -1
  255. package/dist/server/rendering/server.mjs +4482 -1857
  256. package/dist/server/rendering.mjs +4484 -1859
  257. package/dist/server/routing.mjs +2302 -1120
  258. package/dist/server/server.mjs +2284 -1197
  259. package/dist/server/theme-bridge.mjs +757 -85
  260. package/dist/server/theme.mjs +69 -4
  261. package/dist/styles/index.css +474 -65
  262. package/package.json +1 -1
  263. package/dist/SdkPreviewModeRuntime-XE5M4UKM.mjs +0 -8
  264. package/dist/_dts/editor-blocks/src/block-editor/actionControlMode.d.ts +0 -2
  265. package/dist/_dts/preview-next/src/client/preview/previewSurface.d.ts +0 -3
@@ -6948,7 +6948,7 @@ var SimpleCache = class {
6948
6948
  };
6949
6949
 
6950
6950
  // src/version.ts
6951
- var SDK_VERSION = "0.80.0";
6951
+ var SDK_VERSION = "0.81.0";
6952
6952
 
6953
6953
  // src/client/error.ts
6954
6954
  var RiverbankApiError = class _RiverbankApiError extends Error {
@@ -8405,6 +8405,11 @@ function toLocationCoordinates(value) {
8405
8405
  };
8406
8406
  }
8407
8407
 
8408
+ // ../core/src/assert-never.ts
8409
+ function assertNever(value, message = "Unexpected variant") {
8410
+ throw new Error(`${message}: ${String(value)}`);
8411
+ }
8412
+
8408
8413
  // ../api/src/accessAdmin.ts
8409
8414
  import { z } from "zod";
8410
8415
  var managedDomainAddOnPricingSnapshotSchema = z.object({
@@ -8509,7 +8514,7 @@ var navigationLinkInputSchema = z2.discriminatedUnion(
8509
8514
  );
8510
8515
 
8511
8516
  // ../api/src/sdkConfig/contracts.ts
8512
- import { z as z63 } from "zod";
8517
+ import { z as z65 } from "zod";
8513
8518
 
8514
8519
  // ../blocks/src/system/manifest/augmentManifest.ts
8515
8520
  function augmentManifest(manifest) {
@@ -9516,25 +9521,10 @@ function featuresFromHex(hex) {
9516
9521
  return { r, g, b, h, s, l, v, Y, chroma, okL, okC, okH, hex };
9517
9522
  }
9518
9523
 
9519
- // ../theme-core/src/site-styles/appearancePresetResolution.ts
9520
- function assertValidOptionGroups(preset2) {
9521
- preset2.optionGroups?.forEach((group) => {
9522
- const selectedOption = group.options.find(
9523
- (option) => option.id === group.selectedOptionId
9524
- );
9525
- if (!selectedOption) {
9526
- throw new Error(
9527
- `Appearance preset "${preset2.id}" option group "${group.id}" selects missing option "${group.selectedOptionId}".`
9528
- );
9529
- }
9530
- });
9531
- }
9532
- function defineBlockAppearancePreset(preset2) {
9533
- assertValidOptionGroups(preset2);
9534
- return preset2;
9535
- }
9536
-
9537
9524
  // ../theme-core/src/site-styles/types.ts
9525
+ function defineExactCatalog() {
9526
+ return (entries) => entries;
9527
+ }
9538
9528
  function asDesignBlockId(value) {
9539
9529
  return brandNonEmptyString(value, "DesignBlockId");
9540
9530
  }
@@ -9593,7 +9583,7 @@ function makeBoundaryId(previousBlockId, nextBlockId) {
9593
9583
  const next = encodeURIComponent(nextBlockId);
9594
9584
  return asDesignBoundaryId(`boundary:${previous}:${next}`);
9595
9585
  }
9596
- function assertNever(value, message = "Unhandled Theme V2 variant") {
9586
+ function assertNever2(value, message = "Unhandled Theme V2 variant") {
9597
9587
  throw new Error(`${message}: ${String(value)}`);
9598
9588
  }
9599
9589
  function brandNonEmptyString(value, label) {
@@ -9683,11 +9673,31 @@ function defineBlockDesignCapability(capability) {
9683
9673
  tileTreatments: capability.tileTreatments ?? ["default"],
9684
9674
  eventListTreatments: capability.eventListTreatments ?? ["plain"],
9685
9675
  eyebrowTreatments: capability.eyebrowTreatments ?? ["plain"],
9686
- ...capability.accordionIconSets ? { accordionIconSets: capability.accordionIconSets } : {},
9687
- ...capability.headingDecorations ? { headingDecorations: capability.headingDecorations } : {}
9676
+ headingDecorationCapability: capability.headingDecorationCapability ?? {
9677
+ kind: "unsupported"
9678
+ },
9679
+ ...capability.accordionIconSets ? { accordionIconSets: capability.accordionIconSets } : {}
9688
9680
  };
9689
9681
  }
9690
9682
 
9683
+ // ../theme-core/src/site-styles/appearancePresetResolution.ts
9684
+ function assertValidOptionGroups(preset2) {
9685
+ preset2.optionGroups?.forEach((group) => {
9686
+ const selectedOption = group.options.find(
9687
+ (option) => option.id === group.selectedOptionId
9688
+ );
9689
+ if (!selectedOption) {
9690
+ throw new Error(
9691
+ `Appearance preset "${preset2.id}" option group "${group.id}" selects missing option "${group.selectedOptionId}".`
9692
+ );
9693
+ }
9694
+ });
9695
+ }
9696
+ function defineBlockAppearancePreset(preset2) {
9697
+ assertValidOptionGroups(preset2);
9698
+ return preset2;
9699
+ }
9700
+
9691
9701
  // ../theme-core/src/site-styles/blockAppearancePresets.ts
9692
9702
  var blockAppearancePresets = [
9693
9703
  defineBlockAppearancePreset({
@@ -10049,8 +10059,25 @@ var blockAppearancePresets = [
10049
10059
  kind: "block-design",
10050
10060
  id: "intro-organic-statement",
10051
10061
  target: "intro",
10052
- label: "Organic intro statement",
10062
+ label: "Intro statement",
10063
+ blockKinds: ["block.intro"],
10064
+ design: {
10065
+ sectionSurface: "base",
10066
+ contentFrame: plainFrame,
10067
+ itemSurface: "none",
10068
+ transitionAfter: "soft-fade-short",
10069
+ emphasis: "high"
10070
+ }
10071
+ }),
10072
+ defineBlockAppearancePreset({
10073
+ kind: "block-design",
10074
+ id: "intro-editorial-statement",
10075
+ target: "intro",
10076
+ label: "Editorial intro statement",
10053
10077
  blockKinds: ["block.intro"],
10078
+ constraints: {
10079
+ layoutVariantKeys: ["centered-copy", "statement-copy"]
10080
+ },
10054
10081
  design: {
10055
10082
  sectionSurface: "base",
10056
10083
  contentFrame: plainFrame,
@@ -10073,12 +10100,7 @@ var blockAppearancePresets = [
10073
10100
  contentFrame: plainFrame,
10074
10101
  itemSurface: "none",
10075
10102
  transitionAfter: "soft-fade-short",
10076
- emphasis: "medium",
10077
- headingDecoration: {
10078
- family: "organic-squiggle",
10079
- placement: "after-heading",
10080
- colorToken: "primary"
10081
- }
10103
+ emphasis: "medium"
10082
10104
  }
10083
10105
  }),
10084
10106
  defineBlockAppearancePreset({
@@ -10095,6 +10117,48 @@ var blockAppearancePresets = [
10095
10117
  emphasis: "medium"
10096
10118
  }
10097
10119
  }),
10120
+ defineBlockAppearancePreset({
10121
+ kind: "block-design",
10122
+ id: "offerings-preview-default-cards",
10123
+ target: "offerings",
10124
+ label: "Default offering cards",
10125
+ blockKinds: ["block.offerings-preview"],
10126
+ design: {
10127
+ sectionSurface: "base",
10128
+ contentFrame: plainFrame,
10129
+ itemSurface: "default",
10130
+ transitionAfter: "soft-fade-short",
10131
+ emphasis: "medium"
10132
+ }
10133
+ }),
10134
+ defineBlockAppearancePreset({
10135
+ kind: "block-design",
10136
+ id: "offerings-preview-secondary-cards",
10137
+ target: "offerings",
10138
+ label: "Secondary offering cards",
10139
+ blockKinds: ["block.offerings-preview"],
10140
+ design: {
10141
+ sectionSurface: "muted-band",
10142
+ contentFrame: plainFrame,
10143
+ itemSurface: "inset",
10144
+ transitionAfter: "soft-fade-short",
10145
+ emphasis: "medium"
10146
+ }
10147
+ }),
10148
+ defineBlockAppearancePreset({
10149
+ kind: "block-design",
10150
+ id: "offerings-preview-non-carded",
10151
+ target: "offerings",
10152
+ label: "Non-carded offerings",
10153
+ blockKinds: ["block.offerings-preview"],
10154
+ design: {
10155
+ sectionSurface: "muted-band",
10156
+ contentFrame: plainFrame,
10157
+ itemSurface: "editorial",
10158
+ transitionAfter: "soft-fade-short",
10159
+ emphasis: "medium"
10160
+ }
10161
+ }),
10098
10162
  defineBlockAppearancePreset({
10099
10163
  kind: "block-design",
10100
10164
  id: "feature-cards-raised-rule",
@@ -10109,6 +10173,20 @@ var blockAppearancePresets = [
10109
10173
  emphasis: "high"
10110
10174
  }
10111
10175
  }),
10176
+ defineBlockAppearancePreset({
10177
+ kind: "block-design",
10178
+ id: "feature-cards-bold-colors",
10179
+ target: "feature-cards",
10180
+ label: "Bold colour-blocked cards",
10181
+ blockKinds: ["block.feature-cards"],
10182
+ design: {
10183
+ sectionSurface: "base",
10184
+ contentFrame: plainFrame,
10185
+ itemSurface: "color-blocked",
10186
+ transitionAfter: "none",
10187
+ emphasis: "high"
10188
+ }
10189
+ }),
10112
10190
  defineBlockAppearancePreset({
10113
10191
  kind: "block-design",
10114
10192
  id: "feature-cards-editorial-columns",
@@ -10362,7 +10440,7 @@ var blockAppearancePresets = [
10362
10440
  kind: "block-design",
10363
10441
  id: "contact-form-panel",
10364
10442
  target: "contact-form",
10365
- label: "Contact form panel",
10443
+ label: "Raised form panel",
10366
10444
  blockKinds: ["block.form"],
10367
10445
  design: {
10368
10446
  sectionSurface: "muted-band",
@@ -10374,30 +10452,16 @@ var blockAppearancePresets = [
10374
10452
  }),
10375
10453
  defineBlockAppearancePreset({
10376
10454
  kind: "block-design",
10377
- id: "contact-form-dark-card",
10378
- target: "contact-form",
10379
- label: "Dark form card",
10380
- blockKinds: ["block.form"],
10381
- design: {
10382
- sectionSurface: "accent-band",
10383
- contentFrame: panelFrame("raised"),
10384
- itemSurface: "none",
10385
- transitionAfter: "soft-fade-short",
10386
- emphasis: "high"
10387
- }
10388
- }),
10389
- defineBlockAppearancePreset({
10390
- kind: "block-design",
10391
- id: "contact-form-brand-depth-card",
10455
+ id: "contact-form-open",
10392
10456
  target: "contact-form",
10393
- label: "Brand-depth form card",
10457
+ label: "Open form",
10394
10458
  blockKinds: ["block.form"],
10395
10459
  design: {
10396
- sectionSurface: "brand-depth-band",
10397
- contentFrame: panelFrame("raised"),
10460
+ sectionSurface: "muted-band",
10461
+ contentFrame: plainFrame,
10398
10462
  itemSurface: "none",
10399
10463
  transitionAfter: "none",
10400
- emphasis: "high"
10464
+ emphasis: "medium"
10401
10465
  }
10402
10466
  }),
10403
10467
  defineBlockAppearancePreset({
@@ -10475,7 +10539,130 @@ function assertUniqueLayoutProfileKeys(profiles) {
10475
10539
 
10476
10540
  // ../theme-core/src/site-styles/pageDesignIntent.ts
10477
10541
  import { z as z5 } from "zod";
10478
- var pageDesignIntentSchemaVersion = 1;
10542
+
10543
+ // ../theme-core/src/site-styles/sectionTransitions.ts
10544
+ var noneBoundaryOption = {
10545
+ id: asBoundaryOptionId("break:none"),
10546
+ label: "None",
10547
+ transitionAfter: "none",
10548
+ treatment: { kind: "none" }
10549
+ };
10550
+ var softBoundaryOption = {
10551
+ id: asBoundaryOptionId("break:soft"),
10552
+ label: "Soft",
10553
+ transitionAfter: "soft-fade-short",
10554
+ treatment: { kind: "soft-fade", height: "medium", curve: "soft" }
10555
+ };
10556
+ var spaciousBoundaryOption = {
10557
+ id: asBoundaryOptionId("break:spacious"),
10558
+ label: "Spacious",
10559
+ transitionAfter: "soft-fade-long",
10560
+ treatment: { kind: "soft-fade", height: "large", curve: "spacious" }
10561
+ };
10562
+ var expansiveBoundaryOption = {
10563
+ id: asBoundaryOptionId("break:expansive"),
10564
+ label: "Expansive",
10565
+ transitionAfter: "soft-fade-expansive",
10566
+ treatment: { kind: "soft-fade", height: "expansive", curve: "expansive" }
10567
+ };
10568
+ var waveBoundaryOption = {
10569
+ id: asBoundaryOptionId("break:wave"),
10570
+ label: "Classic wave",
10571
+ transitionAfter: "wave-edge",
10572
+ treatment: {
10573
+ kind: "wave-edge",
10574
+ height: "medium",
10575
+ amplitude: "balanced",
10576
+ rhythm: "double",
10577
+ symmetry: "asymmetrical"
10578
+ }
10579
+ };
10580
+ var balancedWaveBoundaryOption = {
10581
+ id: asBoundaryOptionId("break:wave-balanced"),
10582
+ label: "Balanced wave",
10583
+ transitionAfter: "wave-edge-balanced",
10584
+ treatment: {
10585
+ kind: "wave-edge",
10586
+ height: "medium",
10587
+ amplitude: "balanced",
10588
+ rhythm: "double",
10589
+ symmetry: "symmetrical"
10590
+ }
10591
+ };
10592
+ var gentleWaveBoundaryOption = {
10593
+ id: asBoundaryOptionId("break:wave-gentle"),
10594
+ label: "Gentle wave",
10595
+ transitionAfter: "wave-edge-gentle",
10596
+ treatment: {
10597
+ kind: "wave-edge",
10598
+ height: "compact",
10599
+ amplitude: "subtle",
10600
+ rhythm: "single",
10601
+ symmetry: "symmetrical"
10602
+ }
10603
+ };
10604
+ var boldWaveBoundaryOption = {
10605
+ id: asBoundaryOptionId("break:wave-bold"),
10606
+ label: "Bold wave",
10607
+ transitionAfter: "wave-edge-bold",
10608
+ treatment: {
10609
+ kind: "wave-edge",
10610
+ height: "large",
10611
+ amplitude: "bold",
10612
+ rhythm: "double",
10613
+ symmetry: "symmetrical"
10614
+ }
10615
+ };
10616
+ var driftWaveBoundaryOption = {
10617
+ id: asBoundaryOptionId("break:wave-drift"),
10618
+ label: "Drift wave",
10619
+ transitionAfter: "wave-edge-drift",
10620
+ treatment: {
10621
+ kind: "wave-edge",
10622
+ height: "medium",
10623
+ amplitude: "balanced",
10624
+ rhythm: "double",
10625
+ symmetry: "drift"
10626
+ }
10627
+ };
10628
+ var subtleAngleBoundaryOption = {
10629
+ id: asBoundaryOptionId("break:angle-subtle"),
10630
+ label: "Subtle angle",
10631
+ transitionAfter: "angle-edge-subtle",
10632
+ treatment: {
10633
+ kind: "angle-edge",
10634
+ height: "compact",
10635
+ slope: "subtle",
10636
+ direction: "forward"
10637
+ }
10638
+ };
10639
+ var balancedAngleBoundaryOption = {
10640
+ id: asBoundaryOptionId("break:angle-balanced"),
10641
+ label: "Balanced angle",
10642
+ transitionAfter: "angle-edge",
10643
+ treatment: {
10644
+ kind: "angle-edge",
10645
+ height: "medium",
10646
+ slope: "balanced",
10647
+ direction: "forward"
10648
+ }
10649
+ };
10650
+ var steepAngleBoundaryOption = {
10651
+ id: asBoundaryOptionId("break:angle-steep"),
10652
+ label: "Steep angle",
10653
+ transitionAfter: "angle-edge-steep",
10654
+ treatment: {
10655
+ kind: "angle-edge",
10656
+ height: "large",
10657
+ slope: "steep",
10658
+ direction: "forward"
10659
+ }
10660
+ };
10661
+
10662
+ // ../theme-core/src/site-styles/pageDesignIntent.ts
10663
+ var pageDesignIntentSchemaVersion = 2;
10664
+ var legacyPageDesignIntentSchemaVersion = 1;
10665
+ var unknownBoundaryOptionId = asBoundaryOptionId("break:unknown");
10479
10666
  var pageDesignUserPinnedAppearanceChoiceSchema = z5.object({
10480
10667
  kind: z5.literal("user-pinned"),
10481
10668
  value: z5.string().min(1).transform(asAppearancePresetId)
@@ -10484,17 +10671,84 @@ var pageDesignUserPinnedBoundaryChoiceSchema = z5.object({
10484
10671
  kind: z5.literal("user-pinned"),
10485
10672
  value: z5.string().min(1).transform(asBoundaryOptionId)
10486
10673
  }).strict();
10674
+ var pageDesignBoundaryTreatmentSchema = z5.discriminatedUnion("kind", [
10675
+ z5.object({ kind: z5.literal("none") }).strict(),
10676
+ z5.object({
10677
+ kind: z5.literal("soft-fade"),
10678
+ height: z5.enum(["compact", "medium", "large", "expansive"]),
10679
+ curve: z5.enum(["soft", "spacious", "expansive"])
10680
+ }).strict(),
10681
+ z5.object({
10682
+ kind: z5.literal("wave-edge"),
10683
+ height: z5.enum(["compact", "medium", "large"]),
10684
+ amplitude: z5.enum(["subtle", "balanced", "bold"]),
10685
+ rhythm: z5.enum(["single", "double"]),
10686
+ symmetry: z5.enum(["symmetrical", "asymmetrical", "drift"])
10687
+ }).strict(),
10688
+ z5.object({
10689
+ kind: z5.literal("angle-edge"),
10690
+ height: z5.enum(["compact", "medium", "large"]),
10691
+ slope: z5.enum(["subtle", "balanced", "steep"]),
10692
+ direction: z5.enum(["forward", "reverse"])
10693
+ }).strict(),
10694
+ z5.object({
10695
+ kind: z5.literal("legacy-unsupported"),
10696
+ boundaryOptionId: z5.string().min(1).transform(asBoundaryOptionId)
10697
+ }).strict()
10698
+ ]);
10699
+ var pageDesignUserPinnedBoundaryTreatmentChoiceSchema = z5.object({
10700
+ kind: z5.literal("user-pinned"),
10701
+ value: pageDesignBoundaryTreatmentSchema
10702
+ }).strict();
10487
10703
  var pageDesignBlockLookPinSchema = z5.object({
10488
10704
  blockId: z5.string().min(1).transform(asDesignBlockId),
10489
10705
  blockKind: z5.string().min(1),
10490
10706
  choice: pageDesignUserPinnedAppearanceChoiceSchema
10491
10707
  }).strict();
10492
10708
  var pageDesignBoundaryPinSchema = z5.object({
10709
+ boundaryId: z5.string().min(1).transform(asDesignBoundaryId),
10710
+ previousBlockId: z5.string().min(1).transform(asDesignBlockId),
10711
+ nextBlockId: z5.string().min(1).transform(asDesignBlockId),
10712
+ choice: pageDesignUserPinnedBoundaryTreatmentChoiceSchema
10713
+ }).strict().superRefine(validateBoundaryPinIdMatchesBlocks);
10714
+ var legacyPageDesignBoundaryPinSchema = z5.object({
10493
10715
  boundaryId: z5.string().min(1).transform(asDesignBoundaryId),
10494
10716
  previousBlockId: z5.string().min(1).transform(asDesignBlockId),
10495
10717
  nextBlockId: z5.string().min(1).transform(asDesignBlockId),
10496
10718
  choice: pageDesignUserPinnedBoundaryChoiceSchema
10497
- }).strict().superRefine((pin, ctx) => {
10719
+ }).strict().superRefine(validateBoundaryPinIdMatchesBlocks);
10720
+ var pageDesignIntentV1Schema = z5.object({
10721
+ schemaVersion: z5.literal(legacyPageDesignIntentSchemaVersion),
10722
+ siteStyleId: z5.string().min(1).transform(asSiteStyleId),
10723
+ pageFlowPresetId: z5.string().min(1).transform(asPageFlowPresetId),
10724
+ blockLookPins: z5.array(pageDesignBlockLookPinSchema),
10725
+ boundaryPins: z5.array(legacyPageDesignBoundaryPinSchema)
10726
+ }).strict().superRefine(validateUniquePageDesignPins);
10727
+ var pageDesignIntentV2Schema = z5.object({
10728
+ schemaVersion: z5.literal(pageDesignIntentSchemaVersion),
10729
+ siteStyleId: z5.string().min(1).transform(asSiteStyleId),
10730
+ pageFlowPresetId: z5.string().min(1).transform(asPageFlowPresetId),
10731
+ blockLookPins: z5.array(pageDesignBlockLookPinSchema),
10732
+ boundaryPins: z5.array(pageDesignBoundaryPinSchema)
10733
+ }).strict().superRefine(validateUniquePageDesignPins);
10734
+ function addDuplicateStringIssues(ctx, input) {
10735
+ const seen = /* @__PURE__ */ new Set();
10736
+ const duplicates = /* @__PURE__ */ new Set();
10737
+ for (const value of input.values) {
10738
+ if (seen.has(value)) {
10739
+ duplicates.add(value);
10740
+ }
10741
+ seen.add(value);
10742
+ }
10743
+ for (const duplicate of duplicates) {
10744
+ ctx.addIssue({
10745
+ code: z5.ZodIssueCode.custom,
10746
+ path: [...input.path],
10747
+ message: `Duplicate ${input.label}: ${duplicate}.`
10748
+ });
10749
+ }
10750
+ }
10751
+ function validateBoundaryPinIdMatchesBlocks(pin, ctx) {
10498
10752
  const expectedBoundaryId = makeBoundaryId(
10499
10753
  pin.previousBlockId,
10500
10754
  pin.nextBlockId
@@ -10506,14 +10760,8 @@ var pageDesignBoundaryPinSchema = z5.object({
10506
10760
  message: `Boundary id must match previousBlockId and nextBlockId. Expected ${expectedBoundaryId}.`
10507
10761
  });
10508
10762
  }
10509
- });
10510
- var pageDesignIntentV1Schema = z5.object({
10511
- schemaVersion: z5.literal(pageDesignIntentSchemaVersion),
10512
- siteStyleId: z5.string().min(1).transform(asSiteStyleId),
10513
- pageFlowPresetId: z5.string().min(1).transform(asPageFlowPresetId),
10514
- blockLookPins: z5.array(pageDesignBlockLookPinSchema),
10515
- boundaryPins: z5.array(pageDesignBoundaryPinSchema)
10516
- }).strict().superRefine((intent, ctx) => {
10763
+ }
10764
+ function validateUniquePageDesignPins(intent, ctx) {
10517
10765
  addDuplicateStringIssues(ctx, {
10518
10766
  values: intent.blockLookPins.map((pin) => pin.blockId),
10519
10767
  path: ["blockLookPins"],
@@ -10526,23 +10774,6 @@ var pageDesignIntentV1Schema = z5.object({
10526
10774
  path: ["boundaryPins"],
10527
10775
  label: "boundary pin"
10528
10776
  });
10529
- });
10530
- function addDuplicateStringIssues(ctx, input) {
10531
- const seen = /* @__PURE__ */ new Set();
10532
- const duplicates = /* @__PURE__ */ new Set();
10533
- for (const value of input.values) {
10534
- if (seen.has(value)) {
10535
- duplicates.add(value);
10536
- }
10537
- seen.add(value);
10538
- }
10539
- for (const duplicate of duplicates) {
10540
- ctx.addIssue({
10541
- code: z5.ZodIssueCode.custom,
10542
- path: [...input.path],
10543
- message: `Duplicate ${input.label}: ${duplicate}.`
10544
- });
10545
- }
10546
10777
  }
10547
10778
  function boundaryKey(previousBlockId, nextBlockId) {
10548
10779
  return makeBoundaryId(previousBlockId, nextBlockId);
@@ -10801,7 +11032,9 @@ var buttonBorderSchema = z7.object({
10801
11032
  var variantShadowSchema = z7.object({
10802
11033
  elevation: z7.enum(["none", "low", "medium", "high"]),
10803
11034
  softness: z7.enum(["crisp", "soft", "hard"]).nullable(),
10804
- position: z7.enum(["bottom", "bottom-right"]).default("bottom")
11035
+ position: z7.enum(["bottom", "bottom-right"]).default("bottom"),
11036
+ // Optional palette token for a coloured offset shadow; omit for neutral black.
11037
+ colorToken: themeColorTokenSchema.optional()
10805
11038
  });
10806
11039
  var variantEffectsSchema = z7.object({
10807
11040
  base: z7.array(effectApplicationSchema).optional(),
@@ -11325,6 +11558,65 @@ var inkStamp = defineButtonPersonality({
11325
11558
  }
11326
11559
  });
11327
11560
 
11561
+ // ../theme-core/src/buttons/personalities/joy-stamp.ts
11562
+ var joyStamp = defineButtonPersonality({
11563
+ id: "joy-stamp",
11564
+ name: "Joy Stamp",
11565
+ description: "Pill buttons with a hard, brand-coloured offset shadow that presses in on hover.",
11566
+ tags: { tone: "bold", energy: "vibrant", motion: "expressive", era: "organic" },
11567
+ buttonSystem: {
11568
+ global: {
11569
+ cornerStyle: "pill",
11570
+ shadow: "high",
11571
+ textTransform: "none",
11572
+ // Bold display type on the buttons: use the heading font (Bricolage) at
11573
+ // 700, matching the mockup's chunky button labels.
11574
+ typography: "heading",
11575
+ fontWeight: 700,
11576
+ borderWidth: 2,
11577
+ hoverTransform: "none",
11578
+ hoverColor: "none"
11579
+ },
11580
+ sizes: {
11581
+ sm: { padding: "0.625rem 1.25rem", fontSize: "text-sm" },
11582
+ md: { padding: "0.875rem 1.75rem", fontSize: "text-base" },
11583
+ lg: { padding: "1.125rem 2.25rem", fontSize: "text-lg" },
11584
+ xl: { padding: "1.25rem 2.75rem", fontSize: "text-xl" }
11585
+ },
11586
+ variants: [
11587
+ {
11588
+ id: "primary",
11589
+ name: "Primary",
11590
+ enabled: true,
11591
+ priority: 1,
11592
+ background: { type: "solid", colorToken: "primary" },
11593
+ textColorToken: "primaryForeground",
11594
+ borderRadius: "rounded-full",
11595
+ // Cream stamp shadow under the burnt-orange fill.
11596
+ shadow: { elevation: "high", softness: "hard", position: "bottom-right", colorToken: "text" },
11597
+ effects: {
11598
+ hover: [{ effectId: "press-down" }]
11599
+ }
11600
+ },
11601
+ {
11602
+ id: "secondary",
11603
+ name: "Secondary",
11604
+ enabled: true,
11605
+ priority: 2,
11606
+ background: { type: "transparent" },
11607
+ textColorToken: "text",
11608
+ borderRadius: "rounded-full",
11609
+ border: { widthClass: "border-2", colorToken: "text" },
11610
+ // Brown stamp shadow under the cream outline.
11611
+ shadow: { elevation: "high", softness: "hard", position: "bottom-right", colorToken: "secondary" },
11612
+ effects: {
11613
+ hover: [{ effectId: "press-down" }]
11614
+ }
11615
+ }
11616
+ ]
11617
+ }
11618
+ });
11619
+
11328
11620
  // ../theme-core/src/buttons/personalities/pebble.ts
11329
11621
  var pebble = defineButtonPersonality({
11330
11622
  id: "pebble",
@@ -11598,7 +11890,8 @@ var buttonPersonalities = [
11598
11890
  pebble,
11599
11891
  inkStamp,
11600
11892
  brushedWash,
11601
- showtimePill
11893
+ showtimePill,
11894
+ joyStamp
11602
11895
  ];
11603
11896
  var personalitiesById = new Map(
11604
11897
  buttonPersonalities.map((p) => [p.id, p])
@@ -12469,7 +12762,9 @@ var boxBackgroundSchema = z22.object({
12469
12762
  motion: z22.enum(["static", "fixed-frame"]).nullable().optional(),
12470
12763
  overlay: boxBackgroundOverlaySchema.nullable().optional(),
12471
12764
  textColor: tokenOrCssColorValueSchema.nullable().optional(),
12472
- headingColor: tokenOrCssColorValueSchema.nullable().optional()
12765
+ headingColor: tokenOrCssColorValueSchema.nullable().optional(),
12766
+ linkColor: tokenOrCssColorValueSchema.nullable().optional(),
12767
+ supportingColor: tokenOrCssColorValueSchema.nullable().optional()
12473
12768
  });
12474
12769
  var noHeadingDecorationSchema = z22.object({
12475
12770
  family: z22.literal("none")
@@ -12532,7 +12827,8 @@ var cardStylesOverrideSchema = z22.object({
12532
12827
  "editorial-rule",
12533
12828
  "soft-panel",
12534
12829
  "editorial-serif-quote",
12535
- "editorial-open"
12830
+ "editorial-open",
12831
+ "color-blocked"
12536
12832
  ]).nullable().optional(),
12537
12833
  // Which site-style card variant the card adopts (emits a `.card-{id}` class).
12538
12834
  // 'none' is boxless. Driven by the block look via testimonialCardTreatment.
@@ -13357,6 +13653,30 @@ var warmNeutralForest = definePaletteVariant({
13357
13653
  ]
13358
13654
  });
13359
13655
 
13656
+ // ../theme-core/src/palette/variants/warm-dark.ts
13657
+ var warmDarkEmber = definePaletteVariant({
13658
+ id: "warm-dark-ember",
13659
+ name: "Warm Dark \u2014 Ember",
13660
+ description: "Deep clay-brown ground with burnt-orange accent and warm cream text.",
13661
+ tags: { tone: "bold", energy: "vibrant", era: "organic" },
13662
+ mode: "dark",
13663
+ colors: [
13664
+ { name: "primary", hex: "#ce612f" },
13665
+ { name: "secondary", hex: "#894e31" },
13666
+ { name: "accent", hex: "#ce612f" },
13667
+ { name: "success", hex: "#6f8f57" },
13668
+ { name: "warning", hex: "#c98a3c" },
13669
+ { name: "destructive", hex: "#c0492f" },
13670
+ { name: "background", hex: "#4f2415" },
13671
+ { name: "surface", hex: "#5c3320" },
13672
+ { name: "surfaceAlt", hex: "#693a25" },
13673
+ { name: "muted", hex: "#6a3d27" },
13674
+ { name: "text", hex: "#f0e1d0" },
13675
+ { name: "primaryForeground", hex: "#4f2415" },
13676
+ { name: "border", hex: "#894e31" }
13677
+ ]
13678
+ });
13679
+
13360
13680
  // ../theme-core/src/palette/variants/index.ts
13361
13681
  var paletteVariants = [
13362
13682
  // Brand-led family
@@ -13377,7 +13697,9 @@ var paletteVariants = [
13377
13697
  softNaturalSage,
13378
13698
  softNaturalStone,
13379
13699
  softNaturalWatercolor,
13380
- softNaturalLilac
13700
+ softNaturalLilac,
13701
+ // Warm-dark family (dark mode)
13702
+ warmDarkEmber
13381
13703
  ];
13382
13704
  var paletteVariantsById = new Map(
13383
13705
  paletteVariants.map((v) => [v.id, v])
@@ -13658,6 +13980,32 @@ var clarityZenCardSystem = {
13658
13980
  }
13659
13981
  ]
13660
13982
  };
13983
+ var originalJoyCardSystem = {
13984
+ variants: [
13985
+ {
13986
+ id: "default",
13987
+ name: "Default",
13988
+ enabled: true,
13989
+ priority: 1,
13990
+ background: { type: "solid", colorToken: "surface" },
13991
+ foregroundToken: "text",
13992
+ spacing: "comfortable",
13993
+ corners: "rounded",
13994
+ shadow: { elevation: "none", softness: null, position: "bottom" }
13995
+ },
13996
+ {
13997
+ id: "alternative",
13998
+ name: "Statement",
13999
+ enabled: true,
14000
+ priority: 2,
14001
+ background: { type: "solid", colorToken: "primary" },
14002
+ foregroundToken: "primaryForeground",
14003
+ spacing: "comfortable",
14004
+ corners: "rounded",
14005
+ shadow: { elevation: "none", softness: null, position: "bottom" }
14006
+ }
14007
+ ]
14008
+ };
13661
14009
 
13662
14010
  // ../theme-core/src/site-styles/testimonialQuotePresets.ts
13663
14011
  var serifDisplayQuote = {
@@ -13778,7 +14126,7 @@ function baseHeader(theme) {
13778
14126
  navContainer: { type: "none", tint: null, opacity: 0.15 }
13779
14127
  };
13780
14128
  }
13781
- var headerLayoutCatalog = [
14129
+ var headerLayoutCatalog = defineExactCatalog()([
13782
14130
  {
13783
14131
  id: asHeaderLayoutId("classic"),
13784
14132
  label: "Classic",
@@ -13810,11 +14158,11 @@ var headerLayoutCatalog = [
13810
14158
  maxRecommendedNavItems: 5,
13811
14159
  allowedLogoShapes: ["none", "text-only", "horizontal"]
13812
14160
  }
13813
- ];
14161
+ ]);
13814
14162
  function supportedLayouts(ids) {
13815
14163
  return ids.map(asHeaderLayoutId);
13816
14164
  }
13817
- var headerStyleCatalog = [
14165
+ var headerStyleCatalog = defineExactCatalog()([
13818
14166
  {
13819
14167
  id: asHeaderStyleId("minimal"),
13820
14168
  label: "Minimal",
@@ -13969,7 +14317,7 @@ var headerStyleCatalog = [
13969
14317
  navTypography: "heading",
13970
14318
  moods: ["calm", "editorial"]
13971
14319
  }
13972
- ];
14320
+ ]);
13973
14321
  var headerLayoutsById = new Map(
13974
14322
  headerLayoutCatalog.map((layout) => [layout.id, layout])
13975
14323
  );
@@ -14082,7 +14430,7 @@ var headerStyleRepairOrder = /* @__PURE__ */ new Map(
14082
14430
  [asHeaderStyleId("minimal"), headerStyleRepairChain(["minimal"])]
14083
14431
  ]
14084
14432
  );
14085
- var legacyHeaderLookAliases = [
14433
+ var legacyHeaderLookAliases = defineExactCatalog()([
14086
14434
  {
14087
14435
  lookId: asHeaderLookId("clean-base"),
14088
14436
  selection: {
@@ -14139,7 +14487,7 @@ var legacyHeaderLookAliases = [
14139
14487
  styleId: asHeaderStyleId("glass")
14140
14488
  }
14141
14489
  }
14142
- ];
14490
+ ]);
14143
14491
  var legacyHeaderLookAliasesById = new Map(legacyHeaderLookAliases.map((alias) => [alias.lookId, alias]));
14144
14492
  function getHeaderStyle(id) {
14145
14493
  return headerStylesById.get(id) ?? null;
@@ -14176,7 +14524,7 @@ function themedHeaderShadow(theme) {
14176
14524
  case "high":
14177
14525
  return { elevation: "lg" };
14178
14526
  default:
14179
- return assertNever(
14527
+ return assertNever2(
14180
14528
  theme.shadow.elevation,
14181
14529
  "Unhandled theme shadow elevation"
14182
14530
  );
@@ -14293,6 +14641,12 @@ function serifLineHeader(theme) {
14293
14641
  letterSpacing: "wide",
14294
14642
  gradient: false
14295
14643
  },
14644
+ border: {
14645
+ style: "solid",
14646
+ width: "none",
14647
+ position: "none"
14648
+ },
14649
+ shadow: { elevation: "none" },
14296
14650
  ctaTreatment: "outline",
14297
14651
  ctaVariant: resolveHeaderCtaVariant(theme, "outline"),
14298
14652
  ctaGap: "relaxed"
@@ -14417,7 +14771,7 @@ function floatingGlassHeader(theme) {
14417
14771
  }
14418
14772
  };
14419
14773
  }
14420
- var headerLookCatalog = [
14774
+ var headerLookCatalog = defineExactCatalog()([
14421
14775
  {
14422
14776
  id: asHeaderLookId("clean-base"),
14423
14777
  label: "Clean base",
@@ -14535,7 +14889,7 @@ var headerLookCatalog = [
14535
14889
  logoAccommodations: overlayLogoAccommodations,
14536
14890
  compile: floatingGlassHeader
14537
14891
  }
14538
- ];
14892
+ ]);
14539
14893
  var guaranteedFallbackHeaderLookId = asHeaderLookId("clean-base");
14540
14894
  var guaranteedFallbackHeaderLayoutId = asHeaderLayoutId("classic");
14541
14895
  var guaranteedFallbackHeaderStyleId = asHeaderStyleId("minimal");
@@ -14701,7 +15055,7 @@ function editorialColumnsFooter(theme) {
14701
15055
  }
14702
15056
  };
14703
15057
  }
14704
- var footerLookCatalog = [
15058
+ var footerLookCatalog = defineExactCatalog()([
14705
15059
  {
14706
15060
  id: asFooterLookId("footer-muted-grounding"),
14707
15061
  label: "Muted grounding footer",
@@ -14724,7 +15078,7 @@ var footerLookCatalog = [
14724
15078
  allowedContentPresence: ["default-footer", "default-and-blocks"],
14725
15079
  compile: brandTwoBandFooter
14726
15080
  }
14727
- ];
15081
+ ]);
14728
15082
  var footerLooksById = new Map(
14729
15083
  footerLookCatalog.map((look) => [look.id, look])
14730
15084
  );
@@ -14746,7 +15100,7 @@ var generatedDesignOptionCatalog = {
14746
15100
  source: "generated",
14747
15101
  sectionSurfaces: ["base", "muted-band", "accent-band", "brand-depth-band", "hero-image"],
14748
15102
  contentFrames: generatedContentFrames,
14749
- itemSurfaces: ["none", "default", "flat", "outlined", "raised", "inset", "editorial"],
15103
+ itemSurfaces: ["none", "default", "flat", "outlined", "raised", "inset", "editorial", "color-blocked"],
14750
15104
  transitions: ["none", "soft-fade-short", "soft-fade-long"],
14751
15105
  emphases: ["low", "medium", "high"],
14752
15106
  detachedCustom: false
@@ -14758,8 +15112,15 @@ var userDesignOptionCatalog = {
14758
15112
  itemSurfaces: generatedDesignOptionCatalog.itemSurfaces,
14759
15113
  transitions: [
14760
15114
  ...generatedDesignOptionCatalog.transitions,
15115
+ "soft-fade-expansive",
14761
15116
  "wave-edge",
14762
- "angle-edge"
15117
+ "wave-edge-balanced",
15118
+ "wave-edge-gentle",
15119
+ "wave-edge-bold",
15120
+ "wave-edge-drift",
15121
+ "angle-edge",
15122
+ "angle-edge-subtle",
15123
+ "angle-edge-steep"
14763
15124
  ],
14764
15125
  emphases: generatedDesignOptionCatalog.emphases,
14765
15126
  detachedCustom: false
@@ -14940,6 +15301,29 @@ var boldDisplayTypography = {
14940
15301
  },
14941
15302
  scale: "balanced"
14942
15303
  };
15304
+ var originalJoyTypography = {
15305
+ body: {
15306
+ family: "DM Sans, system-ui, sans-serif",
15307
+ size: "md",
15308
+ weight: "regular",
15309
+ lineHeight: "relaxed",
15310
+ letterSpacing: "normal"
15311
+ },
15312
+ headings: {
15313
+ default: {
15314
+ family: "Bricolage Grotesque, system-ui, sans-serif",
15315
+ weight: "bold",
15316
+ lineHeight: "normal",
15317
+ letterSpacing: "tight",
15318
+ italic: null,
15319
+ case: null
15320
+ },
15321
+ h1: { size: "2xl", weight: "bold", lineHeight: "normal", letterSpacing: "tight", italic: null },
15322
+ h2: { size: "xl", weight: "bold", lineHeight: "normal", letterSpacing: "tight", italic: null },
15323
+ h3: { size: "lg", weight: "bold", lineHeight: "normal", letterSpacing: "tight", italic: null }
15324
+ },
15325
+ scale: "balanced"
15326
+ };
14943
15327
  var typographyPresets = [
14944
15328
  defineTypographyPreset({
14945
15329
  id: "typography-preset:modern-sans",
@@ -15026,6 +15410,32 @@ var typographyPresets = [
15026
15410
  mobile: { headlineSize: "4xl", subheadlineSize: "xl" }
15027
15411
  }
15028
15412
  }
15413
+ }),
15414
+ defineTypographyPreset({
15415
+ id: "typography-preset:original-joy",
15416
+ name: "Original Joy",
15417
+ description: "Bold Bricolage Grotesque display headings over a clean DM Sans body, editorial and warm.",
15418
+ defaultFonts: { body: "DM Sans, system-ui, sans-serif", heading: "Bricolage Grotesque, system-ui, sans-serif" },
15419
+ recommendedFonts: {
15420
+ body: ["DM Sans", "Inter", "Manrope"],
15421
+ heading: ["Bricolage Grotesque", "Space Grotesk", "Archivo"]
15422
+ },
15423
+ slotPolicies: { body: bodyReadablePolicy, heading: displayHeadingPolicy },
15424
+ typography: originalJoyTypography,
15425
+ heroTypography: {
15426
+ headlineSize: "6xl",
15427
+ headlineLineHeight: "tight",
15428
+ subheadlineSize: "xl",
15429
+ subheadlineLineHeight: "normal",
15430
+ microHeadlineSize: "6xl",
15431
+ microHeadlineLineHeight: "tight",
15432
+ microSubheadlineSize: "lg",
15433
+ microSubheadlineLineHeight: "normal",
15434
+ responsive: {
15435
+ tablet: { headlineSize: "5xl" },
15436
+ mobile: { headlineSize: "4xl", subheadlineSize: "lg" }
15437
+ }
15438
+ }
15029
15439
  })
15030
15440
  ];
15031
15441
  var typographyPresetsById = new Map(
@@ -15049,7 +15459,8 @@ var curatedSiteStyleIdValues = [
15049
15459
  "site-style:clarity-zen-blue",
15050
15460
  SOFT_EARTH_SITE_STYLE_ID_VALUE,
15051
15461
  "site-style:bold-launch",
15052
- "site-style:south-west-twerk-school"
15462
+ "site-style:south-west-twerk-school",
15463
+ "site-style:original-joy"
15053
15464
  ];
15054
15465
  var quietBudget = {
15055
15466
  accentDensity: "low",
@@ -16095,7 +16506,7 @@ var curatedSiteStyles = [
16095
16506
  "body-text-editorial-intro",
16096
16507
  "schedule-details-brand-depth",
16097
16508
  "testimonials-statement-cards",
16098
- "contact-form-brand-depth-card"
16509
+ "contact-form-panel"
16099
16510
  ],
16100
16511
  recommendedHeaderLookIds: [
16101
16512
  "brand-solid",
@@ -16118,6 +16529,74 @@ var curatedSiteStyles = [
16118
16529
  paletteChoice("brand-led-warm"),
16119
16530
  paletteChoice("high-contrast-ink")
16120
16531
  ]
16532
+ }),
16533
+ defineCuratedSiteStyle({
16534
+ id: "site-style:original-joy",
16535
+ name: "Original Joy",
16536
+ headingDecoration: { family: "organic-squiggle", colorToken: "primary" },
16537
+ description: "Warm, dark, and editorial: deep clay grounds, cream type, and bold burnt-orange accents for soulful community brands.",
16538
+ generationBrief: "Use a deep brown ground with cream text and burnt-orange accents, large display headings, generous spacing, organic rounded shapes, and bold colour-blocked feature sections. Lead with warmth and belonging; calls to action should feel strong but unhurried.",
16539
+ tokenRecipes: {
16540
+ palette: "brand-led",
16541
+ contrast: "maximum",
16542
+ radius: "rounded",
16543
+ shadow: "subtle",
16544
+ typography: "clean-sans",
16545
+ spacing: "airy",
16546
+ motion: "expressive"
16547
+ },
16548
+ compositionBudget: expressiveBudget,
16549
+ typographyPresetChoices: [
16550
+ typographyChoice("typography-preset:original-joy"),
16551
+ typographyChoice("typography-preset:bold-display"),
16552
+ typographyChoice("typography-preset:modern-sans")
16553
+ ],
16554
+ defaultTypographyPresetId: "typography-preset:original-joy",
16555
+ themeOverrides: {
16556
+ accordions: boldBorderedAccordionSystem,
16557
+ // Shared card system: warm rounded brown cards (event + testimonial cards
16558
+ // pick this up automatically) with a burnt-orange statement variant.
16559
+ cards: originalJoyCardSystem,
16560
+ testimonialQuote: accentGlyphQuote,
16561
+ bodyText: {
16562
+ intro: {
16563
+ paragraphSize: "editorial",
16564
+ headingSize: "editorial"
16565
+ }
16566
+ }
16567
+ },
16568
+ // Recommended block looks: the bold colour-blocked feature cards, a calm
16569
+ // band for the events spotlight, and statement testimonial cards.
16570
+ recommendedAppearancePresetIds: [
16571
+ "feature-cards-bold-colors",
16572
+ "offerings-calm-list",
16573
+ "testimonials-statement-cards"
16574
+ ],
16575
+ // Floating, transparent "Clear Split" header (no fill behind the nav links).
16576
+ defaultHeaderSelection: { layoutId: "floating", styleId: "minimal-surface" },
16577
+ recommendedHeaderLayoutChoices: [headerLayoutChoice("floating")],
16578
+ recommendedHeaderStyleChoicesByLayout: {
16579
+ floating: [
16580
+ headerStyleChoice("minimal-surface"),
16581
+ headerStyleChoice("split-glass"),
16582
+ headerStyleChoice("glass")
16583
+ ]
16584
+ },
16585
+ // Legacy bridge only (the real curation is the explicit selection above).
16586
+ // Kept to a reserved-space, non-overlay look on purpose: the split hero
16587
+ // flows below the Clear Split header, so we must NOT trigger the immersive
16588
+ // overlay-hero promotion that looks like `floating-glass` would force.
16589
+ recommendedHeaderLookIds: ["minimal-transparent"],
16590
+ recommendedFooterLookIds: [
16591
+ "site-footer-brand-two-band",
16592
+ "footer-muted-grounding"
16593
+ ],
16594
+ buttonPersonalityChoices: [
16595
+ buttonChoice("joy-stamp"),
16596
+ buttonChoice("ink-stamp"),
16597
+ buttonChoice("showtime-pill")
16598
+ ],
16599
+ paletteVariantChoices: [paletteChoice("warm-dark-ember")]
16121
16600
  })
16122
16601
  ];
16123
16602
  var curatedSiteStylesById = new Map(
@@ -16133,26 +16612,6 @@ var microHeroLayoutVariantKey = asLayoutVariantKey("micro");
16133
16612
  var waveBoundaryOptionId = asBoundaryOptionId("break:wave");
16134
16613
 
16135
16614
  // ../theme-core/src/site-styles/pageDesignEditorModel.ts
16136
- var noneBoundaryOption = {
16137
- id: asBoundaryOptionId("break:none"),
16138
- label: "None",
16139
- transitionAfter: "none"
16140
- };
16141
- var softBoundaryOption = {
16142
- id: asBoundaryOptionId("break:soft"),
16143
- label: "Soft",
16144
- transitionAfter: "soft-fade-short"
16145
- };
16146
- var waveBoundaryOption = {
16147
- id: asBoundaryOptionId("break:wave"),
16148
- label: "Wave",
16149
- transitionAfter: "wave-edge"
16150
- };
16151
- var spaciousBoundaryOption = {
16152
- id: asBoundaryOptionId("break:spacious"),
16153
- label: "Spacious",
16154
- transitionAfter: "soft-fade-long"
16155
- };
16156
16615
  var pageFlowPresets = [
16157
16616
  {
16158
16617
  id: asPageFlowPresetId("flow:quiet"),
@@ -16422,8 +16881,7 @@ var defaultDesignRuntimeRules = defineDesignRuntimeRules({
16422
16881
  type: "image",
16423
16882
  opacity: 1,
16424
16883
  position: "center center",
16425
- textColor: "text",
16426
- headingColor: "text"
16884
+ ...uniformSectionForeground("text")
16427
16885
  }
16428
16886
  }
16429
16887
  },
@@ -16533,9 +16991,30 @@ var defaultComponentRuntimeRules = defineComponentRuntimeRules({
16533
16991
  border: {
16534
16992
  enabled: false
16535
16993
  }
16994
+ },
16995
+ "color-blocked": {
16996
+ // Bold, flat colour-blocked cards. The per-card background colour cycle
16997
+ // (by position) and staggered offset live in
16998
+ // blocks-static/card-treatments.css; here we set the shared shape:
16999
+ // generous padding, large radius, no border, flat (no shadow).
17000
+ treatment: "color-blocked",
17001
+ spacing: "spacious",
17002
+ rounded: "2xl",
17003
+ raised: false,
17004
+ border: {
17005
+ enabled: false
17006
+ }
16536
17007
  }
16537
17008
  }
16538
17009
  });
17010
+ function uniformSectionForeground(token) {
17011
+ return {
17012
+ textColor: token,
17013
+ headingColor: token,
17014
+ linkColor: token,
17015
+ supportingColor: token
17016
+ };
17017
+ }
16539
17018
 
16540
17019
  // ../theme-core/src/site-styles/generatedSchemas.ts
16541
17020
  import { z as z25 } from "zod";
@@ -18284,6 +18763,37 @@ function resolveBackgroundColorValue(value, context) {
18284
18763
  });
18285
18764
  }
18286
18765
 
18766
+ // ../blocks/src/system/transforms/registry/_utils/sectionForegroundStyles.ts
18767
+ function readColorToken(input, key) {
18768
+ const value = input[key];
18769
+ return typeof value === "string" && value.trim().length > 0 ? value.trim() : null;
18770
+ }
18771
+ function resolveOptionalForegroundColor(value, context) {
18772
+ if (!value) return null;
18773
+ return resolveBackgroundColorValue(value, context);
18774
+ }
18775
+ function resolveSectionForegroundStyles(value, context) {
18776
+ if (!value || typeof value !== "object") {
18777
+ return {};
18778
+ }
18779
+ const input = value;
18780
+ const textColor = readColorToken(input, "textColor");
18781
+ const resolvedText = resolveOptionalForegroundColor(textColor, context);
18782
+ if (!resolvedText) {
18783
+ return {};
18784
+ }
18785
+ const resolvedHeading = resolveOptionalForegroundColor(readColorToken(input, "headingColor"), context) ?? resolvedText;
18786
+ const resolvedLink = resolveOptionalForegroundColor(readColorToken(input, "linkColor"), context) ?? resolvedText;
18787
+ const resolvedSupporting = resolveOptionalForegroundColor(readColorToken(input, "supportingColor"), context) ?? resolvedText;
18788
+ return {
18789
+ color: resolvedText,
18790
+ "--section-text-color": resolvedText,
18791
+ "--section-heading-color": resolvedHeading,
18792
+ "--section-link-color": resolvedLink,
18793
+ "--section-supporting-color": resolvedSupporting
18794
+ };
18795
+ }
18796
+
18287
18797
  // ../blocks/src/system/transforms/registry/boxStyles.ts
18288
18798
  var spacingTransform = {
18289
18799
  id: "boxStyles.spacing",
@@ -18418,6 +18928,8 @@ var boxStylesCompositeTransform = {
18418
18928
  classes.push("rb-card-treatment-editorial-serif-quote");
18419
18929
  } else if (input.treatment === "editorial-open") {
18420
18930
  classes.push("rb-card-treatment-editorial-open");
18931
+ } else if (input.treatment === "color-blocked") {
18932
+ classes.push("rb-card-treatment-color-blocked");
18421
18933
  }
18422
18934
  const cardVariant = normalizeBoxStylesCardVariant(input.cardVariant);
18423
18935
  if (cardVariant && cardVariant !== "none") {
@@ -18693,35 +19205,8 @@ var sectionHeadingColorStyleTransform = {
18693
19205
  var sectionColorsStyleTransform = {
18694
19206
  id: "sectionStyles.resolveColorsStyle",
18695
19207
  kind: "formatter",
18696
- summary: "Resolve section text and heading colors into a style object",
18697
- run: (value, _options, context) => {
18698
- if (!value || typeof value !== "object") {
18699
- return {};
18700
- }
18701
- const bg = value;
18702
- const textColor = typeof bg.textColor === "string" ? bg.textColor.trim() : null;
18703
- const headingColor = typeof bg.headingColor === "string" ? bg.headingColor.trim() : null;
18704
- const style = {};
18705
- if (textColor) {
18706
- const resolvedText = resolveBackgroundColorValue(textColor, context);
18707
- if (resolvedText) {
18708
- style.color = resolvedText;
18709
- style["--section-text-color"] = resolvedText;
18710
- if (headingColor) {
18711
- const resolvedHeading = resolveBackgroundColorValue(
18712
- headingColor,
18713
- context
18714
- );
18715
- if (resolvedHeading) {
18716
- style["--section-heading-color"] = resolvedHeading;
18717
- }
18718
- } else {
18719
- style["--section-heading-color"] = resolvedText;
18720
- }
18721
- }
18722
- }
18723
- return style;
18724
- }
19208
+ summary: "Resolve section foreground colors into a style object",
19209
+ run: (value, _options, context) => resolveSectionForegroundStyles(value, context)
18725
19210
  };
18726
19211
  var GAP_CLASS_MAP = {
18727
19212
  none: "rb-gap-semantic-none",
@@ -19033,46 +19518,6 @@ function sectionState(opts) {
19033
19518
  );
19034
19519
  }
19035
19520
 
19036
- // ../blocks/src/system/node/fragments/headingDecoration.ts
19037
- var defaultBindFrom = "_sectionStyles.headingDecoration";
19038
- function headingDecoration({
19039
- bindFrom = defaultBindFrom,
19040
- className
19041
- } = {}) {
19042
- return el(
19043
- "div",
19044
- // Full-width block row so the mark inherits the heading's alignment. The
19045
- // heading stacks are flexbox; `text-align` positions inline content, not flex
19046
- // items, so the inline-block mark must sit inside a stretched block for a
19047
- // centred heading to centre it (and a left heading to keep it at the start).
19048
- { "aria-hidden": "true", className: "rb-heading-decoration-row" },
19049
- [
19050
- el("div", {
19051
- className: {
19052
- $bind: {
19053
- from: bindFrom,
19054
- transforms: [
19055
- {
19056
- id: "ui.headingDecorationClassName",
19057
- options: { baseClass: className }
19058
- }
19059
- ]
19060
- }
19061
- }
19062
- })
19063
- ],
19064
- // Gate on the presence of `family`. The render-time theme projection omits
19065
- // `headingDecoration` entirely for absent/none signatures, so the
19066
- // dominant "no decoration" case is absent → falsy → not rendered. A presence
19067
- // check (rather than `family !== 'none'`) is deliberate: `when`'s only
19068
- // negation form would render on *absent* values, which would emit a stub on
19069
- // every undecorated heading. The remaining edge — hand-authored content with
19070
- // an explicit `{ family: 'none' }` — renders an aria-hidden `rb-hidden`
19071
- // (display:none) stub with no visual or layout impact.
19072
- when(`${bindFrom}.family`)
19073
- );
19074
- }
19075
-
19076
19521
  // ../blocks/src/system/fragments/types.ts
19077
19522
  import { z as z28 } from "zod";
19078
19523
  var FRAGMENT_ID_PATTERN = /^[a-z0-9](?:[a-z0-9._-]*[a-z0-9])?$/i;
@@ -19545,6 +19990,9 @@ var heroCopyFragment = defineFragment({
19545
19990
  maxLength: 600
19546
19991
  }
19547
19992
  ],
19993
+ // Layout order is [eyebrow, headline, subheadline]. The hero block's
19994
+ // `splitEditorial` variant reads these nodes by index; keep the order stable
19995
+ // (it fails fast at import if the count changes).
19548
19996
  layout: [
19549
19997
  text(
19550
19998
  {
@@ -19767,6 +20215,7 @@ var heroCtaRowFragment = defineFragment({
19767
20215
  ctaRow({
19768
20216
  collectionPath: "content.ctas",
19769
20217
  itemName: "cta",
20218
+ gap: "md",
19770
20219
  justify: {
19771
20220
  $bind: {
19772
20221
  from: "content",
@@ -19852,7 +20301,6 @@ var testimonialsHeadingFragment = defineFragment({
19852
20301
  when("content.heading"),
19853
20302
  bind("content.heading")
19854
20303
  ),
19855
- headingDecoration(),
19856
20304
  text(
19857
20305
  {
19858
20306
  as: "p",
@@ -20483,7 +20931,7 @@ var blogFeaturedPostFragment = defineFragment({
20483
20931
  });
20484
20932
 
20485
20933
  // ../blocks/src/system/fragments/library/faqHeading.ts
20486
- function faqHeadingLayout(options = {}) {
20934
+ function faqHeadingLayout() {
20487
20935
  return stack(
20488
20936
  {
20489
20937
  gap: "sm",
@@ -20508,7 +20956,6 @@ function faqHeadingLayout(options = {}) {
20508
20956
  when("content.title"),
20509
20957
  bind("content.title")
20510
20958
  ),
20511
- ...options.decorated ? [headingDecoration()] : [],
20512
20959
  richText(
20513
20960
  {
20514
20961
  className: "faq-description rb-prose rb-mx-auto rb-max-w-none",
@@ -20550,7 +20997,6 @@ var faqHeadingFragment = defineFragment({
20550
20997
  ],
20551
20998
  layout: faqHeadingLayout()
20552
20999
  });
20553
- var decoratedFaqHeadingLayout = faqHeadingLayout({ decorated: true });
20554
21000
 
20555
21001
  // ../blocks/src/system/fragments/library/faqAccordion.ts
20556
21002
  function createFaqAccordionLayout(options = {}) {
@@ -21707,12 +22153,38 @@ function splitLayoutWith(children) {
21707
22153
  var splitContentColumn = heroContentWrapper(heroContentNodes, "md", "rb-w-full rb-text-left");
21708
22154
  var splitImageColumn = heroSplitImagePane();
21709
22155
  var splitLayout = splitLayoutWith([
22156
+ splitImageColumn,
22157
+ splitContentColumn
22158
+ ]);
22159
+ var splitReverseLayout = splitLayoutWith([
21710
22160
  splitContentColumn,
21711
22161
  splitImageColumn
21712
22162
  ]);
21713
- var splitReverseLayout = splitLayoutWith([
21714
- splitImageColumn,
21715
- splitContentColumn
22163
+ var heroEyebrowNode = heroCopyFragment.layout[0];
22164
+ var heroHeadlineNode = heroCopyFragment.layout[1];
22165
+ var heroSubheadlineNode = heroCopyFragment.layout[2];
22166
+ var heroCtaRowNode = heroCtaRowFragment.layout[0];
22167
+ if (!heroEyebrowNode || !heroHeadlineNode || !heroSubheadlineNode || !heroCtaRowNode) {
22168
+ throw new Error("Hero copy/CTA fragments are missing their expected layout nodes.");
22169
+ }
22170
+ var heroEditorialBottomRow = inline(
22171
+ {
22172
+ gap: "lg",
22173
+ align: "end",
22174
+ justify: "start",
22175
+ wrap: true,
22176
+ className: "rb-w-full"
22177
+ },
22178
+ [heroSubheadlineNode, heroCtaRowNode]
22179
+ );
22180
+ var splitEditorialContentColumn = heroContentWrapper(
22181
+ [heroEyebrowNode, heroHeadlineNode, heroEditorialBottomRow],
22182
+ "md",
22183
+ "rb-w-full rb-text-left"
22184
+ );
22185
+ var splitEditorialLayout = splitLayoutWith([
22186
+ splitEditorialContentColumn,
22187
+ splitImageColumn
21716
22188
  ]);
21717
22189
  var heroConfig = {
21718
22190
  id: "block.hero",
@@ -21739,7 +22211,8 @@ var heroConfig = {
21739
22211
  classic: classicLayout,
21740
22212
  micro: microLayout,
21741
22213
  split: splitLayout,
21742
- splitReverse: splitReverseLayout
22214
+ splitReverse: splitReverseLayout,
22215
+ splitEditorial: splitEditorialLayout
21743
22216
  },
21744
22217
  defaultVariant: "classic",
21745
22218
  description: "Hero section with headline, subtitle, and repeatable CTAs.",
@@ -21854,18 +22327,6 @@ function introHeading(className) {
21854
22327
  bind("content.title")
21855
22328
  );
21856
22329
  }
21857
- function introHeadingGroup(className) {
21858
- return stack(
21859
- {
21860
- gap: "sm",
21861
- className: "rb-intro-heading-group"
21862
- },
21863
- [
21864
- introHeading(className),
21865
- headingDecoration()
21866
- ]
21867
- );
21868
- }
21869
22330
  function introBody(className = "rb-prose rb-max-w-none") {
21870
22331
  return richText({ className }, bind("content.body"));
21871
22332
  }
@@ -21884,7 +22345,6 @@ function introCopyStack(options = {}) {
21884
22345
  },
21885
22346
  [
21886
22347
  introHeading(options.headingClassName ?? "rb-intro-title"),
21887
- headingDecoration(),
21888
22348
  introBody(options.bodyClassName),
21889
22349
  introCtas(options.ctaJustify)
21890
22350
  ]
@@ -21924,7 +22384,7 @@ var statementCopyLayout = styledSection({
21924
22384
  className: "rb-intro rb-intro-statement rb-grid rb-grid-cols-1 rb-gap-8 rb-md-grid-cols-2 rb-md-items-start"
21925
22385
  },
21926
22386
  [
21927
- introHeadingGroup("rb-intro-title rb-max-w-xl"),
22387
+ introHeading("rb-intro-title rb-max-w-xl"),
21928
22388
  stack({ gap: "md", className: "rb-intro-copy rb-max-w-xl" }, [
21929
22389
  introBody(),
21930
22390
  introCtas("start")
@@ -21945,7 +22405,7 @@ var statementMediaLayout = styledSection({
21945
22405
  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"
21946
22406
  },
21947
22407
  [
21948
- introHeadingGroup("rb-intro-title rb-max-w-xl"),
22408
+ introHeading("rb-intro-title rb-max-w-xl"),
21949
22409
  stack({ gap: "md", className: "rb-intro-copy rb-max-w-xl" }, [
21950
22410
  introBody(),
21951
22411
  introCtas("start")
@@ -22888,16 +23348,59 @@ var formComposition = composeFragments([
22888
23348
  { fragment: formCopyFragment },
22889
23349
  { fragment: formEmbedFragment }
22890
23350
  ]);
22891
- var formLayout = styledSection({
22892
- children: styledContainer({
22893
- rootType: "stack",
22894
- rootProps: { gap: "lg" },
22895
- children: formComposition.layout
22896
- }),
22897
- baseClass: "",
22898
- spacing: "medium",
22899
- background: "surface"
22900
- });
23351
+ function fragmentLayoutNode(layout) {
23352
+ return isNodeDefinitionArray(layout) ? el("div", {}, [...layout]) : layout;
23353
+ }
23354
+ function isNodeDefinitionArray(layout) {
23355
+ return Array.isArray(layout);
23356
+ }
23357
+ var copyLayout = fragmentLayoutNode(formCopyFragment.layout);
23358
+ var embedLayout = fragmentLayoutNode(formEmbedFragment.layout);
23359
+ var formSurface = styledContainer({
23360
+ bindFrom: "_containerStyles",
23361
+ constrainWidth: false,
23362
+ baseClassName: "rb-form-surface rb-relative rb-isolate rb-overflow-hidden",
23363
+ children: embedLayout
23364
+ });
23365
+ function createFormLayout(variant) {
23366
+ if (variant === "two-column") {
23367
+ return styledSection({
23368
+ children: el(
23369
+ "div",
23370
+ {
23371
+ className: "rb-container"
23372
+ },
23373
+ [
23374
+ el(
23375
+ "div",
23376
+ {
23377
+ className: "rb-form-two-column rb-grid rb-grid-cols-1 rb-gap-8 rb-lg-grid-cols-2 rb-lg-items-start"
23378
+ },
23379
+ [
23380
+ stack({ gap: "md", className: "rb-form-copy-column" }, [copyLayout]),
23381
+ formSurface
23382
+ ]
23383
+ )
23384
+ ]
23385
+ ),
23386
+ baseClass: "",
23387
+ spacing: "medium",
23388
+ background: "surface"
23389
+ });
23390
+ }
23391
+ return styledSection({
23392
+ children: styledContainer({
23393
+ rootType: "stack",
23394
+ rootProps: { gap: "lg" },
23395
+ children: formComposition.layout
23396
+ }),
23397
+ baseClass: "",
23398
+ spacing: "medium",
23399
+ background: "surface"
23400
+ });
23401
+ }
23402
+ var formLayout = createFormLayout("default");
23403
+ var twoColumnFormLayout = createFormLayout("two-column");
22901
23404
  var dataLoaders = buildFragmentDataLoaders(formComposition);
22902
23405
  var formManifest = createBlockManifest({
22903
23406
  id: "block.form",
@@ -22910,6 +23413,23 @@ var formManifest = createBlockManifest({
22910
23413
  { fragment: formEmbedFragment }
22911
23414
  ],
22912
23415
  layout: formLayout,
23416
+ variants: {
23417
+ default: formLayout,
23418
+ "two-column": twoColumnFormLayout
23419
+ },
23420
+ defaultVariant: "default",
23421
+ variantOptions: {
23422
+ default: {
23423
+ label: "Stacked",
23424
+ description: "Copy above the form.",
23425
+ icon: "PanelTop"
23426
+ },
23427
+ "two-column": {
23428
+ label: "Two column",
23429
+ description: "Copy on the left and form on the right.",
23430
+ icon: "Columns2"
23431
+ }
23432
+ },
22913
23433
  styleTokens: { background: "surface", typography: "body", spacing: "md" },
22914
23434
  behaviours: { supportsThemeSwitching: true, inlineEditing: false, animation: false, paletteHidden: false },
22915
23435
  category: "interactive",
@@ -22935,15 +23455,14 @@ var formBlockDefinition = {
22935
23455
  };
22936
23456
 
22937
23457
  // ../blocks/src/system/blocks/faq.ts
22938
- function fragmentLayoutNode(layout) {
22939
- return isNodeDefinitionArray(layout) ? el("div", {}, [...layout]) : layout;
23458
+ function fragmentLayoutNode2(layout) {
23459
+ return isNodeDefinitionArray2(layout) ? el("div", {}, [...layout]) : layout;
22940
23460
  }
22941
- function isNodeDefinitionArray(layout) {
23461
+ function isNodeDefinitionArray2(layout) {
22942
23462
  return Array.isArray(layout);
22943
23463
  }
22944
- var headingLayout = fragmentLayoutNode(faqHeadingFragment.layout);
22945
- var accordionLayout = fragmentLayoutNode(faqAccordionFragment.layout);
22946
- var decoratedHeadingLayout = fragmentLayoutNode(decoratedFaqHeadingLayout);
23464
+ var headingLayout = fragmentLayoutNode2(faqHeadingFragment.layout);
23465
+ var accordionLayout = fragmentLayoutNode2(faqAccordionFragment.layout);
22947
23466
  var questionColumnsAccordionLayout = createFaqAccordionLayout({
22948
23467
  rootClassName: "accordion-root rb-faq-question-columns rb-grid rb-grid-cols-1 rb-gap-4 rb-lg-grid-cols-2"
22949
23468
  });
@@ -22951,7 +23470,7 @@ var defaultLayout = styledSection({
22951
23470
  children: styledContainer({
22952
23471
  baseClassName: "rb-relative rb-isolate",
22953
23472
  children: stack({ gap: "xl", className: "rb-w-full rb-max-w-4xl rb-mx-auto" }, [
22954
- decoratedHeadingLayout,
23473
+ headingLayout,
22955
23474
  accordionLayout
22956
23475
  ])
22957
23476
  }),
@@ -22979,7 +23498,7 @@ var questionColumnsLayout = styledSection({
22979
23498
  children: stack(
22980
23499
  { gap: "xl", className: "rb-w-full" },
22981
23500
  [
22982
- decoratedHeadingLayout,
23501
+ headingLayout,
22983
23502
  questionColumnsAccordionLayout
22984
23503
  ]
22985
23504
  )
@@ -23313,7 +23832,7 @@ function resolveHeroContentAlignment(content) {
23313
23832
  const raw = readHeroLayoutString(content, "contentAlignment");
23314
23833
  if (raw === "left" || raw === "center" || raw === "right") return raw;
23315
23834
  const variant = resolveHeroVariant(content);
23316
- if (variant === "split" || variant === "splitReverse") return "left";
23835
+ if (variant === "split" || variant === "splitReverse" || variant === "splitEditorial") return "left";
23317
23836
  return "center";
23318
23837
  }
23319
23838
  function resolveHeroVerticalAlignment(content) {
@@ -23323,7 +23842,7 @@ function resolveHeroVerticalAlignment(content) {
23323
23842
  const minHeight = sectionStyles?.minHeight;
23324
23843
  if (minHeight === "banner" || minHeight === "hero" || minHeight === "immersive") return "center";
23325
23844
  const variant = resolveHeroVariant(content);
23326
- if (variant === "split" || variant === "splitReverse") return "center";
23845
+ if (variant === "split" || variant === "splitReverse" || variant === "splitEditorial") return "center";
23327
23846
  return "top";
23328
23847
  }
23329
23848
  function resolveHeroContentMaxWidth(content) {
@@ -23725,7 +24244,7 @@ function planSiteChromePlacement(positioning) {
23725
24244
  standaloneShellClassName: "fixed left-0 right-0 top-0 z-40 w-full"
23726
24245
  };
23727
24246
  default:
23728
- return assertNever(positioning);
24247
+ return assertNever2(positioning);
23729
24248
  }
23730
24249
  }
23731
24250
 
@@ -24879,7 +25398,7 @@ var floatingLayout = inline(
24879
25398
  ),
24880
25399
  fallback: `rb-header-layout header-floating-container rb-absolute rb-left-1/2 rb-top-4 ${desktopOnlyDisplay("flex")} rb-w-calc-100-minus-2rem rb-max-w-7xl rb-translate-x-neg-1/2 rb-items-start rb-gap-6 rb-px-6`
24881
25400
  }),
24882
- align: "center"
25401
+ align: "start"
24883
25402
  },
24884
25403
  [
24885
25404
  logoRow,
@@ -25398,7 +25917,6 @@ var splitHeading = stack(
25398
25917
  when("content.heading"),
25399
25918
  bind("content.heading")
25400
25919
  ),
25401
- headingDecoration(),
25402
25920
  text(
25403
25921
  {
25404
25922
  as: "p",
@@ -25936,7 +26454,6 @@ var sectionHeading = stack(
25936
26454
  when("content.title"),
25937
26455
  bind("content.title")
25938
26456
  ),
25939
- headingDecoration(),
25940
26457
  richText(
25941
26458
  {
25942
26459
  className: "rb-feature-cards-description rb-prose rb-mx-auto rb-max-w-none",
@@ -25969,6 +26486,17 @@ var featureCard = styledCard(
25969
26486
  null,
25970
26487
  bind("card.icon")
25971
26488
  ),
26489
+ // Auto-numbered marker (01, 02, …). Always in the DOM; CSS shows it only
26490
+ // when cardMarker === 'numbers' and fills it via a counter. Its own class
26491
+ // (not the icon zone) so the icon-zone collapse behaviour is unaffected.
26492
+ el(
26493
+ "div",
26494
+ {
26495
+ className: "rb-feature-card-number-zone",
26496
+ "aria-hidden": "true"
26497
+ },
26498
+ null
26499
+ ),
25972
26500
  text(
25973
26501
  {
25974
26502
  as: "h3",
@@ -26008,6 +26536,12 @@ var cardsLayout = styledSection({
26008
26536
  sectionHeading,
26009
26537
  grid3(
26010
26538
  {
26539
+ className: "rb-feature-cards-grid",
26540
+ // Drives which marker shows (icons / numbers / none) via CSS; the
26541
+ // fallback keeps legacy content (no cardMarker) showing icons.
26542
+ "data-card-marker": {
26543
+ $bind: { from: "content.cardMarker", fallback: "icons" }
26544
+ },
26011
26545
  cols: {
26012
26546
  $bind: {
26013
26547
  from: "content.columns",
@@ -26136,9 +26670,23 @@ var featureCardsConfig = {
26136
26670
  }
26137
26671
  },
26138
26672
  {
26139
- id: "_iconTreatment",
26673
+ id: "cardMarker",
26140
26674
  type: "select",
26141
- label: "Icon style",
26675
+ label: "Card marker",
26676
+ required: false,
26677
+ defaultValue: "icons",
26678
+ multiple: false,
26679
+ options: [
26680
+ { value: "icons", label: "Icons" },
26681
+ { value: "numbers", label: "Numbers (01, 02, \u2026)" },
26682
+ { value: "none", label: "None" }
26683
+ ],
26684
+ ui: { intent: "display" }
26685
+ },
26686
+ {
26687
+ id: "_iconTreatment",
26688
+ type: "select",
26689
+ label: "Icon style",
26142
26690
  required: false,
26143
26691
  defaultValue: "soft-badge",
26144
26692
  multiple: false,
@@ -26903,6 +27451,22 @@ var eventCategorySchema = z42.object({
26903
27451
  var pricingTypeSchema = z42.enum(["free", "paid", "pass_only", "membership_only"]);
26904
27452
  var accessRestrictionSchema = z42.enum(["none", "category"]);
26905
27453
  var eventPricingModeSchema = z42.enum(["single", "ticket_types"]);
27454
+ var publicCoursePriceDisplaySchema = z42.discriminatedUnion("kind", [
27455
+ z42.object({ kind: z42.literal("free"), currency: z42.string() }),
27456
+ z42.object({ kind: z42.literal("exact"), amount: z42.number(), currency: z42.string() }),
27457
+ z42.object({ kind: z42.literal("from"), amount: z42.number(), currency: z42.string() }),
27458
+ z42.object({ kind: z42.literal("unavailable"), currency: z42.string() })
27459
+ ]);
27460
+ var publicEventPriceDisplaySchema = z42.discriminatedUnion("kind", [
27461
+ z42.object({ kind: z42.literal("free"), currency: z42.string() }),
27462
+ z42.object({ kind: z42.literal("exact"), amount: z42.number(), currency: z42.string() }),
27463
+ z42.object({ kind: z42.literal("from"), amount: z42.number(), currency: z42.string() }),
27464
+ z42.object({ kind: z42.literal("mixed"), paidFromAmount: z42.number(), currency: z42.string() }),
27465
+ z42.object({ kind: z42.literal("pass_only") }),
27466
+ z42.object({ kind: z42.literal("membership_only") }),
27467
+ z42.object({ kind: z42.literal("unavailable"), currency: z42.string() }),
27468
+ z42.object({ kind: z42.literal("course"), display: publicCoursePriceDisplaySchema })
27469
+ ]);
26906
27470
  var publicEventAttendanceModeSchema = z42.enum(["in_person", "online"]);
26907
27471
  var publicEventAttendanceModeAvailabilitySchema = z42.object({
26908
27472
  mode: publicEventAttendanceModeSchema,
@@ -26984,6 +27548,7 @@ var publicEventSchema = z42.object({
26984
27548
  pricingType: pricingTypeSchema,
26985
27549
  price: z42.number().nullable(),
26986
27550
  currency: z42.string(),
27551
+ priceDisplay: publicEventPriceDisplaySchema,
26987
27552
  paymentTerms: blockBookingPaymentTermsSchema,
26988
27553
  pricingMode: eventPricingModeSchema.optional(),
26989
27554
  ticketTypes: z42.array(publicEventTicketTypeSchema).optional(),
@@ -27029,7 +27594,7 @@ var cardStylingFields = [
27029
27594
  description: "Text for the event action button",
27030
27595
  required: false,
27031
27596
  multiline: false,
27032
- defaultValue: "Book now",
27597
+ defaultValue: "Book",
27033
27598
  maxLength: 40
27034
27599
  }
27035
27600
  ];
@@ -28382,7 +28947,7 @@ var eventSpotlightBlockDefinition = {
28382
28947
  };
28383
28948
 
28384
28949
  // ../blocks/src/system/runtime/nodes/events/EventListing.interactive.ts
28385
- import { z as z50 } from "zod";
28950
+ import { z as z51 } from "zod";
28386
28951
 
28387
28952
  // ../blocks/src/system/runtime/nodes/events/shared/utils.ts
28388
28953
  var COLUMN_CLASSES = {
@@ -28488,92 +29053,130 @@ function computeMediaTransformStyle(value, style, targetAspectRatio, options) {
28488
29053
  return mergeStyles(style, stylePatch);
28489
29054
  }
28490
29055
 
29056
+ // ../blocks/src/system/runtime/nodes/events/shared/listOptions.ts
29057
+ import { z as z50 } from "zod";
29058
+ var eventPageSizeValues = [3, 6, 10, 12, 20, 24, 30];
29059
+ var eventPageSizeSchema = z50.union([
29060
+ z50.literal(3),
29061
+ z50.literal(6),
29062
+ z50.literal(10),
29063
+ z50.literal(12),
29064
+ z50.literal(20),
29065
+ z50.literal(24),
29066
+ z50.literal(30)
29067
+ ]);
29068
+ var eventPageSizeSet = new Set(eventPageSizeValues);
29069
+ function resolveEventPageSize(value, fallback = 12) {
29070
+ const candidate = typeof value === "number" ? value : typeof value === "string" && value.trim() !== "" ? Number(value.trim()) : null;
29071
+ return candidate != null && Number.isInteger(candidate) && eventPageSizeSet.has(candidate) ? candidate : fallback;
29072
+ }
29073
+ function resolveEventCalendarListPageSize(input) {
29074
+ return resolveEventPageSize(input.eventsPerPage);
29075
+ }
29076
+ var eventListPaginationActionSchema = z50.discriminatedUnion("kind", [
29077
+ z50.object({
29078
+ kind: z50.literal("loadMore"),
29079
+ label: z50.string()
29080
+ }),
29081
+ z50.object({
29082
+ kind: z50.literal("seeAllLink"),
29083
+ label: z50.string(),
29084
+ href: z50.string()
29085
+ })
29086
+ ]);
29087
+ function resolveEventListPaginationAction(input) {
29088
+ const label = input.loadMoreText?.trim() || input.defaultLabel || "Load more events";
29089
+ const href = input.seeAllUrl?.trim();
29090
+ if (input.paginationMode === "seeAllLink" && href) {
29091
+ return { kind: "seeAllLink", label, href };
29092
+ }
29093
+ return { kind: "loadMore", label };
29094
+ }
29095
+
28491
29096
  // ../blocks/src/system/runtime/nodes/events/EventListing.interactive.ts
28492
- var legacyEventCardVariantSchema = z50.enum(["variant1", "variant2"]);
28493
- var eventCardVariantInputSchema = z50.union([
29097
+ var legacyEventCardVariantSchema = z51.enum(["variant1", "variant2"]);
29098
+ var eventCardVariantInputSchema = z51.union([
28494
29099
  cardVariantRoleSchema,
28495
29100
  legacyEventCardVariantSchema
28496
29101
  ]);
28497
- var cardOrientationSchema = z50.enum(["vertical", "horizontal"]);
28498
- var eventBlockKindSchema = z50.enum(eventBlockKindValues);
28499
- var eventSurfaceScopeSchema = z50.enum(eventSurfaceScopeValues);
28500
- var eventScheduleScopeSchema2 = z50.enum(eventScheduleScopeValues);
28501
- var eventListingSourceSchema = z50.object({
28502
- events: z50.array(publicEventSchema).nullable().optional(),
28503
- siteId: z50.string(),
28504
- apiBaseUrl: z50.string().optional(),
29102
+ var cardOrientationSchema = z51.enum(["vertical", "horizontal"]);
29103
+ var eventBlockKindSchema = z51.enum(eventBlockKindValues);
29104
+ var eventSurfaceScopeSchema = z51.enum(eventSurfaceScopeValues);
29105
+ var eventScheduleScopeSchema2 = z51.enum(eventScheduleScopeValues);
29106
+ var eventListingSourceSchema = z51.object({
29107
+ events: z51.array(publicEventSchema).nullable().optional(),
29108
+ siteId: z51.string(),
29109
+ apiBaseUrl: z51.string().optional(),
28505
29110
  stage: previewStageSchema.optional(),
28506
29111
  layout: eventLayoutSchema.optional(),
28507
29112
  columns: columnOptionSchema.optional(),
28508
- eventsPerPage: z50.string().optional(),
28509
- paginationMode: z50.enum(["loadMore", "seeAllLink"]).optional(),
28510
- seeAllUrl: z50.string().optional(),
28511
- loadMoreText: z50.string().optional(),
29113
+ eventsPerPage: z51.string().optional(),
29114
+ paginationMode: z51.enum(["loadMore", "seeAllLink"]).optional(),
29115
+ seeAllUrl: z51.string().optional(),
29116
+ loadMoreText: z51.string().optional(),
28512
29117
  cardVariant: eventCardVariantInputSchema.optional(),
28513
29118
  buttonVariant: eventButtonVariantSchema.optional(),
28514
- buttonText: z50.string().optional(),
28515
- showVenue: z50.boolean().optional(),
28516
- showMap: z50.boolean().optional(),
28517
- showCapacity: z50.boolean().optional(),
28518
- emptyMessage: z50.string().optional(),
28519
- className: z50.string().optional(),
28520
- showFilters: z50.boolean().nullable().optional(),
29119
+ buttonText: z51.string().optional(),
29120
+ showVenue: z51.boolean().optional(),
29121
+ showMap: z51.boolean().optional(),
29122
+ showCapacity: z51.boolean().optional(),
29123
+ emptyMessage: z51.string().optional(),
29124
+ className: z51.string().optional(),
29125
+ showFilters: z51.boolean().nullable().optional(),
28521
29126
  showCategoryFilter: filterAutoShowSchema.optional(),
28522
- showVenueFilter: z50.boolean().nullable().optional(),
28523
- showStaffFilter: z50.boolean().nullable().optional(),
29127
+ showVenueFilter: z51.boolean().nullable().optional(),
29128
+ showStaffFilter: z51.boolean().nullable().optional(),
28524
29129
  eventKind: eventBlockKindSchema.nullable().optional(),
28525
29130
  eventSurface: eventSurfaceScopeSchema.nullable().optional(),
28526
- filterEventPresets: z50.union([z50.string(), z50.array(z50.string())]).nullable().optional(),
29131
+ filterEventPresets: z51.union([z51.string(), z51.array(z51.string())]).nullable().optional(),
28527
29132
  scheduleScope: eventScheduleScopeSchema2.nullable().optional(),
28528
- filterCategoryIds: z50.string().nullable().optional(),
28529
- filterStaffMemberId: z50.string().nullable().optional(),
28530
- filterVenueId: z50.string().nullable().optional()
29133
+ filterCategoryIds: z51.string().nullable().optional(),
29134
+ filterStaffMemberId: z51.string().nullable().optional(),
29135
+ filterVenueId: z51.string().nullable().optional()
28531
29136
  });
28532
- var eventListingDisplaySchema = z50.object({
28533
- kind: z50.literal("event-listing"),
28534
- state: z50.enum(["loading", "empty", "ready"]),
29137
+ var eventListingDisplaySchema = z51.object({
29138
+ kind: z51.literal("event-listing"),
29139
+ state: z51.enum(["loading", "empty", "ready"]),
28535
29140
  listLayout: eventLayoutSchema,
28536
- className: z50.string().nullable(),
28537
- emptyMessage: z50.string(),
28538
- loadingMessage: z50.string(),
28539
- containerClass: z50.string(),
29141
+ className: z51.string().nullable(),
29142
+ emptyMessage: z51.string(),
29143
+ loadingMessage: z51.string(),
29144
+ containerClass: z51.string(),
28540
29145
  cardVariant: cardVariantRoleSchema,
28541
29146
  buttonVariant: eventButtonVariantSchema,
28542
- buttonText: z50.string(),
28543
- showVenue: z50.boolean(),
28544
- showMap: z50.boolean(),
28545
- showCapacity: z50.boolean(),
29147
+ buttonText: z51.string(),
29148
+ showVenue: z51.boolean(),
29149
+ showMap: z51.boolean(),
29150
+ showCapacity: z51.boolean(),
28546
29151
  orientation: cardOrientationSchema,
28547
- events: z50.array(publicEventSchema)
29152
+ events: z51.array(publicEventSchema)
28548
29153
  });
28549
- var eventListingHydrationSchema = z50.object({
28550
- siteId: z50.string(),
29154
+ var eventListingHydrationSchema = z51.object({
29155
+ siteId: z51.string(),
28551
29156
  stage: previewStageSchema.optional(),
28552
- eventsPerPage: z50.string(),
28553
- paginationMode: z50.enum(["loadMore", "seeAllLink"]),
28554
- seeAllUrl: z50.string().optional(),
28555
- loadMoreText: z50.string(),
28556
- showFilters: z50.boolean(),
29157
+ eventsPerPage: eventPageSizeSchema,
29158
+ paginationAction: eventListPaginationActionSchema,
29159
+ showFilters: z51.boolean(),
28557
29160
  showCategoryFilter: filterAutoShowSchema,
28558
- showVenueFilter: z50.boolean(),
28559
- showStaffFilter: z50.boolean(),
29161
+ showVenueFilter: z51.boolean(),
29162
+ showStaffFilter: z51.boolean(),
28560
29163
  eventKind: eventBlockKindSchema,
28561
29164
  eventSurface: eventSurfaceScopeSchema,
28562
- filterEventPresets: z50.string().nullable(),
29165
+ filterEventPresets: z51.string().nullable(),
28563
29166
  scheduleScope: eventScheduleScopeSchema2,
28564
- filterCategoryIds: z50.string().nullable().optional(),
28565
- filterStaffMemberId: z50.string().nullable().optional(),
28566
- filterVenueId: z50.string().nullable().optional(),
28567
- fetchInitialEventsOnMount: z50.boolean()
29167
+ filterCategoryIds: z51.string().nullable().optional(),
29168
+ filterStaffMemberId: z51.string().nullable().optional(),
29169
+ filterVenueId: z51.string().nullable().optional(),
29170
+ fetchInitialEventsOnMount: z51.boolean()
28568
29171
  });
28569
- var eventListingRenderSchema = z50.object({
29172
+ var eventListingRenderSchema = z51.object({
28570
29173
  display: eventListingDisplaySchema,
28571
29174
  hydration: eventListingHydrationSchema
28572
29175
  });
28573
29176
  var eventListingIslandMetaCodec = createZodCodec(
28574
- z50.object({
28575
- siteId: z50.string(),
28576
- apiBaseUrl: z50.string().optional(),
29177
+ z51.object({
29178
+ siteId: z51.string(),
29179
+ apiBaseUrl: z51.string().optional(),
28577
29180
  stage: previewStageSchema.optional()
28578
29181
  })
28579
29182
  );
@@ -28585,7 +29188,7 @@ var eventListingBlockRuntime = defineProgressiveBlockRuntime({
28585
29188
  },
28586
29189
  buildRender: (source) => {
28587
29190
  const normalizedEvents = Array.isArray(source.events) ? source.events : [];
28588
- const pageSize = parseInt(source.eventsPerPage ?? "12", 10) || 12;
29191
+ const pageSize = resolveEventPageSize(source.eventsPerPage);
28589
29192
  const initialEvents = normalizedEvents.slice(0, pageSize);
28590
29193
  const didPrefetchEvents = source.events != null;
28591
29194
  const layout = source.layout ?? "grid";
@@ -28600,7 +29203,7 @@ var eventListingBlockRuntime = defineProgressiveBlockRuntime({
28600
29203
  containerClass: getContainerClass(layout, source.columns ?? "3"),
28601
29204
  cardVariant: normalizeCardVariantRole(source.cardVariant) ?? "default",
28602
29205
  buttonVariant: source.buttonVariant ?? "primary",
28603
- buttonText: source.buttonText ?? "Book now",
29206
+ buttonText: source.buttonText ?? "Book",
28604
29207
  showVenue: source.showVenue ?? true,
28605
29208
  showMap: source.showMap ?? true,
28606
29209
  showCapacity: source.showCapacity ?? true,
@@ -28610,10 +29213,12 @@ var eventListingBlockRuntime = defineProgressiveBlockRuntime({
28610
29213
  hydration: {
28611
29214
  siteId: source.siteId,
28612
29215
  stage: source.stage,
28613
- eventsPerPage: source.eventsPerPage ?? "12",
28614
- paginationMode: source.paginationMode ?? "loadMore",
28615
- seeAllUrl: source.seeAllUrl,
28616
- loadMoreText: source.loadMoreText || "Load more",
29216
+ eventsPerPage: pageSize,
29217
+ paginationAction: resolveEventListPaginationAction({
29218
+ paginationMode: source.paginationMode,
29219
+ seeAllUrl: source.seeAllUrl,
29220
+ loadMoreText: source.loadMoreText
29221
+ }),
28617
29222
  showFilters: source.showFilters ?? false,
28618
29223
  showCategoryFilter: source.showCategoryFilter ?? "auto",
28619
29224
  showVenueFilter: source.showVenueFilter ?? false,
@@ -28835,7 +29440,7 @@ var eventListingLayout = [
28835
29440
  loadMoreText: { $bind: { from: "content.loadMoreText", fallback: "Load more events" } },
28836
29441
  cardVariant: { $bind: { from: "content.cardVariant", fallback: "default" } },
28837
29442
  buttonVariant: { $bind: { from: "content.buttonVariant", fallback: "primary" } },
28838
- buttonText: { $bind: { from: "content.buttonText", fallback: "Book now" } },
29443
+ buttonText: { $bind: { from: "content.buttonText", fallback: "Book" } },
28839
29444
  showVenue: { $bind: { from: "content.showVenue" } },
28840
29445
  showMap: { $bind: { from: "content.showMap" } },
28841
29446
  showCapacity: { $bind: { from: "content.showCapacity" } },
@@ -28930,15 +29535,15 @@ var eventListingBlockDefinition = {
28930
29535
  };
28931
29536
 
28932
29537
  // ../blocks/src/system/runtime/nodes/events/EventCalendar.interactive.ts
28933
- import { z as z51 } from "zod";
28934
- var eventBlockKindSchema2 = z51.enum(eventBlockKindValues);
28935
- var eventSurfaceScopeSchema2 = z51.enum(eventSurfaceScopeValues);
28936
- var eventScheduleScopeSchema3 = z51.enum(eventScheduleScopeValues);
28937
- var eventCalendarSourceSchema = z51.object(
29538
+ import { z as z52 } from "zod";
29539
+ var eventBlockKindSchema2 = z52.enum(eventBlockKindValues);
29540
+ var eventSurfaceScopeSchema2 = z52.enum(eventSurfaceScopeValues);
29541
+ var eventScheduleScopeSchema3 = z52.enum(eventScheduleScopeValues);
29542
+ var eventCalendarSourceSchema = z52.object(
28938
29543
  {
28939
- events: z51.array(publicEventSchema).nullable().optional(),
28940
- siteId: z51.string(),
28941
- apiBaseUrl: z51.string().optional(),
29544
+ events: z52.array(publicEventSchema).nullable().optional(),
29545
+ siteId: z52.string(),
29546
+ apiBaseUrl: z52.string().optional(),
28942
29547
  stage: previewStageSchema.optional(),
28943
29548
  variant: eventCalendarDisplayModeSchema.nullable().optional(),
28944
29549
  displayMode: eventCalendarDisplayModeSchema.nullable().optional(),
@@ -28946,77 +29551,78 @@ var eventCalendarSourceSchema = z51.object(
28946
29551
  listColumns: columnOptionSchema.optional(),
28947
29552
  layout: eventLayoutSchema.optional(),
28948
29553
  columns: columnOptionSchema.optional(),
28949
- eventsPerPage: z51.string().optional(),
28950
- compactEventsPerPage: z51.string().optional(),
28951
- loadMoreText: z51.string().optional(),
29554
+ eventsPerPage: z52.string().optional(),
29555
+ paginationMode: z52.enum(["loadMore", "seeAllLink"]).optional(),
29556
+ seeAllUrl: z52.string().optional(),
29557
+ loadMoreText: z52.string().optional(),
28952
29558
  startOfWeek: weekStartSchema.optional(),
28953
29559
  calendarTabViews: calendarTabViewsSchema.optional(),
28954
- showFilters: z51.boolean().nullable().optional(),
29560
+ showFilters: z52.boolean().nullable().optional(),
28955
29561
  showCategoryFilter: filterAutoShowSchema.optional(),
28956
- showVenueFilter: z51.boolean().nullable().optional(),
28957
- showStaffFilter: z51.boolean().nullable().optional(),
29562
+ showVenueFilter: z52.boolean().nullable().optional(),
29563
+ showStaffFilter: z52.boolean().nullable().optional(),
28958
29564
  kind: eventBlockKindSchema2.nullable().optional(),
28959
29565
  eventSurface: eventSurfaceScopeSchema2.nullable().optional(),
28960
- filterEventPresets: z51.union([z51.string(), z51.array(z51.string())]).nullable().optional(),
29566
+ filterEventPresets: z52.union([z52.string(), z52.array(z52.string())]).nullable().optional(),
28961
29567
  scheduleScope: eventScheduleScopeSchema3.nullable().optional(),
28962
- filterCategoryIds: z51.union([z51.string(), z51.array(z51.string())]).nullable().optional(),
28963
- filterStaffMemberId: z51.string().nullable().optional(),
28964
- filterVenueId: z51.string().nullable().optional(),
29568
+ filterCategoryIds: z52.union([z52.string(), z52.array(z52.string())]).nullable().optional(),
29569
+ filterStaffMemberId: z52.string().nullable().optional(),
29570
+ filterVenueId: z52.string().nullable().optional(),
28965
29571
  buttonVariant: eventButtonVariantSchema.optional(),
28966
- buttonText: z51.string().optional(),
28967
- showVenue: z51.boolean().nullable().optional(),
28968
- showMap: z51.boolean().nullable().optional(),
28969
- showCapacity: z51.boolean().nullable().optional(),
28970
- emptyMessage: z51.string().optional(),
28971
- className: z51.string().optional()
29572
+ buttonText: z52.string().optional(),
29573
+ showVenue: z52.boolean().nullable().optional(),
29574
+ showMap: z52.boolean().nullable().optional(),
29575
+ showCapacity: z52.boolean().nullable().optional(),
29576
+ emptyMessage: z52.string().optional(),
29577
+ className: z52.string().optional()
28972
29578
  }
28973
29579
  );
28974
- var eventCalendarDisplaySchema = z51.object({
28975
- kind: z51.literal("event-calendar"),
29580
+ var eventCalendarDisplaySchema = z52.object({
29581
+ kind: z52.literal("event-calendar"),
28976
29582
  displayMode: eventCalendarDisplayModeSchema,
28977
- className: z51.string().nullable(),
28978
- events: z51.array(publicEventSchema),
29583
+ className: z52.string().nullable(),
29584
+ events: z52.array(publicEventSchema),
28979
29585
  listLayout: eventLayoutSchema,
28980
29586
  listColumns: columnOptionSchema,
28981
- eventsPerPage: z51.string(),
28982
- loadMoreText: z51.string(),
29587
+ eventsPerPage: eventPageSizeSchema,
29588
+ paginationAction: eventListPaginationActionSchema,
28983
29589
  startOfWeek: weekStartSchema,
28984
29590
  calendarTabViews: calendarTabViewsSchema,
28985
- showFilters: z51.boolean(),
29591
+ showFilters: z52.boolean(),
28986
29592
  showCategoryFilter: filterAutoShowSchema,
28987
- showVenueFilter: z51.boolean(),
28988
- showStaffFilter: z51.boolean(),
29593
+ showVenueFilter: z52.boolean(),
29594
+ showStaffFilter: z52.boolean(),
28989
29595
  eventKind: eventBlockKindSchema2,
28990
29596
  eventSurface: eventSurfaceScopeSchema2,
28991
- filterEventPresets: z51.string().nullable(),
29597
+ filterEventPresets: z52.string().nullable(),
28992
29598
  scheduleScope: eventScheduleScopeSchema3,
28993
- filterCategoryIds: z51.string().nullable(),
28994
- filterStaffMemberId: z51.string().nullable(),
28995
- filterVenueId: z51.string().nullable(),
29599
+ filterCategoryIds: z52.string().nullable(),
29600
+ filterStaffMemberId: z52.string().nullable(),
29601
+ filterVenueId: z52.string().nullable(),
28996
29602
  buttonVariant: eventButtonVariantSchema,
28997
- buttonText: z51.string(),
28998
- showVenue: z51.boolean(),
28999
- showMap: z51.boolean(),
29000
- showCapacity: z51.boolean(),
29001
- emptyMessage: z51.string()
29002
- });
29003
- var eventCalendarHydrationSchema = z51.object({
29004
- siteId: z51.string(),
29603
+ buttonText: z52.string(),
29604
+ showVenue: z52.boolean(),
29605
+ showMap: z52.boolean(),
29606
+ showCapacity: z52.boolean(),
29607
+ emptyMessage: z52.string()
29608
+ });
29609
+ var eventCalendarHydrationSchema = z52.object({
29610
+ siteId: z52.string(),
29005
29611
  stage: previewStageSchema.optional(),
29006
- prefetchedEvents: z51.boolean(),
29612
+ prefetchedEvents: z52.boolean(),
29007
29613
  eventKind: eventBlockKindSchema2,
29008
29614
  eventSurface: eventSurfaceScopeSchema2,
29009
- filterEventPresets: z51.string().nullable(),
29615
+ filterEventPresets: z52.string().nullable(),
29010
29616
  scheduleScope: eventScheduleScopeSchema3
29011
29617
  });
29012
- var eventCalendarRenderSchema = z51.object({
29618
+ var eventCalendarRenderSchema = z52.object({
29013
29619
  display: eventCalendarDisplaySchema,
29014
29620
  hydration: eventCalendarHydrationSchema
29015
29621
  });
29016
29622
  var eventCalendarIslandMetaCodec = createZodCodec(
29017
- z51.object({
29018
- siteId: z51.string(),
29019
- apiBaseUrl: z51.string().optional(),
29623
+ z52.object({
29624
+ siteId: z52.string(),
29625
+ apiBaseUrl: z52.string().optional(),
29020
29626
  stage: previewStageSchema.optional()
29021
29627
  })
29022
29628
  );
@@ -29026,6 +29632,7 @@ var eventCalendarIslandMetaKeys = defineInteractiveIslandMetaKeys(
29026
29632
  "stage"
29027
29633
  );
29028
29634
  function buildEventCalendarDisplay(source) {
29635
+ const listLayout = source.listLayout ?? source.layout ?? "stack";
29029
29636
  return {
29030
29637
  kind: "event-calendar",
29031
29638
  displayMode: source.variant ?? source.displayMode ?? "combined",
@@ -29033,10 +29640,16 @@ function buildEventCalendarDisplay(source) {
29033
29640
  events: (source.events ?? []).slice().sort(
29034
29641
  (left, right) => new Date(left.startsAt).getTime() - new Date(right.startsAt).getTime()
29035
29642
  ),
29036
- listLayout: source.listLayout ?? source.layout ?? "stack",
29643
+ listLayout,
29037
29644
  listColumns: source.listColumns ?? source.columns ?? "3",
29038
- eventsPerPage: (source.listLayout ?? source.layout) === "compact" ? source.compactEventsPerPage ?? "10" : source.eventsPerPage ?? "12",
29039
- loadMoreText: source.loadMoreText ?? "Load more events",
29645
+ eventsPerPage: resolveEventCalendarListPageSize({
29646
+ eventsPerPage: source.eventsPerPage
29647
+ }),
29648
+ paginationAction: resolveEventListPaginationAction({
29649
+ paginationMode: source.paginationMode,
29650
+ seeAllUrl: source.seeAllUrl,
29651
+ loadMoreText: source.loadMoreText
29652
+ }),
29040
29653
  startOfWeek: source.startOfWeek ?? "monday",
29041
29654
  calendarTabViews: source.calendarTabViews ?? "both",
29042
29655
  showFilters: source.showFilters ?? true,
@@ -29053,7 +29666,7 @@ function buildEventCalendarDisplay(source) {
29053
29666
  ),
29054
29667
  filterVenueId: normalizeEventVenueId(source.filterVenueId),
29055
29668
  buttonVariant: source.buttonVariant ?? "primary",
29056
- buttonText: source.buttonText ?? "Book now",
29669
+ buttonText: source.buttonText ?? "Book",
29057
29670
  showVenue: source.showVenue ?? true,
29058
29671
  showMap: source.showMap ?? true,
29059
29672
  showCapacity: source.showCapacity ?? true,
@@ -29153,10 +29766,16 @@ var eventCalendarLayout = [
29153
29766
  layout: { $bind: { from: "content.layout" } },
29154
29767
  columns: { $bind: { from: "content.columns" } },
29155
29768
  eventsPerPage: {
29156
- $bind: { from: "content.eventsPerPage", fallback: "12" }
29769
+ $bind: { from: "content.eventsPerPage" }
29157
29770
  },
29158
- compactEventsPerPage: {
29159
- $bind: { from: "content.compactEventsPerPage", fallback: "10" }
29771
+ paginationMode: {
29772
+ $bind: { from: "content.paginationMode", fallback: "loadMore" }
29773
+ },
29774
+ seeAllUrl: {
29775
+ $bind: {
29776
+ from: "content.seeAllUrl",
29777
+ transforms: [{ id: "links.resolve" }]
29778
+ }
29160
29779
  },
29161
29780
  loadMoreText: {
29162
29781
  $bind: {
@@ -29209,7 +29828,7 @@ var eventCalendarLayout = [
29209
29828
  $bind: { from: "content.buttonVariant", fallback: "primary" }
29210
29829
  },
29211
29830
  buttonText: {
29212
- $bind: { from: "content.buttonText", fallback: "Book now" }
29831
+ $bind: { from: "content.buttonText", fallback: "Book" }
29213
29832
  },
29214
29833
  emptyMessage: { $bind: { from: "content.emptyMessage" } }
29215
29834
  })
@@ -29283,15 +29902,18 @@ var eventCalendarAdditionalFields = [
29283
29902
  {
29284
29903
  id: "eventsPerPage",
29285
29904
  type: "select",
29286
- label: "Events per page (cards)",
29287
- description: "Number of events to load initially in card layouts",
29905
+ label: "Events per page",
29906
+ description: "Number of events to load initially",
29288
29907
  required: false,
29289
29908
  multiple: false,
29290
29909
  defaultValue: "12",
29291
29910
  options: [
29292
29911
  { value: "6", label: "6" },
29912
+ { value: "10", label: "10" },
29293
29913
  { value: "12", label: "12" },
29294
- { value: "24", label: "24" }
29914
+ { value: "20", label: "20" },
29915
+ { value: "24", label: "24" },
29916
+ { value: "30", label: "30" }
29295
29917
  ],
29296
29918
  ui: {
29297
29919
  intent: "display",
@@ -29299,33 +29921,42 @@ var eventCalendarAdditionalFields = [
29299
29921
  }
29300
29922
  },
29301
29923
  {
29302
- id: "compactEventsPerPage",
29924
+ id: "paginationMode",
29303
29925
  type: "select",
29304
- label: "Events per page (compact)",
29305
- description: "Number of events to show per page in compact layout",
29926
+ label: "More events",
29927
+ description: "How to access events beyond the initial list",
29306
29928
  required: false,
29307
29929
  multiple: false,
29308
- defaultValue: "10",
29930
+ defaultValue: "loadMore",
29309
29931
  options: [
29310
- { value: "10", label: "10" },
29311
- { value: "20", label: "20" },
29312
- { value: "30", label: "30" }
29932
+ { value: "loadMore", label: "Load more button" },
29933
+ { value: "seeAllLink", label: "Link to another page" }
29313
29934
  ],
29314
29935
  ui: {
29315
29936
  intent: "display",
29316
- visibleWhen: { field: "listLayout", equals: "compact" }
29937
+ visibleWhen: { field: "variant", oneOf: ["combined", "list"] }
29938
+ }
29939
+ },
29940
+ {
29941
+ id: "seeAllUrl",
29942
+ type: "link",
29943
+ label: "See all destination",
29944
+ required: false,
29945
+ ui: {
29946
+ intent: "display",
29947
+ visibleWhen: { field: "paginationMode", equals: "seeAllLink" }
29317
29948
  }
29318
29949
  },
29319
29950
  {
29320
29951
  id: "loadMoreText",
29321
29952
  type: "text",
29322
- label: "Load more button text",
29323
- description: "Text for the load more button",
29953
+ label: "CTA button text",
29954
+ description: "Text for the load more button or linked CTA",
29324
29955
  required: false,
29325
29956
  multiline: false,
29326
29957
  defaultValue: "Load more events",
29327
29958
  ui: {
29328
- intent: "content",
29959
+ intent: "display",
29329
29960
  visibleWhen: { field: "variant", oneOf: ["combined", "list"] }
29330
29961
  }
29331
29962
  },
@@ -29576,51 +30207,393 @@ var eventCalendarAdditionalFields = [
29576
30207
  renderInHeader: false
29577
30208
  })
29578
30209
  ];
29579
- var eventCalendarVariants = {
29580
- combined: eventCalendarLayout[0],
29581
- month: eventCalendarLayout[0],
29582
- week: eventCalendarLayout[0],
29583
- timetable: eventCalendarLayout[0],
29584
- list: eventCalendarLayout[0]
29585
- };
29586
- var eventCalendarDerivedFields = [
29587
- {
29588
- id: "displayMode",
29589
- type: "select",
29590
- required: false,
29591
- multiple: false,
29592
- options: [
29593
- { value: "combined" },
29594
- { value: "month" },
29595
- { value: "week" },
29596
- { value: "timetable" },
29597
- { value: "list" }
29598
- ]
29599
- },
29600
- {
29601
- id: "listLayout",
29602
- type: "select",
29603
- required: false,
29604
- multiple: false,
29605
- options: eventCalendarListLayoutOptions.map((option) => ({
29606
- value: option.id
29607
- }))
29608
- }
29609
- ];
29610
- var eventCalendarContentShape = {
29611
- additionalFields: eventCalendarDerivedFields,
29612
- variants: eventCalendarVariants,
29613
- skipSectionStyles: true
29614
- };
29615
- var eventCalendarConfig = {
29616
- id: "block.event-calendar",
29617
- version: "3.6.0",
29618
- title: "Event Calendar",
30210
+ var eventCalendarVariants = {
30211
+ combined: eventCalendarLayout[0],
30212
+ month: eventCalendarLayout[0],
30213
+ week: eventCalendarLayout[0],
30214
+ timetable: eventCalendarLayout[0],
30215
+ list: eventCalendarLayout[0]
30216
+ };
30217
+ var eventCalendarDerivedFields = [
30218
+ {
30219
+ id: "displayMode",
30220
+ type: "select",
30221
+ required: false,
30222
+ multiple: false,
30223
+ options: [
30224
+ { value: "combined" },
30225
+ { value: "month" },
30226
+ { value: "week" },
30227
+ { value: "timetable" },
30228
+ { value: "list" }
30229
+ ]
30230
+ },
30231
+ {
30232
+ id: "listLayout",
30233
+ type: "select",
30234
+ required: false,
30235
+ multiple: false,
30236
+ options: eventCalendarListLayoutOptions.map((option) => ({
30237
+ value: option.id
30238
+ }))
30239
+ }
30240
+ ];
30241
+ var eventCalendarContentShape = {
30242
+ additionalFields: eventCalendarDerivedFields,
30243
+ variants: eventCalendarVariants,
30244
+ skipSectionStyles: true
30245
+ };
30246
+ var eventCalendarConfig = {
30247
+ id: "block.event-calendar",
30248
+ version: "3.6.0",
30249
+ title: "Event Calendar",
30250
+ titleSource: "heading",
30251
+ description: "Display events with calendar, list, or combined views with filtering",
30252
+ // Preserve legacy section styles field configuration (renderInHeader: false).
30253
+ skipSectionStyles: true,
30254
+ additionalFields: eventCalendarAdditionalFields,
30255
+ styleTokens: { background: "surface", typography: "body", spacing: "md" },
30256
+ behaviours: {
30257
+ supportsThemeSwitching: true,
30258
+ inlineEditing: false,
30259
+ animation: false,
30260
+ paletteHidden: false
30261
+ },
30262
+ category: "interactive",
30263
+ tags: [
30264
+ "events",
30265
+ "calendar",
30266
+ "month",
30267
+ "week",
30268
+ "schedule",
30269
+ "interactive",
30270
+ "list",
30271
+ "filter"
30272
+ ],
30273
+ icon: "CalendarDays",
30274
+ layout: eventCalendarLayout,
30275
+ variants: eventCalendarVariants,
30276
+ defaultVariant: "combined",
30277
+ variantOptions: {
30278
+ combined: { label: "Combined" },
30279
+ month: { label: "Month" },
30280
+ week: { label: "Week" },
30281
+ timetable: { label: "Timetable" },
30282
+ list: { label: "List" }
30283
+ }
30284
+ };
30285
+ var eventCalendarManifest = createBlockManifestWithContentShape(
30286
+ eventCalendarConfig,
30287
+ eventCalendarContentShape
30288
+ );
30289
+ var eventCalendarBlockDefinition = {
30290
+ manifest: eventCalendarManifest,
30291
+ normalizeContent: normalizeEventCalendarContent,
30292
+ dataSchemas: {
30293
+ events: publicEventsArraySchema.optional()
30294
+ },
30295
+ dataLoaders: {
30296
+ events: {
30297
+ endpoint: "listPublicEvents",
30298
+ params: {
30299
+ siteId: { $bind: { from: "$root.siteId" } },
30300
+ // Pre-fetch events - limit varies by mode but default to high for calendar
30301
+ limit: 100,
30302
+ stage: { $bind: { from: "$root.previewStage", fallback: "published" } },
30303
+ detailLevel: "listing",
30304
+ readProfile: { $bind: { from: "content.variant", fallback: "listing-card" } },
30305
+ // Pass filter params if configured
30306
+ kind: { $bind: { from: "content.kind" } },
30307
+ eventSurface: { $bind: { from: "content.eventSurface" } },
30308
+ eventPresets: {
30309
+ $bind: {
30310
+ from: "content.filterEventPresets",
30311
+ transforms: [{ id: "value.csv" }]
30312
+ }
30313
+ },
30314
+ scheduleScope: { $bind: { from: "content.scheduleScope" } },
30315
+ categoryIds: { $bind: { from: "content.filterCategoryIds" } },
30316
+ staffMemberId: { $bind: { from: "content.filterStaffMemberId" } },
30317
+ venueId: { $bind: { from: "content.filterVenueId" } }
30318
+ },
30319
+ mode: "server"
30320
+ }
30321
+ },
30322
+ runtime: eventCalendarBlockRuntime
30323
+ };
30324
+
30325
+ // ../blocks/src/system/blocks/offerings-preview/index.ts
30326
+ import { z as z53 } from "zod";
30327
+
30328
+ // ../blocks/src/system/blocks/offerings-preview/model.ts
30329
+ var OFFERINGS_PREVIEW_DEFAULT_ITEM_LIMIT = "3";
30330
+ var OFFERINGS_PREVIEW_DEFAULT_BUTTON_TEXT = "Book";
30331
+ var OFFERINGS_PREVIEW_DEFAULT_EMPTY_MESSAGE = "Nothing scheduled just yet.";
30332
+ var OFFERINGS_PREVIEW_EVENT_PRESET_DEFINITIONS = [
30333
+ {
30334
+ preset: "class",
30335
+ sourceKey: "eventPreset:class",
30336
+ dataKey: "classEvents",
30337
+ label: "Classes"
30338
+ },
30339
+ {
30340
+ preset: "workshop",
30341
+ sourceKey: "eventPreset:workshop",
30342
+ dataKey: "workshopEvents",
30343
+ label: "Workshops"
30344
+ },
30345
+ {
30346
+ preset: "retreat",
30347
+ sourceKey: "eventPreset:retreat",
30348
+ dataKey: "retreatEvents",
30349
+ label: "Retreats"
30350
+ },
30351
+ {
30352
+ preset: "performance",
30353
+ sourceKey: "eventPreset:performance",
30354
+ dataKey: "performanceEvents",
30355
+ label: "Performances"
30356
+ }
30357
+ ];
30358
+ var OFFERINGS_PREVIEW_EVENT_PRESETS = OFFERINGS_PREVIEW_EVENT_PRESET_DEFINITIONS.map((definition) => definition.preset);
30359
+ var OFFERINGS_PREVIEW_AUTHORABLE_SOURCE_KEYS = [
30360
+ ...OFFERINGS_PREVIEW_EVENT_PRESET_DEFINITIONS.map((definition) => definition.sourceKey),
30361
+ "course"
30362
+ ];
30363
+ var eventPresetSourceByKey = Object.fromEntries(
30364
+ OFFERINGS_PREVIEW_EVENT_PRESET_DEFINITIONS.map((definition) => [
30365
+ definition.sourceKey,
30366
+ { kind: "eventPreset", preset: definition.preset }
30367
+ ])
30368
+ );
30369
+
30370
+ // ../blocks/src/system/blocks/offerings-preview/index.ts
30371
+ var publicRouteCandidatesSchema = z53.object({
30372
+ routes: z53.array(z53.object({
30373
+ entityId: z53.string(),
30374
+ path: z53.string(),
30375
+ title: z53.string(),
30376
+ kind: z53.enum(["page", "content"]),
30377
+ contentTypeKey: z53.string().nullable().optional()
30378
+ }))
30379
+ });
30380
+ var groupOverrideFields = [
30381
+ {
30382
+ id: "sourceKey",
30383
+ type: "select",
30384
+ label: "Offering",
30385
+ required: true,
30386
+ multiple: false,
30387
+ options: [
30388
+ ...OFFERINGS_PREVIEW_EVENT_PRESET_DEFINITIONS.map((definition) => ({
30389
+ value: definition.sourceKey,
30390
+ label: definition.label
30391
+ })),
30392
+ { value: "course", label: "Courses" }
30393
+ ],
30394
+ ui: { intent: "behavior" }
30395
+ },
30396
+ {
30397
+ id: "title",
30398
+ type: "text",
30399
+ label: "Title",
30400
+ required: false,
30401
+ multiline: false,
30402
+ maxLength: 80,
30403
+ ui: { intent: "content" }
30404
+ },
30405
+ {
30406
+ id: "intro",
30407
+ type: "text",
30408
+ label: "Intro",
30409
+ required: false,
30410
+ multiline: true,
30411
+ maxLength: 220,
30412
+ ui: { intent: "content" }
30413
+ },
30414
+ {
30415
+ id: "hidden",
30416
+ type: "boolean",
30417
+ label: "Hide this card",
30418
+ required: false,
30419
+ defaultValue: false,
30420
+ ui: { intent: "display" }
30421
+ },
30422
+ {
30423
+ id: "presentation",
30424
+ type: "select",
30425
+ label: "Items",
30426
+ required: false,
30427
+ multiple: false,
30428
+ defaultValue: "compact-list",
30429
+ options: [
30430
+ { value: "compact-list", label: "Compact list" },
30431
+ { value: "single-card", label: "Single card" }
30432
+ ],
30433
+ ui: { intent: "display" }
30434
+ },
30435
+ {
30436
+ id: "ctaMode",
30437
+ type: "select",
30438
+ label: "Card link",
30439
+ required: false,
30440
+ multiple: false,
30441
+ defaultValue: "auto",
30442
+ options: [
30443
+ { value: "auto", label: "Auto" },
30444
+ { value: "custom", label: "Custom link" },
30445
+ { value: "hidden", label: "Hidden" }
30446
+ ],
30447
+ ui: { intent: "behavior" }
30448
+ },
30449
+ {
30450
+ id: "ctaLabel",
30451
+ type: "text",
30452
+ label: "Card link label",
30453
+ required: false,
30454
+ multiline: false,
30455
+ maxLength: 40,
30456
+ ui: { intent: "content" }
30457
+ },
30458
+ {
30459
+ id: "ctaHref",
30460
+ type: "text",
30461
+ label: "Custom card link",
30462
+ required: false,
30463
+ multiline: false,
30464
+ maxLength: 160,
30465
+ ui: { intent: "behavior" }
30466
+ }
30467
+ ];
30468
+ var offeringsPreviewFields = [
30469
+ ...sectionHeaderFields("Offerings"),
30470
+ {
30471
+ id: "itemLimit",
30472
+ type: "select",
30473
+ label: "Items per card",
30474
+ required: false,
30475
+ multiple: false,
30476
+ defaultValue: OFFERINGS_PREVIEW_DEFAULT_ITEM_LIMIT,
30477
+ options: [
30478
+ { value: "1", label: "1 item" },
30479
+ { value: "2", label: "2 items" },
30480
+ { value: "3", label: "3 items" },
30481
+ { value: "4", label: "4 items" },
30482
+ { value: "5", label: "5 items" },
30483
+ { value: "6", label: "6 items" }
30484
+ ],
30485
+ ui: { intent: "display" }
30486
+ },
30487
+ {
30488
+ id: "groupOverrides",
30489
+ type: "repeater",
30490
+ label: "Card overrides",
30491
+ description: "Edit card copy, order, or visibility for enabled offering presets.",
30492
+ required: false,
30493
+ maxItems: 5,
30494
+ itemLabel: "Offering card",
30495
+ itemLabelSource: "title",
30496
+ allowConversion: false,
30497
+ ui: { intent: "content" },
30498
+ schema: { fields: groupOverrideFields }
30499
+ },
30500
+ {
30501
+ id: "buttonVariant",
30502
+ type: "select",
30503
+ label: "Item button style",
30504
+ required: false,
30505
+ multiple: false,
30506
+ defaultValue: "primary",
30507
+ options: [
30508
+ { value: "primary", label: "Primary" },
30509
+ { value: "secondary", label: "Secondary" },
30510
+ { value: "outline", label: "Outline" },
30511
+ { value: "link", label: "Link" }
30512
+ ],
30513
+ ui: { intent: "display" }
30514
+ },
30515
+ {
30516
+ id: "buttonText",
30517
+ type: "text",
30518
+ label: "Item button text",
30519
+ required: false,
30520
+ multiline: false,
30521
+ defaultValue: OFFERINGS_PREVIEW_DEFAULT_BUTTON_TEXT,
30522
+ maxLength: 40,
30523
+ ui: { intent: "content" }
30524
+ },
30525
+ {
30526
+ id: "emptyMessage",
30527
+ type: "text",
30528
+ label: "Empty card message",
30529
+ required: false,
30530
+ multiline: false,
30531
+ defaultValue: OFFERINGS_PREVIEW_DEFAULT_EMPTY_MESSAGE,
30532
+ maxLength: 120,
30533
+ ui: { intent: "content" }
30534
+ },
30535
+ cardStylesField({
30536
+ id: "_cardStyles",
30537
+ label: "Offering card styles"
30538
+ }),
30539
+ sectionStylesField({
30540
+ id: "_sectionStyles",
30541
+ label: "Section styles",
30542
+ renderInHeader: false
30543
+ })
30544
+ ];
30545
+ var offeringsPreviewEventDataBindings = Object.fromEntries(
30546
+ OFFERINGS_PREVIEW_EVENT_PRESET_DEFINITIONS.map((definition) => [
30547
+ definition.dataKey,
30548
+ { $bind: { from: `data.${definition.dataKey}` } }
30549
+ ])
30550
+ );
30551
+ var offeringsPreviewLayout = [
30552
+ styledSection({
30553
+ children: sectionContainer([
30554
+ text(
30555
+ { as: "h2", className: "rb-text-center" },
30556
+ bind("content.heading"),
30557
+ when("content.heading")
30558
+ ),
30559
+ richText(
30560
+ { className: "rb-prose rb-max-w-none" },
30561
+ bind("content.description"),
30562
+ when("content.description")
30563
+ ),
30564
+ el("offerings-preview", {
30565
+ bookingOfferingPresets: {
30566
+ $bind: { from: "$root.bookingOfferingPresets", fallback: [] }
30567
+ },
30568
+ groupOverrides: { $bind: { from: "content.groupOverrides", fallback: [] } },
30569
+ cardStyles: { $bind: { from: "content._cardStyles" } },
30570
+ itemLimit: { $bind: { from: "content.itemLimit", fallback: OFFERINGS_PREVIEW_DEFAULT_ITEM_LIMIT } },
30571
+ buttonVariant: { $bind: { from: "content.buttonVariant", fallback: "primary" } },
30572
+ buttonText: { $bind: { from: "content.buttonText", fallback: OFFERINGS_PREVIEW_DEFAULT_BUTTON_TEXT } },
30573
+ emptyMessage: {
30574
+ $bind: {
30575
+ from: "content.emptyMessage",
30576
+ fallback: OFFERINGS_PREVIEW_DEFAULT_EMPTY_MESSAGE
30577
+ }
30578
+ },
30579
+ previewStage: { $bind: { from: "$root.previewStage", fallback: "published" } },
30580
+ routeCandidates: { $bind: { from: "data.routeCandidates" } },
30581
+ courses: { $bind: { from: "data.courses" } },
30582
+ ...offeringsPreviewEventDataBindings
30583
+ })
30584
+ ], { gap: "lg" }),
30585
+ baseClass: "",
30586
+ spacing: "comfortable"
30587
+ })
30588
+ ];
30589
+ var offeringsPreviewConfig = {
30590
+ id: "block.offerings-preview",
30591
+ version: "1.0.0",
30592
+ title: "Offerings Preview",
29619
30593
  titleSource: "heading",
29620
- description: "Display events with calendar, list, or combined views with filtering",
29621
- // Preserve legacy section styles field configuration (renderInHeader: false).
30594
+ description: "Show enabled offering presets as compact cards",
29622
30595
  skipSectionStyles: true,
29623
- additionalFields: eventCalendarAdditionalFields,
30596
+ additionalFields: offeringsPreviewFields,
29624
30597
  styleTokens: { background: "surface", typography: "body", spacing: "md" },
29625
30598
  behaviours: {
29626
30599
  supportsThemeSwitching: true,
@@ -29628,71 +30601,68 @@ var eventCalendarConfig = {
29628
30601
  animation: false,
29629
30602
  paletteHidden: false
29630
30603
  },
29631
- category: "interactive",
29632
- tags: [
29633
- "events",
29634
- "calendar",
29635
- "month",
29636
- "week",
29637
- "schedule",
29638
- "interactive",
29639
- "list",
29640
- "filter"
29641
- ],
29642
- icon: "CalendarDays",
29643
- layout: eventCalendarLayout,
29644
- variants: eventCalendarVariants,
29645
- defaultVariant: "combined",
29646
- variantOptions: {
29647
- combined: { label: "Combined" },
29648
- month: { label: "Month" },
29649
- week: { label: "Week" },
29650
- timetable: { label: "Timetable" },
29651
- list: { label: "List" }
29652
- }
30604
+ category: "content",
30605
+ tags: ["offerings", "events", "classes", "workshops", "retreats"],
30606
+ icon: "PanelsTopLeft",
30607
+ layout: offeringsPreviewLayout
29653
30608
  };
29654
- var eventCalendarManifest = createBlockManifestWithContentShape(
29655
- eventCalendarConfig,
29656
- eventCalendarContentShape
30609
+ var offeringsPreviewManifest = createBlockManifest(offeringsPreviewConfig);
30610
+ var optionalPublicEventsArraySchema = publicEventsArraySchema.optional();
30611
+ var offeringsPreviewEventDataSchemas = Object.fromEntries(
30612
+ OFFERINGS_PREVIEW_EVENT_PRESET_DEFINITIONS.map((definition) => [
30613
+ definition.dataKey,
30614
+ optionalPublicEventsArraySchema
30615
+ ])
29657
30616
  );
29658
- var eventCalendarBlockDefinition = {
29659
- manifest: eventCalendarManifest,
29660
- normalizeContent: normalizeEventCalendarContent,
30617
+ var offeringsPreviewEventDataLoaders = Object.fromEntries(
30618
+ OFFERINGS_PREVIEW_EVENT_PRESET_DEFINITIONS.map((definition) => [
30619
+ definition.dataKey,
30620
+ eventPresetLoader(definition.preset)
30621
+ ])
30622
+ );
30623
+ var offeringsPreviewBlockDefinition = {
30624
+ manifest: offeringsPreviewManifest,
29661
30625
  dataSchemas: {
29662
- events: publicEventsArraySchema.optional()
30626
+ ...offeringsPreviewEventDataSchemas,
30627
+ routeCandidates: publicRouteCandidatesSchema.optional(),
30628
+ courses: publicCoursesArraySchema.optional()
29663
30629
  },
29664
30630
  dataLoaders: {
29665
- events: {
29666
- endpoint: "listPublicEvents",
30631
+ ...offeringsPreviewEventDataLoaders,
30632
+ routeCandidates: {
30633
+ endpoint: "listPublicRouteCandidates",
30634
+ params: {},
30635
+ mode: "server"
30636
+ },
30637
+ courses: {
30638
+ endpoint: "listPublicCourses",
29667
30639
  params: {
29668
30640
  siteId: { $bind: { from: "$root.siteId" } },
29669
- // Pre-fetch events - limit varies by mode but default to high for calendar
29670
- limit: 100,
29671
- stage: { $bind: { from: "$root.previewStage", fallback: "published" } },
29672
- detailLevel: "listing",
29673
- readProfile: { $bind: { from: "content.variant", fallback: "listing-card" } },
29674
- // Pass filter params if configured
29675
- kind: { $bind: { from: "content.kind" } },
29676
- eventSurface: { $bind: { from: "content.eventSurface" } },
29677
- eventPresets: {
29678
- $bind: {
29679
- from: "content.filterEventPresets",
29680
- transforms: [{ id: "value.csv" }]
29681
- }
29682
- },
29683
- scheduleScope: { $bind: { from: "content.scheduleScope" } },
29684
- categoryIds: { $bind: { from: "content.filterCategoryIds" } },
29685
- staffMemberId: { $bind: { from: "content.filterStaffMemberId" } },
29686
- venueId: { $bind: { from: "content.filterVenueId" } }
30641
+ limit: { $bind: { from: "content.itemLimit", fallback: OFFERINGS_PREVIEW_DEFAULT_ITEM_LIMIT } },
30642
+ stage: { $bind: { from: "$root.previewStage", fallback: "published" } }
29687
30643
  },
29688
30644
  mode: "server"
29689
30645
  }
29690
- },
29691
- runtime: eventCalendarBlockRuntime
30646
+ }
29692
30647
  };
30648
+ function eventPresetLoader(preset2) {
30649
+ return {
30650
+ endpoint: "listPublicEvents",
30651
+ params: {
30652
+ siteId: { $bind: { from: "$root.siteId" } },
30653
+ limit: { $bind: { from: "content.itemLimit", fallback: OFFERINGS_PREVIEW_DEFAULT_ITEM_LIMIT } },
30654
+ stage: { $bind: { from: "$root.previewStage", fallback: "published" } },
30655
+ detailLevel: "listing",
30656
+ readProfile: "listing-card",
30657
+ kind: "events",
30658
+ eventPresets: preset2
30659
+ },
30660
+ mode: "server"
30661
+ };
30662
+ }
29693
30663
 
29694
30664
  // ../blocks/src/system/blocks/embed.ts
29695
- import { z as z52 } from "zod";
30665
+ import { z as z54 } from "zod";
29696
30666
  var embedFields = [
29697
30667
  // Section heading
29698
30668
  parseFieldDefinition({
@@ -29827,7 +30797,7 @@ var embedFields = [
29827
30797
  ui: { intent: "display" }
29828
30798
  })
29829
30799
  ];
29830
- var embedLayout = styledSection({
30800
+ var embedLayout2 = styledSection({
29831
30801
  children: sectionContainer([
29832
30802
  // Heading
29833
30803
  text(
@@ -29915,7 +30885,7 @@ var embedManifest = createBlockManifest({
29915
30885
  category: "content",
29916
30886
  titleSource: "heading",
29917
30887
  additionalFields: embedFields,
29918
- layout: embedLayout,
30888
+ layout: embedLayout2,
29919
30889
  description: "Embed content entries from any content type. Sites provide custom layouts via block overrides.",
29920
30890
  tags: ["embed", "content", "dynamic", "collection", "entries", "listing"],
29921
30891
  icon: "LayoutList",
@@ -29923,18 +30893,18 @@ var embedManifest = createBlockManifest({
29923
30893
  spacing: "lg"
29924
30894
  }
29925
30895
  });
29926
- var embedEntrySchema = z52.object({
29927
- id: z52.string(),
29928
- identifier: z52.string(),
29929
- title: z52.string(),
29930
- slug: z52.string().nullable().optional(),
29931
- content: z52.record(z52.string(), z52.unknown()).optional(),
29932
- publishedAt: z52.string().nullable().optional()
30896
+ var embedEntrySchema = z54.object({
30897
+ id: z54.string(),
30898
+ identifier: z54.string(),
30899
+ title: z54.string(),
30900
+ slug: z54.string().nullable().optional(),
30901
+ content: z54.record(z54.string(), z54.unknown()).optional(),
30902
+ publishedAt: z54.string().nullable().optional()
29933
30903
  });
29934
30904
  var embedBlockDefinition = {
29935
30905
  manifest: embedManifest,
29936
30906
  dataSchemas: {
29937
- entries: z52.array(embedEntrySchema).optional()
30907
+ entries: z54.array(embedEntrySchema).optional()
29938
30908
  },
29939
30909
  dataLoaders: {
29940
30910
  entries: {
@@ -31109,58 +32079,58 @@ var fileDownloadBlockDefinition = {
31109
32079
  };
31110
32080
 
31111
32081
  // ../blocks/src/system/blocks/shop.ts
31112
- import { z as z56 } from "zod";
32082
+ import { z as z58 } from "zod";
31113
32083
 
31114
32084
  // ../blocks/src/system/runtime/nodes/shop.interactive.ts
31115
- import { z as z55 } from "zod";
32085
+ import { z as z57 } from "zod";
31116
32086
 
31117
32087
  // ../blocks/src/system/blocks/products/shared.ts
31118
- import { z as z53 } from "zod";
31119
- var publicProductVariantSchema = z53.object({
31120
- id: z53.string(),
31121
- title: z53.string(),
31122
- sku: z53.string().nullable(),
31123
- priceCents: z53.number(),
31124
- stockQuantity: z53.number().nullable(),
31125
- soldOut: z53.boolean()
31126
- });
31127
- var publicProductSchema = z53.object({
31128
- id: z53.string(),
31129
- contentEntryId: z53.string().nullable(),
31130
- title: z53.string(),
31131
- slug: z53.string(),
31132
- path: z53.string().nullable(),
31133
- status: z53.enum(["draft", "active"]),
31134
- priceCents: z53.number(),
31135
- currency: z53.string(),
31136
- productType: z53.enum(["physical", "digital"]),
31137
- requiresShipping: z53.boolean(),
31138
- hasVariants: z53.boolean(),
31139
- trackInventory: z53.boolean(),
31140
- soldOut: z53.boolean(),
31141
- category: z53.object({
31142
- id: z53.string(),
31143
- name: z53.string(),
31144
- slug: z53.string()
32088
+ import { z as z55 } from "zod";
32089
+ var publicProductVariantSchema = z55.object({
32090
+ id: z55.string(),
32091
+ title: z55.string(),
32092
+ sku: z55.string().nullable(),
32093
+ priceCents: z55.number(),
32094
+ stockQuantity: z55.number().nullable(),
32095
+ soldOut: z55.boolean()
32096
+ });
32097
+ var publicProductSchema = z55.object({
32098
+ id: z55.string(),
32099
+ contentEntryId: z55.string().nullable(),
32100
+ title: z55.string(),
32101
+ slug: z55.string(),
32102
+ path: z55.string().nullable(),
32103
+ status: z55.enum(["draft", "active"]),
32104
+ priceCents: z55.number(),
32105
+ currency: z55.string(),
32106
+ productType: z55.enum(["physical", "digital"]),
32107
+ requiresShipping: z55.boolean(),
32108
+ hasVariants: z55.boolean(),
32109
+ trackInventory: z55.boolean(),
32110
+ soldOut: z55.boolean(),
32111
+ category: z55.object({
32112
+ id: z55.string(),
32113
+ name: z55.string(),
32114
+ slug: z55.string()
31145
32115
  }).nullable(),
31146
- summary: z53.string().nullable(),
31147
- badges: z53.array(z53.string()),
31148
- ctaLabel: z53.string().nullable(),
31149
- body: z53.unknown().nullable(),
31150
- gallery: z53.array(
31151
- z53.object({
31152
- url: z53.string(),
31153
- alt: z53.string().nullable()
32116
+ summary: z55.string().nullable(),
32117
+ badges: z55.array(z55.string()),
32118
+ ctaLabel: z55.string().nullable(),
32119
+ body: z55.unknown().nullable(),
32120
+ gallery: z55.array(
32121
+ z55.object({
32122
+ url: z55.string(),
32123
+ alt: z55.string().nullable()
31154
32124
  })
31155
32125
  ),
31156
- variants: z53.array(publicProductVariantSchema)
32126
+ variants: z55.array(publicProductVariantSchema)
31157
32127
  });
31158
- var publicProductsResponseSchema = z53.object({
31159
- products: z53.array(publicProductSchema)
32128
+ var publicProductsResponseSchema = z55.object({
32129
+ products: z55.array(publicProductSchema)
31160
32130
  });
31161
32131
 
31162
32132
  // ../blocks/src/system/runtime/api/creditProducts.ts
31163
- function assertNever2(value) {
32133
+ function assertNever3(value) {
31164
32134
  throw new Error(`Unhandled credit product case: ${String(value)}`);
31165
32135
  }
31166
32136
  function useCasesFromModules(modules) {
@@ -31193,7 +32163,7 @@ function getCreditProductCreditUnit(useCase) {
31193
32163
  perCreditSuffix: "credit"
31194
32164
  };
31195
32165
  default:
31196
- return assertNever2(useCase);
32166
+ return assertNever3(useCase);
31197
32167
  }
31198
32168
  }
31199
32169
  function deriveCreditProductLabels(products, options = {}) {
@@ -31220,27 +32190,27 @@ function deriveCreditProductLabels(products, options = {}) {
31220
32190
  }
31221
32191
 
31222
32192
  // ../blocks/src/system/runtime/nodes/shop-commerce.shared.ts
31223
- import { z as z54 } from "zod";
31224
- var storedProductCartItemSchema = z54.object({
31225
- kind: z54.literal("product"),
31226
- productId: z54.string().min(1),
31227
- productCategoryId: z54.string().min(1).optional().nullable(),
31228
- variantId: z54.string().min(1).optional().nullable(),
31229
- title: z54.string().min(1),
31230
- variantTitle: z54.string().optional().nullable(),
31231
- quantity: z54.number().finite(),
31232
- unitPriceCents: z54.number().finite(),
31233
- currency: z54.string().min(1),
31234
- imageUrl: z54.string().optional().nullable(),
31235
- soldOut: z54.boolean().optional()
31236
- });
31237
- var storedPassCartItemSchema = z54.object({
31238
- kind: z54.literal("pass"),
31239
- passId: z54.string().min(1),
31240
- title: z54.string().min(1),
31241
- quantity: z54.number().finite().optional(),
31242
- unitPriceCents: z54.number().finite(),
31243
- currency: z54.string().min(1)
32193
+ import { z as z56 } from "zod";
32194
+ var storedProductCartItemSchema = z56.object({
32195
+ kind: z56.literal("product"),
32196
+ productId: z56.string().min(1),
32197
+ productCategoryId: z56.string().min(1).optional().nullable(),
32198
+ variantId: z56.string().min(1).optional().nullable(),
32199
+ title: z56.string().min(1),
32200
+ variantTitle: z56.string().optional().nullable(),
32201
+ quantity: z56.number().finite(),
32202
+ unitPriceCents: z56.number().finite(),
32203
+ currency: z56.string().min(1),
32204
+ imageUrl: z56.string().optional().nullable(),
32205
+ soldOut: z56.boolean().optional()
32206
+ });
32207
+ var storedPassCartItemSchema = z56.object({
32208
+ kind: z56.literal("pass"),
32209
+ passId: z56.string().min(1),
32210
+ title: z56.string().min(1),
32211
+ quantity: z56.number().finite().optional(),
32212
+ unitPriceCents: z56.number().finite(),
32213
+ currency: z56.string().min(1)
31244
32214
  });
31245
32215
  function deriveCommerceCheckoutState(state) {
31246
32216
  if (state.items.length === 0) {
@@ -31479,219 +32449,219 @@ function formatValidity(days) {
31479
32449
  }
31480
32450
 
31481
32451
  // ../blocks/src/system/runtime/nodes/shop.interactive.ts
31482
- var shopModeSchema = z55.enum(["passes-memberships", "product-list", "product-detail", "cart", "checkout"]);
31483
- var contentEntrySchema3 = z55.object({
31484
- id: z55.string().nullable().optional(),
31485
- slug: z55.string().nullable().optional()
32452
+ var shopModeSchema = z57.enum(["passes-memberships", "product-list", "product-detail", "cart", "checkout"]);
32453
+ var contentEntrySchema3 = z57.object({
32454
+ id: z57.string().nullable().optional(),
32455
+ slug: z57.string().nullable().optional()
31486
32456
  }).nullable();
31487
- var shopSourceSchema = z55.object({
31488
- className: z55.string().nullable().optional(),
32457
+ var shopSourceSchema = z57.object({
32458
+ className: z57.string().nullable().optional(),
31489
32459
  mode: shopModeSchema.optional(),
31490
- heading: z55.string().nullable().optional(),
31491
- productSlug: z55.string().nullable().optional(),
31492
- showPasses: z55.boolean().optional(),
31493
- showMemberships: z55.boolean().optional(),
31494
- layout: z55.enum(["grid", "list"]).optional(),
31495
- columns: z55.string().optional(),
31496
- showDescriptions: z55.boolean().optional(),
31497
- showSummary: z55.boolean().optional(),
31498
- showBody: z55.boolean().optional(),
31499
- showBadges: z55.boolean().optional(),
31500
- showPrices: z55.boolean().optional(),
31501
- showValidityPeriod: z55.boolean().optional(),
31502
- showPricePerCredit: z55.boolean().nullable().optional(),
31503
- passesHeading: z55.string().optional(),
31504
- membershipsHeading: z55.string().optional(),
31505
- buyButtonText: z55.string().optional(),
31506
- addButtonText: z55.string().optional(),
31507
- passPurchaseMode: z55.enum(["add_to_cart", "buy_now"]).optional(),
31508
- subscribeButtonText: z55.string().optional(),
31509
- emptyStateText: z55.string().optional(),
31510
- checkoutButtonText: z55.string().optional(),
31511
- clearButtonText: z55.string().optional(),
31512
- submitButtonText: z55.string().optional(),
32460
+ heading: z57.string().nullable().optional(),
32461
+ productSlug: z57.string().nullable().optional(),
32462
+ showPasses: z57.boolean().optional(),
32463
+ showMemberships: z57.boolean().optional(),
32464
+ layout: z57.enum(["grid", "list"]).optional(),
32465
+ columns: z57.string().optional(),
32466
+ showDescriptions: z57.boolean().optional(),
32467
+ showSummary: z57.boolean().optional(),
32468
+ showBody: z57.boolean().optional(),
32469
+ showBadges: z57.boolean().optional(),
32470
+ showPrices: z57.boolean().optional(),
32471
+ showValidityPeriod: z57.boolean().optional(),
32472
+ showPricePerCredit: z57.boolean().nullable().optional(),
32473
+ passesHeading: z57.string().optional(),
32474
+ membershipsHeading: z57.string().optional(),
32475
+ buyButtonText: z57.string().optional(),
32476
+ addButtonText: z57.string().optional(),
32477
+ passPurchaseMode: z57.enum(["add_to_cart", "buy_now"]).optional(),
32478
+ subscribeButtonText: z57.string().optional(),
32479
+ emptyStateText: z57.string().optional(),
32480
+ checkoutButtonText: z57.string().optional(),
32481
+ clearButtonText: z57.string().optional(),
32482
+ submitButtonText: z57.string().optional(),
31513
32483
  contentEntry: contentEntrySchema3.optional(),
31514
- passes: z55.array(publicPassProductSchema).nullable().optional(),
31515
- memberships: z55.array(publicMembershipProductSchema).nullable().optional(),
31516
- products: z55.array(publicProductSchema).nullable().optional(),
31517
- siteId: z55.string().optional(),
31518
- apiBaseUrl: z55.string().optional(),
32484
+ passes: z57.array(publicPassProductSchema).nullable().optional(),
32485
+ memberships: z57.array(publicMembershipProductSchema).nullable().optional(),
32486
+ products: z57.array(publicProductSchema).nullable().optional(),
32487
+ siteId: z57.string().optional(),
32488
+ apiBaseUrl: z57.string().optional(),
31519
32489
  stage: previewStageSchema.optional()
31520
32490
  });
31521
- var productVariantOptionDisplaySchema = z55.object({
31522
- id: z55.string(),
31523
- label: z55.string(),
31524
- soldOut: z55.boolean()
31525
- });
31526
- var productCardDisplaySchema = z55.object({
31527
- productId: z55.string(),
31528
- title: z55.string(),
31529
- path: z55.string().nullable(),
31530
- summary: z55.string().nullable(),
31531
- priceLabel: z55.string().nullable(),
31532
- badges: z55.array(z55.string()),
31533
- image: z55.object({
31534
- url: z55.string(),
31535
- alt: z55.string().nullable()
32491
+ var productVariantOptionDisplaySchema = z57.object({
32492
+ id: z57.string(),
32493
+ label: z57.string(),
32494
+ soldOut: z57.boolean()
32495
+ });
32496
+ var productCardDisplaySchema = z57.object({
32497
+ productId: z57.string(),
32498
+ title: z57.string(),
32499
+ path: z57.string().nullable(),
32500
+ summary: z57.string().nullable(),
32501
+ priceLabel: z57.string().nullable(),
32502
+ badges: z57.array(z57.string()),
32503
+ image: z57.object({
32504
+ url: z57.string(),
32505
+ alt: z57.string().nullable()
31536
32506
  }).nullable(),
31537
- variantOptions: z55.array(productVariantOptionDisplaySchema),
31538
- selectedVariantId: z55.string().nullable(),
31539
- selectionLabel: z55.string(),
31540
- actionLabel: z55.string(),
31541
- soldOut: z55.boolean()
31542
- });
31543
- var productListDisplaySchema = z55.object({
31544
- kind: z55.literal("product-list"),
31545
- state: z55.enum(["empty", "ready"]),
31546
- heading: z55.string().nullable(),
31547
- className: z55.string().nullable(),
31548
- layout: z55.enum(["grid", "list"]),
31549
- columns: z55.string(),
31550
- emptyMessage: z55.string(),
31551
- cards: z55.array(productCardDisplaySchema)
31552
- });
31553
- var productDetailDisplaySchema = z55.discriminatedUnion("state", [
31554
- z55.object({
31555
- kind: z55.literal("product-detail"),
31556
- state: z55.literal("empty"),
31557
- heading: z55.string().nullable(),
31558
- className: z55.string().nullable(),
31559
- emptyMessage: z55.string()
32507
+ variantOptions: z57.array(productVariantOptionDisplaySchema),
32508
+ selectedVariantId: z57.string().nullable(),
32509
+ selectionLabel: z57.string(),
32510
+ actionLabel: z57.string(),
32511
+ soldOut: z57.boolean()
32512
+ });
32513
+ var productListDisplaySchema = z57.object({
32514
+ kind: z57.literal("product-list"),
32515
+ state: z57.enum(["empty", "ready"]),
32516
+ heading: z57.string().nullable(),
32517
+ className: z57.string().nullable(),
32518
+ layout: z57.enum(["grid", "list"]),
32519
+ columns: z57.string(),
32520
+ emptyMessage: z57.string(),
32521
+ cards: z57.array(productCardDisplaySchema)
32522
+ });
32523
+ var productDetailDisplaySchema = z57.discriminatedUnion("state", [
32524
+ z57.object({
32525
+ kind: z57.literal("product-detail"),
32526
+ state: z57.literal("empty"),
32527
+ heading: z57.string().nullable(),
32528
+ className: z57.string().nullable(),
32529
+ emptyMessage: z57.string()
31560
32530
  }),
31561
- z55.object({
31562
- kind: z55.literal("product-detail"),
31563
- state: z55.literal("ready"),
31564
- heading: z55.string().nullable(),
31565
- className: z55.string().nullable(),
31566
- title: z55.string(),
31567
- priceLabel: z55.string(),
31568
- summary: z55.string().nullable(),
31569
- badges: z55.array(z55.string()),
31570
- categoryLabel: z55.string().nullable(),
31571
- gallery: z55.array(z55.object({
31572
- url: z55.string(),
31573
- alt: z55.string().nullable()
32531
+ z57.object({
32532
+ kind: z57.literal("product-detail"),
32533
+ state: z57.literal("ready"),
32534
+ heading: z57.string().nullable(),
32535
+ className: z57.string().nullable(),
32536
+ title: z57.string(),
32537
+ priceLabel: z57.string(),
32538
+ summary: z57.string().nullable(),
32539
+ badges: z57.array(z57.string()),
32540
+ categoryLabel: z57.string().nullable(),
32541
+ gallery: z57.array(z57.object({
32542
+ url: z57.string(),
32543
+ alt: z57.string().nullable()
31574
32544
  })),
31575
- variantOptions: z55.array(productVariantOptionDisplaySchema),
31576
- selectedVariantId: z55.string().nullable(),
31577
- selectionLabel: z55.string(),
31578
- actionLabel: z55.string(),
31579
- soldOut: z55.boolean(),
31580
- body: z55.unknown().nullable()
32545
+ variantOptions: z57.array(productVariantOptionDisplaySchema),
32546
+ selectedVariantId: z57.string().nullable(),
32547
+ selectionLabel: z57.string(),
32548
+ actionLabel: z57.string(),
32549
+ soldOut: z57.boolean(),
32550
+ body: z57.unknown().nullable()
31581
32551
  })
31582
32552
  ]);
31583
- var passCardDisplaySchema = z55.object({
31584
- id: z55.string(),
31585
- title: z55.string(),
31586
- description: z55.string().nullable(),
31587
- priceLabel: z55.string(),
31588
- creditsLabel: z55.string(),
31589
- perCreditLabel: z55.string().nullable(),
31590
- validityLabel: z55.string().nullable(),
31591
- actionLabel: z55.string()
31592
- });
31593
- var membershipCardDisplaySchema = z55.object({
31594
- id: z55.string(),
31595
- title: z55.string(),
31596
- description: z55.string().nullable(),
31597
- priceLabel: z55.string(),
31598
- intervalLabel: z55.string(),
31599
- actionLabel: z55.string()
31600
- });
31601
- var passesMembershipsDisplaySchema = z55.object({
31602
- kind: z55.literal("passes-memberships"),
31603
- state: z55.enum(["empty", "ready"]),
31604
- className: z55.string().nullable(),
31605
- layout: z55.enum(["grid", "list"]),
31606
- columns: z55.string(),
31607
- emptyMessage: z55.string(),
31608
- passesHeading: z55.string(),
31609
- membershipsHeading: z55.string(),
31610
- passes: z55.array(passCardDisplaySchema),
31611
- memberships: z55.array(membershipCardDisplaySchema)
31612
- });
31613
- var cartLineDisplaySchema = z55.object({
31614
- key: z55.string(),
31615
- title: z55.string(),
31616
- priceLabel: z55.string(),
31617
- quantity: z55.number(),
31618
- quantityEditable: z55.boolean()
31619
- });
31620
- var cartDisplaySchema = z55.object({
31621
- kind: z55.literal("cart"),
31622
- state: z55.enum(["empty", "ready"]),
31623
- heading: z55.string().nullable(),
31624
- className: z55.string().nullable(),
31625
- emptyMessage: z55.string(),
31626
- supportText: z55.string().nullable(),
31627
- items: z55.array(cartLineDisplaySchema),
31628
- subtotalLabel: z55.string().nullable(),
31629
- checkoutButtonText: z55.string(),
31630
- clearButtonText: z55.string()
31631
- });
31632
- var checkoutDisplaySchema = z55.object({
31633
- kind: z55.literal("checkout"),
31634
- state: z55.enum(["empty", "blocked", "ready"]),
31635
- heading: z55.string().nullable(),
31636
- className: z55.string().nullable(),
31637
- message: z55.string().nullable(),
31638
- submitButtonText: z55.string()
31639
- });
31640
- var passesMembershipsHydrationSchema = z55.object({
31641
- passes: z55.array(publicPassProductSchema),
31642
- memberships: z55.array(publicMembershipProductSchema),
31643
- passPurchaseMode: z55.enum(["add_to_cart", "buy_now"])
31644
- });
31645
- var productListHydrationSchema = z55.object({
31646
- products: z55.array(publicProductSchema),
31647
- showSummary: z55.boolean(),
31648
- showBadges: z55.boolean(),
31649
- showPrices: z55.boolean(),
31650
- addButtonText: z55.string()
31651
- });
31652
- var productDetailHydrationSchema = z55.object({
31653
- products: z55.array(publicProductSchema),
31654
- productId: z55.string().nullable(),
31655
- showSummary: z55.boolean(),
31656
- showBadges: z55.boolean(),
31657
- showBody: z55.boolean(),
31658
- addButtonText: z55.string()
31659
- });
31660
- var cartHydrationSchema = z55.object({
31661
- emptyStateText: z55.string(),
31662
- checkoutButtonText: z55.string(),
31663
- clearButtonText: z55.string()
31664
- });
31665
- var checkoutHydrationSchema = z55.object({
31666
- emptyStateText: z55.string(),
31667
- submitButtonText: z55.string()
31668
- });
31669
- var passesMembershipsRenderSchema = z55.object({
32553
+ var passCardDisplaySchema = z57.object({
32554
+ id: z57.string(),
32555
+ title: z57.string(),
32556
+ description: z57.string().nullable(),
32557
+ priceLabel: z57.string(),
32558
+ creditsLabel: z57.string(),
32559
+ perCreditLabel: z57.string().nullable(),
32560
+ validityLabel: z57.string().nullable(),
32561
+ actionLabel: z57.string()
32562
+ });
32563
+ var membershipCardDisplaySchema = z57.object({
32564
+ id: z57.string(),
32565
+ title: z57.string(),
32566
+ description: z57.string().nullable(),
32567
+ priceLabel: z57.string(),
32568
+ intervalLabel: z57.string(),
32569
+ actionLabel: z57.string()
32570
+ });
32571
+ var passesMembershipsDisplaySchema = z57.object({
32572
+ kind: z57.literal("passes-memberships"),
32573
+ state: z57.enum(["empty", "ready"]),
32574
+ className: z57.string().nullable(),
32575
+ layout: z57.enum(["grid", "list"]),
32576
+ columns: z57.string(),
32577
+ emptyMessage: z57.string(),
32578
+ passesHeading: z57.string(),
32579
+ membershipsHeading: z57.string(),
32580
+ passes: z57.array(passCardDisplaySchema),
32581
+ memberships: z57.array(membershipCardDisplaySchema)
32582
+ });
32583
+ var cartLineDisplaySchema = z57.object({
32584
+ key: z57.string(),
32585
+ title: z57.string(),
32586
+ priceLabel: z57.string(),
32587
+ quantity: z57.number(),
32588
+ quantityEditable: z57.boolean()
32589
+ });
32590
+ var cartDisplaySchema = z57.object({
32591
+ kind: z57.literal("cart"),
32592
+ state: z57.enum(["empty", "ready"]),
32593
+ heading: z57.string().nullable(),
32594
+ className: z57.string().nullable(),
32595
+ emptyMessage: z57.string(),
32596
+ supportText: z57.string().nullable(),
32597
+ items: z57.array(cartLineDisplaySchema),
32598
+ subtotalLabel: z57.string().nullable(),
32599
+ checkoutButtonText: z57.string(),
32600
+ clearButtonText: z57.string()
32601
+ });
32602
+ var checkoutDisplaySchema = z57.object({
32603
+ kind: z57.literal("checkout"),
32604
+ state: z57.enum(["empty", "blocked", "ready"]),
32605
+ heading: z57.string().nullable(),
32606
+ className: z57.string().nullable(),
32607
+ message: z57.string().nullable(),
32608
+ submitButtonText: z57.string()
32609
+ });
32610
+ var passesMembershipsHydrationSchema = z57.object({
32611
+ passes: z57.array(publicPassProductSchema),
32612
+ memberships: z57.array(publicMembershipProductSchema),
32613
+ passPurchaseMode: z57.enum(["add_to_cart", "buy_now"])
32614
+ });
32615
+ var productListHydrationSchema = z57.object({
32616
+ products: z57.array(publicProductSchema),
32617
+ showSummary: z57.boolean(),
32618
+ showBadges: z57.boolean(),
32619
+ showPrices: z57.boolean(),
32620
+ addButtonText: z57.string()
32621
+ });
32622
+ var productDetailHydrationSchema = z57.object({
32623
+ products: z57.array(publicProductSchema),
32624
+ productId: z57.string().nullable(),
32625
+ showSummary: z57.boolean(),
32626
+ showBadges: z57.boolean(),
32627
+ showBody: z57.boolean(),
32628
+ addButtonText: z57.string()
32629
+ });
32630
+ var cartHydrationSchema = z57.object({
32631
+ emptyStateText: z57.string(),
32632
+ checkoutButtonText: z57.string(),
32633
+ clearButtonText: z57.string()
32634
+ });
32635
+ var checkoutHydrationSchema = z57.object({
32636
+ emptyStateText: z57.string(),
32637
+ submitButtonText: z57.string()
32638
+ });
32639
+ var passesMembershipsRenderSchema = z57.object({
31670
32640
  display: passesMembershipsDisplaySchema,
31671
32641
  hydration: passesMembershipsHydrationSchema
31672
32642
  });
31673
- var productListRenderSchema = z55.object({
32643
+ var productListRenderSchema = z57.object({
31674
32644
  display: productListDisplaySchema,
31675
32645
  hydration: productListHydrationSchema
31676
32646
  });
31677
- var productDetailRenderSchema = z55.object({
32647
+ var productDetailRenderSchema = z57.object({
31678
32648
  display: productDetailDisplaySchema,
31679
32649
  hydration: productDetailHydrationSchema
31680
32650
  });
31681
- var cartRenderSchema = z55.object({
32651
+ var cartRenderSchema = z57.object({
31682
32652
  display: cartDisplaySchema,
31683
32653
  hydration: cartHydrationSchema
31684
32654
  });
31685
- var checkoutRenderSchema = z55.object({
32655
+ var checkoutRenderSchema = z57.object({
31686
32656
  display: checkoutDisplaySchema,
31687
32657
  hydration: checkoutHydrationSchema
31688
32658
  });
31689
32659
  function resolveShowPricePerCredit(source) {
31690
32660
  return source.showPricePerCredit ?? true;
31691
32661
  }
31692
- var shopIslandMetaCodec = createZodCodec(z55.object({
31693
- siteId: z55.string().optional(),
31694
- apiBaseUrl: z55.string().optional(),
32662
+ var shopIslandMetaCodec = createZodCodec(z57.object({
32663
+ siteId: z57.string().optional(),
32664
+ apiBaseUrl: z57.string().optional(),
31695
32665
  stage: previewStageSchema.optional()
31696
32666
  }));
31697
32667
  var shopIslandMetaKeys = defineInteractiveIslandMetaKeys("siteId", "apiBaseUrl", "stage");
@@ -32073,9 +33043,9 @@ var shopBlockDefinition = {
32073
33043
  runtime: shopBlockRuntime,
32074
33044
  dataSchemas: {
32075
33045
  // listPublicPasses returns { passes: [...] }
32076
- passes: z56.object({ passes: z56.array(publicPassProductSchema) }).optional(),
33046
+ passes: z58.object({ passes: z58.array(publicPassProductSchema) }).optional(),
32077
33047
  // listPublicMemberships returns { memberships: [...] }
32078
- memberships: z56.object({ memberships: z56.array(publicMembershipProductSchema) }).optional()
33048
+ memberships: z58.object({ memberships: z58.array(publicMembershipProductSchema) }).optional()
32079
33049
  },
32080
33050
  dataLoaders: {
32081
33051
  // Load passes for display
@@ -32098,7 +33068,7 @@ var shopBlockDefinition = {
32098
33068
  };
32099
33069
 
32100
33070
  // ../blocks/src/system/blocks/product-list.ts
32101
- import { z as z57 } from "zod";
33071
+ import { z as z59 } from "zod";
32102
33072
  var productListManifest = createBlockManifest({
32103
33073
  id: "block.product-list",
32104
33074
  version: "1.0.0",
@@ -32240,7 +33210,7 @@ var productListBlockDefinition = {
32240
33210
  }
32241
33211
  }
32242
33212
  };
32243
- var productListDataSchema = z57.object({
33213
+ var productListDataSchema = z59.object({
32244
33214
  products: publicProductsResponseSchema.optional()
32245
33215
  });
32246
33216
 
@@ -32510,72 +33480,72 @@ var checkoutBlockDefinition = {
32510
33480
  };
32511
33481
 
32512
33482
  // ../blocks/src/system/runtime/nodes/gifting.interactive.ts
32513
- import { z as z58 } from "zod";
32514
- var publicGiftCardOfferSchema = z58.object({
32515
- id: z58.string(),
32516
- kind: z58.literal("gift_card"),
32517
- title: z58.string(),
32518
- description: z58.string().nullable(),
32519
- sortOrder: z58.number().int(),
32520
- giftCard: z58.object({
32521
- fixedDenominations: z58.array(z58.number().int().positive()),
32522
- customAmountEnabled: z58.boolean(),
32523
- customAmountMinCents: z58.number().int().positive(),
32524
- customAmountMaxCents: z58.number().int().positive()
33483
+ import { z as z60 } from "zod";
33484
+ var publicGiftCardOfferSchema = z60.object({
33485
+ id: z60.string(),
33486
+ kind: z60.literal("gift_card"),
33487
+ title: z60.string(),
33488
+ description: z60.string().nullable(),
33489
+ sortOrder: z60.number().int(),
33490
+ giftCard: z60.object({
33491
+ fixedDenominations: z60.array(z60.number().int().positive()),
33492
+ customAmountEnabled: z60.boolean(),
33493
+ customAmountMinCents: z60.number().int().positive(),
33494
+ customAmountMaxCents: z60.number().int().positive()
32525
33495
  }),
32526
- voucher: z58.null()
32527
- });
32528
- var publicVoucherOfferSchema = z58.object({
32529
- id: z58.string(),
32530
- kind: z58.literal("voucher"),
32531
- title: z58.string(),
32532
- description: z58.string().nullable(),
32533
- sortOrder: z58.number().int(),
32534
- giftCard: z58.null(),
32535
- voucher: z58.object({
32536
- purchaseAmountCents: z58.number().int().positive()
33496
+ voucher: z60.null()
33497
+ });
33498
+ var publicVoucherOfferSchema = z60.object({
33499
+ id: z60.string(),
33500
+ kind: z60.literal("voucher"),
33501
+ title: z60.string(),
33502
+ description: z60.string().nullable(),
33503
+ sortOrder: z60.number().int(),
33504
+ giftCard: z60.null(),
33505
+ voucher: z60.object({
33506
+ purchaseAmountCents: z60.number().int().positive()
32537
33507
  })
32538
33508
  });
32539
- var publicGiftingOffersResponseSchema = z58.object({
32540
- currency: z58.string(),
32541
- giftCards: z58.array(publicGiftCardOfferSchema),
32542
- vouchers: z58.array(publicVoucherOfferSchema)
33509
+ var publicGiftingOffersResponseSchema = z60.object({
33510
+ currency: z60.string(),
33511
+ giftCards: z60.array(publicGiftCardOfferSchema),
33512
+ vouchers: z60.array(publicVoucherOfferSchema)
32543
33513
  });
32544
- var giftingSourceSchema = z58.object({
32545
- siteId: z58.string().optional(),
32546
- apiBaseUrl: z58.string().optional(),
33514
+ var giftingSourceSchema = z60.object({
33515
+ siteId: z60.string().optional(),
33516
+ apiBaseUrl: z60.string().optional(),
32547
33517
  offers: publicGiftingOffersResponseSchema.nullable().optional(),
32548
- className: z58.string().nullable().optional(),
32549
- heading: z58.string().nullable().optional(),
32550
- intro: z58.string().nullable().optional(),
32551
- giftCardsHeading: z58.string().nullable().optional(),
32552
- vouchersHeading: z58.string().nullable().optional(),
32553
- emptyStateText: z58.string().nullable().optional(),
32554
- checkoutButtonText: z58.string().nullable().optional(),
32555
- successMessage: z58.string().nullable().optional()
32556
- });
32557
- var giftingDisplaySchema = z58.object({
32558
- kind: z58.literal("gifting"),
32559
- state: z58.literal("ready"),
32560
- className: z58.string().nullable(),
32561
- heading: z58.string(),
32562
- intro: z58.string().nullable(),
32563
- giftCardsHeading: z58.string(),
32564
- vouchersHeading: z58.string(),
32565
- emptyStateText: z58.string()
32566
- });
32567
- var giftingHydrationSchema = z58.object({
33518
+ className: z60.string().nullable().optional(),
33519
+ heading: z60.string().nullable().optional(),
33520
+ intro: z60.string().nullable().optional(),
33521
+ giftCardsHeading: z60.string().nullable().optional(),
33522
+ vouchersHeading: z60.string().nullable().optional(),
33523
+ emptyStateText: z60.string().nullable().optional(),
33524
+ checkoutButtonText: z60.string().nullable().optional(),
33525
+ successMessage: z60.string().nullable().optional()
33526
+ });
33527
+ var giftingDisplaySchema = z60.object({
33528
+ kind: z60.literal("gifting"),
33529
+ state: z60.literal("ready"),
33530
+ className: z60.string().nullable(),
33531
+ heading: z60.string(),
33532
+ intro: z60.string().nullable(),
33533
+ giftCardsHeading: z60.string(),
33534
+ vouchersHeading: z60.string(),
33535
+ emptyStateText: z60.string()
33536
+ });
33537
+ var giftingHydrationSchema = z60.object({
32568
33538
  offers: publicGiftingOffersResponseSchema.nullable(),
32569
- checkoutButtonText: z58.string(),
32570
- successMessage: z58.string()
33539
+ checkoutButtonText: z60.string(),
33540
+ successMessage: z60.string()
32571
33541
  });
32572
- var giftingRenderSchema = z58.object({
33542
+ var giftingRenderSchema = z60.object({
32573
33543
  display: giftingDisplaySchema,
32574
33544
  hydration: giftingHydrationSchema
32575
33545
  });
32576
- var giftingIslandMetaCodec = createZodCodec(z58.object({
32577
- siteId: z58.string().optional(),
32578
- apiBaseUrl: z58.string().optional()
33546
+ var giftingIslandMetaCodec = createZodCodec(z60.object({
33547
+ siteId: z60.string().optional(),
33548
+ apiBaseUrl: z60.string().optional()
32579
33549
  }));
32580
33550
  var giftingIslandMetaKeys = defineInteractiveIslandMetaKeys(
32581
33551
  "siteId",
@@ -32746,7 +33716,7 @@ var giftingBlockDefinition = {
32746
33716
  };
32747
33717
 
32748
33718
  // ../blocks/src/system/runtime/nodes/newsletter-form.interactive.ts
32749
- import { z as z59 } from "zod";
33719
+ import { z as z61 } from "zod";
32750
33720
 
32751
33721
  // ../blocks/src/system/runtime/nodes/newsletter-form.types.ts
32752
33722
  function getPresetFields(preset2, options) {
@@ -32800,49 +33770,49 @@ function withOptionalPhone(fields3, includePhone) {
32800
33770
  }
32801
33771
 
32802
33772
  // ../blocks/src/system/runtime/nodes/newsletter-form.interactive.ts
32803
- var newsletterPresetSchema = z59.enum(["emailOnly", "emailName", "emailFirstLast", "emailNameCompany"]);
32804
- var newsletterFieldSchema = z59.object({
32805
- id: z59.string(),
32806
- type: z59.enum(["email", "text"]),
32807
- label: z59.string(),
32808
- required: z59.boolean(),
32809
- placeholder: z59.string().optional()
32810
- });
32811
- var newsletterSourceSchema = z59.object({
32812
- siteId: z59.string().optional(),
32813
- apiBaseUrl: z59.string().optional(),
32814
- listId: z59.string().nullable().optional(),
33773
+ var newsletterPresetSchema = z61.enum(["emailOnly", "emailName", "emailFirstLast", "emailNameCompany"]);
33774
+ var newsletterFieldSchema = z61.object({
33775
+ id: z61.string(),
33776
+ type: z61.enum(["email", "text"]),
33777
+ label: z61.string(),
33778
+ required: z61.boolean(),
33779
+ placeholder: z61.string().optional()
33780
+ });
33781
+ var newsletterSourceSchema = z61.object({
33782
+ siteId: z61.string().optional(),
33783
+ apiBaseUrl: z61.string().optional(),
33784
+ listId: z61.string().nullable().optional(),
32815
33785
  preset: newsletterPresetSchema.optional(),
32816
- includePhone: z59.boolean().optional(),
32817
- buttonLabel: z59.string().nullable().optional(),
32818
- successMessage: z59.string().nullable().optional(),
32819
- privacyNote: z59.string().nullable().optional(),
32820
- tags: z59.string().nullable().optional(),
32821
- spamProtectionEnabled: z59.boolean().optional(),
32822
- className: z59.string().nullable().optional()
32823
- });
32824
- var newsletterDisplaySchema = z59.object({
32825
- kind: z59.literal("newsletter-form"),
32826
- className: z59.string().nullable(),
32827
- buttonLabel: z59.string(),
32828
- successMessage: z59.string().nullable(),
32829
- privacyNote: z59.string().nullable(),
32830
- fields: z59.array(newsletterFieldSchema)
32831
- });
32832
- var newsletterHydrationSchema = z59.object({
32833
- listId: z59.string().nullable().optional(),
33786
+ includePhone: z61.boolean().optional(),
33787
+ buttonLabel: z61.string().nullable().optional(),
33788
+ successMessage: z61.string().nullable().optional(),
33789
+ privacyNote: z61.string().nullable().optional(),
33790
+ tags: z61.string().nullable().optional(),
33791
+ spamProtectionEnabled: z61.boolean().optional(),
33792
+ className: z61.string().nullable().optional()
33793
+ });
33794
+ var newsletterDisplaySchema = z61.object({
33795
+ kind: z61.literal("newsletter-form"),
33796
+ className: z61.string().nullable(),
33797
+ buttonLabel: z61.string(),
33798
+ successMessage: z61.string().nullable(),
33799
+ privacyNote: z61.string().nullable(),
33800
+ fields: z61.array(newsletterFieldSchema)
33801
+ });
33802
+ var newsletterHydrationSchema = z61.object({
33803
+ listId: z61.string().nullable().optional(),
32834
33804
  preset: newsletterPresetSchema,
32835
- includePhone: z59.boolean(),
32836
- tags: z59.string().nullable().optional(),
32837
- spamProtectionEnabled: z59.boolean().optional()
33805
+ includePhone: z61.boolean(),
33806
+ tags: z61.string().nullable().optional(),
33807
+ spamProtectionEnabled: z61.boolean().optional()
32838
33808
  });
32839
- var newsletterRenderSchema = z59.object({
33809
+ var newsletterRenderSchema = z61.object({
32840
33810
  display: newsletterDisplaySchema,
32841
33811
  hydration: newsletterHydrationSchema
32842
33812
  });
32843
- var newsletterIslandMetaCodec = createZodCodec(z59.object({
32844
- siteId: z59.string().optional(),
32845
- apiBaseUrl: z59.string().optional()
33813
+ var newsletterIslandMetaCodec = createZodCodec(z61.object({
33814
+ siteId: z61.string().optional(),
33815
+ apiBaseUrl: z61.string().optional()
32846
33816
  }));
32847
33817
  var newsletterIslandMetaKeys = defineInteractiveIslandMetaKeys("siteId", "apiBaseUrl");
32848
33818
  function buildNewsletterDisplay(source) {
@@ -32963,23 +33933,23 @@ var newsletterSignupBlockDefinition = {
32963
33933
  };
32964
33934
 
32965
33935
  // ../blocks/src/system/blocks/team-members.ts
32966
- import { z as z60 } from "zod";
33936
+ import { z as z62 } from "zod";
32967
33937
  var ITEM_NAME2 = "member";
32968
33938
  var teamMemberPhotoSchema = mediaSchema2.refine((media2) => media2.type === "image", {
32969
33939
  message: "Team member photos must be image media"
32970
33940
  }).nullable();
32971
- var teamMemberDataSchema = z60.object({
32972
- _type: z60.literal("teamMember"),
32973
- id: z60.string(),
32974
- name: z60.string(),
32975
- role: z60.string().nullable(),
32976
- roleLabel: z60.string().nullable(),
32977
- bio: z60.string().nullable(),
32978
- summary: z60.string().nullable(),
33941
+ var teamMemberDataSchema = z62.object({
33942
+ _type: z62.literal("teamMember"),
33943
+ id: z62.string(),
33944
+ name: z62.string(),
33945
+ role: z62.string().nullable(),
33946
+ roleLabel: z62.string().nullable(),
33947
+ bio: z62.string().nullable(),
33948
+ summary: z62.string().nullable(),
32979
33949
  photo: teamMemberPhotoSchema,
32980
- profilePath: z60.string().nullable()
33950
+ profilePath: z62.string().nullable()
32981
33951
  });
32982
- var teamMembersDataSchema = z60.array(teamMemberDataSchema);
33952
+ var teamMembersDataSchema = z62.array(teamMemberDataSchema);
32983
33953
  var dynamicSourceWhen = { equals: "site_staff" };
32984
33954
  var manualSourceWhen = { equals: "site_staff", not: true };
32985
33955
  var headingNode = text(
@@ -33749,6 +34719,13 @@ function eventListCapable() {
33749
34719
  eventListTreatments
33750
34720
  });
33751
34721
  }
34722
+ function offeringsPreviewCapable() {
34723
+ return declareBlockDesignCapability({
34724
+ sectionSurfaces: "supported",
34725
+ contentFrames: ["plain"],
34726
+ itemSurfaces: "supported"
34727
+ });
34728
+ }
33752
34729
  function defaultBoundaryBias(visualWeight) {
33753
34730
  return visualWeight === "featured" || visualWeight === "immersive" ? "clear" : "soft";
33754
34731
  }
@@ -33862,6 +34839,13 @@ var systemBlockDefinitionsRaw = [
33862
34839
  weight: "featured",
33863
34840
  bias: "clear",
33864
34841
  surfaces: heroSectionSurfaces
34842
+ }),
34843
+ layoutProfile({
34844
+ variantKey: "splitEditorial",
34845
+ family: "split",
34846
+ weight: "featured",
34847
+ bias: "clear",
34848
+ surfaces: heroSectionSurfaces
33865
34849
  })
33866
34850
  ]
33867
34851
  })),
@@ -33956,7 +34940,10 @@ var systemBlockDefinitionsRaw = [
33956
34940
  })),
33957
34941
  withDesignCapability("block.form", formBlockDefinition, panelCapable(), defineBlockDesignMetadata({
33958
34942
  flow: conversionFlow,
33959
- layoutProfiles: [layoutProfile({ variantKey: "default", family: "form", weight: "standard" })]
34943
+ layoutProfiles: [
34944
+ layoutProfile({ variantKey: "default", family: "form", weight: "standard" }),
34945
+ layoutProfile({ variantKey: "two-column", family: "split", weight: "standard" })
34946
+ ]
33960
34947
  })),
33961
34948
  withDesignCapability("block.faq", faqBlockDefinition, withEyebrowCapability(declareBlockDesignCapability({
33962
34949
  sectionSurfaces: "supported",
@@ -33985,7 +34972,10 @@ var systemBlockDefinitionsRaw = [
33985
34972
  contentFrames: ["plain", "panel"],
33986
34973
  itemSurfaces: "supported",
33987
34974
  testimonialCardTreatments: ["default", "statement", "non-carded", "accent-quote", "editorial-serif-quote"],
33988
- headingDecorations: ["short-center-rule"]
34975
+ headingDecorationCapability: {
34976
+ kind: "supported",
34977
+ families: ["short-center-rule"]
34978
+ }
33989
34979
  }), defineBlockDesignMetadata({
33990
34980
  flow: proofFlow,
33991
34981
  layoutProfiles: [
@@ -34088,6 +35078,10 @@ var systemBlockDefinitionsRaw = [
34088
35078
  layoutProfile({ variantKey: "timetable", family: "stack", weight: "standard" })
34089
35079
  ]
34090
35080
  })),
35081
+ withDesignCapability("block.offerings-preview", offeringsPreviewBlockDefinition, offeringsPreviewCapable(), defineBlockDesignMetadata({
35082
+ flow: offeringsFlow,
35083
+ layoutProfiles: [layoutProfile({ variantKey: "cards", family: "grid", weight: "standard" })]
35084
+ })),
34091
35085
  // Friendly wrapper blocks
34092
35086
  withDesignCapability("block.team-members", teamMembersBlockDefinition, sectionOnly(), defineBlockDesignMetadata({
34093
35087
  flow: proofFlow,
@@ -34611,32 +35605,8 @@ var backgroundTransforms = [
34611
35605
  {
34612
35606
  id: "background.resolveColorsStyle",
34613
35607
  kind: "formatter",
34614
- summary: "Resolve text + heading colors from a background object into scoped CSS vars",
34615
- run: (value, _options, context) => {
34616
- if (!value || typeof value !== "object") {
34617
- return {};
34618
- }
34619
- const input = value;
34620
- const textColor = isString(input.textColor) ? input.textColor.trim() : null;
34621
- const headingColor = isString(input.headingColor) ? input.headingColor.trim() : null;
34622
- const style = {};
34623
- if (textColor) {
34624
- const resolvedText = resolveBackgroundColorValue(textColor, context);
34625
- if (resolvedText) {
34626
- style.color = resolvedText;
34627
- style["--section-text-color"] = resolvedText;
34628
- if (headingColor) {
34629
- const resolvedHeading = resolveBackgroundColorValue(headingColor, context);
34630
- if (resolvedHeading) {
34631
- style["--section-heading-color"] = resolvedHeading;
34632
- }
34633
- } else {
34634
- style["--section-heading-color"] = resolvedText;
34635
- }
34636
- }
34637
- }
34638
- return style;
34639
- }
35608
+ summary: "Resolve section foreground colors from a background object into scoped CSS vars",
35609
+ run: (value, _options, context) => resolveSectionForegroundStyles(value, context)
34640
35610
  },
34641
35611
  {
34642
35612
  id: "background.resolveAllowOverflow",
@@ -34864,32 +35834,130 @@ var builtinTransformDefinitions = [
34864
35834
  ];
34865
35835
  var defaultTransforms = createTransformRegistry(builtinTransformDefinitions);
34866
35836
 
35837
+ // ../blocks/src/system/data/linkedContentEntries.ts
35838
+ var LINKED_CONTENT_ENTRY_META_KEY = "__rbLinkedContentEntry";
35839
+ function coerceLinkedContentEntriesPayload(payload) {
35840
+ if (!isRecord3(payload)) return payload;
35841
+ const response = payload;
35842
+ if (!Array.isArray(response.entries)) return payload;
35843
+ const contentType = parsePublicContentTypeMeta(response.contentType);
35844
+ if (!contentType) return response.entries;
35845
+ return response.entries.map((entry) => enrichLinkedContentEntry(entry, contentType));
35846
+ }
35847
+ function enrichLinkedContentEntry(entry, contentType) {
35848
+ if (!isRecord3(entry)) return entry;
35849
+ const entryId = typeof entry.id === "string" ? entry.id : null;
35850
+ if (!entryId) return entry;
35851
+ const title = typeof entry.title === "string" && entry.title.trim().length > 0 ? entry.title : entryId;
35852
+ const optimisticHash = typeof entry.optimisticHash === "string" && entry.optimisticHash.length > 0 ? entry.optimisticHash : null;
35853
+ const meta = {
35854
+ kind: "linked-content-entry",
35855
+ entryId,
35856
+ contentTypeKey: contentType.key,
35857
+ contentTypeLabel: contentTypeKeyToLabel(contentType.key),
35858
+ title,
35859
+ optimisticHash,
35860
+ support: resolveLinkedContentEditSupport(contentType),
35861
+ contentType
35862
+ };
35863
+ return {
35864
+ ...entry,
35865
+ [LINKED_CONTENT_ENTRY_META_KEY]: meta
35866
+ };
35867
+ }
35868
+ function resolveLinkedContentEditSupport(contentType) {
35869
+ if (contentType.fields.length === 0) {
35870
+ return { kind: "unsupported-missing-schema", reason: "Content type has no public field metadata." };
35871
+ }
35872
+ const metadata = contentType.previewLinkedEntryEditing;
35873
+ if (!metadata) {
35874
+ return { kind: "unsupported-content-type", reason: "Content type has not enabled linked-entry preview editing." };
35875
+ }
35876
+ switch (metadata.kind) {
35877
+ case "generic":
35878
+ return { kind: "supported" };
35879
+ case "unsupported-domain-backed":
35880
+ return { kind: "unsupported-domain-backed", reason: metadata.reason };
35881
+ default:
35882
+ return assertNever(metadata);
35883
+ }
35884
+ }
35885
+ function contentTypeKeyToLabel(key) {
35886
+ const singular = key.endsWith("ies") ? `${key.slice(0, -3)}y` : key.endsWith("s") ? key.slice(0, -1) : key;
35887
+ return singular.split(/[-_\s]+/).filter((part) => part.length > 0).map((part, index) => index === 0 ? capitalize(part) : part.toLowerCase()).join(" ");
35888
+ }
35889
+ function capitalize(value) {
35890
+ return value.charAt(0).toUpperCase() + value.slice(1).toLowerCase();
35891
+ }
35892
+ function parsePublicContentTypeMeta(value) {
35893
+ if (!isRecord3(value)) return null;
35894
+ if (typeof value.key !== "string" || value.key.trim().length === 0) return null;
35895
+ return {
35896
+ key: value.key,
35897
+ titleField: typeof value.titleField === "string" ? value.titleField : null,
35898
+ fields: Array.isArray(value.fields) ? value.fields.flatMap(parsePublicContentTypeFieldMeta) : [],
35899
+ previewLinkedEntryEditing: parsePublicContentTypeLinkedEntryEditing(value.previewLinkedEntryEditing)
35900
+ };
35901
+ }
35902
+ function parsePublicContentTypeLinkedEntryEditing(value) {
35903
+ if (!isRecord3(value) || typeof value.kind !== "string") return null;
35904
+ switch (value.kind) {
35905
+ case "generic":
35906
+ return { kind: "generic" };
35907
+ case "unsupported-domain-backed":
35908
+ return {
35909
+ kind: "unsupported-domain-backed",
35910
+ reason: typeof value.reason === "string" ? value.reason : "Domain-backed entries need a dedicated editor workflow."
35911
+ };
35912
+ default:
35913
+ return null;
35914
+ }
35915
+ }
35916
+ function parsePublicContentTypeFieldMeta(value) {
35917
+ if (!isRecord3(value)) return [];
35918
+ if (typeof value.id !== "string" || typeof value.type !== "string") return [];
35919
+ return [{
35920
+ id: value.id,
35921
+ type: value.type,
35922
+ mediaKinds: parseStringArray(value.mediaKinds),
35923
+ fileKinds: parseStringArray(value.fileKinds)
35924
+ }];
35925
+ }
35926
+ function parseStringArray(value) {
35927
+ if (value === null || typeof value === "undefined") return null;
35928
+ if (!Array.isArray(value)) return null;
35929
+ return value.filter((item) => typeof item === "string");
35930
+ }
35931
+ function isRecord3(value) {
35932
+ return typeof value === "object" && value !== null && !Array.isArray(value);
35933
+ }
35934
+
34867
35935
  // ../blocks/src/system/manifest/richTextSchema.ts
34868
- import { z as z61 } from "zod";
34869
- var TipTapMarkSchema = z61.object({
34870
- type: z61.string(),
34871
- attrs: z61.record(z61.string(), z61.unknown()).optional()
34872
- });
34873
- var TipTapNodeSchema = z61.lazy(
34874
- () => z61.object({
34875
- type: z61.string(),
34876
- content: z61.array(TipTapNodeSchema).optional(),
34877
- text: z61.string().optional(),
34878
- attrs: z61.record(z61.string(), z61.unknown()).optional(),
34879
- marks: z61.array(TipTapMarkSchema).optional()
35936
+ import { z as z63 } from "zod";
35937
+ var TipTapMarkSchema = z63.object({
35938
+ type: z63.string(),
35939
+ attrs: z63.record(z63.string(), z63.unknown()).optional()
35940
+ });
35941
+ var TipTapNodeSchema = z63.lazy(
35942
+ () => z63.object({
35943
+ type: z63.string(),
35944
+ content: z63.array(TipTapNodeSchema).optional(),
35945
+ text: z63.string().optional(),
35946
+ attrs: z63.record(z63.string(), z63.unknown()).optional(),
35947
+ marks: z63.array(TipTapMarkSchema).optional()
34880
35948
  })
34881
35949
  );
34882
- var RichTextValueSchema = z61.union([
35950
+ var RichTextValueSchema = z63.union([
34883
35951
  // Canonical: TipTap document directly
34884
35952
  TipTapNodeSchema,
34885
35953
  // Legacy (read-tolerance only): wrapped in { doc: {...} }
34886
- z61.object({
35954
+ z63.object({
34887
35955
  doc: TipTapNodeSchema
34888
35956
  })
34889
35957
  ]);
34890
- var RichTextDocSchema = z61.object({
34891
- type: z61.literal("doc"),
34892
- content: z61.array(TipTapNodeSchema)
35958
+ var RichTextDocSchema = z63.object({
35959
+ type: z63.literal("doc"),
35960
+ content: z63.array(TipTapNodeSchema)
34893
35961
  });
34894
35962
  function unwrapRichTextRoot(value) {
34895
35963
  if (!isRecord2(value)) return value;
@@ -35057,9 +36125,21 @@ var NAV_DROPDOWN_CONTAINER_RAIL_CSS_RULES = [
35057
36125
  ];
35058
36126
 
35059
36127
  // ../theme-core/src/layout/generateLayoutCss.ts
35060
- var waveTransitionMask = svgDataUrl(
36128
+ var classicWaveTransitionMask = svgDataUrl(
35061
36129
  "<svg viewBox='0 0 1440 72' xmlns='http://www.w3.org/2000/svg' preserveAspectRatio='none'><path d='M0 72V46C130 55 260 24 420 30C590 36 690 62 860 42C1035 21 1160 47 1305 36C1365 31 1415 33 1440 38V72H0Z' fill='white'/></svg>"
35062
36130
  );
36131
+ var balancedWaveTransitionMask = svgDataUrl(
36132
+ "<svg viewBox='0 0 1440 72' xmlns='http://www.w3.org/2000/svg' preserveAspectRatio='none'><path d='M0 72V42C120 24 240 24 360 42C480 60 600 60 720 42C840 24 960 24 1080 42C1200 60 1320 60 1440 42V72H0Z' fill='white'/></svg>"
36133
+ );
36134
+ var gentleWaveTransitionMask = svgDataUrl(
36135
+ "<svg viewBox='0 0 1440 72' xmlns='http://www.w3.org/2000/svg' preserveAspectRatio='none'><path d='M0 72V43C180 32 300 32 480 43C660 54 780 54 960 43C1140 32 1260 32 1440 43V72H0Z' fill='white'/></svg>"
36136
+ );
36137
+ var boldWaveTransitionMask = svgDataUrl(
36138
+ "<svg viewBox='0 0 1440 72' xmlns='http://www.w3.org/2000/svg' preserveAspectRatio='none'><path d='M0 72V44C90 14 270 14 360 44C450 74 630 74 720 44C810 14 990 14 1080 44C1170 74 1350 74 1440 44V72H0Z' fill='white'/></svg>"
36139
+ );
36140
+ var driftWaveTransitionMask = svgDataUrl(
36141
+ "<svg viewBox='0 0 1440 72' xmlns='http://www.w3.org/2000/svg' preserveAspectRatio='none'><path d='M0 72V39C115 31 205 54 340 48C505 41 610 16 760 33C920 51 1015 64 1160 44C1280 27 1375 35 1440 50V72H0Z' fill='white'/></svg>"
36142
+ );
35063
36143
  function svgDataUrl(svg) {
35064
36144
  return `data:image/svg+xml,${encodeURIComponent(svg)}`;
35065
36145
  }
@@ -36838,34 +37918,34 @@ import { Fragment, jsx as jsx6, jsxs as jsxs4 } from "react/jsx-runtime";
36838
37918
  var MAX_FONT_UPLOAD_BYTES = 5 * 1024 * 1024;
36839
37919
 
36840
37920
  // ../theme-core/src/runtime/buildThemeRuntimeFromBridge.ts
36841
- import { z as z62 } from "zod";
36842
- var themeBridgeConfigSchema = z62.object({
36843
- tokens: z62.record(z62.string(), z62.string()),
36844
- typography: z62.object({
36845
- headingFamily: z62.string().optional(),
36846
- bodyFamily: z62.string().optional(),
36847
- headingWeight: z62.number().optional(),
36848
- bodyWeight: z62.number().optional()
37921
+ import { z as z64 } from "zod";
37922
+ var themeBridgeConfigSchema = z64.object({
37923
+ tokens: z64.record(z64.string(), z64.string()),
37924
+ typography: z64.object({
37925
+ headingFamily: z64.string().optional(),
37926
+ bodyFamily: z64.string().optional(),
37927
+ headingWeight: z64.number().optional(),
37928
+ bodyWeight: z64.number().optional()
36849
37929
  }).optional(),
36850
- spacing: z62.enum(["comfortable", "standard", "dense"]).optional(),
36851
- corners: z62.enum(["square", "soft", "rounded", "pill"]).optional(),
36852
- shadows: z62.enum(["none", "low", "medium", "high"]).optional(),
36853
- components: z62.object({
36854
- buttons: z62.union([
36855
- z62.boolean(),
36856
- z62.object({
36857
- variants: z62.array(z62.enum(["primary", "secondary", "outline", "ghost"])).optional()
37930
+ spacing: z64.enum(["comfortable", "standard", "dense"]).optional(),
37931
+ corners: z64.enum(["square", "soft", "rounded", "pill"]).optional(),
37932
+ shadows: z64.enum(["none", "low", "medium", "high"]).optional(),
37933
+ components: z64.object({
37934
+ buttons: z64.union([
37935
+ z64.boolean(),
37936
+ z64.object({
37937
+ variants: z64.array(z64.enum(["primary", "secondary", "outline", "ghost"])).optional()
36858
37938
  })
36859
37939
  ]).optional(),
36860
- cards: z62.union([
36861
- z62.boolean(),
36862
- z62.object({
36863
- variants: z62.array(z62.enum(["default", "elevated", "outlined"])).optional()
37940
+ cards: z64.union([
37941
+ z64.boolean(),
37942
+ z64.object({
37943
+ variants: z64.array(z64.enum(["default", "elevated", "outlined"])).optional()
36864
37944
  })
36865
37945
  ]).optional(),
36866
- inputs: z62.boolean().optional()
37946
+ inputs: z64.boolean().optional()
36867
37947
  }).optional(),
36868
- overrides: z62.record(z62.string(), z62.string()).optional()
37948
+ overrides: z64.record(z64.string(), z64.string()).optional()
36869
37949
  }).passthrough();
36870
37950
 
36871
37951
  // ../theme-core/src/siteChrome.tsx
@@ -37065,6 +38145,8 @@ function coerceToString(value) {
37065
38145
  return String(value);
37066
38146
  }
37067
38147
  function coercePayload(payload) {
38148
+ const linkedContentEntries = coerceLinkedContentEntriesPayload(payload);
38149
+ if (linkedContentEntries !== payload) return linkedContentEntries;
37068
38150
  if (payload && typeof payload === "object" && !Array.isArray(payload)) {
37069
38151
  const record = payload;
37070
38152
  if ("data" in record && typeof record.data !== "function") return record.data;
@@ -37152,6 +38234,7 @@ var SUPPORTED_LOADER_ENDPOINTS = [
37152
38234
  "listPublicEvents",
37153
38235
  "getPublicEventDetails",
37154
38236
  "listPublicCourses",
38237
+ "listPublicRouteCandidates",
37155
38238
  "listPublicTeamMembers",
37156
38239
  "listPublicProducts",
37157
38240
  "listPublicPasses",
@@ -37212,6 +38295,10 @@ function normalizeLoaderParams(endpoint, params, context) {
37212
38295
  ensureSiteId(out, context);
37213
38296
  return out;
37214
38297
  }
38298
+ if (endpoint === "listPublicRouteCandidates") {
38299
+ ensureSiteId(out, context);
38300
+ return out;
38301
+ }
37215
38302
  if (endpoint === "getPublishedEntryPreview") {
37216
38303
  ensureSiteId(out, context);
37217
38304
  return out;
@@ -37224,17 +38311,17 @@ function normalizeLoaderParams(endpoint, params, context) {
37224
38311
  function unsafeRetypeZodSchema(schema) {
37225
38312
  return schema;
37226
38313
  }
37227
- var navIdListSchema = z63.preprocess((value) => {
38314
+ var navIdListSchema = z65.preprocess((value) => {
37228
38315
  if (!Array.isArray(value)) return void 0;
37229
38316
  const filtered = value.filter((v) => typeof v === "string" && v.trim().length > 0);
37230
38317
  return filtered.length > 0 ? filtered : void 0;
37231
- }, z63.array(z63.string()).max(200).optional());
37232
- var dashboardNavVisibilityBaseSchema = z63.object({
37233
- mode: z63.enum(["augment", "restrict"]).optional(),
38318
+ }, z65.array(z65.string()).max(200).optional());
38319
+ var dashboardNavVisibilityBaseSchema = z65.object({
38320
+ mode: z65.enum(["augment", "restrict"]).optional(),
37234
38321
  allowIds: navIdListSchema,
37235
38322
  denyIds: navIdListSchema
37236
38323
  }).strip();
37237
- var dashboardNavVisibilityRolesSchema = z63.object({
38324
+ var dashboardNavVisibilityRolesSchema = z65.object({
37238
38325
  administrator: dashboardNavVisibilityBaseSchema.optional(),
37239
38326
  editor: dashboardNavVisibilityBaseSchema.optional(),
37240
38327
  team_member: dashboardNavVisibilityBaseSchema.optional()
@@ -37242,63 +38329,63 @@ var dashboardNavVisibilityRolesSchema = z63.object({
37242
38329
  var dashboardNavVisibilitySchema = dashboardNavVisibilityBaseSchema.extend({
37243
38330
  roles: dashboardNavVisibilityRolesSchema
37244
38331
  }).strip();
37245
- var dashboardNavigationConfigSchema = z63.object({
38332
+ var dashboardNavigationConfigSchema = z65.object({
37246
38333
  siteNav: dashboardNavVisibilitySchema.optional(),
37247
38334
  settingsNav: dashboardNavVisibilitySchema.optional()
37248
38335
  }).strip();
37249
- var dashboardConfigSchema = z63.object({
37250
- previewEditingEnabled: z63.boolean().optional(),
38336
+ var dashboardConfigSchema = z65.object({
38337
+ previewEditingEnabled: z65.boolean().optional(),
37251
38338
  navigation: dashboardNavigationConfigSchema.optional()
37252
38339
  }).strip();
37253
38340
  var fieldDefinitionInputSchema = unsafeRetypeZodSchema(fieldSchema);
37254
38341
  var nodeDefinitionSchema = unsafeRetypeZodSchema(NodeSchema);
37255
- var sdkLoaderEndpointSchema = z63.enum(SUPPORTED_LOADER_ENDPOINTS);
37256
- var loaderFallbackScalarSchema = z63.union([
37257
- z63.string(),
37258
- z63.number(),
37259
- z63.boolean(),
37260
- z63.null()
38342
+ var sdkLoaderEndpointSchema = z65.enum(SUPPORTED_LOADER_ENDPOINTS);
38343
+ var loaderFallbackScalarSchema = z65.union([
38344
+ z65.string(),
38345
+ z65.number(),
38346
+ z65.boolean(),
38347
+ z65.null()
37261
38348
  ]);
37262
- var loaderParamBindingSchema = z63.object({
37263
- $bind: z63.object({
37264
- from: z63.string().min(1, "Binding path is required"),
38349
+ var loaderParamBindingSchema = z65.object({
38350
+ $bind: z65.object({
38351
+ from: z65.string().min(1, "Binding path is required"),
37265
38352
  fallback: loaderFallbackScalarSchema.optional()
37266
38353
  })
37267
38354
  });
37268
- var loaderParamValueSchema = z63.union([
37269
- z63.string(),
37270
- z63.number(),
37271
- z63.boolean(),
38355
+ var loaderParamValueSchema = z65.union([
38356
+ z65.string(),
38357
+ z65.number(),
38358
+ z65.boolean(),
37272
38359
  loaderParamBindingSchema
37273
38360
  ]);
37274
- var sdkConfigLoaderSchema = z63.object({
38361
+ var sdkConfigLoaderSchema = z65.object({
37275
38362
  endpoint: sdkLoaderEndpointSchema,
37276
- params: z63.record(z63.string(), loaderParamValueSchema),
37277
- mode: z63.enum(["server", "client"]).default("server")
38363
+ params: z65.record(z65.string(), loaderParamValueSchema),
38364
+ mode: z65.enum(["server", "client"]).default("server")
37278
38365
  });
37279
- var sdkDataLoadersSchema = z63.record(z63.string(), sdkConfigLoaderSchema).refine((loaders) => Object.keys(loaders).length <= 5, { message: "Maximum 5 data loaders per block" }).optional();
37280
- var sdkCustomBlockIdSchema = z63.string().min(8).regex(/^custom\.[a-z][a-z0-9-]*$/, {
38366
+ var sdkDataLoadersSchema = z65.record(z65.string(), sdkConfigLoaderSchema).refine((loaders) => Object.keys(loaders).length <= 5, { message: "Maximum 5 data loaders per block" }).optional();
38367
+ var sdkCustomBlockIdSchema = z65.string().min(8).regex(/^custom\.[a-z][a-z0-9-]*$/, {
37281
38368
  message: "Block ID must start with 'custom.' followed by lowercase letters, numbers, or hyphens"
37282
38369
  }).transform((value) => value);
37283
- var sdkCustomBlockInputSchema = z63.object({
38370
+ var sdkCustomBlockInputSchema = z65.object({
37284
38371
  id: sdkCustomBlockIdSchema,
37285
- title: z63.string().min(1),
37286
- titleSource: z63.union([z63.string().min(1), z63.array(z63.string().min(1)).min(1)]).optional(),
37287
- description: z63.string().optional(),
38372
+ title: z65.string().min(1),
38373
+ titleSource: z65.union([z65.string().min(1), z65.array(z65.string().min(1)).min(1)]).optional(),
38374
+ description: z65.string().optional(),
37288
38375
  category: blockCategoryEnum,
37289
- icon: z63.string().optional(),
37290
- tags: z63.array(z63.string()).optional(),
38376
+ icon: z65.string().optional(),
38377
+ tags: z65.array(z65.string()).optional(),
37291
38378
  fields: fieldDefinitionInputSchema.array().min(1),
37292
38379
  dataLoaders: sdkDataLoadersSchema,
37293
38380
  layout: NodeSchema.optional(),
37294
- variants: z63.record(z63.string().min(1), NodeSchema).optional(),
37295
- defaultVariant: z63.string().min(1).optional(),
37296
- variantOptions: z63.record(
37297
- z63.string().min(1),
37298
- z63.object({
37299
- label: z63.string().min(1).optional(),
37300
- description: z63.string().min(1).optional(),
37301
- icon: z63.string().min(1).optional()
38381
+ variants: z65.record(z65.string().min(1), NodeSchema).optional(),
38382
+ defaultVariant: z65.string().min(1).optional(),
38383
+ variantOptions: z65.record(
38384
+ z65.string().min(1),
38385
+ z65.object({
38386
+ label: z65.string().min(1).optional(),
38387
+ description: z65.string().min(1).optional(),
38388
+ icon: z65.string().min(1).optional()
37302
38389
  })
37303
38390
  ).optional()
37304
38391
  }).superRefine((data, ctx) => {
@@ -37308,7 +38395,7 @@ var sdkCustomBlockInputSchema = z63.object({
37308
38395
  const exists = data.fields.some((field) => field.id === source);
37309
38396
  if (!exists) {
37310
38397
  ctx.addIssue({
37311
- code: z63.ZodIssueCode.custom,
38398
+ code: z65.ZodIssueCode.custom,
37312
38399
  message: `titleSource must reference a valid field ID (got "${source}")`,
37313
38400
  path: Array.isArray(data.titleSource) ? ["titleSource", index] : ["titleSource"]
37314
38401
  });
@@ -37317,7 +38404,7 @@ var sdkCustomBlockInputSchema = z63.object({
37317
38404
  }
37318
38405
  if (data.layout && data.variants) {
37319
38406
  ctx.addIssue({
37320
- code: z63.ZodIssueCode.custom,
38407
+ code: z65.ZodIssueCode.custom,
37321
38408
  message: "Custom block must define either `layout` or `variants`, not both",
37322
38409
  path: ["variants"]
37323
38410
  });
@@ -37326,14 +38413,14 @@ var sdkCustomBlockInputSchema = z63.object({
37326
38413
  const keys = Object.keys(data.variants);
37327
38414
  if (keys.length === 0) {
37328
38415
  ctx.addIssue({
37329
- code: z63.ZodIssueCode.custom,
38416
+ code: z65.ZodIssueCode.custom,
37330
38417
  message: "`variants` must contain at least one variant key",
37331
38418
  path: ["variants"]
37332
38419
  });
37333
38420
  }
37334
38421
  if (data.defaultVariant && !Object.prototype.hasOwnProperty.call(data.variants, data.defaultVariant)) {
37335
38422
  ctx.addIssue({
37336
- code: z63.ZodIssueCode.custom,
38423
+ code: z65.ZodIssueCode.custom,
37337
38424
  message: "`defaultVariant` must be a key present in `variants`",
37338
38425
  path: ["defaultVariant"]
37339
38426
  });
@@ -37342,7 +38429,7 @@ var sdkCustomBlockInputSchema = z63.object({
37342
38429
  for (const key of Object.keys(data.variantOptions)) {
37343
38430
  if (!Object.prototype.hasOwnProperty.call(data.variants, key)) {
37344
38431
  ctx.addIssue({
37345
- code: z63.ZodIssueCode.custom,
38432
+ code: z65.ZodIssueCode.custom,
37346
38433
  message: "`variantOptions` key must exist in `variants`",
37347
38434
  path: ["variantOptions", key]
37348
38435
  });
@@ -37351,78 +38438,78 @@ var sdkCustomBlockInputSchema = z63.object({
37351
38438
  }
37352
38439
  }
37353
38440
  });
37354
- var sdkBlockFieldExtensionInputSchema = z63.object({
38441
+ var sdkBlockFieldExtensionInputSchema = z65.object({
37355
38442
  fields: fieldDefinitionInputSchema.array().min(1)
37356
38443
  });
37357
- var sdkBlockFieldExtensionsInputSchema = z63.record(
37358
- z63.string().min(1),
38444
+ var sdkBlockFieldExtensionsInputSchema = z65.record(
38445
+ z65.string().min(1),
37359
38446
  sdkBlockFieldExtensionInputSchema
37360
38447
  );
37361
- var sdkThemePaletteSchema = z63.record(z63.string(), z63.string());
37362
- var sdkThemeConfigSchema = z63.object({
38448
+ var sdkThemePaletteSchema = z65.record(z65.string(), z65.string());
38449
+ var sdkThemeConfigSchema = z65.object({
37363
38450
  palette: sdkThemePaletteSchema
37364
38451
  });
37365
- var sdkSectionBackgroundSchema = z63.object({
37366
- id: z63.string().min(1),
37367
- label: z63.string().min(1),
37368
- token: z63.string().min(1)
38452
+ var sdkSectionBackgroundSchema = z65.object({
38453
+ id: z65.string().min(1),
38454
+ label: z65.string().min(1),
38455
+ token: z65.string().min(1)
37369
38456
  });
37370
- var sdkSectionOptionsConfigSchema = z63.object({
37371
- backgroundColor: z63.boolean().optional(),
37372
- backgroundImage: z63.boolean().optional(),
37373
- backgroundGradient: z63.boolean().optional(),
37374
- spacing: z63.union([z63.array(z63.enum(["compact", "default", "spacious"])), z63.boolean()]).optional(),
37375
- textColor: z63.boolean().optional()
38457
+ var sdkSectionOptionsConfigSchema = z65.object({
38458
+ backgroundColor: z65.boolean().optional(),
38459
+ backgroundImage: z65.boolean().optional(),
38460
+ backgroundGradient: z65.boolean().optional(),
38461
+ spacing: z65.union([z65.array(z65.enum(["compact", "default", "spacious"])), z65.boolean()]).optional(),
38462
+ textColor: z65.boolean().optional()
37376
38463
  });
37377
- var sdkContainerOptionsConfigSchema = z63.object({
37378
- maxWidth: z63.union([z63.array(z63.enum(["narrow", "default", "wide", "full"])), z63.boolean()]).optional(),
37379
- alignment: z63.union([z63.array(z63.enum(["left", "center", "right"])), z63.boolean()]).optional()
38464
+ var sdkContainerOptionsConfigSchema = z65.object({
38465
+ maxWidth: z65.union([z65.array(z65.enum(["narrow", "default", "wide", "full"])), z65.boolean()]).optional(),
38466
+ alignment: z65.union([z65.array(z65.enum(["left", "center", "right"])), z65.boolean()]).optional()
37380
38467
  });
37381
- var sdkSiteStyleConfigSchema = z63.object({
37382
- sectionBackgrounds: z63.array(sdkSectionBackgroundSchema).optional(),
38468
+ var sdkSiteStyleConfigSchema = z65.object({
38469
+ sectionBackgrounds: z65.array(sdkSectionBackgroundSchema).optional(),
37383
38470
  sectionOptions: sdkSectionOptionsConfigSchema.optional(),
37384
38471
  containerOptions: sdkContainerOptionsConfigSchema.optional()
37385
38472
  });
37386
- var sdkSiteLayoutConfigSchema = z63.object({
37387
- footerBlocks: z63.array(
37388
- z63.object({
37389
- id: z63.string().min(1).optional(),
37390
- kind: z63.string().min(1),
37391
- content: z63.record(z63.string(), z63.unknown()).optional()
38473
+ var sdkSiteLayoutConfigSchema = z65.object({
38474
+ footerBlocks: z65.array(
38475
+ z65.object({
38476
+ id: z65.string().min(1).optional(),
38477
+ kind: z65.string().min(1),
38478
+ content: z65.record(z65.string(), z65.unknown()).optional()
37392
38479
  })
37393
38480
  ).optional()
37394
38481
  });
37395
- var sdkFieldSelectOptionSchema = z63.object({
37396
- value: z63.string(),
37397
- label: z63.string()
38482
+ var sdkFieldSelectOptionSchema = z65.object({
38483
+ value: z65.string(),
38484
+ label: z65.string()
37398
38485
  });
37399
- var sdkBlockFieldConfigSchema = z63.object({
37400
- options: z63.array(sdkFieldSelectOptionSchema).optional()
38486
+ var sdkBlockFieldConfigSchema = z65.object({
38487
+ options: z65.array(sdkFieldSelectOptionSchema).optional()
37401
38488
  });
37402
- var sdkBlockFieldOptionsMapSchema = z63.record(
37403
- z63.string().regex(/^(block\.|custom\.)[a-z][a-z0-9-]*$/, {
38489
+ var sdkBlockFieldOptionsMapSchema = z65.record(
38490
+ z65.string().regex(/^(block\.|custom\.)[a-z][a-z0-9-]*$/, {
37404
38491
  message: "Block ID must be 'block.*' or 'custom.*' format"
37405
38492
  }),
37406
- z63.record(z63.string().min(1), sdkBlockFieldConfigSchema)
38493
+ z65.record(z65.string().min(1), sdkBlockFieldConfigSchema)
37407
38494
  ).optional();
37408
- var sdkContentTypeTemplateConfigSchema = z63.object({
37409
- blocks: z63.array(z63.unknown())
38495
+ var sdkContentTypeTemplateConfigSchema = z65.object({
38496
+ blocks: z65.array(z65.unknown())
37410
38497
  }).passthrough();
37411
- var sdkContentTypeOrderingConfigSchema = z63.object({
37412
- mode: z63.enum(["default", "manual"]).optional()
38498
+ var sdkContentTypeOrderingConfigSchema = z65.object({
38499
+ mode: z65.enum(["default", "manual"]).optional()
37413
38500
  }).optional();
37414
- var sdkContentTypeConfigSchema = z63.object({
37415
- key: z63.string().min(1),
37416
- fields: z63.array(z63.unknown()),
38501
+ var sdkContentTypeConfigSchema = z65.object({
38502
+ key: z65.string().min(1),
38503
+ fields: z65.array(z65.unknown()),
37417
38504
  ordering: sdkContentTypeOrderingConfigSchema,
37418
38505
  template: sdkContentTypeTemplateConfigSchema.nullable().optional()
37419
38506
  }).passthrough();
37420
- var sdkContentConfigSchema = z63.object({
37421
- contentTypes: z63.array(sdkContentTypeConfigSchema).optional(),
37422
- pages: z63.array(z63.unknown()).optional(),
37423
- entries: z63.array(z63.unknown()).optional(),
37424
- navigationMenus: z63.array(z63.unknown()).optional(),
37425
- settings: z63.unknown().optional()
38507
+ var sdkContentConfigSchema = z65.object({
38508
+ contentTypes: z65.array(sdkContentTypeConfigSchema).optional(),
38509
+ pages: z65.array(z65.unknown()).optional(),
38510
+ entries: z65.array(z65.unknown()).optional(),
38511
+ navigationMenus: z65.array(z65.unknown()).optional(),
38512
+ settings: z65.unknown().optional()
37426
38513
  }).passthrough();
37427
38514
  var SDK_WORKFLOW_ID_MAX_LENGTH = 120;
37428
38515
  var SDK_WORKFLOW_TITLE_MAX_LENGTH = 120;
@@ -37437,62 +38524,62 @@ var SDK_WORKFLOW_CONFIRMATION_TITLE_MAX_LENGTH = 120;
37437
38524
  var SDK_WORKFLOW_CONFIRMATION_BODY_MAX_LENGTH = 500;
37438
38525
  var SDK_WORKFLOW_ID_PATTERN = /^[a-z][a-z0-9]*(?:[._-][a-z0-9]+)*$/;
37439
38526
  var SDK_WORKFLOW_ENDPOINT_PATTERN = /^\//;
37440
- var sdkWorkflowIdSchema = z63.string().min(1).max(SDK_WORKFLOW_ID_MAX_LENGTH).regex(SDK_WORKFLOW_ID_PATTERN, {
38527
+ var sdkWorkflowIdSchema = z65.string().min(1).max(SDK_WORKFLOW_ID_MAX_LENGTH).regex(SDK_WORKFLOW_ID_PATTERN, {
37441
38528
  message: "Workflow ID must start with a lowercase letter and use lowercase letters, numbers, dots, underscores, or hyphens"
37442
38529
  });
37443
- var sdkWorkflowEndpointSchema = z63.string().min(1).max(SDK_WORKFLOW_ENDPOINT_MAX_LENGTH).regex(SDK_WORKFLOW_ENDPOINT_PATTERN, { message: 'Workflow endpoint must be a site-relative path starting with "/"' });
37444
- var sdkWorkflowManualTriggerSchema = z63.object({
37445
- type: z63.literal("manual")
38530
+ var sdkWorkflowEndpointSchema = z65.string().min(1).max(SDK_WORKFLOW_ENDPOINT_MAX_LENGTH).regex(SDK_WORKFLOW_ENDPOINT_PATTERN, { message: 'Workflow endpoint must be a site-relative path starting with "/"' });
38531
+ var sdkWorkflowManualTriggerSchema = z65.object({
38532
+ type: z65.literal("manual")
37446
38533
  }).strict();
37447
- var sdkWorkflowTriggerFieldSchema = z63.string().trim().min(1).max(SDK_WORKFLOW_TRIGGER_FIELD_MAX_LENGTH).refine((field) => !field.includes("."), {
38534
+ var sdkWorkflowTriggerFieldSchema = z65.string().trim().min(1).max(SDK_WORKFLOW_TRIGGER_FIELD_MAX_LENGTH).refine((field) => !field.includes("."), {
37448
38535
  message: "Workflow trigger fields must be top-level content field IDs, not paths"
37449
38536
  });
37450
- var sdkWorkflowFieldChangedConditionSchema = z63.object({
38537
+ var sdkWorkflowFieldChangedConditionSchema = z65.object({
37451
38538
  field: sdkWorkflowTriggerFieldSchema,
37452
- changed: z63.literal(true)
38539
+ changed: z65.literal(true)
37453
38540
  }).strict();
37454
- var sdkWorkflowFieldEmptyConditionSchema = z63.object({
38541
+ var sdkWorkflowFieldEmptyConditionSchema = z65.object({
37455
38542
  field: sdkWorkflowTriggerFieldSchema,
37456
- isEmpty: z63.boolean()
38543
+ isEmpty: z65.boolean()
37457
38544
  }).strict();
37458
- var sdkWorkflowEntryDraftUpdatedTriggerSchema = z63.object({
37459
- type: z63.literal("entry.draft.updated"),
37460
- when: z63.array(
37461
- z63.union([
38545
+ var sdkWorkflowEntryDraftUpdatedTriggerSchema = z65.object({
38546
+ type: z65.literal("entry.draft.updated"),
38547
+ when: z65.array(
38548
+ z65.union([
37462
38549
  sdkWorkflowFieldChangedConditionSchema,
37463
38550
  sdkWorkflowFieldEmptyConditionSchema
37464
38551
  ])
37465
38552
  ).min(1).max(SDK_WORKFLOW_TRIGGER_CONDITION_MAX_COUNT)
37466
38553
  }).strict();
37467
- var sdkWorkflowTriggerSchema = z63.discriminatedUnion("type", [
38554
+ var sdkWorkflowTriggerSchema = z65.discriminatedUnion("type", [
37468
38555
  sdkWorkflowManualTriggerSchema,
37469
38556
  sdkWorkflowEntryDraftUpdatedTriggerSchema
37470
38557
  ]);
37471
- var sdkWorkflowConfirmationSchema = z63.object({
37472
- title: z63.string().trim().min(1).max(SDK_WORKFLOW_CONFIRMATION_TITLE_MAX_LENGTH),
37473
- body: z63.string().trim().min(1).max(SDK_WORKFLOW_CONFIRMATION_BODY_MAX_LENGTH).optional()
38558
+ var sdkWorkflowConfirmationSchema = z65.object({
38559
+ title: z65.string().trim().min(1).max(SDK_WORKFLOW_CONFIRMATION_TITLE_MAX_LENGTH),
38560
+ body: z65.string().trim().min(1).max(SDK_WORKFLOW_CONFIRMATION_BODY_MAX_LENGTH).optional()
37474
38561
  }).strict();
37475
- var sdkWorkflowConfigSchema = z63.object({
38562
+ var sdkWorkflowConfigSchema = z65.object({
37476
38563
  id: sdkWorkflowIdSchema,
37477
- title: z63.string().trim().min(1).max(SDK_WORKFLOW_TITLE_MAX_LENGTH),
37478
- description: z63.string().trim().min(1).max(SDK_WORKFLOW_DESCRIPTION_MAX_LENGTH).optional(),
37479
- contentType: z63.string().trim().min(1).max(SDK_WORKFLOW_CONTENT_TYPE_MAX_LENGTH),
38564
+ title: z65.string().trim().min(1).max(SDK_WORKFLOW_TITLE_MAX_LENGTH),
38565
+ description: z65.string().trim().min(1).max(SDK_WORKFLOW_DESCRIPTION_MAX_LENGTH).optional(),
38566
+ contentType: z65.string().trim().min(1).max(SDK_WORKFLOW_CONTENT_TYPE_MAX_LENGTH),
37480
38567
  endpoint: sdkWorkflowEndpointSchema,
37481
- triggers: z63.array(sdkWorkflowTriggerSchema).min(1).max(SDK_WORKFLOW_TRIGGER_MAX_COUNT),
38568
+ triggers: z65.array(sdkWorkflowTriggerSchema).min(1).max(SDK_WORKFLOW_TRIGGER_MAX_COUNT),
37482
38569
  confirmation: sdkWorkflowConfirmationSchema.optional()
37483
38570
  }).strict();
37484
- var sdkWorkflowsSchema = z63.array(sdkWorkflowConfigSchema).max(SDK_WORKFLOW_MAX_COUNT, "Maximum 50 workflows per site").refine((workflows) => {
38571
+ var sdkWorkflowsSchema = z65.array(sdkWorkflowConfigSchema).max(SDK_WORKFLOW_MAX_COUNT, "Maximum 50 workflows per site").refine((workflows) => {
37485
38572
  const ids = workflows.map((workflow) => workflow.id);
37486
38573
  return ids.length === new Set(ids).size;
37487
38574
  }, { message: "Workflow IDs must be unique" }).optional();
37488
- var riverbankSiteConfigInputSchema = z63.object({
37489
- siteId: z63.string().uuid(),
37490
- previewUrl: z63.string().url().optional(),
37491
- liveUrl: z63.string().url().optional(),
38575
+ var riverbankSiteConfigInputSchema = z65.object({
38576
+ siteId: z65.string().uuid(),
38577
+ previewUrl: z65.string().url().optional(),
38578
+ liveUrl: z65.string().url().optional(),
37492
38579
  theme: sdkThemeConfigSchema.optional(),
37493
38580
  styles: sdkSiteStyleConfigSchema.optional(),
37494
38581
  layout: sdkSiteLayoutConfigSchema.optional(),
37495
- customBlocks: z63.array(sdkCustomBlockInputSchema).max(100, "Maximum 100 custom blocks per site").refine((blocks) => {
38582
+ customBlocks: z65.array(sdkCustomBlockInputSchema).max(100, "Maximum 100 custom blocks per site").refine((blocks) => {
37496
38583
  const ids = blocks.map((b) => b.id);
37497
38584
  return ids.length === new Set(ids).size;
37498
38585
  }, { message: "Block IDs must be unique" }).optional(),
@@ -37500,50 +38587,50 @@ var riverbankSiteConfigInputSchema = z63.object({
37500
38587
  blockFieldExtensions: sdkBlockFieldExtensionsInputSchema.optional(),
37501
38588
  workflows: sdkWorkflowsSchema,
37502
38589
  content: sdkContentConfigSchema.optional(),
37503
- contentDir: z63.string().optional(),
37504
- sync: z63.object({
37505
- existingEntries: z63.enum(["skip", "update"]).optional()
38590
+ contentDir: z65.string().optional(),
38591
+ sync: z65.object({
38592
+ existingEntries: z65.enum(["skip", "update"]).optional()
37506
38593
  }).optional(),
37507
- deploy: z63.object({
37508
- verifyCommand: z63.string().optional(),
37509
- prebuildOutput: z63.string().optional()
38594
+ deploy: z65.object({
38595
+ verifyCommand: z65.string().optional(),
38596
+ prebuildOutput: z65.string().optional()
37510
38597
  }).optional(),
37511
- themeSource: z63.enum(["local", "cms"]).optional(),
37512
- activeTheme: z63.string().optional(),
37513
- enablePortal: z63.boolean().optional(),
38598
+ themeSource: z65.enum(["local", "cms"]).optional(),
38599
+ activeTheme: z65.string().optional(),
38600
+ enablePortal: z65.boolean().optional(),
37514
38601
  dashboard: dashboardConfigSchema.optional()
37515
38602
  }).strict();
37516
- var pushSdkConfigBodySchema = z63.object({
38603
+ var pushSdkConfigBodySchema = z65.object({
37517
38604
  config: riverbankSiteConfigInputSchema,
37518
- forceContentTypes: z63.boolean().optional()
38605
+ forceContentTypes: z65.boolean().optional()
37519
38606
  }).strict();
37520
38607
 
37521
38608
  // ../api/src/siteOnboarding.ts
37522
- import { z as z64 } from "zod";
38609
+ import { z as z66 } from "zod";
37523
38610
  var LAUNCH_REQUIREMENT_OVERRIDE_DEFINITIONS = {
37524
38611
  configure_appointments: {
37525
38612
  requirementId: "configure_appointments",
37526
38613
  reason: "launch_anyway"
37527
38614
  }
37528
38615
  };
37529
- var acknowledgeLaunchRequirementRequestSchema = z64.discriminatedUnion(
38616
+ var acknowledgeLaunchRequirementRequestSchema = z66.discriminatedUnion(
37530
38617
  "requirementId",
37531
38618
  [
37532
- z64.object({
37533
- requirementId: z64.literal("review_generated_site")
38619
+ z66.object({
38620
+ requirementId: z66.literal("review_generated_site")
37534
38621
  }),
37535
- z64.object({
37536
- requirementId: z64.literal(
38622
+ z66.object({
38623
+ requirementId: z66.literal(
37537
38624
  LAUNCH_REQUIREMENT_OVERRIDE_DEFINITIONS.configure_appointments.requirementId
37538
38625
  ),
37539
- overrideReason: z64.literal(
38626
+ overrideReason: z66.literal(
37540
38627
  LAUNCH_REQUIREMENT_OVERRIDE_DEFINITIONS.configure_appointments.reason
37541
38628
  )
37542
38629
  })
37543
38630
  ]
37544
38631
  );
37545
- var goLiveSiteRequestSchema = z64.object({
37546
- acceptExtraSiteCharge: z64.boolean().optional()
38632
+ var goLiveSiteRequestSchema = z66.object({
38633
+ acceptExtraSiteCharge: z66.boolean().optional()
37547
38634
  });
37548
38635
 
37549
38636
  // ../api/src/customerMembershipOutcomes.ts
@@ -37620,7 +38707,7 @@ var COURSE_ENROLLMENT_REFUND_FAILED_CODES = [
37620
38707
  ];
37621
38708
 
37622
38709
  // ../api/src/bookingVerticals.ts
37623
- import { z as z65 } from "zod";
38710
+ import { z as z67 } from "zod";
37624
38711
  var VERTICAL_IDS = [
37625
38712
  "yoga_wellness",
37626
38713
  "fitness_pt",
@@ -37785,39 +38872,39 @@ function getSiteVerticalConfigIssues(rawConfig, config) {
37785
38872
  }
37786
38873
  return [...issues];
37787
38874
  }
37788
- var VerticalIdSchema = z65.string().trim().transform((value, ctx) => {
38875
+ var VerticalIdSchema = z67.string().trim().transform((value, ctx) => {
37789
38876
  const parsed = parseVerticalId(value);
37790
38877
  if (!parsed) {
37791
38878
  ctx.addIssue({
37792
- code: z65.ZodIssueCode.custom,
38879
+ code: z67.ZodIssueCode.custom,
37793
38880
  message: "Unknown booking vertical"
37794
38881
  });
37795
- return z65.NEVER;
38882
+ return z67.NEVER;
37796
38883
  }
37797
38884
  return parsed;
37798
38885
  });
37799
- var VerticalPresetIdSchema = z65.string().trim().transform((value, ctx) => {
38886
+ var VerticalPresetIdSchema = z67.string().trim().transform((value, ctx) => {
37800
38887
  const parsed = parseVerticalPresetId(value);
37801
38888
  if (!parsed) {
37802
38889
  ctx.addIssue({
37803
- code: z65.ZodIssueCode.custom,
38890
+ code: z67.ZodIssueCode.custom,
37804
38891
  message: "Unknown booking preset"
37805
38892
  });
37806
- return z65.NEVER;
38893
+ return z67.NEVER;
37807
38894
  }
37808
38895
  return parsed;
37809
38896
  });
37810
- var BookingVerticalConfigSchema = z65.object({
38897
+ var BookingVerticalConfigSchema = z67.object({
37811
38898
  verticalId: VerticalIdSchema.nullable(),
37812
- selectedPresetIds: z65.array(VerticalPresetIdSchema).max(20)
38899
+ selectedPresetIds: z67.array(VerticalPresetIdSchema).max(20)
37813
38900
  }).transform((value, ctx) => {
37814
38901
  const resolved = resolveSiteVerticalBookingConfig(value);
37815
38902
  if (resolved.kind === "invalid") {
37816
38903
  ctx.addIssue({
37817
- code: z65.ZodIssueCode.custom,
38904
+ code: z67.ZodIssueCode.custom,
37818
38905
  message: `Invalid booking vertical config: ${resolved.issues.join(", ")}`
37819
38906
  });
37820
- return z65.NEVER;
38907
+ return z67.NEVER;
37821
38908
  }
37822
38909
  return resolved.config;
37823
38910
  });
@@ -37839,56 +38926,56 @@ function preset(id, verticalId, canonicalBehaviour, label, pluralLabel, descript
37839
38926
  }
37840
38927
 
37841
38928
  // ../api/src/utils/isRecord.ts
37842
- function isRecord3(value) {
38929
+ function isRecord4(value) {
37843
38930
  return typeof value === "object" && value !== null && !Array.isArray(value);
37844
38931
  }
37845
38932
 
37846
38933
  // ../api/src/appointmentSetup.ts
37847
- import { z as z66 } from "zod";
38934
+ import { z as z68 } from "zod";
37848
38935
  var APPOINTMENT_SETUP_MAX_MINUTES = 1440;
37849
- var appointmentSetupRefSchema = z66.discriminatedUnion("kind", [
37850
- z66.object({ kind: z66.literal("existing"), id: z66.string().min(1) }),
37851
- z66.object({ kind: z66.literal("new"), draftId: z66.string().min(1) })
38936
+ var appointmentSetupRefSchema = z68.discriminatedUnion("kind", [
38937
+ z68.object({ kind: z68.literal("existing"), id: z68.string().min(1) }),
38938
+ z68.object({ kind: z68.literal("new"), draftId: z68.string().min(1) })
37852
38939
  ]);
37853
- var appointmentSetupVenueChoiceSchema = z66.discriminatedUnion("kind", [
37854
- z66.object({ kind: z66.literal("none") }),
37855
- z66.object({ kind: z66.literal("existing"), venueId: z66.string().min(1) }),
37856
- z66.object({
37857
- kind: z66.literal("create"),
37858
- draftId: z66.string().min(1),
37859
- title: z66.string().trim().min(1),
37860
- description: z66.string().nullable(),
37861
- timezone: z66.string().trim().min(1).nullable(),
37862
- addressJson: z66.record(z66.string(), z66.unknown()),
37863
- locationJson: z66.object({ lat: z66.number(), lng: z66.number() }).nullable()
38940
+ var appointmentSetupVenueChoiceSchema = z68.discriminatedUnion("kind", [
38941
+ z68.object({ kind: z68.literal("none") }),
38942
+ z68.object({ kind: z68.literal("existing"), venueId: z68.string().min(1) }),
38943
+ z68.object({
38944
+ kind: z68.literal("create"),
38945
+ draftId: z68.string().min(1),
38946
+ title: z68.string().trim().min(1),
38947
+ description: z68.string().nullable(),
38948
+ timezone: z68.string().trim().min(1).nullable(),
38949
+ addressJson: z68.record(z68.string(), z68.unknown()),
38950
+ locationJson: z68.object({ lat: z68.number(), lng: z68.number() }).nullable()
37864
38951
  })
37865
38952
  ]);
37866
- var appointmentSetupPaymentDraftSchema = z66.object({
37867
- priceType: z66.union([z66.literal("free"), z66.literal("paid")])
37868
- });
37869
- var appointmentSetupServiceAssignmentDraftSchema = z66.discriminatedUnion("kind", [
37870
- z66.object({ kind: z66.literal("all_practitioners") }),
37871
- z66.object({
37872
- kind: z66.literal("selected_practitioners"),
37873
- resourceRefs: z66.array(appointmentSetupRefSchema)
38953
+ var appointmentSetupPaymentDraftSchema = z68.object({
38954
+ priceType: z68.union([z68.literal("free"), z68.literal("paid")])
38955
+ });
38956
+ var appointmentSetupServiceAssignmentDraftSchema = z68.discriminatedUnion("kind", [
38957
+ z68.object({ kind: z68.literal("all_practitioners") }),
38958
+ z68.object({
38959
+ kind: z68.literal("selected_practitioners"),
38960
+ resourceRefs: z68.array(appointmentSetupRefSchema)
37874
38961
  })
37875
38962
  ]);
37876
- var appointmentSetupServiceDraftSchema = z66.object({
38963
+ var appointmentSetupServiceDraftSchema = z68.object({
37877
38964
  ref: appointmentSetupRefSchema,
37878
- title: z66.string().trim().min(1),
37879
- description: z66.string().nullable(),
37880
- durationMinutes: z66.number().int().positive().max(APPOINTMENT_SETUP_MAX_MINUTES),
37881
- prepMinutes: z66.number().int().nonnegative().max(APPOINTMENT_SETUP_MAX_MINUTES).default(0),
37882
- cleanupMinutes: z66.number().int().nonnegative().max(APPOINTMENT_SETUP_MAX_MINUTES).default(0),
37883
- priceAmount: z66.number().int().nonnegative().nullable(),
37884
- isActive: z66.boolean(),
37885
- locationType: z66.union([
37886
- z66.literal("virtual"),
37887
- z66.literal("in_person"),
37888
- z66.literal("hybrid")
38965
+ title: z68.string().trim().min(1),
38966
+ description: z68.string().nullable(),
38967
+ durationMinutes: z68.number().int().positive().max(APPOINTMENT_SETUP_MAX_MINUTES),
38968
+ prepMinutes: z68.number().int().nonnegative().max(APPOINTMENT_SETUP_MAX_MINUTES).default(0),
38969
+ cleanupMinutes: z68.number().int().nonnegative().max(APPOINTMENT_SETUP_MAX_MINUTES).default(0),
38970
+ priceAmount: z68.number().int().nonnegative().nullable(),
38971
+ isActive: z68.boolean(),
38972
+ locationType: z68.union([
38973
+ z68.literal("virtual"),
38974
+ z68.literal("in_person"),
38975
+ z68.literal("hybrid")
37889
38976
  ]),
37890
38977
  venue: appointmentSetupVenueChoiceSchema,
37891
- timezone: z66.string().trim().min(1).nullable(),
38978
+ timezone: z68.string().trim().min(1).nullable(),
37892
38979
  payment: appointmentSetupPaymentDraftSchema,
37893
38980
  assignment: appointmentSetupServiceAssignmentDraftSchema
37894
38981
  }).superRefine((service, ctx) => {
@@ -37907,49 +38994,49 @@ var appointmentSetupServiceDraftSchema = z66.object({
37907
38994
  });
37908
38995
  }
37909
38996
  });
37910
- var appointmentSetupPractitionerDraftSchema = z66.object({
38997
+ var appointmentSetupPractitionerDraftSchema = z68.object({
37911
38998
  ref: appointmentSetupRefSchema,
37912
- displayName: z66.string().trim().min(1),
37913
- bio: z66.string().nullable(),
37914
- timezone: z66.string().trim().min(1),
37915
- colorHex: z66.string().nullable()
37916
- });
37917
- var appointmentSetupWeeklyWindowDraftSchema = z66.object({
37918
- weekday: z66.number().int().min(0).max(6),
37919
- startTime: z66.string(),
37920
- endTime: z66.string()
37921
- });
37922
- var appointmentSetupStartTimePolicyDraftSchema = z66.discriminatedUnion("kind", [
37923
- z66.object({ kind: z66.literal("automatic_spacing") }),
37924
- z66.object({
37925
- kind: z66.literal("regular_interval"),
37926
- intervalMinutes: z66.union([
37927
- z66.literal(10),
37928
- z66.literal(15),
37929
- z66.literal(20),
37930
- z66.literal(30),
37931
- z66.literal(45),
37932
- z66.literal(60)
38999
+ displayName: z68.string().trim().min(1),
39000
+ bio: z68.string().nullable(),
39001
+ timezone: z68.string().trim().min(1),
39002
+ colorHex: z68.string().nullable()
39003
+ });
39004
+ var appointmentSetupWeeklyWindowDraftSchema = z68.object({
39005
+ weekday: z68.number().int().min(0).max(6),
39006
+ startTime: z68.string(),
39007
+ endTime: z68.string()
39008
+ });
39009
+ var appointmentSetupStartTimePolicyDraftSchema = z68.discriminatedUnion("kind", [
39010
+ z68.object({ kind: z68.literal("automatic_spacing") }),
39011
+ z68.object({
39012
+ kind: z68.literal("regular_interval"),
39013
+ intervalMinutes: z68.union([
39014
+ z68.literal(10),
39015
+ z68.literal(15),
39016
+ z68.literal(20),
39017
+ z68.literal(30),
39018
+ z68.literal(45),
39019
+ z68.literal(60)
37933
39020
  ])
37934
39021
  })
37935
39022
  ]);
37936
- var appointmentSetupAvailabilityDraftSchema = z66.object({
37937
- kind: z66.literal("weekly_windows"),
39023
+ var appointmentSetupAvailabilityDraftSchema = z68.object({
39024
+ kind: z68.literal("weekly_windows"),
37938
39025
  resourceRef: appointmentSetupRefSchema,
37939
39026
  serviceRef: appointmentSetupRefSchema.nullable(),
37940
- windows: z66.array(appointmentSetupWeeklyWindowDraftSchema),
39027
+ windows: z68.array(appointmentSetupWeeklyWindowDraftSchema),
37941
39028
  startTimePolicy: appointmentSetupStartTimePolicyDraftSchema.optional()
37942
39029
  });
37943
39030
  var APPOINTMENT_DEFAULT_MIN_LEAD_MINUTES_MAX = 28 * 24 * 60;
37944
39031
  var APPOINTMENT_DEFAULT_MAX_BOOKING_NOTICE_MINUTES_MAX = 10 * 365 * 24 * 60;
37945
- var appointmentSetupBookingNoticeSchema = z66.object({
37946
- minLeadMinutes: z66.number().int().nonnegative().max(APPOINTMENT_DEFAULT_MIN_LEAD_MINUTES_MAX),
37947
- maxBookingNoticeMinutes: z66.number().int().nonnegative().max(APPOINTMENT_DEFAULT_MAX_BOOKING_NOTICE_MINUTES_MAX)
37948
- });
37949
- var applyAppointmentSetupRequestSchema = z66.object({
37950
- services: z66.array(appointmentSetupServiceDraftSchema),
37951
- practitioners: z66.array(appointmentSetupPractitionerDraftSchema),
37952
- availability: z66.array(appointmentSetupAvailabilityDraftSchema),
39032
+ var appointmentSetupBookingNoticeSchema = z68.object({
39033
+ minLeadMinutes: z68.number().int().nonnegative().max(APPOINTMENT_DEFAULT_MIN_LEAD_MINUTES_MAX),
39034
+ maxBookingNoticeMinutes: z68.number().int().nonnegative().max(APPOINTMENT_DEFAULT_MAX_BOOKING_NOTICE_MINUTES_MAX)
39035
+ });
39036
+ var applyAppointmentSetupRequestSchema = z68.object({
39037
+ services: z68.array(appointmentSetupServiceDraftSchema),
39038
+ practitioners: z68.array(appointmentSetupPractitionerDraftSchema),
39039
+ availability: z68.array(appointmentSetupAvailabilityDraftSchema),
37953
39040
  bookingNotice: appointmentSetupBookingNoticeSchema
37954
39041
  });
37955
39042
 
@@ -37982,24 +39069,24 @@ var STAFF_CANCELLATION_CONTEXT_CATEGORIES = [
37982
39069
  ];
37983
39070
 
37984
39071
  // ../api/src/siteBanner.ts
37985
- import { z as z67 } from "zod";
39072
+ import { z as z69 } from "zod";
37986
39073
  var SITE_BANNER_SCOPE_VALUES = ["homepage", "all-pages"];
37987
39074
  var SITE_BANNER_TONE_VALUES = ["announcement", "promotion", "notice", "warning"];
37988
39075
  var SITE_BANNER_MAX_TEXT_LENGTH = 320;
37989
39076
  var SITE_BANNER_MAX_PARAGRAPHS = 2;
37990
- var siteBannerScopeSchema = z67.enum(SITE_BANNER_SCOPE_VALUES);
37991
- var siteBannerToneSchema = z67.enum(SITE_BANNER_TONE_VALUES);
37992
- var siteBannerBodySchema = z67.unknown().transform(unwrapRichTextValue);
37993
- var siteBannerCtaSchema = z67.object({
37994
- label: z67.string().trim().min(1),
39077
+ var siteBannerScopeSchema = z69.enum(SITE_BANNER_SCOPE_VALUES);
39078
+ var siteBannerToneSchema = z69.enum(SITE_BANNER_TONE_VALUES);
39079
+ var siteBannerBodySchema = z69.unknown().transform(unwrapRichTextValue);
39080
+ var siteBannerCtaSchema = z69.object({
39081
+ label: z69.string().trim().min(1),
37995
39082
  link: linkPayloadSchema
37996
39083
  });
37997
- var siteBannerSettingsSchema = z67.discriminatedUnion("enabled", [
37998
- z67.object({
37999
- enabled: z67.literal(false)
39084
+ var siteBannerSettingsSchema = z69.discriminatedUnion("enabled", [
39085
+ z69.object({
39086
+ enabled: z69.literal(false)
38000
39087
  }),
38001
- z67.object({
38002
- enabled: z67.literal(true),
39088
+ z69.object({
39089
+ enabled: z69.literal(true),
38003
39090
  scope: siteBannerScopeSchema,
38004
39091
  tone: siteBannerToneSchema,
38005
39092
  body: siteBannerBodySchema,
@@ -38013,7 +39100,7 @@ var siteBannerSettingsInputSchema = siteBannerSettingsSchema.superRefine((value,
38013
39100
  const analysis = analyzeSiteBannerBody(value.body);
38014
39101
  for (const issue of analysis.issues) {
38015
39102
  ctx.addIssue({
38016
- code: z67.ZodIssueCode.custom,
39103
+ code: z69.ZodIssueCode.custom,
38017
39104
  path: ["body"],
38018
39105
  message: siteBannerBodyIssueMessage(issue)
38019
39106
  });
@@ -38146,7 +39233,7 @@ function sanitizeMarks(marks) {
38146
39233
  if (mark.type === "bold" || mark.type === "strong" || mark.type === "italic" || mark.type === "em") {
38147
39234
  return [{ type: mark.type }];
38148
39235
  }
38149
- if (mark.type === "link" && isRecord3(mark.attrs) && typeof mark.attrs.href === "string") {
39236
+ if (mark.type === "link" && isRecord4(mark.attrs) && typeof mark.attrs.href === "string") {
38150
39237
  const attrs = { href: mark.attrs.href };
38151
39238
  if (typeof mark.attrs.target === "string" && mark.attrs.target.trim().length > 0) {
38152
39239
  attrs.target = mark.attrs.target;
@@ -38161,10 +39248,10 @@ function sanitizeMarks(marks) {
38161
39248
  return sanitized.length > 0 ? sanitized : void 0;
38162
39249
  }
38163
39250
  function unwrapRichTextValue(value) {
38164
- if (isRecord3(value) && isRecord3(value.doc)) {
39251
+ if (isRecord4(value) && isRecord4(value.doc)) {
38165
39252
  return unwrapRichTextValue(value.doc);
38166
39253
  }
38167
- if (isRecord3(value) && value.type === "doc") {
39254
+ if (isRecord4(value) && value.type === "doc") {
38168
39255
  return {
38169
39256
  type: "doc",
38170
39257
  content: Array.isArray(value.content) ? value.content.filter(isTipTapNodeLike).map(coerceTipTapNode) : []
@@ -38173,7 +39260,7 @@ function unwrapRichTextValue(value) {
38173
39260
  return EMPTY_SITE_BANNER_BODY;
38174
39261
  }
38175
39262
  function isTipTapNodeLike(value) {
38176
- return isRecord3(value) && typeof value.type === "string";
39263
+ return isRecord4(value) && typeof value.type === "string";
38177
39264
  }
38178
39265
  function coerceTipTapNode(value) {
38179
39266
  return {
@@ -38181,9 +39268,9 @@ function coerceTipTapNode(value) {
38181
39268
  ...Array.isArray(value.content) ? { content: value.content.filter(isTipTapNodeLike).map(coerceTipTapNode) } : {},
38182
39269
  ...typeof value.text === "string" ? { text: value.text } : {},
38183
39270
  ...Array.isArray(value.marks) ? {
38184
- marks: value.marks.filter((mark) => isRecord3(mark) && typeof mark.type === "string").map((mark) => ({
39271
+ marks: value.marks.filter((mark) => isRecord4(mark) && typeof mark.type === "string").map((mark) => ({
38185
39272
  type: mark.type,
38186
- ...isRecord3(mark.attrs) ? { attrs: mark.attrs } : {}
39273
+ ...isRecord4(mark.attrs) ? { attrs: mark.attrs } : {}
38187
39274
  }))
38188
39275
  } : {}
38189
39276
  };
@@ -38240,71 +39327,71 @@ function unsafeAsNavigationMenuIdentifier(identifier) {
38240
39327
  var MAIN_NAVIGATION_MENU_IDENTIFIER = unsafeAsNavigationMenuIdentifier("main");
38241
39328
 
38242
39329
  // ../api/src/aiPlayground.ts
38243
- import { z as z68 } from "zod";
38244
- var Rfc6902PatchOp = z68.discriminatedUnion("op", [
39330
+ import { z as z70 } from "zod";
39331
+ var Rfc6902PatchOp = z70.discriminatedUnion("op", [
38245
39332
  // Standard RFC-6902 operations
38246
- z68.object({
38247
- op: z68.literal("add"),
38248
- path: z68.string(),
38249
- value: z68.unknown()
39333
+ z70.object({
39334
+ op: z70.literal("add"),
39335
+ path: z70.string(),
39336
+ value: z70.unknown()
38250
39337
  }),
38251
- z68.object({
38252
- op: z68.literal("remove"),
38253
- path: z68.string()
39338
+ z70.object({
39339
+ op: z70.literal("remove"),
39340
+ path: z70.string()
38254
39341
  }),
38255
- z68.object({
38256
- op: z68.literal("replace"),
38257
- path: z68.string(),
38258
- value: z68.unknown()
39342
+ z70.object({
39343
+ op: z70.literal("replace"),
39344
+ path: z70.string(),
39345
+ value: z70.unknown()
38259
39346
  }),
38260
- z68.object({
38261
- op: z68.literal("move"),
38262
- from: z68.string(),
38263
- path: z68.string()
39347
+ z70.object({
39348
+ op: z70.literal("move"),
39349
+ from: z70.string(),
39350
+ path: z70.string()
38264
39351
  }),
38265
- z68.object({
38266
- op: z68.literal("copy"),
38267
- from: z68.string(),
38268
- path: z68.string()
39352
+ z70.object({
39353
+ op: z70.literal("copy"),
39354
+ from: z70.string(),
39355
+ path: z70.string()
38269
39356
  }),
38270
39357
  // Block-level operations (Phase 2)
38271
- z68.object({
38272
- op: z68.literal("add_block"),
38273
- blockKind: z68.string(),
38274
- afterBlockId: z68.string().nullable(),
38275
- content: z68.record(z68.string(), z68.unknown()),
38276
- rationale: z68.string()
39358
+ z70.object({
39359
+ op: z70.literal("add_block"),
39360
+ blockKind: z70.string(),
39361
+ afterBlockId: z70.string().nullable(),
39362
+ content: z70.record(z70.string(), z70.unknown()),
39363
+ rationale: z70.string()
38277
39364
  }),
38278
- z68.object({
38279
- op: z68.literal("delete_block"),
38280
- blockId: z68.string(),
38281
- rationale: z68.string()
39365
+ z70.object({
39366
+ op: z70.literal("delete_block"),
39367
+ blockId: z70.string(),
39368
+ rationale: z70.string()
38282
39369
  }),
38283
- z68.object({
38284
- op: z68.literal("reorder_block"),
38285
- blockId: z68.string(),
38286
- afterBlockId: z68.string().nullable(),
38287
- rationale: z68.string()
39370
+ z70.object({
39371
+ op: z70.literal("reorder_block"),
39372
+ blockId: z70.string(),
39373
+ afterBlockId: z70.string().nullable(),
39374
+ rationale: z70.string()
38288
39375
  })
38289
39376
  ]);
38290
- var PlaygroundProposeRequest = z68.object({
38291
- request: z68.string().min(1).max(2e3)
39377
+ var PlaygroundProposeRequest = z70.object({
39378
+ request: z70.string().min(1).max(2e3)
38292
39379
  });
38293
- var MultiPagePatchEnvelope = z68.object({
38294
- pageId: z68.string(),
38295
- blockId: z68.string().optional(),
39380
+ var MultiPagePatchEnvelope = z70.object({
39381
+ pageId: z70.string(),
39382
+ blockId: z70.string().optional(),
38296
39383
  // Not present for page-level ops
38297
- blockKind: z68.string().optional(),
38298
- blockPurpose: z68.string().optional().nullable(),
38299
- ops: z68.array(Rfc6902PatchOp),
38300
- rationale: z68.string(),
38301
- currentContent: z68.record(z68.string(), z68.unknown()).optional()
38302
- });
38303
- var MultiPageUpdateResponse = z68.object({
38304
- patches: z68.array(MultiPagePatchEnvelope),
38305
- assistantMessage: z68.string(),
38306
- pagesModified: z68.number(),
38307
- toolCallsUsed: z68.number()
39384
+ blockKind: z70.string().optional(),
39385
+ blockPurpose: z70.string().optional().nullable(),
39386
+ ops: z70.array(Rfc6902PatchOp),
39387
+ rationale: z70.string(),
39388
+ currentContent: z70.record(z70.string(), z70.unknown()).optional()
39389
+ });
39390
+ var MultiPageUpdateResponse = z70.object({
39391
+ patches: z70.array(MultiPagePatchEnvelope),
39392
+ assistantMessage: z70.string(),
39393
+ pagesModified: z70.number(),
39394
+ toolCallsUsed: z70.number()
38308
39395
  });
38309
39396
 
38310
39397
  // src/data/prefetchBlockData.ts