@riverbankcms/sdk 0.130.2 → 0.134.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 (405) hide show
  1. package/CHANGELOG.md +13 -3
  2. package/dist/{PreviewEditorSidebar-BY-1QdE2.mjs → PreviewEditorSidebar-DfRhJPFQ.mjs} +351 -95
  3. package/dist/{PreviewEditorUI-BS34jI9_.mjs → PreviewEditorUI-Dppxcr_g.mjs} +3 -3
  4. package/dist/{PreviewQueryProvider-BD0kOjtI.mjs → PreviewQueryProvider-D51gQaG3.mjs} +1 -1
  5. package/dist/{SdkPreviewModeRuntime-B1pWnhu-.mjs → SdkPreviewModeRuntime-8CyGCXir.mjs} +91 -21
  6. package/dist/{SiteChromeCustomizeContext-BhUG_72i.mjs → SiteChromeCustomizeContext-DVMTMvqA.mjs} +6896 -4335
  7. package/dist/_dts/ai/src/contracts/proposals.d.ts +1105 -533
  8. package/dist/_dts/ai/src/contracts/siteStyleProposalSchemas.d.ts +363 -276
  9. package/dist/_dts/api/src/accountApi.d.ts +5 -5
  10. package/dist/_dts/api/src/appointmentEndpointDefinitions.d.ts +1 -1
  11. package/dist/_dts/api/src/bookingConfig.d.ts +13 -9
  12. package/dist/_dts/api/src/bookingManagementEndpoints.d.ts +8 -19
  13. package/dist/_dts/api/src/bookingManagementEventEndpointTypes.d.ts +31 -2
  14. package/dist/_dts/api/src/bookingOperations.d.ts +2 -14
  15. package/dist/_dts/api/src/bookingVerticals.d.ts +1 -140
  16. package/dist/_dts/api/src/bookings.d.ts +2 -2
  17. package/dist/_dts/api/src/commercePortalEndpoints.d.ts +45 -12
  18. package/dist/_dts/api/src/contentRuntime.d.ts +3 -2
  19. package/dist/_dts/api/src/courseEndpointDefinitions.d.ts +2 -2
  20. package/dist/_dts/api/src/courses.d.ts +1 -19
  21. package/dist/_dts/api/src/endpoints.d.ts +469 -349
  22. package/dist/_dts/api/src/event-destination-policy.d.ts +1 -1
  23. package/dist/_dts/api/src/eventManagementContracts.d.ts +91 -1
  24. package/dist/_dts/api/src/eventManagementEndpointDefinitions.d.ts +32 -0
  25. package/dist/_dts/api/src/giftingDashboard.d.ts +117 -0
  26. package/dist/_dts/api/src/giftingEndpointDefinitions.d.ts +124 -0
  27. package/dist/_dts/api/src/index.d.ts +4 -4
  28. package/dist/_dts/api/src/indexCoreTypes.d.ts +1 -1
  29. package/dist/_dts/api/src/indexExtendedTypes.d.ts +1 -1
  30. package/dist/_dts/api/src/media.d.ts +1 -0
  31. package/dist/_dts/api/src/navigation/contracts.d.ts +9 -6
  32. package/dist/_dts/api/src/navigation/dashboardBookingsNav.d.ts +3 -4
  33. package/dist/_dts/api/src/navigation/linkResolver.d.ts +6 -2
  34. package/dist/_dts/api/src/navigation/types.d.ts +23 -6
  35. package/dist/_dts/api/src/navigation.d.ts +1 -1
  36. package/dist/_dts/api/src/publicBookingService.d.ts +15 -0
  37. package/dist/_dts/api/src/publicEventEndpointDefinitions.d.ts +11 -0
  38. package/dist/_dts/api/src/publicExperience/eventEndpoints.d.ts +28 -13
  39. package/dist/_dts/api/src/publicExperience/sharedTypes.d.ts +2 -0
  40. package/dist/_dts/api/src/publicExperience/wholeSeriesEndpoints.d.ts +3 -0
  41. package/dist/_dts/api/src/sdk-event-upsert.d.ts +3 -3
  42. package/dist/_dts/api/src/sdkBookingVerticalContracts.d.ts +29 -0
  43. package/dist/_dts/api/src/sdkContracts.d.ts +9 -32
  44. package/dist/_dts/api/src/sdkEndpointDefinitions.d.ts +23 -0
  45. package/dist/_dts/api/src/sdkSettingsContracts.d.ts +25 -0
  46. package/dist/_dts/api/src/sdkThemeCatalogContracts.d.ts +20 -0
  47. package/dist/_dts/api/src/sdkThemeWire.d.ts +64 -54
  48. package/dist/_dts/api/src/siteBanner.d.ts +4 -2
  49. package/dist/_dts/api/src/siteOnboarding.d.ts +3 -3
  50. package/dist/_dts/api/src/sitePlatformEndpoints.d.ts +4 -10
  51. package/dist/_dts/api/src/siteRuntimeEndpoints.d.ts +0 -3
  52. package/dist/_dts/api/src/types.d.ts +2 -3
  53. package/dist/_dts/api/src/webhooks.d.ts +12 -12
  54. package/dist/_dts/blocks/src/PageRenderer.d.ts +2 -13
  55. package/dist/_dts/blocks/src/client.d.ts +1 -1
  56. package/dist/_dts/blocks/src/contracts/non-block-islands.d.ts +9 -0
  57. package/dist/_dts/blocks/src/contracts/proof-block-islands.d.ts +54 -116
  58. package/dist/_dts/blocks/src/index.d.ts +4 -3
  59. package/dist/_dts/blocks/src/primitives/content/components/RichText.d.ts +2 -2
  60. package/dist/_dts/blocks/src/primitives/content/primitives.d.ts +1 -0
  61. package/dist/_dts/blocks/src/subroutes/fold.d.ts +2 -1
  62. package/dist/_dts/blocks/src/system/blocks/courses/shared/index.d.ts +0 -3
  63. package/dist/_dts/blocks/src/system/blocks/courses/shared/pricing.d.ts +2 -50
  64. package/dist/_dts/blocks/src/system/blocks/courses/shared/schemas.d.ts +1 -929
  65. package/dist/_dts/blocks/src/system/blocks/courses/shared/types.d.ts +1 -97
  66. package/dist/_dts/blocks/src/system/blocks/event-details.d.ts +39 -6
  67. package/dist/_dts/blocks/src/system/blocks/events/event-calendar.d.ts +2 -1
  68. package/dist/_dts/blocks/src/system/blocks/events/event-listing.d.ts +3 -3
  69. package/dist/_dts/blocks/src/system/blocks/events/event-spotlight.d.ts +2 -3
  70. package/dist/_dts/blocks/src/system/blocks/events/shared/filtering.d.ts +2 -2
  71. package/dist/_dts/blocks/src/system/blocks/events/shared/schemas.d.ts +42 -20
  72. package/dist/_dts/blocks/src/system/blocks/events/shared/types.d.ts +5 -9
  73. package/dist/_dts/blocks/src/system/blocks/events/whole-series/index.d.ts +3 -0
  74. package/dist/_dts/blocks/src/system/blocks/events/whole-series/pricing.d.ts +50 -0
  75. package/dist/_dts/blocks/src/system/blocks/events/whole-series/schemas.d.ts +135 -0
  76. package/dist/_dts/blocks/src/system/blocks/events/whole-series/types.d.ts +84 -0
  77. package/dist/_dts/blocks/src/system/blocks/location-map.d.ts +4 -4
  78. package/dist/_dts/blocks/src/system/blocks/media-text.d.ts +148 -148
  79. package/dist/_dts/blocks/src/system/blocks/offerings-preview/model.d.ts +3 -2
  80. package/dist/_dts/blocks/src/system/blocks/shared/bookingConsent.d.ts +36 -0
  81. package/dist/_dts/blocks/src/system/fields/boxStyles.d.ts +7 -8
  82. package/dist/_dts/blocks/src/system/manifest/hydrateLinks.d.ts +9 -2
  83. package/dist/_dts/blocks/src/system/manifest/resolveBlockData.d.ts +8 -0
  84. package/dist/_dts/blocks/src/system/manifest/schema.d.ts +79 -79
  85. package/dist/_dts/blocks/src/system/node/validation-constants.d.ts +1 -1
  86. package/dist/_dts/blocks/src/system/runtime/api/types/appointments.d.ts +2 -11
  87. package/dist/_dts/blocks/src/system/runtime/api/types/courses.d.ts +2 -0
  88. package/dist/_dts/blocks/src/system/runtime/api/types/events.d.ts +1 -0
  89. package/dist/_dts/blocks/src/system/runtime/blockComposition.d.ts +1 -1
  90. package/dist/_dts/blocks/src/system/runtime/components/multi-step/DynamicFormFields.d.ts +3 -19
  91. package/dist/_dts/blocks/src/system/runtime/components/registry.client.d.ts +45 -72
  92. package/dist/_dts/blocks/src/system/runtime/components/runtime-backed-blocks.d.ts +22 -37
  93. package/dist/_dts/blocks/src/system/runtime/hooks/useHeadlessWholeSeriesRegistrationFlow.d.ts +6 -6
  94. package/dist/_dts/blocks/src/system/runtime/hooks/useSelectedAppointmentConsentForm.d.ts +2 -0
  95. package/dist/_dts/blocks/src/system/runtime/nodes/booking-form.consent.d.ts +10 -0
  96. package/dist/_dts/blocks/src/system/runtime/nodes/booking-form.field-values.d.ts +4 -0
  97. package/dist/_dts/blocks/src/system/runtime/nodes/booking-form.fields.d.ts +21 -0
  98. package/dist/_dts/blocks/src/system/runtime/nodes/booking-form.headless.state.d.ts +2 -1
  99. package/dist/_dts/blocks/src/system/runtime/nodes/booking-form.interactive.d.ts +38 -144
  100. package/dist/_dts/blocks/src/system/runtime/nodes/booking-form.state.d.ts +5 -19
  101. package/dist/_dts/blocks/src/system/runtime/nodes/booking-runtime-sources.d.ts +3 -2
  102. package/dist/_dts/blocks/src/system/runtime/nodes/course-page-surface-scope.d.ts +2 -5
  103. package/dist/_dts/blocks/src/system/runtime/nodes/course-registration.client.d.ts +4 -2
  104. package/dist/_dts/blocks/src/system/runtime/nodes/course-registration.interactive.d.ts +19 -7
  105. package/dist/_dts/blocks/src/system/runtime/nodes/event-details/logic.d.ts +25 -4
  106. package/dist/_dts/blocks/src/system/runtime/nodes/event-details/presentation.d.ts +75 -0
  107. package/dist/_dts/blocks/src/system/runtime/nodes/event-details/view.d.ts +4 -1
  108. package/dist/_dts/blocks/src/system/runtime/nodes/event-details.client.d.ts +5 -2
  109. package/dist/_dts/blocks/src/system/runtime/nodes/event-details.server.d.ts +5 -2
  110. package/dist/_dts/blocks/src/system/runtime/nodes/event-registration/AttendeeDetailsStep.d.ts +2 -0
  111. package/dist/_dts/blocks/src/system/runtime/nodes/event-registration/PaymentSelectionStep.d.ts +4 -0
  112. package/dist/_dts/blocks/src/system/runtime/nodes/event-registration/RegistrationClosedState.d.ts +5 -0
  113. package/dist/_dts/blocks/src/system/runtime/nodes/event-registration/SiteCreditPreviewPanel.d.ts +6 -0
  114. package/dist/_dts/blocks/src/system/runtime/nodes/event-registration/eventPaymentOptions.d.ts +2 -0
  115. package/dist/_dts/blocks/src/system/runtime/nodes/event-registration/hooks.d.ts +17 -0
  116. package/dist/_dts/blocks/src/system/runtime/nodes/event-registration/registrationSurface.d.ts +21 -4
  117. package/dist/_dts/blocks/src/system/runtime/nodes/event-registration/siteCreditPreview.d.ts +51 -0
  118. package/dist/_dts/blocks/src/system/runtime/nodes/event-registration/types.d.ts +3 -3
  119. package/dist/_dts/blocks/src/system/runtime/nodes/event-registration/useEventRegistrationWizard.d.ts +6 -4
  120. package/dist/_dts/blocks/src/system/runtime/nodes/event-registration/validation.d.ts +2 -1
  121. package/dist/_dts/blocks/src/system/runtime/nodes/{course-registration → event-registration/whole-series}/BookingModeStep.d.ts +1 -1
  122. package/dist/_dts/blocks/src/system/runtime/nodes/{course-registration → event-registration/whole-series}/CheckIcon.d.ts +1 -1
  123. package/dist/_dts/blocks/src/system/runtime/nodes/{course-registration → event-registration/whole-series}/ErrorStep.d.ts +1 -1
  124. package/dist/_dts/blocks/src/system/runtime/nodes/{course-registration → event-registration/whole-series}/MembershipHero.d.ts +3 -3
  125. package/dist/_dts/blocks/src/system/runtime/nodes/{course-registration → event-registration/whole-series}/PaymentFailedStep.d.ts +1 -1
  126. package/dist/_dts/blocks/src/system/runtime/nodes/event-registration/whole-series/StepIndicator.d.ts +6 -0
  127. package/dist/_dts/blocks/src/system/runtime/nodes/{course-registration → event-registration/whole-series}/VerifyingTimeoutStep.d.ts +1 -1
  128. package/dist/_dts/blocks/src/system/runtime/nodes/event-registration/whole-series/WholeSeriesRegistrationActiveSteps.d.ts +9 -0
  129. package/dist/_dts/blocks/src/system/runtime/nodes/{course-registration/CourseRegistrationErrorBoundary.d.ts → event-registration/whole-series/WholeSeriesRegistrationErrorBoundary.d.ts} +5 -2
  130. package/dist/_dts/blocks/src/system/runtime/nodes/event-registration/whole-series/WholeSeriesRegistrationTerminalContent.d.ts +8 -0
  131. package/dist/_dts/blocks/src/system/runtime/nodes/event-registration/whole-series/WholeSeriesRegistrationWizard.d.ts +8 -0
  132. package/dist/_dts/blocks/src/system/runtime/nodes/event-registration/whole-series/components.d.ts +46 -0
  133. package/dist/_dts/blocks/src/system/runtime/nodes/{course-registration → event-registration/whole-series}/index.d.ts +4 -4
  134. package/dist/_dts/blocks/src/system/runtime/nodes/event-registration/whole-series/presentation.d.ts +7 -0
  135. package/dist/_dts/blocks/src/system/runtime/nodes/event-registration/whole-series/pricing.d.ts +14 -0
  136. package/dist/_dts/blocks/src/system/runtime/nodes/{course-registration → event-registration/whole-series}/types.d.ts +18 -16
  137. package/dist/_dts/blocks/src/system/runtime/nodes/{course-registration/useCourseEligibility.d.ts → event-registration/whole-series/useWholeSeriesEligibility.d.ts} +6 -6
  138. package/dist/_dts/blocks/src/system/runtime/nodes/event-registration/whole-series/useWholeSeriesPaymentVerification.d.ts +10 -0
  139. package/dist/_dts/blocks/src/system/runtime/nodes/event-registration/whole-series/useWholeSeriesRegistrationActions.d.ts +35 -0
  140. package/dist/_dts/blocks/src/system/runtime/nodes/{course-registration/useCourseRegistrationPortal.d.ts → event-registration/whole-series/useWholeSeriesRegistrationPortal.d.ts} +2 -2
  141. package/dist/_dts/blocks/src/system/runtime/nodes/event-registration/whole-series/useWholeSeriesRegistrationSelection.d.ts +35 -0
  142. package/dist/_dts/blocks/src/system/runtime/nodes/event-registration/whole-series/useWholeSeriesRegistrationWizard.d.ts +185 -0
  143. package/dist/_dts/blocks/src/system/runtime/nodes/{course-registration/useCourseWaitlistSelection.d.ts → event-registration/whole-series/useWholeSeriesWaitlistSelection.d.ts} +5 -5
  144. package/dist/_dts/blocks/src/system/runtime/nodes/{course-registration → event-registration/whole-series}/utils.d.ts +4 -4
  145. package/dist/_dts/blocks/src/system/runtime/nodes/{course-registration → event-registration/whole-series}/whole-series-registration.headless.contract.d.ts +7 -7
  146. package/dist/_dts/blocks/src/system/runtime/nodes/{course-registration → event-registration/whole-series}/whole-series-registration.headless.planning.d.ts +2 -2
  147. package/dist/_dts/blocks/src/system/runtime/nodes/event-registration/whole-series/wholeSeriesPageSurfaceScope.d.ts +17 -0
  148. package/dist/_dts/blocks/src/system/runtime/nodes/{course-registration/courseRegistrationViewState.d.ts → event-registration/whole-series/wholeSeriesRegistrationViewState.d.ts} +7 -7
  149. package/dist/_dts/blocks/src/system/runtime/nodes/{course-registration → event-registration/whole-series}/wizardSteps.d.ts +4 -4
  150. package/dist/_dts/blocks/src/system/runtime/nodes/event-registration.interactive.d.ts +24 -54
  151. package/dist/_dts/blocks/src/system/runtime/nodes/events/EventCombined.client.d.ts +2 -0
  152. package/dist/_dts/blocks/src/system/runtime/nodes/events/EventCombined.interactive.d.ts +3 -0
  153. package/dist/_dts/blocks/src/system/runtime/nodes/events/EventListing.interactive.d.ts +12 -11
  154. package/dist/_dts/blocks/src/system/runtime/nodes/events/EventListing.server.d.ts +3 -2
  155. package/dist/_dts/blocks/src/system/runtime/nodes/events/EventSpotlight.d.ts +3 -2
  156. package/dist/_dts/blocks/src/system/runtime/nodes/events/shared/EventCard.d.ts +3 -2
  157. package/dist/_dts/blocks/src/system/runtime/nodes/events/shared/EventDetailModal.d.ts +4 -3
  158. package/dist/_dts/blocks/src/system/runtime/nodes/events/shared/EventModalCloseButton.d.ts +7 -0
  159. package/dist/_dts/blocks/src/system/runtime/nodes/events/shared/EventModals.d.ts +4 -3
  160. package/dist/_dts/blocks/src/system/runtime/nodes/events/shared/WeekBoardView.d.ts +14 -0
  161. package/dist/_dts/blocks/src/system/runtime/nodes/events/shared/eventCollectionContract.d.ts +51 -14
  162. package/dist/_dts/blocks/src/system/runtime/nodes/shared/MagicLinkForm.d.ts +1 -1
  163. package/dist/_dts/blocks/src/system/runtime/shared/components/BookingConsentAgreement.d.ts +7 -0
  164. package/dist/_dts/blocks/src/system/runtime/shared/components/DiscountCodeDisclosure.d.ts +12 -12
  165. package/dist/_dts/blocks/src/system/runtime/shared/types.d.ts +1 -0
  166. package/dist/_dts/blocks/src/system/runtime/shared/useWaitlistClaim.d.ts +1 -0
  167. package/dist/_dts/blocks/src/system/transforms/registry/_utils/boxStyleClassNames.d.ts +30 -11
  168. package/dist/_dts/blocks/src/system/transforms/registry/boxStyles.d.ts +15 -4
  169. package/dist/_dts/blocks/src/system/transforms/registry/index.d.ts +1 -0
  170. package/dist/_dts/blocks/src/system/transforms/typed.d.ts +1 -4
  171. package/dist/_dts/blocks/src/system/types/link.d.ts +7 -1
  172. package/dist/_dts/commerce/src/purchase/bookingInstalmentSchedule.d.ts +13 -0
  173. package/dist/_dts/commerce/src/purchase/cancellationPolicy.d.ts +7 -0
  174. package/dist/_dts/commerce/src/purchase/canonicalRefundPlanner.d.ts +48 -0
  175. package/dist/_dts/commerce/src/purchase/checkoutCollectionPlan.d.ts +39 -0
  176. package/dist/_dts/commerce/src/purchase/checkoutCommitPlan.d.ts +40 -0
  177. package/dist/_dts/commerce/src/purchase/checkoutDiscountContextPlanning.d.ts +80 -0
  178. package/dist/_dts/commerce/src/purchase/checkoutErrorCodes.d.ts +1 -0
  179. package/dist/_dts/commerce/src/purchase/checkoutOrderItemProjection.d.ts +22 -0
  180. package/dist/_dts/commerce/src/purchase/checkoutPaymentFlow.d.ts +50 -0
  181. package/dist/_dts/commerce/src/purchase/checkoutPaymentPlanPlanning.d.ts +30 -0
  182. package/dist/_dts/commerce/src/purchase/checkoutPaymentTermPlanning.d.ts +10 -0
  183. package/dist/_dts/commerce/src/purchase/checkoutPaymentTerms.d.ts +53 -0
  184. package/dist/_dts/commerce/src/purchase/checkoutQuantity.d.ts +8 -0
  185. package/dist/_dts/commerce/src/purchase/checkoutSessionMetadata.d.ts +76 -0
  186. package/dist/_dts/commerce/src/purchase/checkoutSettlement.d.ts +46 -0
  187. package/dist/_dts/commerce/src/purchase/checkoutStripeFinalizationPlanning.d.ts +12 -0
  188. package/dist/_dts/commerce/src/purchase/checkoutStripeSessionPlanning.d.ts +125 -0
  189. package/dist/_dts/commerce/src/purchase/checkoutValidatedItemPlanning.d.ts +55 -0
  190. package/dist/_dts/commerce/src/purchase/confirmationEmailPayment.d.ts +91 -0
  191. package/dist/_dts/commerce/src/purchase/discountApplication.d.ts +74 -0
  192. package/dist/_dts/commerce/src/purchase/index.d.ts +55 -0
  193. package/dist/_dts/commerce/src/purchase/oneTimeCheckoutPlanning.d.ts +86 -0
  194. package/dist/_dts/commerce/src/purchase/order-number.d.ts +33 -0
  195. package/dist/_dts/commerce/src/purchase/orderCancellationPlan.d.ts +19 -0
  196. package/dist/_dts/commerce/src/purchase/orderCompletionEmailPlan.d.ts +71 -0
  197. package/dist/_dts/commerce/src/purchase/orderConfirmationPlanning.d.ts +120 -0
  198. package/dist/_dts/commerce/src/purchase/orderFulfillmentPlan.d.ts +81 -0
  199. package/dist/_dts/commerce/src/purchase/orderFulfillmentResult.d.ts +8 -0
  200. package/dist/_dts/commerce/src/purchase/orderHistoryLedgerFilters.d.ts +1 -0
  201. package/dist/_dts/commerce/src/purchase/orderHistorySource.d.ts +11 -0
  202. package/dist/_dts/commerce/src/purchase/orderInstalmentAdminSettlement.d.ts +43 -0
  203. package/dist/_dts/commerce/src/purchase/orderInstalmentClosure.d.ts +29 -0
  204. package/dist/_dts/commerce/src/purchase/orderInstalmentLifecycle.d.ts +44 -0
  205. package/dist/_dts/commerce/src/purchase/orderInstalmentPayoff.d.ts +24 -0
  206. package/dist/_dts/commerce/src/purchase/orderInstalmentPlan.d.ts +40 -0
  207. package/dist/_dts/commerce/src/purchase/orderItemMetadata.d.ts +151 -0
  208. package/dist/_dts/commerce/src/purchase/orderItemSupport.d.ts +14 -0
  209. package/dist/_dts/commerce/src/purchase/orderListFilters.d.ts +3 -0
  210. package/dist/_dts/commerce/src/purchase/orderPaymentLinkPlanning.d.ts +60 -0
  211. package/dist/_dts/commerce/src/purchase/orderPaymentReceipt.d.ts +184 -0
  212. package/dist/_dts/commerce/src/purchase/orderPaymentState.d.ts +135 -0
  213. package/dist/_dts/commerce/src/purchase/orderPlanningTypes.d.ts +102 -0
  214. package/dist/_dts/commerce/src/purchase/orderRefundPlanning.d.ts +50 -0
  215. package/dist/_dts/commerce/src/purchase/orderRefundPolicy.d.ts +36 -0
  216. package/dist/_dts/commerce/src/purchase/orderTotals.d.ts +23 -0
  217. package/dist/_dts/commerce/src/purchase/orderTypes.d.ts +39 -0
  218. package/dist/_dts/commerce/src/purchase/pendingCheckoutSessionClaim.d.ts +1 -0
  219. package/dist/_dts/commerce/src/purchase/persistedCheckoutLines.d.ts +27 -0
  220. package/dist/_dts/commerce/src/purchase/protectedDepositRefundPolicy.d.ts +86 -0
  221. package/dist/_dts/commerce/src/purchase/refundPolicy.d.ts +8 -0
  222. package/dist/_dts/commerce/src/purchase/refundRailSplit.d.ts +40 -0
  223. package/dist/_dts/commerce/src/purchase/result.d.ts +2 -0
  224. package/dist/_dts/commerce/src/purchase/settlement.d.ts +97 -0
  225. package/dist/_dts/commerce/src/purchase/shopRefundPlanning.d.ts +43 -0
  226. package/dist/_dts/commerce/src/purchase/stateTransitions.d.ts +31 -0
  227. package/dist/_dts/commerce/src/purchase/stripeMinimumCharge.d.ts +10 -0
  228. package/dist/_dts/commerce/src/purchase/types.d.ts +168 -0
  229. package/dist/_dts/commerce/src/shop/shipmentEligibility.d.ts +14 -0
  230. package/dist/_dts/commerce/src/utils/assertNever.d.ts +1 -0
  231. package/dist/_dts/content-model/src/content-types/builtin-schemas.d.ts +4 -0
  232. package/dist/_dts/content-model/src/content-types/builtins.d.ts +4 -0
  233. package/dist/_dts/content-model/src/content-types/schema.d.ts +4 -4
  234. package/dist/_dts/core/src/booking-consent.d.ts +8 -0
  235. package/dist/_dts/core/src/booking-vertical-catalog.d.ts +741 -0
  236. package/dist/_dts/core/src/booking-vertical-config.d.ts +66 -0
  237. package/dist/_dts/core/src/booking-vertical-definitions.d.ts +68 -0
  238. package/dist/_dts/{api/src/bookingVerticalPreset.d.ts → core/src/booking-vertical-preset.d.ts} +1 -1
  239. package/dist/_dts/core/src/booking-verticals.d.ts +98 -0
  240. package/dist/_dts/core/src/event-page-selection.d.ts +22 -0
  241. package/dist/_dts/core/src/event-pricing.d.ts +5 -0
  242. package/dist/_dts/core/src/event-series-behaviour.d.ts +16 -0
  243. package/dist/_dts/core/src/index.d.ts +4 -0
  244. package/dist/_dts/db/src/generated/supabase/database.types.d.ts +81 -3
  245. package/dist/_dts/db/src/schemas/forms.d.ts +25 -25
  246. package/dist/_dts/db/src/types/jsonb.d.ts +1 -1
  247. package/dist/_dts/editor/src/primitives/rich-text/RichTextEditorSurface.d.ts +2 -1
  248. package/dist/_dts/editor/src/primitives/rich-text/config.d.ts +2 -1
  249. package/dist/_dts/editor/src/primitives/rich-text/toolbar/linkPopoverUtils.d.ts +3 -2
  250. package/dist/_dts/editor/src/primitives/rich-text/useRichTextEditor.d.ts +3 -4
  251. package/dist/_dts/media-core/src/fileUploadCompletion.d.ts +3 -0
  252. package/dist/_dts/media-core/src/fileUploadDurableFinalization.d.ts +2 -0
  253. package/dist/_dts/media-core/src/identifiers.d.ts +10 -0
  254. package/dist/_dts/media-core/src/mediaWriteNormalizer.d.ts +2 -6
  255. package/dist/_dts/media-core/src/types.d.ts +2 -1
  256. package/dist/_dts/media-core/src/usageScanner.d.ts +1 -1
  257. package/dist/_dts/media-editor/src/index.d.ts +2 -2
  258. package/dist/_dts/media-editor/src/mediaSelection.d.ts +1 -22
  259. package/dist/_dts/media-editor/src/useMediaSelection.d.ts +0 -9
  260. package/dist/_dts/preview-next/src/client/preview/ButtonHoverRoleControls.d.ts +10 -0
  261. package/dist/_dts/preview-next/src/client/preview/ButtonStylePicker.d.ts +3 -2
  262. package/dist/_dts/preview-next/src/client/preview/PreviewEditorSidebar.d.ts +3 -1
  263. package/dist/_dts/preview-next/src/client/preview/PreviewShell.d.ts +2 -1
  264. package/dist/_dts/preview-next/src/client/preview/PreviewShellLayout.d.ts +2 -1
  265. package/dist/_dts/preview-next/src/client/preview/StyleConfigurator.d.ts +3 -1
  266. package/dist/_dts/preview-next/src/client/preview/StyleConfiguratorWarningNotice.d.ts +7 -0
  267. package/dist/_dts/preview-next/src/client/preview/siteStylePreviewPlanner.d.ts +1 -1
  268. package/dist/_dts/sdk/src/bookings/types.d.ts +7 -89
  269. package/dist/_dts/sdk/src/client/eventSubrouteReadOperations.d.ts +11 -0
  270. package/dist/_dts/sdk/src/client/types.d.ts +12 -5
  271. package/dist/_dts/sdk/src/components.d.ts +1 -1
  272. package/dist/_dts/sdk/src/config/validation.d.ts +30 -30
  273. package/dist/_dts/sdk/src/contracts/content.d.ts +10 -36
  274. package/dist/_dts/sdk/src/contracts/index.d.ts +1 -1
  275. package/dist/_dts/sdk/src/contracts/page.d.ts +2 -13
  276. package/dist/_dts/sdk/src/contracts/rendering.d.ts +1 -1
  277. package/dist/_dts/sdk/src/contracts/system-block-content.d.ts +4 -16
  278. package/dist/_dts/sdk/src/manifest/passes/pass1-fields.d.ts +9 -9
  279. package/dist/_dts/sdk/src/next/pageMetadataProjection.d.ts +7 -0
  280. package/dist/_dts/sdk/src/next/resolveEventPageSubroute.d.ts +12 -0
  281. package/dist/_dts/sdk/src/public-api/contracts.d.ts +11 -38
  282. package/dist/_dts/sdk/src/public-api/eventSubrouteContracts.d.ts +12 -0
  283. package/dist/_dts/sdk/src/public-api/runtime.d.ts +1 -1
  284. package/dist/_dts/sdk/src/rendering/client.d.ts +44 -0
  285. package/dist/_dts/sdk/src/rendering/index.d.ts +1 -1
  286. package/dist/_dts/sdk/src/routing/entrySubroutes.d.ts +1 -1
  287. package/dist/_dts/sdk/src/routing/resolveOccurrence.d.ts +4 -3
  288. package/dist/_dts/sdk/src/routing/resolvePageContent.d.ts +7 -3
  289. package/dist/_dts/sdk/src/version.d.ts +1 -1
  290. package/dist/_dts/theme-core/src/accordions/types.d.ts +2 -2
  291. package/dist/_dts/theme-core/src/buttons/buttonSurfaceContext.d.ts +1 -1
  292. package/dist/_dts/theme-core/src/buttons/contextualHover.d.ts +41 -0
  293. package/dist/_dts/theme-core/src/buttons/index.d.ts +1 -0
  294. package/dist/_dts/theme-core/src/buttons/resolveButtonColourStates.d.ts +3 -0
  295. package/dist/_dts/theme-core/src/buttons/resolveButtonHoverTreatment.d.ts +14 -0
  296. package/dist/_dts/theme-core/src/buttons/styles/domain.d.ts +21 -4
  297. package/dist/_dts/theme-core/src/buttons/styles/recipes/flatInk.d.ts +92 -0
  298. package/dist/_dts/theme-core/src/buttons/styles/recipes/staticRecipes.d.ts +10 -150
  299. package/dist/_dts/theme-core/src/buttons/styles/registry.d.ts +57 -102
  300. package/dist/_dts/theme-core/src/buttons/styles/selection.d.ts +50 -2
  301. package/dist/_dts/theme-core/src/buttons/types.d.ts +41 -12
  302. package/dist/_dts/theme-core/src/cards/types.d.ts +7 -29
  303. package/dist/_dts/theme-core/src/generated/containerResponsiveThemeCss.d.ts +1 -1
  304. package/dist/_dts/theme-core/src/mock-themes/all.d.ts +90 -75
  305. package/dist/_dts/theme-core/src/navigation/types.d.ts +4 -4
  306. package/dist/_dts/theme-core/src/palette/colors.d.ts +1 -1
  307. package/dist/_dts/theme-core/src/palette/curated/types.d.ts +2 -2
  308. package/dist/_dts/theme-core/src/schema.d.ts +98 -110
  309. package/dist/_dts/theme-core/src/site-styles/appearancePresetCatalog.d.ts +27 -0
  310. package/dist/_dts/theme-core/src/site-styles/blockAppearancePresets.d.ts +27 -0
  311. package/dist/_dts/theme-core/src/site-styles/buttonSelectionCompiler.d.ts +18 -0
  312. package/dist/_dts/theme-core/src/site-styles/cardRoleVocabulary.d.ts +1 -1
  313. package/dist/_dts/theme-core/src/site-styles/compilationPlan.d.ts +21 -0
  314. package/dist/_dts/theme-core/src/site-styles/designState.d.ts +2 -2
  315. package/dist/_dts/theme-core/src/site-styles/generatedSchemas.d.ts +4 -4
  316. package/dist/_dts/theme-core/src/site-styles/logoBranding.d.ts +4 -4
  317. package/dist/_dts/theme-core/src/site-styles/previewCompiler.d.ts +2 -11
  318. package/dist/_dts/theme-core/src/site-styles/selectionFallbackWarning.d.ts +15 -0
  319. package/dist/_dts/theme-core/src/site-styles/types.d.ts +13 -1
  320. package/dist/_dts/theme-core/src/tokens/themeColorTokens.d.ts +1 -1
  321. package/dist/_dts/ui/src/badge.d.ts +1 -1
  322. package/dist/_dts/ui/src/button.d.ts +1 -1
  323. package/dist/_dts/ui/src/callout.d.ts +1 -1
  324. package/dist/_dts/ui/src/card.d.ts +1 -1
  325. package/dist/_dts/ui/src/navigation-tabs.d.ts +2 -0
  326. package/dist/client/{StepIndicator-CLjQhkDb.mjs → BookingConsentAgreement-BxgpGEFD.mjs} +26 -4
  327. package/dist/client/{DiscountCodeDisclosure-BPZ-yfGI.mjs → DiscountCodeDisclosure-CfuPOHD0.mjs} +12 -12
  328. package/dist/client/{EventCombined.client-Cjt3kKYR.mjs → EventCombined.client-DB8Qfzi-.mjs} +37 -49
  329. package/dist/client/{EventListing.client-DY9dn6Fh.mjs → EventListing.client-DD4X8hp4.mjs} +2 -2
  330. package/dist/client/{LeafletStaticMap--2c61XYn.mjs → LeafletStaticMap-QhgIBQbv.mjs} +1 -1
  331. package/dist/client/{CourseRegistrationWizard-DGW9F0SQ.mjs → WholeSeriesRegistrationWizard-DwtC7bCs.mjs} +1460 -1247
  332. package/dist/client/{accordion-_boYwHHi.mjs → accordion-DFXpLvwg.mjs} +1 -1
  333. package/dist/client/{bookingForm--AqEfyBX.mjs → bookingForm-sI05d3lk.mjs} +73 -47
  334. package/dist/client/bookings.mjs +1719 -706
  335. package/dist/client/{carousel-CVI2dqZr.mjs → carousel-wjyWTZCh.mjs} +1 -1
  336. package/dist/client/{cart-DR6IiPz9.mjs → cart-DCwdpA4i.mjs} +3 -3
  337. package/dist/client/{checkout-CsrGAfQt.mjs → checkout-DTDW3l0R.mjs} +3 -3
  338. package/dist/client/checkoutUrls-DQYC_Br-.mjs +187 -0
  339. package/dist/client/client.mjs +6830 -3672
  340. package/dist/client/{context-B83PiNzm.mjs → context-TSK1CGx8.mjs} +1 -14
  341. package/dist/client/{courseRegistration-aNJVaLa3.mjs → courseRegistration-A-Tg7qw_.mjs} +11 -5
  342. package/dist/client/{eventCalendar-OZ7h59VN.mjs → eventCalendar-B0Zg-i_w.mjs} +41 -44
  343. package/dist/client/{eventCombined-BbJ6bFKz.mjs → eventCombined-B8Y2wizd.mjs} +3 -3
  344. package/dist/client/{eventDetails-BLyUBiCT.mjs → eventDetails-DPDOwURJ.mjs} +276 -94
  345. package/dist/client/{eventListing-DuP1yhBS.mjs → eventListing-CjBcmSLn.mjs} +3 -3
  346. package/dist/client/{eventRegistration-BXyECPa-.mjs → eventRegistration-CK30HsAq.mjs} +730 -190
  347. package/dist/client/{form-BA4t3kKU.mjs → form-CUXfsABE.mjs} +2 -2
  348. package/dist/client/{headerSection-CpNaJxhW.mjs → headerSection-N-mN3rjr.mjs} +2 -2
  349. package/dist/client/hooks.mjs +1418 -484
  350. package/dist/client/{locationMap-3HGMCL7_.mjs → locationMap-oiIDQMBt.mjs} +2 -2
  351. package/dist/client/{newsletterForm-C2s6Mw67.mjs → newsletterForm-CkQ2tTrM.mjs} +2 -2
  352. package/dist/client/pricing-Caa0QWzh.mjs +195 -0
  353. package/dist/client/{productDetail-C9joWhdE.mjs → productDetail-CnidyrsN.mjs} +3 -3
  354. package/dist/client/{productList-CjzdU3pB.mjs → productList-CttYcS_S.mjs} +3 -3
  355. package/dist/client/{propsDecoder-CBPGXEYX.mjs → propsDecoder-CeUMxI9a.mjs} +677 -350
  356. package/dist/client/rendering/client.mjs +6075 -4150
  357. package/dist/client/rendering/islands.mjs +18 -18
  358. package/dist/client/rendering.mjs +7589 -4388
  359. package/dist/client/{scrollToBlock-DZ73aEX6.mjs → scrollToBlock-lPr1oqxB.mjs} +1 -1
  360. package/dist/client/{shop-CQRai7hj.mjs → shop-DXQtMo2O.mjs} +6 -6
  361. package/dist/client/{shop-commerce-hP9UboOx.mjs → shop-commerce-quDL411J.mjs} +7 -164
  362. package/dist/client/{shop-commerce-store-DiD5a32e.mjs → shop-commerce-store-Dnu-8Iub.mjs} +1 -1
  363. package/dist/client/{shopShared-DP8DXTkF.mjs → shopShared-BWPUURvG.mjs} +3 -3
  364. package/dist/client/{useEventFilters-pF_OJNQP.mjs → useEventFilters-DRhWp2_5.mjs} +196 -7
  365. package/dist/client/{usePolling-Cls91SD2.mjs → usePolling-UN4WKnaM.mjs} +3 -3
  366. package/dist/preview-next/before-render.mjs +247 -60
  367. package/dist/preview-next/client/runtime.mjs +4 -4
  368. package/dist/preview-next/keepAlive.mjs +247 -60
  369. package/dist/preview-next/middleware.mjs +247 -60
  370. package/dist/{previewAuthStore-CX1C_KJ4.mjs → previewAuthStore-BFKd4LrN.mjs} +247 -60
  371. package/dist/{sdk-runtime-5CcPAI14.mjs → sdk-runtime-Ca5RD78X.mjs} +2 -2
  372. package/dist/{separator-BXlYN_gr.mjs → separator-CMhj6BTi.mjs} +1 -1
  373. package/dist/server/components.mjs +3578 -1614
  374. package/dist/server/config-validation.mjs +1418 -485
  375. package/dist/server/config.mjs +1418 -485
  376. package/dist/server/data.mjs +1418 -484
  377. package/dist/server/index.mjs +289 -81
  378. package/dist/server/manifest.mjs +0 -1
  379. package/dist/server/next.mjs +3761 -1794
  380. package/dist/server/page-converter.mjs +911 -261
  381. package/dist/server/prebuild.mjs +1 -1
  382. package/dist/server/rendering/server.mjs +3580 -1613
  383. package/dist/server/rendering.mjs +3578 -1614
  384. package/dist/server/routing.mjs +1687 -689
  385. package/dist/server/server.mjs +1458 -563
  386. package/dist/server/theme-bridge.mjs +1996 -935
  387. package/dist/server/theme.mjs +346 -133
  388. package/dist/styles/index.css +1602 -796
  389. package/package.json +2 -2
  390. package/dist/_dts/api/src/bookingVerticalCatalog.d.ts +0 -746
  391. package/dist/_dts/api/src/eventSeriesPresentationPreset.d.ts +0 -12
  392. package/dist/_dts/blocks/src/system/runtime/nodes/course-registration/CourseRegistrationWizard.d.ts +0 -3
  393. package/dist/_dts/blocks/src/system/runtime/nodes/course-registration/StepIndicator.d.ts +0 -6
  394. package/dist/_dts/blocks/src/system/runtime/nodes/course-registration/components.d.ts +0 -45
  395. package/dist/_dts/blocks/src/system/runtime/nodes/course-registration/pricing.d.ts +0 -14
  396. package/dist/_dts/blocks/src/system/runtime/nodes/course-registration/useCoursePaymentVerification.d.ts +0 -9
  397. package/dist/_dts/blocks/src/system/runtime/nodes/course-registration/useCourseRegistrationActions.d.ts +0 -35
  398. package/dist/_dts/blocks/src/system/runtime/nodes/course-registration/useCourseRegistrationSelection.d.ts +0 -31
  399. package/dist/_dts/blocks/src/system/runtime/nodes/course-registration/useCourseRegistrationWizard.d.ts +0 -102
  400. package/dist/client/checkoutUrls-Ct8Mxna3.mjs +0 -26
  401. package/dist/client/eventProductEligibility-AVxyCB1u.mjs +0 -50
  402. package/dist/client/pricing-BiqIMgZk.mjs +0 -174
  403. /package/dist/_dts/blocks/src/system/runtime/nodes/{course-registration → event-registration/whole-series}/PortalAuthSidebar.d.ts +0 -0
  404. /package/dist/_dts/blocks/src/system/runtime/nodes/{course-registration → event-registration/whole-series}/SuccessStep.d.ts +0 -0
  405. /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);
