@riverbankcms/sdk 0.130.2 → 0.132.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 (339) hide show
  1. package/CHANGELOG.md +3 -3
  2. package/dist/{PreviewEditorSidebar-BY-1QdE2.mjs → PreviewEditorSidebar-DKQ5eFK9.mjs} +351 -95
  3. package/dist/{PreviewEditorUI-BS34jI9_.mjs → PreviewEditorUI-CNTcOjCC.mjs} +3 -3
  4. package/dist/{PreviewQueryProvider-BD0kOjtI.mjs → PreviewQueryProvider-D51gQaG3.mjs} +1 -1
  5. package/dist/{SdkPreviewModeRuntime-B1pWnhu-.mjs → SdkPreviewModeRuntime-DJu3qu33.mjs} +48 -9
  6. package/dist/{SiteChromeCustomizeContext-BhUG_72i.mjs → SiteChromeCustomizeContext-2TzT3vbj.mjs} +6417 -4184
  7. package/dist/_dts/ai/src/contracts/proposals.d.ts +723 -151
  8. package/dist/_dts/ai/src/contracts/siteStyleProposalSchemas.d.ts +151 -64
  9. package/dist/_dts/api/src/bookingConfig.d.ts +13 -9
  10. package/dist/_dts/api/src/bookingManagementEndpoints.d.ts +8 -19
  11. package/dist/_dts/api/src/bookingManagementEventEndpointTypes.d.ts +31 -2
  12. package/dist/_dts/api/src/bookingVerticals.d.ts +1 -140
  13. package/dist/_dts/api/src/commercePortalEndpoints.d.ts +45 -12
  14. package/dist/_dts/api/src/contentRuntime.d.ts +2 -1
  15. package/dist/_dts/api/src/courses.d.ts +1 -19
  16. package/dist/_dts/api/src/endpoints.d.ts +466 -346
  17. package/dist/_dts/api/src/event-destination-policy.d.ts +1 -1
  18. package/dist/_dts/api/src/eventManagementContracts.d.ts +91 -1
  19. package/dist/_dts/api/src/eventManagementEndpointDefinitions.d.ts +32 -0
  20. package/dist/_dts/api/src/giftingDashboard.d.ts +117 -0
  21. package/dist/_dts/api/src/giftingEndpointDefinitions.d.ts +124 -0
  22. package/dist/_dts/api/src/index.d.ts +4 -4
  23. package/dist/_dts/api/src/indexCoreTypes.d.ts +1 -1
  24. package/dist/_dts/api/src/indexExtendedTypes.d.ts +1 -1
  25. package/dist/_dts/api/src/media.d.ts +1 -0
  26. package/dist/_dts/api/src/navigation/dashboardBookingsNav.d.ts +3 -4
  27. package/dist/_dts/api/src/publicEventEndpointDefinitions.d.ts +11 -0
  28. package/dist/_dts/api/src/publicExperience/eventEndpoints.d.ts +25 -12
  29. package/dist/_dts/api/src/publicExperience/sharedTypes.d.ts +2 -0
  30. package/dist/_dts/api/src/publicExperience/wholeSeriesEndpoints.d.ts +1 -0
  31. package/dist/_dts/api/src/sdk-event-upsert.d.ts +2 -2
  32. package/dist/_dts/api/src/sdkBookingVerticalContracts.d.ts +29 -0
  33. package/dist/_dts/api/src/sdkContracts.d.ts +9 -32
  34. package/dist/_dts/api/src/sdkEndpointDefinitions.d.ts +23 -0
  35. package/dist/_dts/api/src/sdkSettingsContracts.d.ts +25 -0
  36. package/dist/_dts/api/src/sdkThemeCatalogContracts.d.ts +20 -0
  37. package/dist/_dts/api/src/sdkThemeWire.d.ts +16 -6
  38. package/dist/_dts/api/src/siteOnboarding.d.ts +3 -3
  39. package/dist/_dts/api/src/sitePlatformEndpoints.d.ts +4 -10
  40. package/dist/_dts/api/src/siteRuntimeEndpoints.d.ts +0 -3
  41. package/dist/_dts/api/src/types.d.ts +1 -2
  42. package/dist/_dts/blocks/src/PageRenderer.d.ts +2 -13
  43. package/dist/_dts/blocks/src/contracts/non-block-islands.d.ts +9 -0
  44. package/dist/_dts/blocks/src/contracts/proof-block-islands.d.ts +26 -44
  45. package/dist/_dts/blocks/src/index.d.ts +1 -1
  46. package/dist/_dts/blocks/src/subroutes/fold.d.ts +2 -1
  47. package/dist/_dts/blocks/src/system/blocks/courses/shared/index.d.ts +0 -3
  48. package/dist/_dts/blocks/src/system/blocks/courses/shared/pricing.d.ts +2 -50
  49. package/dist/_dts/blocks/src/system/blocks/courses/shared/schemas.d.ts +1 -929
  50. package/dist/_dts/blocks/src/system/blocks/courses/shared/types.d.ts +1 -97
  51. package/dist/_dts/blocks/src/system/blocks/event-details.d.ts +39 -6
  52. package/dist/_dts/blocks/src/system/blocks/events/event-calendar.d.ts +2 -1
  53. package/dist/_dts/blocks/src/system/blocks/events/event-listing.d.ts +3 -3
  54. package/dist/_dts/blocks/src/system/blocks/events/event-spotlight.d.ts +2 -3
  55. package/dist/_dts/blocks/src/system/blocks/events/shared/filtering.d.ts +2 -2
  56. package/dist/_dts/blocks/src/system/blocks/events/shared/schemas.d.ts +6 -6
  57. package/dist/_dts/blocks/src/system/blocks/events/shared/types.d.ts +2 -9
  58. package/dist/_dts/blocks/src/system/blocks/events/whole-series/index.d.ts +3 -0
  59. package/dist/_dts/blocks/src/system/blocks/events/whole-series/pricing.d.ts +50 -0
  60. package/dist/_dts/blocks/src/system/blocks/events/whole-series/schemas.d.ts +135 -0
  61. package/dist/_dts/blocks/src/system/blocks/events/whole-series/types.d.ts +81 -0
  62. package/dist/_dts/blocks/src/system/blocks/media-text.d.ts +9 -9
  63. package/dist/_dts/blocks/src/system/blocks/offerings-preview/model.d.ts +1 -1
  64. package/dist/_dts/blocks/src/system/fields/boxStyles.d.ts +7 -8
  65. package/dist/_dts/blocks/src/system/node/validation-constants.d.ts +1 -1
  66. package/dist/_dts/blocks/src/system/runtime/blockComposition.d.ts +1 -1
  67. package/dist/_dts/blocks/src/system/runtime/components/registry.client.d.ts +45 -72
  68. package/dist/_dts/blocks/src/system/runtime/components/runtime-backed-blocks.d.ts +21 -36
  69. package/dist/_dts/blocks/src/system/runtime/hooks/useHeadlessWholeSeriesRegistrationFlow.d.ts +6 -6
  70. package/dist/_dts/blocks/src/system/runtime/nodes/course-page-surface-scope.d.ts +2 -5
  71. package/dist/_dts/blocks/src/system/runtime/nodes/course-registration.client.d.ts +4 -2
  72. package/dist/_dts/blocks/src/system/runtime/nodes/course-registration.interactive.d.ts +19 -7
  73. package/dist/_dts/blocks/src/system/runtime/nodes/event-details/logic.d.ts +25 -4
  74. package/dist/_dts/blocks/src/system/runtime/nodes/event-details/presentation.d.ts +75 -0
  75. package/dist/_dts/blocks/src/system/runtime/nodes/event-details/view.d.ts +4 -1
  76. package/dist/_dts/blocks/src/system/runtime/nodes/event-details.client.d.ts +5 -2
  77. package/dist/_dts/blocks/src/system/runtime/nodes/event-details.server.d.ts +5 -2
  78. package/dist/_dts/blocks/src/system/runtime/nodes/event-registration/PaymentSelectionStep.d.ts +4 -0
  79. package/dist/_dts/blocks/src/system/runtime/nodes/event-registration/RegistrationClosedState.d.ts +5 -0
  80. package/dist/_dts/blocks/src/system/runtime/nodes/event-registration/SiteCreditPreviewPanel.d.ts +6 -0
  81. package/dist/_dts/blocks/src/system/runtime/nodes/event-registration/eventPaymentOptions.d.ts +2 -0
  82. package/dist/_dts/blocks/src/system/runtime/nodes/event-registration/hooks.d.ts +17 -0
  83. package/dist/_dts/blocks/src/system/runtime/nodes/event-registration/registrationSurface.d.ts +3 -3
  84. package/dist/_dts/blocks/src/system/runtime/nodes/event-registration/siteCreditPreview.d.ts +51 -0
  85. package/dist/_dts/blocks/src/system/runtime/nodes/event-registration/types.d.ts +3 -3
  86. package/dist/_dts/blocks/src/system/runtime/nodes/event-registration/useEventRegistrationWizard.d.ts +2 -0
  87. package/dist/_dts/blocks/src/system/runtime/nodes/{course-registration → event-registration/whole-series}/BookingModeStep.d.ts +1 -1
  88. package/dist/_dts/blocks/src/system/runtime/nodes/{course-registration → event-registration/whole-series}/CheckIcon.d.ts +1 -1
  89. package/dist/_dts/blocks/src/system/runtime/nodes/{course-registration → event-registration/whole-series}/ErrorStep.d.ts +1 -1
  90. package/dist/_dts/blocks/src/system/runtime/nodes/{course-registration → event-registration/whole-series}/MembershipHero.d.ts +3 -3
  91. package/dist/_dts/blocks/src/system/runtime/nodes/{course-registration → event-registration/whole-series}/PaymentFailedStep.d.ts +1 -1
  92. package/dist/_dts/blocks/src/system/runtime/nodes/event-registration/whole-series/StepIndicator.d.ts +6 -0
  93. package/dist/_dts/blocks/src/system/runtime/nodes/{course-registration → event-registration/whole-series}/VerifyingTimeoutStep.d.ts +1 -1
  94. package/dist/_dts/blocks/src/system/runtime/nodes/event-registration/whole-series/WholeSeriesRegistrationActiveSteps.d.ts +9 -0
  95. package/dist/_dts/blocks/src/system/runtime/nodes/{course-registration/CourseRegistrationErrorBoundary.d.ts → event-registration/whole-series/WholeSeriesRegistrationErrorBoundary.d.ts} +5 -2
  96. package/dist/_dts/blocks/src/system/runtime/nodes/event-registration/whole-series/WholeSeriesRegistrationTerminalContent.d.ts +8 -0
  97. package/dist/_dts/blocks/src/system/runtime/nodes/event-registration/whole-series/WholeSeriesRegistrationWizard.d.ts +8 -0
  98. package/dist/_dts/blocks/src/system/runtime/nodes/event-registration/whole-series/components.d.ts +45 -0
  99. package/dist/_dts/blocks/src/system/runtime/nodes/{course-registration → event-registration/whole-series}/index.d.ts +4 -4
  100. package/dist/_dts/blocks/src/system/runtime/nodes/event-registration/whole-series/presentation.d.ts +7 -0
  101. package/dist/_dts/blocks/src/system/runtime/nodes/event-registration/whole-series/pricing.d.ts +14 -0
  102. package/dist/_dts/blocks/src/system/runtime/nodes/{course-registration → event-registration/whole-series}/types.d.ts +18 -16
  103. package/dist/_dts/blocks/src/system/runtime/nodes/{course-registration/useCourseEligibility.d.ts → event-registration/whole-series/useWholeSeriesEligibility.d.ts} +6 -6
  104. package/dist/_dts/blocks/src/system/runtime/nodes/event-registration/whole-series/useWholeSeriesPaymentVerification.d.ts +10 -0
  105. package/dist/_dts/blocks/src/system/runtime/nodes/event-registration/whole-series/useWholeSeriesRegistrationActions.d.ts +35 -0
  106. package/dist/_dts/blocks/src/system/runtime/nodes/{course-registration/useCourseRegistrationPortal.d.ts → event-registration/whole-series/useWholeSeriesRegistrationPortal.d.ts} +2 -2
  107. package/dist/_dts/blocks/src/system/runtime/nodes/event-registration/whole-series/useWholeSeriesRegistrationSelection.d.ts +35 -0
  108. package/dist/_dts/blocks/src/system/runtime/nodes/event-registration/whole-series/useWholeSeriesRegistrationWizard.d.ts +185 -0
  109. package/dist/_dts/blocks/src/system/runtime/nodes/{course-registration/useCourseWaitlistSelection.d.ts → event-registration/whole-series/useWholeSeriesWaitlistSelection.d.ts} +5 -5
  110. package/dist/_dts/blocks/src/system/runtime/nodes/{course-registration → event-registration/whole-series}/utils.d.ts +4 -4
  111. package/dist/_dts/blocks/src/system/runtime/nodes/{course-registration → event-registration/whole-series}/whole-series-registration.headless.contract.d.ts +5 -7
  112. package/dist/_dts/blocks/src/system/runtime/nodes/{course-registration → event-registration/whole-series}/whole-series-registration.headless.planning.d.ts +2 -2
  113. package/dist/_dts/blocks/src/system/runtime/nodes/event-registration/whole-series/wholeSeriesPageSurfaceScope.d.ts +17 -0
  114. package/dist/_dts/blocks/src/system/runtime/nodes/{course-registration/courseRegistrationViewState.d.ts → event-registration/whole-series/wholeSeriesRegistrationViewState.d.ts} +7 -7
  115. package/dist/_dts/blocks/src/system/runtime/nodes/{course-registration → event-registration/whole-series}/wizardSteps.d.ts +4 -4
  116. package/dist/_dts/blocks/src/system/runtime/nodes/event-registration.interactive.d.ts +24 -54
  117. package/dist/_dts/blocks/src/system/runtime/nodes/events/EventCombined.client.d.ts +2 -0
  118. package/dist/_dts/blocks/src/system/runtime/nodes/events/EventCombined.interactive.d.ts +3 -0
  119. package/dist/_dts/blocks/src/system/runtime/nodes/events/EventListing.interactive.d.ts +12 -11
  120. package/dist/_dts/blocks/src/system/runtime/nodes/events/EventListing.server.d.ts +3 -2
  121. package/dist/_dts/blocks/src/system/runtime/nodes/events/EventSpotlight.d.ts +3 -2
  122. package/dist/_dts/blocks/src/system/runtime/nodes/events/shared/EventCard.d.ts +3 -2
  123. package/dist/_dts/blocks/src/system/runtime/nodes/events/shared/EventDetailModal.d.ts +4 -3
  124. package/dist/_dts/blocks/src/system/runtime/nodes/events/shared/EventModalCloseButton.d.ts +7 -0
  125. package/dist/_dts/blocks/src/system/runtime/nodes/events/shared/EventModals.d.ts +4 -3
  126. package/dist/_dts/blocks/src/system/runtime/nodes/events/shared/WeekBoardView.d.ts +14 -0
  127. package/dist/_dts/blocks/src/system/runtime/nodes/events/shared/eventCollectionContract.d.ts +19 -4
  128. package/dist/_dts/blocks/src/system/runtime/nodes/shared/MagicLinkForm.d.ts +1 -1
  129. package/dist/_dts/blocks/src/system/runtime/shared/components/DiscountCodeDisclosure.d.ts +12 -12
  130. package/dist/_dts/blocks/src/system/runtime/shared/useWaitlistClaim.d.ts +1 -0
  131. package/dist/_dts/blocks/src/system/transforms/registry/_utils/boxStyleClassNames.d.ts +30 -11
  132. package/dist/_dts/blocks/src/system/transforms/registry/boxStyles.d.ts +15 -4
  133. package/dist/_dts/blocks/src/system/transforms/registry/index.d.ts +1 -0
  134. package/dist/_dts/blocks/src/system/transforms/typed.d.ts +1 -4
  135. package/dist/_dts/commerce/src/purchase/bookingInstalmentSchedule.d.ts +13 -0
  136. package/dist/_dts/commerce/src/purchase/cancellationPolicy.d.ts +7 -0
  137. package/dist/_dts/commerce/src/purchase/canonicalRefundPlanner.d.ts +48 -0
  138. package/dist/_dts/commerce/src/purchase/checkoutCollectionPlan.d.ts +39 -0
  139. package/dist/_dts/commerce/src/purchase/checkoutCommitPlan.d.ts +40 -0
  140. package/dist/_dts/commerce/src/purchase/checkoutDiscountContextPlanning.d.ts +80 -0
  141. package/dist/_dts/commerce/src/purchase/checkoutErrorCodes.d.ts +1 -0
  142. package/dist/_dts/commerce/src/purchase/checkoutOrderItemProjection.d.ts +22 -0
  143. package/dist/_dts/commerce/src/purchase/checkoutPaymentFlow.d.ts +50 -0
  144. package/dist/_dts/commerce/src/purchase/checkoutPaymentPlanPlanning.d.ts +30 -0
  145. package/dist/_dts/commerce/src/purchase/checkoutPaymentTermPlanning.d.ts +10 -0
  146. package/dist/_dts/commerce/src/purchase/checkoutPaymentTerms.d.ts +53 -0
  147. package/dist/_dts/commerce/src/purchase/checkoutQuantity.d.ts +8 -0
  148. package/dist/_dts/commerce/src/purchase/checkoutSessionMetadata.d.ts +76 -0
  149. package/dist/_dts/commerce/src/purchase/checkoutSettlement.d.ts +46 -0
  150. package/dist/_dts/commerce/src/purchase/checkoutStripeFinalizationPlanning.d.ts +12 -0
  151. package/dist/_dts/commerce/src/purchase/checkoutStripeSessionPlanning.d.ts +125 -0
  152. package/dist/_dts/commerce/src/purchase/checkoutValidatedItemPlanning.d.ts +55 -0
  153. package/dist/_dts/commerce/src/purchase/confirmationEmailPayment.d.ts +91 -0
  154. package/dist/_dts/commerce/src/purchase/discountApplication.d.ts +74 -0
  155. package/dist/_dts/commerce/src/purchase/index.d.ts +55 -0
  156. package/dist/_dts/commerce/src/purchase/oneTimeCheckoutPlanning.d.ts +86 -0
  157. package/dist/_dts/commerce/src/purchase/order-number.d.ts +33 -0
  158. package/dist/_dts/commerce/src/purchase/orderCancellationPlan.d.ts +19 -0
  159. package/dist/_dts/commerce/src/purchase/orderCompletionEmailPlan.d.ts +71 -0
  160. package/dist/_dts/commerce/src/purchase/orderConfirmationPlanning.d.ts +120 -0
  161. package/dist/_dts/commerce/src/purchase/orderFulfillmentPlan.d.ts +81 -0
  162. package/dist/_dts/commerce/src/purchase/orderFulfillmentResult.d.ts +8 -0
  163. package/dist/_dts/commerce/src/purchase/orderHistoryLedgerFilters.d.ts +1 -0
  164. package/dist/_dts/commerce/src/purchase/orderHistorySource.d.ts +11 -0
  165. package/dist/_dts/commerce/src/purchase/orderInstalmentAdminSettlement.d.ts +43 -0
  166. package/dist/_dts/commerce/src/purchase/orderInstalmentClosure.d.ts +29 -0
  167. package/dist/_dts/commerce/src/purchase/orderInstalmentLifecycle.d.ts +44 -0
  168. package/dist/_dts/commerce/src/purchase/orderInstalmentPayoff.d.ts +24 -0
  169. package/dist/_dts/commerce/src/purchase/orderInstalmentPlan.d.ts +40 -0
  170. package/dist/_dts/commerce/src/purchase/orderItemMetadata.d.ts +151 -0
  171. package/dist/_dts/commerce/src/purchase/orderItemSupport.d.ts +14 -0
  172. package/dist/_dts/commerce/src/purchase/orderListFilters.d.ts +3 -0
  173. package/dist/_dts/commerce/src/purchase/orderPaymentLinkPlanning.d.ts +60 -0
  174. package/dist/_dts/commerce/src/purchase/orderPaymentReceipt.d.ts +184 -0
  175. package/dist/_dts/commerce/src/purchase/orderPaymentState.d.ts +135 -0
  176. package/dist/_dts/commerce/src/purchase/orderPlanningTypes.d.ts +102 -0
  177. package/dist/_dts/commerce/src/purchase/orderRefundPlanning.d.ts +50 -0
  178. package/dist/_dts/commerce/src/purchase/orderRefundPolicy.d.ts +36 -0
  179. package/dist/_dts/commerce/src/purchase/orderTotals.d.ts +23 -0
  180. package/dist/_dts/commerce/src/purchase/orderTypes.d.ts +39 -0
  181. package/dist/_dts/commerce/src/purchase/pendingCheckoutSessionClaim.d.ts +1 -0
  182. package/dist/_dts/commerce/src/purchase/persistedCheckoutLines.d.ts +27 -0
  183. package/dist/_dts/commerce/src/purchase/protectedDepositRefundPolicy.d.ts +86 -0
  184. package/dist/_dts/commerce/src/purchase/refundPolicy.d.ts +8 -0
  185. package/dist/_dts/commerce/src/purchase/refundRailSplit.d.ts +40 -0
  186. package/dist/_dts/commerce/src/purchase/result.d.ts +2 -0
  187. package/dist/_dts/commerce/src/purchase/settlement.d.ts +97 -0
  188. package/dist/_dts/commerce/src/purchase/shopRefundPlanning.d.ts +43 -0
  189. package/dist/_dts/commerce/src/purchase/stateTransitions.d.ts +31 -0
  190. package/dist/_dts/commerce/src/purchase/stripeMinimumCharge.d.ts +10 -0
  191. package/dist/_dts/commerce/src/purchase/types.d.ts +168 -0
  192. package/dist/_dts/commerce/src/shop/shipmentEligibility.d.ts +14 -0
  193. package/dist/_dts/commerce/src/utils/assertNever.d.ts +1 -0
  194. package/dist/_dts/content-model/src/content-types/builtin-schemas.d.ts +4 -0
  195. package/dist/_dts/content-model/src/content-types/builtins.d.ts +4 -0
  196. package/dist/_dts/core/src/booking-vertical-catalog.d.ts +741 -0
  197. package/dist/_dts/core/src/booking-vertical-config.d.ts +66 -0
  198. package/dist/_dts/core/src/booking-vertical-definitions.d.ts +68 -0
  199. package/dist/_dts/{api/src/bookingVerticalPreset.d.ts → core/src/booking-vertical-preset.d.ts} +1 -1
  200. package/dist/_dts/core/src/booking-verticals.d.ts +98 -0
  201. package/dist/_dts/core/src/event-page-selection.d.ts +22 -0
  202. package/dist/_dts/core/src/event-pricing.d.ts +5 -0
  203. package/dist/_dts/core/src/event-series-behaviour.d.ts +16 -0
  204. package/dist/_dts/core/src/index.d.ts +3 -0
  205. package/dist/_dts/db/src/generated/supabase/database.types.d.ts +72 -0
  206. package/dist/_dts/db/src/schemas/forms.d.ts +4 -4
  207. package/dist/_dts/media-core/src/fileUploadCompletion.d.ts +3 -0
  208. package/dist/_dts/media-core/src/fileUploadDurableFinalization.d.ts +2 -0
  209. package/dist/_dts/media-core/src/identifiers.d.ts +10 -0
  210. package/dist/_dts/media-core/src/mediaWriteNormalizer.d.ts +2 -6
  211. package/dist/_dts/media-core/src/types.d.ts +2 -1
  212. package/dist/_dts/media-editor/src/index.d.ts +2 -2
  213. package/dist/_dts/media-editor/src/mediaSelection.d.ts +1 -22
  214. package/dist/_dts/media-editor/src/useMediaSelection.d.ts +0 -9
  215. package/dist/_dts/preview-next/src/client/preview/ButtonHoverRoleControls.d.ts +10 -0
  216. package/dist/_dts/preview-next/src/client/preview/ButtonStylePicker.d.ts +3 -2
  217. package/dist/_dts/preview-next/src/client/preview/PreviewEditorSidebar.d.ts +3 -1
  218. package/dist/_dts/preview-next/src/client/preview/PreviewShell.d.ts +2 -1
  219. package/dist/_dts/preview-next/src/client/preview/PreviewShellLayout.d.ts +2 -1
  220. package/dist/_dts/preview-next/src/client/preview/StyleConfigurator.d.ts +3 -1
  221. package/dist/_dts/preview-next/src/client/preview/StyleConfiguratorWarningNotice.d.ts +7 -0
  222. package/dist/_dts/preview-next/src/client/preview/siteStylePreviewPlanner.d.ts +1 -1
  223. package/dist/_dts/sdk/src/client/eventSubrouteReadOperations.d.ts +11 -0
  224. package/dist/_dts/sdk/src/client/types.d.ts +12 -5
  225. package/dist/_dts/sdk/src/components.d.ts +1 -1
  226. package/dist/_dts/sdk/src/contracts/index.d.ts +1 -1
  227. package/dist/_dts/sdk/src/contracts/page.d.ts +2 -13
  228. package/dist/_dts/sdk/src/contracts/system-block-content.d.ts +4 -16
  229. package/dist/_dts/sdk/src/next/pageMetadataProjection.d.ts +7 -0
  230. package/dist/_dts/sdk/src/next/resolveEventPageSubroute.d.ts +12 -0
  231. package/dist/_dts/sdk/src/public-api/contracts.d.ts +5 -19
  232. package/dist/_dts/sdk/src/public-api/eventSubrouteContracts.d.ts +12 -0
  233. package/dist/_dts/sdk/src/public-api/runtime.d.ts +1 -1
  234. package/dist/_dts/sdk/src/rendering/client.d.ts +44 -0
  235. package/dist/_dts/sdk/src/rendering/index.d.ts +1 -1
  236. package/dist/_dts/sdk/src/routing/entrySubroutes.d.ts +1 -1
  237. package/dist/_dts/sdk/src/routing/resolveOccurrence.d.ts +4 -3
  238. package/dist/_dts/sdk/src/routing/resolvePageContent.d.ts +7 -3
  239. package/dist/_dts/sdk/src/version.d.ts +1 -1
  240. package/dist/_dts/theme-core/src/buttons/buttonSurfaceContext.d.ts +1 -1
  241. package/dist/_dts/theme-core/src/buttons/contextualHover.d.ts +41 -0
  242. package/dist/_dts/theme-core/src/buttons/index.d.ts +1 -0
  243. package/dist/_dts/theme-core/src/buttons/resolveButtonColourStates.d.ts +3 -0
  244. package/dist/_dts/theme-core/src/buttons/resolveButtonHoverTreatment.d.ts +14 -0
  245. package/dist/_dts/theme-core/src/buttons/styles/domain.d.ts +21 -4
  246. package/dist/_dts/theme-core/src/buttons/styles/recipes/flatInk.d.ts +92 -0
  247. package/dist/_dts/theme-core/src/buttons/styles/recipes/staticRecipes.d.ts +10 -150
  248. package/dist/_dts/theme-core/src/buttons/styles/registry.d.ts +57 -102
  249. package/dist/_dts/theme-core/src/buttons/styles/selection.d.ts +50 -2
  250. package/dist/_dts/theme-core/src/buttons/types.d.ts +29 -0
  251. package/dist/_dts/theme-core/src/cards/types.d.ts +3 -25
  252. package/dist/_dts/theme-core/src/generated/containerResponsiveThemeCss.d.ts +1 -1
  253. package/dist/_dts/theme-core/src/mock-themes/all.d.ts +21 -6
  254. package/dist/_dts/theme-core/src/schema.d.ts +21 -33
  255. package/dist/_dts/theme-core/src/site-styles/appearancePresetCatalog.d.ts +27 -0
  256. package/dist/_dts/theme-core/src/site-styles/blockAppearancePresets.d.ts +27 -0
  257. package/dist/_dts/theme-core/src/site-styles/buttonSelectionCompiler.d.ts +18 -0
  258. package/dist/_dts/theme-core/src/site-styles/compilationPlan.d.ts +21 -0
  259. package/dist/_dts/theme-core/src/site-styles/previewCompiler.d.ts +2 -11
  260. package/dist/_dts/theme-core/src/site-styles/selectionFallbackWarning.d.ts +15 -0
  261. package/dist/_dts/theme-core/src/site-styles/types.d.ts +13 -1
  262. package/dist/_dts/ui/src/navigation-tabs.d.ts +2 -0
  263. package/dist/client/{DiscountCodeDisclosure-BPZ-yfGI.mjs → DiscountCodeDisclosure-DO7llLxm.mjs} +12 -12
  264. package/dist/client/{EventCombined.client-Cjt3kKYR.mjs → EventCombined.client-xID7zN__.mjs} +36 -48
  265. package/dist/client/{EventListing.client-DY9dn6Fh.mjs → EventListing.client-CriBslp0.mjs} +2 -2
  266. package/dist/client/{LeafletStaticMap--2c61XYn.mjs → LeafletStaticMap-DYmHnM8g.mjs} +1 -1
  267. package/dist/client/{StepIndicator-CLjQhkDb.mjs → StepIndicator-CGixP_LW.mjs} +2 -2
  268. package/dist/client/{CourseRegistrationWizard-DGW9F0SQ.mjs → WholeSeriesRegistrationWizard-BEjzSiOA.mjs} +1408 -1245
  269. package/dist/client/{accordion-_boYwHHi.mjs → accordion-CgFbnnnQ.mjs} +1 -1
  270. package/dist/client/{bookingForm--AqEfyBX.mjs → bookingForm-dUyGpbxc.mjs} +5 -5
  271. package/dist/client/bookings.mjs +635 -471
  272. package/dist/client/{carousel-CVI2dqZr.mjs → carousel-BvBwkUzx.mjs} +1 -1
  273. package/dist/client/{cart-DR6IiPz9.mjs → cart-DiZENT2E.mjs} +3 -3
  274. package/dist/client/{checkout-CsrGAfQt.mjs → checkout-Dq13KIgR.mjs} +3 -3
  275. package/dist/client/client.mjs +6291 -3452
  276. package/dist/client/{courseRegistration-aNJVaLa3.mjs → courseRegistration-CKC5NmyH.mjs} +10 -4
  277. package/dist/client/{eventCalendar-OZ7h59VN.mjs → eventCalendar-BF0Jatfw.mjs} +40 -43
  278. package/dist/client/{eventCombined-BbJ6bFKz.mjs → eventCombined-BuoCF8je.mjs} +2 -2
  279. package/dist/client/{eventDetails-BLyUBiCT.mjs → eventDetails-CKwh0S9s.mjs} +276 -94
  280. package/dist/client/{eventListing-DuP1yhBS.mjs → eventListing-eUxaWFaB.mjs} +2 -2
  281. package/dist/client/{eventRegistration-BXyECPa-.mjs → eventRegistration-CfkNOkPb.mjs} +625 -132
  282. package/dist/client/{form-BA4t3kKU.mjs → form-C17H1c_H.mjs} +1 -1
  283. package/dist/client/{headerSection-CpNaJxhW.mjs → headerSection-DEwUmrtt.mjs} +2 -2
  284. package/dist/client/hooks.mjs +1312 -481
  285. package/dist/client/{locationMap-3HGMCL7_.mjs → locationMap-Pf2QwuvW.mjs} +2 -2
  286. package/dist/client/{newsletterForm-C2s6Mw67.mjs → newsletterForm-BWQAH5Sv.mjs} +1 -1
  287. package/dist/client/pricing-CVdvbopJ.mjs +195 -0
  288. package/dist/client/{productDetail-C9joWhdE.mjs → productDetail-BZi1Fa_G.mjs} +3 -3
  289. package/dist/client/{productList-CjzdU3pB.mjs → productList-qq-55DNk.mjs} +3 -3
  290. package/dist/client/{propsDecoder-CBPGXEYX.mjs → propsDecoder-BxmqPKdP.mjs} +412 -196
  291. package/dist/client/rendering/client.mjs +5685 -4037
  292. package/dist/client/rendering/islands.mjs +18 -18
  293. package/dist/client/rendering.mjs +7006 -4124
  294. package/dist/client/{scrollToBlock-DZ73aEX6.mjs → scrollToBlock-B3CcKdtG.mjs} +1 -1
  295. package/dist/client/{shop-CQRai7hj.mjs → shop-DNWJPut5.mjs} +5 -5
  296. package/dist/client/{shop-commerce-hP9UboOx.mjs → shop-commerce-BhvQCosS.mjs} +4 -4
  297. package/dist/client/{shop-commerce-store-DiD5a32e.mjs → shop-commerce-store-B04sCNnW.mjs} +1 -1
  298. package/dist/client/{shopShared-DP8DXTkF.mjs → shopShared-DNNgZlmW.mjs} +2 -2
  299. package/dist/client/{useEventFilters-pF_OJNQP.mjs → useEventFilters-CUmhE24_.mjs} +195 -6
  300. package/dist/client/{usePolling-Cls91SD2.mjs → usePolling-M5jG675x.mjs} +3 -3
  301. package/dist/preview-next/before-render.mjs +247 -60
  302. package/dist/preview-next/client/runtime.mjs +4 -4
  303. package/dist/preview-next/keepAlive.mjs +247 -60
  304. package/dist/preview-next/middleware.mjs +247 -60
  305. package/dist/{previewAuthStore-CX1C_KJ4.mjs → previewAuthStore-BFKd4LrN.mjs} +247 -60
  306. package/dist/{sdk-runtime-5CcPAI14.mjs → sdk-runtime-BEXb1wqo.mjs} +2 -2
  307. package/dist/{separator-BXlYN_gr.mjs → separator-DGMuip1D.mjs} +1 -1
  308. package/dist/server/components.mjs +3461 -1577
  309. package/dist/server/config-validation.mjs +1312 -482
  310. package/dist/server/config.mjs +1312 -482
  311. package/dist/server/data.mjs +1312 -481
  312. package/dist/server/index.mjs +289 -81
  313. package/dist/server/manifest.mjs +0 -1
  314. package/dist/server/next.mjs +3576 -1689
  315. package/dist/server/page-converter.mjs +797 -250
  316. package/dist/server/prebuild.mjs +1 -1
  317. package/dist/server/rendering/server.mjs +3461 -1576
  318. package/dist/server/rendering.mjs +3461 -1577
  319. package/dist/server/routing.mjs +1555 -616
  320. package/dist/server/server.mjs +1352 -560
  321. package/dist/server/theme-bridge.mjs +1992 -931
  322. package/dist/server/theme.mjs +346 -133
  323. package/dist/styles/index.css +1602 -796
  324. package/package.json +1 -1
  325. package/dist/_dts/api/src/bookingVerticalCatalog.d.ts +0 -746
  326. package/dist/_dts/api/src/eventSeriesPresentationPreset.d.ts +0 -12
  327. package/dist/_dts/blocks/src/system/runtime/nodes/course-registration/CourseRegistrationWizard.d.ts +0 -3
  328. package/dist/_dts/blocks/src/system/runtime/nodes/course-registration/StepIndicator.d.ts +0 -6
  329. package/dist/_dts/blocks/src/system/runtime/nodes/course-registration/components.d.ts +0 -45
  330. package/dist/_dts/blocks/src/system/runtime/nodes/course-registration/pricing.d.ts +0 -14
  331. package/dist/_dts/blocks/src/system/runtime/nodes/course-registration/useCoursePaymentVerification.d.ts +0 -9
  332. package/dist/_dts/blocks/src/system/runtime/nodes/course-registration/useCourseRegistrationActions.d.ts +0 -35
  333. package/dist/_dts/blocks/src/system/runtime/nodes/course-registration/useCourseRegistrationSelection.d.ts +0 -31
  334. package/dist/_dts/blocks/src/system/runtime/nodes/course-registration/useCourseRegistrationWizard.d.ts +0 -102
  335. package/dist/client/eventProductEligibility-AVxyCB1u.mjs +0 -50
  336. package/dist/client/pricing-BiqIMgZk.mjs +0 -174
  337. /package/dist/_dts/blocks/src/system/runtime/nodes/{course-registration → event-registration/whole-series}/PortalAuthSidebar.d.ts +0 -0
  338. /package/dist/_dts/blocks/src/system/runtime/nodes/{course-registration → event-registration/whole-series}/SuccessStep.d.ts +0 -0
  339. /package/dist/_dts/blocks/src/system/runtime/nodes/{course-registration → event-registration/whole-series}/WaitlistStep.d.ts +0 -0
