@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
@@ -1377,6 +1377,17 @@ const PUBLIC_WHOLE_SERIES_ENDPOINT_DEFINITIONS = defineEndpointDefinitions({
1377
1377
  }
1378
1378
  });
1379
1379
  //#endregion
1380
+ //#region ../api/src/publicEventEndpointDefinitions.ts
1381
+ const PUBLIC_EVENT_ENDPOINT_DEFINITIONS = defineEndpointDefinitions({ resolveEventSubroute: {
1382
+ path: "/public/sites/{siteId}/events/subroutes/resolve",
1383
+ method: "GET",
1384
+ revalidate: 60,
1385
+ tags: [TAG_TEMPLATES.publicEvents, "event-subroute"],
1386
+ auth: "public",
1387
+ responseKind: "json",
1388
+ errors: []
1389
+ } });
1390
+ //#endregion
1380
1391
  //#region ../api/src/siteApiKeyEndpointDefinitions.ts
1381
1392
  const SITE_API_KEY_ENDPOINT_DEFINITIONS = defineEndpointDefinitions({
1382
1393
  listSiteApiKeys: {
@@ -1503,13 +1514,249 @@ const EVENT_MANAGEMENT_ENDPOINT_DEFINITIONS = defineEndpointDefinitions({
1503
1514
  "resource:conflict",
1504
1515
  "server:internal_error"
1505
1516
  ]
1517
+ },
1518
+ updateEventIdentity: {
1519
+ path: "/sites/{siteId}/bookings/events/{eventId}",
1520
+ method: "PATCH",
1521
+ tags: ["site-{siteId}", "event-series-{siteId}"],
1522
+ auth: "user",
1523
+ responseKind: "json",
1524
+ errors: [
1525
+ "validation:invalid_input",
1526
+ "resource:not_found",
1527
+ "server:internal_error"
1528
+ ]
1529
+ },
1530
+ createWholeSeriesRun: {
1531
+ path: "/sites/{siteId}/bookings/events/{eventId}/runs",
1532
+ method: "POST",
1533
+ tags: ["site-{siteId}", "event-series-{siteId}"],
1534
+ auth: "user",
1535
+ responseKind: "json",
1536
+ errors: [
1537
+ "validation:invalid_input",
1538
+ "resource:not_found",
1539
+ "resource:already_exists",
1540
+ "server:internal_error"
1541
+ ]
1542
+ },
1543
+ updateWholeSeriesRun: {
1544
+ path: "/sites/{siteId}/bookings/events/{eventId}/runs/{runId}",
1545
+ method: "PATCH",
1546
+ tags: ["site-{siteId}", "event-series-{siteId}"],
1547
+ auth: "user",
1548
+ responseKind: "json",
1549
+ errors: [
1550
+ "validation:invalid_input",
1551
+ "resource:not_found",
1552
+ "resource:conflict",
1553
+ "server:internal_error"
1554
+ ]
1555
+ },
1556
+ cancelWholeSeriesRun: {
1557
+ path: "/sites/{siteId}/bookings/events/{eventId}/runs/{runId}/cancellation",
1558
+ method: "POST",
1559
+ tags: ["site-{siteId}", "event-series-{siteId}"],
1560
+ auth: "user",
1561
+ responseKind: "json",
1562
+ errors: [
1563
+ "validation:invalid_input",
1564
+ "resource:not_found",
1565
+ "resource:conflict",
1566
+ "server:internal_error"
1567
+ ]
1568
+ }
1569
+ });
1570
+ //#endregion
1571
+ //#region ../api/src/giftingEndpointDefinitions.ts
1572
+ /**
1573
+ * Gifting endpoints (gift cards & vouchers) — the dashboard surface that manages
1574
+ * offers, gifts and settings, plus the public buy/claim surface.
1575
+ */
1576
+ const GIFTING_ENDPOINT_DEFINITIONS = defineEndpointDefinitions({
1577
+ createGiftingOffer: {
1578
+ path: "/sites/{siteId}/gifting/offers",
1579
+ method: "POST",
1580
+ tags: ["site-{siteId}", "gifting-offers-{siteId}"],
1581
+ auth: "user",
1582
+ responseKind: "json",
1583
+ errors: [
1584
+ "validation:invalid_input",
1585
+ "auth:forbidden",
1586
+ "server:internal_error"
1587
+ ]
1588
+ },
1589
+ updateGiftingOffer: {
1590
+ path: "/sites/{siteId}/gifting/offers/{offerId}",
1591
+ method: "PATCH",
1592
+ tags: ["site-{siteId}", "gifting-offers-{siteId}"],
1593
+ auth: "user",
1594
+ responseKind: "json",
1595
+ errors: [
1596
+ "validation:invalid_input",
1597
+ "auth:forbidden",
1598
+ "resource:not_found",
1599
+ "resource:conflict",
1600
+ "server:internal_error"
1601
+ ]
1602
+ },
1603
+ deleteGiftingOffer: {
1604
+ path: "/sites/{siteId}/gifting/offers/{offerId}",
1605
+ method: "DELETE",
1606
+ tags: ["site-{siteId}", "gifting-offers-{siteId}"],
1607
+ auth: "user",
1608
+ responseKind: "json",
1609
+ errors: [
1610
+ "auth:forbidden",
1611
+ "resource:not_found",
1612
+ "resource:conflict",
1613
+ "server:internal_error"
1614
+ ]
1615
+ },
1616
+ duplicateGiftingOffer: {
1617
+ path: "/sites/{siteId}/gifting/offers/{offerId}/duplicate",
1618
+ method: "POST",
1619
+ tags: ["site-{siteId}", "gifting-offers-{siteId}"],
1620
+ auth: "user",
1621
+ responseKind: "json",
1622
+ errors: [
1623
+ "auth:forbidden",
1624
+ "resource:not_found",
1625
+ "server:internal_error"
1626
+ ]
1627
+ },
1628
+ reorderGiftingOffers: {
1629
+ path: "/sites/{siteId}/gifting/offers/order",
1630
+ method: "PUT",
1631
+ tags: ["site-{siteId}", "gifting-offers-{siteId}"],
1632
+ auth: "user",
1633
+ responseKind: "json",
1634
+ errors: [
1635
+ "validation:invalid_input",
1636
+ "auth:forbidden",
1637
+ "resource:not_found",
1638
+ "server:internal_error"
1639
+ ]
1640
+ },
1641
+ sendGift: {
1642
+ path: "/sites/{siteId}/gifting/gifts",
1643
+ method: "POST",
1644
+ tags: ["site-{siteId}", "gifting-gifts-{siteId}"],
1645
+ auth: "user",
1646
+ demoMutation: DEMO_MUTATION_BLOCKED_HIDDEN,
1647
+ responseKind: "json",
1648
+ errors: [
1649
+ "validation:invalid_input",
1650
+ "auth:forbidden",
1651
+ "resource:not_found",
1652
+ "server:internal_error"
1653
+ ]
1654
+ },
1655
+ resendGift: {
1656
+ path: "/sites/{siteId}/gifting/gifts/{giftId}/resend",
1657
+ method: "POST",
1658
+ tags: ["site-{siteId}", "gifting-gifts-{siteId}"],
1659
+ auth: "user",
1660
+ demoMutation: DEMO_MUTATION_BLOCKED_HIDDEN,
1661
+ responseKind: "json",
1662
+ errors: [
1663
+ "auth:forbidden",
1664
+ "resource:not_found",
1665
+ "resource:conflict",
1666
+ "server:internal_error"
1667
+ ]
1668
+ },
1669
+ correctGiftEmailAndResend: {
1670
+ path: "/sites/{siteId}/gifting/gifts/{giftId}/correct-email-and-resend",
1671
+ method: "POST",
1672
+ tags: ["site-{siteId}", "gifting-gifts-{siteId}"],
1673
+ auth: "user",
1674
+ demoMutation: DEMO_MUTATION_BLOCKED_HIDDEN,
1675
+ responseKind: "json",
1676
+ errors: [
1677
+ "validation:invalid_input",
1678
+ "auth:forbidden",
1679
+ "resource:not_found",
1680
+ "resource:conflict",
1681
+ "server:internal_error"
1682
+ ]
1683
+ },
1684
+ updateGiftingSettings: {
1685
+ path: "/sites/{siteId}/gifting/settings",
1686
+ method: "PATCH",
1687
+ tags: [
1688
+ "site-{siteId}",
1689
+ "gifting-offers-{siteId}",
1690
+ "gifting-gifts-{siteId}"
1691
+ ],
1692
+ auth: "user",
1693
+ responseKind: "json",
1694
+ errors: [
1695
+ "validation:invalid_input",
1696
+ "auth:forbidden",
1697
+ "server:internal_error"
1698
+ ]
1699
+ },
1700
+ listPublicGiftingOffers: {
1701
+ path: "/public/sites/{siteId}/gifting/offers",
1702
+ method: "GET",
1703
+ revalidate: 300,
1704
+ tags: [TAG_TEMPLATES.publicGifting],
1705
+ errors: [],
1706
+ auth: "public",
1707
+ responseKind: "json"
1708
+ },
1709
+ createPublicGiftingCheckout: {
1710
+ path: "/public/sites/{siteId}/gifting/checkout",
1711
+ method: "POST",
1712
+ tags: [TAG_TEMPLATES.publicGifting],
1713
+ errors: [],
1714
+ auth: "public",
1715
+ responseKind: "json"
1716
+ },
1717
+ claimGiftCardPublic: {
1718
+ path: "/public/sites/{siteId}/gifting/claim",
1719
+ method: "POST",
1720
+ tags: [TAG_TEMPLATES.publicGifting],
1721
+ errors: [],
1722
+ auth: "public",
1723
+ responseKind: "json"
1506
1724
  }
1507
1725
  });
1508
- ({ ...ACCOUNT_ENDPOINT_DEFINITIONS }), TAG_TEMPLATES.siteCollection, TAG_TEMPLATES.siteTheme, TAG_TEMPLATES.siteCollection, { ...SITE_API_KEY_ENDPOINT_DEFINITIONS }, TAG_TEMPLATES.site, TAG_TEMPLATES.siteBookingSettings, TAG_TEMPLATES.site, TAG_TEMPLATES.siteBookingSettings, TAG_TEMPLATES.site, TAG_TEMPLATES.siteEmailSettings, TAG_TEMPLATES.site, TAG_TEMPLATES.siteEmailSettings, TAG_TEMPLATES.site, TAG_TEMPLATES.siteEmailSettings, TAG_TEMPLATES.site, TAG_TEMPLATES.siteEmailSettings, {
1726
+ //#endregion
1727
+ //#region ../api/src/sdkEndpointDefinitions.ts
1728
+ /** SDK management endpoints that do not belong to a CRUD resource family. */
1729
+ const SDK_ENDPOINT_DEFINITIONS = defineEndpointDefinitions({
1730
+ sdkUpdateSettings: {
1731
+ path: "/sdk/{siteId}/settings",
1732
+ method: "PATCH",
1733
+ auth: "service",
1734
+ responseKind: "json",
1735
+ errors: ["validation:invalid_input", "server:internal_error"]
1736
+ },
1737
+ sdkConfigureBookingVertical: {
1738
+ path: "/sdk/{siteId}/settings/booking/vertical",
1739
+ method: "POST",
1740
+ auth: "service",
1741
+ responseKind: "json"
1742
+ },
1743
+ sdkSetupRevalidationWebhook: {
1744
+ path: "/sdk/{siteId}/webhooks/revalidation/setup",
1745
+ method: "POST",
1746
+ auth: "service",
1747
+ responseKind: "json",
1748
+ errors: ["validation:invalid_input", "server:internal_error"]
1749
+ }
1750
+ });
1751
+ ({
1752
+ ...ACCOUNT_ENDPOINT_DEFINITIONS,
1753
+ ...PUBLIC_EVENT_ENDPOINT_DEFINITIONS,
1754
+ ...GIFTING_ENDPOINT_DEFINITIONS
1755
+ }), TAG_TEMPLATES.siteCollection, TAG_TEMPLATES.siteTheme, TAG_TEMPLATES.siteCollection, { ...SITE_API_KEY_ENDPOINT_DEFINITIONS }, TAG_TEMPLATES.site, TAG_TEMPLATES.siteBookingSettings, TAG_TEMPLATES.site, TAG_TEMPLATES.siteBookingSettings, TAG_TEMPLATES.site, TAG_TEMPLATES.siteEmailSettings, TAG_TEMPLATES.site, TAG_TEMPLATES.siteEmailSettings, TAG_TEMPLATES.site, TAG_TEMPLATES.siteEmailSettings, TAG_TEMPLATES.site, TAG_TEMPLATES.siteEmailSettings, {
1509
1756
  ...NEWSLETTER_ENDPOINT_DEFINITIONS,
1510
1757
  ...APPOINTMENT_ENDPOINT_DEFINITIONS,
1511
1758
  ...COURSE_ENDPOINT_DEFINITIONS
1512
- }, TAG_TEMPLATES.siteCollection, TAG_TEMPLATES.siteById, TAG_TEMPLATES.siteBySlug, TAG_TEMPLATES.siteByDomain, TAG_TEMPLATES.siteCollection, TAG_TEMPLATES.siteById, TAG_TEMPLATES.siteBySlug, TAG_TEMPLATES.siteByDomain, TAG_TEMPLATES.siteCollection, TAG_TEMPLATES.pageSurfaceById, TAG_TEMPLATES.siteCollection, TAG_TEMPLATES.pageSurfaceById, TAG_TEMPLATES.siteCollection, TAG_TEMPLATES.siteRoutableContent, TAG_TEMPLATES.pageSurfaceById, TAG_TEMPLATES.siteCollection, TAG_TEMPLATES.siteRoutableContent, TAG_TEMPLATES.pageSurfaceById, TAG_TEMPLATES.workflowRunById, TAG_TEMPLATES.siteCollection, TAG_TEMPLATES.siteRoutableContent, TAG_TEMPLATES.routeById, TAG_TEMPLATES.site, TAG_TEMPLATES.siteSettings, TAG_TEMPLATES.siteCollection, TAG_TEMPLATES.site, TAG_TEMPLATES.siteSettings, TAG_TEMPLATES.siteCollection, TAG_TEMPLATES.site, TAG_TEMPLATES.siteSettings, TAG_TEMPLATES.siteCollection, TAG_TEMPLATES.site, TAG_TEMPLATES.site, TAG_TEMPLATES.siteSettings, TAG_TEMPLATES.site, TAG_TEMPLATES.siteSettings, TAG_TEMPLATES.site, TAG_TEMPLATES.siteSettings, TAG_TEMPLATES.site, TAG_TEMPLATES.siteSettings, TAG_TEMPLATES.site, TAG_TEMPLATES.siteSettings, TAG_TEMPLATES.site, TAG_TEMPLATES.siteSettings, TAG_TEMPLATES.site, TAG_TEMPLATES.siteSettings, TAG_TEMPLATES.site, TAG_TEMPLATES.siteSettings, TAG_TEMPLATES.site, TAG_TEMPLATES.siteSettings, TAG_TEMPLATES.site, TAG_TEMPLATES.siteSettings, TAG_TEMPLATES.site, TAG_TEMPLATES.siteSettings, TAG_TEMPLATES.site, TAG_TEMPLATES.siteSettings, TAG_TEMPLATES.site, TAG_TEMPLATES.siteSettings, TAG_TEMPLATES.site, TAG_TEMPLATES.siteSettings, TAG_TEMPLATES.site, TAG_TEMPLATES.siteSettings, TAG_TEMPLATES.site, TAG_TEMPLATES.siteSettings, TAG_TEMPLATES.site, TAG_TEMPLATES.siteSettings, TAG_TEMPLATES.site, TAG_TEMPLATES.siteSettings, TAG_TEMPLATES.site, TAG_TEMPLATES.siteSettings, TAG_TEMPLATES.site, TAG_TEMPLATES.siteSettings, TAG_TEMPLATES.site, TAG_TEMPLATES.siteSettings, TAG_TEMPLATES.site, TAG_TEMPLATES.siteSettings, TAG_TEMPLATES.site, TAG_TEMPLATES.siteSettings, TAG_TEMPLATES.site, TAG_TEMPLATES.siteSettings, TAG_TEMPLATES.site, TAG_TEMPLATES.siteSettings, TAG_TEMPLATES.site, TAG_TEMPLATES.siteSettings, TAG_TEMPLATES.siteCollection, TAG_TEMPLATES.siteNavigation, TAG_TEMPLATES.siteCollection, TAG_TEMPLATES.siteNavigation, TAG_TEMPLATES.siteCollection, TAG_TEMPLATES.siteNavigation, TAG_TEMPLATES.navigationMenuById, TAG_TEMPLATES.siteCollection, TAG_TEMPLATES.siteNavigation, TAG_TEMPLATES.navigationMenuById, TAG_TEMPLATES.siteCollection, TAG_TEMPLATES.siteNavigation, TAG_TEMPLATES.navigationMenuById, TAG_TEMPLATES.siteCollection, TAG_TEMPLATES.siteNavigation, TAG_TEMPLATES.navigationMenuById, TAG_TEMPLATES.siteCollection, TAG_TEMPLATES.siteNavigation, TAG_TEMPLATES.navigationMenuById, TAG_TEMPLATES.navigationItemById, TAG_TEMPLATES.siteCollection, TAG_TEMPLATES.siteNavigation, TAG_TEMPLATES.navigationMenuById, TAG_TEMPLATES.navigationItemById, TAG_TEMPLATES.siteCollection, TAG_TEMPLATES.siteNavigation, TAG_TEMPLATES.navigationMenuById, TAG_TEMPLATES.siteRoutableContent, TAG_TEMPLATES.siteRoutableContent, TAG_TEMPLATES.siteRoutableContent, TAG_TEMPLATES.siteSettings, TAG_TEMPLATES.siteCollection, TAG_TEMPLATES.siteTheme, TAG_TEMPLATES.siteCollection, TAG_TEMPLATES.siteTheme, TAG_TEMPLATES.siteCollection, TAG_TEMPLATES.siteTheme, TAG_TEMPLATES.siteCollection, TAG_TEMPLATES.pageSurfaceById, TAG_TEMPLATES.siteCollection, TAG_TEMPLATES.pageSurfaceById, TAG_TEMPLATES.siteCollection, TAG_TEMPLATES.pageSurfaceById, TAG_TEMPLATES.siteCollection, TAG_TEMPLATES.pageSurfaceById, TAG_TEMPLATES.siteRoutableContent, TAG_TEMPLATES.pageById, TAG_TEMPLATES.siteRoutableContent, TAG_TEMPLATES.pageById, TAG_TEMPLATES.siteRoutableContent, TAG_TEMPLATES.pageById, TAG_TEMPLATES.siteRoutableContent, TAG_TEMPLATES.pageById, TAG_TEMPLATES.siteRoutableContent, TAG_TEMPLATES.pageById, TAG_TEMPLATES.siteRoutableContent, TAG_TEMPLATES.pageById, TAG_TEMPLATES.siteRoutableContent, TAG_TEMPLATES.pageById, TAG_TEMPLATES.siteRoutableContent, TAG_TEMPLATES.pageById, TAG_TEMPLATES.siteRoutableContent, TAG_TEMPLATES.pageById, TAG_TEMPLATES.siteRoutableContent, TAG_TEMPLATES.siteRoutableContent, TAG_TEMPLATES.siteRedirects, TAG_TEMPLATES.siteRouteOutcomes, TAG_TEMPLATES.siteRoutableContent, TAG_TEMPLATES.siteRedirects, TAG_TEMPLATES.siteRouteOutcomes, TAG_TEMPLATES.siteRoutableContent, TAG_TEMPLATES.siteForms, TAG_TEMPLATES.siteForms, TAG_TEMPLATES.siteForms, TAG_TEMPLATES.siteForms, TAG_TEMPLATES.siteForms, TAG_TEMPLATES.siteForms, TAG_TEMPLATES.formSubmissionsBySlug, TAG_TEMPLATES.siteForms, TAG_TEMPLATES.formSubmissionsBySlug, TAG_TEMPLATES.siteForms, TAG_TEMPLATES.formSubmissionsBySlug, TAG_TEMPLATES.formById, TAG_TEMPLATES.siteForms, TAG_TEMPLATES.publicEvents, TAG_TEMPLATES.publicEventFilters, { ...PUBLIC_WHOLE_SERIES_ENDPOINT_DEFINITIONS }, TAG_TEMPLATES.publicTeamMembers, TAG_TEMPLATES.publicWholeSeriesOfferings, TAG_TEMPLATES.publicEvents, TAG_TEMPLATES.publicPasses, TAG_TEMPLATES.publicMemberships, TAG_TEMPLATES.publicProducts, TAG_TEMPLATES.publicGifting, TAG_TEMPLATES.publicGifting, TAG_TEMPLATES.publicGifting, TAG_TEMPLATES.publicShop, TAG_TEMPLATES.publicCheckout, TAG_TEMPLATES.siteRoutableContent, TAG_TEMPLATES.publicEvents, TAG_TEMPLATES.publicEvents, TAG_TEMPLATES.publicEvents, TAG_TEMPLATES.publicEvents, TAG_TEMPLATES.publicEvents, TAG_TEMPLATES.publicEvents, { ...EVENT_MANAGEMENT_ENDPOINT_DEFINITIONS }, { ...SDK_ENTRY_READ_ENDPOINTS };
1759
+ }, TAG_TEMPLATES.siteCollection, TAG_TEMPLATES.siteById, TAG_TEMPLATES.siteBySlug, TAG_TEMPLATES.siteByDomain, TAG_TEMPLATES.siteCollection, TAG_TEMPLATES.siteById, TAG_TEMPLATES.siteBySlug, TAG_TEMPLATES.siteByDomain, TAG_TEMPLATES.siteCollection, TAG_TEMPLATES.pageSurfaceById, TAG_TEMPLATES.siteCollection, TAG_TEMPLATES.pageSurfaceById, TAG_TEMPLATES.siteCollection, TAG_TEMPLATES.siteRoutableContent, TAG_TEMPLATES.pageSurfaceById, TAG_TEMPLATES.siteCollection, TAG_TEMPLATES.siteRoutableContent, TAG_TEMPLATES.pageSurfaceById, TAG_TEMPLATES.workflowRunById, TAG_TEMPLATES.siteCollection, TAG_TEMPLATES.siteRoutableContent, TAG_TEMPLATES.routeById, TAG_TEMPLATES.site, TAG_TEMPLATES.siteSettings, TAG_TEMPLATES.siteCollection, TAG_TEMPLATES.site, TAG_TEMPLATES.siteSettings, TAG_TEMPLATES.siteCollection, TAG_TEMPLATES.site, TAG_TEMPLATES.siteSettings, TAG_TEMPLATES.siteCollection, TAG_TEMPLATES.site, TAG_TEMPLATES.site, TAG_TEMPLATES.siteSettings, TAG_TEMPLATES.site, TAG_TEMPLATES.siteSettings, TAG_TEMPLATES.site, TAG_TEMPLATES.siteSettings, TAG_TEMPLATES.site, TAG_TEMPLATES.siteSettings, TAG_TEMPLATES.site, TAG_TEMPLATES.siteSettings, TAG_TEMPLATES.site, TAG_TEMPLATES.siteSettings, TAG_TEMPLATES.site, TAG_TEMPLATES.siteSettings, TAG_TEMPLATES.site, TAG_TEMPLATES.siteSettings, TAG_TEMPLATES.site, TAG_TEMPLATES.siteSettings, TAG_TEMPLATES.site, TAG_TEMPLATES.siteSettings, TAG_TEMPLATES.site, TAG_TEMPLATES.siteSettings, TAG_TEMPLATES.site, TAG_TEMPLATES.siteSettings, TAG_TEMPLATES.site, TAG_TEMPLATES.siteSettings, TAG_TEMPLATES.site, TAG_TEMPLATES.siteSettings, TAG_TEMPLATES.site, TAG_TEMPLATES.siteSettings, TAG_TEMPLATES.site, TAG_TEMPLATES.siteSettings, TAG_TEMPLATES.site, TAG_TEMPLATES.siteSettings, TAG_TEMPLATES.site, TAG_TEMPLATES.siteSettings, TAG_TEMPLATES.site, TAG_TEMPLATES.siteSettings, TAG_TEMPLATES.site, TAG_TEMPLATES.siteSettings, TAG_TEMPLATES.site, TAG_TEMPLATES.siteSettings, TAG_TEMPLATES.site, TAG_TEMPLATES.siteSettings, TAG_TEMPLATES.site, TAG_TEMPLATES.siteSettings, TAG_TEMPLATES.site, TAG_TEMPLATES.siteSettings, TAG_TEMPLATES.site, TAG_TEMPLATES.siteSettings, TAG_TEMPLATES.site, TAG_TEMPLATES.siteSettings, TAG_TEMPLATES.siteCollection, TAG_TEMPLATES.siteNavigation, TAG_TEMPLATES.siteCollection, TAG_TEMPLATES.siteNavigation, TAG_TEMPLATES.siteCollection, TAG_TEMPLATES.siteNavigation, TAG_TEMPLATES.navigationMenuById, TAG_TEMPLATES.siteCollection, TAG_TEMPLATES.siteNavigation, TAG_TEMPLATES.navigationMenuById, TAG_TEMPLATES.siteCollection, TAG_TEMPLATES.siteNavigation, TAG_TEMPLATES.navigationMenuById, TAG_TEMPLATES.siteCollection, TAG_TEMPLATES.siteNavigation, TAG_TEMPLATES.navigationMenuById, TAG_TEMPLATES.siteCollection, TAG_TEMPLATES.siteNavigation, TAG_TEMPLATES.navigationMenuById, TAG_TEMPLATES.navigationItemById, TAG_TEMPLATES.siteCollection, TAG_TEMPLATES.siteNavigation, TAG_TEMPLATES.navigationMenuById, TAG_TEMPLATES.navigationItemById, TAG_TEMPLATES.siteCollection, TAG_TEMPLATES.siteNavigation, TAG_TEMPLATES.navigationMenuById, TAG_TEMPLATES.siteRoutableContent, TAG_TEMPLATES.siteRoutableContent, TAG_TEMPLATES.siteRoutableContent, TAG_TEMPLATES.siteSettings, TAG_TEMPLATES.siteCollection, TAG_TEMPLATES.siteTheme, TAG_TEMPLATES.siteCollection, TAG_TEMPLATES.siteTheme, TAG_TEMPLATES.siteCollection, TAG_TEMPLATES.siteTheme, TAG_TEMPLATES.siteCollection, TAG_TEMPLATES.pageSurfaceById, TAG_TEMPLATES.siteCollection, TAG_TEMPLATES.pageSurfaceById, TAG_TEMPLATES.siteCollection, TAG_TEMPLATES.pageSurfaceById, TAG_TEMPLATES.siteCollection, TAG_TEMPLATES.pageSurfaceById, TAG_TEMPLATES.siteRoutableContent, TAG_TEMPLATES.pageById, TAG_TEMPLATES.siteRoutableContent, TAG_TEMPLATES.pageById, TAG_TEMPLATES.siteRoutableContent, TAG_TEMPLATES.pageById, TAG_TEMPLATES.siteRoutableContent, TAG_TEMPLATES.pageById, TAG_TEMPLATES.siteRoutableContent, TAG_TEMPLATES.pageById, TAG_TEMPLATES.siteRoutableContent, TAG_TEMPLATES.pageById, TAG_TEMPLATES.siteRoutableContent, TAG_TEMPLATES.pageById, TAG_TEMPLATES.siteRoutableContent, TAG_TEMPLATES.pageById, TAG_TEMPLATES.siteRoutableContent, TAG_TEMPLATES.pageById, TAG_TEMPLATES.siteRoutableContent, TAG_TEMPLATES.siteRoutableContent, TAG_TEMPLATES.siteRedirects, TAG_TEMPLATES.siteRouteOutcomes, TAG_TEMPLATES.siteRoutableContent, TAG_TEMPLATES.siteRedirects, TAG_TEMPLATES.siteRouteOutcomes, TAG_TEMPLATES.siteRoutableContent, TAG_TEMPLATES.siteForms, TAG_TEMPLATES.siteForms, TAG_TEMPLATES.siteForms, TAG_TEMPLATES.siteForms, TAG_TEMPLATES.siteForms, TAG_TEMPLATES.siteForms, TAG_TEMPLATES.formSubmissionsBySlug, TAG_TEMPLATES.siteForms, TAG_TEMPLATES.formSubmissionsBySlug, TAG_TEMPLATES.siteForms, TAG_TEMPLATES.formSubmissionsBySlug, TAG_TEMPLATES.formById, TAG_TEMPLATES.siteForms, TAG_TEMPLATES.publicEvents, TAG_TEMPLATES.publicEventFilters, { ...PUBLIC_WHOLE_SERIES_ENDPOINT_DEFINITIONS }, TAG_TEMPLATES.publicTeamMembers, TAG_TEMPLATES.publicWholeSeriesOfferings, TAG_TEMPLATES.publicEvents, TAG_TEMPLATES.publicPasses, TAG_TEMPLATES.publicMemberships, TAG_TEMPLATES.publicProducts, TAG_TEMPLATES.publicShop, TAG_TEMPLATES.publicCheckout, TAG_TEMPLATES.siteRoutableContent, TAG_TEMPLATES.publicEvents, TAG_TEMPLATES.publicEvents, TAG_TEMPLATES.publicEvents, TAG_TEMPLATES.publicEvents, TAG_TEMPLATES.publicEvents, { ...EVENT_MANAGEMENT_ENDPOINT_DEFINITIONS }, { ...SDK_ENDPOINT_DEFINITIONS }, { ...SDK_ENTRY_READ_ENDPOINTS };
1513
1760
  z.object({ refreshToken: z.string().min(1).max(4096) }).strict();
1514
1761
  z.object({
1515
1762
  accessToken: z.string().min(1).max(4096),
@@ -2011,6 +2258,298 @@ function parseManagementKey(raw) {
2011
2258
  if (typeof raw !== "string" || !raw.startsWith("bld_mgmt_sk_") || raw.length === 12) return err({ kind: "invalid-management-key" });
2012
2259
  return ok(createSecretInternal("management-key", raw));
2013
2260
  }
2261
+ //#endregion
2262
+ //#region ../core/src/event-series-behaviour.ts
2263
+ const SURFACE_EVENT_PRESET_VALUES = [
2264
+ "class",
2265
+ "course",
2266
+ "term",
2267
+ "workshop",
2268
+ "retreat",
2269
+ "performance"
2270
+ ];
2271
+ //#endregion
2272
+ //#region ../core/src/booking-vertical-preset.ts
2273
+ const BOOKING_ENGINE_BY_BEHAVIOUR = {
2274
+ class: "event_series",
2275
+ workshop: "event_series",
2276
+ course: "event_series",
2277
+ retreat: "event_series",
2278
+ performance: "event_series",
2279
+ appointment: "appointment_service"
2280
+ };
2281
+ function verticalBookingPreset(id, verticalId, canonicalBehaviour, label, pluralLabel, description, availability = "onboarding") {
2282
+ return {
2283
+ id,
2284
+ verticalId,
2285
+ canonicalBehaviour,
2286
+ engine: BOOKING_ENGINE_BY_BEHAVIOUR[canonicalBehaviour],
2287
+ availability,
2288
+ label,
2289
+ pluralLabel,
2290
+ description
2291
+ };
2292
+ }
2293
+ //#endregion
2294
+ //#region ../core/src/booking-vertical-definitions.ts
2295
+ const VERTICAL_DEFINITIONS = [
2296
+ {
2297
+ id: "yoga_wellness",
2298
+ label: "Yoga, meditation or mindfulness",
2299
+ description: "Yoga studios, wellness teachers, and movement practitioners."
2300
+ },
2301
+ {
2302
+ id: "fitness_pt",
2303
+ label: "Fitness and personal training",
2304
+ description: "Personal trainers, group training, and fitness programmes."
2305
+ },
2306
+ {
2307
+ id: "dance_school",
2308
+ label: "Dance school",
2309
+ description: "Dance classes, courses or terms, workshops, private lessons, and shows."
2310
+ },
2311
+ {
2312
+ id: "physiotherapy_physical_health",
2313
+ label: "Physiotherapy & physical health",
2314
+ description: "Physiotherapists, chiropractors, osteopaths, sports therapists, and rehabilitation practitioners."
2315
+ },
2316
+ {
2317
+ id: "massage_bodywork",
2318
+ label: "Massage & bodywork",
2319
+ description: "Massage therapists, bodyworkers, and somatic practitioners."
2320
+ },
2321
+ {
2322
+ id: "therapist_practitioner",
2323
+ label: "Therapist or practitioner",
2324
+ description: "Appointments, sessions, consultations, and occasional group work."
2325
+ },
2326
+ {
2327
+ id: "beauty_spa",
2328
+ label: "Beauty or spa",
2329
+ description: "Treatment-led businesses with optional workshops."
2330
+ },
2331
+ {
2332
+ id: "consultant_coach",
2333
+ label: "Consultant or coach",
2334
+ description: "One-to-one calls, workshops, courses, and retreats."
2335
+ },
2336
+ {
2337
+ id: "training_provider",
2338
+ label: "Training provider",
2339
+ description: "Courses, workshops, classes, appointments, and residential training."
2340
+ },
2341
+ {
2342
+ id: "retreat_centre",
2343
+ label: "Retreat centre",
2344
+ description: "Residential retreats, workshops, classes, courses, and private sessions."
2345
+ },
2346
+ {
2347
+ id: "music_school",
2348
+ label: "Music teacher or school",
2349
+ description: "Lessons, classes, terms, workshops, and performances."
2350
+ },
2351
+ {
2352
+ id: "voice_singing",
2353
+ label: "Voice & Singing",
2354
+ description: "Singing lessons, choirs, voice circles, workshops, and performances."
2355
+ },
2356
+ {
2357
+ id: "performing_arts_school",
2358
+ label: "Theatre or performing arts school",
2359
+ description: "Classes, terms, workshops, performances, and lessons."
2360
+ },
2361
+ {
2362
+ id: "community_wellbeing",
2363
+ label: "Community or wellbeing centre",
2364
+ description: "Groups, workshops, courses, appointments, and retreats."
2365
+ },
2366
+ {
2367
+ id: "venue_event_space",
2368
+ label: "Venue or event space",
2369
+ description: "Room, resource, or access bookings. Depends on the future capacity-booking domain."
2370
+ }
2371
+ ];
2372
+ VERTICAL_DEFINITIONS.map(({ id }) => id);
2373
+ //#endregion
2374
+ //#region ../core/src/booking-vertical-catalog.ts
2375
+ const VERTICAL_BOOKING_PRESETS = [
2376
+ verticalBookingPreset("yoga_wellness.classes", "yoga_wellness", "class", "Class", "Classes", "Regular scheduled classes and group sessions."),
2377
+ verticalBookingPreset("yoga_wellness.workshops", "yoga_wellness", "workshop", "Workshop", "Workshops", "One-off workshops, day retreats, or special sessions."),
2378
+ verticalBookingPreset("yoga_wellness.courses", "yoga_wellness", "course", "Course", "Courses", "Fixed-schedule courses or multi-session groups."),
2379
+ verticalBookingPreset("yoga_wellness.retreats", "yoga_wellness", "retreat", "Retreat", "Retreats", "Multi-day or residential retreats and immersive experiences."),
2380
+ verticalBookingPreset("yoga_wellness.appointments", "yoga_wellness", "appointment", "Appointment", "Appointments", "Private sessions, consultations, or one-to-one support."),
2381
+ verticalBookingPreset("fitness_pt.group_training", "fitness_pt", "class", "Group training", "Group training", "Regular scheduled classes and group sessions."),
2382
+ verticalBookingPreset("fitness_pt.personal_training", "fitness_pt", "appointment", "Personal training", "Personal training", "One-to-one sessions booked from your availability."),
2383
+ verticalBookingPreset("fitness_pt.programmes", "fitness_pt", "course", "Programme", "Programmes", "Multi-session programmes like bootcamps or courses."),
2384
+ verticalBookingPreset("fitness_pt.workshops", "fitness_pt", "workshop", "Workshop", "Workshops", "One-off workshops, events, or special sessions."),
2385
+ verticalBookingPreset("fitness_pt.retreats", "fitness_pt", "retreat", "Retreat", "Retreats", "Multi-day or residential fitness experiences."),
2386
+ verticalBookingPreset("dance_school.classes", "dance_school", "class", "Class", "Classes", "Regular group classes and weekly sessions."),
2387
+ {
2388
+ ...verticalBookingPreset("dance_school.terms", "dance_school", "course", "Term", "Terms", "Multi-week term blocks or fixed-date course groups."),
2389
+ eventPresetOverride: "term"
2390
+ },
2391
+ verticalBookingPreset("dance_school.courses", "dance_school", "course", "Course", "Courses", "Fixed-schedule courses or multi-session groups.", "settings"),
2392
+ verticalBookingPreset("dance_school.workshops", "dance_school", "workshop", "Workshop", "Workshops", "One-off workshops, masterclasses, or intensives."),
2393
+ verticalBookingPreset("dance_school.private_lessons", "dance_school", "appointment", "Private lesson", "Private lessons", "One-to-one lessons or coaching sessions."),
2394
+ verticalBookingPreset("dance_school.shows", "dance_school", "performance", "Show", "Shows", "Ticketed performances, showcases, and recitals."),
2395
+ verticalBookingPreset("physiotherapy_physical_health.appointments", "physiotherapy_physical_health", "appointment", "Appointment", "Appointments", "Assessments, treatments, follow-ups, and rehabilitation sessions."),
2396
+ verticalBookingPreset("physiotherapy_physical_health.rehab_classes", "physiotherapy_physical_health", "class", "Rehab class", "Rehab classes", "Regular rehabilitation, mobility, strength, or recovery classes."),
2397
+ verticalBookingPreset("physiotherapy_physical_health.workshops", "physiotherapy_physical_health", "workshop", "Workshop", "Workshops", "One-off workshops, talks, or practical group sessions."),
2398
+ verticalBookingPreset("massage_bodywork.treatments", "massage_bodywork", "appointment", "Treatment", "Treatments", "Massage treatments, bodywork sessions, and one-to-one appointments."),
2399
+ verticalBookingPreset("massage_bodywork.group_sessions", "massage_bodywork", "class", "Group session", "Group sessions", "Regular bodywork, somatic movement, or self-massage sessions."),
2400
+ verticalBookingPreset("massage_bodywork.workshops", "massage_bodywork", "workshop", "Workshop", "Workshops", "One-off bodywork, self-massage, or somatic practice workshops."),
2401
+ verticalBookingPreset("therapist_practitioner.appointments", "therapist_practitioner", "appointment", "Appointment", "Appointments", "Sessions, consultations, treatments, or assessments."),
2402
+ verticalBookingPreset("therapist_practitioner.workshops", "therapist_practitioner", "workshop", "Workshop", "Workshops", "One-off group workshops, talks, or wellbeing sessions."),
2403
+ verticalBookingPreset("therapist_practitioner.retreats", "therapist_practitioner", "retreat", "Retreat", "Retreats", "Multi-day retreats or immersive group experiences."),
2404
+ verticalBookingPreset("beauty_spa.appointments", "beauty_spa", "appointment", "Appointment", "Appointments", "Treatments, consultations, services, and sessions."),
2405
+ verticalBookingPreset("beauty_spa.workshops", "beauty_spa", "workshop", "Workshop", "Workshops", "Skincare workshops, makeup lessons, demos, or group events."),
2406
+ verticalBookingPreset("consultant_coach.appointments", "consultant_coach", "appointment", "Appointment", "Appointments", "One-to-one calls, consultations, reviews, or coaching sessions."),
2407
+ verticalBookingPreset("consultant_coach.workshops", "consultant_coach", "workshop", "Workshop", "Workshops", "One-off group sessions, webinars, or strategy days."),
2408
+ verticalBookingPreset("consultant_coach.courses", "consultant_coach", "course", "Course", "Courses", "Fixed-schedule cohorts or multi-session group programmes."),
2409
+ verticalBookingPreset("consultant_coach.retreats", "consultant_coach", "retreat", "Retreat", "Retreats", "Multi-day coaching retreats or immersive experiences."),
2410
+ verticalBookingPreset("training_provider.courses", "training_provider", "course", "Course", "Courses", "Fixed-schedule courses, cohorts, and multi-session training."),
2411
+ verticalBookingPreset("training_provider.workshops", "training_provider", "workshop", "Workshop", "Workshops", "One-off workshops, masterclasses, and short training sessions."),
2412
+ verticalBookingPreset("training_provider.appointments", "training_provider", "appointment", "Appointment", "Appointments", "Consultations, assessments, mentoring, or office hours."),
2413
+ verticalBookingPreset("training_provider.classes", "training_provider", "class", "Class", "Classes", "Regular classes, sessions, or groups.", "settings"),
2414
+ verticalBookingPreset("training_provider.residentials", "training_provider", "retreat", "Residential", "Residentials", "Residential courses or multi-day training experiences.", "settings"),
2415
+ verticalBookingPreset("retreat_centre.retreats", "retreat_centre", "retreat", "Retreat", "Retreats", "Multi-day or residential retreats with richer booking needs."),
2416
+ verticalBookingPreset("retreat_centre.workshops", "retreat_centre", "workshop", "Workshop", "Workshops", "One-day retreats, ceremonies, workshops, or special events."),
2417
+ verticalBookingPreset("retreat_centre.classes", "retreat_centre", "class", "Class", "Classes", "Regular sessions like guided meditations or group practices."),
2418
+ verticalBookingPreset("retreat_centre.courses", "retreat_centre", "course", "Course", "Courses", "Fixed-schedule programmes or multi-session experiences."),
2419
+ verticalBookingPreset("retreat_centre.appointments", "retreat_centre", "appointment", "Appointment", "Appointments", "Private sessions, therapies, consultations, or add-ons."),
2420
+ verticalBookingPreset("music_school.lessons", "music_school", "appointment", "Lesson", "Lessons", "One-to-one lessons, consultations, or coaching sessions."),
2421
+ verticalBookingPreset("music_school.classes", "music_school", "class", "Class", "Classes", "Regular group classes, ensembles, or recurring sessions."),
2422
+ {
2423
+ ...verticalBookingPreset("music_school.terms", "music_school", "course", "Term", "Terms", "Multi-week term blocks or fixed-date group courses."),
2424
+ eventPresetOverride: "term"
2425
+ },
2426
+ verticalBookingPreset("music_school.workshops", "music_school", "workshop", "Workshop", "Workshops", "One-off workshops, masterclasses, or intensives."),
2427
+ verticalBookingPreset("music_school.performances", "music_school", "performance", "Performance", "Performances", "Concerts, recitals, showcases, or ticketed performances."),
2428
+ verticalBookingPreset("voice_singing.lessons", "voice_singing", "appointment", "Voice session", "Voice sessions", "One-to-one singing lessons, voice coaching, or private practice sessions."),
2429
+ verticalBookingPreset("voice_singing.classes", "voice_singing", "class", "Ongoing weekly session", "Ongoing weekly sessions", "Regular choirs, voice circles, community singing, or group practice."),
2430
+ {
2431
+ ...verticalBookingPreset("voice_singing.terms", "voice_singing", "course", "Singing term", "Singing terms", "Multi-week choir terms, voice courses, or fixed-date group programmes."),
2432
+ eventPresetOverride: "term"
2433
+ },
2434
+ verticalBookingPreset("voice_singing.workshops", "voice_singing", "workshop", "Workshop", "Workshops", "One-off singing workshops, voice journeys, or devotional singing sessions."),
2435
+ verticalBookingPreset("voice_singing.performances", "voice_singing", "performance", "Performance", "Performances", "Choir concerts, sharing events, recitals, or community performances."),
2436
+ verticalBookingPreset("performing_arts_school.classes", "performing_arts_school", "class", "Class", "Classes", "Regular group classes, rehearsals, or weekly sessions."),
2437
+ {
2438
+ ...verticalBookingPreset("performing_arts_school.terms", "performing_arts_school", "course", "Term", "Terms", "Multi-week term blocks or fixed-date course groups."),
2439
+ eventPresetOverride: "term"
2440
+ },
2441
+ verticalBookingPreset("performing_arts_school.workshops", "performing_arts_school", "workshop", "Workshop", "Workshops", "One-off workshops, masterclasses, or intensives."),
2442
+ verticalBookingPreset("performing_arts_school.performances", "performing_arts_school", "performance", "Performance", "Performances", "Shows, showcases, productions, or ticketed performances."),
2443
+ verticalBookingPreset("performing_arts_school.lessons", "performing_arts_school", "appointment", "Lesson", "Lessons", "One-to-one lessons, coaching, or audition prep."),
2444
+ verticalBookingPreset("community_wellbeing.classes", "community_wellbeing", "class", "Class", "Classes", "Regular groups, sessions, practices, or weekly activities."),
2445
+ verticalBookingPreset("community_wellbeing.workshops", "community_wellbeing", "workshop", "Workshop", "Workshops", "One-off workshops, talks, events, or gatherings."),
2446
+ verticalBookingPreset("community_wellbeing.courses", "community_wellbeing", "course", "Course", "Courses", "Fixed-schedule courses, study groups, or multi-session programmes."),
2447
+ verticalBookingPreset("community_wellbeing.appointments", "community_wellbeing", "appointment", "Appointment", "Appointments", "One-to-one appointments, consultations, or support sessions."),
2448
+ verticalBookingPreset("community_wellbeing.retreats", "community_wellbeing", "retreat", "Retreat", "Retreats", "Multi-day or residential retreats."),
2449
+ verticalBookingPreset("venue_event_space.resource_hire", "venue_event_space", "appointment", "Hire slot", "Hire slots", "Future room, venue, and resource hire bookings.", "future")
2450
+ ];
2451
+ //#endregion
2452
+ //#region ../core/src/booking-vertical-config.ts
2453
+ const VERTICAL_ID_SET = new Set(VERTICAL_DEFINITIONS.map(({ id }) => id));
2454
+ const VERTICAL_PRESET_ID_SET = new Set(VERTICAL_BOOKING_PRESETS.map((presetDefinition) => presetDefinition.id));
2455
+ function parseVerticalId(value) {
2456
+ return typeof value === "string" && VERTICAL_ID_SET.has(value) ? value : null;
2457
+ }
2458
+ function parseVerticalPresetId(value) {
2459
+ return typeof value === "string" && VERTICAL_PRESET_ID_SET.has(value) ? value : null;
2460
+ }
2461
+ function getVerticalPresetDefinition(presetId) {
2462
+ const definition = VERTICAL_BOOKING_PRESETS.find((presetDefinition) => presetDefinition.id === presetId);
2463
+ if (definition === void 0) throw new Error(`Unhandled vertical preset id: ${presetId}`);
2464
+ return definition;
2465
+ }
2466
+ function createConfiguredSiteVerticalBookingConfig(verticalId, selectedPresetIds) {
2467
+ return {
2468
+ verticalId,
2469
+ selectedPresetIds
2470
+ };
2471
+ }
2472
+ function toNonEmptyVerticalPresetIds(presetIds) {
2473
+ const firstPresetId = presetIds[0];
2474
+ return firstPresetId ? [firstPresetId, ...presetIds.slice(1)] : null;
2475
+ }
2476
+ const DEFAULT_SITE_VERTICAL_BOOKING_CONFIG = {
2477
+ verticalId: null,
2478
+ selectedPresetIds: []
2479
+ };
2480
+ function appendUniqueIssue(issues, issue) {
2481
+ return issues.some((existing) => existing.code === issue.code) ? issues : [...issues, issue];
2482
+ }
2483
+ function collectRawConfigIssues(rawConfig, config) {
2484
+ const rawPresetValue = rawConfig.selectedPresetIds;
2485
+ const rawPresetIds = Array.isArray(rawPresetValue) ? rawPresetValue : [];
2486
+ let issues = [];
2487
+ if (rawConfig.verticalId != null && config.verticalId === null) issues = appendUniqueIssue(issues, {
2488
+ code: "unknown_vertical",
2489
+ rawValue: rawConfig.verticalId
2490
+ });
2491
+ if (config.verticalId === null && config.selectedPresetIds.length > 0) issues = appendUniqueIssue(issues, { code: "missing_vertical" });
2492
+ if (rawPresetValue !== void 0 && !Array.isArray(rawPresetValue) || rawPresetIds.some((presetId) => parseVerticalPresetId(presetId) === null)) issues = appendUniqueIssue(issues, {
2493
+ code: "unknown_preset",
2494
+ rawValue: rawPresetValue
2495
+ });
2496
+ if (rawConfig.verticalId != null && config.selectedPresetIds.length === 0) issues = appendUniqueIssue(issues, { code: "empty_selected_presets" });
2497
+ return issues;
2498
+ }
2499
+ function collectPresetConfigIssues(config) {
2500
+ const seenPresetIds = /* @__PURE__ */ new Set();
2501
+ const seenBehaviours = /* @__PURE__ */ new Set();
2502
+ let issues = [];
2503
+ for (const presetId of config.selectedPresetIds) {
2504
+ const presetDefinition = getVerticalPresetDefinition(presetId);
2505
+ if (seenPresetIds.has(presetId)) issues = appendUniqueIssue(issues, { code: "duplicate_preset_id" });
2506
+ seenPresetIds.add(presetId);
2507
+ if (config.verticalId !== null && presetDefinition.verticalId !== config.verticalId) issues = appendUniqueIssue(issues, { code: "preset_vertical_mismatch" });
2508
+ if (presetDefinition.availability === "future") issues = appendUniqueIssue(issues, { code: "future_preset_selected" });
2509
+ if (seenBehaviours.has(presetDefinition.canonicalBehaviour)) issues = appendUniqueIssue(issues, { code: "duplicate_canonical_behaviour" });
2510
+ seenBehaviours.add(presetDefinition.canonicalBehaviour);
2511
+ }
2512
+ return issues;
2513
+ }
2514
+ function getSiteVerticalConfigIssues(rawConfig, config) {
2515
+ let issues = collectRawConfigIssues(rawConfig, config);
2516
+ for (const issue of collectPresetConfigIssues(config)) issues = appendUniqueIssue(issues, issue);
2517
+ return issues;
2518
+ }
2519
+ function resolveSiteVerticalBookingConfig(rawConfig) {
2520
+ if (rawConfig == null) return {
2521
+ kind: "unconfigured",
2522
+ config: DEFAULT_SITE_VERTICAL_BOOKING_CONFIG
2523
+ };
2524
+ const verticalId = parseVerticalId(rawConfig.verticalId);
2525
+ const selectedPresetIds = (Array.isArray(rawConfig.selectedPresetIds) ? rawConfig.selectedPresetIds : []).map(parseVerticalPresetId).filter((presetId) => Boolean(presetId));
2526
+ const config = {
2527
+ verticalId,
2528
+ selectedPresetIds
2529
+ };
2530
+ if (rawConfig.verticalId == null && selectedPresetIds.length === 0) return {
2531
+ kind: "unconfigured",
2532
+ config: DEFAULT_SITE_VERTICAL_BOOKING_CONFIG
2533
+ };
2534
+ const issues = getSiteVerticalConfigIssues(rawConfig, config);
2535
+ if (issues.length > 0) return {
2536
+ kind: "invalid",
2537
+ config,
2538
+ issues
2539
+ };
2540
+ const nonEmptyPresetIds = toNonEmptyVerticalPresetIds(selectedPresetIds);
2541
+ const configuredConfig = verticalId !== null && nonEmptyPresetIds !== null ? createConfiguredSiteVerticalBookingConfig(verticalId, nonEmptyPresetIds) : null;
2542
+ if (configuredConfig === null) return {
2543
+ kind: "invalid",
2544
+ config,
2545
+ issues: [{ code: "empty_selected_presets" }]
2546
+ };
2547
+ return {
2548
+ kind: "configured",
2549
+ config: configuredConfig,
2550
+ selectedPresets: configuredConfig.selectedPresetIds.map(getVerticalPresetDefinition)
2551
+ };
2552
+ }
2014
2553
  z.object({
2015
2554
  formulaVersion: z.literal("managed-domain-overage-v1"),
2016
2555
  conversionRule: z.literal("usd-to-gbp-1-to-1-v1"),
@@ -2022,6 +2561,68 @@ z.object({
2022
2561
  monthlyCurrency: z.literal("gbp")
2023
2562
  });
2024
2563
  //#endregion
2564
+ //#region ../blocks/src/system/types/link.ts
2565
+ const nullableString = z.union([z.string().min(1), z.null()]);
2566
+ const RESOLVED_INTERNAL_LINK_ENTITY_TYPES = [
2567
+ "page",
2568
+ "content",
2569
+ "pageSurface"
2570
+ ];
2571
+ const resolvedInternalLinkKeys = [
2572
+ "entityId",
2573
+ "entityType",
2574
+ "href",
2575
+ "title",
2576
+ "typeLabel"
2577
+ ];
2578
+ const internalRouteOnlyLinkSchema = z.object({
2579
+ kind: z.literal("internal"),
2580
+ routeId: z.string().min(1)
2581
+ }).passthrough().superRefine((value, ctx) => {
2582
+ if (!resolvedInternalLinkKeys.some((key) => value[key] != null)) return;
2583
+ ctx.addIssue({
2584
+ code: "custom",
2585
+ message: "Internal links with resolved metadata must include entityId, entityType, href, title, and typeLabel"
2586
+ });
2587
+ });
2588
+ const internalResolvedLinkSchema = z.object({
2589
+ kind: z.literal("internal"),
2590
+ routeId: z.string().min(1),
2591
+ entityId: z.string().min(1),
2592
+ entityType: z.enum(RESOLVED_INTERNAL_LINK_ENTITY_TYPES),
2593
+ href: z.string().min(1),
2594
+ title: z.string().min(1),
2595
+ typeLabel: z.string().min(1),
2596
+ contentTypeKey: nullableString.optional(),
2597
+ contentTypeName: nullableString.optional(),
2598
+ updatedAt: nullableString.optional()
2599
+ }).passthrough();
2600
+ const internalLinkSchema = z.union([internalResolvedLinkSchema, internalRouteOnlyLinkSchema]);
2601
+ const externalLinkSchema$1 = z.object({
2602
+ kind: z.literal("external"),
2603
+ href: z.string().min(1)
2604
+ }).passthrough();
2605
+ const customLinkSchema$1 = z.object({
2606
+ kind: z.literal("url"),
2607
+ href: z.string().min(1)
2608
+ }).passthrough();
2609
+ const pageLinkSchema$1 = z.object({
2610
+ kind: z.literal("page"),
2611
+ identifier: z.string().min(1)
2612
+ }).passthrough();
2613
+ const entryLinkSchema$1 = z.object({
2614
+ kind: z.literal("entry"),
2615
+ contentType: z.string().min(1),
2616
+ identifier: z.string().min(1)
2617
+ }).passthrough();
2618
+ z.union([
2619
+ internalLinkSchema,
2620
+ externalLinkSchema$1,
2621
+ customLinkSchema$1,
2622
+ pageLinkSchema$1,
2623
+ entryLinkSchema$1
2624
+ ]);
2625
+ //#endregion
2025
2626
  //#region ../api/src/navigation/contracts.ts
2026
2627
  /**
2027
2628
  * Canonical navigation/link Zod contracts.
@@ -2051,7 +2652,7 @@ const internalLinkPayloadSchema = z.object({
2051
2652
  kind: z.literal("internal"),
2052
2653
  routeId: z.string().uuid(),
2053
2654
  entityId: z.string().uuid(),
2054
- entityType: z.enum(["page", "content"]),
2655
+ entityType: z.enum(RESOLVED_INTERNAL_LINK_ENTITY_TYPES),
2055
2656
  href: z.string().min(1),
2056
2657
  title: z.string().min(1),
2057
2658
  typeLabel: z.string().min(1),
@@ -3923,6 +4524,12 @@ const opaqueButtonColourTokenSchema = themeColorTokenSchema.refine((value) => pa
3923
4524
  if (token === null) throw new Error("Invariant: opaque button token passed its schema");
3924
4525
  return token;
3925
4526
  });
4527
+ const contextualButtonHoverSchema = z.strictObject({
4528
+ kind: z.literal("shade-shift"),
4529
+ seedToken: opaqueButtonColourTokenSchema,
4530
+ fallbackDirection: z.enum(["lighter", "darker"]),
4531
+ preferredToken: opaqueButtonColourTokenSchema.optional()
4532
+ });
3926
4533
  const buttonShadeAmountSchema = z.number().finite().min(0).max(900).multipleOf(100);
3927
4534
  const buttonShadowIntensitySchema = z.enum([
3928
4535
  "subtle",
@@ -4262,6 +4869,7 @@ const buttonVariantSchema = z.strictObject({
4262
4869
  shadow: variantShadowSchema.optional(),
4263
4870
  border: buttonBorderSchema.optional(),
4264
4871
  hoverBackgroundToken: opaqueButtonColourTokenSchema.optional(),
4872
+ contextualHover: contextualButtonHoverSchema.optional(),
4265
4873
  effects: variantEffectsSchema.optional(),
4266
4874
  sizes: variantSizeOverridesSchema.optional(),
4267
4875
  affordance: buttonVariantAffordanceSchema.optional()
@@ -4534,6 +5142,139 @@ function validateButtonTextContrast(input) {
4534
5142
  };
4535
5143
  }
4536
5144
  //#endregion
5145
+ //#region ../theme-core/src/buttons/contextualHover.ts
5146
+ function resolveContextualHoverPreference(input) {
5147
+ const preferred = input.instruction.preferredToken;
5148
+ if (preferred && isSafeCandidate(preferred, input.palette, input.surface)) return {
5149
+ kind: "resolved",
5150
+ token: preferred,
5151
+ repair: null
5152
+ };
5153
+ const contextual = resolveContextualHover(input);
5154
+ return contextual.kind === "resolved" ? {
5155
+ kind: "resolved",
5156
+ token: contextual.token,
5157
+ repair: preferred ? {
5158
+ kind: "preferred-token-replaced",
5159
+ preferredToken: preferred,
5160
+ contextualToken: contextual.token
5161
+ } : null
5162
+ } : contextual;
5163
+ }
5164
+ /**
5165
+ * Resolves semantic shade movement from real palette steps. The persisted
5166
+ * instruction owns the colour family and deterministic unknown-surface
5167
+ * fallback; a proven surface may select the opposite direction when it gives
5168
+ * the button stronger separation while retaining the shared contrast contract.
5169
+ */
5170
+ function resolveContextualHover(input) {
5171
+ const candidates = shadeCandidates(input.instruction.seedToken, input.palette);
5172
+ if (candidates.length === 0) return {
5173
+ kind: "unavailable",
5174
+ reason: "no-distinct-shade"
5175
+ };
5176
+ const textSafe = candidates.filter((candidate) => hasSafeTextContrast(candidate.token, input.palette));
5177
+ if (textSafe.length === 0) return {
5178
+ kind: "unavailable",
5179
+ reason: "no-text-safe-candidate"
5180
+ };
5181
+ if (!input.surface) {
5182
+ const selected = textSafe.find((candidate) => candidate.direction === input.instruction.fallbackDirection) ?? textSafe[0];
5183
+ return selected ? {
5184
+ kind: "resolved",
5185
+ token: selected.token,
5186
+ direction: selected.direction,
5187
+ evidence: "fallback-direction"
5188
+ } : {
5189
+ kind: "unavailable",
5190
+ reason: "no-text-safe-candidate"
5191
+ };
5192
+ }
5193
+ const selected = textSafe.map((candidate) => ({
5194
+ ...candidate,
5195
+ surfaceContrast: contrastRatio(input.palette[candidate.token] ?? "", input.surface?.backgroundHex ?? "")
5196
+ })).filter((candidate) => candidate.surfaceContrast !== null && candidate.surfaceContrast >= BUTTON_CONTRAST_POLICY.nonTextMinimumRatio).sort((left, right) => {
5197
+ const distanceDifference = left.distance - right.distance;
5198
+ if (distanceDifference !== 0) return distanceDifference;
5199
+ const contrastDifference = (right.surfaceContrast ?? 0) - (left.surfaceContrast ?? 0);
5200
+ if (contrastDifference !== 0) return contrastDifference;
5201
+ if (left.direction === right.direction) return left.token.localeCompare(right.token);
5202
+ return left.direction === input.instruction.fallbackDirection ? -1 : 1;
5203
+ })[0];
5204
+ return selected ? {
5205
+ kind: "resolved",
5206
+ token: selected.token,
5207
+ direction: selected.direction,
5208
+ evidence: "known-surface"
5209
+ } : {
5210
+ kind: "unavailable",
5211
+ reason: "no-surface-safe-candidate"
5212
+ };
5213
+ }
5214
+ function shadeCandidates(seedToken, palette) {
5215
+ const match = String(seedToken).match(/^(.*?)(?:-(\d{2,3}))?$/);
5216
+ const family = match?.[1] ?? String(seedToken);
5217
+ const currentShade = match?.[2] ? Number(match[2]) : 500;
5218
+ const seedHex = palette[seedToken];
5219
+ const shades = Object.keys(palette).flatMap((token) => {
5220
+ const shade = token.match(new RegExp(`^${escapeRegExp(family)}-(\\d{2,3})$`));
5221
+ return shade?.[1] ? [Number(shade[1])] : [];
5222
+ }).filter((shade) => Number.isFinite(shade)).sort((left, right) => left - right);
5223
+ const lower = [...shades].filter((shade) => shade < currentShade).sort((left, right) => right - left);
5224
+ const higher = shades.filter((shade) => shade > currentShade);
5225
+ return [...lower.map((shade) => candidate(family, shade, currentShade, "lighter", seedHex, palette)), ...higher.map((shade) => candidate(family, shade, currentShade, "darker", seedHex, palette))].filter((value) => value !== null);
5226
+ }
5227
+ function candidate(family, shade, currentShade, direction, seedHex, palette) {
5228
+ const token = parseOpaqueButtonColourToken(`${family}-${shade}`);
5229
+ if (token === null) return null;
5230
+ const candidateHex = palette[token];
5231
+ if (!candidateHex || candidateHex === seedHex) return null;
5232
+ return {
5233
+ token,
5234
+ direction,
5235
+ distance: Math.abs(shade - currentShade),
5236
+ surfaceContrast: null
5237
+ };
5238
+ }
5239
+ function hasSafeTextContrast(token, palette) {
5240
+ const background = palette[token];
5241
+ const foreground = palette[onColorTokenName(token)];
5242
+ return typeof background === "string" && typeof foreground === "string" && contrastRatio(background, foreground) >= BUTTON_CONTRAST_POLICY.textMinimumRatio;
5243
+ }
5244
+ function isSafeCandidate(token, palette, surface) {
5245
+ if (!hasSafeTextContrast(token, palette)) return false;
5246
+ return surface ? contrastRatio(palette[token] ?? "", surface.backgroundHex) >= BUTTON_CONTRAST_POLICY.nonTextMinimumRatio : true;
5247
+ }
5248
+ function escapeRegExp(value) {
5249
+ return value.replace(/[.*+?^${}()|[\]\\]/g, "\\$&");
5250
+ }
5251
+ //#endregion
5252
+ //#region ../theme-core/src/buttons/resolveButtonHoverTreatment.ts
5253
+ function resolveButtonHoverTreatment(input) {
5254
+ if (input.variant.contextualHover) {
5255
+ const contextual = resolveContextualHoverPreference({
5256
+ instruction: input.variant.contextualHover,
5257
+ palette: input.palette,
5258
+ surface: input.surface
5259
+ });
5260
+ if (contextual.kind === "resolved") return {
5261
+ treatment: {
5262
+ type: "solid",
5263
+ colorToken: contextual.token
5264
+ },
5265
+ repair: contextual.repair
5266
+ };
5267
+ }
5268
+ const token = input.variant.hoverBackgroundToken ?? (input.global.hoverColor === "token" ? input.global.hoverColorToken : void 0);
5269
+ return {
5270
+ treatment: token === void 0 ? input.fallback : {
5271
+ type: "solid",
5272
+ colorToken: token
5273
+ },
5274
+ repair: null
5275
+ };
5276
+ }
5277
+ //#endregion
4537
5278
  //#region ../theme-core/src/buttons/resolveButtonColourStates.ts
4538
5279
  function compileButtonColourStates(input) {
4539
5280
  const baseTransition = applyColourEffects({
@@ -4544,9 +5285,16 @@ function compileButtonColourStates(input) {
4544
5285
  palette: input.palette
4545
5286
  });
4546
5287
  if (!baseTransition.ok) return baseTransition;
5288
+ const hover = resolveButtonHoverTreatment({
5289
+ variant: input.variant,
5290
+ global: input.global,
5291
+ fallback: baseTransition.treatment,
5292
+ palette: input.palette,
5293
+ surface: input.surface
5294
+ });
4547
5295
  const stateTreatments = {
4548
5296
  base: baseTransition.treatment,
4549
- hover: hoverTreatment(input.variant, input.global, baseTransition.treatment),
5297
+ hover: hover.treatment,
4550
5298
  focus: baseTransition.treatment,
4551
5299
  active: baseTransition.treatment,
4552
5300
  disabled: baseTransition.treatment
@@ -4585,14 +5333,8 @@ function compileButtonColourStates(input) {
4585
5333
  ok: true,
4586
5334
  states: resolved,
4587
5335
  focusIndicator: resolveFocusIndicator(resolved.focus),
4588
- nonColourEffects
4589
- };
4590
- }
4591
- function hoverTreatment(variant, global, fallback) {
4592
- const token = variant.hoverBackgroundToken ?? (global.hoverColor === "token" ? global.hoverColorToken : void 0);
4593
- return token === void 0 ? fallback : {
4594
- type: "solid",
4595
- colorToken: token
5336
+ nonColourEffects,
5337
+ contextualHoverRepair: hover.repair
4596
5338
  };
4597
5339
  }
4598
5340
  function applyColourEffects(input) {
@@ -5403,13 +6145,24 @@ function resolveContextualButtonRole(input) {
5403
6145
  };
5404
6146
  const rejected = [];
5405
6147
  const preferred = compileCandidate(requested, input.buttonSystem, input.palette, input.surface);
5406
- if (preferred.ok) return {
5407
- kind: "preferred",
5408
- requestedRole: input.role,
5409
- states: preferred.states,
5410
- focusIndicator: preferred.focusIndicator,
5411
- boundary: boundaryForVariant(requested)
5412
- };
6148
+ if (preferred.ok) {
6149
+ if (preferred.contextualHoverRepair) return {
6150
+ kind: "repaired",
6151
+ requestedRole: input.role,
6152
+ candidate: "contextual-hover",
6153
+ states: preferred.states,
6154
+ focusIndicator: preferred.focusIndicator,
6155
+ boundary: boundaryForVariant(requested),
6156
+ rejectedCandidates: []
6157
+ };
6158
+ return {
6159
+ kind: "preferred",
6160
+ requestedRole: input.role,
6161
+ states: preferred.states,
6162
+ focusIndicator: preferred.focusIndicator,
6163
+ boundary: boundaryForVariant(requested)
6164
+ };
6165
+ }
5413
6166
  rejected.push({
5414
6167
  candidate: "preferred",
5415
6168
  error: preferred.error
@@ -5529,6 +6282,7 @@ function candidateVariant(fallback, requested, system) {
5529
6282
  },
5530
6283
  border: { widthClass: "border" },
5531
6284
  hoverBackgroundToken: void 0,
6285
+ contextualHover: void 0,
5532
6286
  effects: void 0
5533
6287
  },
5534
6288
  boundary: {
@@ -5640,13 +6394,7 @@ function readNonEmptyString(value) {
5640
6394
  buttonSizeNameSchema.options;
5641
6395
  //#endregion
5642
6396
  //#region ../theme-core/src/buttons/styles/domain.ts
5643
- const PUBLIC_BUTTON_ROLES = [
5644
- "primary",
5645
- "secondary",
5646
- "outline",
5647
- "ghost",
5648
- "accent"
5649
- ];
6397
+ const PUBLIC_BUTTON_ROLES = VARIANT_ROLES;
5650
6398
  function defineButtonStyleRecipe(recipe) {
5651
6399
  return recipe;
5652
6400
  }
@@ -5742,6 +6490,14 @@ const BUTTON_STYLE_IDS = [
5742
6490
  "quiet-arrow"
5743
6491
  ];
5744
6492
  const quietArrowParametersSchema = z.object({ secondaryTreatment: z.enum(["outlined", "solid-accent"]) }).strict();
6493
+ const flatInkHoverTreatmentSchema = z.enum([
6494
+ "contextual",
6495
+ "secondary",
6496
+ "accent"
6497
+ ]);
6498
+ const flatInkHoverPreferencesShape = Object.fromEntries(VARIANT_ROLES.map((role) => [role, flatInkHoverTreatmentSchema.optional()]));
6499
+ const flatInkHoverPreferencesSchema = z.strictObject(flatInkHoverPreferencesShape);
6500
+ const flatInkParametersSchema = z.strictObject({ hoverPreferences: flatInkHoverPreferencesSchema.optional() });
5745
6501
  const emptyParametersSchema$1 = z.object({}).strict();
5746
6502
  function selectionBranch(styleId, parameters) {
5747
6503
  return z.object({
@@ -5756,7 +6512,7 @@ const buttonStyleSelectionSchema = z.discriminatedUnion("styleId", [
5756
6512
  selectionBranch("editorial-link", emptyParametersSchema$1),
5757
6513
  selectionBranch("pebble", emptyParametersSchema$1),
5758
6514
  selectionBranch("ink-stamp", emptyParametersSchema$1),
5759
- selectionBranch("flat-ink", emptyParametersSchema$1),
6515
+ selectionBranch("flat-ink", flatInkParametersSchema),
5760
6516
  selectionBranch("brushed-wash", emptyParametersSchema$1),
5761
6517
  selectionBranch("showtime-pill", emptyParametersSchema$1),
5762
6518
  selectionBranch("joy-stamp", emptyParametersSchema$1),
@@ -5893,6 +6649,189 @@ const quietArrowRecipe = defineButtonStyleRecipe({
5893
6649
  })
5894
6650
  });
5895
6651
  //#endregion
6652
+ //#region ../theme-core/src/buttons/styles/recipes/flatInk.ts
6653
+ const contextualRoleConfig = {
6654
+ primary: {
6655
+ contextualSeedToken: unsafeAsOpaqueButtonColourToken("primary"),
6656
+ fallbackDirection: "darker"
6657
+ },
6658
+ secondary: {
6659
+ contextualSeedToken: unsafeAsOpaqueButtonColourToken("surfaceAlt"),
6660
+ fallbackDirection: "darker"
6661
+ },
6662
+ outline: {
6663
+ contextualSeedToken: unsafeAsOpaqueButtonColourToken("surfaceAlt"),
6664
+ fallbackDirection: "darker"
6665
+ },
6666
+ ghost: {
6667
+ contextualSeedToken: unsafeAsOpaqueButtonColourToken("surfaceAlt"),
6668
+ fallbackDirection: "darker"
6669
+ },
6670
+ accent: {
6671
+ contextualSeedToken: unsafeAsOpaqueButtonColourToken("accent"),
6672
+ fallbackDirection: "darker"
6673
+ }
6674
+ };
6675
+ const hoverControl = {
6676
+ kind: "button-hover-by-role",
6677
+ parameter: "hoverPreferences",
6678
+ label: "Button hover",
6679
+ roles: contextualRoleConfig,
6680
+ options: [
6681
+ {
6682
+ value: "contextual",
6683
+ label: "Contextual shade shift"
6684
+ },
6685
+ {
6686
+ value: "secondary",
6687
+ label: "Secondary button colour"
6688
+ },
6689
+ {
6690
+ value: "accent",
6691
+ label: "Accent button colour"
6692
+ }
6693
+ ]
6694
+ };
6695
+ const lift = { effectId: "lift" };
6696
+ const flatInkRecipe = defineButtonStyleRecipe({
6697
+ id: "flat-ink",
6698
+ accessibilityLabel: "Flat rounded buttons with arrow affordances",
6699
+ tags: {
6700
+ tone: "classic",
6701
+ energy: "calm",
6702
+ motion: "subtle",
6703
+ era: "editorial"
6704
+ },
6705
+ parameterSchema: flatInkParametersSchema,
6706
+ defaultParameters: {},
6707
+ controls: [hoverControl],
6708
+ defineSystem: (parameters) => ({
6709
+ global: {
6710
+ cornerStyle: "rounded",
6711
+ textTransform: "none",
6712
+ fontWeight: 600,
6713
+ typography: "body",
6714
+ letterSpacing: "tight",
6715
+ paddingPreset: "default",
6716
+ hoverTransform: "lift",
6717
+ hoverColor: "none"
6718
+ },
6719
+ sizes: {
6720
+ sm: {
6721
+ padding: "0.625rem 1.125rem",
6722
+ fontSize: "text-sm"
6723
+ },
6724
+ md: { padding: "0.8125rem 1.375rem" },
6725
+ lg: {
6726
+ padding: "0.9375rem 1.625rem",
6727
+ fontSize: "text-lg"
6728
+ },
6729
+ xl: {
6730
+ padding: "1.0625rem 2rem",
6731
+ fontSize: "text-xl"
6732
+ }
6733
+ },
6734
+ roles: {
6735
+ primary: {
6736
+ kind: "complete",
6737
+ appearance: {
6738
+ background: {
6739
+ type: "solid",
6740
+ colorToken: unsafeAsOpaqueButtonColourToken("primary")
6741
+ },
6742
+ borderRadius: "rounded-lg",
6743
+ affordance: { iconId: "ArrowRight" },
6744
+ ...hoverAppearance("primary", parameters, [lift, {
6745
+ effectId: "background-on-hover",
6746
+ options: { colorToken: unsafeAsOpaqueButtonColourToken("secondary") }
6747
+ }])
6748
+ }
6749
+ },
6750
+ secondary: {
6751
+ kind: "complete",
6752
+ appearance: {
6753
+ background: {
6754
+ type: "surface",
6755
+ role: "link"
6756
+ },
6757
+ borderRadius: "rounded-lg",
6758
+ border: { widthClass: "border" },
6759
+ ...hoverAppearance("secondary", parameters, [lift, {
6760
+ effectId: "background-on-hover",
6761
+ options: { colorToken: unsafeAsOpaqueButtonColourToken("surfaceAlt") }
6762
+ }])
6763
+ }
6764
+ },
6765
+ outline: {
6766
+ kind: "complete",
6767
+ appearance: {
6768
+ background: {
6769
+ type: "surface",
6770
+ role: "link"
6771
+ },
6772
+ borderRadius: "rounded-lg",
6773
+ border: { widthClass: "border" },
6774
+ ...hoverAppearance("outline", parameters, [lift, {
6775
+ effectId: "background-on-hover",
6776
+ options: { colorToken: unsafeAsOpaqueButtonColourToken("surfaceAlt") }
6777
+ }])
6778
+ }
6779
+ },
6780
+ ghost: {
6781
+ kind: "complete",
6782
+ appearance: {
6783
+ background: {
6784
+ type: "surface",
6785
+ role: "link"
6786
+ },
6787
+ borderRadius: "rounded-lg",
6788
+ ...hoverAppearance("ghost", parameters, [lift])
6789
+ }
6790
+ },
6791
+ accent: {
6792
+ kind: "complete",
6793
+ appearance: {
6794
+ background: {
6795
+ type: "solid",
6796
+ colorToken: unsafeAsOpaqueButtonColourToken("accent")
6797
+ },
6798
+ borderRadius: "rounded-lg",
6799
+ affordance: { iconId: "ArrowRight" },
6800
+ ...hoverAppearance("accent", parameters, [lift])
6801
+ }
6802
+ }
6803
+ }
6804
+ })
6805
+ });
6806
+ function hoverAppearance(role, parameters, recommended) {
6807
+ const preference = parameters.hoverPreferences?.[role];
6808
+ if (preference === void 0) return { effects: { hover: [...recommended] } };
6809
+ if (preference === "contextual") {
6810
+ const config = contextualRoleConfig[role];
6811
+ return {
6812
+ effects: { hover: [lift] },
6813
+ contextualHover: {
6814
+ kind: "shade-shift",
6815
+ seedToken: config.contextualSeedToken,
6816
+ fallbackDirection: config.fallbackDirection
6817
+ }
6818
+ };
6819
+ }
6820
+ const config = contextualRoleConfig[role];
6821
+ return {
6822
+ effects: { hover: [lift] },
6823
+ contextualHover: {
6824
+ kind: "shade-shift",
6825
+ seedToken: config.contextualSeedToken,
6826
+ fallbackDirection: config.fallbackDirection,
6827
+ preferredToken: unsafeAsOpaqueButtonColourToken(paletteRole(preference))
6828
+ }
6829
+ };
6830
+ }
6831
+ function paletteRole(preference) {
6832
+ return preference;
6833
+ }
6834
+ //#endregion
5896
6835
  //#region ../theme-core/src/buttons/styles/recipes/defineStaticButtonStyleRecipe.ts
5897
6836
  const emptyParametersSchema = z.object({}).strict();
5898
6837
  function defineStaticButtonStyleRecipe(input) {
@@ -6739,113 +7678,6 @@ const inkStampRecipe = defineStaticButtonStyleRecipe({
6739
7678
  }
6740
7679
  }
6741
7680
  });
6742
- const flatInkRecipe = defineStaticButtonStyleRecipe({
6743
- id: "flat-ink",
6744
- accessibilityLabel: "Flat rounded buttons with arrow affordances",
6745
- tags: {
6746
- tone: "classic",
6747
- energy: "calm",
6748
- motion: "subtle",
6749
- era: "editorial"
6750
- },
6751
- system: {
6752
- global: {
6753
- cornerStyle: "rounded",
6754
- textTransform: "none",
6755
- fontWeight: 600,
6756
- typography: "body",
6757
- letterSpacing: "tight",
6758
- paddingPreset: "default",
6759
- hoverTransform: "lift",
6760
- hoverColor: "none"
6761
- },
6762
- sizes: {
6763
- sm: {
6764
- padding: "0.625rem 1.125rem",
6765
- fontSize: "text-sm"
6766
- },
6767
- md: { padding: "0.8125rem 1.375rem" },
6768
- lg: {
6769
- padding: "0.9375rem 1.625rem",
6770
- fontSize: "text-lg"
6771
- },
6772
- xl: {
6773
- padding: "1.0625rem 2rem",
6774
- fontSize: "text-xl"
6775
- }
6776
- },
6777
- roles: {
6778
- primary: {
6779
- kind: "complete",
6780
- appearance: {
6781
- background: {
6782
- type: "solid",
6783
- colorToken: "primary"
6784
- },
6785
- borderRadius: "rounded-lg",
6786
- affordance: { iconId: "ArrowRight" },
6787
- effects: { hover: [{ effectId: "lift" }, {
6788
- effectId: "background-on-hover",
6789
- options: { colorToken: unsafeAsOpaqueButtonColourToken("secondary") }
6790
- }] }
6791
- }
6792
- },
6793
- secondary: {
6794
- kind: "complete",
6795
- appearance: {
6796
- background: {
6797
- type: "surface",
6798
- role: "link"
6799
- },
6800
- borderRadius: "rounded-lg",
6801
- border: { widthClass: "border" },
6802
- effects: { hover: [{ effectId: "lift" }, {
6803
- effectId: "background-on-hover",
6804
- options: { colorToken: unsafeAsOpaqueButtonColourToken("surfaceAlt") }
6805
- }] }
6806
- }
6807
- },
6808
- outline: {
6809
- kind: "complete",
6810
- appearance: {
6811
- background: {
6812
- type: "surface",
6813
- role: "link"
6814
- },
6815
- borderRadius: "rounded-lg",
6816
- border: { widthClass: "border" },
6817
- effects: { hover: [{ effectId: "lift" }, {
6818
- effectId: "background-on-hover",
6819
- options: { colorToken: unsafeAsOpaqueButtonColourToken("surfaceAlt") }
6820
- }] }
6821
- }
6822
- },
6823
- ghost: {
6824
- kind: "complete",
6825
- appearance: {
6826
- background: {
6827
- type: "surface",
6828
- role: "link"
6829
- },
6830
- borderRadius: "rounded-lg",
6831
- effects: { hover: [{ effectId: "lift" }] }
6832
- }
6833
- },
6834
- accent: {
6835
- kind: "complete",
6836
- appearance: {
6837
- background: {
6838
- type: "solid",
6839
- colorToken: "accent"
6840
- },
6841
- borderRadius: "rounded-lg",
6842
- affordance: { iconId: "ArrowRight" },
6843
- effects: { hover: [{ effectId: "lift" }] }
6844
- }
6845
- }
6846
- }
6847
- }
6848
- });
6849
7681
  const showtimePillRecipe = defineStaticButtonStyleRecipe({
6850
7682
  id: "showtime-pill",
6851
7683
  accessibilityLabel: "Bold uppercase pill buttons with playful movement",
@@ -7267,8 +8099,8 @@ const openCardRoleValue = "open";
7267
8099
  */
7268
8100
  const surfaceCardRoleValues = [...cardVariantRoleValues, openCardRoleValue];
7269
8101
  /**
7270
- * The closed card-role vocabulary Looks and blocks address cards by — this is
7271
- * `BoxStylesCardVariant` widened with `open`, not a parallel enum.
8102
+ * The closed role vocabulary Looks and blocks use for surfaced and boxless
8103
+ * card choices.
7272
8104
  *
7273
8105
  * - `none` — no site-style card surface; the block's own composition and
7274
8106
  * the author's own card fields govern the item. This is *not*
@@ -7280,11 +8112,6 @@ const surfaceCardRoleValues = [...cardVariantRoleValues, openCardRoleValue];
7280
8112
  * - `alternative` — the statement card carrying the site's personality
7281
8113
  */
7282
8114
  const cardRoleValues = [...surfaceCardRoleValues, boxlessCardVariantValue];
7283
- const legacyCardVariantRoleAliases = {
7284
- variant1: "alternative",
7285
- variant2: "alternative",
7286
- statement: "alternative"
7287
- };
7288
8115
  const cardSpacingSchema = z.enum([
7289
8116
  "none",
7290
8117
  "compact",
@@ -7314,33 +8141,21 @@ const gradientDirectionSchema = z.enum([
7314
8141
  "to-br",
7315
8142
  "to-bl"
7316
8143
  ]);
7317
- const cardVariantRoleSchema = z.enum(cardVariantRoleValues);
8144
+ z.enum(cardVariantRoleValues);
7318
8145
  const surfaceCardRoleSchema = z.enum(surfaceCardRoleValues);
7319
8146
  const cardRoleSchema = z.enum(cardRoleValues);
7320
- /**
7321
- * Historical name for the role vocabulary as it reaches box styles. Widened to
7322
- * the full `CardRole` set — old values keep parsing, `open` now parses too.
7323
- */
7324
- const boxStylesCardVariantSchema = cardRoleSchema;
7325
8147
  function isCardVariantRole(value) {
7326
8148
  return typeof value === "string" && cardVariantRoleValues.includes(value);
7327
8149
  }
7328
8150
  function normalizeCardVariantRole(value) {
7329
- if (isCardVariantRole(value)) return value;
7330
- if (typeof value !== "string") return null;
7331
- return legacyCardVariantRoleAliases[value] ?? null;
8151
+ return isCardVariantRole(value) ? value : null;
7332
8152
  }
7333
- /**
7334
- * The one untrusted-input boundary for the role vocabulary. Legacy alias values
7335
- * (`variant1`, `variant2`, `statement`) normalize here and nowhere else.
7336
- */
8153
+ /** The one untrusted-input boundary for the closed role vocabulary. */
7337
8154
  function normalizeCardRole(value) {
7338
8155
  if (value === "none") return boxlessCardVariantValue;
7339
8156
  if (value === "open") return openCardRoleValue;
7340
8157
  return normalizeCardVariantRole(value);
7341
8158
  }
7342
- /** Historical name for {@link normalizeCardRole}. */
7343
- const normalizeBoxStylesCardVariant = normalizeCardRole;
7344
8159
  const PRIORITY_ROLE_INFERENCE = {
7345
8160
  1: "default",
7346
8161
  2: "alternative"
@@ -8285,6 +9100,21 @@ const eventListTreatmentValues = [
8285
9100
  "editorial-register",
8286
9101
  "dense-index"
8287
9102
  ];
9103
+ const testimonialsCompositionTreatmentValues = [
9104
+ "open-editorial",
9105
+ "evergreen-lead",
9106
+ "room-and-response",
9107
+ "open-floor"
9108
+ ];
9109
+ /**
9110
+ * How an offerings preview arranges its groups. Structure only — the group
9111
+ * card surface is the Look's `cardRole` and the site style's card system.
9112
+ */
9113
+ const offeringsPreviewCompositionTreatmentValues = [
9114
+ "paired-feature-cards",
9115
+ "open-editorial-columns",
9116
+ "joined-programme-panel"
9117
+ ];
8288
9118
  const eyebrowTreatmentValues = [
8289
9119
  "plain",
8290
9120
  "accent",
@@ -8818,8 +9648,7 @@ const cardStylesOverrideSchema = z.object({
8818
9648
  spacing: semanticSpacingSchema.nullable().optional(),
8819
9649
  raised: z.boolean().nullable().optional(),
8820
9650
  rounded: boxRoundedSchema.nullable().optional(),
8821
- role: cardRoleSchema.nullable().optional(),
8822
- cardVariant: boxStylesCardVariantSchema.nullable().optional()
9651
+ role: cardRoleSchema.nullable().optional()
8823
9652
  });
8824
9653
  const blockStyleOverridesSchema = z.object({
8825
9654
  sectionStyles: sectionStylesOverrideSchema.nullable().optional(),
@@ -9708,7 +10537,12 @@ defineBlockAppearancePreset({
9708
10537
  constraints: { layoutVariantKeys: ["cards"] },
9709
10538
  design: {
9710
10539
  sectionSurface: "base",
9711
- contentFrame: plainFrame
10540
+ contentFrame: plainFrame,
10541
+ cardRole: "alternative",
10542
+ composition: {
10543
+ kind: "offerings-preview",
10544
+ treatment: "paired-feature-cards"
10545
+ }
9712
10546
  }
9713
10547
  }), defineBlockAppearancePreset({
9714
10548
  id: "offerings-preview-open-editorial-columns",
@@ -9718,7 +10552,12 @@ defineBlockAppearancePreset({
9718
10552
  constraints: { layoutVariantKeys: ["cards"] },
9719
10553
  design: {
9720
10554
  sectionSurface: "base",
9721
- contentFrame: plainFrame
10555
+ contentFrame: plainFrame,
10556
+ cardRole: "open",
10557
+ composition: {
10558
+ kind: "offerings-preview",
10559
+ treatment: "open-editorial-columns"
10560
+ }
9722
10561
  }
9723
10562
  }), defineBlockAppearancePreset({
9724
10563
  id: "offerings-preview-joined-programme-panel",
@@ -9728,7 +10567,12 @@ defineBlockAppearancePreset({
9728
10567
  constraints: { layoutVariantKeys: ["cards"] },
9729
10568
  design: {
9730
10569
  sectionSurface: "base",
9731
- contentFrame: plainFrame
10570
+ contentFrame: plainFrame,
10571
+ cardRole: "default",
10572
+ composition: {
10573
+ kind: "offerings-preview",
10574
+ treatment: "joined-programme-panel"
10575
+ }
9732
10576
  }
9733
10577
  }), defineBlockAppearancePreset({
9734
10578
  id: "feature-cards-raised-rule",
@@ -9970,7 +10814,11 @@ defineBlockAppearancePreset({
9970
10814
  constraints: { layoutVariantKeys: ["featured-editorial"] },
9971
10815
  design: {
9972
10816
  sectionSurface: "base",
9973
- contentFrame: plainFrame
10817
+ contentFrame: plainFrame,
10818
+ composition: {
10819
+ kind: "testimonials",
10820
+ treatment: "evergreen-lead"
10821
+ }
9974
10822
  }
9975
10823
  }), defineBlockAppearancePreset({
9976
10824
  id: "testimonials-room-and-response",
@@ -9980,7 +10828,11 @@ defineBlockAppearancePreset({
9980
10828
  constraints: { layoutVariantKeys: ["featured-editorial"] },
9981
10829
  design: {
9982
10830
  sectionSurface: "base",
9983
- contentFrame: plainFrame
10831
+ contentFrame: plainFrame,
10832
+ composition: {
10833
+ kind: "testimonials",
10834
+ treatment: "room-and-response"
10835
+ }
9984
10836
  }
9985
10837
  }), defineBlockAppearancePreset({
9986
10838
  id: "testimonials-open-floor",
@@ -9990,7 +10842,11 @@ defineBlockAppearancePreset({
9990
10842
  constraints: { layoutVariantKeys: ["featured-editorial"] },
9991
10843
  design: {
9992
10844
  sectionSurface: "base",
9993
- contentFrame: plainFrame
10845
+ contentFrame: plainFrame,
10846
+ composition: {
10847
+ kind: "testimonials",
10848
+ treatment: "open-floor"
10849
+ }
9994
10850
  }
9995
10851
  }), defineBlockAppearancePreset({
9996
10852
  id: "faq-base-accordion",
@@ -12915,7 +13771,8 @@ const curatedSiteStyles = [
12915
13771
  buttonStyleChoices: [
12916
13772
  buttonChoice("soft-pill"),
12917
13773
  buttonChoice("pebble"),
12918
- buttonChoice("confident-chip")
13774
+ buttonChoice("confident-chip"),
13775
+ buttonChoice("flat-ink")
12919
13776
  ],
12920
13777
  paletteRecommendations: [
12921
13778
  paletteRecommendation("soft-natural-sage"),
@@ -14430,7 +15287,6 @@ const ALLOWED_TRANSFORM_IDS = [
14430
15287
  "boxStyles.resolveRootStyle",
14431
15288
  "boxStyles.semanticGap",
14432
15289
  "boxStyles.semanticGapValue",
14433
- "boxStyles.cardVariantClass",
14434
15290
  "containerStyles.resolveBoxClassName"
14435
15291
  ];
14436
15292
  /**
@@ -15880,8 +16736,41 @@ function containerStylesField(options = {}) {
15880
16736
  return createBoxStylesFieldWithDepth("container", options);
15881
16737
  }
15882
16738
  function cardStylesField(options = {}) {
16739
+ if (options.controls === "role-only") return createRoleOnlyCardStylesField(options);
15883
16740
  return createBoxStylesFieldWithDepth("card", options);
15884
16741
  }
16742
+ function createRoleOnlyCardStylesField(options) {
16743
+ const { id = "_cardStyles", label = "Card styles", renderInHeader, intent } = options;
16744
+ return {
16745
+ id,
16746
+ type: "modal",
16747
+ label,
16748
+ required: false,
16749
+ schema: { fields: [{
16750
+ id: "role",
16751
+ type: "select",
16752
+ label: "Card style",
16753
+ description: "Choose a semantic card style from the active site style.",
16754
+ required: false,
16755
+ multiple: false,
16756
+ defaultValue: "default",
16757
+ options: cardVariantRoleValues.map((value) => ({
16758
+ value,
16759
+ label: value === "default" ? "Default" : "Alternative"
16760
+ }))
16761
+ }] },
16762
+ ui: {
16763
+ ...typeof renderInHeader === "boolean" ? { renderInHeader } : {},
16764
+ ...intent ? { intent } : {},
16765
+ modalConfig: {
16766
+ buttonLabel: label,
16767
+ description: "Choose the site-style card role.",
16768
+ buttonVariant: "outline",
16769
+ showCustomizedIndicator: true
16770
+ }
16771
+ }
16772
+ };
16773
+ }
15885
16774
  //#endregion
15886
16775
  //#region ../blocks/src/system/fields/imageShape.ts
15887
16776
  const standardImageShapeOptions = [
@@ -17068,21 +17957,29 @@ function cardRoleClass(role) {
17068
17957
  return `card-role-${role}`;
17069
17958
  }
17070
17959
  /**
17960
+ * The role class for a card slot the *block* owns structurally, where a Look
17961
+ * may still name the surface.
17962
+ *
17963
+ * Some layouts have more than one card slot and decide themselves which one is
17964
+ * the statement — the featured-editorial testimonials field is a lead voice
17965
+ * beside its supporting voices, and that is structure, not composition. Those
17966
+ * slots still have to honour a Look that picks a surface, or a role-picking
17967
+ * Look would silently no-op under the layout. So the slot carries a default
17968
+ * role and the Look's compiled role wins over it when there is one.
17969
+ *
17970
+ * An explicit `none` is honoured as boxlessness and emits no class, matching
17971
+ * how the composite emitter reads it.
17972
+ */
17973
+ /**
17071
17974
  * The role a card renders with, and the one place a set of card styles becomes
17072
17975
  * a role.
17073
17976
  *
17074
- * Precedence: a per-item override, then the `role` a Look compiled onto the
17075
- * block's card styles, then the legacy `cardVariant` field. `cardVariant` only
17076
- * ever held role names, so it reads *as* a role rather than as a second
17077
- * vocabulary — an explicit `role` wins when a record carries both.
17078
- *
17079
- * Compiled and freshly authored card styles carry only `role`. `cardVariant`
17080
- * survives on content persisted before the role contract, and normalizes here
17081
- * rather than in `cardStylesOverrideSchema` because that content reaches the
17082
- * renderer as a raw record without ever passing through the schema.
17977
+ * Precedence: a per-item override, then the `role` a Look or semantic field
17978
+ * compiled onto the block's card styles. Persisted inputs are normalized at
17979
+ * this boundary because raw block records do not pass through the theme schema.
17083
17980
  */
17084
17981
  function resolveCardRoleForBoxStyles(input, override) {
17085
- return override ?? normalizeCardRole(input.role) ?? normalizeCardRole(input.cardVariant);
17982
+ return override ?? normalizeCardRole(input.role);
17086
17983
  }
17087
17984
  /**
17088
17985
  * Parse a block's own per-item surface vocabulary into a card role. The alias
@@ -17099,8 +17996,8 @@ function resolveItemCardRole(value, aliases) {
17099
17996
  * The card surface for a set of box styles: one role, one class vocabulary, so
17100
17997
  * a site-style swap re-skins the card whichever field named it.
17101
17998
  */
17102
- function cardSurface(input, override) {
17103
- const role = resolveCardRoleForBoxStyles(input, override);
17999
+ function cardSurface(input, override, fallback) {
18000
+ const role = resolveCardRoleForBoxStyles(input, override) ?? fallback ?? null;
17104
18001
  if (!role) return {
17105
18002
  role: null,
17106
18003
  classes: []
@@ -17197,10 +18094,9 @@ function raisedClassFor(options) {
17197
18094
  * of keeping a copy that drifts.
17198
18095
  */
17199
18096
  function boxStyleClassNames(value, options) {
17200
- if (!value || typeof value !== "object") return options.baseClass?.trim() || "";
17201
- const input = value;
18097
+ const input = value && typeof value === "object" ? value : {};
17202
18098
  const borderOverride = borderOverrideClass(input);
17203
- const surface = cardSurface(input, options.cardRoleOverride);
18099
+ const surface = cardSurface(input, options.cardRoleOverride, options.cardRoleFallback);
17204
18100
  const cardOwnsBorder = surface.role !== null && surface.role !== "none";
17205
18101
  return [
17206
18102
  borderOverride || cardOwnsBorder ? withoutBorderClasses(options.baseClass ?? "") : options.baseClass ?? "",
@@ -17348,29 +18244,41 @@ const cardRoleClassTransform = {
17348
18244
  return baseClass ? `${baseClass.trim()} ${hook}` : hook;
17349
18245
  }
17350
18246
  };
17351
- const cardVariantClassTransform = {
17352
- id: "boxStyles.cardVariantClass",
18247
+ /**
18248
+ * The role class for a layout's own card slot, bound from the block's compiled
18249
+ * card styles so a Look that picks a surface still reaches a slot the layout
18250
+ * assigned a default role to.
18251
+ */
18252
+ const cardSlotRoleTransform = {
18253
+ id: "boxStyles.cardSlotRole",
17353
18254
  kind: "string",
17354
- summary: "Map a site-style card variant role to its card-role-{role} CSS class",
17355
- run: (value, options) => {
17356
- const baseClass = options?.baseClass?.trim() ?? "";
17357
- const cardVariant = normalizeBoxStylesCardVariant(value);
17358
- if (!cardVariant || cardVariant === "none") return baseClass;
17359
- const roleClass = `card-role-${cardVariant}`;
17360
- return baseClass ? `${baseClass} ${roleClass}` : roleClass;
17361
- }
18255
+ summary: "Resolve a layout card slot's role class, defaulting to the slot's own role",
18256
+ run: (value, options) => boxStyleClassNames(value, {
18257
+ baseClass: options?.baseClass,
18258
+ cardRoleFallback: options.slotDefault,
18259
+ includeSpacing: false
18260
+ })
17362
18261
  };
18262
+ function resolveBorderColorState(value, options, viewModel) {
18263
+ const input = asPartialObject(options?.stylesPath ? readPath(viewModel, options.stylesPath) : value);
18264
+ if (!input) return null;
18265
+ return {
18266
+ input,
18267
+ role: resolveCardRoleForBoxStyles(input, options?.stylesPath ? resolveItemCardRole(value, options.itemRoleAliases) : void 0)
18268
+ };
18269
+ }
17363
18270
  const boxStylesBorderColorTransform = {
17364
18271
  id: "boxStyles.borderColor",
17365
18272
  kind: "string",
17366
18273
  summary: "Resolve border color from box styles border.colorToken",
17367
- run: (value, options, _context) => {
18274
+ run: (value, options, context) => {
17368
18275
  const fallbackToken = options?.fallbackToken ?? "border";
17369
18276
  const returnEmptyForDefault = options?.returnEmptyForDefault ?? false;
17370
18277
  let explicitToken = null;
17371
- const input = asPartialObject(value);
17372
- if (input) {
17373
- const border = normalizeBoxStylesBorder(input.border);
18278
+ const state = resolveBorderColorState(value, options, context.viewModel);
18279
+ if (state) {
18280
+ if (state.role && state.role !== "none") return "";
18281
+ const border = normalizeBoxStylesBorder(state.input.border);
17374
18282
  if (border && border.enabled === true && border.colorToken) explicitToken = border.colorToken;
17375
18283
  }
17376
18284
  if (explicitToken) {
@@ -17590,7 +18498,7 @@ const boxStylesTransforms = [
17590
18498
  roundedTransform,
17591
18499
  boxStylesCompositeTransform,
17592
18500
  cardRoleClassTransform,
17593
- cardVariantClassTransform,
18501
+ cardSlotRoleTransform,
17594
18502
  boxStylesBorderColorTransform,
17595
18503
  sectionClassNameTransform,
17596
18504
  containerStylesResolveClassName,
@@ -17697,10 +18605,16 @@ function styledCard(children, opts, ...mods) {
17697
18605
  const style = {
17698
18606
  ...opts.style ?? {},
17699
18607
  borderColor: { $bind: {
17700
- from: opts.stylesFrom,
18608
+ from: opts.itemRole?.from ?? opts.stylesFrom,
17701
18609
  transforms: [{
17702
18610
  id: "boxStyles.borderColor",
17703
- options: { returnEmptyForDefault: true }
18611
+ options: {
18612
+ returnEmptyForDefault: true,
18613
+ ...opts.itemRole ? {
18614
+ stylesPath: opts.stylesFrom,
18615
+ ...opts.itemRole.aliases ? { itemRoleAliases: opts.itemRole.aliases } : {}
18616
+ } : {}
18617
+ }
17704
18618
  }]
17705
18619
  } }
17706
18620
  };
@@ -18825,18 +19739,73 @@ function buildGridCardsLayout(className) {
18825
19739
  return el("div", { className }, buildResponsiveGridCards());
18826
19740
  }
18827
19741
  /**
19742
+ * The card slots the featured-editorial layout has, and the role each one
19743
+ * defaults to.
19744
+ *
19745
+ * Which slot is the statement is *structure*, so the layout decides it: this
19746
+ * variant exists to put one lead voice beside its supporting voices. But a Look
19747
+ * that picks a surface has to keep meaning something here, so the lead slot's
19748
+ * role is a default the Look's compiled `cardRole` wins over — see
19749
+ * `cardSlotRoleClass`. Supporting voices stay the quiet everyday card.
19750
+ */
19751
+ const FEATURED_EDITORIAL_SLOTS = {
19752
+ lead: {
19753
+ /** Composition CSS addresses the lead card's geometry through this. */
19754
+ variantClass: "rb-testimonials-fe-card--feature",
19755
+ slotDefault: "alternative",
19756
+ followsLook: true
19757
+ },
19758
+ support: {
19759
+ variantClass: null,
19760
+ slotDefault: "default",
19761
+ followsLook: false
19762
+ }
19763
+ };
19764
+ /** Where the testimonials block's compiled card styles live. */
19765
+ const TESTIMONIALS_CARD_STYLES_PATH = "content._cardStyles";
19766
+ /**
19767
+ * The class list for one featured-editorial card slot.
19768
+ *
19769
+ * A slot that follows the Look has to resolve at render time, so it binds
19770
+ * through the shared card-class emitter rather than naming a role class here;
19771
+ * a slot that does not is a plain string built by the same composite emitter.
19772
+ */
19773
+ function featuredEditorialCardClassName(slot) {
19774
+ const { variantClass, slotDefault, followsLook } = FEATURED_EDITORIAL_SLOTS[slot];
19775
+ const baseClass = ["rb-testimonials-fe-card", variantClass].filter(Boolean).join(" ");
19776
+ if (!followsLook) return boxStyleClassNames({}, {
19777
+ baseClass,
19778
+ cardRoleFallback: slotDefault,
19779
+ includeSpacing: false
19780
+ });
19781
+ return { $bind: {
19782
+ from: TESTIMONIALS_CARD_STYLES_PATH,
19783
+ transforms: [{
19784
+ id: "boxStyles.cardSlotRole",
19785
+ options: {
19786
+ baseClass,
19787
+ slotDefault
19788
+ }
19789
+ }],
19790
+ fallback: boxStyleClassNames({}, {
19791
+ baseClass,
19792
+ cardRoleFallback: slotDefault,
19793
+ includeSpacing: false
19794
+ })
19795
+ } };
19796
+ }
19797
+ /**
18828
19798
  * Build a single "featured editorial" testimonial card.
18829
19799
  *
18830
- * This card type deliberately renders NO avatar/headshot: an amber quote mark,
18831
- * the quote body, then the author name and a context line. Colour + surface
18832
- * treatment is driven entirely by `variantClass` (see testimonials.css):
18833
- * - `rb-testimonials-fe-card--feature` → spruce-ink card (dark primary bg)
18834
- * - `rb-testimonials-fe-card--plain` → white surface card
19800
+ * This card type deliberately renders NO avatar/headshot: a quote mark, the
19801
+ * quote body, then the author name and a context line. The card surface comes
19802
+ * from the slot's card role — the site style owns the fill, border, corners and
19803
+ * padding.
18835
19804
  *
18836
19805
  * Extra modifiers (`repeat`, `when`) are forwarded to the card node so the
18837
19806
  * caller can drive first-vs-rest branching.
18838
19807
  */
18839
- function buildFeaturedEditorialCard(variantClass, ...mods) {
19808
+ function buildFeaturedEditorialCard(slot, ...mods) {
18840
19809
  const quoteMark = text({
18841
19810
  as: "span",
18842
19811
  className: "rb-testimonials-fe-qmark",
@@ -18850,11 +19819,11 @@ function buildFeaturedEditorialCard(variantClass, ...mods) {
18850
19819
  as: "span",
18851
19820
  className: "rb-testimonials-fe-context"
18852
19821
  }, when("testimonial.content.jobTitle"), bind("testimonial.content.jobTitle"))]);
18853
- return el("div", { className: `rb-testimonials-fe-card ${variantClass}` }, [
19822
+ return el("div", { className: featuredEditorialCardClassName(slot) }, [el("div", { className: "card-content rb-testimonials-fe-card-body" }, [
18854
19823
  quoteMark,
18855
19824
  quote,
18856
19825
  meta
18857
- ], ...mods);
19826
+ ])], ...mods);
18858
19827
  }
18859
19828
  /**
18860
19829
  * Build the "featured editorial" layout: an asymmetric two-column arrangement
@@ -18868,7 +19837,7 @@ function buildFeaturedEditorialCard(variantClass, ...mods) {
18868
19837
  * index scope in context, so entry 0 produces no node in the rest column.
18869
19838
  */
18870
19839
  function buildFeaturedEditorialLayout() {
18871
- 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", {
19840
+ 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", {
18872
19841
  equals: 0,
18873
19842
  not: true
18874
19843
  }))])]);
@@ -19595,7 +20564,7 @@ const newsletterFormFragment = defineFragment({
19595
20564
  });
19596
20565
  //#endregion
19597
20566
  //#region ../blocks/src/system/fragments/library/card.ts
19598
- const cardVariantOptions$1 = cardVariantRoleValues.map((value) => ({
20567
+ const cardVariantOptions = cardVariantRoleValues.map((value) => ({
19599
20568
  value,
19600
20569
  label: value === "default" ? "Default" : "Alternative"
19601
20570
  }));
@@ -19693,7 +20662,7 @@ const cardFragment = defineFragment({
19693
20662
  description: "Choose a card style from your theme",
19694
20663
  required: false,
19695
20664
  defaultValue: "default",
19696
- options: cardVariantOptions$1,
20665
+ options: cardVariantOptions,
19697
20666
  ui: { intent: "style" }
19698
20667
  }
19699
20668
  ],
@@ -19702,7 +20671,10 @@ const cardFragment = defineFragment({
19702
20671
  className: { $bind: {
19703
20672
  from: "variant",
19704
20673
  fallback: "default",
19705
- transforms: [{ id: "boxStyles.cardVariantClass" }]
20674
+ transforms: [{
20675
+ id: "boxStyles.cardRoleClass",
20676
+ options: { baseClass: "" }
20677
+ }]
19706
20678
  } }
19707
20679
  }, [media({
19708
20680
  className: "card-media rb-w-full rb-h-auto rb-object-cover",
@@ -25648,19 +26620,30 @@ const blockBookingPaymentCollectionOptionSchema = z.union([
25648
26620
  ]);
25649
26621
  const blockBookingPaymentTermsSchema = z.object({ allowedOptions: z.array(blockBookingPaymentCollectionOptionSchema).min(1) });
25650
26622
  //#endregion
25651
- //#region ../blocks/src/system/blocks/courses/shared/schemas.ts
25652
- /**
25653
- * Zod schema for course venue data
25654
- */
25655
- const courseVenueSchema = z.object({
26623
+ //#region ../blocks/src/system/blocks/shared/bookingConsent.ts
26624
+ const blockBookingConsentSchema = z.object({
26625
+ requirementId: z.string(),
26626
+ title: z.string(),
26627
+ agreement: RichTextDocSchema,
26628
+ checkboxLabel: z.string()
26629
+ });
26630
+ const bookingRequirementConsentFieldSchema = z.object({
26631
+ id: z.string(),
26632
+ label: z.string(),
26633
+ type: z.literal("booking_requirement_consent"),
26634
+ required: z.literal(true),
26635
+ agreement: RichTextDocSchema,
26636
+ checkboxLabel: z.string().min(1)
26637
+ });
26638
+ z.union([blockBookingConsentSchema, bookingRequirementConsentFieldSchema]);
26639
+ //#endregion
26640
+ //#region ../blocks/src/system/blocks/events/whole-series/schemas.ts
26641
+ const wholeSeriesVenueSchema = z.object({
25656
26642
  id: z.string(),
25657
26643
  name: z.string(),
25658
26644
  address: z.string().nullable()
25659
26645
  });
25660
- /**
25661
- * Zod schema for course session (occurrence) data
25662
- */
25663
- const courseSessionSchema = z.object({
26646
+ const wholeSeriesSessionSchema = z.object({
25664
26647
  id: z.string(),
25665
26648
  startsAt: z.string(),
25666
26649
  endsAt: z.string(),
@@ -25668,14 +26651,14 @@ const courseSessionSchema = z.object({
25668
26651
  capacityOverride: z.number().nullable().optional(),
25669
26652
  overrides: z.record(z.string(), z.unknown()).nullable().optional()
25670
26653
  });
25671
- const courseTeamMemberSummarySchema = z.object({
26654
+ const wholeSeriesTeamMemberSummarySchema = z.object({
25672
26655
  id: z.string(),
25673
26656
  name: z.string(),
25674
26657
  roleLabel: z.string().nullable(),
25675
26658
  summary: z.string().nullable(),
25676
26659
  profilePath: z.string().nullable()
25677
26660
  });
25678
- const coursePricingOptionSchema = z.object({
26661
+ const wholeSeriesPricingOptionSchema = z.object({
25679
26662
  id: z.string(),
25680
26663
  name: z.string(),
25681
26664
  description: z.string().nullable(),
@@ -25691,7 +26674,7 @@ const coursePricingOptionSchema = z.object({
25691
26674
  "both"
25692
26675
  ]).nullable().optional()
25693
26676
  });
25694
- const coursePricingSchema = z.object({
26677
+ const wholeSeriesPricingSchema = z.object({
25695
26678
  bookingRequirement: z.enum(["none", "required"]),
25696
26679
  pricingStrategy: z.enum([
25697
26680
  "free",
@@ -25705,22 +26688,20 @@ const coursePricingSchema = z.object({
25705
26688
  slidingMaxAmount: z.number().nullable().optional(),
25706
26689
  slidingSuggestedAmount: z.number().nullable().optional(),
25707
26690
  paymentTerms: blockBookingPaymentTermsSchema,
25708
- options: z.array(coursePricingOptionSchema)
26691
+ options: z.array(wholeSeriesPricingOptionSchema)
25709
26692
  });
25710
- /**
25711
- * Zod schema for public course data
25712
- */
25713
26693
  const publicWholeSeriesOfferingSchema = z.object({
25714
26694
  eventSeriesId: z.string(),
25715
26695
  eventOfferingId: z.string(),
25716
26696
  title: z.string(),
25717
26697
  slug: z.string(),
25718
26698
  description: z.unknown().nullable(),
25719
- teamMembers: z.array(courseTeamMemberSummarySchema).optional(),
26699
+ teamMembers: z.array(wholeSeriesTeamMemberSummarySchema).optional(),
25720
26700
  enrollmentOpen: z.boolean(),
25721
- pricing: coursePricingSchema,
26701
+ pricing: wholeSeriesPricingSchema,
25722
26702
  currency: z.string(),
25723
26703
  paymentTerms: blockBookingPaymentTermsSchema,
26704
+ consent: blockBookingConsentSchema.nullable(),
25724
26705
  enrollmentCapacity: z.number().nullable(),
25725
26706
  acceptsMemberships: z.boolean(),
25726
26707
  status: z.enum([
@@ -25731,12 +26712,10 @@ const publicWholeSeriesOfferingSchema = z.object({
25731
26712
  sessionsCount: z.number(),
25732
26713
  enrolledCount: z.number(),
25733
26714
  availableSpots: z.number().nullable(),
25734
- sessions: z.array(courseSessionSchema),
25735
- venue: courseVenueSchema.nullable()
26715
+ sessions: z.array(wholeSeriesSessionSchema),
26716
+ venue: wholeSeriesVenueSchema.nullable()
25736
26717
  });
25737
- /** Deployed course blocks retain this schema alias for stored content. */
25738
- const publicCourseSchema = publicWholeSeriesOfferingSchema;
25739
- const publicCoursesArraySchema = z.array(publicWholeSeriesOfferingSchema);
26718
+ const publicWholeSeriesOfferingsArraySchema = z.array(publicWholeSeriesOfferingSchema);
25740
26719
  //#endregion
25741
26720
  //#region ../blocks/src/system/blocks/events/shared/schemas.ts
25742
26721
  const eventPresetSchema = z.enum([
@@ -26040,6 +27019,7 @@ const publicEventSchema = z.object({
26040
27019
  timeZone: z.string(),
26041
27020
  pricing: publicEventPricingSchema,
26042
27021
  paymentTerms: blockBookingPaymentTermsSchema,
27022
+ consent: blockBookingConsentSchema.nullable(),
26043
27023
  accessRestriction: accessRestrictionSchema,
26044
27024
  allowedCategoryIds: z.array(z.string()),
26045
27025
  requireGuestDetails: z.boolean().optional(),
@@ -26047,7 +27027,7 @@ const publicEventSchema = z.object({
26047
27027
  acceptsMemberships: z.boolean().optional(),
26048
27028
  wholeSeries: z.object({
26049
27029
  eventSeriesId: z.string(),
26050
- pricing: coursePricingSchema,
27030
+ pricing: wholeSeriesPricingSchema,
26051
27031
  currency: z.string(),
26052
27032
  enrollmentOpen: z.boolean()
26053
27033
  }).nullable().optional()
@@ -26056,24 +27036,19 @@ const publicEventSchema = z.object({
26056
27036
  * Schema for an array of public events
26057
27037
  */
26058
27038
  const publicEventsArraySchema = z.array(publicEventSchema);
27039
+ //#endregion
27040
+ //#region ../blocks/src/system/blocks/events/shared/fields.ts
26059
27041
  /**
26060
27042
  * Shared card styling fields for event blocks
26061
27043
  */
26062
27044
  const cardStylingFields = [
26063
- {
26064
- id: "cardVariant",
26065
- type: "select",
27045
+ cardStylesField({
27046
+ id: "_cardStyles",
26066
27047
  label: "Card style",
26067
- description: "Choose a card style from your theme",
26068
- required: false,
26069
- multiple: false,
26070
- defaultValue: "default",
26071
- options: cardVariantRoleValues.map((value) => ({
26072
- value,
26073
- label: value === "default" ? "Default" : "Alternative"
26074
- })),
26075
- ui: { intent: "style" }
26076
- },
27048
+ controls: "role-only",
27049
+ renderInHeader: false,
27050
+ intent: "style"
27051
+ }),
26077
27052
  createButtonVariantField({ description: "Choose a button style from your theme" }),
26078
27053
  {
26079
27054
  id: "buttonText",
@@ -26212,14 +27187,7 @@ function normalizeIdList(parts) {
26212
27187
  }
26213
27188
  //#endregion
26214
27189
  //#region ../blocks/src/system/blocks/events/shared/filtering.ts
26215
- const eventSurfacePresetValues = [
26216
- "course",
26217
- "term",
26218
- "class",
26219
- "workshop",
26220
- "retreat",
26221
- "performance"
26222
- ];
27190
+ const eventSurfacePresetValues = SURFACE_EVENT_PRESET_VALUES;
26223
27191
  const eventSurfaceScopeValues = [
26224
27192
  "all",
26225
27193
  "regularClassSchedule",
@@ -26400,6 +27368,25 @@ function resolveEventRegistrationScopedEvents(events, context) {
26400
27368
  return applyEventRegistrationScope(events, resolveEventRegistrationScope(context));
26401
27369
  }
26402
27370
  //#endregion
27371
+ //#region ../blocks/src/system/runtime/nodes/event-registration/registrationSurface.ts
27372
+ function planEventRegistrationScope(input) {
27373
+ const subject = input.subject;
27374
+ const selectedRunOffering = input.wholeSeriesOffering;
27375
+ if (subject?.kind !== "eventOffering" || !selectedRunOffering) return {
27376
+ kind: "context",
27377
+ events: resolveEventRegistrationScopedEvents(input.events, {
27378
+ occurrenceContext: input.occurrenceContext,
27379
+ subject
27380
+ })
27381
+ };
27382
+ if (!(selectedRunOffering.eventOfferingId === subject.eventOfferingId && subject.availableEventSeriesIds.some((seriesId) => seriesId === selectedRunOffering.eventSeriesId))) return { kind: "invalidSelectedRun" };
27383
+ return {
27384
+ kind: "selectedRun",
27385
+ events: input.events.filter((event) => event.seriesId === selectedRunOffering.eventSeriesId),
27386
+ offering: selectedRunOffering
27387
+ };
27388
+ }
27389
+ //#endregion
26403
27390
  //#region ../blocks/src/system/runtime/nodes/events/shared/destination.ts
26404
27391
  function isRecord$5(value) {
26405
27392
  return typeof value === "object" && value !== null && !Array.isArray(value);
@@ -26720,8 +27707,8 @@ const eventRegistrationHydrationSchemaShape = {
26720
27707
  occurrenceContext: occurrenceContextSchema.optional(),
26721
27708
  subject: eventRegistrationPageSurfaceSubjectSchema.nullable().optional(),
26722
27709
  events: z.array(eventRegistrationPublicEventSchema).nullable().optional(),
26723
- wholeSeriesOfferings: publicCoursesArraySchema.nullable().optional(),
26724
- wholeSeriesOffering: publicCourseSchema.nullable().optional(),
27710
+ wholeSeriesOfferings: publicWholeSeriesOfferingsArraySchema.nullable().optional(),
27711
+ wholeSeriesOffering: publicWholeSeriesOfferingSchema.nullable().optional(),
26725
27712
  maxTickets: z.string().optional(),
26726
27713
  showVenue: z.boolean().optional(),
26727
27714
  showCapacity: z.boolean().optional(),
@@ -26743,12 +27730,13 @@ const eventRegistrationSourceSchema = z.object({
26743
27730
  portalToken: z.string().nullable().optional(),
26744
27731
  previewToken: z.string().nullable().optional(),
26745
27732
  ...eventRegistrationHydrationSchemaShape,
27733
+ subjectWholeSeriesOffering: publicWholeSeriesOfferingSchema.nullable().optional(),
26746
27734
  className: z.string().nullable().optional(),
26747
27735
  buttonText: z.string().nullable().optional(),
26748
27736
  maxTickets: z.string().nullable().optional(),
26749
27737
  stage: previewStageSchema.optional()
26750
27738
  });
26751
- const eventRegistrationDisplaySchema = z.object({
27739
+ const eventRegistrationDisplaySchema = z.discriminatedUnion("state", [z.object({
26752
27740
  kind: z.literal("event-registration"),
26753
27741
  state: z.literal("generic-shell"),
26754
27742
  className: z.string().nullable(),
@@ -26756,7 +27744,13 @@ const eventRegistrationDisplaySchema = z.object({
26756
27744
  bodyText: z.string(),
26757
27745
  stepLabels: z.array(z.enum(EVENT_REGISTRATION_SHELL_STEP_LABELS)).min(1),
26758
27746
  summaryButtonText: z.string()
26759
- });
27747
+ }), z.object({
27748
+ kind: z.literal("event-registration"),
27749
+ state: z.literal("registration-closed"),
27750
+ className: z.string().nullable(),
27751
+ titleText: z.string(),
27752
+ bodyText: z.string()
27753
+ })]);
26760
27754
  const eventRegistrationHydrationSchema = z.object(eventRegistrationHydrationSchemaShape);
26761
27755
  const eventRegistrationRenderSchema = z.object({
26762
27756
  display: eventRegistrationDisplaySchema,
@@ -26770,6 +27764,13 @@ z.object({
26770
27764
  stage: previewStageSchema.optional()
26771
27765
  });
26772
27766
  function buildEventRegistrationDisplay(source) {
27767
+ if (resolveWholeSeriesOffering(source)?.enrollmentOpen === false) return {
27768
+ kind: "event-registration",
27769
+ state: "registration-closed",
27770
+ className: source.className ?? null,
27771
+ titleText: "Registration closed",
27772
+ bodyText: "This run is no longer open for bookings."
27773
+ };
26773
27774
  const stepLabels = buildEventRegistrationShellStepLabels(source);
26774
27775
  return {
26775
27776
  kind: "event-registration",
@@ -26781,6 +27782,9 @@ function buildEventRegistrationDisplay(source) {
26781
27782
  summaryButtonText: source.buttonText?.trim() || "Register"
26782
27783
  };
26783
27784
  }
27785
+ function resolveWholeSeriesOffering(source) {
27786
+ return source.wholeSeriesOffering ?? source.subjectWholeSeriesOffering ?? null;
27787
+ }
26784
27788
  function buildEventRegistrationShellStepLabels(source) {
26785
27789
  const scopedEvents = scopeEventRegistrationEvents(source);
26786
27790
  if (scopedEvents.length === 0) return EVENT_REGISTRATION_GENERIC_SHELL_STEP_LABELS;
@@ -26796,10 +27800,13 @@ function buildEventRegistrationShellStepLabels(source) {
26796
27800
  }) : false).map((step) => shellLabelForRegistrationStep(step, scopedEvents));
26797
27801
  }
26798
27802
  function scopeEventRegistrationEvents(source) {
26799
- return resolveEventRegistrationScopedEvents(toRegistrationEvents(source.events ?? []), {
27803
+ const scope = planEventRegistrationScope({
27804
+ events: toRegistrationEvents(source.events ?? []),
27805
+ wholeSeriesOffering: source.wholeSeriesOffering,
26800
27806
  occurrenceContext: source.occurrenceContext,
26801
27807
  subject: source.subject
26802
27808
  });
27809
+ return scope.kind === "invalidSelectedRun" ? [] : scope.events;
26803
27810
  }
26804
27811
  function shellLabelForRegistrationStep(step, events) {
26805
27812
  switch (step) {
@@ -26838,7 +27845,7 @@ const eventRegistrationBlockRuntime = defineClientOwnedBlockRuntime({
26838
27845
  subject: source.subject ?? null,
26839
27846
  events: source.events ?? null,
26840
27847
  wholeSeriesOfferings: source.wholeSeriesOfferings ?? null,
26841
- wholeSeriesOffering: source.wholeSeriesOffering ?? null,
27848
+ wholeSeriesOffering: resolveWholeSeriesOffering(source),
26842
27849
  maxTickets: source.maxTickets ?? void 0,
26843
27850
  showVenue: source.showVenue,
26844
27851
  showCapacity: source.showCapacity,
@@ -27059,7 +28066,9 @@ const eventRegistrationBlockDefinition = {
27059
28066
  fallback: false
27060
28067
  } },
27061
28068
  events: { $bind: { from: "data.events" } },
27062
- wholeSeriesOffering: { $bind: { from: "data.wholeSeriesOffering.offering" } },
28069
+ wholeSeriesOffering: { $bind: { from: "data.selectedRunOffering.offering" } },
28070
+ subjectWholeSeriesOffering: { $bind: { from: "data.subjectWholeSeriesOffering.offering" } },
28071
+ wholeSeriesOfferings: { $bind: { from: "data.wholeSeriesOfferings" } },
27063
28072
  sitePasses: { $bind: { from: "data.sitePasses" } },
27064
28073
  siteMemberships: { $bind: { from: "data.siteMemberships" } },
27065
28074
  stage: { $bind: {
@@ -27073,7 +28082,9 @@ const eventRegistrationBlockDefinition = {
27073
28082
  runtime: eventRegistrationBlockRuntime,
27074
28083
  dataSchemas: {
27075
28084
  events: publicEventsArraySchema.optional(),
27076
- wholeSeriesOffering: z.object({ offering: publicCourseSchema }).optional(),
28085
+ selectedRunOffering: z.object({ offering: publicWholeSeriesOfferingSchema }).optional(),
28086
+ subjectWholeSeriesOffering: z.object({ offering: publicWholeSeriesOfferingSchema }).optional(),
28087
+ wholeSeriesOfferings: z.array(publicWholeSeriesOfferingSchema).optional(),
27077
28088
  sitePasses: publicPassProductCollectionSchema.optional(),
27078
28089
  siteMemberships: publicMembershipProductCollectionSchema.optional(),
27079
28090
  occurrenceContext: occurrenceContextSchema.optional()
@@ -27090,11 +28101,29 @@ const eventRegistrationBlockDefinition = {
27090
28101
  } },
27091
28102
  readProfile: "registration",
27092
28103
  seriesId: { $bind: { from: "$root.subject.eventSeriesId" } },
28104
+ seriesIds: { $bind: {
28105
+ from: "$root.subject.availableEventSeriesIds",
28106
+ transforms: [{ id: "value.csv" }]
28107
+ } },
28108
+ runSeriesId: { $bind: { from: "$root.entrySubrouteContext.run.seriesId" } },
27093
28109
  includeOccurrenceId: { $bind: { from: "$root.occurrenceContext.id" } }
27094
28110
  },
27095
28111
  mode: "server"
27096
28112
  },
27097
- wholeSeriesOffering: {
28113
+ selectedRunOffering: {
28114
+ endpoint: "getPublicWholeSeriesOffering",
28115
+ params: {
28116
+ siteId: { $bind: { from: "$root.siteId" } },
28117
+ eventSeriesId: { $bind: { from: "$root.entrySubrouteContext.run.seriesId" } },
28118
+ stage: { $bind: {
28119
+ from: "$root.previewStage",
28120
+ fallback: "published"
28121
+ } }
28122
+ },
28123
+ requiredParams: ["eventSeriesId"],
28124
+ mode: "server"
28125
+ },
28126
+ subjectWholeSeriesOffering: {
27098
28127
  endpoint: "getPublicWholeSeriesOffering",
27099
28128
  when: { $bind: {
27100
28129
  from: "$root.subject.isWholeSeriesBooking",
@@ -27111,6 +28140,22 @@ const eventRegistrationBlockDefinition = {
27111
28140
  requiredParams: ["eventSeriesId"],
27112
28141
  mode: "server"
27113
28142
  },
28143
+ wholeSeriesOfferings: {
28144
+ endpoint: "listPublicWholeSeriesOfferings",
28145
+ params: {
28146
+ siteId: { $bind: { from: "$root.siteId" } },
28147
+ eventSeriesIds: { $bind: {
28148
+ from: "$root.subject.availableEventSeriesIds",
28149
+ transforms: [{ id: "value.csv" }]
28150
+ } },
28151
+ stage: { $bind: {
28152
+ from: "$root.previewStage",
28153
+ fallback: "published"
28154
+ } }
28155
+ },
28156
+ requiredParams: ["eventSeriesIds"],
28157
+ mode: "server"
28158
+ },
27114
28159
  sitePasses: {
27115
28160
  endpoint: "listPublicPasses",
27116
28161
  params: { siteId: { $bind: { from: "$root.siteId" } } },
@@ -27125,13 +28170,9 @@ const eventRegistrationBlockDefinition = {
27125
28170
  };
27126
28171
  //#endregion
27127
28172
  //#region ../blocks/src/system/runtime/nodes/course-registration.interactive.ts
27128
- const courseRegistrationSourceSchema = z.object({
27129
- siteId: z.string().optional(),
27130
- apiBaseUrl: z.string().optional(),
27131
- portalToken: z.string().nullable().optional(),
28173
+ const courseRegistrationHydrationSchemaShape = {
27132
28174
  subject: eventRegistrationPageSurfaceSubjectSchema.nullable().optional(),
27133
- courses: z.array(publicCourseSchema).nullable().optional(),
27134
- className: z.string().nullable().optional(),
28175
+ courses: z.array(publicWholeSeriesOfferingSchema).nullable().optional(),
27135
28176
  showSessions: z.boolean().optional(),
27136
28177
  showPrice: z.boolean().optional(),
27137
28178
  showCapacity: z.boolean().optional(),
@@ -27139,8 +28180,15 @@ const courseRegistrationSourceSchema = z.object({
27139
28180
  successMessage: z.string().optional(),
27140
28181
  waitlistMessage: z.string().optional(),
27141
28182
  membershipMessage: z.string().optional(),
28183
+ buttonVariant: registrationButtonVariantSchema.optional()
28184
+ };
28185
+ const courseRegistrationSourceSchema = z.object({
28186
+ siteId: z.string().optional(),
28187
+ apiBaseUrl: z.string().optional(),
28188
+ portalToken: z.string().nullable().optional(),
28189
+ ...courseRegistrationHydrationSchemaShape,
28190
+ className: z.string().nullable().optional(),
27142
28191
  buttonText: z.string().nullable().optional(),
27143
- buttonVariant: registrationButtonVariantSchema.optional(),
27144
28192
  stage: previewStageSchema.optional()
27145
28193
  });
27146
28194
  const courseRegistrationDisplaySchema = z.object({
@@ -27149,18 +28197,7 @@ const courseRegistrationDisplaySchema = z.object({
27149
28197
  className: z.string().nullable(),
27150
28198
  summaryButtonText: z.string()
27151
28199
  });
27152
- const courseRegistrationHydrationSchema = z.object({
27153
- subject: eventRegistrationPageSurfaceSubjectSchema.nullable().optional(),
27154
- courses: z.array(publicCourseSchema).nullable().optional(),
27155
- showSessions: z.boolean().optional(),
27156
- showPrice: z.boolean().optional(),
27157
- showCapacity: z.boolean().optional(),
27158
- showVenue: z.boolean().optional(),
27159
- successMessage: z.string().optional(),
27160
- waitlistMessage: z.string().optional(),
27161
- membershipMessage: z.string().optional(),
27162
- buttonVariant: registrationButtonVariantSchema.optional()
27163
- });
28200
+ const courseRegistrationHydrationSchema = z.object(courseRegistrationHydrationSchemaShape);
27164
28201
  const courseRegistrationRenderSchema = z.object({
27165
28202
  display: courseRegistrationDisplaySchema,
27166
28203
  hydration: courseRegistrationHydrationSchema
@@ -27365,7 +28402,7 @@ const courseRegistrationBlockDefinition = {
27365
28402
  })]
27366
28403
  }),
27367
28404
  runtime: courseRegistrationBlockRuntime,
27368
- dataSchemas: { courses: publicCoursesArraySchema.optional() },
28405
+ dataSchemas: { courses: publicWholeSeriesOfferingsArraySchema.optional() },
27369
28406
  dataLoaders: { courses: {
27370
28407
  endpoint: "listPublicWholeSeriesOfferings",
27371
28408
  params: {
@@ -27436,6 +28473,22 @@ const eventDetailsManifest = createBlockManifest({
27436
28473
  defaultValue: true,
27437
28474
  ui: { intent: "display" }
27438
28475
  },
28476
+ {
28477
+ id: "showTitle",
28478
+ type: "boolean",
28479
+ label: "Show event title",
28480
+ required: false,
28481
+ defaultValue: false,
28482
+ ui: { intent: "display" }
28483
+ },
28484
+ {
28485
+ id: "showDescription",
28486
+ type: "boolean",
28487
+ label: "Show event description",
28488
+ required: false,
28489
+ defaultValue: false,
28490
+ ui: { intent: "display" }
28491
+ },
27439
28492
  {
27440
28493
  id: "showMap",
27441
28494
  type: "boolean",
@@ -27472,10 +28525,22 @@ const eventDetailsManifest = createBlockManifest({
27472
28525
  {
27473
28526
  value: "10",
27474
28527
  label: "10 dates"
28528
+ },
28529
+ {
28530
+ value: "all",
28531
+ label: "All dates"
27475
28532
  }
27476
28533
  ],
27477
28534
  ui: { intent: "display" }
27478
28535
  },
28536
+ {
28537
+ id: "showCapacity",
28538
+ type: "boolean",
28539
+ label: "Show capacity",
28540
+ required: false,
28541
+ defaultValue: false,
28542
+ ui: { intent: "display" }
28543
+ },
27479
28544
  {
27480
28545
  id: "showCost",
27481
28546
  type: "boolean",
@@ -27518,6 +28583,8 @@ const eventDetailsManifest = createBlockManifest({
27518
28583
  } },
27519
28584
  events: { $bind: { from: "data.eventDetailsData.events" } },
27520
28585
  showVenue: { $bind: { from: "content.showVenue" } },
28586
+ showTitle: { $bind: { from: "content.showTitle" } },
28587
+ showDescription: { $bind: { from: "content.showDescription" } },
27521
28588
  showMap: { $bind: { from: "content.showMap" } },
27522
28589
  showOtherDates: { $bind: { from: "content.showOtherDates" } },
27523
28590
  otherDatesLimit: { $bind: {
@@ -27528,6 +28595,10 @@ const eventDetailsManifest = createBlockManifest({
27528
28595
  from: "content.showCost",
27529
28596
  fallback: true
27530
28597
  } },
28598
+ showCapacity: { $bind: {
28599
+ from: "content.showCapacity",
28600
+ fallback: false
28601
+ } },
27531
28602
  showAcceptedPasses: { $bind: {
27532
28603
  from: "content.showAcceptedPasses",
27533
28604
  fallback: true
@@ -27582,6 +28653,11 @@ const eventDetailsBlockDefinition = {
27582
28653
  limit: "100",
27583
28654
  readProfile: "details",
27584
28655
  seriesId: { $bind: { from: "$root.subject.eventSeriesId" } },
28656
+ seriesIds: { $bind: {
28657
+ from: "$root.subject.availableEventSeriesIds",
28658
+ transforms: [{ id: "value.csv" }]
28659
+ } },
28660
+ runSeriesId: { $bind: { from: "$root.entrySubrouteContext.run.seriesId" } },
27585
28661
  includeOccurrenceId: { $bind: { from: "$root.occurrenceContext.id" } }
27586
28662
  },
27587
28663
  mode: "server"
@@ -27767,7 +28843,7 @@ const courseDetailsBlockDefinition = {
27767
28843
  })], { gap: "lg" })
27768
28844
  })]
27769
28845
  }),
27770
- dataSchemas: { courses: publicCoursesArraySchema.optional() },
28846
+ dataSchemas: { courses: publicWholeSeriesOfferingsArraySchema.optional() },
27771
28847
  dataLoaders: { courses: {
27772
28848
  endpoint: "listPublicWholeSeriesOfferings",
27773
28849
  params: {
@@ -27886,8 +28962,8 @@ const eventSpotlightBlockDefinition = {
27886
28962
  from: "content.columns",
27887
28963
  fallback: "3"
27888
28964
  } },
27889
- cardVariant: { $bind: {
27890
- from: "content.cardVariant",
28965
+ cardRole: { $bind: {
28966
+ from: "content._cardStyles.role",
27891
28967
  fallback: "default"
27892
28968
  } },
27893
28969
  buttonVariant: { $bind: {
@@ -28049,6 +29125,7 @@ const eventCollectionSourceSchemaShape = {
28049
29125
  showVenue: z.boolean().nullable().optional(),
28050
29126
  showMap: z.boolean().nullable().optional(),
28051
29127
  showCapacity: z.boolean().nullable().optional(),
29128
+ cardRole: cardRoleSchema.optional(),
28052
29129
  buttonVariant: eventButtonVariantSchema.optional(),
28053
29130
  buttonText: z.string().optional(),
28054
29131
  emptyMessage: z.string().optional(),
@@ -28076,6 +29153,7 @@ const eventCollectionDisplaySchemaShape = {
28076
29153
  showVenue: z.boolean(),
28077
29154
  showMap: z.boolean(),
28078
29155
  showCapacity: z.boolean(),
29156
+ cardRole: cardRoleSchema,
28079
29157
  buttonVariant: eventButtonVariantSchema,
28080
29158
  buttonText: z.string(),
28081
29159
  emptyMessage: z.string()
@@ -28125,6 +29203,7 @@ function buildEventCollectionPresentationDisplay(source) {
28125
29203
  showVenue: source.showVenue ?? true,
28126
29204
  showMap: source.showMap ?? true,
28127
29205
  showCapacity: source.showCapacity ?? true,
29206
+ cardRole: source.cardRole ?? "default",
28128
29207
  buttonVariant: source.buttonVariant ?? "primary",
28129
29208
  buttonText: source.buttonText ?? "Book",
28130
29209
  emptyMessage: source.emptyMessage ?? "No upcoming events scheduled."
@@ -28142,8 +29221,6 @@ function buildEventCollectionHydration(source) {
28142
29221
  }
28143
29222
  //#endregion
28144
29223
  //#region ../blocks/src/system/runtime/nodes/events/EventListing.interactive.ts
28145
- const legacyEventCardVariantSchema = z.enum(["variant1", "variant2"]);
28146
- const eventCardVariantInputSchema = z.union([cardVariantRoleSchema, legacyEventCardVariantSchema]);
28147
29224
  const cardOrientationSchema = z.enum(["vertical", "horizontal"]);
28148
29225
  const eventSurfaceScopeSchema = z.enum(eventSurfaceScopeValues);
28149
29226
  const eventScheduleScopeSchema = z.enum(eventScheduleScopeValues);
@@ -28158,7 +29235,7 @@ const eventListingSourceSchema = z.object({
28158
29235
  paginationMode: z.enum(["loadMore", "seeAllLink"]).optional(),
28159
29236
  seeAllUrl: z.string().optional(),
28160
29237
  loadMoreText: z.string().optional(),
28161
- cardVariant: eventCardVariantInputSchema.optional(),
29238
+ cardRole: cardRoleSchema.optional(),
28162
29239
  buttonVariant: eventButtonVariantSchema.optional(),
28163
29240
  buttonText: z.string().optional(),
28164
29241
  showVenue: z.boolean().optional(),
@@ -28180,7 +29257,7 @@ const eventListingDisplaySchema = z.object({
28180
29257
  emptyMessage: z.string(),
28181
29258
  loadingMessage: z.string(),
28182
29259
  containerClass: z.string(),
28183
- cardVariant: cardVariantRoleSchema,
29260
+ cardRole: cardRoleSchema,
28184
29261
  buttonVariant: eventButtonVariantSchema,
28185
29262
  buttonText: z.string(),
28186
29263
  showVenue: z.boolean(),
@@ -28236,7 +29313,7 @@ const eventListingBlockRuntime = defineProgressiveBlockRuntime({
28236
29313
  emptyMessage: source.emptyMessage ?? "No upcoming events scheduled.",
28237
29314
  loadingMessage: "Loading events…",
28238
29315
  containerClass: getContainerClass(layout, source.columns ?? "3"),
28239
- cardVariant: normalizeCardVariantRole(source.cardVariant) ?? "default",
29316
+ cardRole: source.cardRole ?? "default",
28240
29317
  buttonVariant: source.buttonVariant ?? "primary",
28241
29318
  buttonText: source.buttonText ?? "Book",
28242
29319
  showVenue: source.showVenue ?? true,
@@ -28558,8 +29635,8 @@ const eventListingBlockDefinition = {
28558
29635
  from: "content.loadMoreText",
28559
29636
  fallback: "Load more events"
28560
29637
  } },
28561
- cardVariant: { $bind: {
28562
- from: "content.cardVariant",
29638
+ cardRole: { $bind: {
29639
+ from: "content._cardStyles.role",
28563
29640
  fallback: "default"
28564
29641
  } },
28565
29642
  buttonVariant: { $bind: {
@@ -28829,6 +29906,10 @@ const eventCalendarLayout = [styledSection({
28829
29906
  filterCategoryIds: { $bind: { from: "content.filterCategoryIds" } },
28830
29907
  filterStaffMemberId: { $bind: { from: "content.filterStaffMemberId" } },
28831
29908
  filterVenueId: { $bind: { from: "content.filterVenueId" } },
29909
+ cardRole: { $bind: {
29910
+ from: "content._cardStyles.role",
29911
+ fallback: "default"
29912
+ } },
28832
29913
  buttonVariant: { $bind: {
28833
29914
  from: "content.buttonVariant",
28834
29915
  fallback: "primary"
@@ -29461,11 +30542,11 @@ const eventCalendarAdditionalFields = [
29461
30542
  searchThreshold: 8
29462
30543
  }
29463
30544
  }),
29464
- ...cardStylingFields.filter((f) => f.id === "buttonVariant" || f.id === "buttonText").map((field) => ({
30545
+ ...cardStylingFields.map((field) => ({
29465
30546
  ...field,
29466
30547
  ui: {
29467
30548
  ...field.ui ?? {},
29468
- intent: field.id === "buttonVariant" ? "style" : "content"
30549
+ intent: field.id === "_cardStyles" || field.id === "buttonVariant" ? "style" : "content"
29469
30550
  }
29470
30551
  })),
29471
30552
  {
@@ -29938,7 +31019,7 @@ const publicRouteCandidatesSchema = z.object({ routes: z.array(z.object({
29938
31019
  entityId: z.string(),
29939
31020
  path: z.string(),
29940
31021
  title: z.string(),
29941
- kind: z.enum(["page", "content"]),
31022
+ kind: z.enum(RESOLVED_INTERNAL_LINK_ENTITY_TYPES),
29942
31023
  contentTypeKey: z.string().nullable().optional()
29943
31024
  })) });
29944
31025
  const groupOverrideFields = [
@@ -30232,7 +31313,7 @@ const offeringsPreviewBlockDefinition = {
30232
31313
  dataSchemas: {
30233
31314
  ...offeringsPreviewEventDataSchemas,
30234
31315
  routeCandidates: publicRouteCandidatesSchema.optional(),
30235
- courses: publicCoursesArraySchema.optional()
31316
+ courses: publicWholeSeriesOfferingsArraySchema.optional()
30236
31317
  },
30237
31318
  dataLoaders: {
30238
31319
  ...offeringsPreviewEventDataLoaders,
@@ -31704,7 +32785,7 @@ const audioPlayerBlockDefinition = { manifest: createBlockManifest({
31704
32785
  }
31705
32786
  ],
31706
32787
  layout: styledSection({
31707
- children: stack({ className: "rb-container rb-mx-auto rb-max-w-3xl" }, [el("div", { className: "card-role-default" }, [media({
32788
+ children: stack({ className: "rb-container rb-mx-auto rb-max-w-3xl" }, [el("div", { className: boxStyleClassNames({ role: "default" }, {}) }, [media({
31708
32789
  className: "card-media rb-aspect-video rb-w-full rb-object-cover",
31709
32790
  size: {
31710
32791
  width: 960,
@@ -34756,16 +35837,27 @@ function eventListCapable() {
34756
35837
  looks: "supported",
34757
35838
  sectionSurfaces: "supported",
34758
35839
  contentFrames: ["plain", "panel"],
34759
- cardRoles: "unsupported",
35840
+ cardRoles: "supported",
34760
35841
  eventListTreatments
34761
35842
  });
34762
35843
  }
35844
+ function eventSpotlightCapable() {
35845
+ return declareBlockDesignCapability({
35846
+ sectionSurfaces: "supported",
35847
+ contentFrames: ["plain"],
35848
+ cardRoles: "supported"
35849
+ });
35850
+ }
34763
35851
  function offeringsPreviewCapable() {
34764
35852
  return declareBlockDesignCapability({
34765
35853
  looks: "supported",
34766
35854
  sectionSurfaces: "supported",
34767
35855
  contentFrames: ["plain"],
34768
- cardRoles: "supported"
35856
+ cardRoles: "supported",
35857
+ compositions: {
35858
+ kind: "offerings-preview",
35859
+ treatments: offeringsPreviewCompositionTreatmentValues
35860
+ }
34769
35861
  });
34770
35862
  }
34771
35863
  function defaultBoundaryBias(visualWeight) {
@@ -35058,7 +36150,7 @@ const systemBlockDefinitions = [
35058
36150
  cardRoles: "supported",
35059
36151
  compositions: {
35060
36152
  kind: "testimonials",
35061
- treatments: ["open-editorial"]
36153
+ treatments: testimonialsCompositionTreatmentValues
35062
36154
  },
35063
36155
  headingDecorationCapability: {
35064
36156
  kind: "supported",
@@ -35213,7 +36305,7 @@ const systemBlockDefinitions = [
35213
36305
  weight: "standard"
35214
36306
  })]
35215
36307
  })),
35216
- withDesignCapability("block.event-spotlight", eventSpotlightBlockDefinition, sectionOnly(), defineBlockDesignMetadata({
36308
+ withDesignCapability("block.event-spotlight", eventSpotlightBlockDefinition, eventSpotlightCapable(), defineBlockDesignMetadata({
35217
36309
  flow: offeringsFlow,
35218
36310
  layoutProfiles: [layoutProfile({
35219
36311
  variantKey: "default",
@@ -36452,184 +37544,29 @@ const EVENT_ATTENDEE_REFUND_INVALID_CODES = ["manual_booking_not_refundable", ..
36452
37544
  [...EVENT_ATTENDEE_REFUND_INVALID_CODES, ...CANONICAL_ADMIN_REFUND_FAILURE_CODES];
36453
37545
  [...STANDARD_LINE_ITEM_REFUND_INVALID_CODES, ...CANONICAL_ADMIN_REFUND_FAILURE_CODES];
36454
37546
  //#endregion
36455
- //#region ../api/src/bookingVerticalPreset.ts
36456
- const BOOKING_ENGINE_BY_BEHAVIOUR = {
36457
- class: "event_series",
36458
- workshop: "event_series",
36459
- course: "event_series",
36460
- retreat: "event_series",
36461
- performance: "event_series",
36462
- appointment: "appointment_service"
36463
- };
36464
- function verticalBookingPreset(id, verticalId, canonicalBehaviour, label, pluralLabel, description, availability = "onboarding") {
36465
- return {
36466
- id,
36467
- verticalId,
36468
- canonicalBehaviour,
36469
- engine: BOOKING_ENGINE_BY_BEHAVIOUR[canonicalBehaviour],
36470
- availability,
36471
- label,
36472
- pluralLabel,
36473
- description
36474
- };
36475
- }
36476
- //#endregion
36477
- //#region ../api/src/bookingVerticalCatalog.ts
36478
- const VERTICAL_BOOKING_PRESETS = [
36479
- verticalBookingPreset("yoga_wellness.classes", "yoga_wellness", "class", "Class", "Classes", "Regular scheduled classes and group sessions."),
36480
- verticalBookingPreset("yoga_wellness.workshops", "yoga_wellness", "workshop", "Workshop", "Workshops", "One-off workshops, day retreats, or special sessions."),
36481
- verticalBookingPreset("yoga_wellness.courses", "yoga_wellness", "course", "Course", "Courses", "Fixed-schedule courses or multi-session groups."),
36482
- verticalBookingPreset("yoga_wellness.retreats", "yoga_wellness", "retreat", "Retreat", "Retreats", "Multi-day or residential retreats and immersive experiences."),
36483
- verticalBookingPreset("yoga_wellness.appointments", "yoga_wellness", "appointment", "Appointment", "Appointments", "Private sessions, consultations, or one-to-one support."),
36484
- verticalBookingPreset("fitness_pt.group_training", "fitness_pt", "class", "Group training", "Group training", "Regular scheduled classes and group sessions."),
36485
- verticalBookingPreset("fitness_pt.personal_training", "fitness_pt", "appointment", "Personal training", "Personal training", "One-to-one sessions booked from your availability."),
36486
- verticalBookingPreset("fitness_pt.programmes", "fitness_pt", "course", "Programme", "Programmes", "Multi-session programmes like bootcamps or courses."),
36487
- verticalBookingPreset("fitness_pt.workshops", "fitness_pt", "workshop", "Workshop", "Workshops", "One-off workshops, events, or special sessions."),
36488
- verticalBookingPreset("fitness_pt.retreats", "fitness_pt", "retreat", "Retreat", "Retreats", "Multi-day or residential fitness experiences."),
36489
- verticalBookingPreset("dance_school.classes", "dance_school", "class", "Class", "Classes", "Regular group classes and weekly sessions."),
36490
- verticalBookingPreset("dance_school.terms", "dance_school", "course", "Term", "Terms", "Multi-week term blocks or fixed-date course groups."),
36491
- verticalBookingPreset("dance_school.courses", "dance_school", "course", "Course", "Courses", "Fixed-schedule courses or multi-session groups.", "settings"),
36492
- verticalBookingPreset("dance_school.workshops", "dance_school", "workshop", "Workshop", "Workshops", "One-off workshops, masterclasses, or intensives."),
36493
- verticalBookingPreset("dance_school.private_lessons", "dance_school", "appointment", "Private lesson", "Private lessons", "One-to-one lessons or coaching sessions."),
36494
- verticalBookingPreset("dance_school.shows", "dance_school", "performance", "Show", "Shows", "Ticketed performances, showcases, and recitals."),
36495
- verticalBookingPreset("physiotherapy_physical_health.appointments", "physiotherapy_physical_health", "appointment", "Appointment", "Appointments", "Assessments, treatments, follow-ups, and rehabilitation sessions."),
36496
- verticalBookingPreset("physiotherapy_physical_health.rehab_classes", "physiotherapy_physical_health", "class", "Rehab class", "Rehab classes", "Regular rehabilitation, mobility, strength, or recovery classes."),
36497
- verticalBookingPreset("physiotherapy_physical_health.workshops", "physiotherapy_physical_health", "workshop", "Workshop", "Workshops", "One-off workshops, talks, or practical group sessions."),
36498
- verticalBookingPreset("massage_bodywork.treatments", "massage_bodywork", "appointment", "Treatment", "Treatments", "Massage treatments, bodywork sessions, and one-to-one appointments."),
36499
- verticalBookingPreset("massage_bodywork.group_sessions", "massage_bodywork", "class", "Group session", "Group sessions", "Regular bodywork, somatic movement, or self-massage sessions."),
36500
- verticalBookingPreset("massage_bodywork.workshops", "massage_bodywork", "workshop", "Workshop", "Workshops", "One-off bodywork, self-massage, or somatic practice workshops."),
36501
- verticalBookingPreset("therapist_practitioner.appointments", "therapist_practitioner", "appointment", "Appointment", "Appointments", "Sessions, consultations, treatments, or assessments."),
36502
- verticalBookingPreset("therapist_practitioner.workshops", "therapist_practitioner", "workshop", "Workshop", "Workshops", "One-off group workshops, talks, or wellbeing sessions."),
36503
- verticalBookingPreset("therapist_practitioner.retreats", "therapist_practitioner", "retreat", "Retreat", "Retreats", "Multi-day retreats or immersive group experiences."),
36504
- verticalBookingPreset("beauty_spa.appointments", "beauty_spa", "appointment", "Appointment", "Appointments", "Treatments, consultations, services, and sessions."),
36505
- verticalBookingPreset("beauty_spa.workshops", "beauty_spa", "workshop", "Workshop", "Workshops", "Skincare workshops, makeup lessons, demos, or group events."),
36506
- verticalBookingPreset("consultant_coach.appointments", "consultant_coach", "appointment", "Appointment", "Appointments", "One-to-one calls, consultations, reviews, or coaching sessions."),
36507
- verticalBookingPreset("consultant_coach.workshops", "consultant_coach", "workshop", "Workshop", "Workshops", "One-off group sessions, webinars, or strategy days."),
36508
- verticalBookingPreset("consultant_coach.courses", "consultant_coach", "course", "Course", "Courses", "Fixed-schedule cohorts or multi-session group programmes."),
36509
- verticalBookingPreset("consultant_coach.retreats", "consultant_coach", "retreat", "Retreat", "Retreats", "Multi-day coaching retreats or immersive experiences."),
36510
- verticalBookingPreset("training_provider.courses", "training_provider", "course", "Course", "Courses", "Fixed-schedule courses, cohorts, and multi-session training."),
36511
- verticalBookingPreset("training_provider.workshops", "training_provider", "workshop", "Workshop", "Workshops", "One-off workshops, masterclasses, and short training sessions."),
36512
- verticalBookingPreset("training_provider.appointments", "training_provider", "appointment", "Appointment", "Appointments", "Consultations, assessments, mentoring, or office hours."),
36513
- verticalBookingPreset("training_provider.classes", "training_provider", "class", "Class", "Classes", "Regular classes, sessions, or groups.", "settings"),
36514
- verticalBookingPreset("training_provider.residentials", "training_provider", "retreat", "Residential", "Residentials", "Residential courses or multi-day training experiences.", "settings"),
36515
- verticalBookingPreset("retreat_centre.retreats", "retreat_centre", "retreat", "Retreat", "Retreats", "Multi-day or residential retreats with richer booking needs."),
36516
- verticalBookingPreset("retreat_centre.workshops", "retreat_centre", "workshop", "Workshop", "Workshops", "One-day retreats, ceremonies, workshops, or special events."),
36517
- verticalBookingPreset("retreat_centre.classes", "retreat_centre", "class", "Class", "Classes", "Regular sessions like guided meditations or group practices."),
36518
- verticalBookingPreset("retreat_centre.courses", "retreat_centre", "course", "Course", "Courses", "Fixed-schedule programmes or multi-session experiences."),
36519
- verticalBookingPreset("retreat_centre.appointments", "retreat_centre", "appointment", "Appointment", "Appointments", "Private sessions, therapies, consultations, or add-ons."),
36520
- verticalBookingPreset("music_school.lessons", "music_school", "appointment", "Lesson", "Lessons", "One-to-one lessons, consultations, or coaching sessions."),
36521
- verticalBookingPreset("music_school.classes", "music_school", "class", "Class", "Classes", "Regular group classes, ensembles, or recurring sessions."),
36522
- verticalBookingPreset("music_school.terms", "music_school", "course", "Term", "Terms", "Multi-week term blocks or fixed-date group courses."),
36523
- verticalBookingPreset("music_school.workshops", "music_school", "workshop", "Workshop", "Workshops", "One-off workshops, masterclasses, or intensives."),
36524
- verticalBookingPreset("music_school.performances", "music_school", "performance", "Performance", "Performances", "Concerts, recitals, showcases, or ticketed performances."),
36525
- verticalBookingPreset("voice_singing.lessons", "voice_singing", "appointment", "Voice session", "Voice sessions", "One-to-one singing lessons, voice coaching, or private practice sessions."),
36526
- verticalBookingPreset("voice_singing.classes", "voice_singing", "class", "Ongoing weekly session", "Ongoing weekly sessions", "Regular choirs, voice circles, community singing, or group practice."),
36527
- verticalBookingPreset("voice_singing.terms", "voice_singing", "course", "Singing term", "Singing terms", "Multi-week choir terms, voice courses, or fixed-date group programmes."),
36528
- verticalBookingPreset("voice_singing.workshops", "voice_singing", "workshop", "Workshop", "Workshops", "One-off singing workshops, voice journeys, or devotional singing sessions."),
36529
- verticalBookingPreset("voice_singing.performances", "voice_singing", "performance", "Performance", "Performances", "Choir concerts, sharing events, recitals, or community performances."),
36530
- verticalBookingPreset("performing_arts_school.classes", "performing_arts_school", "class", "Class", "Classes", "Regular group classes, rehearsals, or weekly sessions."),
36531
- verticalBookingPreset("performing_arts_school.terms", "performing_arts_school", "course", "Term", "Terms", "Multi-week term blocks or fixed-date course groups."),
36532
- verticalBookingPreset("performing_arts_school.workshops", "performing_arts_school", "workshop", "Workshop", "Workshops", "One-off workshops, masterclasses, or intensives."),
36533
- verticalBookingPreset("performing_arts_school.performances", "performing_arts_school", "performance", "Performance", "Performances", "Shows, showcases, productions, or ticketed performances."),
36534
- verticalBookingPreset("performing_arts_school.lessons", "performing_arts_school", "appointment", "Lesson", "Lessons", "One-to-one lessons, coaching, or audition prep."),
36535
- verticalBookingPreset("community_wellbeing.classes", "community_wellbeing", "class", "Class", "Classes", "Regular groups, sessions, practices, or weekly activities."),
36536
- verticalBookingPreset("community_wellbeing.workshops", "community_wellbeing", "workshop", "Workshop", "Workshops", "One-off workshops, talks, events, or gatherings."),
36537
- verticalBookingPreset("community_wellbeing.courses", "community_wellbeing", "course", "Course", "Courses", "Fixed-schedule courses, study groups, or multi-session programmes."),
36538
- verticalBookingPreset("community_wellbeing.appointments", "community_wellbeing", "appointment", "Appointment", "Appointments", "One-to-one appointments, consultations, or support sessions."),
36539
- verticalBookingPreset("community_wellbeing.retreats", "community_wellbeing", "retreat", "Retreat", "Retreats", "Multi-day or residential retreats."),
36540
- verticalBookingPreset("venue_event_space.resource_hire", "venue_event_space", "appointment", "Hire slot", "Hire slots", "Future room, venue, and resource hire bookings.", "future")
36541
- ];
36542
- const VERTICAL_ID_SET = /* @__PURE__ */ new Set([
36543
- "yoga_wellness",
36544
- "fitness_pt",
36545
- "dance_school",
36546
- "physiotherapy_physical_health",
36547
- "massage_bodywork",
36548
- "therapist_practitioner",
36549
- "beauty_spa",
36550
- "consultant_coach",
36551
- "training_provider",
36552
- "retreat_centre",
36553
- "music_school",
36554
- "voice_singing",
36555
- "performing_arts_school",
36556
- "community_wellbeing",
36557
- "venue_event_space"
36558
- ]);
36559
- const VERTICAL_PRESET_ID_SET = new Set(VERTICAL_BOOKING_PRESETS.map((presetDefinition) => presetDefinition.id));
36560
- function parseVerticalId(value) {
36561
- return typeof value === "string" && VERTICAL_ID_SET.has(value) ? value : null;
36562
- }
36563
- function parseVerticalPresetId(value) {
36564
- return typeof value === "string" && VERTICAL_PRESET_ID_SET.has(value) ? value : null;
36565
- }
36566
- function getVerticalPresetDefinition(presetId) {
36567
- const definition = VERTICAL_BOOKING_PRESETS.find((presetDefinition) => presetDefinition.id === presetId);
36568
- if (!definition) throw new Error(`Unhandled vertical preset id: ${presetId}`);
36569
- return definition;
36570
- }
36571
- function toNonEmptyVerticalPresetIds(presetIds) {
36572
- const firstPresetId = presetIds[0];
36573
- return firstPresetId ? [firstPresetId, ...presetIds.slice(1)] : null;
36574
- }
36575
- function createConfiguredSiteVerticalBookingConfig(verticalId, selectedPresetIds) {
36576
- return {
36577
- verticalId,
36578
- selectedPresetIds
36579
- };
36580
- }
36581
- function createSiteVerticalBookingConfig(verticalId, selectedPresetIds) {
36582
- const nonEmptyPresetIds = toNonEmptyVerticalPresetIds(selectedPresetIds);
36583
- return nonEmptyPresetIds ? createConfiguredSiteVerticalBookingConfig(verticalId, nonEmptyPresetIds) : null;
36584
- }
36585
- function resolveSiteVerticalBookingConfig(rawConfig) {
36586
- if (!rawConfig) return {
36587
- kind: "unconfigured",
36588
- config: DEFAULT_SITE_VERTICAL_BOOKING_CONFIG
36589
- };
36590
- const verticalId = parseVerticalId(rawConfig.verticalId);
36591
- const selectedPresetIds = (Array.isArray(rawConfig.selectedPresetIds) ? rawConfig.selectedPresetIds : []).map(parseVerticalPresetId).filter((presetId) => Boolean(presetId));
36592
- const config = {
36593
- verticalId,
36594
- selectedPresetIds
36595
- };
36596
- if (!verticalId && selectedPresetIds.length === 0) return {
36597
- kind: "unconfigured",
36598
- config: DEFAULT_SITE_VERTICAL_BOOKING_CONFIG
36599
- };
36600
- const issues = getSiteVerticalConfigIssues(rawConfig, config);
36601
- if (issues.length > 0) return {
36602
- kind: "invalid",
36603
- config,
36604
- issues
36605
- };
36606
- const configuredConfig = verticalId ? createSiteVerticalBookingConfig(verticalId, selectedPresetIds) : null;
36607
- if (!configuredConfig) return {
36608
- kind: "invalid",
36609
- config,
36610
- issues: ["empty_selected_presets"]
36611
- };
36612
- return {
36613
- kind: "configured",
36614
- config: configuredConfig,
36615
- selectedPresets: configuredConfig.selectedPresetIds.map(getVerticalPresetDefinition)
36616
- };
36617
- }
36618
- function getSiteVerticalConfigIssues(rawConfig, config) {
36619
- const issues = /* @__PURE__ */ new Set();
36620
- if (rawConfig.verticalId != null && !config.verticalId) issues.add("unknown_vertical");
36621
- if (!config.verticalId && config.selectedPresetIds.length > 0) issues.add("missing_vertical");
36622
- if ((Array.isArray(rawConfig.selectedPresetIds) ? rawConfig.selectedPresetIds : []).some((presetId) => parseVerticalPresetId(presetId) === null)) issues.add("unknown_preset");
36623
- if (config.verticalId && config.selectedPresetIds.length === 0) issues.add("empty_selected_presets");
36624
- const seenBehaviours = /* @__PURE__ */ new Set();
36625
- for (const presetId of config.selectedPresetIds) {
36626
- const presetDefinition = getVerticalPresetDefinition(presetId);
36627
- if (config.verticalId && presetDefinition.verticalId !== config.verticalId) issues.add("preset_vertical_mismatch");
36628
- if (presetDefinition.availability === "future") issues.add("future_preset_selected");
36629
- if (seenBehaviours.has(presetDefinition.canonicalBehaviour)) issues.add("duplicate_canonical_behaviour");
36630
- seenBehaviours.add(presetDefinition.canonicalBehaviour);
37547
+ //#region ../api/src/bookingVerticals.ts
37548
+ /**
37549
+ * Transport adapters for the booking-vertical domain.
37550
+ *
37551
+ * The domain catalog and all pure resolution/selection rules live in core;
37552
+ * this module owns only the Zod boundary used by API payloads.
37553
+ */
37554
+ function formatRawDiagnosticValue(value) {
37555
+ const serialized = JSON.stringify(value);
37556
+ return serialized === void 0 ? String(value) : serialized;
37557
+ }
37558
+ function describeSiteVerticalConfigIssue(issue) {
37559
+ switch (issue.code) {
37560
+ case "unknown_vertical": return `${issue.code}: ${formatRawDiagnosticValue(issue.rawValue)}`;
37561
+ case "unknown_preset": return `${issue.code}: ${formatRawDiagnosticValue(issue.rawValue)}`;
37562
+ case "missing_vertical":
37563
+ case "empty_selected_presets":
37564
+ case "preset_vertical_mismatch":
37565
+ case "duplicate_preset_id":
37566
+ case "duplicate_canonical_behaviour":
37567
+ case "future_preset_selected": return issue.code;
37568
+ default: return assertNever$2(issue);
36631
37569
  }
36632
- return [...issues];
36633
37570
  }
36634
37571
  const VerticalIdSchema = z.string().trim().transform((value, ctx) => {
36635
37572
  const parsed = parseVerticalId(value);
@@ -36661,16 +37598,12 @@ z.object({
36661
37598
  if (resolved.kind === "invalid") {
36662
37599
  ctx.addIssue({
36663
37600
  code: z.ZodIssueCode.custom,
36664
- message: `Invalid booking vertical config: ${resolved.issues.join(", ")}`
37601
+ message: `Invalid booking vertical config: ${resolved.issues.map(describeSiteVerticalConfigIssue).join(", ")}`
36665
37602
  });
36666
37603
  return z.NEVER;
36667
37604
  }
36668
37605
  return resolved.config;
36669
37606
  });
36670
- const DEFAULT_SITE_VERTICAL_BOOKING_CONFIG = {
36671
- verticalId: null,
36672
- selectedPresetIds: []
36673
- };
36674
37607
  //#endregion
36675
37608
  //#region ../api/src/utils/isRecord.ts
36676
37609
  function isRecord(value) {