@@ -12716,23 +12837,56 @@ function sectionStylesField(options = {}) {
12716
12837
  required: false,
12717
12838
  schema: { fields },
12718
12839
  ui: {
12719
- renderInHeader,
12720
- intent: "style",
12840
+ renderInHeader,
12841
+ intent: "style",
12842
+ modalConfig: {
12843
+ buttonLabel: label,
12844
+ description: "Configure background and spacing for this section.",
12845
+ buttonVariant: "outline",
12846
+ showCustomizedIndicator: true
12847
+ }
12848
+ }
12849
+ };
12850
+ }
12851
+ function containerStylesField(options = {}) {
12852
+ return createBoxStylesFieldWithDepth("container", options);
12853
+ }
12854
+ function cardStylesField(options = {}) {
12855
+ if (options.controls === "role-only") return createRoleOnlyCardStylesField(options);
12856
+ return createBoxStylesFieldWithDepth("card", options);
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 } : {},
12721
12881
  modalConfig: {
12722
12882
  buttonLabel: label,
12723
- description: "Configure background and spacing for this section.",
12883
+ description: "Choose the site-style card role.",
12724
12884
  buttonVariant: "outline",
12725
12885
  showCustomizedIndicator: true
12726
12886
  }
12727
12887
  }
12728
12888
  };