@@ -1759,6 +1759,12 @@ const opaqueButtonColourTokenSchema = themeColorTokenSchema.refine((value) => pa
1759
1759
  if (token === null) throw new Error("Invariant: opaque button token passed its schema");
1760
1760
  return token;
1761
1761
  });
1762
+ const contextualButtonHoverSchema = z.strictObject({
1763
+ kind: z.literal("shade-shift"),
1764
+ seedToken: opaqueButtonColourTokenSchema,
1765
+ fallbackDirection: z.enum(["lighter", "darker"]),
1766
+ preferredToken: opaqueButtonColourTokenSchema.optional()
1767
+ });
1762
1768
  const buttonShadeAmountSchema = z.number().finite().min(0).max(900).multipleOf(100);
1763
1769
  const buttonShadowIntensitySchema = z.enum([
1764
1770
  "subtle",
@@ -2098,6 +2104,7 @@ const buttonVariantSchema = z.strictObject({
2098
2104
  shadow: variantShadowSchema.optional(),
2099
2105
  border: buttonBorderSchema.optional(),
2100
2106
  hoverBackgroundToken: opaqueButtonColourTokenSchema.optional(),
2107
+ contextualHover: contextualButtonHoverSchema.optional(),
2101
2108
  effects: variantEffectsSchema.optional(),
2102
2109
  sizes: variantSizeOverridesSchema.optional(),
2103
2110
  affordance: buttonVariantAffordanceSchema.optional()
@@ -2331,13 +2338,7 @@ const tokenOrCssColorValueSchema = z.string();
2331
2338
  buttonSizeNameSchema.options;
2332
2339
  //#endregion
2333
2340
  //#region ../theme-core/src/buttons/styles/domain.ts
2334
- const PUBLIC_BUTTON_ROLES = [
2335
- "primary",
2336
- "secondary",
2337
- "outline",
2338
- "ghost",
2339
- "accent"
2340
- ];
2341
+ const PUBLIC_BUTTON_ROLES = VARIANT_ROLES;
2341
2342
  function defineButtonStyleRecipe(recipe) {
2342
2343
  return recipe;
2343
2344
  }
@@ -2433,6 +2434,14 @@ const BUTTON_STYLE_IDS = [
2433
2434
  "quiet-arrow"
2434
2435
  ];
2435
2436
  const quietArrowParametersSchema = z.object({ secondaryTreatment: z.enum(["outlined", "solid-accent"]) }).strict();
2437
+ const flatInkHoverTreatmentSchema = z.enum([
2438
+ "contextual",
2439
+ "secondary",
2440
+ "accent"
2441
+ ]);
2442
+ const flatInkHoverPreferencesShape = Object.fromEntries(VARIANT_ROLES.map((role) => [role, flatInkHoverTreatmentSchema.optional()]));
2443
+ const flatInkHoverPreferencesSchema = z.strictObject(flatInkHoverPreferencesShape);
2444
+ const flatInkParametersSchema = z.strictObject({ hoverPreferences: flatInkHoverPreferencesSchema.optional() });
2436
2445
  const emptyParametersSchema$1 = z.object({}).strict();
2437
2446
  function selectionBranch(styleId, parameters) {
2438
2447
  return z.object({
@@ -2447,7 +2456,7 @@ const buttonStyleSelectionSchema = z.discriminatedUnion("styleId", [
2447
2456
  selectionBranch("editorial-link", emptyParametersSchema$1),
2448
2457
  selectionBranch("pebble", emptyParametersSchema$1),
2449
2458
  selectionBranch("ink-stamp", emptyParametersSchema$1),
2450
- selectionBranch("flat-ink", emptyParametersSchema$1),
2459
+ selectionBranch("flat-ink", flatInkParametersSchema),
2451
2460
  selectionBranch("brushed-wash", emptyParametersSchema$1),
2452
2461
  selectionBranch("showtime-pill", emptyParametersSchema$1),
2453
2462
  selectionBranch("joy-stamp", emptyParametersSchema$1),
@@ -2584,6 +2593,189 @@ const quietArrowRecipe = defineButtonStyleRecipe({
2584
2593
  })
2585
2594
  });
2586
2595
  //#endregion
2596
+ //#region ../theme-core/src/buttons/styles/recipes/flatInk.ts
2597
+ const contextualRoleConfig = {
2598
+ primary: {
2599
+ contextualSeedToken: unsafeAsOpaqueButtonColourToken("primary"),
2600
+ fallbackDirection: "darker"
2601
+ },
2602
+ secondary: {
2603
+ contextualSeedToken: unsafeAsOpaqueButtonColourToken("surfaceAlt"),
2604
+ fallbackDirection: "darker"
2605
+ },
2606
+ outline: {
2607
+ contextualSeedToken: unsafeAsOpaqueButtonColourToken("surfaceAlt"),
2608
+ fallbackDirection: "darker"
2609
+ },
2610
+ ghost: {
2611
+ contextualSeedToken: unsafeAsOpaqueButtonColourToken("surfaceAlt"),
2612
+ fallbackDirection: "darker"
2613
+ },
2614
+ accent: {
2615
+ contextualSeedToken: unsafeAsOpaqueButtonColourToken("accent"),
2616
+ fallbackDirection: "darker"
2617
+ }
2618
+ };
2619
+ const hoverControl = {
2620
+ kind: "button-hover-by-role",
2621
+ parameter: "hoverPreferences",
2622
+ label: "Button hover",
2623
+ roles: contextualRoleConfig,
2624
+ options: [
2625
+ {
2626
+ value: "contextual",
2627
+ label: "Contextual shade shift"
2628
+ },
2629
+ {
2630
+ value: "secondary",
2631
+ label: "Secondary button colour"
2632
+ },
2633
+ {
2634
+ value: "accent",
2635
+ label: "Accent button colour"
2636
+ }
2637
+ ]
2638
+ };
2639
+ const lift = { effectId: "lift" };
2640
+ const flatInkRecipe = defineButtonStyleRecipe({
2641
+ id: "flat-ink",
2642
+ accessibilityLabel: "Flat rounded buttons with arrow affordances",
2643
+ tags: {
2644
+ tone: "classic",
2645
+ energy: "calm",
2646
+ motion: "subtle",
2647
+ era: "editorial"
2648
+ },
2649
+ parameterSchema: flatInkParametersSchema,
2650
+ defaultParameters: {},
2651
+ controls: [hoverControl],
2652
+ defineSystem: (parameters) => ({
2653
+ global: {
2654
+ cornerStyle: "rounded",
2655
+ textTransform: "none",
2656
+ fontWeight: 600,
2657
+ typography: "body",
2658
+ letterSpacing: "tight",
2659
+ paddingPreset: "default",
2660
+ hoverTransform: "lift",
2661
+ hoverColor: "none"
2662
+ },
2663
+ sizes: {
2664
+ sm: {
2665
+ padding: "0.625rem 1.125rem",
2666
+ fontSize: "text-sm"
2667
+ },
2668
+ md: { padding: "0.8125rem 1.375rem" },
2669
+ lg: {
2670
+ padding: "0.9375rem 1.625rem",
2671
+ fontSize: "text-lg"
2672
+ },
2673
+ xl: {
2674
+ padding: "1.0625rem 2rem",
2675
+ fontSize: "text-xl"
2676
+ }
2677
+ },
2678
+ roles: {
2679
+ primary: {
2680
+ kind: "complete",
2681
+ appearance: {
2682
+ background: {
2683
+ type: "solid",
2684
+ colorToken: unsafeAsOpaqueButtonColourToken("primary")
2685
+ },
2686
+ borderRadius: "rounded-lg",
2687
+ affordance: { iconId: "ArrowRight" },
2688
+ ...hoverAppearance("primary", parameters, [lift, {
2689
+ effectId: "background-on-hover",
2690
+ options: { colorToken: unsafeAsOpaqueButtonColourToken("secondary") }
2691
+ }])
2692
+ }
2693
+ },
2694
+ secondary: {
2695
+ kind: "complete",
2696
+ appearance: {
2697
+ background: {
2698
+ type: "surface",
2699
+ role: "link"
2700
+ },
2701
+ borderRadius: "rounded-lg",
2702
+ border: { widthClass: "border" },
2703
+ ...hoverAppearance("secondary", parameters, [lift, {
2704
+ effectId: "background-on-hover",
2705
+ options: { colorToken: unsafeAsOpaqueButtonColourToken("surfaceAlt") }
2706
+ }])
2707
+ }
2708
+ },
2709
+ outline: {
2710
+ kind: "complete",
2711
+ appearance: {
2712
+ background: {
2713
+ type: "surface",
2714
+ role: "link"
2715
+ },
2716
+ borderRadius: "rounded-lg",
2717
+ border: { widthClass: "border" },
2718
+ ...hoverAppearance("outline", parameters, [lift, {
2719
+ effectId: "background-on-hover",
2720
+ options: { colorToken: unsafeAsOpaqueButtonColourToken("surfaceAlt") }
2721
+ }])
2722
+ }
2723
+ },
2724
+ ghost: {
2725
+ kind: "complete",
2726
+ appearance: {
2727
+ background: {
2728
+ type: "surface",
2729
+ role: "link"
2730
+ },
2731
+ borderRadius: "rounded-lg",
2732
+ ...hoverAppearance("ghost", parameters, [lift])
2733
+ }
2734
+ },
2735
+ accent: {
2736
+ kind: "complete",
2737
+ appearance: {
2738
+ background: {
2739
+ type: "solid",
2740
+ colorToken: unsafeAsOpaqueButtonColourToken("accent")
2741
+ },
2742
+ borderRadius: "rounded-lg",
2743
+ affordance: { iconId: "ArrowRight" },
2744
+ ...hoverAppearance("accent", parameters, [lift])
2745
+ }
2746
+ }
2747
+ }
2748
+ })
2749
+ });
2750
+ function hoverAppearance(role, parameters, recommended) {
2751
+ const preference = parameters.hoverPreferences?.[role];
2752
+ if (preference === void 0) return { effects: { hover: [...recommended] } };
2753
+ if (preference === "contextual") {
2754
+ const config = contextualRoleConfig[role];
2755
+ return {
2756
+ effects: { hover: [lift] },
2757
+ contextualHover: {
2758
+ kind: "shade-shift",
2759
+ seedToken: config.contextualSeedToken,
2760
+ fallbackDirection: config.fallbackDirection
2761
+ }
2762
+ };
2763
+ }
2764
+ const config = contextualRoleConfig[role];
2765
+ return {
2766
+ effects: { hover: [lift] },
2767
+ contextualHover: {
2768
+ kind: "shade-shift",
2769
+ seedToken: config.contextualSeedToken,
2770
+ fallbackDirection: config.fallbackDirection,
2771
+ preferredToken: unsafeAsOpaqueButtonColourToken(paletteRole(preference))
2772
+ }
2773
+ };
2774
+ }
2775
+ function paletteRole(preference) {
2776
+ return preference;
2777
+ }
2778
+ //#endregion
2587
2779
  //#region ../theme-core/src/buttons/styles/recipes/defineStaticButtonStyleRecipe.ts
2588
2780
  const emptyParametersSchema = z.object({}).strict();
2589
2781
  function defineStaticButtonStyleRecipe(input) {
@@ -3430,113 +3622,6 @@ const inkStampRecipe = defineStaticButtonStyleRecipe({
3430
3622
  }
3431
3623
  }
3432
3624
  });
3433
- const flatInkRecipe = defineStaticButtonStyleRecipe({
3434
- id: "flat-ink",
3435
- accessibilityLabel: "Flat rounded buttons with arrow affordances",
3436
- tags: {
3437
- tone: "classic",
3438
- energy: "calm",
3439
- motion: "subtle",
3440
- era: "editorial"
3441
- },
3442
- system: {
3443
- global: {
3444
- cornerStyle: "rounded",
3445
- textTransform: "none",
3446
- fontWeight: 600,
3447
- typography: "body",
3448
- letterSpacing: "tight",
3449
- paddingPreset: "default",
3450
- hoverTransform: "lift",
3451
- hoverColor: "none"
3452
- },
3453
- sizes: {
3454
- sm: {
3455
- padding: "0.625rem 1.125rem",
3456
- fontSize: "text-sm"
3457
- },
3458
- md: { padding: "0.8125rem 1.375rem" },
3459
- lg: {
3460
- padding: "0.9375rem 1.625rem",
3461
- fontSize: "text-lg"
3462
- },
3463
- xl: {
3464
- padding: "1.0625rem 2rem",
3465
- fontSize: "text-xl"
3466
- }
3467
- },
3468
- roles: {
3469
- primary: {
3470
- kind: "complete",
3471
- appearance: {
3472
- background: {
3473
- type: "solid",
3474
- colorToken: "primary"
3475
- },
3476
- borderRadius: "rounded-lg",
3477
- affordance: { iconId: "ArrowRight" },
3478
- effects: { hover: [{ effectId: "lift" }, {
3479
- effectId: "background-on-hover",
3480
- options: { colorToken: unsafeAsOpaqueButtonColourToken("secondary") }
3481
- }] }
3482
- }
3483
- },
3484
- secondary: {
3485
- kind: "complete",
3486
- appearance: {
3487
- background: {
3488
- type: "surface",
3489
- role: "link"
3490
- },
3491
- borderRadius: "rounded-lg",
3492
- border: { widthClass: "border" },
3493
- effects: { hover: [{ effectId: "lift" }, {
3494
- effectId: "background-on-hover",
3495
- options: { colorToken: unsafeAsOpaqueButtonColourToken("surfaceAlt") }
3496
- }] }
3497
- }
3498
- },
3499
- outline: {
3500
- kind: "complete",
3501
- appearance: {
3502
- background: {
3503
- type: "surface",
3504
- role: "link"
3505
- },
3506
- borderRadius: "rounded-lg",
3507
- border: { widthClass: "border" },
3508
- effects: { hover: [{ effectId: "lift" }, {
3509
- effectId: "background-on-hover",
3510
- options: { colorToken: unsafeAsOpaqueButtonColourToken("surfaceAlt") }
3511
- }] }
3512
- }
3513
- },
3514
- ghost: {
3515
- kind: "complete",
3516
- appearance: {
3517
- background: {
3518
- type: "surface",
3519
- role: "link"
3520
- },
3521
- borderRadius: "rounded-lg",
3522
- effects: { hover: [{ effectId: "lift" }] }
3523
- }
3524
- },
3525
- accent: {
3526
- kind: "complete",
3527
- appearance: {
3528
- background: {
3529
- type: "solid",
3530
- colorToken: "accent"
3531
- },
3532
- borderRadius: "rounded-lg",
3533
- affordance: { iconId: "ArrowRight" },
3534
- effects: { hover: [{ effectId: "lift" }] }
3535
- }
3536
- }
3537
- }
3538
- }
3539
- });
3540
3625
  const showtimePillRecipe = defineStaticButtonStyleRecipe({
3541
3626
  id: "showtime-pill",
3542
3627
  accessibilityLabel: "Bold uppercase pill buttons with playful movement",
@@ -3958,8 +4043,8 @@ const openCardRoleValue = "open";
3958
4043
  */
3959
4044
  const surfaceCardRoleValues = [...cardVariantRoleValues, openCardRoleValue];
3960
4045
  /**
3961
- * The closed card-role vocabulary Looks and blocks address cards by — this is
3962
- * `BoxStylesCardVariant` widened with `open`, not a parallel enum.
4046
+ * The closed role vocabulary Looks and blocks use for surfaced and boxless
4047
+ * card choices.
3963
4048
  *
3964
4049
  * - `none` — no site-style card surface; the block's own composition and
3965
4050
  * the author's own card fields govern the item. This is *not*
@@ -3971,11 +4056,6 @@ const surfaceCardRoleValues = [...cardVariantRoleValues, openCardRoleValue];
3971
4056
  * - `alternative` — the statement card carrying the site's personality
3972
4057
  */
3973
4058
  const cardRoleValues = [...surfaceCardRoleValues, boxlessCardVariantValue];
3974
- const legacyCardVariantRoleAliases = {
3975
- variant1: "alternative",
3976
- variant2: "alternative",
3977
- statement: "alternative"
3978
- };
3979
4059
  const cardSpacingSchema = z.enum([
3980
4060
  "none",
3981
4061
  "compact",
@@ -4005,26 +4085,16 @@ const gradientDirectionSchema = z.enum([
4005
4085
  "to-br",
4006
4086
  "to-bl"
4007
4087
  ]);
4008
- const cardVariantRoleSchema = z.enum(cardVariantRoleValues);
4088
+ z.enum(cardVariantRoleValues);
4009
4089
  const surfaceCardRoleSchema = z.enum(surfaceCardRoleValues);
4010
4090
  const cardRoleSchema = z.enum(cardRoleValues);
4011
- /**
4012
- * Historical name for the role vocabulary as it reaches box styles. Widened to
4013
- * the full `CardRole` set — old values keep parsing, `open` now parses too.
4014
- */
4015
- const boxStylesCardVariantSchema = cardRoleSchema;
4016
4091
  function isCardVariantRole(value) {
4017
4092
  return typeof value === "string" && cardVariantRoleValues.includes(value);
4018
4093
  }
4019
4094
  function normalizeCardVariantRole(value) {
4020
- if (isCardVariantRole(value)) return value;
4021
- if (typeof value !== "string") return null;
4022
- return legacyCardVariantRoleAliases[value] ?? null;
4095
+ return isCardVariantRole(value) ? value : null;
4023
4096
  }
4024
- /**
4025
- * The one untrusted-input boundary for the role vocabulary. Legacy alias values
4026
- * (`variant1`, `variant2`, `statement`) normalize here and nowhere else.
4027
- */
4097
+ /** The one untrusted-input boundary for the closed role vocabulary. */
4028
4098
  function normalizeCardRole(value) {
4029
4099
  if (value === "none") return boxlessCardVariantValue;
4030
4100
  if (value === "open") return openCardRoleValue;
@@ -4971,6 +5041,21 @@ const eventListTreatmentValues = [
4971
5041
  "editorial-register",
4972
5042
  "dense-index"
4973
5043
  ];
5044
+ const testimonialsCompositionTreatmentValues = [
5045
+ "open-editorial",
5046
+ "evergreen-lead",
5047
+ "room-and-response",
5048
+ "open-floor"
5049
+ ];
5050
+ /**
5051
+ * How an offerings preview arranges its groups. Structure only — the group
5052
+ * card surface is the Look's `cardRole` and the site style's card system.
5053
+ */
5054
+ const offeringsPreviewCompositionTreatmentValues = [
5055
+ "paired-feature-cards",
5056
+ "open-editorial-columns",
5057
+ "joined-programme-panel"
5058
+ ];
4974
5059
  const eyebrowTreatmentValues = [
4975
5060
  "plain",
4976
5061
  "accent",
@@ -5504,8 +5589,7 @@ const cardStylesOverrideSchema = z.object({
5504
5589
  spacing: semanticSpacingSchema.nullable().optional(),
5505
5590
  raised: z.boolean().nullable().optional(),
5506
5591
  rounded: boxRoundedSchema.nullable().optional(),
5507
- role: cardRoleSchema.nullable().optional(),
5508
- cardVariant: boxStylesCardVariantSchema.nullable().optional()
5592
+ role: cardRoleSchema.nullable().optional()
5509
5593
  });
5510
5594
  const blockStyleOverridesSchema = z.object({
5511
5595
  sectionStyles: sectionStylesOverrideSchema.nullable().optional(),
@@ -6394,7 +6478,12 @@ defineBlockAppearancePreset({
6394
6478
  constraints: { layoutVariantKeys: ["cards"] },
6395
6479
  design: {
6396
6480
  sectionSurface: "base",
6397
- contentFrame: plainFrame
6481
+ contentFrame: plainFrame,
6482
+ cardRole: "alternative",
6483
+ composition: {
6484
+ kind: "offerings-preview",
6485
+ treatment: "paired-feature-cards"
6486
+ }
6398
6487
  }
6399
6488
  }), defineBlockAppearancePreset({
6400
6489
  id: "offerings-preview-open-editorial-columns",
@@ -6404,7 +6493,12 @@ defineBlockAppearancePreset({
6404
6493
  constraints: { layoutVariantKeys: ["cards"] },
6405
6494
  design: {
6406
6495
  sectionSurface: "base",
6407
- contentFrame: plainFrame
6496
+ contentFrame: plainFrame,
6497
+ cardRole: "open",
6498
+ composition: {
6499
+ kind: "offerings-preview",
6500
+ treatment: "open-editorial-columns"
6501
+ }
6408
6502
  }
6409
6503
  }), defineBlockAppearancePreset({
6410
6504
  id: "offerings-preview-joined-programme-panel",
@@ -6414,7 +6508,12 @@ defineBlockAppearancePreset({
6414
6508
  constraints: { layoutVariantKeys: ["cards"] },
6415
6509
  design: {
6416
6510
  sectionSurface: "base",
6417
- contentFrame: plainFrame
6511
+ contentFrame: plainFrame,
6512
+ cardRole: "default",
6513
+ composition: {
6514
+ kind: "offerings-preview",
6515
+ treatment: "joined-programme-panel"
6516
+ }
6418
6517
  }
6419
6518
  }), defineBlockAppearancePreset({
6420
6519
  id: "feature-cards-raised-rule",
@@ -6656,7 +6755,11 @@ defineBlockAppearancePreset({
6656
6755
  constraints: { layoutVariantKeys: ["featured-editorial"] },
6657
6756
  design: {
6658
6757
  sectionSurface: "base",
6659
- contentFrame: plainFrame
6758
+ contentFrame: plainFrame,
6759
+ composition: {
6760
+ kind: "testimonials",
6761
+ treatment: "evergreen-lead"
6762
+ }
6660
6763
  }
6661
6764
  }), defineBlockAppearancePreset({
6662
6765
  id: "testimonials-room-and-response",
@@ -6666,7 +6769,11 @@ defineBlockAppearancePreset({
6666
6769
  constraints: { layoutVariantKeys: ["featured-editorial"] },
6667
6770
  design: {
6668
6771
  sectionSurface: "base",
6669
- contentFrame: plainFrame
6772
+ contentFrame: plainFrame,
6773
+ composition: {
6774
+ kind: "testimonials",
6775
+ treatment: "room-and-response"
6776
+ }
6670
6777
  }
6671
6778
  }), defineBlockAppearancePreset({
6672
6779
  id: "testimonials-open-floor",
@@ -6676,7 +6783,11 @@ defineBlockAppearancePreset({
6676
6783
  constraints: { layoutVariantKeys: ["featured-editorial"] },
6677
6784
  design: {
6678
6785
  sectionSurface: "base",
6679
- contentFrame: plainFrame
6786
+ contentFrame: plainFrame,
6787
+ composition: {
6788
+ kind: "testimonials",
6789
+ treatment: "open-floor"
6790
+ }
6680
6791
  }
6681
6792
  }), defineBlockAppearancePreset({
6682
6793
  id: "faq-base-accordion",
@@ -9574,7 +9685,8 @@ const curatedSiteStyles = [
9574
9685
  buttonStyleChoices: [
9575
9686
  buttonChoice("soft-pill"),
9576
9687
  buttonChoice("pebble"),
9577
- buttonChoice("confident-chip")
9688
+ buttonChoice("confident-chip"),
9689
+ buttonChoice("flat-ink")
9578
9690
  ],
9579
9691
  paletteRecommendations: [
9580
9692
  paletteRecommendation("soft-natural-sage"),
@@ -11086,6 +11198,16 @@ function parseNewsletterSignupDestinationProvider(value) {
11086
11198
  return value === "riverbank" || value === "mailchimp" ? value : null;
11087
11199
  }
11088
11200
  //#endregion
11201
+ //#region ../core/src/event-series-behaviour.ts
11202
+ const SURFACE_EVENT_PRESET_VALUES = [
11203
+ "class",
11204
+ "course",
11205
+ "term",
11206
+ "workshop",
11207
+ "retreat",
11208
+ "performance"
11209
+ ];
11210
+ //#endregion
11089
11211
  //#region ../media-core/src/aspectTransforms.ts
11090
11212
  function parseAspectRatioValue(value) {
11091
11213
  if (typeof value === "number") return Number.isFinite(value) && value > 0 ? value : void 0;
@@ -11320,7 +11442,6 @@ const ALLOWED_TRANSFORM_IDS = [
11320
11442
  "boxStyles.resolveRootStyle",
11321
11443
  "boxStyles.semanticGap",
11322
11444
  "boxStyles.semanticGapValue",
11323
- "boxStyles.cardVariantClass",
11324
11445
  "containerStyles.resolveBoxClassName"
11325
11446
  ];
11326
11447
  new Set(ALLOWED_NODE_TYPES);
@@ -12731,8 +12852,41 @@ function containerStylesField(options = {}) {
12731
12852
  return createBoxStylesFieldWithDepth("container", options);
12732
12853
  }
12733
12854
  function cardStylesField(options = {}) {
12855
+ if (options.controls === "role-only") return createRoleOnlyCardStylesField(options);
12734
12856
  return createBoxStylesFieldWithDepth("card", options);
12735
12857
  }
12858
+ function createRoleOnlyCardStylesField(options) {
12859
+ const { id = "_cardStyles", label = "Card styles", renderInHeader, intent } = options;
12860
+ return {
12861
+ id,
12862
+ type: "modal",
12863
+ label,
12864
+ required: false,
12865
+ schema: { fields: [{
12866
+ id: "role",
12867
+ type: "select",
12868
+ label: "Card style",
12869
+ description: "Choose a semantic card style from the active site style.",
12870
+ required: false,
12871
+ multiple: false,
12872
+ defaultValue: "default",
12873
+ options: cardVariantRoleValues.map((value) => ({
12874
+ value,
12875
+ label: value === "default" ? "Default" : "Alternative"
12876
+ }))
12877
+ }] },
12878
+ ui: {
12879
+ ...typeof renderInHeader === "boolean" ? { renderInHeader } : {},
12880
+ ...intent ? { intent } : {},
12881
+ modalConfig: {
12882
+ buttonLabel: label,
12883
+ description: "Choose the site-style card role.",
12884
+ buttonVariant: "outline",
12885
+ showCustomizedIndicator: true
12886
+ }
12887
+ }
12888
+ };
12889
+ }
12736
12890
  //#endregion
12737
12891
  //#region ../blocks/src/system/fields/imageShape.ts
12738
12892
  const standardImageShapeOptions = [
@@ -13268,6 +13422,73 @@ const SEMANTIC_SPACING_VALUES = [
13268
13422
  "spacious"
13269
13423
  ];
13270
13424
  /**
13425
+ * Runtime type guard for validating spacing values.
13426
+ * Use this at system boundaries where data enters from external sources.
13427
+ *
13428
+ * @param value - Unknown value to validate
13429
+ * @returns true if value is a valid SemanticSpacing, with type narrowing
13430
+ *
13431
+ * @example
13432
+ * const userInput = 'medium';
13433
+ * if (isSemanticSpacing(userInput)) {
13434
+ * // TypeScript knows userInput is SemanticSpacing here
13435
+ * const classes = resolveSpacing(userInput, 'y');
13436
+ * }
13437
+ */
13438
+ function isSemanticSpacing(value) {
13439
+ return typeof value === "string" && SEMANTIC_SPACING_VALUES.includes(value);
13440
+ }
13441
+ /**
13442
+ * Type-safe mapping from semantic spacing to CSS classes for sections (y-axis).
13443
+ *
13444
+ * Sections use vertical padding only to control spacing between blocks.
13445
+ * Horizontal padding (px-6) is handled separately via baseClass.
13446
+ *
13447
+ * The `satisfies` operator ensures all SemanticSpacing values are present at compile time.
13448
+ * TypeScript will error if any spacing value is missing or if extra keys exist.
13449
+ */
13450
+ const SECTION_SPACING_MAP = {
13451
+ none: "rb-section-pad-none",
13452
+ compact: "rb-section-pad-compact",
13453
+ cozy: "rb-section-pad-cozy",
13454
+ medium: "rb-section-pad-medium",
13455
+ comfortable: "rb-section-pad-comfortable",
13456
+ spacious: "rb-section-pad-spacious"
13457
+ };
13458
+ /**
13459
+ * Type-safe mapping from semantic spacing to CSS classes for containers (all sides).
13460
+ *
13461
+ * Containers use padding on all sides for internal content spacing.
13462
+ *
13463
+ * The `satisfies` operator ensures all SemanticSpacing values are present at compile time.
13464
+ */
13465
+ const CONTAINER_SPACING_MAP = {
13466
+ none: "rb-container-pad-none",
13467
+ compact: "rb-container-pad-compact",
13468
+ cozy: "rb-container-pad-cozy",
13469
+ medium: "rb-container-pad-medium",
13470
+ comfortable: "rb-container-pad-comfortable",
13471
+ spacious: "rb-container-pad-spacious"
13472
+ };
13473
+ /**
13474
+ * Resolve semantic spacing to CSS classes based on axis.
13475
+ *
13476
+ * This function guarantees that valid SemanticSpacing values always return a result.
13477
+ * Since spacing is typed, there's no need for fallback logic.
13478
+ *
13479
+ * @param spacing - Semantic spacing value (validated at compile time)
13480
+ * @param axis - Which axis to apply padding ('y' for sections, 'all' for containers)
13481
+ * @returns CSS class token string
13482
+ *
13483
+ * @example
13484
+ * resolveSpacing('medium', 'y') // => 'rb-section-pad-medium'
13485
+ * resolveSpacing('medium', 'all') // => 'rb-container-pad-medium'
13486
+ * resolveSpacing('compact') // => 'rb-section-pad-compact' (defaults to 'y' axis)
13487
+ */
13488
+ function resolveSpacing(spacing, axis = "y") {
13489
+ return (axis === "y" ? SECTION_SPACING_MAP : CONTAINER_SPACING_MAP)[spacing];
13490
+ }
13491
+ /**
13271
13492
  * Default spacing value for sections when not explicitly configured.
13272
13493
  */
13273
13494
  const DEFAULT_SECTION_SPACING = "medium";
@@ -13692,11 +13913,194 @@ function footerNav(opts) {
13692
13913
  return buildFooterNavAll(common);
13693
13914
  }
13694
13915
  //#endregion
13916
+ //#region ../blocks/src/system/transforms/registry/core.ts
13917
+ /**
13918
+ * Safely narrows unknown values to partial object shapes used by transforms.
13919
+ * Arrays are intentionally excluded.
13920
+ */
13921
+ function asPartialObject(value) {
13922
+ if (typeof value !== "object" || value === null || Array.isArray(value)) return;
13923
+ return value;
13924
+ }
13925
+ //#endregion
13695
13926
  //#region ../blocks/src/system/fields/backgroundContent.ts
13696
13927
  function parseBackgroundContent(value) {
13697
13928
  const result = boxBackgroundSchema.safeParse(value);
13698
13929
  return result.success ? result.data : null;
13699
13930
  }
13931
+ //#endregion
13932
+ //#region ../blocks/src/system/transforms/registry/_utils/boxStyleClassNames.ts
13933
+ /**
13934
+ * @file The one place box-style content becomes CSS classes.
13935
+ *
13936
+ * `boxStyles.all` runs this for the binding pipeline, and the React nodes that
13937
+ * render a card outside that pipeline (offerings-preview) call it directly, so
13938
+ * there is a single card-class emission path rather than copies that drift.
13939
+ */
13940
+ /** The elevation class an elevated box gets when the theme defines a shadow. */
13941
+ const RAISED_SHADOW_CLASS = "rb-shadow-md";
13942
+ /** Radius values to their `rb-*` classes (defined in `rb-utilities.css`). */
13943
+ const ROUNDED_CLASSES = {
13944
+ sm: "rb-rounded-sm",
13945
+ md: "rb-rounded-md",
13946
+ lg: "rb-rounded-lg",
13947
+ xl: "rb-rounded-xl",
13948
+ "2xl": "rb-rounded-2xl",
13949
+ full: "rb-rounded-full"
13950
+ };
13951
+ function hasFixedFrameBackgroundMotion(value) {
13952
+ const background = parseBackgroundContent(asPartialObject(value)?.background);
13953
+ return (background?.type === "image" || background?.type === "video") && background.motion === "fixed-frame";
13954
+ }
13955
+ /**
13956
+ * The stable per-theme class for a card role. Generated card CSS emits these
13957
+ * aliases alongside each `.card-{id}` rule, so content addresses "this site
13958
+ * style's open card" without knowing which variant implements it.
13959
+ */
13960
+ function cardRoleClass(role) {
13961
+ return `card-role-${role}`;
13962
+ }
13963
+ /**
13964
+ * The role class for a card slot the *block* owns structurally, where a Look
13965
+ * may still name the surface.
13966
+ *
13967
+ * Some layouts have more than one card slot and decide themselves which one is
13968
+ * the statement — the featured-editorial testimonials field is a lead voice
13969
+ * beside its supporting voices, and that is structure, not composition. Those
13970
+ * slots still have to honour a Look that picks a surface, or a role-picking
13971
+ * Look would silently no-op under the layout. So the slot carries a default
13972
+ * role and the Look's compiled role wins over it when there is one.
13973
+ *
13974
+ * An explicit `none` is honoured as boxlessness and emits no class, matching
13975
+ * how the composite emitter reads it.
13976
+ */
13977
+ /**
13978
+ * The role a card renders with, and the one place a set of card styles becomes
13979
+ * a role.
13980
+ *
13981
+ * Precedence: a per-item override, then the `role` a Look or semantic field
13982
+ * compiled onto the block's card styles. Persisted inputs are normalized at
13983
+ * this boundary because raw block records do not pass through the theme schema.
13984
+ */
13985
+ function resolveCardRoleForBoxStyles(input, override) {
13986
+ return override ?? normalizeCardRole(input.role);
13987
+ }
13988
+ /**
13989
+ * The card surface for a set of box styles: one role, one class vocabulary, so
13990
+ * a site-style swap re-skins the card whichever field named it.
13991
+ */
13992
+ function cardSurface(input, override, fallback) {
13993
+ const role = resolveCardRoleForBoxStyles(input, override) ?? fallback ?? null;
13994
+ if (!role) return {
13995
+ role: null,
13996
+ classes: []
13997
+ };
13998
+ return {
13999
+ role,
14000
+ classes: role === "none" ? [] : [cardRoleClass(role)]
14001
+ };
14002
+ }
14003
+ const BOX_BORDER_WIDTHS = [
14004
+ "none",
14005
+ "1",
14006
+ "2",
14007
+ "3"
14008
+ ];
14009
+ function parseBoxBorderWidth(value) {
14010
+ return BOX_BORDER_WIDTHS.find((width) => width === value);
14011
+ }
14012
+ /**
14013
+ * A box's border record with `{ width: 'none' }`-without-`enabled` resolved.
14014
+ *
14015
+ * That shape used to mean two different things to two different readers: the
14016
+ * old private offerings emitter read it as border-off, while the shared
14017
+ * emitter read it as "no opinion" and left the caller's base `rb-border` in
14018
+ * place. Same persisted bytes, opposite answers. A width of `none` says there
14019
+ * is no border, so it is read as `enabled: false` here — once, at the one
14020
+ * place box-style content is interpreted — and every reader downstream now
14021
+ * agrees.
14022
+ *
14023
+ * Nothing persisted carries the shape (the #1297 usage audit found zero rows;
14024
+ * the authoring UI cannot produce it, since the width control is gated on
14025
+ * `enabled === true`), so this is boundary hygiene rather than a migration.
14026
+ */
14027
+ function normalizeBoxStylesBorder(value) {
14028
+ const border = asPartialObject(value);
14029
+ if (!border) return null;
14030
+ const width = parseBoxBorderWidth(border.width);
14031
+ return {
14032
+ enabled: border.enabled === true ? true : border.enabled === false || width === "none" ? false : null,
14033
+ width,
14034
+ colorToken: typeof border.colorToken === "string" && border.colorToken.trim() ? border.colorToken.trim() : void 0
14035
+ };
14036
+ }
14037
+ /** The border class a box's own border override asks for, if it has one. */
14038
+ function borderOverrideClass(input) {
14039
+ const border = normalizeBoxStylesBorder(input.border);
14040
+ if (!border) return null;
14041
+ if (border.enabled === false) return "rb-border-0";
14042
+ if (border.enabled !== true) return null;
14043
+ switch (border.width) {
14044
+ case "2": return "rb-border-2";
14045
+ case "3": return "rb-border-3";
14046
+ case "none": return "rb-border-0";
14047
+ case "1":
14048
+ case void 0: return "rb-border";
14049
+ }
14050
+ }
14051
+ /** The base class with any border utilities stripped, so an override can win. */
14052
+ function withoutBorderClasses(baseClass) {
14053
+ return baseClass.split(/\s+/).filter((token) => token && !/^rb-border(?:-(?:0|2|3))?$/.test(token)).join(" ");
14054
+ }
14055
+ /**
14056
+ * The padding class a box's spacing asks for, if it names a known value.
14057
+ *
14058
+ * An unknown value is dropped rather than guessed, and says so in development —
14059
+ * persisted content is the untrusted input here, and a silently missing padding
14060
+ * is much harder to trace back than a warning.
14061
+ */
14062
+ function boxSpacingClass(input, axis) {
14063
+ const spacing = typeof input.spacing === "string" ? input.spacing.trim() : "";
14064
+ if (!spacing) return null;
14065
+ if (!isSemanticSpacing(spacing)) {
14066
+ if (process.env.NODE_ENV !== "production") console.warn(`[boxStyles] Invalid spacing value: "${spacing}". Expected one of: ${SEMANTIC_SPACING_VALUES.join(", ")}.`);
14067
+ return null;
14068
+ }
14069
+ return resolveSpacing(spacing, axis);
14070
+ }
14071
+ /** The radius class a box's corners ask for, if it names a known value. */
14072
+ function boxRoundedClass(input) {
14073
+ const rounded = typeof input.rounded === "string" ? input.rounded.trim() : "";
14074
+ if (!rounded || rounded === "none") return null;
14075
+ return ROUNDED_CLASSES[rounded] ?? null;
14076
+ }
14077
+ /** The elevation class to use, honouring an explicit `null` opt-out. */
14078
+ function raisedClassFor(options) {
14079
+ return options.raisedClass === void 0 ? RAISED_SHADOW_CLASS : options.raisedClass;
14080
+ }
14081
+ /**
14082
+ * The class list for a set of box styles: the caller's base class, the border /
14083
+ * spacing / elevation / radius overrides the box carries, and its card surface.
14084
+ *
14085
+ * Pure, so the React nodes that render a card outside the binding pipeline
14086
+ * (offerings-preview) share this one emission path with `boxStyles.all` instead
14087
+ * of keeping a copy that drifts.
14088
+ */
14089
+ function boxStyleClassNames(value, options) {
14090
+ const input = value && typeof value === "object" ? value : {};
14091
+ const borderOverride = borderOverrideClass(input);
14092
+ const surface = cardSurface(input, options.cardRoleOverride, options.cardRoleFallback);
14093
+ const cardOwnsBorder = surface.role !== null && surface.role !== "none";
14094
+ return [
14095
+ borderOverride || cardOwnsBorder ? withoutBorderClasses(options.baseClass ?? "") : options.baseClass ?? "",
14096
+ borderOverride,
14097
+ options.includeSpacing === false ? null : boxSpacingClass(input, options.axis ?? "all"),
14098
+ input.raised === true ? raisedClassFor(options) : null,
14099
+ boxRoundedClass(input),
14100
+ ...surface.classes,
14101
+ hasFixedFrameBackgroundMotion(input) ? "rb-bg-motion-fixed-frame-scope" : null
14102
+ ].filter((token) => Boolean(token)).join(" ").trim() || "";
14103
+ }
13700
14104
  new Set(tileTreatmentValues);
13701
14105
  new Set(eventListTreatmentValues);
13702
14106
  /**
@@ -13795,10 +14199,16 @@ function styledCard(children, opts, ...mods) {
13795
14199
  const style = {
13796
14200
  ...opts.style ?? {},
13797
14201
  borderColor: { $bind: {
13798
- from: opts.stylesFrom,
14202
+ from: opts.itemRole?.from ?? opts.stylesFrom,
13799
14203
  transforms: [{
13800
14204
  id: "boxStyles.borderColor",
13801
- options: { returnEmptyForDefault: true }
14205
+ options: {
14206
+ returnEmptyForDefault: true,
14207
+ ...opts.itemRole ? {
14208
+ stylesPath: opts.stylesFrom,
14209
+ ...opts.itemRole.aliases ? { itemRoleAliases: opts.itemRole.aliases } : {}
14210
+ } : {}
14211
+ }
13802
14212
  }]
13803
14213
  } }
13804
14214
  };
@@ -14917,18 +15327,73 @@ function buildGridCardsLayout(className) {
14917
15327
  return el("div", { className }, buildResponsiveGridCards());
14918
15328
  }
14919
15329
  /**
15330
+ * The card slots the featured-editorial layout has, and the role each one
15331
+ * defaults to.
15332
+ *
15333
+ * Which slot is the statement is *structure*, so the layout decides it: this
15334
+ * variant exists to put one lead voice beside its supporting voices. But a Look
15335
+ * that picks a surface has to keep meaning something here, so the lead slot's
15336
+ * role is a default the Look's compiled `cardRole` wins over — see
15337
+ * `cardSlotRoleClass`. Supporting voices stay the quiet everyday card.
15338
+ */
15339
+ const FEATURED_EDITORIAL_SLOTS = {
15340
+ lead: {
15341
+ /** Composition CSS addresses the lead card's geometry through this. */
15342
+ variantClass: "rb-testimonials-fe-card--feature",
15343
+ slotDefault: "alternative",
15344
+ followsLook: true
15345
+ },
15346
+ support: {
15347
+ variantClass: null,
15348
+ slotDefault: "default",
15349
+ followsLook: false
15350
+ }
15351
+ };
15352
+ /** Where the testimonials block's compiled card styles live. */
15353
+ const TESTIMONIALS_CARD_STYLES_PATH = "content._cardStyles";
15354
+ /**
15355
+ * The class list for one featured-editorial card slot.
15356
+ *
15357
+ * A slot that follows the Look has to resolve at render time, so it binds
15358
+ * through the shared card-class emitter rather than naming a role class here;
15359
+ * a slot that does not is a plain string built by the same composite emitter.
15360
+ */
15361
+ function featuredEditorialCardClassName(slot) {
15362
+ const { variantClass, slotDefault, followsLook } = FEATURED_EDITORIAL_SLOTS[slot];
15363
+ const baseClass = ["rb-testimonials-fe-card", variantClass].filter(Boolean).join(" ");
15364
+ if (!followsLook) return boxStyleClassNames({}, {
15365
+ baseClass,
15366
+ cardRoleFallback: slotDefault,
15367
+ includeSpacing: false
15368
+ });
15369
+ return { $bind: {
15370
+ from: TESTIMONIALS_CARD_STYLES_PATH,
15371
+ transforms: [{
15372
+ id: "boxStyles.cardSlotRole",
15373
+ options: {
15374
+ baseClass,
15375
+ slotDefault
15376
+ }
15377
+ }],
15378
+ fallback: boxStyleClassNames({}, {
15379
+ baseClass,
15380
+ cardRoleFallback: slotDefault,
15381
+ includeSpacing: false
15382
+ })
15383
+ } };
15384
+ }
15385
+ /**
14920
15386
  * Build a single "featured editorial" testimonial card.
14921
15387
  *
14922
- * This card type deliberately renders NO avatar/headshot: an amber quote mark,
14923
- * the quote body, then the author name and a context line. Colour + surface
14924
- * treatment is driven entirely by `variantClass` (see testimonials.css):
14925
- * - `rb-testimonials-fe-card--feature` → spruce-ink card (dark primary bg)
14926
- * - `rb-testimonials-fe-card--plain` → white surface card
15388
+ * This card type deliberately renders NO avatar/headshot: a quote mark, the
15389
+ * quote body, then the author name and a context line. The card surface comes
15390
+ * from the slot's card role — the site style owns the fill, border, corners and
15391
+ * padding.
14927
15392
  *
14928
15393
  * Extra modifiers (`repeat`, `when`) are forwarded to the card node so the
14929
15394
  * caller can drive first-vs-rest branching.
14930
15395
  */
14931
- function buildFeaturedEditorialCard(variantClass, ...mods) {
15396
+ function buildFeaturedEditorialCard(slot, ...mods) {
14932
15397
  const quoteMark = text({
14933
15398
  as: "span",
14934
15399
  className: "rb-testimonials-fe-qmark",
@@ -14942,11 +15407,11 @@ function buildFeaturedEditorialCard(variantClass, ...mods) {
14942
15407
  as: "span",
14943
15408
  className: "rb-testimonials-fe-context"
14944
15409
  }, when("testimonial.content.jobTitle"), bind("testimonial.content.jobTitle"))]);
14945
- return el("div", { className: `rb-testimonials-fe-card ${variantClass}` }, [
15410
+ return el("div", { className: featuredEditorialCardClassName(slot) }, [el("div", { className: "card-content rb-testimonials-fe-card-body" }, [
14946
15411
  quoteMark,
14947
15412
  quote,
14948
15413
  meta
14949
- ], ...mods);
15414
+ ])], ...mods);
14950
15415
  }
14951
15416
  /**
14952
15417
  * Build the "featured editorial" layout: an asymmetric two-column arrangement
@@ -14960,7 +15425,7 @@ function buildFeaturedEditorialCard(variantClass, ...mods) {
14960
15425
  * index scope in context, so entry 0 produces no node in the rest column.
14961
15426
  */
14962
15427
  function buildFeaturedEditorialLayout() {
14963
- return el("div", { className: "rb-testimonials-fe-grid" }, [buildFeaturedEditorialCard("rb-testimonials-fe-card--feature", repeat("data.entries", "testimonial", { limit: 1 })), el("div", { className: "rb-testimonials-fe-col" }, [buildFeaturedEditorialCard("rb-testimonials-fe-card--plain", repeat("data.entries", "testimonial", { indexName: "tIndex" }), when("tIndex", {
15428
+ return el("div", { className: "rb-testimonials-fe-grid" }, [buildFeaturedEditorialCard("lead", repeat("data.entries", "testimonial", { limit: 1 })), el("div", { className: "rb-testimonials-fe-col" }, [buildFeaturedEditorialCard("support", repeat("data.entries", "testimonial", { indexName: "tIndex" }), when("tIndex", {
14964
15429
  equals: 0,
14965
15430
  not: true
14966
15431
  }))])]);
@@ -15687,7 +16152,7 @@ const newsletterFormFragment = defineFragment({
15687
16152
  });
15688
16153
  //#endregion
15689
16154
  //#region ../blocks/src/system/fragments/library/card.ts
15690
- const cardVariantOptions$1 = cardVariantRoleValues.map((value) => ({
16155
+ const cardVariantOptions = cardVariantRoleValues.map((value) => ({
15691
16156
  value,
15692
16157
  label: value === "default" ? "Default" : "Alternative"
15693
16158
  }));
@@ -15785,7 +16250,7 @@ const cardFragment = defineFragment({
15785
16250
  description: "Choose a card style from your theme",
15786
16251
  required: false,
15787
16252
  defaultValue: "default",
15788
- options: cardVariantOptions$1,
16253
+ options: cardVariantOptions,
15789
16254
  ui: { intent: "style" }
15790
16255
  }
15791
16256
  ],
@@ -15794,7 +16259,10 @@ const cardFragment = defineFragment({
15794
16259
  className: { $bind: {
15795
16260
  from: "variant",
15796
16261
  fallback: "default",
15797
- transforms: [{ id: "boxStyles.cardVariantClass" }]
16262
+ transforms: [{
16263
+ id: "boxStyles.cardRoleClass",
16264
+ options: { baseClass: "" }
16265
+ }]
15798
16266
  } }
15799
16267
  }, [media({
15800
16268
  className: "card-media rb-w-full rb-h-auto rb-object-cover",
@@ -20604,19 +21072,13 @@ const blockBookingPaymentCollectionOptionSchema = z.union([
20604
21072
  ]);
20605
21073
  const blockBookingPaymentTermsSchema = z.object({ allowedOptions: z.array(blockBookingPaymentCollectionOptionSchema).min(1) });
20606
21074
  //#endregion
20607
- //#region ../blocks/src/system/blocks/courses/shared/schemas.ts
20608
- /**
20609
- * Zod schema for course venue data
20610
- */
20611
- const courseVenueSchema = z.object({
21075
+ //#region ../blocks/src/system/blocks/events/whole-series/schemas.ts
21076
+ const wholeSeriesVenueSchema = z.object({
20612
21077
  id: z.string(),
20613
21078
  name: z.string(),
20614
21079
  address: z.string().nullable()
20615
21080
  });
20616
- /**
20617
- * Zod schema for course session (occurrence) data
20618
- */
20619
- const courseSessionSchema = z.object({
21081
+ const wholeSeriesSessionSchema = z.object({
20620
21082
  id: z.string(),
20621
21083
  startsAt: z.string(),
20622
21084
  endsAt: z.string(),
@@ -20624,14 +21086,14 @@ const courseSessionSchema = z.object({
20624
21086
  capacityOverride: z.number().nullable().optional(),
20625
21087
  overrides: z.record(z.string(), z.unknown()).nullable().optional()
20626
21088
  });
20627
- const courseTeamMemberSummarySchema = z.object({
21089
+ const wholeSeriesTeamMemberSummarySchema = z.object({
20628
21090
  id: z.string(),
20629
21091
  name: z.string(),
20630
21092
  roleLabel: z.string().nullable(),
20631
21093
  summary: z.string().nullable(),
20632
21094
  profilePath: z.string().nullable()
20633
21095
  });
20634
- const coursePricingOptionSchema = z.object({
21096
+ const wholeSeriesPricingOptionSchema = z.object({
20635
21097
  id: z.string(),
20636
21098
  name: z.string(),
20637
21099
  description: z.string().nullable(),
@@ -20647,7 +21109,7 @@ const coursePricingOptionSchema = z.object({
20647
21109
  "both"
20648
21110
  ]).nullable().optional()
20649
21111
  });
20650
- const coursePricingSchema = z.object({
21112
+ const wholeSeriesPricingSchema = z.object({
20651
21113
  bookingRequirement: z.enum(["none", "required"]),
20652
21114
  pricingStrategy: z.enum([
20653
21115
  "free",
@@ -20661,20 +21123,17 @@ const coursePricingSchema = z.object({
20661
21123
  slidingMaxAmount: z.number().nullable().optional(),
20662
21124
  slidingSuggestedAmount: z.number().nullable().optional(),
20663
21125
  paymentTerms: blockBookingPaymentTermsSchema,
20664
- options: z.array(coursePricingOptionSchema)
21126
+ options: z.array(wholeSeriesPricingOptionSchema)
20665
21127
  });
20666
- /**
20667
- * Zod schema for public course data
20668
- */
20669
21128
  const publicWholeSeriesOfferingSchema = z.object({
20670
21129
  eventSeriesId: z.string(),
20671
21130
  eventOfferingId: z.string(),
20672
21131
  title: z.string(),
20673
21132
  slug: z.string(),
20674
21133
  description: z.unknown().nullable(),
20675
- teamMembers: z.array(courseTeamMemberSummarySchema).optional(),
21134
+ teamMembers: z.array(wholeSeriesTeamMemberSummarySchema).optional(),
20676
21135
  enrollmentOpen: z.boolean(),
20677
- pricing: coursePricingSchema,
21136
+ pricing: wholeSeriesPricingSchema,
20678
21137
  currency: z.string(),
20679
21138
  paymentTerms: blockBookingPaymentTermsSchema,
20680
21139
  enrollmentCapacity: z.number().nullable(),
@@ -20687,12 +21146,10 @@ const publicWholeSeriesOfferingSchema = z.object({
20687
21146
  sessionsCount: z.number(),
20688
21147
  enrolledCount: z.number(),
20689
21148
  availableSpots: z.number().nullable(),
20690
- sessions: z.array(courseSessionSchema),
20691
- venue: courseVenueSchema.nullable()
21149
+ sessions: z.array(wholeSeriesSessionSchema),
21150
+ venue: wholeSeriesVenueSchema.nullable()
20692
21151
  });
20693
- /** Deployed course blocks retain this schema alias for stored content. */
20694
- const publicCourseSchema = publicWholeSeriesOfferingSchema;
20695
- const publicCoursesArraySchema = z.array(publicWholeSeriesOfferingSchema);
21152
+ const publicWholeSeriesOfferingsArraySchema = z.array(publicWholeSeriesOfferingSchema);
20696
21153
  //#endregion
20697
21154
  //#region ../blocks/src/system/blocks/events/shared/schemas.ts
20698
21155
  const eventPresetSchema = z.enum([
@@ -21003,7 +21460,7 @@ const publicEventSchema = z.object({
21003
21460
  acceptsMemberships: z.boolean().optional(),
21004
21461
  wholeSeries: z.object({
21005
21462
  eventSeriesId: z.string(),
21006
- pricing: coursePricingSchema,
21463
+ pricing: wholeSeriesPricingSchema,
21007
21464
  currency: z.string(),
21008
21465
  enrollmentOpen: z.boolean()
21009
21466
  }).nullable().optional()
@@ -21012,24 +21469,19 @@ const publicEventSchema = z.object({
21012
21469
  * Schema for an array of public events
21013
21470
  */
21014
21471
  const publicEventsArraySchema = z.array(publicEventSchema);
21472
+ //#endregion
21473
+ //#region ../blocks/src/system/blocks/events/shared/fields.ts
21015
21474
  /**
21016
21475
  * Shared card styling fields for event blocks
21017
21476
  */
21018
21477
  const cardStylingFields = [
21019
- {
21020
- id: "cardVariant",
21021
- type: "select",
21478
+ cardStylesField({
21479
+ id: "_cardStyles",
21022
21480
  label: "Card style",
21023
- description: "Choose a card style from your theme",
21024
- required: false,
21025
- multiple: false,
21026
- defaultValue: "default",
21027
- options: cardVariantRoleValues.map((value) => ({
21028
- value,
21029
- label: value === "default" ? "Default" : "Alternative"
21030
- })),
21031
- ui: { intent: "style" }
21032
- },
21481
+ controls: "role-only",
21482
+ renderInHeader: false,
21483
+ intent: "style"
21484
+ }),
21033
21485
  createButtonVariantField({ description: "Choose a button style from your theme" }),
21034
21486
  {
21035
21487
  id: "buttonText",
@@ -21168,14 +21620,7 @@ function normalizeIdList(parts) {
21168
21620
  }
21169
21621
  //#endregion
21170
21622
  //#region ../blocks/src/system/blocks/events/shared/filtering.ts
21171
- const eventSurfacePresetValues = [
21172
- "course",
21173
- "term",
21174
- "class",
21175
- "workshop",
21176
- "retreat",
21177
- "performance"
21178
- ];
21623
+ const eventSurfacePresetValues = SURFACE_EVENT_PRESET_VALUES;
21179
21624
  const eventSurfaceScopeValues = [
21180
21625
  "all",
21181
21626
  "regularClassSchedule",
@@ -21676,8 +22121,8 @@ const eventRegistrationHydrationSchemaShape = {
21676
22121
  occurrenceContext: occurrenceContextSchema.optional(),
21677
22122
  subject: eventRegistrationPageSurfaceSubjectSchema.nullable().optional(),
21678
22123
  events: z.array(eventRegistrationPublicEventSchema).nullable().optional(),
21679
- wholeSeriesOfferings: publicCoursesArraySchema.nullable().optional(),
21680
- wholeSeriesOffering: publicCourseSchema.nullable().optional(),
22124
+ wholeSeriesOfferings: publicWholeSeriesOfferingsArraySchema.nullable().optional(),
22125
+ wholeSeriesOffering: publicWholeSeriesOfferingSchema.nullable().optional(),
21681
22126
  maxTickets: z.string().optional(),
21682
22127
  showVenue: z.boolean().optional(),
21683
22128
  showCapacity: z.boolean().optional(),
@@ -21699,12 +22144,13 @@ const eventRegistrationSourceSchema = z.object({
21699
22144
  portalToken: z.string().nullable().optional(),
21700
22145
  previewToken: z.string().nullable().optional(),
21701
22146
  ...eventRegistrationHydrationSchemaShape,
22147
+ subjectWholeSeriesOffering: publicWholeSeriesOfferingSchema.nullable().optional(),
21702
22148
  className: z.string().nullable().optional(),
21703
22149
  buttonText: z.string().nullable().optional(),
21704
22150
  maxTickets: z.string().nullable().optional(),
21705
22151
  stage: previewStageSchema.optional()
21706
22152
  });
21707
- const eventRegistrationDisplaySchema = z.object({
22153
+ const eventRegistrationDisplaySchema = z.discriminatedUnion("state", [z.object({
21708
22154
  kind: z.literal("event-registration"),
21709
22155
  state: z.literal("generic-shell"),
21710
22156
  className: z.string().nullable(),
@@ -21712,7 +22158,13 @@ const eventRegistrationDisplaySchema = z.object({
21712
22158
  bodyText: z.string(),
21713
22159
  stepLabels: z.array(z.enum(EVENT_REGISTRATION_SHELL_STEP_LABELS)).min(1),
21714
22160
  summaryButtonText: z.string()
21715
- });
22161
+ }), z.object({
22162
+ kind: z.literal("event-registration"),
22163
+ state: z.literal("registration-closed"),
22164
+ className: z.string().nullable(),
22165
+ titleText: z.string(),
22166
+ bodyText: z.string()
22167
+ })]);
21716
22168
  const eventRegistrationHydrationSchema = z.object(eventRegistrationHydrationSchemaShape);
21717
22169
  const eventRegistrationRenderSchema = z.object({
21718
22170
  display: eventRegistrationDisplaySchema,
@@ -21726,6 +22178,13 @@ z.object({
21726
22178
  stage: previewStageSchema.optional()
21727
22179
  });
21728
22180
  function buildEventRegistrationDisplay(source) {
22181
+ if (resolveWholeSeriesOffering(source)?.enrollmentOpen === false) return {
22182
+ kind: "event-registration",
22183
+ state: "registration-closed",
22184
+ className: source.className ?? null,
22185
+ titleText: "Registration closed",
22186
+ bodyText: "This run is no longer open for bookings."
22187
+ };
21729
22188
  const stepLabels = buildEventRegistrationShellStepLabels(source);
21730
22189
  return {
21731
22190
  kind: "event-registration",
@@ -21737,6 +22196,9 @@ function buildEventRegistrationDisplay(source) {
21737
22196
  summaryButtonText: source.buttonText?.trim() || "Register"
21738
22197
  };
21739
22198
  }
22199
+ function resolveWholeSeriesOffering(source) {
22200
+ return source.wholeSeriesOffering ?? source.subjectWholeSeriesOffering ?? null;
22201
+ }
21740
22202
  function buildEventRegistrationShellStepLabels(source) {
21741
22203
  const scopedEvents = scopeEventRegistrationEvents(source);
21742
22204
  if (scopedEvents.length === 0) return EVENT_REGISTRATION_GENERIC_SHELL_STEP_LABELS;
@@ -21794,7 +22256,7 @@ const eventRegistrationBlockRuntime = defineClientOwnedBlockRuntime({
21794
22256
  subject: source.subject ?? null,
21795
22257
  events: source.events ?? null,
21796
22258
  wholeSeriesOfferings: source.wholeSeriesOfferings ?? null,
21797
- wholeSeriesOffering: source.wholeSeriesOffering ?? null,
22259
+ wholeSeriesOffering: resolveWholeSeriesOffering(source),
21798
22260
  maxTickets: source.maxTickets ?? void 0,
21799
22261
  showVenue: source.showVenue,
21800
22262
  showCapacity: source.showCapacity,
@@ -22015,7 +22477,9 @@ const eventRegistrationBlockDefinition = {
22015
22477
  fallback: false
22016
22478
  } },
22017
22479
  events: { $bind: { from: "data.events" } },
22018
- wholeSeriesOffering: { $bind: { from: "data.wholeSeriesOffering.offering" } },
22480
+ wholeSeriesOffering: { $bind: { from: "data.selectedRunOffering.offering" } },
22481
+ subjectWholeSeriesOffering: { $bind: { from: "data.subjectWholeSeriesOffering.offering" } },
22482
+ wholeSeriesOfferings: { $bind: { from: "data.wholeSeriesOfferings" } },
22019
22483
  sitePasses: { $bind: { from: "data.sitePasses" } },
22020
22484
  siteMemberships: { $bind: { from: "data.siteMemberships" } },
22021
22485
  stage: { $bind: {
@@ -22029,7 +22493,9 @@ const eventRegistrationBlockDefinition = {
22029
22493
  runtime: eventRegistrationBlockRuntime,
22030
22494
  dataSchemas: {
22031
22495
  events: publicEventsArraySchema.optional(),
22032
- wholeSeriesOffering: z.object({ offering: publicCourseSchema }).optional(),
22496
+ selectedRunOffering: z.object({ offering: publicWholeSeriesOfferingSchema }).optional(),
22497
+ subjectWholeSeriesOffering: z.object({ offering: publicWholeSeriesOfferingSchema }).optional(),
22498
+ wholeSeriesOfferings: z.array(publicWholeSeriesOfferingSchema).optional(),
22033
22499
  sitePasses: publicPassProductCollectionSchema.optional(),
22034
22500
  siteMemberships: publicMembershipProductCollectionSchema.optional(),
22035
22501
  occurrenceContext: occurrenceContextSchema.optional()
@@ -22046,11 +22512,29 @@ const eventRegistrationBlockDefinition = {
22046
22512
  } },
22047
22513
  readProfile: "registration",
22048
22514
  seriesId: { $bind: { from: "$root.subject.eventSeriesId" } },
22515
+ seriesIds: { $bind: {
22516
+ from: "$root.subject.availableEventSeriesIds",
22517
+ transforms: [{ id: "value.csv" }]
22518
+ } },
22519
+ runSeriesId: { $bind: { from: "$root.entrySubrouteContext.run.seriesId" } },
22049
22520
  includeOccurrenceId: { $bind: { from: "$root.occurrenceContext.id" } }
22050
22521
  },
22051
22522
  mode: "server"
22052
22523
  },
22053
- wholeSeriesOffering: {
22524
+ selectedRunOffering: {
22525
+ endpoint: "getPublicWholeSeriesOffering",
22526
+ params: {
22527
+ siteId: { $bind: { from: "$root.siteId" } },
22528
+ eventSeriesId: { $bind: { from: "$root.entrySubrouteContext.run.seriesId" } },
22529
+ stage: { $bind: {
22530
+ from: "$root.previewStage",
22531
+ fallback: "published"
22532
+ } }
22533
+ },
22534
+ requiredParams: ["eventSeriesId"],
22535
+ mode: "server"
22536
+ },
22537
+ subjectWholeSeriesOffering: {
22054
22538
  endpoint: "getPublicWholeSeriesOffering",
22055
22539
  when: { $bind: {
22056
22540
  from: "$root.subject.isWholeSeriesBooking",
@@ -22067,6 +22551,22 @@ const eventRegistrationBlockDefinition = {
22067
22551
  requiredParams: ["eventSeriesId"],
22068
22552
  mode: "server"
22069
22553
  },
22554
+ wholeSeriesOfferings: {
22555
+ endpoint: "listPublicWholeSeriesOfferings",
22556
+ params: {
22557
+ siteId: { $bind: { from: "$root.siteId" } },
22558
+ eventSeriesIds: { $bind: {
22559
+ from: "$root.subject.availableEventSeriesIds",
22560
+ transforms: [{ id: "value.csv" }]
22561
+ } },
22562
+ stage: { $bind: {
22563
+ from: "$root.previewStage",
22564
+ fallback: "published"
22565
+ } }
22566
+ },
22567
+ requiredParams: ["eventSeriesIds"],
22568
+ mode: "server"
22569
+ },
22070
22570
  sitePasses: {
22071
22571
  endpoint: "listPublicPasses",
22072
22572
  params: { siteId: { $bind: { from: "$root.siteId" } } },
@@ -22081,13 +22581,9 @@ const eventRegistrationBlockDefinition = {
22081
22581
  };
22082
22582
  //#endregion
22083
22583
  //#region ../blocks/src/system/runtime/nodes/course-registration.interactive.ts
22084
- const courseRegistrationSourceSchema = z.object({
22085
- siteId: z.string().optional(),
22086
- apiBaseUrl: z.string().optional(),
22087
- portalToken: z.string().nullable().optional(),
22584
+ const courseRegistrationHydrationSchemaShape = {
22088
22585
  subject: eventRegistrationPageSurfaceSubjectSchema.nullable().optional(),
22089
- courses: z.array(publicCourseSchema).nullable().optional(),
22090
- className: z.string().nullable().optional(),
22586
+ courses: z.array(publicWholeSeriesOfferingSchema).nullable().optional(),
22091
22587
  showSessions: z.boolean().optional(),
22092
22588
  showPrice: z.boolean().optional(),
22093
22589
  showCapacity: z.boolean().optional(),
@@ -22095,8 +22591,15 @@ const courseRegistrationSourceSchema = z.object({
22095
22591
  successMessage: z.string().optional(),
22096
22592
  waitlistMessage: z.string().optional(),
22097
22593
  membershipMessage: z.string().optional(),
22594
+ buttonVariant: registrationButtonVariantSchema.optional()
22595
+ };
22596
+ const courseRegistrationSourceSchema = z.object({
22597
+ siteId: z.string().optional(),
22598
+ apiBaseUrl: z.string().optional(),
22599
+ portalToken: z.string().nullable().optional(),
22600
+ ...courseRegistrationHydrationSchemaShape,
22601
+ className: z.string().nullable().optional(),
22098
22602
  buttonText: z.string().nullable().optional(),
22099
- buttonVariant: registrationButtonVariantSchema.optional(),
22100
22603
  stage: previewStageSchema.optional()
22101
22604
  });
22102
22605
  const courseRegistrationDisplaySchema = z.object({
@@ -22105,18 +22608,7 @@ const courseRegistrationDisplaySchema = z.object({
22105
22608
  className: z.string().nullable(),
22106
22609
  summaryButtonText: z.string()
22107
22610
  });
22108
- const courseRegistrationHydrationSchema = z.object({
22109
- subject: eventRegistrationPageSurfaceSubjectSchema.nullable().optional(),
22110
- courses: z.array(publicCourseSchema).nullable().optional(),
22111
- showSessions: z.boolean().optional(),
22112
- showPrice: z.boolean().optional(),
22113
- showCapacity: z.boolean().optional(),
22114
- showVenue: z.boolean().optional(),
22115
- successMessage: z.string().optional(),
22116
- waitlistMessage: z.string().optional(),
22117
- membershipMessage: z.string().optional(),
22118
- buttonVariant: registrationButtonVariantSchema.optional()
22119
- });
22611
+ const courseRegistrationHydrationSchema = z.object(courseRegistrationHydrationSchemaShape);
22120
22612
  const courseRegistrationRenderSchema = z.object({
22121
22613
  display: courseRegistrationDisplaySchema,
22122
22614
  hydration: courseRegistrationHydrationSchema
@@ -22321,7 +22813,7 @@ const courseRegistrationBlockDefinition = {
22321
22813
  })]
22322
22814
  }),
22323
22815
  runtime: courseRegistrationBlockRuntime,
22324
- dataSchemas: { courses: publicCoursesArraySchema.optional() },
22816
+ dataSchemas: { courses: publicWholeSeriesOfferingsArraySchema.optional() },
22325
22817
  dataLoaders: { courses: {
22326
22818
  endpoint: "listPublicWholeSeriesOfferings",
22327
22819
  params: {
@@ -22392,6 +22884,22 @@ const eventDetailsManifest = createBlockManifest({
22392
22884
  defaultValue: true,
22393
22885
  ui: { intent: "display" }
22394
22886
  },
22887
+ {
22888
+ id: "showTitle",
22889
+ type: "boolean",
22890
+ label: "Show event title",
22891
+ required: false,
22892
+ defaultValue: false,
22893
+ ui: { intent: "display" }
22894
+ },
22895
+ {
22896
+ id: "showDescription",
22897
+ type: "boolean",
22898
+ label: "Show event description",
22899
+ required: false,
22900
+ defaultValue: false,
22901
+ ui: { intent: "display" }
22902
+ },
22395
22903
  {
22396
22904
  id: "showMap",
22397
22905
  type: "boolean",
@@ -22428,10 +22936,22 @@ const eventDetailsManifest = createBlockManifest({
22428
22936
  {
22429
22937
  value: "10",
22430
22938
  label: "10 dates"
22939
+ },
22940
+ {
22941
+ value: "all",
22942
+ label: "All dates"
22431
22943
  }
22432
22944
  ],
22433
22945
  ui: { intent: "display" }
22434
22946
  },
22947
+ {
22948
+ id: "showCapacity",
22949
+ type: "boolean",
22950
+ label: "Show capacity",
22951
+ required: false,
22952
+ defaultValue: false,
22953
+ ui: { intent: "display" }
22954
+ },
22435
22955
  {
22436
22956
  id: "showCost",
22437
22957
  type: "boolean",
@@ -22474,6 +22994,8 @@ const eventDetailsManifest = createBlockManifest({
22474
22994
  } },
22475
22995
  events: { $bind: { from: "data.eventDetailsData.events" } },
22476
22996
  showVenue: { $bind: { from: "content.showVenue" } },
22997
+ showTitle: { $bind: { from: "content.showTitle" } },
22998
+ showDescription: { $bind: { from: "content.showDescription" } },
22477
22999
  showMap: { $bind: { from: "content.showMap" } },
22478
23000
  showOtherDates: { $bind: { from: "content.showOtherDates" } },
22479
23001
  otherDatesLimit: { $bind: {
@@ -22484,6 +23006,10 @@ const eventDetailsManifest = createBlockManifest({
22484
23006
  from: "content.showCost",
22485
23007
  fallback: true
22486
23008
  } },
23009
+ showCapacity: { $bind: {
23010
+ from: "content.showCapacity",
23011
+ fallback: false
23012
+ } },
22487
23013
  showAcceptedPasses: { $bind: {
22488
23014
  from: "content.showAcceptedPasses",
22489
23015
  fallback: true
@@ -22538,6 +23064,11 @@ const eventDetailsBlockDefinition = {
22538
23064
  limit: "100",
22539
23065
  readProfile: "details",
22540
23066
  seriesId: { $bind: { from: "$root.subject.eventSeriesId" } },
23067
+ seriesIds: { $bind: {
23068
+ from: "$root.subject.availableEventSeriesIds",
23069
+ transforms: [{ id: "value.csv" }]
23070
+ } },
23071
+ runSeriesId: { $bind: { from: "$root.entrySubrouteContext.run.seriesId" } },
22541
23072
  includeOccurrenceId: { $bind: { from: "$root.occurrenceContext.id" } }
22542
23073
  },
22543
23074
  mode: "server"
@@ -22723,7 +23254,7 @@ const courseDetailsBlockDefinition = {
22723
23254
  })], { gap: "lg" })
22724
23255
  })]
22725
23256
  }),
22726
- dataSchemas: { courses: publicCoursesArraySchema.optional() },
23257
+ dataSchemas: { courses: publicWholeSeriesOfferingsArraySchema.optional() },
22727
23258
  dataLoaders: { courses: {
22728
23259
  endpoint: "listPublicWholeSeriesOfferings",
22729
23260
  params: {
@@ -22842,8 +23373,8 @@ const eventSpotlightBlockDefinition = {
22842
23373
  from: "content.columns",
22843
23374
  fallback: "3"
22844
23375
  } },
22845
- cardVariant: { $bind: {
22846
- from: "content.cardVariant",
23376
+ cardRole: { $bind: {
23377
+ from: "content._cardStyles.role",
22847
23378
  fallback: "default"
22848
23379
  } },
22849
23380
  buttonVariant: { $bind: {
@@ -23005,6 +23536,7 @@ const eventCollectionSourceSchemaShape = {
23005
23536
  showVenue: z.boolean().nullable().optional(),
23006
23537
  showMap: z.boolean().nullable().optional(),
23007
23538
  showCapacity: z.boolean().nullable().optional(),
23539
+ cardRole: cardRoleSchema.optional(),
23008
23540
  buttonVariant: eventButtonVariantSchema.optional(),
23009
23541
  buttonText: z.string().optional(),
23010
23542
  emptyMessage: z.string().optional(),
@@ -23032,6 +23564,7 @@ const eventCollectionDisplaySchemaShape = {
23032
23564
  showVenue: z.boolean(),
23033
23565
  showMap: z.boolean(),
23034
23566
  showCapacity: z.boolean(),
23567
+ cardRole: cardRoleSchema,
23035
23568
  buttonVariant: eventButtonVariantSchema,
23036
23569
  buttonText: z.string(),
23037
23570
  emptyMessage: z.string()
@@ -23081,6 +23614,7 @@ function buildEventCollectionPresentationDisplay(source) {
23081
23614
  showVenue: source.showVenue ?? true,
23082
23615
  showMap: source.showMap ?? true,
23083
23616
  showCapacity: source.showCapacity ?? true,
23617
+ cardRole: source.cardRole ?? "default",
23084
23618
  buttonVariant: source.buttonVariant ?? "primary",
23085
23619
  buttonText: source.buttonText ?? "Book",
23086
23620
  emptyMessage: source.emptyMessage ?? "No upcoming events scheduled."
@@ -23098,8 +23632,6 @@ function buildEventCollectionHydration(source) {
23098
23632
  }
23099
23633
  //#endregion
23100
23634
  //#region ../blocks/src/system/runtime/nodes/events/EventListing.interactive.ts
23101
- const legacyEventCardVariantSchema = z.enum(["variant1", "variant2"]);
23102
- const eventCardVariantInputSchema = z.union([cardVariantRoleSchema, legacyEventCardVariantSchema]);
23103
23635
  const cardOrientationSchema = z.enum(["vertical", "horizontal"]);
23104
23636
  const eventSurfaceScopeSchema = z.enum(eventSurfaceScopeValues);
23105
23637
  const eventScheduleScopeSchema = z.enum(eventScheduleScopeValues);
@@ -23114,7 +23646,7 @@ const eventListingSourceSchema = z.object({
23114
23646
  paginationMode: z.enum(["loadMore", "seeAllLink"]).optional(),
23115
23647
  seeAllUrl: z.string().optional(),
23116
23648
  loadMoreText: z.string().optional(),
23117
- cardVariant: eventCardVariantInputSchema.optional(),
23649
+ cardRole: cardRoleSchema.optional(),
23118
23650
  buttonVariant: eventButtonVariantSchema.optional(),
23119
23651
  buttonText: z.string().optional(),
23120
23652
  showVenue: z.boolean().optional(),
@@ -23136,7 +23668,7 @@ const eventListingDisplaySchema = z.object({
23136
23668
  emptyMessage: z.string(),
23137
23669
  loadingMessage: z.string(),
23138
23670
  containerClass: z.string(),
23139
- cardVariant: cardVariantRoleSchema,
23671
+ cardRole: cardRoleSchema,
23140
23672
  buttonVariant: eventButtonVariantSchema,
23141
23673
  buttonText: z.string(),
23142
23674
  showVenue: z.boolean(),
@@ -23192,7 +23724,7 @@ const eventListingBlockRuntime = defineProgressiveBlockRuntime({
23192
23724
  emptyMessage: source.emptyMessage ?? "No upcoming events scheduled.",
23193
23725
  loadingMessage: "Loading events…",
23194
23726
  containerClass: getContainerClass(layout, source.columns ?? "3"),
23195
- cardVariant: normalizeCardVariantRole(source.cardVariant) ?? "default",
23727
+ cardRole: source.cardRole ?? "default",
23196
23728
  buttonVariant: source.buttonVariant ?? "primary",
23197
23729
  buttonText: source.buttonText ?? "Book",
23198
23730
  showVenue: source.showVenue ?? true,
@@ -23514,8 +24046,8 @@ const eventListingBlockDefinition = {
23514
24046
  from: "content.loadMoreText",
23515
24047
  fallback: "Load more events"
23516
24048
  } },
23517
- cardVariant: { $bind: {
23518
- from: "content.cardVariant",
24049
+ cardRole: { $bind: {
24050
+ from: "content._cardStyles.role",
23519
24051
  fallback: "default"
23520
24052
  } },
23521
24053
  buttonVariant: { $bind: {
@@ -23785,6 +24317,10 @@ const eventCalendarLayout = [styledSection({
23785
24317
  filterCategoryIds: { $bind: { from: "content.filterCategoryIds" } },
23786
24318
  filterStaffMemberId: { $bind: { from: "content.filterStaffMemberId" } },
23787
24319
  filterVenueId: { $bind: { from: "content.filterVenueId" } },
24320
+ cardRole: { $bind: {
24321
+ from: "content._cardStyles.role",
24322
+ fallback: "default"
24323
+ } },
23788
24324
  buttonVariant: { $bind: {
23789
24325
  from: "content.buttonVariant",
23790
24326
  fallback: "primary"
@@ -24417,11 +24953,11 @@ const eventCalendarAdditionalFields = [
24417
24953
  searchThreshold: 8
24418
24954
  }
24419
24955
  }),
24420
- ...cardStylingFields.filter((f) => f.id === "buttonVariant" || f.id === "buttonText").map((field) => ({
24956
+ ...cardStylingFields.map((field) => ({
24421
24957
  ...field,
24422
24958
  ui: {
24423
24959
  ...field.ui ?? {},
24424
- intent: field.id === "buttonVariant" ? "style" : "content"
24960
+ intent: field.id === "_cardStyles" || field.id === "buttonVariant" ? "style" : "content"
24425
24961
  }
24426
24962
  })),
24427
24963
  {
@@ -25188,7 +25724,7 @@ const offeringsPreviewBlockDefinition = {
25188
25724
  dataSchemas: {
25189
25725
  ...offeringsPreviewEventDataSchemas,
25190
25726
  routeCandidates: publicRouteCandidatesSchema.optional(),
25191
- courses: publicCoursesArraySchema.optional()
25727
+ courses: publicWholeSeriesOfferingsArraySchema.optional()
25192
25728
  },
25193
25729
  dataLoaders: {
25194
25730
  ...offeringsPreviewEventDataLoaders,
@@ -26660,7 +27196,7 @@ const audioPlayerBlockDefinition = { manifest: createBlockManifest({
26660
27196
  }
26661
27197
  ],
26662
27198
  layout: styledSection({
26663
- children: stack({ className: "rb-container rb-mx-auto rb-max-w-3xl" }, [el("div", { className: "card-role-default" }, [media({
27199
+ children: stack({ className: "rb-container rb-mx-auto rb-max-w-3xl" }, [el("div", { className: boxStyleClassNames({ role: "default" }, {}) }, [media({
26664
27200
  className: "card-media rb-aspect-video rb-w-full rb-object-cover",
26665
27201
  size: {
26666
27202
  width: 960,
@@ -29712,16 +30248,27 @@ function eventListCapable() {
29712
30248
  looks: "supported",
29713
30249
  sectionSurfaces: "supported",
29714
30250
  contentFrames: ["plain", "panel"],
29715
- cardRoles: "unsupported",
30251
+ cardRoles: "supported",
29716
30252
  eventListTreatments
29717
30253
  });
29718
30254
  }
30255
+ function eventSpotlightCapable() {
30256
+ return declareBlockDesignCapability({
30257
+ sectionSurfaces: "supported",
30258
+ contentFrames: ["plain"],
30259
+ cardRoles: "supported"
30260
+ });
30261
+ }
29719
30262
  function offeringsPreviewCapable() {
29720
30263
  return declareBlockDesignCapability({
29721
30264
  looks: "supported",
29722
30265
  sectionSurfaces: "supported",
29723
30266
  contentFrames: ["plain"],
29724
- cardRoles: "supported"
30267
+ cardRoles: "supported",
30268
+ compositions: {
30269
+ kind: "offerings-preview",
30270
+ treatments: offeringsPreviewCompositionTreatmentValues
30271
+ }
29725
30272
  });
29726
30273
  }
29727
30274
  function defaultBoundaryBias(visualWeight) {
@@ -30014,7 +30561,7 @@ const systemBlockDefinitions = [
30014
30561
  cardRoles: "supported",
30015
30562
  compositions: {
30016
30563
  kind: "testimonials",
30017
- treatments: ["open-editorial"]
30564
+ treatments: testimonialsCompositionTreatmentValues
30018
30565
  },
30019
30566
  headingDecorationCapability: {
30020
30567
  kind: "supported",
@@ -30169,7 +30716,7 @@ const systemBlockDefinitions = [
30169
30716
  weight: "standard"
30170
30717
  })]
30171
30718
  })),
30172
- withDesignCapability("block.event-spotlight", eventSpotlightBlockDefinition, sectionOnly(), defineBlockDesignMetadata({
30719
+ withDesignCapability("block.event-spotlight", eventSpotlightBlockDefinition, eventSpotlightCapable(), defineBlockDesignMetadata({
30173
30720
  flow: offeringsFlow,
30174
30721
  layoutProfiles: [layoutProfile({
30175
30722
  variantKey: "default",