12729
12889
  }
12730
- function containerStylesField(options = {}) {
12731
- return createBoxStylesFieldWithDepth("container", options);
12732
- }
12733
- function cardStylesField(options = {}) {
12734
- return createBoxStylesFieldWithDepth("card", options);
12735
- }
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,30 @@ 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/shared/bookingConsent.ts
21076
+ const blockBookingConsentSchema = z.object({
21077
+ requirementId: z.string(),
21078
+ title: z.string(),
21079
+ agreement: RichTextDocSchema,
21080
+ checkboxLabel: z.string()
21081
+ });
21082
+ const bookingRequirementConsentFieldSchema = z.object({
21083
+ id: z.string(),
21084
+ label: z.string(),
21085
+ type: z.literal("booking_requirement_consent"),
21086
+ required: z.literal(true),
21087
+ agreement: RichTextDocSchema,
21088
+ checkboxLabel: z.string().min(1)
21089
+ });
21090
+ z.union([blockBookingConsentSchema, bookingRequirementConsentFieldSchema]);
21091
+ //#endregion
21092
+ //#region ../blocks/src/system/blocks/events/whole-series/schemas.ts
21093
+ const wholeSeriesVenueSchema = z.object({
20612
21094
  id: z.string(),
20613
21095
  name: z.string(),
20614
21096
  address: z.string().nullable()
20615
21097
  });
20616
- /**
20617
- * Zod schema for course session (occurrence) data
20618
- */
20619
- const courseSessionSchema = z.object({
21098
+ const wholeSeriesSessionSchema = z.object({
20620
21099
  id: z.string(),
20621
21100
  startsAt: z.string(),
20622
21101
  endsAt: z.string(),
@@ -20624,14 +21103,14 @@ const courseSessionSchema = z.object({
20624
21103
  capacityOverride: z.number().nullable().optional(),
20625
21104
  overrides: z.record(z.string(), z.unknown()).nullable().optional()
20626
21105
  });
20627
- const courseTeamMemberSummarySchema = z.object({
21106
+ const wholeSeriesTeamMemberSummarySchema = z.object({
20628
21107
  id: z.string(),
20629
21108
  name: z.string(),
20630
21109
  roleLabel: z.string().nullable(),
20631
21110
  summary: z.string().nullable(),
20632
21111
  profilePath: z.string().nullable()
20633
21112
  });
20634
- const coursePricingOptionSchema = z.object({
21113
+ const wholeSeriesPricingOptionSchema = z.object({
20635
21114
  id: z.string(),
20636
21115
  name: z.string(),
20637
21116
  description: z.string().nullable(),
@@ -20647,7 +21126,7 @@ const coursePricingOptionSchema = z.object({
20647
21126
  "both"
20648
21127
  ]).nullable().optional()
20649
21128
  });
20650
- const coursePricingSchema = z.object({
21129
+ const wholeSeriesPricingSchema = z.object({
20651
21130
  bookingRequirement: z.enum(["none", "required"]),
20652
21131
  pricingStrategy: z.enum([
20653
21132
  "free",
@@ -20661,22 +21140,20 @@ const coursePricingSchema = z.object({
20661
21140
  slidingMaxAmount: z.number().nullable().optional(),
20662
21141
  slidingSuggestedAmount: z.number().nullable().optional(),
20663
21142
  paymentTerms: blockBookingPaymentTermsSchema,
20664
- options: z.array(coursePricingOptionSchema)
21143
+ options: z.array(wholeSeriesPricingOptionSchema)
20665
21144
  });
20666
- /**
20667
- * Zod schema for public course data
20668
- */
20669
21145
  const publicWholeSeriesOfferingSchema = z.object({
20670
21146
  eventSeriesId: z.string(),
20671
21147
  eventOfferingId: z.string(),
20672
21148
  title: z.string(),
20673
21149
  slug: z.string(),
20674
21150
  description: z.unknown().nullable(),
20675
- teamMembers: z.array(courseTeamMemberSummarySchema).optional(),
21151
+ teamMembers: z.array(wholeSeriesTeamMemberSummarySchema).optional(),
20676
21152
  enrollmentOpen: z.boolean(),
20677
- pricing: coursePricingSchema,
21153
+ pricing: wholeSeriesPricingSchema,
20678
21154
  currency: z.string(),
20679
21155
  paymentTerms: blockBookingPaymentTermsSchema,
21156
+ consent: blockBookingConsentSchema.nullable(),
20680
21157
  enrollmentCapacity: z.number().nullable(),
20681
21158
  acceptsMemberships: z.boolean(),
20682
21159
  status: z.enum([
@@ -20687,12 +21164,10 @@ const publicWholeSeriesOfferingSchema = z.object({
20687
21164
  sessionsCount: z.number(),
20688
21165
  enrolledCount: z.number(),
20689
21166
  availableSpots: z.number().nullable(),
20690
- sessions: z.array(courseSessionSchema),
20691
- venue: courseVenueSchema.nullable()
21167
+ sessions: z.array(wholeSeriesSessionSchema),
21168
+ venue: wholeSeriesVenueSchema.nullable()
20692
21169
  });
20693
- /** Deployed course blocks retain this schema alias for stored content. */
20694
- const publicCourseSchema = publicWholeSeriesOfferingSchema;
20695
- const publicCoursesArraySchema = z.array(publicWholeSeriesOfferingSchema);
21170
+ const publicWholeSeriesOfferingsArraySchema = z.array(publicWholeSeriesOfferingSchema);
20696
21171
  //#endregion
20697
21172
  //#region ../blocks/src/system/blocks/events/shared/schemas.ts
20698
21173
  const eventPresetSchema = z.enum([
@@ -20996,6 +21471,7 @@ const publicEventSchema = z.object({
20996
21471
  timeZone: z.string(),
20997
21472
  pricing: publicEventPricingSchema,
20998
21473
  paymentTerms: blockBookingPaymentTermsSchema,
21474
+ consent: blockBookingConsentSchema.nullable(),
20999
21475
  accessRestriction: accessRestrictionSchema,
21000
21476
  allowedCategoryIds: z.array(z.string()),
21001
21477
  requireGuestDetails: z.boolean().optional(),
@@ -21003,7 +21479,7 @@ const publicEventSchema = z.object({
21003
21479
  acceptsMemberships: z.boolean().optional(),
21004
21480
  wholeSeries: z.object({
21005
21481
  eventSeriesId: z.string(),
21006
- pricing: coursePricingSchema,
21482
+ pricing: wholeSeriesPricingSchema,
21007
21483
  currency: z.string(),
21008
21484
  enrollmentOpen: z.boolean()
21009
21485
  }).nullable().optional()
@@ -21012,24 +21488,19 @@ const publicEventSchema = z.object({
21012
21488
  * Schema for an array of public events
21013
21489
  */
21014
21490
  const publicEventsArraySchema = z.array(publicEventSchema);
21491
+ //#endregion
21492
+ //#region ../blocks/src/system/blocks/events/shared/fields.ts
21015
21493
  /**
21016
21494
  * Shared card styling fields for event blocks
21017
21495
  */
21018
21496
  const cardStylingFields = [
21019
- {
21020
- id: "cardVariant",
21021
- type: "select",
21497
+ cardStylesField({
21498
+ id: "_cardStyles",
21022
21499
  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
- },
21500
+ controls: "role-only",
21501
+ renderInHeader: false,
21502
+ intent: "style"
21503
+ }),
21033
21504
  createButtonVariantField({ description: "Choose a button style from your theme" }),
21034
21505
  {
21035
21506
  id: "buttonText",
@@ -21168,14 +21639,7 @@ function normalizeIdList(parts) {
21168
21639
  }
21169
21640
  //#endregion
21170
21641
  //#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
- ];
21642
+ const eventSurfacePresetValues = SURFACE_EVENT_PRESET_VALUES;
21179
21643
  const eventSurfaceScopeValues = [
21180
21644
  "all",
21181
21645
  "regularClassSchedule",
@@ -21356,6 +21820,25 @@ function resolveEventRegistrationScopedEvents(events, context) {
21356
21820
  return applyEventRegistrationScope(events, resolveEventRegistrationScope(context));
21357
21821
  }
21358
21822
  //#endregion
21823
+ //#region ../blocks/src/system/runtime/nodes/event-registration/registrationSurface.ts
21824
+ function planEventRegistrationScope(input) {
21825
+ const subject = input.subject;
21826
+ const selectedRunOffering = input.wholeSeriesOffering;
21827
+ if (subject?.kind !== "eventOffering" || !selectedRunOffering) return {
21828
+ kind: "context",
21829
+ events: resolveEventRegistrationScopedEvents(input.events, {
21830
+ occurrenceContext: input.occurrenceContext,
21831
+ subject
21832
+ })
21833
+ };
21834
+ if (!(selectedRunOffering.eventOfferingId === subject.eventOfferingId && subject.availableEventSeriesIds.some((seriesId) => seriesId === selectedRunOffering.eventSeriesId))) return { kind: "invalidSelectedRun" };
21835
+ return {
21836
+ kind: "selectedRun",
21837
+ events: input.events.filter((event) => event.seriesId === selectedRunOffering.eventSeriesId),
21838
+ offering: selectedRunOffering
21839
+ };
21840
+ }
21841
+ //#endregion
21359
21842
  //#region ../blocks/src/system/runtime/nodes/events/shared/destination.ts
21360
21843
  function isRecord$5(value) {
21361
21844
  return typeof value === "object" && value !== null && !Array.isArray(value);
@@ -21676,8 +22159,8 @@ const eventRegistrationHydrationSchemaShape = {
21676
22159
  occurrenceContext: occurrenceContextSchema.optional(),
21677
22160
  subject: eventRegistrationPageSurfaceSubjectSchema.nullable().optional(),
21678
22161
  events: z.array(eventRegistrationPublicEventSchema).nullable().optional(),
21679
- wholeSeriesOfferings: publicCoursesArraySchema.nullable().optional(),
21680
- wholeSeriesOffering: publicCourseSchema.nullable().optional(),
22162
+ wholeSeriesOfferings: publicWholeSeriesOfferingsArraySchema.nullable().optional(),
22163
+ wholeSeriesOffering: publicWholeSeriesOfferingSchema.nullable().optional(),
21681
22164
  maxTickets: z.string().optional(),
21682
22165
  showVenue: z.boolean().optional(),
21683
22166
  showCapacity: z.boolean().optional(),
@@ -21699,12 +22182,13 @@ const eventRegistrationSourceSchema = z.object({
21699
22182
  portalToken: z.string().nullable().optional(),
21700
22183
  previewToken: z.string().nullable().optional(),
21701
22184
  ...eventRegistrationHydrationSchemaShape,
22185
+ subjectWholeSeriesOffering: publicWholeSeriesOfferingSchema.nullable().optional(),
21702
22186
  className: z.string().nullable().optional(),
21703
22187
  buttonText: z.string().nullable().optional(),
21704
22188
  maxTickets: z.string().nullable().optional(),
21705
22189
  stage: previewStageSchema.optional()
21706
22190
  });
21707
- const eventRegistrationDisplaySchema = z.object({
22191
+ const eventRegistrationDisplaySchema = z.discriminatedUnion("state", [z.object({
21708
22192
  kind: z.literal("event-registration"),
21709
22193
  state: z.literal("generic-shell"),
21710
22194
  className: z.string().nullable(),
@@ -21712,7 +22196,13 @@ const eventRegistrationDisplaySchema = z.object({
21712
22196
  bodyText: z.string(),
21713
22197
  stepLabels: z.array(z.enum(EVENT_REGISTRATION_SHELL_STEP_LABELS)).min(1),
21714
22198
  summaryButtonText: z.string()
21715
- });
22199
+ }), z.object({
22200
+ kind: z.literal("event-registration"),
22201
+ state: z.literal("registration-closed"),
22202
+ className: z.string().nullable(),
22203
+ titleText: z.string(),
22204
+ bodyText: z.string()
22205
+ })]);
21716
22206
  const eventRegistrationHydrationSchema = z.object(eventRegistrationHydrationSchemaShape);
21717
22207
  const eventRegistrationRenderSchema = z.object({
21718
22208
  display: eventRegistrationDisplaySchema,
@@ -21726,6 +22216,13 @@ z.object({
21726
22216
  stage: previewStageSchema.optional()
21727
22217
  });
21728
22218
  function buildEventRegistrationDisplay(source) {
22219
+ if (resolveWholeSeriesOffering(source)?.enrollmentOpen === false) return {
22220
+ kind: "event-registration",
22221
+ state: "registration-closed",
22222
+ className: source.className ?? null,
22223
+ titleText: "Registration closed",
22224
+ bodyText: "This run is no longer open for bookings."
22225
+ };
21729
22226
  const stepLabels = buildEventRegistrationShellStepLabels(source);
21730
22227
  return {
21731
22228
  kind: "event-registration",
@@ -21737,6 +22234,9 @@ function buildEventRegistrationDisplay(source) {
21737
22234
  summaryButtonText: source.buttonText?.trim() || "Register"
21738
22235
  };
21739
22236
  }
22237
+ function resolveWholeSeriesOffering(source) {
22238
+ return source.wholeSeriesOffering ?? source.subjectWholeSeriesOffering ?? null;
22239
+ }
21740
22240
  function buildEventRegistrationShellStepLabels(source) {
21741
22241
  const scopedEvents = scopeEventRegistrationEvents(source);
21742
22242
  if (scopedEvents.length === 0) return EVENT_REGISTRATION_GENERIC_SHELL_STEP_LABELS;
@@ -21752,10 +22252,13 @@ function buildEventRegistrationShellStepLabels(source) {
21752
22252
  }) : false).map((step) => shellLabelForRegistrationStep(step, scopedEvents));
21753
22253
  }
21754
22254
  function scopeEventRegistrationEvents(source) {
21755
- return resolveEventRegistrationScopedEvents(toRegistrationEvents(source.events ?? []), {
22255
+ const scope = planEventRegistrationScope({
22256
+ events: toRegistrationEvents(source.events ?? []),
22257
+ wholeSeriesOffering: source.wholeSeriesOffering,
21756
22258
  occurrenceContext: source.occurrenceContext,
21757
22259
  subject: source.subject
21758
22260
  });
22261
+ return scope.kind === "invalidSelectedRun" ? [] : scope.events;
21759
22262
  }
21760
22263
  function shellLabelForRegistrationStep(step, events) {
21761
22264
  switch (step) {
@@ -21794,7 +22297,7 @@ const eventRegistrationBlockRuntime = defineClientOwnedBlockRuntime({
21794
22297
  subject: source.subject ?? null,
21795
22298
  events: source.events ?? null,
21796
22299
  wholeSeriesOfferings: source.wholeSeriesOfferings ?? null,
21797
- wholeSeriesOffering: source.wholeSeriesOffering ?? null,
22300
+ wholeSeriesOffering: resolveWholeSeriesOffering(source),
21798
22301
  maxTickets: source.maxTickets ?? void 0,
21799
22302
  showVenue: source.showVenue,
21800
22303
  showCapacity: source.showCapacity,
@@ -22015,7 +22518,9 @@ const eventRegistrationBlockDefinition = {
22015
22518
  fallback: false
22016
22519
  } },
22017
22520
  events: { $bind: { from: "data.events" } },
22018
- wholeSeriesOffering: { $bind: { from: "data.wholeSeriesOffering.offering" } },
22521
+ wholeSeriesOffering: { $bind: { from: "data.selectedRunOffering.offering" } },
22522
+ subjectWholeSeriesOffering: { $bind: { from: "data.subjectWholeSeriesOffering.offering" } },
22523
+ wholeSeriesOfferings: { $bind: { from: "data.wholeSeriesOfferings" } },
22019
22524
  sitePasses: { $bind: { from: "data.sitePasses" } },
22020
22525
  siteMemberships: { $bind: { from: "data.siteMemberships" } },
22021
22526
  stage: { $bind: {
@@ -22029,7 +22534,9 @@ const eventRegistrationBlockDefinition = {
22029
22534
  runtime: eventRegistrationBlockRuntime,
22030
22535
  dataSchemas: {
22031
22536
  events: publicEventsArraySchema.optional(),
22032
- wholeSeriesOffering: z.object({ offering: publicCourseSchema }).optional(),
22537
+ selectedRunOffering: z.object({ offering: publicWholeSeriesOfferingSchema }).optional(),
22538
+ subjectWholeSeriesOffering: z.object({ offering: publicWholeSeriesOfferingSchema }).optional(),
22539
+ wholeSeriesOfferings: z.array(publicWholeSeriesOfferingSchema).optional(),
22033
22540
  sitePasses: publicPassProductCollectionSchema.optional(),
22034
22541
  siteMemberships: publicMembershipProductCollectionSchema.optional(),
22035
22542
  occurrenceContext: occurrenceContextSchema.optional()
@@ -22046,11 +22553,29 @@ const eventRegistrationBlockDefinition = {
22046
22553
  } },
22047
22554
  readProfile: "registration",
22048
22555
  seriesId: { $bind: { from: "$root.subject.eventSeriesId" } },
22556
+ seriesIds: { $bind: {
22557
+ from: "$root.subject.availableEventSeriesIds",
22558
+ transforms: [{ id: "value.csv" }]
22559
+ } },
22560
+ runSeriesId: { $bind: { from: "$root.entrySubrouteContext.run.seriesId" } },
22049
22561
  includeOccurrenceId: { $bind: { from: "$root.occurrenceContext.id" } }
22050
22562
  },
22051
22563
  mode: "server"
22052
22564
  },
22053
- wholeSeriesOffering: {
22565
+ selectedRunOffering: {
22566
+ endpoint: "getPublicWholeSeriesOffering",
22567
+ params: {
22568
+ siteId: { $bind: { from: "$root.siteId" } },
22569
+ eventSeriesId: { $bind: { from: "$root.entrySubrouteContext.run.seriesId" } },
22570
+ stage: { $bind: {
22571
+ from: "$root.previewStage",
22572
+ fallback: "published"
22573
+ } }
22574
+ },
22575
+ requiredParams: ["eventSeriesId"],
22576
+ mode: "server"
22577
+ },
22578
+ subjectWholeSeriesOffering: {
22054
22579
  endpoint: "getPublicWholeSeriesOffering",
22055
22580
  when: { $bind: {
22056
22581
  from: "$root.subject.isWholeSeriesBooking",
@@ -22067,6 +22592,22 @@ const eventRegistrationBlockDefinition = {
22067
22592
  requiredParams: ["eventSeriesId"],
22068
22593
  mode: "server"
22069
22594
  },
22595
+ wholeSeriesOfferings: {
22596
+ endpoint: "listPublicWholeSeriesOfferings",
22597
+ params: {
22598
+ siteId: { $bind: { from: "$root.siteId" } },
22599
+ eventSeriesIds: { $bind: {
22600
+ from: "$root.subject.availableEventSeriesIds",
22601
+ transforms: [{ id: "value.csv" }]
22602
+ } },
22603
+ stage: { $bind: {
22604
+ from: "$root.previewStage",
22605
+ fallback: "published"
22606
+ } }
22607
+ },
22608
+ requiredParams: ["eventSeriesIds"],
22609
+ mode: "server"
22610
+ },
22070
22611
  sitePasses: {
22071
22612
  endpoint: "listPublicPasses",
22072
22613
  params: { siteId: { $bind: { from: "$root.siteId" } } },
@@ -22081,13 +22622,9 @@ const eventRegistrationBlockDefinition = {
22081
22622
  };
22082
22623
  //#endregion
22083
22624
  //#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(),
22625
+ const courseRegistrationHydrationSchemaShape = {
22088
22626
  subject: eventRegistrationPageSurfaceSubjectSchema.nullable().optional(),
22089
- courses: z.array(publicCourseSchema).nullable().optional(),
22090
- className: z.string().nullable().optional(),
22627
+ courses: z.array(publicWholeSeriesOfferingSchema).nullable().optional(),
22091
22628
  showSessions: z.boolean().optional(),
22092
22629
  showPrice: z.boolean().optional(),
22093
22630
  showCapacity: z.boolean().optional(),
@@ -22095,8 +22632,15 @@ const courseRegistrationSourceSchema = z.object({
22095
22632
  successMessage: z.string().optional(),
22096
22633
  waitlistMessage: z.string().optional(),
22097
22634
  membershipMessage: z.string().optional(),
22635
+ buttonVariant: registrationButtonVariantSchema.optional()
22636
+ };
22637
+ const courseRegistrationSourceSchema = z.object({
22638
+ siteId: z.string().optional(),
22639
+ apiBaseUrl: z.string().optional(),
22640
+ portalToken: z.string().nullable().optional(),
22641
+ ...courseRegistrationHydrationSchemaShape,
22642
+ className: z.string().nullable().optional(),
22098
22643
  buttonText: z.string().nullable().optional(),
22099
- buttonVariant: registrationButtonVariantSchema.optional(),
22100
22644
  stage: previewStageSchema.optional()
22101
22645
  });
22102
22646
  const courseRegistrationDisplaySchema = z.object({
@@ -22105,18 +22649,7 @@ const courseRegistrationDisplaySchema = z.object({
22105
22649
  className: z.string().nullable(),
22106
22650
  summaryButtonText: z.string()
22107
22651
  });
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
- });
22652
+ const courseRegistrationHydrationSchema = z.object(courseRegistrationHydrationSchemaShape);
22120
22653
  const courseRegistrationRenderSchema = z.object({
22121
22654
  display: courseRegistrationDisplaySchema,
22122
22655
  hydration: courseRegistrationHydrationSchema
@@ -22321,7 +22854,7 @@ const courseRegistrationBlockDefinition = {
22321
22854
  })]
22322
22855
  }),
22323
22856
  runtime: courseRegistrationBlockRuntime,
22324
- dataSchemas: { courses: publicCoursesArraySchema.optional() },
22857
+ dataSchemas: { courses: publicWholeSeriesOfferingsArraySchema.optional() },
22325
22858
  dataLoaders: { courses: {
22326
22859
  endpoint: "listPublicWholeSeriesOfferings",
22327
22860
  params: {
@@ -22392,6 +22925,22 @@ const eventDetailsManifest = createBlockManifest({
22392
22925
  defaultValue: true,
22393
22926
  ui: { intent: "display" }
22394
22927
  },
22928
+ {
22929
+ id: "showTitle",
22930
+ type: "boolean",
22931
+ label: "Show event title",
22932
+ required: false,
22933
+ defaultValue: false,
22934
+ ui: { intent: "display" }
22935
+ },
22936
+ {
22937
+ id: "showDescription",
22938
+ type: "boolean",
22939
+ label: "Show event description",
22940
+ required: false,
22941
+ defaultValue: false,
22942
+ ui: { intent: "display" }
22943
+ },
22395
22944
  {
22396
22945
  id: "showMap",
22397
22946
  type: "boolean",
@@ -22428,10 +22977,22 @@ const eventDetailsManifest = createBlockManifest({
22428
22977
  {
22429
22978
  value: "10",
22430
22979
  label: "10 dates"
22980
+ },
22981
+ {
22982
+ value: "all",
22983
+ label: "All dates"
22431
22984
  }
22432
22985
  ],
22433
22986
  ui: { intent: "display" }
22434
22987
  },
22988
+ {
22989
+ id: "showCapacity",
22990
+ type: "boolean",
22991
+ label: "Show capacity",
22992
+ required: false,
22993
+ defaultValue: false,
22994
+ ui: { intent: "display" }
22995
+ },
22435
22996
  {
22436
22997
  id: "showCost",
22437
22998
  type: "boolean",
@@ -22474,6 +23035,8 @@ const eventDetailsManifest = createBlockManifest({
22474
23035
  } },
22475
23036
  events: { $bind: { from: "data.eventDetailsData.events" } },
22476
23037
  showVenue: { $bind: { from: "content.showVenue" } },
23038
+ showTitle: { $bind: { from: "content.showTitle" } },
23039
+ showDescription: { $bind: { from: "content.showDescription" } },
22477
23040
  showMap: { $bind: { from: "content.showMap" } },
22478
23041
  showOtherDates: { $bind: { from: "content.showOtherDates" } },
22479
23042
  otherDatesLimit: { $bind: {
@@ -22484,6 +23047,10 @@ const eventDetailsManifest = createBlockManifest({
22484
23047
  from: "content.showCost",
22485
23048
  fallback: true
22486
23049
  } },
23050
+ showCapacity: { $bind: {
23051
+ from: "content.showCapacity",
23052
+ fallback: false
23053
+ } },
22487
23054
  showAcceptedPasses: { $bind: {
22488
23055
  from: "content.showAcceptedPasses",
22489
23056
  fallback: true
@@ -22538,6 +23105,11 @@ const eventDetailsBlockDefinition = {
22538
23105
  limit: "100",
22539
23106
  readProfile: "details",
22540
23107
  seriesId: { $bind: { from: "$root.subject.eventSeriesId" } },
23108
+ seriesIds: { $bind: {
23109
+ from: "$root.subject.availableEventSeriesIds",
23110
+ transforms: [{ id: "value.csv" }]
23111
+ } },
23112
+ runSeriesId: { $bind: { from: "$root.entrySubrouteContext.run.seriesId" } },
22541
23113
  includeOccurrenceId: { $bind: { from: "$root.occurrenceContext.id" } }
22542
23114
  },
22543
23115
  mode: "server"
@@ -22723,7 +23295,7 @@ const courseDetailsBlockDefinition = {
22723
23295
  })], { gap: "lg" })
22724
23296
  })]
22725
23297
  }),
22726
- dataSchemas: { courses: publicCoursesArraySchema.optional() },
23298
+ dataSchemas: { courses: publicWholeSeriesOfferingsArraySchema.optional() },
22727
23299
  dataLoaders: { courses: {
22728
23300
  endpoint: "listPublicWholeSeriesOfferings",
22729
23301
  params: {
@@ -22842,8 +23414,8 @@ const eventSpotlightBlockDefinition = {
22842
23414
  from: "content.columns",
22843
23415
  fallback: "3"
22844
23416
  } },
22845
- cardVariant: { $bind: {
22846
- from: "content.cardVariant",
23417
+ cardRole: { $bind: {
23418
+ from: "content._cardStyles.role",
22847
23419
  fallback: "default"
22848
23420
  } },
22849
23421
  buttonVariant: { $bind: {
@@ -23005,6 +23577,7 @@ const eventCollectionSourceSchemaShape = {
23005
23577
  showVenue: z.boolean().nullable().optional(),
23006
23578
  showMap: z.boolean().nullable().optional(),
23007
23579
  showCapacity: z.boolean().nullable().optional(),
23580
+ cardRole: cardRoleSchema.optional(),
23008
23581
  buttonVariant: eventButtonVariantSchema.optional(),
23009
23582
  buttonText: z.string().optional(),
23010
23583
  emptyMessage: z.string().optional(),
@@ -23032,6 +23605,7 @@ const eventCollectionDisplaySchemaShape = {
23032
23605
  showVenue: z.boolean(),
23033
23606
  showMap: z.boolean(),
23034
23607
  showCapacity: z.boolean(),
23608
+ cardRole: cardRoleSchema,
23035
23609
  buttonVariant: eventButtonVariantSchema,
23036
23610
  buttonText: z.string(),
23037
23611
  emptyMessage: z.string()
@@ -23081,6 +23655,7 @@ function buildEventCollectionPresentationDisplay(source) {
23081
23655
  showVenue: source.showVenue ?? true,
23082
23656
  showMap: source.showMap ?? true,
23083
23657
  showCapacity: source.showCapacity ?? true,
23658
+ cardRole: source.cardRole ?? "default",
23084
23659
  buttonVariant: source.buttonVariant ?? "primary",
23085
23660
  buttonText: source.buttonText ?? "Book",
23086
23661
  emptyMessage: source.emptyMessage ?? "No upcoming events scheduled."
@@ -23098,8 +23673,6 @@ function buildEventCollectionHydration(source) {
23098
23673
  }
23099
23674
  //#endregion
23100
23675
  //#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
23676
  const cardOrientationSchema = z.enum(["vertical", "horizontal"]);
23104
23677
  const eventSurfaceScopeSchema = z.enum(eventSurfaceScopeValues);
23105
23678
  const eventScheduleScopeSchema = z.enum(eventScheduleScopeValues);
@@ -23114,7 +23687,7 @@ const eventListingSourceSchema = z.object({
23114
23687
  paginationMode: z.enum(["loadMore", "seeAllLink"]).optional(),
23115
23688
  seeAllUrl: z.string().optional(),
23116
23689
  loadMoreText: z.string().optional(),
23117
- cardVariant: eventCardVariantInputSchema.optional(),
23690
+ cardRole: cardRoleSchema.optional(),
23118
23691
  buttonVariant: eventButtonVariantSchema.optional(),
23119
23692
  buttonText: z.string().optional(),
23120
23693
  showVenue: z.boolean().optional(),
@@ -23136,7 +23709,7 @@ const eventListingDisplaySchema = z.object({
23136
23709
  emptyMessage: z.string(),
23137
23710
  loadingMessage: z.string(),
23138
23711
  containerClass: z.string(),
23139
- cardVariant: cardVariantRoleSchema,
23712
+ cardRole: cardRoleSchema,
23140
23713
  buttonVariant: eventButtonVariantSchema,
23141
23714
  buttonText: z.string(),
23142
23715
  showVenue: z.boolean(),
@@ -23192,7 +23765,7 @@ const eventListingBlockRuntime = defineProgressiveBlockRuntime({
23192
23765
  emptyMessage: source.emptyMessage ?? "No upcoming events scheduled.",
23193
23766
  loadingMessage: "Loading events…",
23194
23767
  containerClass: getContainerClass(layout, source.columns ?? "3"),
23195
- cardVariant: normalizeCardVariantRole(source.cardVariant) ?? "default",
23768
+ cardRole: source.cardRole ?? "default",
23196
23769
  buttonVariant: source.buttonVariant ?? "primary",
23197
23770
  buttonText: source.buttonText ?? "Book",
23198
23771
  showVenue: source.showVenue ?? true,
@@ -23514,8 +24087,8 @@ const eventListingBlockDefinition = {
23514
24087
  from: "content.loadMoreText",
23515
24088
  fallback: "Load more events"
23516
24089
  } },
23517
- cardVariant: { $bind: {
23518
- from: "content.cardVariant",
24090
+ cardRole: { $bind: {
24091
+ from: "content._cardStyles.role",
23519
24092
  fallback: "default"
23520
24093
  } },
23521
24094
  buttonVariant: { $bind: {
@@ -23785,6 +24358,10 @@ const eventCalendarLayout = [styledSection({
23785
24358
  filterCategoryIds: { $bind: { from: "content.filterCategoryIds" } },
23786
24359
  filterStaffMemberId: { $bind: { from: "content.filterStaffMemberId" } },
23787
24360
  filterVenueId: { $bind: { from: "content.filterVenueId" } },
24361
+ cardRole: { $bind: {
24362
+ from: "content._cardStyles.role",
24363
+ fallback: "default"
24364
+ } },
23788
24365
  buttonVariant: { $bind: {
23789
24366
  from: "content.buttonVariant",
23790
24367
  fallback: "primary"
@@ -24417,11 +24994,11 @@ const eventCalendarAdditionalFields = [
24417
24994
  searchThreshold: 8
24418
24995
  }
24419
24996
  }),
24420
- ...cardStylingFields.filter((f) => f.id === "buttonVariant" || f.id === "buttonText").map((field) => ({
24997
+ ...cardStylingFields.map((field) => ({
24421
24998
  ...field,
24422
24999
  ui: {
24423
25000
  ...field.ui ?? {},
24424
- intent: field.id === "buttonVariant" ? "style" : "content"
25001
+ intent: field.id === "_cardStyles" || field.id === "buttonVariant" ? "style" : "content"
24425
25002
  }
24426
25003
  })),
24427
25004
  {
@@ -24805,6 +25382,68 @@ const recurringScheduleBlockDefinition = {
24805
25382
  } }
24806
25383
  };
24807
25384
  //#endregion
25385
+ //#region ../blocks/src/system/types/link.ts
25386
+ const nullableString = z.union([z.string().min(1), z.null()]);
25387
+ const RESOLVED_INTERNAL_LINK_ENTITY_TYPES = [
25388
+ "page",
25389
+ "content",
25390
+ "pageSurface"
25391
+ ];
25392
+ const resolvedInternalLinkKeys = [
25393
+ "entityId",
25394
+ "entityType",
25395
+ "href",
25396
+ "title",
25397
+ "typeLabel"
25398
+ ];
25399
+ const internalRouteOnlyLinkSchema = z.object({
25400
+ kind: z.literal("internal"),
25401
+ routeId: z.string().min(1)
25402
+ }).passthrough().superRefine((value, ctx) => {
25403
+ if (!resolvedInternalLinkKeys.some((key) => value[key] != null)) return;
25404
+ ctx.addIssue({
25405
+ code: "custom",
25406
+ message: "Internal links with resolved metadata must include entityId, entityType, href, title, and typeLabel"
25407
+ });
25408
+ });
25409
+ const internalResolvedLinkSchema = z.object({
25410
+ kind: z.literal("internal"),
25411
+ routeId: z.string().min(1),
25412
+ entityId: z.string().min(1),
25413
+ entityType: z.enum(RESOLVED_INTERNAL_LINK_ENTITY_TYPES),
25414
+ href: z.string().min(1),
25415
+ title: z.string().min(1),
25416
+ typeLabel: z.string().min(1),
25417
+ contentTypeKey: nullableString.optional(),
25418
+ contentTypeName: nullableString.optional(),
25419
+ updatedAt: nullableString.optional()
25420
+ }).passthrough();
25421
+ const internalLinkSchema = z.union([internalResolvedLinkSchema, internalRouteOnlyLinkSchema]);
25422
+ const externalLinkSchema = z.object({
25423
+ kind: z.literal("external"),
25424
+ href: z.string().min(1)
25425
+ }).passthrough();
25426
+ const customLinkSchema = z.object({
25427
+ kind: z.literal("url"),
25428
+ href: z.string().min(1)
25429
+ }).passthrough();
25430
+ const pageLinkSchema = z.object({
25431
+ kind: z.literal("page"),
25432
+ identifier: z.string().min(1)
25433
+ }).passthrough();
25434
+ const entryLinkSchema = z.object({
25435
+ kind: z.literal("entry"),
25436
+ contentType: z.string().min(1),
25437
+ identifier: z.string().min(1)
25438
+ }).passthrough();
25439
+ z.union([
25440
+ internalLinkSchema,
25441
+ externalLinkSchema,
25442
+ customLinkSchema,
25443
+ pageLinkSchema,
25444
+ entryLinkSchema
25445
+ ]);
25446
+ //#endregion
24808
25447
  //#region ../blocks/src/system/blocks/offerings-preview/model.ts
24809
25448
  const OFFERINGS_PREVIEW_DEFAULT_BUTTON_TEXT = "Book";
24810
25449
  const OFFERINGS_PREVIEW_DEFAULT_EMPTY_MESSAGE = "Nothing scheduled just yet.";
@@ -24894,7 +25533,7 @@ const publicRouteCandidatesSchema = z.object({ routes: z.array(z.object({
24894
25533
  entityId: z.string(),
24895
25534
  path: z.string(),
24896
25535
  title: z.string(),
24897
- kind: z.enum(["page", "content"]),
25536
+ kind: z.enum(RESOLVED_INTERNAL_LINK_ENTITY_TYPES),
24898
25537
  contentTypeKey: z.string().nullable().optional()
24899
25538
  })) });
24900
25539
  const groupOverrideFields = [
@@ -25188,7 +25827,7 @@ const offeringsPreviewBlockDefinition = {
25188
25827
  dataSchemas: {
25189
25828
  ...offeringsPreviewEventDataSchemas,
25190
25829
  routeCandidates: publicRouteCandidatesSchema.optional(),
25191
- courses: publicCoursesArraySchema.optional()
25830
+ courses: publicWholeSeriesOfferingsArraySchema.optional()
25192
25831
  },
25193
25832
  dataLoaders: {
25194
25833
  ...offeringsPreviewEventDataLoaders,
@@ -26660,7 +27299,7 @@ const audioPlayerBlockDefinition = { manifest: createBlockManifest({
26660
27299
  }
26661
27300
  ],
26662
27301
  layout: styledSection({
26663
- children: stack({ className: "rb-container rb-mx-auto rb-max-w-3xl" }, [el("div", { className: "card-role-default" }, [media({
27302
+ children: stack({ className: "rb-container rb-mx-auto rb-max-w-3xl" }, [el("div", { className: boxStyleClassNames({ role: "default" }, {}) }, [media({
26664
27303
  className: "card-media rb-aspect-video rb-w-full rb-object-cover",
26665
27304
  size: {
26666
27305
  width: 960,
@@ -29712,16 +30351,27 @@ function eventListCapable() {
29712
30351
  looks: "supported",
29713
30352
  sectionSurfaces: "supported",
29714
30353
  contentFrames: ["plain", "panel"],
29715
- cardRoles: "unsupported",
30354
+ cardRoles: "supported",
29716
30355
  eventListTreatments
29717
30356
  });
29718
30357
  }
30358
+ function eventSpotlightCapable() {
30359
+ return declareBlockDesignCapability({
30360
+ sectionSurfaces: "supported",
30361
+ contentFrames: ["plain"],
30362
+ cardRoles: "supported"
30363
+ });
30364
+ }
29719
30365
  function offeringsPreviewCapable() {
29720
30366
  return declareBlockDesignCapability({
29721
30367
  looks: "supported",
29722
30368
  sectionSurfaces: "supported",
29723
30369
  contentFrames: ["plain"],
29724
- cardRoles: "supported"
30370
+ cardRoles: "supported",
30371
+ compositions: {
30372
+ kind: "offerings-preview",
30373
+ treatments: offeringsPreviewCompositionTreatmentValues
30374
+ }
29725
30375
  });
29726
30376
  }
29727
30377
  function defaultBoundaryBias(visualWeight) {
@@ -30014,7 +30664,7 @@ const systemBlockDefinitions = [
30014
30664
  cardRoles: "supported",
30015
30665
  compositions: {
30016
30666
  kind: "testimonials",
30017
- treatments: ["open-editorial"]
30667
+ treatments: testimonialsCompositionTreatmentValues
30018
30668
  },
30019
30669
  headingDecorationCapability: {
30020
30670
  kind: "supported",
@@ -30169,7 +30819,7 @@ const systemBlockDefinitions = [
30169
30819
  weight: "standard"
30170
30820
  })]
30171
30821
  })),
30172
- withDesignCapability("block.event-spotlight", eventSpotlightBlockDefinition, sectionOnly(), defineBlockDesignMetadata({
30822
+ withDesignCapability("block.event-spotlight", eventSpotlightBlockDefinition, eventSpotlightCapable(), defineBlockDesignMetadata({
30173
30823
  flow: offeringsFlow,
30174
30824
  layoutProfiles: [layoutProfile({
30175
30825
  variantKey: "default",