@riverbankcms/sdk 0.151.0 → 0.152.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 (226) hide show
  1. package/CHANGELOG.md +37 -0
  2. package/dist/{EventEmbeddedCheckoutStep-BBHbM22D.mjs → EventEmbeddedCheckoutStep-DVQXWFm6.mjs} +10 -9
  3. package/dist/{PreviewEditorSidebar-BHplI9HE.mjs → PreviewEditorSidebar-Dr4NJi3Q.mjs} +4 -3
  4. package/dist/{PreviewEditorUI-DuyN8nsD.mjs → PreviewEditorUI-DSZXQbyh.mjs} +5 -4
  5. package/dist/{SdkPreviewModeRuntime-CR5ypwxJ.mjs → SdkPreviewModeRuntime-Dl4GyMc3.mjs} +124 -53
  6. package/dist/{SiteChromeCustomizeContext-D5t6joF_.mjs → SiteChromeCustomizeContext-DgBe-FlM.mjs} +20418 -32298
  7. package/dist/ThemedButton-B8ViBnLK.mjs +16350 -0
  8. package/dist/_dts/api/src/bookingOperations.d.ts +5 -3
  9. package/dist/_dts/api/src/commercePortalEndpoints.d.ts +4 -0
  10. package/dist/_dts/api/src/endpoints.d.ts +7 -0
  11. package/dist/_dts/api/src/index.d.ts +1 -1
  12. package/dist/_dts/api/src/navigation/types.d.ts +7 -0
  13. package/dist/_dts/api/src/navigation.d.ts +1 -1
  14. package/dist/_dts/api/src/publicAppointmentBookingContracts.d.ts +10 -1
  15. package/dist/_dts/api/src/siteAssets.d.ts +1 -0
  16. package/dist/_dts/blocks/src/definitions.d.ts +1 -1
  17. package/dist/_dts/blocks/src/index.d.ts +1 -0
  18. package/dist/_dts/blocks/src/pageRenderPreparation.d.ts +1 -0
  19. package/dist/_dts/blocks/src/pageRendererContracts.d.ts +1 -1
  20. package/dist/_dts/blocks/src/primitives/content/utils/sanitizeHref.d.ts +1 -1
  21. package/dist/_dts/blocks/src/system/blocks/event-registration.d.ts +4 -4
  22. package/dist/_dts/blocks/src/system/blocks/events/shared/schemas.d.ts +16 -0
  23. package/dist/_dts/blocks/src/system/blocks/events/shared/types.d.ts +5 -0
  24. package/dist/_dts/blocks/src/system/blocks/offerings-preview/model.d.ts +2 -0
  25. package/dist/_dts/blocks/src/system/helpers/normalizeMailingListBlockContent.d.ts +2 -0
  26. package/dist/_dts/blocks/src/system/registry.d.ts +14 -2
  27. package/dist/_dts/blocks/src/system/runtime/api/client.d.ts +0 -5
  28. package/dist/_dts/blocks/src/system/runtime/api/index.d.ts +2 -0
  29. package/dist/_dts/blocks/src/system/runtime/api/schemas/events.d.ts +971 -0
  30. package/dist/_dts/blocks/src/system/runtime/api/schemas/waitlist-claims.d.ts +42 -0
  31. package/dist/_dts/blocks/src/system/runtime/api/types/appointments.d.ts +10 -2
  32. package/dist/_dts/blocks/src/system/runtime/api/types/events.d.ts +10 -136
  33. package/dist/_dts/blocks/src/system/runtime/components/registry.client.d.ts +48 -6
  34. package/dist/_dts/blocks/src/system/runtime/components/runtime-backed-blocks.d.ts +24 -3
  35. package/dist/_dts/blocks/src/system/runtime/hooks/useBookingSubmission.state.d.ts +2 -0
  36. package/dist/_dts/blocks/src/system/runtime/hooks/useHeadlessBookingFlow.d.ts +3 -1
  37. package/dist/_dts/blocks/src/system/runtime/hooks/useHeadlessBookingFlow.state.d.ts +1 -1
  38. package/dist/_dts/blocks/src/system/runtime/nodes/booking-form.headless.state.d.ts +23 -0
  39. package/dist/_dts/blocks/src/system/runtime/nodes/booking-form.state.d.ts +6 -2
  40. package/dist/_dts/blocks/src/system/runtime/nodes/carousel.client.hooks.d.ts +6 -0
  41. package/dist/_dts/blocks/src/system/runtime/nodes/carousel.client.state.d.ts +7 -0
  42. package/dist/_dts/blocks/src/system/runtime/nodes/event-registration/BookingEntryViews.d.ts +42 -0
  43. package/dist/_dts/blocks/src/system/runtime/nodes/event-registration/EventEmbeddedCheckoutStep.d.ts +4 -1
  44. package/dist/_dts/blocks/src/system/runtime/nodes/event-registration/EventRegistrationBookingLayer.d.ts +19 -9
  45. package/dist/_dts/blocks/src/system/runtime/nodes/event-registration/EventRegistrationPayment.d.ts +4 -2
  46. package/dist/_dts/blocks/src/system/runtime/nodes/event-registration/EventRegistrationSurface.d.ts +24 -9
  47. package/dist/_dts/blocks/src/system/runtime/nodes/event-registration/EventRegistrationWizardContent.d.ts +4 -2
  48. package/dist/_dts/blocks/src/system/runtime/nodes/event-registration/EventSelectionStep.d.ts +5 -4
  49. package/dist/_dts/blocks/src/system/runtime/nodes/event-registration/GuestDetailsSection.d.ts +1 -1
  50. package/dist/_dts/blocks/src/system/runtime/nodes/event-registration/PaymentStatusStep.d.ts +2 -0
  51. package/dist/_dts/blocks/src/system/runtime/nodes/event-registration/SingleTicketEntitlementNote.d.ts +11 -0
  52. package/dist/_dts/blocks/src/system/runtime/nodes/event-registration/SuccessStep.d.ts +4 -0
  53. package/dist/_dts/blocks/src/system/runtime/nodes/event-registration/TicketSelectionStep.d.ts +5 -0
  54. package/dist/_dts/blocks/src/system/runtime/nodes/event-registration/VerifyingTimeoutStep.d.ts +2 -0
  55. package/dist/_dts/blocks/src/system/runtime/nodes/event-registration/bookingCardDisplay.d.ts +31 -0
  56. package/dist/_dts/blocks/src/system/runtime/nodes/event-registration/bookingEntry.d.ts +154 -0
  57. package/dist/_dts/blocks/src/system/runtime/nodes/event-registration/bookingFocus.d.ts +12 -0
  58. package/dist/_dts/blocks/src/system/runtime/nodes/event-registration/event-registration.headless.contract.d.ts +2 -2
  59. package/dist/_dts/blocks/src/system/runtime/nodes/event-registration/event-registration.headless.planning.d.ts +2 -2
  60. package/dist/_dts/blocks/src/system/runtime/nodes/event-registration/eventSourceRecovery.d.ts +9 -0
  61. package/dist/_dts/blocks/src/system/runtime/nodes/event-registration/finishedBooking.d.ts +77 -0
  62. package/dist/_dts/blocks/src/system/runtime/nodes/event-registration/index.d.ts +0 -1
  63. package/dist/_dts/blocks/src/system/runtime/nodes/event-registration/offeringNoun.d.ts +12 -0
  64. package/dist/_dts/blocks/src/system/runtime/nodes/event-registration/paymentResponse.d.ts +2 -1
  65. package/dist/_dts/blocks/src/system/runtime/nodes/event-registration/registrationCompletion.d.ts +33 -1
  66. package/dist/_dts/blocks/src/system/runtime/nodes/event-registration/registrationDerivations.d.ts +11 -0
  67. package/dist/_dts/blocks/src/system/runtime/nodes/event-registration/registrationDisplay.d.ts +31 -0
  68. package/dist/_dts/blocks/src/system/runtime/nodes/event-registration/registrationDraft.state.d.ts +60 -0
  69. package/dist/_dts/blocks/src/system/runtime/nodes/event-registration/registrationErrorRecovery.d.ts +1 -1
  70. package/dist/_dts/blocks/src/system/runtime/nodes/event-registration/registrationEventAdapter.d.ts +3 -0
  71. package/dist/_dts/blocks/src/system/runtime/nodes/event-registration/registrationStateMachine.d.ts +58 -10
  72. package/dist/_dts/blocks/src/system/runtime/nodes/event-registration/registrationSurface.d.ts +17 -0
  73. package/dist/_dts/blocks/src/system/runtime/nodes/event-registration/types.d.ts +23 -7
  74. package/dist/_dts/blocks/src/system/runtime/nodes/event-registration/useBookingBarFacts.d.ts +12 -0
  75. package/dist/_dts/blocks/src/system/runtime/nodes/event-registration/useEventRegistrationRecoveryRequest.d.ts +3 -0
  76. package/dist/_dts/blocks/src/system/runtime/nodes/event-registration/useEventRegistrationStripeReturn.d.ts +4 -0
  77. package/dist/_dts/blocks/src/system/runtime/nodes/event-registration/useEventRegistrationSubmit.d.ts +4 -11
  78. package/dist/_dts/blocks/src/system/runtime/nodes/event-registration/useEventRegistrationWizard.d.ts +1563 -31
  79. package/dist/_dts/blocks/src/system/runtime/nodes/event-registration/useEventSourceRecovery.d.ts +2 -12
  80. package/dist/_dts/blocks/src/system/runtime/nodes/event-registration/usePaymentStatusRecovery.d.ts +147 -4
  81. package/dist/_dts/blocks/src/system/runtime/nodes/event-registration/utils.d.ts +50 -2
  82. package/dist/_dts/blocks/src/system/runtime/nodes/event-registration/waitlistClaimRestoration.d.ts +6 -5
  83. package/dist/_dts/blocks/src/system/runtime/nodes/event-registration/wizardSteps.d.ts +85 -15
  84. package/dist/_dts/blocks/src/system/runtime/nodes/event-registration.interactive.d.ts +53 -8
  85. package/dist/_dts/blocks/src/system/runtime/nodes/events/shared/MonthLookView.d.ts +10 -3
  86. package/dist/_dts/blocks/src/system/runtime/nodes/events/shared/eventCollectionContract.d.ts +16 -0
  87. package/dist/_dts/blocks/src/system/runtime/shared/bookingPaymentOptionCopy.d.ts +5 -1
  88. package/dist/_dts/blocks/src/system/runtime/shared/bookingPaymentOptions.d.ts +37 -1
  89. package/dist/_dts/blocks/src/system/runtime/shared/components/ModalShell.d.ts +9 -2
  90. package/dist/_dts/blocks/src/system/runtime/shared/components/PaymentChoiceRows.d.ts +28 -0
  91. package/dist/_dts/blocks/src/system/runtime/shared/components/StepIndicator.d.ts +6 -8
  92. package/dist/_dts/blocks/src/system/runtime/shared/components/index.d.ts +2 -2
  93. package/dist/_dts/blocks/src/system/runtime/shared/index.d.ts +2 -2
  94. package/dist/_dts/blocks/src/system/runtime/shared/useWaitlistClaim.d.ts +9 -12
  95. package/dist/_dts/blocks/src/system/runtime/shared/useWaitlistClaim.state.d.ts +15 -0
  96. package/dist/_dts/blocks/src/system/runtime/shared/utils/themePortalRoot.d.ts +10 -15
  97. package/dist/_dts/blocks/src/system/transforms/registry/index.d.ts +1 -0
  98. package/dist/_dts/blocks/src/system/transforms/registry/links.d.ts +3 -1
  99. package/dist/_dts/commerce/src/purchase/bookingInstalmentSchedule.d.ts +2 -0
  100. package/dist/_dts/commerce/src/purchase/bookingPaymentSelection.d.ts +6 -0
  101. package/dist/_dts/commerce/src/purchase/confirmationEmailPayment.d.ts +14 -14
  102. package/dist/_dts/commerce/src/purchase/confirmationPayment.d.ts +65 -0
  103. package/dist/_dts/commerce/src/purchase/confirmationPaymentSchema.d.ts +66 -0
  104. package/dist/_dts/commerce/src/purchase/index.d.ts +2 -0
  105. package/dist/_dts/commerce/src/purchase/orderPaymentState.d.ts +8 -0
  106. package/dist/_dts/content-model/src/templates/defaults.d.ts +2 -2
  107. package/dist/_dts/core/src/appointment-booking-terms.d.ts +20 -0
  108. package/dist/_dts/core/src/booking-payment-schemas.d.ts +70 -0
  109. package/dist/_dts/core/src/branded.d.ts +0 -2
  110. package/dist/_dts/core/src/demo-claim-access.d.ts +1 -1
  111. package/dist/_dts/core/src/demo-claim-readiness.d.ts +18 -0
  112. package/dist/_dts/core/src/demo-lifecycle-status.d.ts +1 -1
  113. package/dist/_dts/core/src/demo-warm-pool-target.d.ts +1 -1
  114. package/dist/_dts/core/src/index.d.ts +4 -0
  115. package/dist/_dts/core/src/mailing-list-targeting-availability.d.ts +68 -0
  116. package/dist/_dts/core/src/mailing-list-targeting.d.ts +2 -0
  117. package/dist/_dts/core/src/ticket-quantity.d.ts +13 -0
  118. package/dist/_dts/db/src/generated/supabase/database.types.d.ts +51 -32
  119. package/dist/_dts/editor/src/chrome/chromeLayers.d.ts +7 -0
  120. package/dist/_dts/editor/src/index.d.ts +1 -0
  121. package/dist/_dts/editor-blocks/src/widgets/link/LinkAddressInput.d.ts +8 -0
  122. package/dist/_dts/editor-blocks/src/widgets/link/LinkContentList.d.ts +12 -0
  123. package/dist/_dts/editor-blocks/src/widgets/link/LinkPicker.d.ts +5 -1
  124. package/dist/_dts/editor-blocks/src/widgets/link/LinkPickerDialog.d.ts +3 -3
  125. package/dist/_dts/editor-blocks/src/widgets/link/LinkSummary.d.ts +8 -2
  126. package/dist/_dts/editor-blocks/src/widgets/link/LinkWidget.d.ts +4 -3
  127. package/dist/_dts/editor-blocks/src/widgets/link/LinkWidgetContext.d.ts +2 -1
  128. package/dist/_dts/editor-blocks/src/widgets/link/draft.d.ts +44 -0
  129. package/dist/_dts/editor-blocks/src/widgets/link/presentation.d.ts +13 -0
  130. package/dist/_dts/editor-blocks/src/widgets/link/types.d.ts +14 -0
  131. package/dist/_dts/editor-blocks/src/widgets/link/useRoutableContent.d.ts +2 -0
  132. package/dist/_dts/editor-blocks/src/widgets/link/utils.d.ts +5 -4
  133. package/dist/_dts/editor-blocks/src/widgets/mailing-list-targeting/MailingListTargetingField.d.ts +1 -1
  134. package/dist/_dts/editor-blocks/src/widgets/mailing-list-targeting/targetingState.d.ts +13 -8
  135. package/dist/_dts/media-core/src/fileStorage.d.ts +4 -3
  136. package/dist/_dts/media-core/src/index.d.ts +1 -0
  137. package/dist/_dts/media-core/src/storageObjectKey.d.ts +12 -0
  138. package/dist/_dts/media-react/src/hooks/useSupabaseMediaUploader.d.ts +1 -1
  139. package/dist/_dts/media-react/src/internal/supabaseResumableUpload.d.ts +13 -0
  140. package/dist/_dts/preview-next/src/client/preview/previewModeRootAttribute.d.ts +11 -0
  141. package/dist/_dts/sdk/src/rendering/blocks-page-renderer.d.ts +0 -1
  142. package/dist/_dts/sdk/src/rendering/image.d.ts +10 -0
  143. package/dist/_dts/sdk/src/rendering/index.d.ts +3 -1
  144. package/dist/_dts/sdk/src/rendering/link.d.ts +9 -0
  145. package/dist/_dts/sdk/src/rendering/overrides.d.ts +1 -0
  146. package/dist/_dts/sdk/src/version.d.ts +1 -1
  147. package/dist/_dts/theme-core/src/blocks/opaquePanels.d.ts +3 -3
  148. package/dist/_dts/theme-core/src/generated/containerResponsiveThemeCss.d.ts +1 -1
  149. package/dist/client/BookingMailingListNote-CBuMKN0w.mjs +386 -0
  150. package/dist/client/{CardListItem-ZDLYh6dL.mjs → CardListItem-Dc9XTXhB.mjs} +3 -4
  151. package/dist/client/CheckIcon-CpyXr-Kg.mjs +35 -0
  152. package/dist/client/{CheckboxChoice-M-3HycLw.mjs → CheckboxChoice-CIqx_o0E.mjs} +1 -1
  153. package/dist/client/{DemoBookingPortalAccess-BMtvPTWE.mjs → DemoBookingPortalAccess-D3VQ_kLj.mjs} +85 -85
  154. package/dist/client/{EventCombined.client-DUm_DOxW.mjs → EventCombined.client-BHGEKise.mjs} +8 -9
  155. package/dist/client/{EventEmbeddedCheckoutStep-DsNNzgRm.mjs → EventEmbeddedCheckoutStep-Bo1Cm23R.mjs} +11 -10
  156. package/dist/client/{EventListing.client-DjNYGUVm.mjs → EventListing.client-D5OQgVPr.mjs} +2 -2
  157. package/dist/client/{LeafletStaticMap-DuFiOHq_.mjs → LeafletStaticMap-CLL5cWrr.mjs} +1 -1
  158. package/dist/client/{ModalShell-CqkBvBIC.mjs → ModalShell-BXzucfR6.mjs} +83 -12
  159. package/dist/client/{RichText-LjPCUGGi.mjs → RichText-BoDmnopf.mjs} +6 -3
  160. package/dist/client/{ThemedButton-DZKjtaDD.mjs → ThemedButton-Ciltp0IK.mjs} +2 -2
  161. package/dist/client/{accordion-Qe--SILD.mjs → accordion-DOkRS64-.mjs} +1 -1
  162. package/dist/client/aspectTransforms-D-TnDdq4.mjs +93 -0
  163. package/dist/client/{bookingForm-3BCl4g_f.mjs → bookingForm-wlMVwo9h.mjs} +289 -149
  164. package/dist/client/bookings.mjs +12212 -10832
  165. package/dist/client/{carousel-h2YjKOS2.mjs → carousel-CGWk-Z0u.mjs} +2 -2
  166. package/dist/client/{carousel.client-BLrd4hmY.mjs → carousel.client-kX5mN1Eg.mjs} +46 -41
  167. package/dist/client/{cart-5NeiigVd.mjs → cart-OBBPlaH4.mjs} +3 -3
  168. package/dist/client/{checkout-G4UWjOEw.mjs → checkout-Bmw2WjQX.mjs} +3 -3
  169. package/dist/client/client.mjs +9541 -6039
  170. package/dist/client/{colorStyles-DTunOThj.mjs → colorStyles-ECDNPE_P.mjs} +23 -86
  171. package/dist/client/{context-GK4-AVAh.mjs → context-BI77UFAn.mjs} +275 -10
  172. package/dist/client/{eventCalendar-Prw3Yo_L.mjs → eventCalendar-qkej2Edn.mjs} +19 -17
  173. package/dist/client/{eventCombined-BUugi6__.mjs → eventCombined-DApKHvat.mjs} +4 -4
  174. package/dist/client/{eventDetails-CBHUda-R.mjs → eventDetails-BQyUDPH0.mjs} +3 -4
  175. package/dist/client/{eventListing-CQeG45Dg.mjs → eventListing-CeAnshlZ.mjs} +4 -4
  176. package/dist/client/{eventRegistration-Dif3p3oJ.mjs → eventRegistration-C3A3NyBO.mjs} +2209 -2144
  177. package/dist/client/{form-Cf0WMtfG.mjs → form-DW8rU7jO.mjs} +6 -6
  178. package/dist/client/{headerSection-Bqdr3JWp.mjs → headerSection-CkIhsoNm.mjs} +9 -9
  179. package/dist/client/hooks.mjs +1289 -380
  180. package/dist/client/{locationMap-BVvPou4O.mjs → locationMap-D4O8wbli.mjs} +4 -4
  181. package/dist/client/{media-47fcnhzD.mjs → media-C5K_0xPd.mjs} +2 -2
  182. package/dist/client/{newsletterForm-Cx-1dnic.mjs → newsletterForm-B7IxSPuz.mjs} +5 -5
  183. package/dist/client/{productDetail-DaUMaJYk.mjs → productDetail-Bqxpwy5N.mjs} +3 -3
  184. package/dist/client/{productList-BKQlWEKE.mjs → productList-u9Lz8V15.mjs} +3 -3
  185. package/dist/client/{propsDecoder-DO5iXphQ.mjs → propsDecoder-Bf1jucUp.mjs} +17333 -14489
  186. package/dist/client/rendering/client.mjs +58216 -55133
  187. package/dist/client/rendering/islands.mjs +19 -19
  188. package/dist/client/rendering.mjs +9099 -5636
  189. package/dist/client/{routeIslandApiConfig-BNm0Z3-g.mjs → routeIslandApiConfig-BgP-aPMl.mjs} +1 -1
  190. package/dist/client/{shop-D7ytcFBC.mjs → shop-B_eykR-_.mjs} +16 -14
  191. package/dist/client/{shop-commerce-D68-hHy2.mjs → shop-commerce-CT0APkFV.mjs} +9 -9
  192. package/dist/client/{shop-commerce-store-Cu7X2lyu.mjs → shop-commerce-store-DcvZxdEK.mjs} +1 -1
  193. package/dist/client/{shopShared-D12rxE69.mjs → shopShared-BVJOiUiJ.mjs} +5 -5
  194. package/dist/client/themePortalRoot-DS92SRVZ.mjs +47 -0
  195. package/dist/client/{TerminalPanel-DOTSUCO0.mjs → useDiscountCodeUi-DPmYDunz.mjs} +60 -77
  196. package/dist/client/{useEventPagination-jgKa67KV.mjs → useEventPagination-8-U55vH5.mjs} +7 -8
  197. package/dist/preview-next/before-render.mjs +7 -0
  198. package/dist/preview-next/client/runtime.mjs +3 -3
  199. package/dist/preview-next/keepAlive.mjs +7 -0
  200. package/dist/preview-next/middleware.mjs +7 -0
  201. package/dist/{sdk-runtime-4cCWO_3i.mjs → sdk-runtime-C5jPdSrk.mjs} +1 -1
  202. package/dist/server/components.mjs +3138 -1373
  203. package/dist/server/config-validation.mjs +1395 -486
  204. package/dist/server/config.mjs +1395 -486
  205. package/dist/server/data.mjs +1289 -380
  206. package/dist/server/index.mjs +8 -1
  207. package/dist/server/next.mjs +3362 -1538
  208. package/dist/server/page-converter.mjs +1357 -453
  209. package/dist/server/prebuild.mjs +1 -1
  210. package/dist/server/rendering/server.mjs +2335 -1044
  211. package/dist/server/rendering.mjs +3152 -1370
  212. package/dist/server/routing.mjs +1437 -490
  213. package/dist/server/server.mjs +1297 -381
  214. package/dist/server/theme-bridge.mjs +1135 -795
  215. package/dist/{spinner-tSdG9YvG.mjs → spinner-B-ab2rJp.mjs} +1 -1
  216. package/dist/styles/index.css +1088 -721
  217. package/package.json +1 -1
  218. package/dist/_dts/blocks/src/system/runtime/nodes/event-registration/OrderSummary.d.ts +0 -15
  219. package/dist/_dts/blocks/src/system/runtime/nodes/event-registration/useWaitlistClaimRestoration.d.ts +0 -22
  220. package/dist/_dts/blocks/src/system/runtime/shared/components/SelectableOptionCard.d.ts +0 -30
  221. package/dist/client/BookingMailingListNote-DlDSs5Vm.mjs +0 -567
  222. package/dist/client/pricing-CMD0kADd.mjs +0 -314
  223. package/dist/client/result-DRW7JWXz.mjs +0 -30
  224. package/dist/client/scrollToBlock-C86BYkyV.mjs +0 -17
  225. package/dist/client/themePortalRoot-AGs4cE7t.mjs +0 -30
  226. package/dist/spinner-BL3kW9Uh.mjs +0 -803
@@ -23217,9 +23217,15 @@ function isRecord$20(value) {
23217
23217
  }
23218
23218
  //#endregion
23219
23219
  //#region ../core/src/money-input.ts
23220
+ function unsafeAsCents(value) {
23221
+ return value;
23222
+ }
23220
23223
  function unsafeAsNonNegativeCents(value) {
23221
23224
  return value;
23222
23225
  }
23226
+ function unsafeAsPositiveCents(value) {
23227
+ return value;
23228
+ }
23223
23229
  /**
23224
23230
  * Normalizes a derived amount to non-negative whole cents. This intentionally
23225
23231
  * clamps negatives to zero; use parseNonNegativeCents for validation.
@@ -23227,6 +23233,23 @@ function unsafeAsNonNegativeCents(value) {
23227
23233
  function toNonNegativeCents(value) {
23228
23234
  return unsafeAsNonNegativeCents(Math.max(0, Math.trunc(value)));
23229
23235
  }
23236
+ function parseCents(value) {
23237
+ if (!Number.isFinite(value)) return err({ kind: "invalid-number" });
23238
+ if (!Number.isInteger(value)) return err({ kind: "not-whole-cents" });
23239
+ return ok$1(unsafeAsCents(value));
23240
+ }
23241
+ function parseNonNegativeCents(value) {
23242
+ const parsed = parseCents(value);
23243
+ if (!parsed.ok) return parsed;
23244
+ if (parsed.value < 0) return err({ kind: "negative" });
23245
+ return ok$1(unsafeAsNonNegativeCents(parsed.value));
23246
+ }
23247
+ function parsePositiveCents(value) {
23248
+ const parsed = parseNonNegativeCents(value);
23249
+ if (!parsed.ok) return parsed;
23250
+ if (parsed.value === 0) return err({ kind: "zero-not-allowed" });
23251
+ return ok$1(unsafeAsPositiveCents(parsed.value));
23252
+ }
23230
23253
  //#endregion
23231
23254
  //#region ../core/src/booking-payment-options.ts
23232
23255
  /** Automatic instalments and a flexible balance cannot share one booking offer. */
@@ -23790,14 +23813,15 @@ function formError(field) {
23790
23813
  }
23791
23814
  //#endregion
23792
23815
  //#region ../core/src/mailing-list-targeting.ts
23816
+ const DEFAULT_MAILING_LIST_TARGETING = { mode: "default" };
23793
23817
  function sameMailingListPlacementTargeting(left, right) {
23794
23818
  if (left.mode !== right.mode) return false;
23795
23819
  if (left.mode === "default" || right.mode === "default") return true;
23796
23820
  if (left.provider !== right.provider || left.selection.tag !== right.selection.tag) return false;
23797
23821
  if (left.provider === "mailchimp" && (right.provider !== "mailchimp" || left.audienceId !== right.audienceId)) return false;
23798
- return sameIds(targetingSelectionIds(left), targetingSelectionIds(right));
23822
+ return sameIds(mailingListTargetingChoiceIds(left), mailingListTargetingChoiceIds(right));
23799
23823
  }
23800
- function targetingSelectionIds(targeting) {
23824
+ function mailingListTargetingChoiceIds(targeting) {
23801
23825
  switch (targeting.provider) {
23802
23826
  case "native": return targeting.selection.tag === "fixed" ? targeting.selection.topicIds : targeting.selection.offeredTopicIds;
23803
23827
  case "brevo": return targeting.selection.tag === "fixed" ? targeting.selection.listIds : targeting.selection.offeredListIds;
@@ -23848,6 +23872,103 @@ function planMailingListChoicePresentation(targeting) {
23848
23872
  }
23849
23873
  }
23850
23874
  //#endregion
23875
+ //#region ../core/src/mailing-list-targeting-availability.ts
23876
+ function resolveMailingListDefaultDestination(provider) {
23877
+ switch (provider.provider) {
23878
+ case "native": return provider.topics.find((item) => item.id === provider.defaultTopicId) ?? null;
23879
+ case "brevo": return provider.lists.find((item) => item.id === provider.defaultListId) ?? null;
23880
+ case "mailchimp": return provider.audiences.find((item) => item.id === provider.defaultAudienceId) ?? null;
23881
+ }
23882
+ }
23883
+ function assessMailingListTargeting(context, targeting) {
23884
+ if (context?.tag !== "configured") return {
23885
+ tag: "unavailable",
23886
+ reason: "setup_missing",
23887
+ targeting
23888
+ };
23889
+ const catalog = context.provider;
23890
+ if (targeting.mode === "custom") return assessCustomTargeting(catalog, targeting);
23891
+ const destination = resolveMailingListDefaultDestination(catalog);
23892
+ return destination === null ? {
23893
+ tag: "unavailable",
23894
+ reason: "default_missing",
23895
+ targeting
23896
+ } : {
23897
+ tag: "available",
23898
+ value: {
23899
+ mode: "default",
23900
+ targeting,
23901
+ provider: catalog.provider,
23902
+ destination
23903
+ }
23904
+ };
23905
+ }
23906
+ function assessCustomTargeting(catalog, targeting) {
23907
+ switch (targeting.provider) {
23908
+ case "native": return catalog.provider === "native" ? assessMatchedChoices({
23909
+ provider: "native",
23910
+ catalog,
23911
+ targeting
23912
+ }, catalog.topics) : {
23913
+ tag: "unavailable",
23914
+ reason: "provider_mismatch",
23915
+ targeting
23916
+ };
23917
+ case "brevo": return catalog.provider === "brevo" ? assessMatchedChoices({
23918
+ provider: "brevo",
23919
+ catalog,
23920
+ targeting
23921
+ }, catalog.lists) : {
23922
+ tag: "unavailable",
23923
+ reason: "provider_mismatch",
23924
+ targeting
23925
+ };
23926
+ case "mailchimp": {
23927
+ if (catalog.provider !== "mailchimp") return {
23928
+ tag: "unavailable",
23929
+ reason: "provider_mismatch",
23930
+ targeting
23931
+ };
23932
+ const audience = catalog.audiences.find((item) => item.id === targeting.audienceId);
23933
+ return audience === void 0 ? {
23934
+ tag: "unavailable",
23935
+ reason: "audience_missing",
23936
+ value: {
23937
+ mode: "custom",
23938
+ provider: "mailchimp",
23939
+ catalog,
23940
+ targeting
23941
+ }
23942
+ } : assessMatchedChoices({
23943
+ provider: "mailchimp",
23944
+ catalog,
23945
+ targeting,
23946
+ audience
23947
+ }, audience.interests);
23948
+ }
23949
+ }
23950
+ }
23951
+ function assessMatchedChoices(matched, choices) {
23952
+ const selected = new Set(mailingListTargetingChoiceIds(matched.targeting));
23953
+ const available = new Set(choices.map((item) => item.id));
23954
+ const missingIds = [...selected].filter((id) => !available.has(id));
23955
+ const value = {
23956
+ mode: "custom",
23957
+ ...matched,
23958
+ choices,
23959
+ selectedChoices: choices.filter((item) => selected.has(item.id))
23960
+ };
23961
+ return missingIds.length > 0 ? {
23962
+ tag: "unavailable",
23963
+ reason: "choices_missing",
23964
+ missingIds,
23965
+ value
23966
+ } : {
23967
+ tag: "available",
23968
+ value
23969
+ };
23970
+ }
23971
+ //#endregion
23851
23972
  //#region ../core/src/mailing-list-runtime.ts
23852
23973
  function parseMailingListRuntimeContext(value) {
23853
23974
  if (!isRecord$17(value)) return invalidRuntimeContext();
@@ -23912,57 +24033,47 @@ function parseBrevoRuntimeProvider(value) {
23912
24033
  function parseMailchimpRuntimeProvider(value) {
23913
24034
  if (!Array.isArray(value.audiences)) return null;
23914
24035
  const defaultAudienceId = parseMailchimpAudienceId(value.defaultAudienceId);
23915
- if (defaultAudienceId === null) return null;
23916
- const audiences = [];
23917
- for (const audience of value.audiences) {
23918
- if (!isRecord$17(audience)) return null;
23919
- const id = parseMailchimpAudienceId(audience.id);
23920
- const name = parseName(audience.name);
23921
- if (id === null || name === null || !Array.isArray(audience.interests)) return null;
23922
- const interests = parseMailchimpInterests(audience.interests);
23923
- if (interests === null) return null;
23924
- audiences.push({
23925
- id,
23926
- name,
23927
- interests
23928
- });
23929
- }
23930
- return {
24036
+ const audiences = Array.from(value.audiences, parseMailchimpAudience);
24037
+ return defaultAudienceId !== null && audiences.every((audience) => audience !== null) ? {
23931
24038
  provider: "mailchimp",
23932
24039
  defaultAudienceId,
23933
24040
  audiences
23934
- };
24041
+ } : null;
23935
24042
  }
23936
- function parseMailchimpInterests(value) {
23937
- const interests = [];
23938
- for (const interest of value) {
23939
- if (!isRecord$17(interest)) return null;
23940
- const id = parseMailchimpInterestId(interest.id);
23941
- const name = parseName(interest.name);
23942
- const categoryName = parseName(interest.categoryName);
23943
- if (id === null || name === null || categoryName === null) return null;
23944
- interests.push({
23945
- id,
23946
- name,
23947
- categoryName
23948
- });
23949
- }
23950
- return interests;
24043
+ function parseMailchimpAudience(value) {
24044
+ if (!isRecord$17(value) || !Array.isArray(value.interests)) return null;
24045
+ const id = parseMailchimpAudienceId(value.id);
24046
+ const name = parseName(value.name);
24047
+ const interests = Array.from(value.interests, parseMailchimpInterest);
24048
+ return id !== null && name !== null && interests.every((interest) => interest !== null) ? {
24049
+ id,
24050
+ name,
24051
+ interests
24052
+ } : null;
24053
+ }
24054
+ function parseMailchimpInterest(value) {
24055
+ if (!isRecord$17(value)) return null;
24056
+ const id = parseMailchimpInterestId(value.id);
24057
+ const name = parseName(value.name);
24058
+ const categoryName = parseName(value.categoryName);
24059
+ return id !== null && name !== null && categoryName !== null ? {
24060
+ id,
24061
+ name,
24062
+ categoryName
24063
+ } : null;
23951
24064
  }
23952
24065
  function parseNamedItems(value, parseId) {
23953
24066
  if (!Array.isArray(value)) return null;
23954
- const items = [];
23955
- for (const item of value) {
24067
+ const items = Array.from(value, (item) => {
23956
24068
  if (!isRecord$17(item)) return null;
23957
24069
  const id = parseId(item.id);
23958
24070
  const name = parseName(item.name);
23959
- if (id === null || name === null) return null;
23960
- items.push({
24071
+ return id !== null && name !== null ? {
23961
24072
  id,
23962
24073
  name
23963
- });
23964
- }
23965
- return items;
24074
+ } : null;
24075
+ });
24076
+ return items.every((item) => item !== null) ? items : null;
23966
24077
  }
23967
24078
  function parseName(value) {
23968
24079
  if (typeof value !== "string") return null;
@@ -23978,6 +24089,7 @@ function invalidRuntimeContext() {
23978
24089
  //#endregion
23979
24090
  //#region ../core/src/mailing-list-targeting-parser.ts
23980
24091
  function parseMailingListPlacementTargeting(value) {
24092
+ if (value == null) return ok$1(DEFAULT_MAILING_LIST_TARGETING);
23981
24093
  if (!isRecord$16(value)) return targetingError("shape");
23982
24094
  if (value.mode === "default") return ok$1({ mode: "default" });
23983
24095
  if (value.mode !== "custom") return targetingError("mode");
@@ -24076,14 +24188,11 @@ function parseNonEmptyUniqueIds(value, parseId) {
24076
24188
  }
24077
24189
  function parseUniqueIds(value, parseId) {
24078
24190
  if (!Array.isArray(value)) return targetingError("targets");
24079
- const parsed = [];
24080
- for (const item of value) {
24191
+ return Array.from(value).reduce((parsed, item) => {
24192
+ if (!parsed.ok) return parsed;
24081
24193
  const id = parseId(item);
24082
- if (id === null) return targetingError("targets");
24083
- if (parsed.includes(id)) return targetingError("duplicate_target");
24084
- parsed.push(id);
24085
- }
24086
- return ok$1(parsed);
24194
+ return id === null ? targetingError("targets") : parsed.value.includes(id) ? targetingError("duplicate_target") : ok$1([...parsed.value, id]);
24195
+ }, ok$1([]));
24087
24196
  }
24088
24197
  function isRecord$16(value) {
24089
24198
  return typeof value === "object" && value !== null && !Array.isArray(value);
@@ -24594,6 +24703,45 @@ const PORTAL_NAV_DEFAULT_LABELS = {
24594
24703
  loggedIn: "My Account"
24595
24704
  };
24596
24705
  //#endregion
24706
+ //#region ../core/src/event-preset-vocabulary.ts
24707
+ const EVENT_PRESET_VOCABULARY = {
24708
+ event: {
24709
+ label: "Event",
24710
+ pluralLabel: "Events",
24711
+ description: "Any event, repeating or manually dated, that does not fit the other categories."
24712
+ },
24713
+ class: {
24714
+ label: "Class",
24715
+ pluralLabel: "Classes",
24716
+ description: "Regular scheduled classes and group sessions."
24717
+ },
24718
+ course: {
24719
+ label: "Course",
24720
+ pluralLabel: "Courses",
24721
+ description: "A fixed set of dates that people book together."
24722
+ },
24723
+ term: {
24724
+ label: "Term",
24725
+ pluralLabel: "Terms",
24726
+ description: "A fixed term of sessions that people book together."
24727
+ },
24728
+ workshop: {
24729
+ label: "Workshop",
24730
+ pluralLabel: "Workshops",
24731
+ description: "One-off workshops, day sessions, or special events."
24732
+ },
24733
+ retreat: {
24734
+ label: "Retreat",
24735
+ pluralLabel: "Retreats",
24736
+ description: "Multi-day or residential immersive experiences."
24737
+ },
24738
+ performance: {
24739
+ label: "Performance",
24740
+ pluralLabel: "Performances",
24741
+ description: "Audience-facing shows, concerts, recitals, or showcases."
24742
+ }
24743
+ };
24744
+ //#endregion
24597
24745
  //#region ../media-core/src/fileSafety.ts
24598
24746
  const CONTROL_CHARACTER_PATTERN = /[\u0000-\u001f\u007f]/u;
24599
24747
  function containsUnsafePathSegmentCharacter(value) {
@@ -34477,17 +34625,7 @@ const linksTransforms = [{
34477
34625
  id: "links.resolve",
34478
34626
  kind: "formatter",
34479
34627
  summary: "Resolve LinkValue objects to href strings using the route map",
34480
- run: (value, _options, context) => {
34481
- if (!value || typeof value !== "object") return null;
34482
- const link = value;
34483
- const kind = typeof link.kind === "string" ? link.kind : null;
34484
- if (kind === "internal") return resolveInternalLink(link, context);
34485
- if (kind === "page") return resolvePageLink(link, context);
34486
- if (kind === "entry") return resolveEntryLink(link, context);
34487
- if (kind === "external" || kind === "url") return resolveExternalLink(link);
34488
- if (!kind && typeof link.href === "string") return resolveExternalLink(link);
34489
- return null;
34490
- }
34628
+ run: (value, _options, context) => resolveAuthoredLinkHref(value, context)
34491
34629
  }, {
34492
34630
  id: "links.label",
34493
34631
  kind: "formatter",
@@ -34514,6 +34652,21 @@ const linksTransforms = [{
34514
34652
  return null;
34515
34653
  }
34516
34654
  }];
34655
+ function resolveAuthoredLinkHref(value, context = {}) {
34656
+ if (!value || typeof value !== "object") return null;
34657
+ const link = value;
34658
+ switch (link.kind) {
34659
+ case "internal": return resolveInternalLink(link, context);
34660
+ case "page": return resolvePageLink(link, context);
34661
+ case "entry": return resolveEntryLink(link, context);
34662
+ case "external":
34663
+ case "url": return resolveExternalLink(link);
34664
+ default: return resolvePreResolvedLink(link);
34665
+ }
34666
+ }
34667
+ function resolvePreResolvedLink(link) {
34668
+ return !(typeof link.kind === "string" ? link.kind : null) && typeof link.href === "string" ? resolveExternalLink(link) : null;
34669
+ }
34517
34670
  //#endregion
34518
34671
  //#region ../blocks/src/system/transforms/registry/content.ts
34519
34672
  const supportedRichTextTokenSchema = z.enum(["year", "site_name"]);
@@ -35586,6 +35739,14 @@ bookingPaymentOptionSchemas.flexibleBalanceConfig;
35586
35739
  bookingPaymentOptionSchemas.paymentCollectionOption;
35587
35740
  const bookingPaymentTermsSchema = bookingPaymentOptionSchemas.paymentTerms;
35588
35741
  bookingPaymentOptionSchemas.paymentOptionsChoice;
35742
+ z.strictObject({
35743
+ currency: z.string().trim().length(3),
35744
+ totalCents: nonNegativeIntegerSchema,
35745
+ dueNowCents: nonNegativeIntegerSchema,
35746
+ laterPaymentAmountsCents: z.array(nonNegativeIntegerSchema),
35747
+ paymentOption: z.union([createBookingPaymentOptionSchemas("strict").paymentCollectionOption, z.strictObject({ kind: z.literal("not_required") })]),
35748
+ promisedDiscountId: z.string().min(1).nullable().optional()
35749
+ });
35589
35750
  //#endregion
35590
35751
  //#region ../blocks/src/system/blocks/shared/bookingPaymentTerms.ts
35591
35752
  const blockBookingPaymentTermsSchema = bookingPaymentTermsSchema;
@@ -35827,6 +35988,10 @@ const publicEventBaseSchema = z.object({
35827
35988
  eventDestinationMode: eventDestinationModeSchema.optional(),
35828
35989
  scheduleScope: eventScheduleScopeSchema$2.optional(),
35829
35990
  recurrence: publicEventRecurrenceSchema.optional(),
35991
+ scheduleSummary: z.object({
35992
+ recurrenceDescription: z.string(),
35993
+ startTime: z.string().regex(/^(?:[01]\d|2[0-3]):[0-5]\d$/).nullable()
35994
+ }).nullable().optional(),
35830
35995
  id: z.string(),
35831
35996
  occurrenceId: z.string(),
35832
35997
  seriesId: z.string(),
@@ -36435,16 +36600,19 @@ function decodeForSchemeCheck(value) {
36435
36600
  * - Allow absolute URLs with protocols: http, https, mailto, tel.
36436
36601
  * - Allow root-relative ("/path") and hash-only ("#section") links.
36437
36602
  * - Reject protocol-relative URLs ("//example.com"), bare domains ("example.com"),
36438
- * executable schemes (javascript/data/vbscript), malformed URLs, and empty values.
36603
+ * backslashes, executable schemes (javascript/data/vbscript), malformed URLs, and empty values.
36439
36604
  * - Preserve percent-encoding from the original normalized input.
36440
36605
  */
36441
36606
  function sanitizeHref(raw) {
36442
36607
  if (typeof raw !== "string") return null;
36443
36608
  const normalized = normalizeInput(raw);
36444
36609
  if (!normalized) return null;
36445
- if (normalized.startsWith("//")) return null;
36610
+ if (normalized.includes("\\") || normalized.startsWith("//")) return null;
36446
36611
  if (normalized.startsWith("/")) return normalized;
36447
36612
  if (normalized.startsWith("#")) return normalized;
36613
+ return sanitizeAbsoluteHref(normalized);
36614
+ }
36615
+ function sanitizeAbsoluteHref(normalized) {
36448
36616
  const schemeMatch = normalizeInput(decodeForSchemeCheck(normalized)).match(/^([a-zA-Z][a-zA-Z0-9+.-]*):/);
36449
36617
  if (!schemeMatch) return null;
36450
36618
  const rawScheme = schemeMatch[1];
@@ -39512,6 +39680,11 @@ function formatPlacesLeft(count, compact) {
39512
39680
  if (compact) return `${count} left`;
39513
39681
  return count === 1 ? "1 place left" : `${count} places left`;
39514
39682
  }
39683
+ function formatTicketTypeRemaining(remainingCapacity) {
39684
+ if (remainingCapacity === null || remainingCapacity > 3) return null;
39685
+ if (remainingCapacity <= 0) return "None left for this ticket type";
39686
+ return `${formatPlacesLeft(remainingCapacity, false)} for this ticket type`;
39687
+ }
39515
39688
  /** Total capacity as copy ("12 places"), for detail surfaces that state the size of an event. */
39516
39689
  function formatTotalCapacity(capacity) {
39517
39690
  if (capacity === null) return null;
@@ -40682,6 +40855,13 @@ function buildInteractiveIslandProps(options) {
40682
40855
  };
40683
40856
  }
40684
40857
  //#endregion
40858
+ //#region ../commerce/src/purchase/settlement.ts
40859
+ function normalizeCurrencyCode(raw) {
40860
+ const normalized = raw.trim().toUpperCase();
40861
+ if (!/^[A-Z]{3}$/.test(normalized)) throw new Error(`Invalid currency code: ${raw}`);
40862
+ return normalized;
40863
+ }
40864
+ //#endregion
40685
40865
  //#region ../commerce/src/purchase/checkoutSessionMetadata.ts
40686
40866
  const datedOfferingSharedEngineMetadataShape = {
40687
40867
  datedOfferingEngineContractVersion: z.literal("shared_v1"),
@@ -40736,6 +40916,71 @@ const SharedDatedOfferingOrderCheckoutSessionMetadataSchema = z.object({
40736
40916
  });
40737
40917
  z.union([SharedDatedOfferingOrderCheckoutSessionMetadataSchema, LegacyOrderCheckoutSessionMetadataSchema]);
40738
40918
  //#endregion
40919
+ //#region ../commerce/src/purchase/confirmationPaymentSchema.ts
40920
+ const settledBalanceSchema = z.strictObject({ kind: z.literal("settled") });
40921
+ const dueBalanceSchema = z.strictObject({
40922
+ kind: z.literal("due"),
40923
+ amountCents: z.number().int().positive().transform((value, ctx) => {
40924
+ const cents = parsePositiveCents(value);
40925
+ if (cents.ok) return cents.value;
40926
+ ctx.addIssue({
40927
+ code: "custom",
40928
+ message: "Expected positive whole cents"
40929
+ });
40930
+ return z.NEVER;
40931
+ }),
40932
+ dueAt: z.string().nullable()
40933
+ });
40934
+ const paymentBalanceSchema = z.discriminatedUnion("kind", [settledBalanceSchema, dueBalanceSchema]);
40935
+ const currencySchema = z.string().regex(/^[A-Z]{3}$/).transform(normalizeCurrencyCode);
40936
+ const moneyFields = {
40937
+ amountPaidCents: z.number().int().nonnegative().transform(toNonNegativeCents),
40938
+ currency: currencySchema
40939
+ };
40940
+ z.discriminatedUnion("kind", [
40941
+ z.strictObject({
40942
+ kind: z.literal("free"),
40943
+ balance: settledBalanceSchema
40944
+ }),
40945
+ z.strictObject({
40946
+ kind: z.literal("waived"),
40947
+ balance: settledBalanceSchema
40948
+ }),
40949
+ z.strictObject({
40950
+ kind: z.literal("pass"),
40951
+ passName: z.string().nullable(),
40952
+ passCreditsUsed: z.number().int().positive().nullable(),
40953
+ balance: settledBalanceSchema
40954
+ }),
40955
+ z.strictObject({
40956
+ kind: z.literal("membership"),
40957
+ membershipName: z.string().nullable(),
40958
+ balance: settledBalanceSchema
40959
+ }),
40960
+ z.strictObject({
40961
+ kind: z.literal("manual_due"),
40962
+ currency: currencySchema,
40963
+ balance: dueBalanceSchema
40964
+ }),
40965
+ z.strictObject({
40966
+ kind: z.literal("managed_balance_due"),
40967
+ ...moneyFields,
40968
+ balance: dueBalanceSchema
40969
+ }),
40970
+ z.strictObject({
40971
+ kind: z.literal("monetary"),
40972
+ ...moneyFields,
40973
+ paymentMethod: z.enum([
40974
+ "stripe",
40975
+ "store_credit",
40976
+ "mixed",
40977
+ "manual"
40978
+ ]),
40979
+ balance: paymentBalanceSchema
40980
+ })
40981
+ ]);
40982
+ toNonNegativeCents(0);
40983
+ //#endregion
40739
40984
  //#region ../commerce/src/purchase/stripeCommissionMetadata.ts
40740
40985
  /** Reasons are payment evidence, not an independent pricing policy. */
40741
40986
  const STRIPE_COMMISSION_FREE_REASONS = [
@@ -40768,7 +41013,6 @@ z.discriminatedUnion("kind", [
40768
41013
  ...historicalContext
40769
41014
  })
40770
41015
  ]);
40771
- toNonNegativeCents(0);
40772
41016
  //#endregion
40773
41017
  //#region ../blocks/src/system/runtime/nodes/booking-form.state.ts
40774
41018
  function toTrimmedString(value) {
@@ -44696,6 +44940,7 @@ function buildOfferingsPreviewRenderStates(input) {
44696
44940
  }
44697
44941
  return states;
44698
44942
  }
44943
+ /** Which offerings a site preset row names; one owner for "the course preset means whole-series runs". */
44699
44944
  function sourceFromPresetSummary(preset) {
44700
44945
  if (preset.engine === "event_series" && preset.canonicalBehaviour === "course") return { kind: "wholeSeries" };
44701
44946
  if (preset.engine !== "event_series") return null;
@@ -47161,26 +47406,48 @@ const occurrenceContextSchema = z.object({
47161
47406
  overrides: z.record(z.string(), z.unknown()).nullable().optional()
47162
47407
  }).nullable();
47163
47408
  //#endregion
47164
- //#region ../blocks/src/system/runtime/nodes/event-registration/wizardSteps.ts
47165
- /**
47166
- * Determine which wizard steps to show based on context and payment requirements.
47167
- *
47168
- * @param hasPreSelectedContext - Whether event is pre-selected (skips event selection)
47169
- * @param needsPaymentStep - Whether user must complete payment method selection
47170
- * @returns Array of wizard steps to display
47171
- */
47172
- function getWizardStepsForContext(hasPreSelectedContext, needsPaymentStep, paymentActive = false) {
47173
- const baseSteps = hasPreSelectedContext ? ["select-tickets", "enter-details"] : [
47174
- "select-event",
47175
- "select-tickets",
47176
- "enter-details"
47177
- ];
47178
- if (!needsPaymentStep) return baseSteps;
47179
- return paymentActive ? [
47180
- ...baseSteps,
47181
- "select-payment",
47182
- "payment"
47183
- ] : [...baseSteps, "select-payment"];
47409
+ //#region ../blocks/src/system/runtime/nodes/event-registration/registrationDisplay.ts
47410
+ const registrationDisplaySchema = z.object({
47411
+ venue: z.enum(["shown", "hidden"]),
47412
+ placesLeft: z.enum(["shown", "hidden"])
47413
+ });
47414
+ function resolveRegistrationDisplay(source) {
47415
+ return {
47416
+ venue: source.showVenue === false ? "hidden" : "shown",
47417
+ placesLeft: source.showCapacity === false ? "hidden" : "shown"
47418
+ };
47419
+ }
47420
+ /** Venue stays in domain data; views receive only the permitted presentation. */
47421
+ function shownVenue(event, display) {
47422
+ return display.venue === "shown" ? event.venue?.name ?? null : null;
47423
+ }
47424
+ /** Full/waitlist explanations remain visible even when optional counts are hidden. */
47425
+ function placesLeftLabel(source, display, wording = {}) {
47426
+ if ("kind" in source) return ticketPlacesLabel(source.remaining, display);
47427
+ if (source.deliveryMode === "hybrid" && source.attendanceModes?.length) return hybridPlacesLabel(source, display, wording);
47428
+ return capacityPlacesLabel(source, display, wording);
47429
+ }
47430
+ function capacityPlacesLabel(source, display, wording) {
47431
+ const remaining = getRemainingPlaces(source);
47432
+ if (display.placesLeft === "hidden" && remaining.kind !== "full") return null;
47433
+ switch (remaining.kind) {
47434
+ case "full": return formatRemainingPlaces(source, wording);
47435
+ case "low": return formatRemainingPlaces(source, wording);
47436
+ case "unlimited": return wording.unlimited ?? null;
47437
+ case "open": return wording.open ?? null;
47438
+ default: return assertNever$3(remaining);
47439
+ }
47440
+ }
47441
+ function hybridPlacesLabel(event, display, wording) {
47442
+ if (display.placesLeft === "shown") return formatEventRemainingPlaces(event, wording);
47443
+ return (event.attendanceModes ?? []).flatMap((mode) => {
47444
+ const label = placesLeftLabel(mode, display, wording);
47445
+ return label ? [`${mode.mode === "online" ? "Online" : "In person"}: ${label}`] : [];
47446
+ }).join(" · ") || null;
47447
+ }
47448
+ function ticketPlacesLabel(remaining, display) {
47449
+ if (remaining !== null && remaining > 0 && display.placesLeft === "hidden") return null;
47450
+ return formatTicketTypeRemaining(remaining);
47184
47451
  }
47185
47452
  //#endregion
47186
47453
  //#region ../blocks/src/system/runtime/nodes/event-registration/registrationDerivations.ts
@@ -47206,6 +47473,369 @@ function resolveEventRequiresPayment(input) {
47206
47473
  return publicEventPricingType(input.event.pricing) === "paid";
47207
47474
  }
47208
47475
  //#endregion
47476
+ //#region ../blocks/src/system/runtime/shared/components/StepIndicator.tsx
47477
+ function slotClasses(slot, classPrefix, emitSharedClasses) {
47478
+ return [emitSharedClasses ? `rb-${slot}` : null, classPrefix ? `${classPrefix}-${slot}` : null].filter((name) => name !== null).join(" ");
47479
+ }
47480
+ function StepIndicator$1({ currentStep, totalSteps, stepLabels, classPrefix, emitSharedClasses }) {
47481
+ const slot = (name) => slotClasses(name, classPrefix, emitSharedClasses);
47482
+ const current = Math.min(Math.max(currentStep, 1), Math.max(totalSteps, 1));
47483
+ const label = stepLabels?.[current - 1];
47484
+ const percent = Math.round(current / Math.max(totalSteps, 1) * 100);
47485
+ return /* @__PURE__ */ jsxs("nav", {
47486
+ "aria-label": "Booking progress",
47487
+ className: slot("progress"),
47488
+ children: [/* @__PURE__ */ jsxs("div", {
47489
+ className: slot("progress__head"),
47490
+ children: [label ? /* @__PURE__ */ jsx("span", {
47491
+ className: slot("progress__label"),
47492
+ "aria-current": "step",
47493
+ children: label
47494
+ }) : null, /* @__PURE__ */ jsxs("span", {
47495
+ className: slot("progress__count"),
47496
+ children: [
47497
+ "Step ",
47498
+ current,
47499
+ " of ",
47500
+ totalSteps
47501
+ ]
47502
+ })]
47503
+ }), /* @__PURE__ */ jsx("div", {
47504
+ className: slot("progress__track"),
47505
+ role: "progressbar",
47506
+ "aria-valuemin": 1,
47507
+ "aria-valuemax": totalSteps,
47508
+ "aria-valuenow": current,
47509
+ "aria-label": label ? `${label}, step ${current} of ${totalSteps}` : `Step ${current} of ${totalSteps}`,
47510
+ children: /* @__PURE__ */ jsx("div", {
47511
+ className: slot("progress__fill"),
47512
+ style: { width: `${percent}%` }
47513
+ })
47514
+ })]
47515
+ });
47516
+ }
47517
+ //#endregion
47518
+ //#region ../blocks/src/system/runtime/nodes/event-registration/utils.ts
47519
+ /**
47520
+ * The locale a site's booking dates are written in: the one the site's time
47521
+ * zone places it in (`eventDateLocale`, shared with event cards), or British
47522
+ * English when the site names no zone.
47523
+ */
47524
+ function bookingDateLocale(siteTimeZone) {
47525
+ return siteTimeZone ? eventDateLocale(siteTimeZone) : "en-GB";
47526
+ }
47527
+ function bookingInstant(startsAt, input) {
47528
+ return toScheduledBookingDateTime({
47529
+ startsAt,
47530
+ timeZone: toBookingTimeZone(input.timeZone),
47531
+ locale: bookingDateLocale(input.siteTimeZone)
47532
+ });
47533
+ }
47534
+ /** "7:00pm": a twelve-hour clock with a lowercase, unspaced day period. */
47535
+ function bookingClock(startsAt, input) {
47536
+ return formatBookingTime(bookingInstant(startsAt, input), {
47537
+ hour: "numeric",
47538
+ minute: "2-digit",
47539
+ hour12: true
47540
+ }).replace(/\s*([ap])\.?\s?m\.?$/i, (_match, period) => `${period.toLowerCase()}m`);
47541
+ }
47542
+ /** "7:00pm – 8:15pm", or just the start when there's no distinct end. */
47543
+ function clockRange(input) {
47544
+ const start = bookingClock(input.startsAt, input);
47545
+ const end = input.endsAt ? bookingClock(input.endsAt, input) : null;
47546
+ return end && end !== start ? `${start} – ${end}` : start;
47547
+ }
47548
+ /** A stored local clock has no date or DST offset; UTC preserves its digits. */
47549
+ function formatBookingScheduleSummary(event) {
47550
+ const summary = event.scheduleSummary;
47551
+ if (!summary) return null;
47552
+ const time = summary.startTime ? formatBookingWhen({
47553
+ startsAt: `1970-01-01T${summary.startTime}:00Z`,
47554
+ timeZone: "UTC",
47555
+ siteTimeZone: event.siteTimeZone
47556
+ }, "time") : null;
47557
+ return [summary.recurrenceDescription, time].filter(Boolean).join(" · ");
47558
+ }
47559
+ /** The one booking date formatter; every variant derives from it. */
47560
+ function formatBookingWhen(input, variant) {
47561
+ const instant = bookingInstant(input.startsAt, input);
47562
+ const day = formatBookingDate(instant, {
47563
+ weekday: "short",
47564
+ day: "numeric",
47565
+ month: "short"
47566
+ });
47567
+ switch (variant) {
47568
+ case "day": return day;
47569
+ case "dayLong": return formatBookingDate(instant, {
47570
+ weekday: "long",
47571
+ day: "numeric",
47572
+ month: "long"
47573
+ });
47574
+ case "month": return formatBookingDate(instant, { month: "long" });
47575
+ case "monthYear": return formatBookingDate(instant, {
47576
+ month: "long",
47577
+ year: "numeric"
47578
+ });
47579
+ case "time": return bookingClock(input.startsAt, input);
47580
+ case "timeRange": return clockRange(input);
47581
+ case "short": return `${day}, ${bookingClock(input.startsAt, input)}`;
47582
+ case "long": return `${day} · ${clockRange(input)}`;
47583
+ }
47584
+ }
47585
+ /** A single instant in the short form, e.g. "Mon 5 Oct, 7:00pm". */
47586
+ function formatEventDateTime(isoTimestamp, options) {
47587
+ return formatBookingWhen({
47588
+ startsAt: isoTimestamp,
47589
+ timeZone: options?.timeZone,
47590
+ siteTimeZone: options?.siteTimeZone
47591
+ }, "short");
47592
+ }
47593
+ /** The title an occurrence was given on its own, when it overrides the event's. */
47594
+ function occurrenceTitleOverride(occurrence) {
47595
+ const title = occurrence?.overrides?.title;
47596
+ return typeof title === "string" && title.trim() ? title.trim() : null;
47597
+ }
47598
+ /** The event as this page names it: an occurrence's own title wins. */
47599
+ function withOccurrenceTitle(event, occurrence) {
47600
+ const title = occurrenceTitleOverride(occurrence);
47601
+ return event && title ? {
47602
+ ...event,
47603
+ title
47604
+ } : event;
47605
+ }
47606
+ function courseSchedule(sessions, siteTimeZone) {
47607
+ const first = sessions[0];
47608
+ if (!first) return null;
47609
+ const last = sessions[sessions.length - 1] ?? first;
47610
+ const firstLabel = formatEventDateTime(first.startsAt, {
47611
+ timeZone: first.timeZone,
47612
+ siteTimeZone
47613
+ });
47614
+ if (last.startsAt === first.startsAt) return `${sessions.length} session${sessions.length === 1 ? "" : "s"} · ${firstLabel}`;
47615
+ const lastLabel = formatEventDateTime(last.startsAt, {
47616
+ timeZone: last.timeZone,
47617
+ siteTimeZone
47618
+ });
47619
+ return `${sessions.length} sessions · ${firstLabel} – ${lastLabel}`;
47620
+ }
47621
+ /**
47622
+ * When a booking happens, in one line: the occurrence's date and time, or a
47623
+ * course's session count and first and last dates. `short` by default (bar,
47624
+ * confirmation); `long` adds the end time (card, panel header).
47625
+ */
47626
+ function formatRegistrationSchedule(event, occurrence, variant = "short") {
47627
+ if (event.registrationSubject.kind === "wholeSeries") return courseSchedule(event.registrationSubject.sessions, event.siteTimeZone);
47628
+ const input = scheduleInput(event, occurrence ?? null);
47629
+ return input ? formatBookingWhen(input, variant) : null;
47630
+ }
47631
+ /** The occurrence's own times when the page names one, otherwise the event's. */
47632
+ function scheduleInput(event, occurrence) {
47633
+ const times = occurrence?.startsAt ? {
47634
+ startsAt: occurrence.startsAt,
47635
+ endsAt: occurrence.endsAt ?? null
47636
+ } : {
47637
+ startsAt: event.startsAt,
47638
+ endsAt: event.endsAt
47639
+ };
47640
+ if (!times.startsAt) return null;
47641
+ return {
47642
+ ...times,
47643
+ timeZone: occurrence?.timeZone ?? event.timeZone ?? null,
47644
+ siteTimeZone: event.siteTimeZone
47645
+ };
47646
+ }
47647
+ //#endregion
47648
+ //#region ../blocks/src/system/runtime/nodes/event-registration/wizardSteps.ts
47649
+ function registrationRoute(input) {
47650
+ const base = input.chooseEvent ? [
47651
+ "select-event",
47652
+ "select-tickets",
47653
+ "enter-details"
47654
+ ] : ["select-tickets", "enter-details"];
47655
+ switch (input.payment) {
47656
+ case "none": return base;
47657
+ case "options": return [...base, "select-payment"];
47658
+ case "optionsAndPayment": return [
47659
+ ...base,
47660
+ "select-payment",
47661
+ "payment"
47662
+ ];
47663
+ }
47664
+ }
47665
+ const REGISTRATION_STEP_LABELS = [
47666
+ "Event",
47667
+ "Date",
47668
+ "Tickets",
47669
+ "Places",
47670
+ "Your details",
47671
+ "How you’ll pay",
47672
+ "Payment"
47673
+ ];
47674
+ /** Several dates of one series are a date choice; anything else is an event choice. */
47675
+ function getEventSelectionMode(events) {
47676
+ const firstSeriesId = events[0]?.seriesId;
47677
+ return events.length > 1 && firstSeriesId && events.every((event) => event.seriesId === firstSeriesId) ? "date" : "event";
47678
+ }
47679
+ /** The label facts for a surface: what the visitor chooses from, and what they book. */
47680
+ function registrationStepLabelContext(scopedEvents, bookedEvent) {
47681
+ return {
47682
+ eventSelection: getEventSelectionMode(scopedEvents),
47683
+ booksWholeSeries: bookedEvent?.registrationSubject.kind === "wholeSeries"
47684
+ };
47685
+ }
47686
+ /** One label owner for the live progress and the server placeholder. */
47687
+ function registrationStepLabel(step, context) {
47688
+ switch (step) {
47689
+ case "select-event": return context.eventSelection === "date" ? "Date" : "Event";
47690
+ case "select-tickets": return context.booksWholeSeries ? "Places" : "Tickets";
47691
+ case "enter-details": return "Your details";
47692
+ case "select-payment": return "How you’ll pay";
47693
+ case "payment": return "Payment";
47694
+ }
47695
+ }
47696
+ function bookingButtonText(buttonText) {
47697
+ return buttonText?.trim() || "Book your place";
47698
+ }
47699
+ function placesLabel(event, input, compact) {
47700
+ return placesLeftLabel(selectEventCapacitySource(event, input.attendanceMode), input.display, { compact });
47701
+ }
47702
+ function isFull(event, mode) {
47703
+ return formatRemainingPlaces(selectEventCapacitySource(event, mode), {
47704
+ full: "full",
47705
+ waitlist: "full"
47706
+ }) === "full";
47707
+ }
47708
+ function priceLabel(event) {
47709
+ return formatEventPriceDisplay(event.pricing).trim() || null;
47710
+ }
47711
+ /** The lowest price a display can mean; null when it names no paid amount. */
47712
+ function lowestPaidAmount(display) {
47713
+ switch (display.kind) {
47714
+ case "exact":
47715
+ case "from": return display.amount;
47716
+ case "range": return display.minAmount;
47717
+ case "mixed": return display.paidFromAmount;
47718
+ case "free":
47719
+ case "unavailable":
47720
+ case "external": return null;
47721
+ }
47722
+ }
47723
+ /**
47724
+ * One price for a set of dates: the shared label when every date costs the
47725
+ * same, otherwise "From" the lowest paid amount, through the one formatter.
47726
+ */
47727
+ function seriesPriceLabel(events) {
47728
+ const firstEvent = events[0];
47729
+ if (!firstEvent) return null;
47730
+ const displays = events.map((event) => publicEventPricingDisplay(event.pricing));
47731
+ const labels = new Set(displays.map((display) => formatBookingPriceDisplay(display, { decimals: "auto" })));
47732
+ if (labels.size === 1) return [...labels][0] || null;
47733
+ const lowest = displays.flatMap((display) => {
47734
+ const amount = lowestPaidAmount(display);
47735
+ return amount === null || !("currency" in display) ? [] : [{
47736
+ amount,
47737
+ currency: display.currency
47738
+ }];
47739
+ }).reduce((best, candidate) => best === null || candidate.amount < best.amount ? candidate : best, null);
47740
+ return lowest ? formatBookingPriceDisplay({
47741
+ kind: "from",
47742
+ amount: lowest.amount,
47743
+ currency: lowest.currency
47744
+ }, { decimals: "auto" }) : priceLabel(firstEvent);
47745
+ }
47746
+ function dateTile(event) {
47747
+ if (event.registrationSubject.kind === "wholeSeries" || !event.startsAt) return null;
47748
+ const rail = formatEventCompactDateRail(event.startsAt, { timeZone: event.timeZone });
47749
+ return {
47750
+ month: rail.month,
47751
+ day: rail.day
47752
+ };
47753
+ }
47754
+ /** "Mon 5 Oct": the compact date the chips and the bar share. */
47755
+ function formatBookingShortDate(event) {
47756
+ return formatBookingWhen(event, "day");
47757
+ }
47758
+ function byStart(left, right) {
47759
+ return Date.parse(left.startsAt) - Date.parse(right.startsAt);
47760
+ }
47761
+ function singleEntry(event, input) {
47762
+ const isCourse = event.registrationSubject.kind === "wholeSeries";
47763
+ return {
47764
+ kind: "single",
47765
+ title: event.title,
47766
+ when: formatRegistrationSchedule(event, null, "long"),
47767
+ shortWhen: formatRegistrationSchedule(event),
47768
+ venue: shownVenue(event, input.display),
47769
+ price: priceLabel(event),
47770
+ places: placesLabel(event, input, false),
47771
+ tile: dateTile(event),
47772
+ action: isCourse ? `Book the ${input.noun.label}` : bookingButtonText(input.buttonText)
47773
+ };
47774
+ }
47775
+ function chooseDateEntry(input) {
47776
+ const ordered = [...input.events].sort(byStart);
47777
+ const first = ordered[0];
47778
+ const shown = ordered.slice(0, 4);
47779
+ return {
47780
+ kind: "chooseDate",
47781
+ title: first?.title ?? "",
47782
+ schedule: (first ? formatBookingScheduleSummary(first) : null) ?? (ordered.length === 1 ? "1 date" : `${ordered.length} dates`),
47783
+ venue: first ? shownVenue(first, input.display) : null,
47784
+ price: seriesPriceLabel(ordered),
47785
+ nextDate: first ? formatBookingShortDate(first) : null,
47786
+ dateCount: ordered.length,
47787
+ dates: shown.map((event) => ({
47788
+ selectionId: event.selectionId,
47789
+ label: formatBookingShortDate(event),
47790
+ places: placesLabel(event, input, true),
47791
+ full: isFull(event, input.attendanceMode)
47792
+ })),
47793
+ moreCount: Math.max(0, ordered.length - shown.length),
47794
+ action: "Choose a date"
47795
+ };
47796
+ }
47797
+ /** The card before a booking starts; the server renders this too. */
47798
+ function idleBookingEntry(input) {
47799
+ if (input.event) return singleEntry(input.event, input);
47800
+ const only = input.events.length === 1 ? input.events[0] : void 0;
47801
+ if (only) return singleEntry(only, input);
47802
+ if (getEventSelectionMode(input.events) === "date") return chooseDateEntry(input);
47803
+ return {
47804
+ kind: "chooseEvent",
47805
+ title: input.events[0]?.title ?? "",
47806
+ count: input.events.length,
47807
+ noun: input.noun.pluralLabel,
47808
+ action: "Choose an event"
47809
+ };
47810
+ }
47811
+ //#endregion
47812
+ //#region ../blocks/src/system/runtime/nodes/event-registration/offeringNoun.ts
47813
+ function offeringKindForEvent(event) {
47814
+ return event.registrationSubject.kind === "wholeSeries" ? "course" : event.eventPreset ?? "event";
47815
+ }
47816
+ function presetKind(preset) {
47817
+ const source = sourceFromPresetSummary(preset);
47818
+ if (!source) return null;
47819
+ return source.kind === "wholeSeries" ? "course" : source.preset;
47820
+ }
47821
+ /**
47822
+ * What the site calls this kind of offering, in lower case for use mid-sentence
47823
+ * ("Book the course", "3 workshops"). Site preset labels win; the canonical
47824
+ * name stands in when the site has none.
47825
+ */
47826
+ function offeringNounForEvent(event, presets) {
47827
+ if (!event) return lowerCased(EVENT_PRESET_VOCABULARY.event);
47828
+ const kind = offeringKindForEvent(event);
47829
+ const preset = presets?.find((candidate) => presetKind(candidate) === kind);
47830
+ return lowerCased(preset?.label.trim() && preset.pluralLabel.trim() ? preset : EVENT_PRESET_VOCABULARY[kind]);
47831
+ }
47832
+ function lowerCased(noun) {
47833
+ return {
47834
+ label: noun.label.trim().toLocaleLowerCase(),
47835
+ pluralLabel: noun.pluralLabel.trim().toLocaleLowerCase()
47836
+ };
47837
+ }
47838
+ //#endregion
47209
47839
  //#region ../blocks/src/system/runtime/nodes/event-registration/registrationEventAdapter.ts
47210
47840
  function toRegistrationEvent(event) {
47211
47841
  return {
@@ -47250,6 +47880,101 @@ function toWholeSeriesRegistrationEvents(events) {
47250
47880
  return groupPublicEventsByRun(events).map(toWholeSeriesRegistrationEvent).filter((event) => event !== null);
47251
47881
  }
47252
47882
  //#endregion
47883
+ //#region ../blocks/src/system/runtime/nodes/event-registration/bookingCardDisplay.ts
47884
+ /**
47885
+ * The booking card the server renders on CMS pages (issue 1581), and the
47886
+ * offering noun it resolves for the wizard. Kept beside the island contract
47887
+ * so the server and the client agree on one card.
47888
+ */
47889
+ const bookingHostSchema = z.enum(["overlay", "inPlace"]);
47890
+ const tileSchema = z.object({
47891
+ month: z.string(),
47892
+ day: z.string()
47893
+ }).nullable();
47894
+ const idleBookingEntrySchema = z.discriminatedUnion("kind", [
47895
+ z.object({
47896
+ kind: z.literal("single"),
47897
+ title: z.string(),
47898
+ when: z.string().nullable(),
47899
+ shortWhen: z.string().nullable(),
47900
+ venue: z.string().nullable(),
47901
+ price: z.string().nullable(),
47902
+ places: z.string().nullable(),
47903
+ tile: tileSchema,
47904
+ action: z.string()
47905
+ }),
47906
+ z.object({
47907
+ kind: z.literal("chooseDate"),
47908
+ title: z.string(),
47909
+ schedule: z.string(),
47910
+ venue: z.string().nullable(),
47911
+ price: z.string().nullable(),
47912
+ nextDate: z.string().nullable(),
47913
+ dateCount: z.number(),
47914
+ dates: z.array(z.object({
47915
+ selectionId: z.string(),
47916
+ label: z.string(),
47917
+ places: z.string().nullable(),
47918
+ full: z.boolean()
47919
+ })),
47920
+ moreCount: z.number(),
47921
+ action: z.string()
47922
+ }),
47923
+ z.object({
47924
+ kind: z.literal("chooseEvent"),
47925
+ title: z.string(),
47926
+ count: z.number(),
47927
+ noun: z.string(),
47928
+ action: z.string()
47929
+ })
47930
+ ]);
47931
+ function toScopedEventRegistrationEvents(scopedSourceEvents) {
47932
+ return [...toRegistrationEvents(scopedSourceEvents), ...toWholeSeriesRegistrationEvents(scopedSourceEvents)];
47933
+ }
47934
+ function scopedRegistrationEvents(source, scopedSourceEvents) {
47935
+ const scopedEvents = toScopedEventRegistrationEvents(scopedSourceEvents);
47936
+ return {
47937
+ scopedEvents,
47938
+ preSelected: findPreSelectedEvent({
47939
+ scopedEvents,
47940
+ occurrenceContext: source.occurrenceContext
47941
+ })
47942
+ };
47943
+ }
47944
+ function nounFor(scoped, presets) {
47945
+ return offeringNounForEvent(scoped.preSelected ?? scoped.scopedEvents[0] ?? null, presets);
47946
+ }
47947
+ /** What the site calls the offering this block books, from its preset rows. */
47948
+ function resolveOfferingNoun(source, scopedSourceEvents) {
47949
+ return nounFor(scopedRegistrationEvents(source, scopedSourceEvents), source.bookingOfferingPresets);
47950
+ }
47951
+ function idleEntry(source, scopedSourceEvents, display) {
47952
+ const scoped = scopedRegistrationEvents(source, scopedSourceEvents);
47953
+ if (scoped.scopedEvents.length === 0) return null;
47954
+ return idleBookingEntry({
47955
+ events: scoped.scopedEvents,
47956
+ event: withOccurrenceTitle(scoped.preSelected, source.occurrenceContext),
47957
+ display,
47958
+ buttonText: source.buttonText,
47959
+ noun: nounFor(scoped, source.bookingOfferingPresets),
47960
+ attendanceMode: null
47961
+ });
47962
+ }
47963
+ /** The server's card on CMS pages, or null where the shell still applies. */
47964
+ function bookingCardDisplay(source, scopedSourceEvents, display) {
47965
+ if ((source.host ?? "overlay") !== "overlay") return null;
47966
+ const entry = idleEntry(source, scopedSourceEvents, display);
47967
+ if (!entry) return null;
47968
+ return {
47969
+ kind: "event-registration",
47970
+ state: "booking-card",
47971
+ className: source.className ?? null,
47972
+ entry,
47973
+ buttonVariant: source.buttonVariant ?? null,
47974
+ buttonText: source.buttonText?.trim() ?? ""
47975
+ };
47976
+ }
47977
+ //#endregion
47253
47978
  //#region ../blocks/src/system/runtime/nodes/event-registration/eventSourceRecovery.ts
47254
47979
  const { limit: _rawLimit, eventSurface: _rawEventSurface, scheduleScope: _rawScheduleScope, detailLevel: _rawDetailLevel, ...stringEventQueryShape } = publicEventLoaderQuerySchemaShape;
47255
47980
  const eventRecoveryRequestSchema = z.object({
@@ -47292,27 +48017,17 @@ function parseEventLoaderRecoveryRequest(value) {
47292
48017
  const EVENT_REGISTRATION_GENERIC_SHELL_STEP_LABELS = [
47293
48018
  "Date",
47294
48019
  "Tickets",
47295
- "Details"
47296
- ];
47297
- const EVENT_REGISTRATION_SHELL_STEP_LABELS = [
47298
- "Event",
47299
- "Date",
47300
- "Tickets",
47301
- "Details",
47302
- "Payment options",
47303
- "Payment"
48020
+ "Your details"
47304
48021
  ];
47305
48022
  const eventRegistrationPublicEventSchema = z.preprocess(normalizeEventRegistrationEventInput, publicEventSchema);
47306
- const eventRegistrationHydrationSchemaShape = {
48023
+ const eventRegistrationCommonSchemaShape = {
47307
48024
  demoEmailSuppressed: z.boolean().optional(),
47308
48025
  occurrenceContext: occurrenceContextSchema.optional(),
47309
48026
  subject: eventRegistrationPageSurfaceSubjectSchema.nullable().optional(),
47310
48027
  maxTickets: z.string().optional(),
47311
- showVenue: z.boolean().optional(),
47312
- showCapacity: z.boolean().optional(),
47313
48028
  successMessage: z.string().optional(),
47314
48029
  buttonVariant: registrationButtonVariantSchema.optional(),
47315
- overlayEnabled: z.boolean().optional(),
48030
+ host: bookingHostSchema.optional(),
47316
48031
  spamProtectionEnabled: z.boolean().optional(),
47317
48032
  supportEmail: z.string().optional(),
47318
48033
  sitePasses: publicPassProductCollectionSchema.nullable().optional(),
@@ -47337,32 +48052,51 @@ const eventRegistrationSourceSchema = z.object({
47337
48052
  portalToken: z.string().nullable().optional(),
47338
48053
  previewToken: z.string().nullable().optional(),
47339
48054
  readAuthority: browserReadAuthoritySchema.optional(),
47340
- ...eventRegistrationHydrationSchemaShape,
48055
+ ...eventRegistrationCommonSchemaShape,
48056
+ showVenue: z.boolean().optional(),
48057
+ showCapacity: z.boolean().optional(),
47341
48058
  events: z.array(eventRegistrationPublicEventSchema).nullable().optional(),
47342
48059
  wholeSeriesRunEvents: z.array(eventRegistrationPublicEventSchema).nullable().optional(),
47343
48060
  eventLoaderFailures: z.record(z.string(), z.unknown()).nullable().optional(),
47344
48061
  className: z.string().nullable().optional(),
47345
48062
  buttonText: z.string().nullable().optional(),
47346
48063
  maxTickets: z.string().nullable().optional(),
47347
- stage: previewStageSchema.optional()
48064
+ stage: previewStageSchema.optional(),
48065
+ bookingOfferingPresets: z.array(z.custom((value) => typeof value === "object" && value !== null && typeof value.label === "string")).nullable().optional()
47348
48066
  });
47349
- const eventRegistrationDisplaySchema = z.discriminatedUnion("state", [z.object({
47350
- kind: z.literal("event-registration"),
47351
- state: z.literal("generic-shell"),
47352
- className: z.string().nullable(),
47353
- titleText: z.string(),
47354
- bodyText: z.string(),
47355
- stepLabels: z.array(z.enum(EVENT_REGISTRATION_SHELL_STEP_LABELS)).min(1),
47356
- summaryButtonText: z.string()
47357
- }), z.object({
47358
- kind: z.literal("event-registration"),
47359
- state: z.literal("registration-closed"),
47360
- className: z.string().nullable(),
47361
- titleText: z.string(),
47362
- bodyText: z.string()
47363
- })]);
48067
+ const eventRegistrationDisplaySchema = z.discriminatedUnion("state", [
48068
+ z.object({
48069
+ kind: z.literal("event-registration"),
48070
+ state: z.literal("generic-shell"),
48071
+ className: z.string().nullable(),
48072
+ titleText: z.string(),
48073
+ bodyText: z.string(),
48074
+ stepLabels: z.array(z.enum(REGISTRATION_STEP_LABELS)).min(1),
48075
+ summaryButtonText: z.string()
48076
+ }),
48077
+ z.object({
48078
+ kind: z.literal("event-registration"),
48079
+ state: z.literal("registration-closed"),
48080
+ className: z.string().nullable(),
48081
+ titleText: z.string(),
48082
+ bodyText: z.string()
48083
+ }),
48084
+ z.object({
48085
+ kind: z.literal("event-registration"),
48086
+ state: z.literal("booking-card"),
48087
+ className: z.string().nullable(),
48088
+ entry: idleBookingEntrySchema,
48089
+ buttonVariant: registrationButtonVariantSchema.nullable(),
48090
+ buttonText: z.string()
48091
+ })
48092
+ ]);
47364
48093
  const eventRegistrationHydrationSchema = z.object({
47365
- ...eventRegistrationHydrationSchemaShape,
48094
+ ...eventRegistrationCommonSchemaShape,
48095
+ display: registrationDisplaySchema,
48096
+ offeringNoun: z.object({
48097
+ label: z.string(),
48098
+ pluralLabel: z.string()
48099
+ }).optional(),
47366
48100
  eventSource: eventRegistrationEventSourceSchema
47367
48101
  });
47368
48102
  const eventRegistrationRenderSchema = z.object({
@@ -47377,7 +48111,7 @@ z.object({
47377
48111
  readAuthority: browserReadAuthoritySchema.optional(),
47378
48112
  stage: previewStageSchema.optional()
47379
48113
  });
47380
- function buildEventRegistrationDisplayFromScopedEvents(source, scopedSourceEvents) {
48114
+ function buildEventRegistrationDisplayFromScopedEvents(source, scopedSourceEvents, display) {
47381
48115
  const selectedRun = resolveSelectedWholeSeriesRun(scopedSourceEvents);
47382
48116
  if (selectedRun && (!selectedRun.run.enrollmentOpen || toWholeSeriesRegistrationEvent(selectedRun) === null)) return {
47383
48117
  kind: "event-registration",
@@ -47386,6 +48120,8 @@ function buildEventRegistrationDisplayFromScopedEvents(source, scopedSourceEvent
47386
48120
  titleText: "Registration closed",
47387
48121
  bodyText: "This run is no longer open for bookings."
47388
48122
  };
48123
+ const card = bookingCardDisplay(source, scopedSourceEvents, display);
48124
+ if (card) return card;
47389
48125
  const stepLabels = buildEventRegistrationShellStepLabels(source, scopedSourceEvents);
47390
48126
  return {
47391
48127
  kind: "event-registration",
@@ -47402,11 +48138,14 @@ function buildEventRegistrationShellStepLabels(source, scopedSourceEvents) {
47402
48138
  if (selectedRun) {
47403
48139
  const selectedEvent = toWholeSeriesRegistrationEvent(selectedRun);
47404
48140
  if (!selectedEvent) return EVENT_REGISTRATION_GENERIC_SHELL_STEP_LABELS;
47405
- return getWizardStepsForContext(true, resolveEventRequiresPayment({
47406
- eligibility: null,
47407
- selectedTicketType: null,
47408
- event: selectedEvent
47409
- })).map((step) => shellLabelForRegistrationStep(step, [selectedEvent]));
48141
+ return shellStepLabels(registrationRoute({
48142
+ chooseEvent: false,
48143
+ payment: resolveEventRequiresPayment({
48144
+ eligibility: null,
48145
+ selectedTicketType: null,
48146
+ event: selectedEvent
48147
+ }) ? "optionsAndPayment" : "none"
48148
+ }), registrationStepLabelContext([selectedEvent], selectedEvent));
47410
48149
  }
47411
48150
  const scopedEvents = toScopedEventRegistrationEvents(scopedSourceEvents);
47412
48151
  if (scopedEvents.length === 0) return EVENT_REGISTRATION_GENERIC_SHELL_STEP_LABELS;
@@ -47415,14 +48154,15 @@ function buildEventRegistrationShellStepLabels(source, scopedSourceEvents) {
47415
48154
  occurrenceContext: source.occurrenceContext
47416
48155
  });
47417
48156
  const hasPreSelectedContext = Boolean(source.occurrenceContext || preSelectedEvent);
47418
- return getWizardStepsForContext(hasPreSelectedContext, hasPreSelectedContext && preSelectedEvent ? resolveEventRequiresPayment({
48157
+ const needsPaymentStep = hasPreSelectedContext && preSelectedEvent ? resolveEventRequiresPayment({
47419
48158
  eligibility: null,
47420
48159
  selectedTicketType: null,
47421
48160
  event: preSelectedEvent
47422
- }) : false).map((step) => shellLabelForRegistrationStep(step, scopedEvents));
47423
- }
47424
- function toScopedEventRegistrationEvents(scopedSourceEvents) {
47425
- return [...toRegistrationEvents(scopedSourceEvents), ...toWholeSeriesRegistrationEvents(scopedSourceEvents)];
48161
+ }) : false;
48162
+ return shellStepLabels(registrationRoute({
48163
+ chooseEvent: !hasPreSelectedContext,
48164
+ payment: needsPaymentStep ? "optionsAndPayment" : "none"
48165
+ }), registrationStepLabelContext(scopedEvents, preSelectedEvent));
47426
48166
  }
47427
48167
  function scopeEventRegistrationSourceEvents(source, eventSource) {
47428
48168
  return resolveEventRegistrationScopedEvents(eventSource.kind === "loaded" ? eventSource.events : [], {
@@ -47438,29 +48178,12 @@ function resolveSelectedWholeSeriesRun(scopedSourceEvents) {
47438
48178
  const runs = groupPublicEventsByRun(scopedSourceEvents);
47439
48179
  return runs.length === 1 ? runs[0] : null;
47440
48180
  }
47441
- function shellLabelForRegistrationStep(step, events) {
47442
- switch (step) {
47443
- case "select-event": return isDateSelection(events) ? "Date" : "Event";
47444
- case "select-tickets": return "Tickets";
47445
- case "enter-details": return "Details";
47446
- case "select-payment": return "Payment options";
47447
- case "payment": return "Payment";
47448
- case "error":
47449
- case "success":
47450
- case "submitting":
47451
- case "verifying-payment":
47452
- case "verifying-timeout":
47453
- case "payment-status":
47454
- case "payment-failed": return "Details";
47455
- }
47456
- }
47457
- function isDateSelection(events) {
47458
- const firstSeriesId = events[0]?.seriesId;
47459
- return Boolean(events.length > 1 && firstSeriesId && events.every((event) => event.seriesId === firstSeriesId));
48181
+ function shellStepLabels(route, context) {
48182
+ return route.map((step) => registrationStepLabel(step, context));
47460
48183
  }
47461
48184
  function buildEventRegistrationShellBodyText(stepLabels) {
47462
- if (stepLabels.includes("Payment options")) return "Preparing tickets, details, and payment options.";
47463
- if (stepLabels[0] === "Tickets") return "Preparing tickets and booking details.";
48185
+ if (stepLabels.includes("How you’ll pay")) return "Preparing tickets, details, and payment options.";
48186
+ if (stepLabels[0] === "Tickets" || stepLabels[0] === "Places") return "Preparing tickets and booking details.";
47464
48187
  return "Preparing dates, tickets, and booking details.";
47465
48188
  }
47466
48189
  const eventRegistrationBlockRuntime = defineClientOwnedBlockRuntime({
@@ -47470,6 +48193,7 @@ const eventRegistrationBlockRuntime = defineClientOwnedBlockRuntime({
47470
48193
  render: createZodCodec(eventRegistrationRenderSchema)
47471
48194
  },
47472
48195
  buildRender: (source) => {
48196
+ const display = resolveRegistrationDisplay(source);
47473
48197
  const eventSource = resolveEventRegistrationEventSource({
47474
48198
  events: source.events,
47475
48199
  wholeSeriesRunEvents: source.wholeSeriesRunEvents,
@@ -47477,7 +48201,7 @@ const eventRegistrationBlockRuntime = defineClientOwnedBlockRuntime({
47477
48201
  });
47478
48202
  const scopedSourceEvents = scopeEventRegistrationSourceEvents(source, eventSource);
47479
48203
  return {
47480
- display: buildEventRegistrationDisplayFromScopedEvents(source, scopedSourceEvents),
48204
+ display: buildEventRegistrationDisplayFromScopedEvents(source, scopedSourceEvents, display),
47481
48205
  hydration: {
47482
48206
  occurrenceContext: source.occurrenceContext ?? null,
47483
48207
  subject: source.subject ?? null,
@@ -47487,17 +48211,17 @@ const eventRegistrationBlockRuntime = defineClientOwnedBlockRuntime({
47487
48211
  } : eventSource,
47488
48212
  demoEmailSuppressed: source.demoEmailSuppressed,
47489
48213
  maxTickets: source.maxTickets ?? void 0,
47490
- showVenue: source.showVenue,
47491
- showCapacity: source.showCapacity,
48214
+ display,
47492
48215
  successMessage: source.successMessage,
47493
48216
  buttonVariant: source.buttonVariant,
47494
- overlayEnabled: source.overlayEnabled,
48217
+ host: source.host ?? "overlay",
47495
48218
  spamProtectionEnabled: source.spamProtectionEnabled,
47496
48219
  supportEmail: source.supportEmail,
47497
48220
  sitePasses: source.sitePasses ?? null,
47498
48221
  siteMemberships: source.siteMemberships ?? null,
47499
48222
  mailingList: source.mailingList,
47500
- siteName: source.siteName
48223
+ siteName: source.siteName,
48224
+ offeringNoun: resolveOfferingNoun(source, scopedSourceEvents)
47501
48225
  }
47502
48226
  };
47503
48227
  }
@@ -47564,7 +48288,7 @@ const eventRegistrationBlockDefinition = {
47564
48288
  description: "Main heading for the registration form",
47565
48289
  required: false,
47566
48290
  multiline: false,
47567
- defaultValue: "Register for this event"
48291
+ defaultValue: ""
47568
48292
  },
47569
48293
  {
47570
48294
  id: "description",
@@ -47636,11 +48360,11 @@ const eventRegistrationBlockDefinition = {
47636
48360
  {
47637
48361
  id: "buttonText",
47638
48362
  type: "text",
47639
- label: "Submit button text",
47640
- description: "Text for the registration submit button",
48363
+ label: "Button text",
48364
+ description: "Text on the booking button",
47641
48365
  required: false,
47642
48366
  multiline: false,
47643
- defaultValue: "Complete Registration",
48367
+ defaultValue: "Book your place",
47644
48368
  maxLength: 40
47645
48369
  },
47646
48370
  createButtonVariantField()
@@ -47672,21 +48396,21 @@ const eventRegistrationBlockDefinition = {
47672
48396
  successMessage: { $bind: { from: "content.successMessage" } },
47673
48397
  buttonText: { $bind: {
47674
48398
  from: "content.buttonText",
47675
- fallback: "Complete Registration"
48399
+ fallback: "Book your place"
47676
48400
  } },
47677
48401
  buttonVariant: { $bind: {
47678
48402
  from: "content.buttonVariant",
47679
48403
  fallback: "primary"
47680
48404
  } },
47681
- overlayEnabled: { $bind: {
47682
- from: "$root.eventRegistrationOverlayEnabled",
47683
- fallback: false
47684
- } },
47685
48405
  events: { $bind: { from: "data.events" } },
47686
48406
  wholeSeriesRunEvents: { $bind: { from: "data.wholeSeriesRunEvents" } },
47687
48407
  loaderFailures: { $bind: { from: "$root.loaderFailures" } },
47688
48408
  mailingList: { $bind: { from: "$root.mailingList" } },
47689
48409
  siteName: { $bind: { from: "$root.siteName" } },
48410
+ bookingOfferingPresets: { $bind: {
48411
+ from: "$root.bookingOfferingPresets",
48412
+ fallback: []
48413
+ } },
47690
48414
  sitePasses: { $bind: { from: "data.sitePasses" } },
47691
48415
  siteMemberships: { $bind: { from: "data.siteMemberships" } },
47692
48416
  stage: { $bind: {
@@ -49427,7 +50151,21 @@ const eventCalendarBlockDefinition = {
49427
50151
  list: { label: "List" }
49428
50152
  }
49429
50153
  }, eventCalendarContentShape),
49430
- normalizeContent: normalizeEventCalendarContent,
50154
+ contentNormalizer: {
50155
+ fieldIds: [
50156
+ "variant",
50157
+ "displayMode",
50158
+ "listLayout",
50159
+ "defaultCalendarView",
50160
+ "eventSurface",
50161
+ "filterEventPresets",
50162
+ "scheduleScope",
50163
+ "filterCategoryIds",
50164
+ "filterStaffMemberId",
50165
+ "filterVenueId"
50166
+ ],
50167
+ normalize: normalizeEventCalendarContent
50168
+ },
49431
50169
  dataSchemas: {
49432
50170
  events: publicEventsArraySchema.optional(),
49433
50171
  calendarWindow: calendarWindowPageSchema.optional()
@@ -50180,11 +50918,11 @@ function buildNewsletterDisplay(source) {
50180
50918
  successMessage: DEFAULT_MAILING_LIST_SUCCESS_MESSAGE,
50181
50919
  privacyNote: null
50182
50920
  };
50183
- const targeting = source.targeting ?? { mode: "default" };
50184
- const choices = resolveRuntimeChoices(context, targeting);
50921
+ const assessment = assessMailingListTargeting(context, source.targeting ?? { mode: "default" });
50922
+ const choices = resolveRuntimeChoices(assessment);
50185
50923
  return {
50186
50924
  kind: "newsletter-form",
50187
- availability: runtimeTargetingIsAvailable(context, targeting, choices) ? "ready" : "unavailable",
50925
+ availability: assessment.tag === "available" ? "ready" : "unavailable",
50188
50926
  className: source.className ?? null,
50189
50927
  buttonLabel: form.buttonLabel,
50190
50928
  successMessage: form.successMessage,
@@ -50241,60 +50979,12 @@ function projectNewsletterFormHydrationTarget(source) {
50241
50979
  default: return assertNever$3(source);
50242
50980
  }
50243
50981
  }
50244
- function resolveRuntimeChoices(context, targeting) {
50245
- if (context?.tag !== "configured" || targeting.mode !== "custom" || targeting.selection.tag !== "visitor_choice" || context.provider.provider !== targeting.provider) return [];
50246
- switch (targeting.provider) {
50247
- case "native": {
50248
- const offered = new Set(targeting.selection.offeredTopicIds);
50249
- return context.provider.provider === "native" ? context.provider.topics.filter((item) => offered.has(item.id)).map((item) => ({
50250
- id: item.id,
50251
- label: item.name
50252
- })) : [];
50253
- }
50254
- case "brevo": {
50255
- const offered = new Set(targeting.selection.offeredListIds);
50256
- return context.provider.provider === "brevo" ? context.provider.lists.filter((item) => offered.has(item.id)).map((item) => ({
50257
- id: String(item.id),
50258
- label: item.name
50259
- })) : [];
50260
- }
50261
- case "mailchimp": {
50262
- const offered = new Set(targeting.selection.offeredInterestIds);
50263
- return (context.provider.provider === "mailchimp" ? context.provider.audiences.find((item) => item.id === targeting.audienceId) : void 0)?.interests.filter((item) => offered.has(item.id)).map((item) => ({
50264
- id: item.id,
50265
- label: item.name
50266
- })) ?? [];
50267
- }
50268
- }
50269
- }
50270
- function runtimeTargetingIsAvailable(context, targeting, choices) {
50271
- if (context?.tag !== "configured") return false;
50272
- const provider = context.provider;
50273
- if (targeting.mode === "default") switch (provider.provider) {
50274
- case "native": return provider.topics.some((item) => item.id === provider.defaultTopicId);
50275
- case "brevo": return provider.lists.some((item) => item.id === provider.defaultListId);
50276
- case "mailchimp": return provider.audiences.some((item) => item.id === provider.defaultAudienceId);
50277
- }
50278
- if (targeting.provider !== provider.provider) return false;
50279
- switch (targeting.provider) {
50280
- case "native": return provider.provider === "native" && nativeTargetIsAvailable(provider, targeting, choices);
50281
- case "brevo": return provider.provider === "brevo" && brevoTargetIsAvailable(provider, targeting, choices);
50282
- case "mailchimp": return provider.provider === "mailchimp" && mailchimpTargetIsAvailable(provider, targeting, choices);
50283
- }
50284
- }
50285
- function nativeTargetIsAvailable(provider, targeting, choices) {
50286
- const ids = targeting.selection.tag === "fixed" ? targeting.selection.topicIds : targeting.selection.offeredTopicIds;
50287
- return ids.every((id) => provider.topics.some((item) => item.id === id)) && (targeting.selection.tag !== "visitor_choice" || choices.length === ids.length);
50288
- }
50289
- function brevoTargetIsAvailable(provider, targeting, choices) {
50290
- const ids = targeting.selection.tag === "fixed" ? targeting.selection.listIds : targeting.selection.offeredListIds;
50291
- return ids.every((id) => provider.lists.some((item) => item.id === id)) && (targeting.selection.tag !== "visitor_choice" || choices.length === ids.length);
50292
- }
50293
- function mailchimpTargetIsAvailable(provider, targeting, choices) {
50294
- const audience = provider.audiences.find((item) => item.id === targeting.audienceId);
50295
- if (!audience) return false;
50296
- const ids = targeting.selection.tag === "fixed" ? targeting.selection.interestIds : targeting.selection.offeredInterestIds;
50297
- return ids.every((id) => audience.interests.some((item) => item.id === id)) && (targeting.selection.tag !== "visitor_choice" || choices.length === ids.length);
50982
+ function resolveRuntimeChoices(assessment) {
50983
+ if (!("value" in assessment) || assessment.value.mode !== "custom" || !("selectedChoices" in assessment.value) || assessment.value.targeting.selection.tag !== "visitor_choice") return [];
50984
+ return assessment.value.selectedChoices.map((item) => ({
50985
+ id: String(item.id),
50986
+ label: item.name
50987
+ }));
50298
50988
  }
50299
50989
  function buildNewsletterFormInteractiveIslandProps(props) {
50300
50990
  const decoded = newsletterFormBlockRuntime.contracts.source.decode(props);
@@ -50325,6 +51015,15 @@ function parseRequiredMailingListSignedSourceToken(value) {
50325
51015
  return parsed;
50326
51016
  }
50327
51017
  //#endregion
51018
+ //#region ../blocks/src/system/helpers/normalizeMailingListBlockContent.ts
51019
+ /** Fill the declared default without admitting or rewriting invalid custom settings. */
51020
+ function normalizeMailingListBlockContent(record) {
51021
+ return record.targeting == null ? {
51022
+ ...record,
51023
+ targeting: DEFAULT_MAILING_LIST_TARGETING
51024
+ } : record;
51025
+ }
51026
+ //#endregion
50328
51027
  //#region ../blocks/src/system/blocks/newsletter-signup.ts
50329
51028
  const stackedComposition = composeFragments([{ fragment: newsletterCopyFragment }, { fragment: newsletterFormFragment }]);
50330
51029
  const stackedLayout$1 = styledSection({
@@ -50421,6 +51120,10 @@ function sanitizeNewsletterSignupPublicContent(content) {
50421
51120
  }
50422
51121
  const newsletterSignupBlockDefinition = {
50423
51122
  manifest: newsletterSignupManifest,
51123
+ contentNormalizer: {
51124
+ fieldIds: ["targeting"],
51125
+ normalize: normalizeMailingListBlockContent
51126
+ },
50424
51127
  runtime: newsletterFormBlockRuntime
50425
51128
  };
50426
51129
  const productDetailBlockDefinition = {
@@ -51669,6 +52372,7 @@ function dateLabel(key, timeZone) {
51669
52372
  }
51670
52373
  function MonthDay(props) {
51671
52374
  const { day, selection } = props;
52375
+ const { controls } = selection;
51672
52376
  const selected = day.dateKey === selection.selectedDay;
51673
52377
  return /* @__PURE__ */ jsxs("div", {
51674
52378
  "data-slot": "date",
@@ -51680,7 +52384,7 @@ function MonthDay(props) {
51680
52384
  "data-slot": "control",
51681
52385
  "aria-label": `Show events on ${dateLabel(day.dateKey, selection.timeZone)}`,
51682
52386
  "aria-pressed": selected,
51683
- onClick: () => selection.onSelectDay?.(day.dateKey),
52387
+ onClick: controls ? () => controls.selectDay(day.dateKey) : void 0,
51684
52388
  children: day.date.day
51685
52389
  }) : /* @__PURE__ */ jsx("span", {
51686
52390
  "data-slot": "date-label",
@@ -51693,7 +52397,7 @@ function MonthDay(props) {
51693
52397
  type: "button",
51694
52398
  className: "event-calendar-more",
51695
52399
  "data-slot": "more",
51696
- onClick: () => selection.onOpenDay?.(day.date, day.entries.map(({ event }) => event)),
52400
+ onClick: controls ? () => controls.openDay(day.date, day.entries.map(({ event }) => event)) : void 0,
51697
52401
  children: [
51698
52402
  "+",
51699
52403
  day.moreCount,
@@ -52854,10 +53558,219 @@ function RegistrationClosedState({ title, body }) {
52854
53558
  });
52855
53559
  }
52856
53560
  //#endregion
52857
- //#region ../blocks/src/system/runtime/nodes/event-registration.server.tsx
52858
- function cx(...classes) {
52859
- return classes.filter((className) => Boolean(className)).join(" ");
53561
+ //#region ../blocks/src/system/runtime/nodes/event-registration/BookingEntryViews.tsx
53562
+ function joinFacts(facts) {
53563
+ return facts.filter((fact) => Boolean(fact)).join(" · ");
53564
+ }
53565
+ function finishedTitle(entry) {
53566
+ if (entry.kind === "waitlisted") return entry.when ? `You’re on the waitlist for ${entry.when}` : "You’re on the waitlist";
53567
+ return entry.when ? `You’re booked: ${entry.when}` : "You’re booked";
53568
+ }
53569
+ function CheckBadge() {
53570
+ return /* @__PURE__ */ jsx("span", {
53571
+ className: "er-booking-card__badge",
53572
+ "aria-hidden": "true",
53573
+ children: /* @__PURE__ */ jsx("svg", {
53574
+ width: "22",
53575
+ height: "22",
53576
+ viewBox: "0 0 22 22",
53577
+ fill: "none",
53578
+ stroke: "currentColor",
53579
+ strokeWidth: "2.6",
53580
+ strokeLinecap: "round",
53581
+ strokeLinejoin: "round",
53582
+ children: /* @__PURE__ */ jsx("path", { d: "M5 11.5l4 4L17 7" })
53583
+ })
53584
+ });
53585
+ }
53586
+ function CardCta(props) {
53587
+ return /* @__PURE__ */ jsx(ThemedButton, {
53588
+ type: "button",
53589
+ variant: props.variant,
53590
+ size: "md",
53591
+ extraClassName: "er-booking-card__cta",
53592
+ label: props.label,
53593
+ onClick: props.onClick
53594
+ });
53595
+ }
53596
+ function SingleCard({ entry, buttonVariant, onAction }) {
53597
+ return /* @__PURE__ */ jsx("div", {
53598
+ className: "er-booking-card",
53599
+ "data-entry": "single",
53600
+ children: /* @__PURE__ */ jsxs("div", {
53601
+ className: "er-booking-card__row",
53602
+ children: [
53603
+ entry.tile ? /* @__PURE__ */ jsxs("span", {
53604
+ className: "er-booking-card__tile",
53605
+ "aria-hidden": "true",
53606
+ children: [/* @__PURE__ */ jsx("span", {
53607
+ className: "er-booking-card__tile-month",
53608
+ children: entry.tile.month
53609
+ }), /* @__PURE__ */ jsx("span", {
53610
+ className: "er-booking-card__tile-day",
53611
+ children: entry.tile.day
53612
+ })]
53613
+ }) : null,
53614
+ /* @__PURE__ */ jsxs("div", {
53615
+ className: "er-booking-card__body",
53616
+ children: [
53617
+ entry.when ? /* @__PURE__ */ jsx("p", {
53618
+ className: "er-booking-card__when",
53619
+ children: entry.when
53620
+ }) : null,
53621
+ entry.venue ? /* @__PURE__ */ jsx("p", {
53622
+ className: "er-booking-card__venue",
53623
+ children: entry.venue
53624
+ }) : null,
53625
+ /* @__PURE__ */ jsx("p", {
53626
+ className: "er-booking-card__facts",
53627
+ children: joinFacts([entry.price, entry.places])
53628
+ })
53629
+ ]
53630
+ }),
53631
+ /* @__PURE__ */ jsx(CardCta, {
53632
+ label: entry.action,
53633
+ variant: buttonVariant,
53634
+ onClick: onAction
53635
+ })
53636
+ ]
53637
+ })
53638
+ });
53639
+ }
53640
+ function ChooseDateCard({ entry, buttonVariant, onAction, onChooseDate }) {
53641
+ return /* @__PURE__ */ jsxs("div", {
53642
+ className: "er-booking-card",
53643
+ "data-entry": "choose-date",
53644
+ children: [/* @__PURE__ */ jsxs("div", {
53645
+ className: "er-booking-card__row",
53646
+ children: [/* @__PURE__ */ jsxs("div", {
53647
+ className: "er-booking-card__body",
53648
+ children: [/* @__PURE__ */ jsx("p", {
53649
+ className: "er-booking-card__when",
53650
+ children: joinFacts([entry.schedule, entry.venue])
53651
+ }), /* @__PURE__ */ jsx("p", {
53652
+ className: "er-booking-card__facts",
53653
+ children: joinFacts([entry.price])
53654
+ })]
53655
+ }), /* @__PURE__ */ jsx(CardCta, {
53656
+ label: entry.action,
53657
+ variant: buttonVariant,
53658
+ onClick: onAction
53659
+ })]
53660
+ }), /* @__PURE__ */ jsxs("div", {
53661
+ className: "er-booking-card__dates",
53662
+ children: [
53663
+ /* @__PURE__ */ jsx("span", {
53664
+ className: "er-booking-card__dates-label",
53665
+ children: "Next dates"
53666
+ }),
53667
+ entry.dates.map((date) => /* @__PURE__ */ jsx("button", {
53668
+ type: "button",
53669
+ className: "er-booking-card__date",
53670
+ "data-full": date.full ? "true" : void 0,
53671
+ onClick: onChooseDate ? () => onChooseDate(date.selectionId) : void 0,
53672
+ children: joinFacts([date.label, date.places])
53673
+ }, date.selectionId)),
53674
+ entry.moreCount > 0 ? /* @__PURE__ */ jsxs("span", {
53675
+ className: "er-booking-card__more",
53676
+ children: [
53677
+ "+ ",
53678
+ entry.moreCount,
53679
+ " more"
53680
+ ]
53681
+ }) : null
53682
+ ]
53683
+ })]
53684
+ });
53685
+ }
53686
+ function ChooseEventCard({ entry, buttonVariant, onAction }) {
53687
+ return /* @__PURE__ */ jsx("div", {
53688
+ className: "er-booking-card",
53689
+ "data-entry": "choose-event",
53690
+ children: /* @__PURE__ */ jsxs("div", {
53691
+ className: "er-booking-card__row",
53692
+ children: [/* @__PURE__ */ jsx("div", {
53693
+ className: "er-booking-card__body",
53694
+ children: /* @__PURE__ */ jsx("p", {
53695
+ className: "er-booking-card__when",
53696
+ children: `${entry.count} ${entry.noun}`
53697
+ })
53698
+ }), /* @__PURE__ */ jsx(CardCta, {
53699
+ label: entry.action,
53700
+ variant: buttonVariant,
53701
+ onClick: onAction
53702
+ })]
53703
+ })
53704
+ });
53705
+ }
53706
+ function FinishedCard({ entry, onAction }) {
53707
+ return /* @__PURE__ */ jsx("div", {
53708
+ className: "er-booking-card",
53709
+ "data-entry": entry.kind,
53710
+ children: /* @__PURE__ */ jsxs("div", {
53711
+ className: "er-booking-card__row",
53712
+ children: [
53713
+ /* @__PURE__ */ jsx(CheckBadge, {}),
53714
+ /* @__PURE__ */ jsxs("div", {
53715
+ className: "er-booking-card__body",
53716
+ children: [/* @__PURE__ */ jsx("p", {
53717
+ className: "er-booking-card__when",
53718
+ children: finishedTitle(entry)
53719
+ }), entry.kind === "booked" && entry.places ? /* @__PURE__ */ jsx("p", {
53720
+ className: "er-booking-card__facts",
53721
+ children: entry.places
53722
+ }) : null]
53723
+ }),
53724
+ /* @__PURE__ */ jsx(CardCta, {
53725
+ label: entry.action,
53726
+ variant: "outline",
53727
+ onClick: onAction
53728
+ })
53729
+ ]
53730
+ })
53731
+ });
53732
+ }
53733
+ function BookingEntryCard(props) {
53734
+ const { entry, ...rest } = props;
53735
+ switch (entry.kind) {
53736
+ case "single": return /* @__PURE__ */ jsx(SingleCard, {
53737
+ entry,
53738
+ ...rest
53739
+ });
53740
+ case "chooseDate": return /* @__PURE__ */ jsx(ChooseDateCard, {
53741
+ entry,
53742
+ ...rest
53743
+ });
53744
+ case "chooseEvent": return /* @__PURE__ */ jsx(ChooseEventCard, {
53745
+ entry,
53746
+ ...rest
53747
+ });
53748
+ case "inProgress": return null;
53749
+ case "booked":
53750
+ case "waitlisted": return /* @__PURE__ */ jsx(FinishedCard, {
53751
+ entry,
53752
+ ...rest
53753
+ });
53754
+ default: return assertNever$3(entry);
53755
+ }
53756
+ }
53757
+ //#endregion
53758
+ //#region ../blocks/src/system/runtime/nodes/event-registration/StepIndicator.tsx
53759
+ /**
53760
+ * Step indicator component for the event registration wizard.
53761
+ * Thin wrapper around the shared StepIndicator: styled by the shared
53762
+ * registration-surface classes, with 'er'-prefixed classes kept in the
53763
+ * markup as the stable hook surface for per-site theme CSS.
53764
+ */
53765
+ function StepIndicator(props) {
53766
+ return /* @__PURE__ */ jsx(StepIndicator$1, {
53767
+ ...props,
53768
+ classPrefix: "er",
53769
+ emitSharedClasses: true
53770
+ });
52860
53771
  }
53772
+ //#endregion
53773
+ //#region ../blocks/src/system/runtime/nodes/event-registration.server.tsx
52861
53774
  /**
52862
53775
  * Server-safe placeholder for event registration.
52863
53776
  * Provides a static container for island hydration without importing client hooks.
@@ -52879,7 +53792,13 @@ function EventRegistrationSSR({ blockId, subject, loaderFailures, children, ...s
52879
53792
  ...getIslandRootProps("event-registration", blockId),
52880
53793
  children: [
52881
53794
  /* @__PURE__ */ jsx(IslandPropsScript, { value: islandProps }),
52882
- /* @__PURE__ */ jsx(EventRegistrationShell, { display }),
53795
+ display.state === "booking-card" ? /* @__PURE__ */ jsx("div", {
53796
+ id: EVENT_REGISTRATION_ANCHOR_ID,
53797
+ children: /* @__PURE__ */ jsx(BookingEntryCard, {
53798
+ entry: display.entry,
53799
+ buttonVariant: display.buttonVariant ?? "primary"
53800
+ })
53801
+ }) : /* @__PURE__ */ jsx(EventRegistrationShell, { display }),
52883
53802
  children
52884
53803
  ]
52885
53804
  });
@@ -52899,27 +53818,12 @@ function EventRegistrationShell({ display }) {
52899
53818
  children: [/* @__PURE__ */ jsxs("div", {
52900
53819
  className: "er-payment-layout-main",
52901
53820
  children: [/* @__PURE__ */ jsx("div", {
52902
- className: "rb-steps-nav er-steps-nav er-registration-shell__steps",
53821
+ className: "er-registration-shell__steps",
52903
53822
  "aria-hidden": "true",
52904
- children: /* @__PURE__ */ jsx("ol", {
52905
- className: "rb-steps er-steps",
52906
- children: display.stepLabels.map((label, index) => {
52907
- const isActive = index === 0;
52908
- return /* @__PURE__ */ jsxs("li", {
52909
- className: "rb-step er-step",
52910
- children: [
52911
- /* @__PURE__ */ jsx("span", {
52912
- className: cx("rb-step-circle er-step-circle", isActive && "rb-step-circle--active er-step-circle--active"),
52913
- children: index + 1
52914
- }),
52915
- /* @__PURE__ */ jsx("span", {
52916
- className: cx("rb-step-label er-step-label", isActive && "rb-step-label--active er-step-label--active"),
52917
- children: label
52918
- }),
52919
- index < display.stepLabels.length - 1 ? /* @__PURE__ */ jsx("span", { className: "rb-step-connector er-step-connector" }) : null
52920
- ]
52921
- }, label);
52922
- })
53823
+ children: /* @__PURE__ */ jsx(StepIndicator, {
53824
+ currentStep: 1,
53825
+ totalSteps: display.stepLabels.length,
53826
+ stepLabels: [...display.stepLabels]
52923
53827
  })
52924
53828
  }), /* @__PURE__ */ jsxs("div", {
52925
53829
  className: "rb-reg-stack er-stack",
@@ -54851,7 +55755,7 @@ const opaquePanels = [
54851
55755
  }
54852
55756
  },
54853
55757
  {
54854
- selector: ":where([data-block='event-registration']) .er-booking-teaser",
55758
+ selector: ":where([data-block='event-registration']) .er-booking-card",
54855
55759
  paint: {
54856
55760
  kind: "solid",
54857
55761
  token: "surface"
@@ -54861,7 +55765,7 @@ const opaquePanels = [
54861
55765
  selector: ":where([data-block='event-registration']) .er-booking-bar",
54862
55766
  paint: {
54863
55767
  kind: "solid",
54864
- token: "background"
55768
+ token: "surface"
54865
55769
  }
54866
55770
  },
54867
55771
  {
@@ -54875,7 +55779,7 @@ const opaquePanels = [
54875
55779
  selector: ":where([data-block='event-registration']) .er-booking-overlay__panel",
54876
55780
  paint: {
54877
55781
  kind: "solid",
54878
- token: "background"
55782
+ token: "surface"
54879
55783
  }
54880
55784
  },
54881
55785
  {
@@ -56032,25 +56936,25 @@ ${root} .alert {
56032
56936
 
56033
56937
  ${root} .alert-error {
56034
56938
  border-color: rgb(var(--tb-destructive));
56035
- background-color: rgba(var(--tb-destructive), 0.1);
56939
+ background-color: rgb(var(--tb-destructive) / 0.1);
56036
56940
  color: rgb(var(--tb-destructive));
56037
56941
  }
56038
56942
 
56039
56943
  ${root} .alert-success {
56040
56944
  border-color: rgb(var(--tb-success));
56041
- background-color: rgba(var(--tb-success), 0.1);
56945
+ background-color: rgb(var(--tb-success) / 0.1);
56042
56946
  color: rgb(var(--tb-success));
56043
56947
  }
56044
56948
 
56045
56949
  ${root} .alert-warning {
56046
56950
  border-color: rgb(var(--tb-warning));
56047
- background-color: rgba(var(--tb-warning), 0.1);
56951
+ background-color: rgb(var(--tb-warning) / 0.1);
56048
56952
  color: rgb(var(--tb-warning));
56049
56953
  }
56050
56954
 
56051
56955
  ${root} .alert-info {
56052
56956
  border-color: rgb(var(--tb-info));
56053
- background-color: rgba(var(--tb-info), 0.1);
56957
+ background-color: rgb(var(--tb-info) / 0.1);
56054
56958
  color: rgb(var(--tb-info));
56055
56959
  }`);
56056
56960
  cssBlocks.push(`/* Field-note feedback treatment */
@@ -56164,7 +57068,7 @@ ${root} .step-dot-active {
56164
57068
  }
56165
57069
 
56166
57070
  ${root} .step-dot-complete {
56167
- background-color: rgba(var(--tb-primary), 0.6);
57071
+ background-color: rgb(var(--tb-primary) / 0.6);
56168
57072
  }`);
56169
57073
  cssBlocks.push(`/* Step circles (numbered) */
56170
57074
  ${root} .step-circle {
@@ -56187,7 +57091,7 @@ ${root} .step-circle-active {
56187
57091
  }
56188
57092
 
56189
57093
  ${root} .step-circle-complete {
56190
- background-color: rgba(var(--tb-primary), 0.6);
57094
+ background-color: rgb(var(--tb-primary) / 0.6);
56191
57095
  color: rgb(var(--tb-primaryForeground));
56192
57096
  }`);
56193
57097
  cssBlocks.push(`/* Step connector */
@@ -56369,62 +57273,52 @@ ${`:where([data-theme-scope="${themeId}"]) :where([data-block="event-registratio
56369
57273
  --er-control-bg: rgb(var(--tb-background, var(--tb-surface)));
56370
57274
  --er-control-text: rgb(var(--tb-foreground, var(--tb-text)));
56371
57275
  --er-radius: var(--rb-block-radius);
56372
- --er-surface-muted: rgba(var(--tb-muted, 241 245 249), 0.42);
56373
- --er-shell-line: rgba(var(--tb-mutedText, 100 116 139), 0.22);
57276
+ --er-surface-muted: rgb(var(--tb-muted, 241 245 249) / 0.42);
57277
+ --er-shell-line: rgb(var(--tb-mutedText, 100 116 139) / 0.22);
56374
57278
 
56375
57279
  /* Step indicator */
56376
57280
  --er-step-active: rgb(var(--tb-primary));
56377
- --er-step-inactive: rgb(var(--tb-mutedText));
56378
- --er-step-completed: rgb(var(--tb-success));
56379
- --er-step-text: rgb(255 255 255);
56380
- --er-step-text-active: rgb(var(--tb-onPrimary, 255 255 255));
56381
- --er-step-connector: rgba(var(--tb-border), 0.5);
56382
57281
 
56383
57282
  /* Step title */
56384
- --er-step-title-size: 1.5rem;
57283
+ --er-step-title-size: 1.75rem;
56385
57284
 
56386
57285
  /* State backgrounds with alpha */
56387
- --er-success-bg: rgba(var(--tb-success), 0.1);
56388
- --er-success-text: rgb(var(--tb-success));
56389
- --er-info-bg: rgba(var(--tb-primary), 0.1);
57286
+ --er-info-bg: rgb(var(--tb-primary) / 0.1);
56390
57287
  --er-info-text: rgb(var(--tb-primary));
56391
- --er-error-bg: rgba(var(--tb-destructive, 239 68 68), 0.1);
57288
+ --er-error-bg: rgb(var(--tb-destructive, 239 68 68) / 0.1);
56392
57289
  --er-error-text: rgb(var(--tb-destructive, 239 68 68));
56393
- --er-waitlist-bg: rgba(var(--tb-warning), 0.1);
57290
+ --er-waitlist-bg: rgb(var(--tb-warning) / 0.1);
56394
57291
  --er-waitlist-text: rgb(var(--tb-warning));
56395
57292
 
56396
57293
  /* Capacity badges */
56397
- --er-capacity-available-bg: rgba(var(--tb-success), 0.1);
57294
+ --er-capacity-available-bg: rgb(var(--tb-success) / 0.1);
56398
57295
  --er-capacity-available-text: rgb(var(--tb-success));
56399
- --er-capacity-low-bg: rgba(var(--tb-warning), 0.1);
57296
+ --er-capacity-low-bg: rgb(var(--tb-warning) / 0.1);
56400
57297
  --er-capacity-low-text: rgb(var(--tb-warning));
56401
- --er-capacity-soldout-bg: rgba(var(--tb-destructive, 239 68 68), 0.1);
57298
+ --er-capacity-soldout-bg: rgb(var(--tb-destructive, 239 68 68) / 0.1);
56402
57299
  --er-capacity-soldout-text: rgb(var(--tb-destructive, 239 68 68));
56403
57300
 
56404
57301
  /* Borders */
56405
57302
  --er-border: rgb(var(--tb-border));
56406
- --er-border-hover: rgba(var(--tb-primary), 0.5);
57303
+ --er-border-hover: rgb(var(--tb-primary) / 0.5);
56407
57304
  --er-border-selected: rgb(var(--tb-primary));
56408
57305
  --er-border-error: rgb(var(--tb-destructive, 239 68 68));
56409
57306
 
56410
57307
  /* Input focus */
56411
- --er-focus-ring: rgba(var(--tb-primary), 0.3);
56412
-
56413
- /* Required marker */
56414
- --er-required: rgb(var(--tb-destructive, 239 68 68));
57308
+ --er-focus-ring: rgb(var(--tb-primary) / 0.3);
56415
57309
 
56416
57310
  /* Payment option cards */
56417
57311
  --er-payment-border: rgb(var(--tb-border));
56418
- --er-payment-border-hover: rgba(var(--tb-primary), 0.5);
57312
+ --er-payment-border-hover: rgb(var(--tb-primary) / 0.5);
56419
57313
  --er-payment-border-selected: rgb(var(--tb-primary));
56420
- --er-payment-bg-selected: rgba(var(--tb-primary), 0.08);
57314
+ --er-payment-bg-selected: rgb(var(--tb-primary) / 0.08);
56421
57315
 
56422
57316
  /* Checkmark indicator */
56423
57317
  --er-check-bg: rgb(var(--tb-primary));
56424
57318
  --er-check-text: rgb(var(--tb-onPrimary, 255 255 255));
56425
57319
 
56426
57320
  /* Order summary */
56427
- --er-summary-bg: rgba(var(--tb-primary), 0.1);
57321
+ --er-summary-bg: rgb(var(--tb-primary) / 0.1);
56428
57322
  --er-summary-border: rgb(var(--tb-border));
56429
57323
 
56430
57324
  /* Shared registration-surface mappings (issue 1174).
@@ -56436,7 +57330,7 @@ ${`:where([data-theme-scope="${themeId}"]) :where([data-block="event-registratio
56436
57330
  --rb-reg-border-selected: var(--er-border-selected);
56437
57331
  --rb-reg-bg-selected: var(--er-payment-bg-selected);
56438
57332
  --rb-reg-option-bg: var(--er-control-bg);
56439
- --rb-reg-option-hover-shadow: 0 8px 18px rgba(var(--tb-shadow, 15 23 42), 0.08);
57333
+ --rb-reg-option-hover-shadow: 0 8px 18px rgb(var(--tb-shadow, 15 23 42) / 0.08);
56440
57334
  --rb-reg-surface-bg: rgb(var(--tb-surface));
56441
57335
  --rb-reg-on-surface: var(--er-on-surface);
56442
57336
  --rb-reg-on-surface-muted: var(--er-on-surface-muted);
@@ -56445,11 +57339,6 @@ ${`:where([data-theme-scope="${themeId}"]) :where([data-block="event-registratio
56445
57339
  --rb-reg-check-bg: var(--er-check-bg);
56446
57340
  --rb-reg-check-text: var(--er-check-text);
56447
57341
  --rb-reg-step-active: var(--er-step-active);
56448
- --rb-reg-step-completed: var(--er-step-completed);
56449
- --rb-reg-step-inactive: var(--er-step-inactive);
56450
- --rb-reg-step-text: var(--er-step-text);
56451
- --rb-reg-step-text-active: var(--er-step-text-active);
56452
- --rb-reg-step-connector: var(--er-step-connector);
56453
57342
  --rb-reg-summary-bg: var(--er-surface-muted);
56454
57343
  --rb-reg-summary-border: var(--er-border);
56455
57344
  --rb-reg-focus-ring: var(--er-focus-ring);
@@ -56496,13 +57385,13 @@ function generateEventCalendarVars({ themeId }) {
56496
57385
  return `
56497
57386
  ${`:where([data-theme-scope="${themeId}"]) :where([data-block="event-calendar"])`} {
56498
57387
  /* Day cell states */
56499
- --ec-today-bg: rgba(var(--tb-primary), 0.05);
57388
+ --ec-today-bg: rgb(var(--tb-primary) / 0.05);
56500
57389
  --ec-today-text: rgb(var(--tb-primary));
56501
57390
  --ec-other-month-opacity: 0.4;
56502
57391
 
56503
57392
  /* Event items - subtle style (legacy) */
56504
- --ec-event-bg: rgba(var(--tb-primary), 0.1);
56505
- --ec-event-hover-bg: rgba(var(--tb-primary), 0.2);
57393
+ --ec-event-bg: rgb(var(--tb-primary) / 0.1);
57394
+ --ec-event-hover-bg: rgb(var(--tb-primary) / 0.2);
56506
57395
 
56507
57396
  /* Event items - solid style (default) */
56508
57397
  --ec-event-solid-bg: rgb(var(--tb-primary));
@@ -56510,15 +57399,15 @@ ${`:where([data-theme-scope="${themeId}"]) :where([data-block="event-calendar"])
56510
57399
  --ec-event-solid-text: rgb(var(--tb-neutral-50, 255 255 255));
56511
57400
 
56512
57401
  /* Navigation */
56513
- --ec-nav-hover-bg: rgba(var(--tb-text), 0.1);
57402
+ --ec-nav-hover-bg: rgb(var(--tb-text) / 0.1);
56514
57403
 
56515
57404
  /* Day headers */
56516
- --ec-header-bg: rgba(var(--tb-text), 0.05);
57405
+ --ec-header-bg: rgb(var(--tb-text) / 0.05);
56517
57406
  --ec-header-opacity: 0.7;
56518
57407
 
56519
57408
  /* Borders */
56520
57409
  --ec-border: rgb(var(--tb-border));
56521
- --ec-border-subtle: rgba(var(--tb-border), 0.5);
57410
+ --ec-border-subtle: rgb(var(--tb-border) / 0.5);
56522
57411
 
56523
57412
  /* Surface and text (for inputs/dropdowns) */
56524
57413
  --ec-surface: rgb(var(--tb-surface));
@@ -56587,29 +57476,27 @@ function generateAppointmentBookingVars({ themeId }) {
56587
57476
  ${`:where([data-theme-scope="${themeId}"]) :where([data-block="appointment-booking"])`} {
56588
57477
  /* Selection cards (service/resource/time) */
56589
57478
  --ab-card-border: rgb(var(--tb-border));
56590
- --ab-card-border-hover: rgba(var(--tb-primary), 0.5);
57479
+ --ab-card-border-hover: rgb(var(--tb-primary) / 0.5);
56591
57480
  --ab-card-border-selected: rgb(var(--tb-primary));
56592
- --ab-card-bg-selected: rgba(var(--tb-primary), 0.05);
57481
+ --ab-card-bg-selected: rgb(var(--tb-primary) / 0.05);
56593
57482
 
56594
57483
  /* Checkmark indicator */
56595
57484
  --ab-check-bg: rgb(var(--tb-primary));
56596
57485
  --ab-check-text: rgb(var(--tb-background));
56597
57486
 
56598
57487
  /* State backgrounds */
56599
- --ab-success-bg: rgba(var(--tb-success), 0.1);
56600
- --ab-success-text: rgb(var(--tb-success));
56601
- --ab-error-bg: rgba(var(--tb-destructive), 0.1);
57488
+ --ab-error-bg: rgb(var(--tb-destructive) / 0.1);
56602
57489
  --ab-error-text: rgb(var(--tb-destructive));
56603
- --ab-warning-bg: rgba(var(--tb-warning), 0.1);
57490
+ --ab-warning-bg: rgb(var(--tb-warning) / 0.1);
56604
57491
  --ab-warning-text: rgb(var(--tb-warning));
56605
- --ab-info-bg: rgba(var(--tb-info), 0.1);
57492
+ --ab-info-bg: rgb(var(--tb-info) / 0.1);
56606
57493
  --ab-info-text: rgb(var(--tb-info));
56607
57494
 
56608
57495
  /* Muted summary state */
56609
- --ab-muted-bg: rgba(var(--tb-text), 0.05);
57496
+ --ab-muted-bg: rgb(var(--tb-text) / 0.05);
56610
57497
 
56611
57498
  /* Focus ring used by shared registration-surface controls */
56612
- --ab-input-focus-ring: rgba(var(--tb-primary), 0.3);
57499
+ --ab-input-focus-ring: rgb(var(--tb-primary) / 0.3);
56613
57500
 
56614
57501
  /* Shared registration-surface mappings (issue 1174).
56615
57502
  Route the shared --rb-reg-* contract through this block's Tier 3 vars
@@ -56621,24 +57508,19 @@ ${`:where([data-theme-scope="${themeId}"]) :where([data-block="appointment-booki
56621
57508
  --rb-reg-border-selected: var(--ab-card-border-selected);
56622
57509
  --rb-reg-bg-selected: var(--ab-card-bg-selected);
56623
57510
  --rb-reg-option-bg: transparent;
56624
- --rb-reg-option-hover-shadow: 0 8px 18px rgba(var(--tb-shadow, 15 23 42), 0.08);
57511
+ --rb-reg-option-hover-shadow: 0 8px 18px rgb(var(--tb-shadow, 15 23 42) / 0.08);
56625
57512
  --rb-reg-surface-bg: rgb(var(--tb-surface));
56626
57513
  --rb-reg-on-surface: rgb(var(--tb-onSurface, var(--tb-text)));
56627
- --rb-reg-on-surface-muted: rgba(var(--tb-onSurface, var(--tb-text)), 0.7);
56628
- --rb-reg-on-surface-subtle: rgba(var(--tb-onSurface, var(--tb-text)), 0.6);
56629
- --rb-reg-on-surface-faint: rgba(var(--tb-onSurface, var(--tb-text)), 0.5);
57514
+ --rb-reg-on-surface-muted: rgb(var(--tb-onSurface, var(--tb-text)) / 0.7);
57515
+ --rb-reg-on-surface-subtle: rgb(var(--tb-onSurface, var(--tb-text)) / 0.6);
57516
+ --rb-reg-on-surface-faint: rgb(var(--tb-onSurface, var(--tb-text)) / 0.5);
56630
57517
  --rb-reg-check-bg: var(--ab-check-bg);
56631
57518
  --rb-reg-check-text: var(--ab-check-text);
56632
57519
  --rb-reg-step-active: rgb(var(--tb-primary));
56633
- --rb-reg-step-completed: rgb(var(--tb-success));
56634
- --rb-reg-step-inactive: rgb(var(--tb-mutedText));
56635
- --rb-reg-step-text: rgb(255 255 255);
56636
- --rb-reg-step-text-active: rgb(var(--tb-onPrimary, 255 255 255));
56637
- --rb-reg-step-connector: rgba(var(--tb-border), 0.5);
56638
57520
  --rb-reg-summary-bg: var(--ab-muted-bg);
56639
57521
  --rb-reg-summary-border: var(--ab-card-border);
56640
57522
  --rb-reg-focus-ring: var(--ab-input-focus-ring);
56641
- --rb-reg-shell-line: rgba(var(--tb-mutedText, 100 116 139), 0.22);
57523
+ --rb-reg-shell-line: rgb(var(--tb-mutedText, 100 116 139) / 0.22);
56642
57524
  }
56643
57525
  `;
56644
57526
  }
@@ -56657,14 +57539,14 @@ function generateFormBlockVars({ themeId }) {
56657
57539
  return `
56658
57540
  ${`:where([data-theme-scope="${themeId}"]) :where([data-block="form"])`} {
56659
57541
  /* Success state */
56660
- --fb-success-bg: rgba(var(--tb-success), 0.1);
57542
+ --fb-success-bg: rgb(var(--tb-success) / 0.1);
56661
57543
  --fb-success-text: rgb(var(--tb-success));
56662
- --fb-success-border: rgba(var(--tb-success), 0.3);
57544
+ --fb-success-border: rgb(var(--tb-success) / 0.3);
56663
57545
 
56664
57546
  /* Error state */
56665
- --fb-error-bg: rgba(var(--tb-destructive), 0.1);
57547
+ --fb-error-bg: rgb(var(--tb-destructive) / 0.1);
56666
57548
  --fb-error-text: rgb(var(--tb-destructive));
56667
- --fb-error-border: rgba(var(--tb-destructive), 0.3);
57549
+ --fb-error-border: rgb(var(--tb-destructive) / 0.3);
56668
57550
 
56669
57551
  /* Empty state */
56670
57552
  --fb-empty-bg: rgb(var(--tb-surface));
@@ -56725,23 +57607,23 @@ ${`:where([data-theme-scope="${themeId}"]) :where([data-block="customer-portal"]
56725
57607
  --rb-tab-opacity: 0.7;
56726
57608
 
56727
57609
  /* Badge - Success (active, confirmed) */
56728
- --cp-badge-success-bg: rgba(var(--tb-success), 0.1);
57610
+ --cp-badge-success-bg: rgb(var(--tb-success) / 0.1);
56729
57611
  --cp-badge-success-text: rgb(var(--tb-success));
56730
57612
 
56731
57613
  /* Badge - Warning (paused, low credits, waitlist) */
56732
- --cp-badge-warning-bg: rgba(var(--tb-warning), 0.1);
57614
+ --cp-badge-warning-bg: rgb(var(--tb-warning) / 0.1);
56733
57615
  --cp-badge-warning-text: rgb(var(--tb-warning));
56734
57616
 
56735
57617
  /* Badge - Error (canceled, expired, past_due) */
56736
- --cp-badge-error-bg: rgba(var(--tb-destructive), 0.1);
57618
+ --cp-badge-error-bg: rgb(var(--tb-destructive) / 0.1);
56737
57619
  --cp-badge-error-text: rgb(var(--tb-destructive));
56738
57620
 
56739
57621
  /* Badge - Info (trialing, scheduled) */
56740
- --cp-badge-info-bg: rgba(var(--tb-primary), 0.1);
57622
+ --cp-badge-info-bg: rgb(var(--tb-primary) / 0.1);
56741
57623
  --cp-badge-info-text: rgb(var(--tb-primary));
56742
57624
 
56743
57625
  /* Badge - Default (neutral states) */
56744
- --cp-badge-default-bg: rgba(var(--tb-mutedText), 0.1);
57626
+ --cp-badge-default-bg: rgb(var(--tb-mutedText) / 0.1);
56745
57627
  --cp-badge-default-text: rgb(var(--tb-mutedText));
56746
57628
 
56747
57629
  /* Progress bar (for credit display) */
@@ -56753,10 +57635,10 @@ ${`:where([data-theme-scope="${themeId}"]) :where([data-block="customer-portal"]
56753
57635
  --cp-card-border: rgb(var(--tb-border));
56754
57636
 
56755
57637
  /* Alert/notification */
56756
- --cp-alert-success-bg: rgba(var(--tb-success), 0.1);
57638
+ --cp-alert-success-bg: rgb(var(--tb-success) / 0.1);
56757
57639
  --cp-alert-success-text: rgb(var(--tb-success));
56758
57640
  --cp-alert-success-border: rgb(var(--tb-success));
56759
- --cp-alert-error-bg: rgba(var(--tb-destructive), 0.1);
57641
+ --cp-alert-error-bg: rgb(var(--tb-destructive) / 0.1);
56760
57642
  --cp-alert-error-text: rgb(var(--tb-destructive));
56761
57643
  --cp-alert-error-border: rgb(var(--tb-destructive));
56762
57644
 
@@ -56853,7 +57735,7 @@ ${root} {
56853
57735
  --rb-testimonial-carousel-arrow-bg: rgb(var(--tb-secondary));
56854
57736
  --rb-testimonial-carousel-arrow-bg-hover: color-mix(in oklab, rgb(var(--tb-secondary)), rgb(var(--tb-text)) 14%);
56855
57737
  --rb-testimonial-carousel-arrow-color: rgb(var(--tb-onSecondary));
56856
- --rb-testimonial-carousel-arrow-border-color: rgba(var(--tb-onSecondary), 0.22);
57738
+ --rb-testimonial-carousel-arrow-border-color: rgb(var(--tb-onSecondary) / 0.22);
56857
57739
  --rb-testimonial-carousel-arrow-size: 2.75rem;
56858
57740
  --rb-testimonial-carousel-arrow-icon-size: 1.25rem;
56859
57741
  --rb-testimonial-carousel-arrow-icon-stroke-width: 2.5;
@@ -58110,7 +58992,7 @@ function pageBlockPosition(index, blockCount) {
58110
58992
  //#endregion
58111
58993
  //#region ../blocks/src/pageRendererContracts.ts
58112
58994
  function buildPageRendererRootRuntime(dataContext) {
58113
- const { siteId = null, siteName, pageId = null, pathname = null, bookingTimeZone, previewStage = "published", apiBaseUrl = null, portalToken = null, readAuthority, bookingOfferingPresets = [], appointmentServicePathPrefix = null, mailingList = { tag: "not_configured" }, eventRegistrationOverlayEnabled = false, loaderFailures = {} } = dataContext ?? {};
58995
+ const { siteId = null, siteName, pageId = null, pathname = null, bookingTimeZone, previewStage = "published", apiBaseUrl = null, portalToken = null, readAuthority, bookingOfferingPresets = [], appointmentServicePathPrefix = null, mailingList = { tag: "not_configured" }, loaderFailures = {} } = dataContext ?? {};
58114
58996
  return {
58115
58997
  siteId,
58116
58998
  demoEmailSuppressed: resolveDemoEmailSuppression(dataContext),
@@ -58125,7 +59007,6 @@ function buildPageRendererRootRuntime(dataContext) {
58125
59007
  bookingOfferingPresets,
58126
59008
  appointmentServicePathPrefix,
58127
59009
  mailingList,
58128
- eventRegistrationOverlayEnabled,
58129
59010
  loaderFailures
58130
59011
  };
58131
59012
  }
@@ -60966,6 +61847,10 @@ const contactNewsletterBlockDefinition = {
60966
61847
  ],
60967
61848
  icon: "MailPlus"
60968
61849
  }),
61850
+ contentNormalizer: {
61851
+ fieldIds: ["targeting"],
61852
+ normalize: normalizeMailingListBlockContent
61853
+ },
60969
61854
  dataSchemas: { form: formDataSchema.optional() },
60970
61855
  dataLoaders: { form: {
60971
61856
  endpoint: "getPublicFormById",
@@ -64890,7 +65775,22 @@ const offeringsPreviewEventDataSchemas = Object.fromEntries(OFFERINGS_PREVIEW_EV
64890
65775
  const offeringsPreviewEventDataLoaders = Object.fromEntries(OFFERINGS_PREVIEW_EVENT_PRESET_DEFINITIONS.map((definition) => [definition.dataKey, eventPresetLoader(definition.preset)]));
64891
65776
  const offeringsPreviewBlockDefinition = {
64892
65777
  manifest: offeringsPreviewManifest,
64893
- normalizeContent: normalizeOfferingsPreviewBlockContent,
65778
+ contentNormalizer: {
65779
+ fieldIds: [
65780
+ "displayMode",
65781
+ "heading",
65782
+ "description",
65783
+ "itemLimit",
65784
+ "groupOrder",
65785
+ "groupOverrides",
65786
+ "_cardStyles",
65787
+ "buttonVariant",
65788
+ "buttonText",
65789
+ "emptyMessage",
65790
+ "_sectionStyles"
65791
+ ],
65792
+ normalize: normalizeOfferingsPreviewBlockContent
65793
+ },
64894
65794
  dataSchemas: {
64895
65795
  ...offeringsPreviewEventDataSchemas,
64896
65796
  routeCandidates: publicRouteCandidatesSchema.optional(),
@@ -67128,7 +68028,20 @@ const locationMapBlockDefinition = {
67128
68028
  })], { gap: "md" })
67129
68029
  })
67130
68030
  }),
67131
- normalizeContent: normalizeLocationMapContent
68031
+ contentNormalizer: {
68032
+ fieldIds: [
68033
+ "heading",
68034
+ "locationSource",
68035
+ "venueId",
68036
+ "location",
68037
+ "showAddressText",
68038
+ "showDirections",
68039
+ "directionsLabel",
68040
+ "zoom",
68041
+ "heightPx"
68042
+ ],
68043
+ normalize: normalizeLocationMapContent
68044
+ }
67132
68045
  };
67133
68046
  //#endregion
67134
68047
  //#region ../blocks/src/system/blocks/index.ts
@@ -67920,6 +68833,16 @@ function ensureSystemBlockDefinitionsRegistered() {
67920
68833
  }
67921
68834
  //#endregion
67922
68835
  //#region ../blocks/src/system/registry.ts
68836
+ function normalizeBlockContent(definition, content) {
68837
+ const normalizer = definition?.contentNormalizer;
68838
+ if (!normalizer || !isRecord$13(content)) return content;
68839
+ const normalized = normalizer.normalize(content);
68840
+ const owned = new Set(normalizer.fieldIds);
68841
+ return {
68842
+ ...Object.fromEntries(Object.entries(content).filter(([key]) => !owned.has(key))),
68843
+ ...Object.fromEntries(Object.entries(normalized).filter(([key]) => owned.has(key)))
68844
+ };
68845
+ }
67923
68846
  const REGISTRY_SYMBOL = Symbol.for("@riverbankcms/blocks/system/definitions");
67924
68847
  const isBlocksTestRuntime = typeof process !== "undefined" && typeof process.env !== "undefined" && process.env.RIVERBANK_BLOCKS_TEST === "1";
67925
68848
  const globalScope = globalThis;
@@ -68893,7 +69816,7 @@ function planNewsletterBlockSubmission(placement) {
68893
69816
  function planNewsletterPreviewSubmission(placement) {
68894
69817
  if (!placement.publishedContentId) return { tag: "unpublished-form" };
68895
69818
  if (!placement.publishedContent) return { tag: "unpublished-settings" };
68896
- const draft = parseMailingListPlacementTargeting(placement.renderedContent.targeting ?? { mode: "default" });
69819
+ const draft = parseMailingListPlacementTargeting(placement.renderedContent.targeting);
68897
69820
  const published = parseMailingListPlacementTargeting(placement.publishedContent.targeting);
68898
69821
  if (!draft.ok || !published.ok || !sameMailingListPlacementTargeting(draft.value, published.value)) return { tag: "unpublished-settings" };
68899
69822
  const sourceRef = buildMailingListSignupBlockSourceRef(placement.blockId, placement.publishedContentId);
@@ -69013,7 +69936,8 @@ function preparedBlockProps(entry, content, data, input) {
69013
69936
  block: entry.block,
69014
69937
  themeResources: input.themeResources,
69015
69938
  dataContext: input.dataContext,
69016
- imageResolveContext: input.imageResolveContext
69939
+ imageResolveContext: input.imageResolveContext,
69940
+ routeMap: input.routeMap
69017
69941
  }),
69018
69942
  bookingTimeZone: input.dataContext?.bookingTimeZone
69019
69943
  };
@@ -69033,6 +69957,12 @@ function buildBlockOverrideProps(input) {
69033
69957
  ...blockSessionProps(dataContext),
69034
69958
  ...blockSubjectProps(dataContext),
69035
69959
  imageResolveContext: input.imageResolveContext,
69960
+ linkResolveContext: {
69961
+ routes: input.routeMap ?? dataContext?.routes,
69962
+ pagesByIdentifier: dataContext?.pagesByIdentifier,
69963
+ entriesByIdentifier: dataContext?.entriesByIdentifier,
69964
+ stage: dataContext?.previewStage
69965
+ },
69036
69966
  blockId: block.id ?? null,
69037
69967
  contentVersionId: block.contentVersionId ?? null,
69038
69968
  ...newsletterBlockProps(block, input.content, dataContext?.previewStage),
@@ -69089,7 +70019,7 @@ function arrangementResolvedData(kind, content, data) {
69089
70019
  function arrangementResolvedContent(kind, content, data, context) {
69090
70020
  if (content._effectiveLook === void 0 || !data || kind !== "block.offerings-preview" && kind !== "block.appointment-services") return content;
69091
70021
  if (kind === "block.appointment-services") return appointmentArrangementContent(content, data, context);
69092
- const normalized = offeringsPreviewBlockDefinition.normalizeContent?.(content);
70022
+ const normalized = normalizeBlockContent(offeringsPreviewBlockDefinition, content);
69093
70023
  return withCardListPhotoCount(content, content.showPhotos === false ? 0 : offeringsPreviewPhotoCount({
69094
70024
  ...normalized,
69095
70025
  presets: context?.bookingOfferingPresets,
@@ -69506,13 +70436,11 @@ function renderSystemBlockElement(input) {
69506
70436
  * referential equality of all props that affect rendering. Standard React.memo
69507
70437
  * wouldn't catch all the render triggers from the editor store.
69508
70438
  */
69509
- const MemoBlockSection = React$1.memo(function MemoBlockSection({ themeResources, entry: preparedEntry, audience, dataContext, registry, wrapBlock, imageResolveContext, previewAuthoring }) {
69510
- const entry = preparedEntry.entry;
69511
- const prepared = preparedEntry.prepared;
70439
+ const MemoBlockSection = React$1.memo(function MemoBlockSection({ themeResources, entry: preparedEntry, routeMap, audience, dataContext, registry, wrapBlock, imageResolveContext, previewAuthoring }) {
70440
+ const { entry, prepared } = preparedEntry;
69512
70441
  const block = entry.block;
69513
70442
  const perfStart = globalThis.process?.env?.DEBUG_PERF === "1" && typeof window === "undefined" ? Date.now() : 0;
69514
- const fallbackImageResolveContext = getCurrentResolveImageUrlContext();
69515
- const resolvedImageResolveContext = imageResolveContext ?? fallbackImageResolveContext;
70443
+ const resolvedImageResolveContext = imageResolveContext ?? getCurrentResolveImageUrlContext();
69516
70444
  function finish(node, meta) {
69517
70445
  if (!perfStart) return node;
69518
70446
  const durationMs = Date.now() - perfStart;
@@ -69552,7 +70480,8 @@ const MemoBlockSection = React$1.memo(function MemoBlockSection({ themeResources
69552
70480
  block,
69553
70481
  themeResources,
69554
70482
  dataContext,
69555
- imageResolveContext: resolvedImageResolveContext
70483
+ imageResolveContext: resolvedImageResolveContext,
70484
+ routeMap
69556
70485
  }) })), {
69557
70486
  outcome: "overrideWithoutDefinition",
69558
70487
  override: true,
@@ -70443,6 +71372,13 @@ const containerResponsiveThemeCss = `/*
70443
71372
  var(--site-overlay-opening-content-extra-pad, clamp(1rem, 2vw, 1.75rem))
70444
71373
  );
70445
71374
  }
71375
+ /* Floating site overlays (a booking bar, a cookie banner, a sticky promo)
71376
+ mark themselves [data-rb-site-overlay]. While a preview is in edit mode
71377
+ (the preview shell sets the root attribute) they step aside, out of the
71378
+ focus order too; switching back to viewing restores them as they were. */
71379
+ :root[data-rb-preview-mode="edit"] [data-rb-site-overlay] {
71380
+ display: none;
71381
+ }
70446
71382
  .rb-preview-editor-offset {
70447
71383
  padding-bottom: calc(
70448
71384
  var(--builder-editor-chrome-offset, 0px) +
@@ -71028,7 +71964,7 @@ const containerResponsiveThemeCss = `/*
71028
71964
  .rb-spinner {
71029
71965
  --rb-spinner-size: 2rem;
71030
71966
  --rb-spinner-duration: 0.9s;
71031
- --rb-spinner-track-color: rgba(var(--tb-foreground), 0.15);
71967
+ --rb-spinner-track-color: rgb(var(--tb-foreground) / 0.15);
71032
71968
 
71033
71969
  display: inline-flex;
71034
71970
  align-items: center;
@@ -71531,12 +72467,12 @@ const containerResponsiveThemeCss = `/*
71531
72467
 
71532
72468
  :where(.theme-scope) .rb-modal__close:hover {
71533
72469
  color: var(--rb-surface-text-color, rgb(var(--tb-text, 17 24 39)));
71534
- background: rgba(var(--tb-border), 0.2);
72470
+ background: rgb(var(--tb-border) / 0.2);
71535
72471
  }
71536
72472
 
71537
72473
  :where(.theme-scope) .rb-modal__close:focus-visible {
71538
72474
  outline: none;
71539
- box-shadow: 0 0 0 3px rgba(var(--tb-primary), 0.15);
72475
+ box-shadow: 0 0 0 3px rgb(var(--tb-primary) / 0.15);
71540
72476
  }
71541
72477
 
71542
72478
  :where(.theme-scope) .rb-modal__body {
@@ -72021,7 +72957,7 @@ const containerResponsiveThemeCss = `/*
72021
72957
  :where(.theme-scope) .rb-prose code {
72022
72958
  /* Inline code uses text color with surface background */
72023
72959
  color: inherit;
72024
- background-color: rgba(var(--tb-surface), 0.5);
72960
+ background-color: rgb(var(--tb-surface) / 0.5);
72025
72961
  padding: 0.125rem 0.25rem;
72026
72962
  border-radius: 0.25rem;
72027
72963
  font-size: 0.875em;
@@ -73013,17 +73949,17 @@ const containerResponsiveThemeCss = `/*
73013
73949
 
73014
73950
  /* All badges use a subtle theme-aware style by default */
73015
73951
  :where(.theme-scope) .badge-status-available {
73016
- background-color: rgba(var(--tb-secondary), 0.15);
73952
+ background-color: rgb(var(--tb-secondary) / 0.15);
73017
73953
  color: rgb(var(--tb-secondary-700, var(--tb-secondary)));
73018
73954
  }
73019
73955
 
73020
73956
  :where(.theme-scope) .badge-status-low {
73021
- background-color: rgba(var(--tb-accent), 0.15);
73957
+ background-color: rgb(var(--tb-accent) / 0.15);
73022
73958
  color: rgb(var(--tb-accent-700, var(--tb-accent)));
73023
73959
  }
73024
73960
 
73025
73961
  :where(.theme-scope) .badge-status-sold-out {
73026
- background-color: rgba(var(--tb-text), 0.1);
73962
+ background-color: rgb(var(--tb-text) / 0.1);
73027
73963
  color: rgb(var(--tb-mutedText));
73028
73964
  }
73029
73965
 
@@ -73092,7 +74028,7 @@ const containerResponsiveThemeCss = `/*
73092
74028
  * here too; block CSS provides the \`.rb-state-icon--{variant}\` colors.
73093
74029
  *
73094
74030
  * Naming: component-like primitives follow the existing bare \`rb-\` shared
73095
- * precedent (\`.rb-state-icon\`, \`.rb-tile\`): \`.rb-option-card\`, \`.rb-step-*\`,
74031
+ * precedent (\`.rb-state-icon\`, \`.rb-tile\`): \`.rb-option-card\`, \`.rb-progress*\`,
73096
74032
  * \`.rb-wizard-actions\`, \`.rb-on-surface\`, \`.rb-shell-*\`. Container/layout
73097
74033
  * pieces that would otherwise collide with the global \`.rb-*\` utility layer
73098
74034
  * are namespaced \`rb-reg-*\` (\`.rb-reg-surface\`, \`.rb-reg-stack\`, ...). All of
@@ -73115,6 +74051,13 @@ const containerResponsiveThemeCss = `/*
73115
74051
  height: 2rem;
73116
74052
  }
73117
74053
 
74054
+ /* The success tick reads as a mark inside its disc, not a line drawing */
74055
+ :where(.theme-scope) .rb-state-icon--success svg {
74056
+ width: 1.75rem;
74057
+ height: 1.75rem;
74058
+ stroke-width: 3;
74059
+ }
74060
+
73118
74061
  /* Surface container */
73119
74062
  :where(.theme-scope) :where([data-block="event-registration"], [data-block="appointment-booking"]) .rb-reg-surface {
73120
74063
  border-radius: var(--rb-reg-radius, var(--rb-block-radius, 1rem));
@@ -73151,18 +74094,18 @@ const containerResponsiveThemeCss = `/*
73151
74094
  }
73152
74095
 
73153
74096
  :where(.theme-scope) :where([data-block="event-registration"], [data-block="appointment-booking"]) .rb-option-card:hover:not(:disabled):not([aria-disabled="true"]) {
73154
- border-color: var(--rb-reg-border-hover, rgba(var(--tb-primary, 17 24 39), 0.5));
73155
- box-shadow: var(--rb-reg-option-hover-shadow, 0 8px 18px rgba(var(--tb-shadow, 15 23 42), 0.08));
74097
+ border-color: var(--rb-reg-border-hover, rgb(var(--tb-primary, 17 24 39) / 0.5));
74098
+ box-shadow: var(--rb-reg-option-hover-shadow, 0 8px 18px rgb(var(--tb-shadow, 15 23 42) / 0.08));
73156
74099
  }
73157
74100
 
73158
74101
  :where(.theme-scope) :where([data-block="event-registration"], [data-block="appointment-booking"]) .rb-option-card:focus-visible {
73159
- outline: 2px solid var(--rb-reg-focus-ring, rgba(var(--tb-primary, 17 24 39), 0.3));
74102
+ outline: 2px solid var(--rb-reg-focus-ring, rgb(var(--tb-primary, 17 24 39) / 0.3));
73160
74103
  outline-offset: 2px;
73161
74104
  }
73162
74105
 
73163
74106
  :where(.theme-scope) :where([data-block="event-registration"], [data-block="appointment-booking"]) .rb-option-card--selected {
73164
74107
  border-color: var(--rb-reg-border-selected, rgb(var(--tb-primary, 17 24 39)));
73165
- background-color: var(--rb-reg-bg-selected, rgba(var(--tb-primary, 17 24 39), 0.08));
74108
+ background-color: var(--rb-reg-bg-selected, rgb(var(--tb-primary, 17 24 39) / 0.08));
73166
74109
  box-shadow: 0 0 0 1px var(--rb-reg-border-selected, rgb(var(--tb-primary, 17 24 39)));
73167
74110
  }
73168
74111
 
@@ -73194,78 +74137,45 @@ const containerResponsiveThemeCss = `/*
73194
74137
  color: var(--rb-reg-check-text, rgb(var(--tb-onPrimary, var(--tb-primaryForeground, 255 255 255))));
73195
74138
  }
73196
74139
 
73197
- /* Step indicator */
73198
- :where(.theme-scope) :where([data-block="event-registration"], [data-block="appointment-booking"]) .rb-steps-nav {
73199
- margin-bottom: 1.5rem;
73200
- }
73201
-
73202
- :where(.theme-scope) :where([data-block="event-registration"], [data-block="appointment-booking"]) .rb-steps {
74140
+ /* Progress: the current step's label, "Step N of M" and a thin bar (issue 1581) */
74141
+ :where(.theme-scope) :where([data-block="event-registration"], [data-block="appointment-booking"]) .rb-progress {
73203
74142
  display: flex;
73204
- align-items: center;
73205
- justify-content: center;
73206
- gap: 0.5rem;
73207
- list-style: none;
73208
- padding: 0;
73209
- margin: 0;
73210
- }
73211
-
73212
- :where(.theme-scope) :where([data-block="event-registration"], [data-block="appointment-booking"]) .rb-step {
73213
- display: flex;
73214
- align-items: center;
74143
+ flex-direction: column;
73215
74144
  gap: 0.5rem;
74145
+ margin-bottom: 1.5rem;
73216
74146
  }
73217
74147
 
73218
- :where(.theme-scope) :where([data-block="event-registration"], [data-block="appointment-booking"]) .rb-step-circle {
73219
- width: 1.75rem;
73220
- height: 1.75rem;
73221
- border-radius: 50%;
74148
+ :where(.theme-scope) :where([data-block="event-registration"], [data-block="appointment-booking"]) .rb-progress__head {
73222
74149
  display: flex;
73223
- align-items: center;
73224
- justify-content: center;
73225
- font-size: 0.75rem;
73226
- font-weight: 600;
73227
- background: var(--rb-reg-step-inactive, rgb(var(--tb-mutedText, 100 116 139)));
73228
- color: var(--rb-reg-step-text, rgb(var(--tb-primaryForeground, 255 255 255)));
73229
- transition: background-color var(--rb-block-transition, 150ms) ease;
73230
- }
73231
-
73232
- :where(.theme-scope) :where([data-block="event-registration"], [data-block="appointment-booking"]) .rb-step-circle--active {
73233
- background: var(--rb-reg-step-active, rgb(var(--tb-primary, 17 24 39)));
73234
- color: var(--rb-reg-step-text-active, rgb(var(--tb-onPrimary, var(--tb-primaryForeground, 255 255 255))));
73235
- }
73236
-
73237
- :where(.theme-scope) :where([data-block="event-registration"], [data-block="appointment-booking"]) .rb-step-circle--completed {
73238
- background: var(--rb-reg-step-completed, rgb(var(--tb-success, 22 163 74)));
73239
- color: var(--rb-reg-step-text-active, rgb(var(--tb-onPrimary, var(--tb-primaryForeground, 255 255 255))));
73240
- }
73241
-
73242
- :where(.theme-scope) :where([data-block="event-registration"], [data-block="appointment-booking"]) .rb-step-check {
73243
- width: 0.75rem;
73244
- height: 0.75rem;
73245
- }
73246
-
73247
- :where(.theme-scope) :where([data-block="event-registration"], [data-block="appointment-booking"]) .rb-step-connector {
73248
- width: 2rem;
73249
- height: 2px;
73250
- background: var(--rb-reg-step-connector, rgba(var(--tb-border, 226 232 240), 0.5));
74150
+ align-items: baseline;
74151
+ justify-content: space-between;
74152
+ gap: 1rem;
74153
+ font-size: 0.8125rem;
74154
+ line-height: 1.3;
73251
74155
  }
73252
74156
 
73253
- :where(.theme-scope) :where([data-block="event-registration"], [data-block="appointment-booking"]) .rb-step-label {
73254
- font-size: 0.75rem;
74157
+ :where(.theme-scope) :where([data-block="event-registration"], [data-block="appointment-booking"]) .rb-progress__label {
74158
+ font-weight: 700;
73255
74159
  color: var(--rb-reg-on-surface, rgb(var(--tb-onSurface, var(--tb-text, 15 23 42))));
73256
- display: none;
73257
74160
  }
73258
74161
 
73259
- :where(.theme-scope) :where([data-block="event-registration"], [data-block="appointment-booking"]) .rb-step-label--active {
73260
- font-weight: 500;
74162
+ :where(.theme-scope) :where([data-block="event-registration"], [data-block="appointment-booking"]) .rb-progress__count {
74163
+ margin-inline-start: auto;
74164
+ color: var(--rb-reg-on-surface-muted, rgb(var(--tb-onSurface, var(--tb-text, 15 23 42)) / 0.7));
73261
74165
  }
73262
74166
 
73263
- @container rb-site (min-width: 640px) {
73264
- @scope ([data-rb-responsive-mode="container"]) to (:scope [data-rb-responsive-mode]) {
73265
- :where(.theme-scope:is(*, :scope)) :where([data-block="event-registration"], [data-block="appointment-booking"]) .rb-step-label {
73266
- display: inline;
73267
- }
74167
+ :where(.theme-scope) :where([data-block="event-registration"], [data-block="appointment-booking"]) .rb-progress__track {
74168
+ height: 4px;
74169
+ border-radius: 4px;
74170
+ background: rgb(var(--tb-onSurface, var(--tb-text, 15 23 42)) / 0.12);
74171
+ overflow: hidden;
73268
74172
  }
74173
+
74174
+ :where(.theme-scope) :where([data-block="event-registration"], [data-block="appointment-booking"]) .rb-progress__fill {
74175
+ height: 100%;
74176
+ border-radius: 4px;
74177
+ background: var(--rb-reg-step-active, rgb(var(--tb-primary, 17 24 39)));
74178
+ transition: width var(--rb-block-transition, 150ms) ease;
73269
74179
  }
73270
74180
 
73271
74181
  /* Wizard actions row */
@@ -73282,21 +74192,26 @@ const containerResponsiveThemeCss = `/*
73282
74192
  margin-inline-start: auto;
73283
74193
  }
73284
74194
 
74195
+ /* A footer with only Back keeps it bottom-left, like every other step */
74196
+ :where(.theme-scope) :where([data-block="event-registration"], [data-block="appointment-booking"]) .rb-wizard-actions--back-only > :only-child {
74197
+ margin-inline-start: 0;
74198
+ }
74199
+
73285
74200
  /* On-surface text ramp */
73286
74201
  :where(.theme-scope) :where([data-block="event-registration"], [data-block="appointment-booking"]) .rb-on-surface {
73287
74202
  color: var(--rb-reg-on-surface, rgb(var(--tb-onSurface, var(--tb-text, 15 23 42))));
73288
74203
  }
73289
74204
 
73290
74205
  :where(.theme-scope) :where([data-block="event-registration"], [data-block="appointment-booking"]) .rb-on-surface--muted {
73291
- color: var(--rb-reg-on-surface-muted, rgba(var(--tb-onSurface, var(--tb-text, 15 23 42)), 0.7));
74206
+ color: var(--rb-reg-on-surface-muted, rgb(var(--tb-onSurface, var(--tb-text, 15 23 42)) / 0.7));
73292
74207
  }
73293
74208
 
73294
74209
  :where(.theme-scope) :where([data-block="event-registration"], [data-block="appointment-booking"]) .rb-on-surface--subtle {
73295
- color: var(--rb-reg-on-surface-subtle, rgba(var(--tb-onSurface, var(--tb-text, 15 23 42)), 0.6));
74210
+ color: var(--rb-reg-on-surface-subtle, rgb(var(--tb-onSurface, var(--tb-text, 15 23 42)) / 0.6));
73296
74211
  }
73297
74212
 
73298
74213
  :where(.theme-scope) :where([data-block="event-registration"], [data-block="appointment-booking"]) .rb-on-surface--faint {
73299
- color: var(--rb-reg-on-surface-faint, rgba(var(--tb-onSurface, var(--tb-text, 15 23 42)), 0.5));
74214
+ color: var(--rb-reg-on-surface-faint, rgb(var(--tb-onSurface, var(--tb-text, 15 23 42)) / 0.5));
73300
74215
  }
73301
74216
 
73302
74217
  /* Layout stacks */
@@ -73331,7 +74246,7 @@ const containerResponsiveThemeCss = `/*
73331
74246
  padding: 1rem;
73332
74247
  border-radius: calc(var(--rb-reg-radius, var(--rb-block-radius, 1rem)) * 0.75);
73333
74248
  border: 1px solid var(--rb-reg-summary-border, rgb(var(--tb-border, 226 232 240)));
73334
- background: var(--rb-reg-summary-bg, rgba(var(--tb-muted, 241 245 249), 0.42));
74249
+ background: var(--rb-reg-summary-bg, rgb(var(--tb-muted, 241 245 249) / 0.42));
73335
74250
  }
73336
74251
 
73337
74252
  /* Skeleton shell lines */
@@ -73340,9 +74255,9 @@ const containerResponsiveThemeCss = `/*
73340
74255
  border-radius: 9999px;
73341
74256
  background: linear-gradient(
73342
74257
  90deg,
73343
- var(--rb-reg-shell-line, rgba(var(--tb-mutedText, 100 116 139), 0.22)),
73344
- rgba(var(--tb-primary, 17 24 39), 0.12),
73345
- var(--rb-reg-shell-line, rgba(var(--tb-mutedText, 100 116 139), 0.22))
74258
+ var(--rb-reg-shell-line, rgb(var(--tb-mutedText, 100 116 139) / 0.22)),
74259
+ rgb(var(--tb-primary, 17 24 39) / 0.12),
74260
+ var(--rb-reg-shell-line, rgb(var(--tb-mutedText, 100 116 139) / 0.22))
73346
74261
  );
73347
74262
  }
73348
74263
 
@@ -73367,7 +74282,7 @@ const containerResponsiveThemeCss = `/*
73367
74282
  height: 2.5rem;
73368
74283
  width: 100%;
73369
74284
  border-radius: var(--rb-reg-radius, var(--rb-block-radius, 1rem));
73370
- background: var(--rb-reg-shell-line, rgba(var(--tb-mutedText, 100 116 139), 0.22));
74285
+ background: var(--rb-reg-shell-line, rgb(var(--tb-mutedText, 100 116 139) / 0.22));
73371
74286
  animation: rb-reg-pulse 1.5s ease-in-out infinite;
73372
74287
  }
73373
74288
 
@@ -73386,6 +74301,101 @@ const containerResponsiveThemeCss = `/*
73386
74301
  }
73387
74302
  }
73388
74303
 
74304
+ /* Payment choices (issue 1581): one full-width radio row per way to pay, the
74305
+ * label and detail on the left, the price on the right. Shared by event and
74306
+ * appointment booking (PaymentChoiceRows). */
74307
+ :where(.theme-scope) :where([data-block="event-registration"], [data-block="appointment-booking"]) .rb-pay-choices {
74308
+ display: flex;
74309
+ flex-direction: column;
74310
+ gap: 0.625rem;
74311
+ }
74312
+
74313
+ :where(.theme-scope) :where([data-block="event-registration"], [data-block="appointment-booking"]) .rb-pay-choice {
74314
+ display: flex;
74315
+ align-items: flex-start;
74316
+ gap: 0.875rem;
74317
+ padding: 1rem 1.125rem;
74318
+ border: 1px solid var(--rb-reg-border, rgb(var(--tb-border)));
74319
+ border-radius: var(--rb-reg-radius, var(--rb-block-radius, 1rem));
74320
+ background: var(--rb-reg-option-bg, transparent);
74321
+ color: var(--rb-surface-text-color, rgb(var(--tb-text)));
74322
+ cursor: pointer;
74323
+ transition:
74324
+ border-color var(--rb-block-transition, 150ms) ease,
74325
+ background-color var(--rb-block-transition, 150ms) ease;
74326
+ }
74327
+
74328
+ :where(.theme-scope) :where([data-block="event-registration"], [data-block="appointment-booking"]) .rb-pay-choice:hover:not(.rb-pay-choice--disabled) {
74329
+ border-color: var(--rb-reg-border-hover, rgb(var(--tb-primary) / 0.5));
74330
+ }
74331
+
74332
+ :where(.theme-scope) :where([data-block="event-registration"], [data-block="appointment-booking"]) .rb-pay-choice:focus-within {
74333
+ box-shadow: 0 0 0 3px rgb(var(--tb-primary) / 0.25);
74334
+ }
74335
+
74336
+ :where(.theme-scope) :where([data-block="event-registration"], [data-block="appointment-booking"]) .rb-pay-choice--selected {
74337
+ border-color: rgb(var(--tb-primary));
74338
+ box-shadow: inset 0 0 0 1px rgb(var(--tb-primary));
74339
+ background: rgb(var(--tb-primary) / 0.06);
74340
+ }
74341
+
74342
+ :where(.theme-scope) :where([data-block="event-registration"], [data-block="appointment-booking"]) .rb-pay-choice--selected:focus-within {
74343
+ box-shadow:
74344
+ inset 0 0 0 1px rgb(var(--tb-primary)),
74345
+ 0 0 0 3px rgb(var(--tb-primary) / 0.25);
74346
+ }
74347
+
74348
+ /* Disabled stays readable: a dashed edge and quieter text, with its reason */
74349
+ :where(.theme-scope) :where([data-block="event-registration"], [data-block="appointment-booking"]) .rb-pay-choice--disabled {
74350
+ border-style: dashed;
74351
+ cursor: not-allowed;
74352
+ }
74353
+
74354
+ :where(.theme-scope) :where([data-block="event-registration"], [data-block="appointment-booking"]) .rb-pay-choice--disabled :is(.rb-pay-choice__label, .rb-pay-choice__detail, .rb-pay-choice__price) {
74355
+ opacity: 0.65;
74356
+ }
74357
+
74358
+ :where(.theme-scope) :where([data-block="event-registration"], [data-block="appointment-booking"]) .rb-pay-choice__radio {
74359
+ flex: 0 0 auto;
74360
+ width: 1.25rem;
74361
+ height: 1.25rem;
74362
+ margin: 0.125rem 0 0;
74363
+ accent-color: rgb(var(--tb-primary));
74364
+ cursor: inherit;
74365
+ }
74366
+
74367
+ :where(.theme-scope) :where([data-block="event-registration"], [data-block="appointment-booking"]) .rb-pay-choice__body {
74368
+ flex: 1 1 auto;
74369
+ min-width: 0;
74370
+ display: flex;
74371
+ flex-direction: column;
74372
+ gap: 0.125rem;
74373
+ }
74374
+
74375
+ :where(.theme-scope) :where([data-block="event-registration"], [data-block="appointment-booking"]) .rb-pay-choice__label {
74376
+ font-weight: 700;
74377
+ line-height: 1.35;
74378
+ }
74379
+
74380
+ :where(.theme-scope) :where([data-block="event-registration"], [data-block="appointment-booking"]) .rb-pay-choice__detail {
74381
+ font-size: 0.875rem;
74382
+ line-height: 1.4;
74383
+ color: var(--rb-surface-supporting-color, rgb(var(--tb-text) / 0.7));
74384
+ }
74385
+
74386
+ :where(.theme-scope) :where([data-block="event-registration"], [data-block="appointment-booking"]) .rb-pay-choice__reason {
74387
+ font-size: 0.8125rem;
74388
+ line-height: 1.4;
74389
+ color: var(--rb-surface-text-color, rgb(var(--tb-text)));
74390
+ }
74391
+
74392
+ :where(.theme-scope) :where([data-block="event-registration"], [data-block="appointment-booking"]) .rb-pay-choice__price {
74393
+ flex: 0 0 auto;
74394
+ font-weight: 700;
74395
+ text-align: end;
74396
+ white-space: nowrap;
74397
+ }
74398
+
73389
74399
  /* =============================================================================
73390
74400
  * Block: Event Registration (pilot #76)
73391
74401
  * Uses CSS vars: --er-* (Tier 3) and --rb-block-* (Tier 2)
@@ -73400,17 +74410,14 @@ const containerResponsiveThemeCss = `/*
73400
74410
  --rb-event-tile-border-hover: var(--er-border-hover);
73401
74411
  --rb-event-tile-border-selected: var(--er-border-selected);
73402
74412
  --rb-event-tile-hover-opacity: var(--er-event-card-hover-opacity);
73403
- --rb-event-tile-bg-selected: rgba(var(--tb-primary), 0.1);
74413
+ --rb-event-tile-bg-selected: rgb(var(--tb-primary) / 0.1);
73404
74414
  --er-on-surface: rgb(var(--tb-onSurface, var(--tb-text)));
73405
- --er-on-surface-muted: rgba(var(--tb-onSurface, var(--tb-text)), 0.7);
73406
- --er-on-surface-subtle: rgba(var(--tb-onSurface, var(--tb-text)), 0.6);
73407
- --er-on-surface-faint: rgba(var(--tb-onSurface, var(--tb-text)), 0.5);
73408
- --er-on-surface-hover-bg: rgba(var(--tb-onSurface, var(--tb-text)), 0.05);
73409
- --er-on-surface-disabled: rgba(var(--tb-onSurface, var(--tb-text)), 0.78);
73410
- --er-on-surface-disabled-detail: rgba(
73411
- var(--tb-onSurface, var(--tb-text)),
73412
- 0.68
73413
- );
74415
+ --er-on-surface-muted: rgb(var(--tb-onSurface, var(--tb-text)) / 0.7);
74416
+ --er-on-surface-subtle: rgb(var(--tb-onSurface, var(--tb-text)) / 0.6);
74417
+ --er-on-surface-faint: rgb(var(--tb-onSurface, var(--tb-text)) / 0.5);
74418
+ --er-on-surface-hover-bg: rgb(var(--tb-onSurface, var(--tb-text)) / 0.05);
74419
+ --er-on-surface-disabled: rgb(var(--tb-onSurface, var(--tb-text)) / 0.78);
74420
+ --er-on-surface-disabled-detail: rgb(var(--tb-onSurface, var(--tb-text)) / 0.68);
73414
74421
  }
73415
74422
 
73416
74423
  /* Container: styled by the shared .rb-reg-surface (registration-surface.css);
@@ -73538,6 +74545,109 @@ const containerResponsiveThemeCss = `/*
73538
74545
  opacity: 0.6;
73539
74546
  }
73540
74547
 
74548
+ /* Date step (issue 1581): one radio row per date, on the shared event tile */
74549
+ :where(.theme-scope)
74550
+ :where([data-block='event-registration'])
74551
+ .er-date-list {
74552
+ display: flex;
74553
+ flex-direction: column;
74554
+ gap: 0.625rem;
74555
+ }
74556
+
74557
+ :where(.theme-scope)
74558
+ :where([data-block='event-registration'])
74559
+ .er-date-list__month {
74560
+ margin: 0.5rem 0 0;
74561
+ font-size: 0.75rem;
74562
+ font-weight: 700;
74563
+ letter-spacing: 0.08em;
74564
+ text-transform: uppercase;
74565
+ color: var(--rb-surface-supporting-color, var(--er-on-surface-muted));
74566
+ }
74567
+
74568
+ :where(.theme-scope)
74569
+ :where([data-block='event-registration'])
74570
+ .er-date-list__month:first-child {
74571
+ margin-top: 0;
74572
+ }
74573
+
74574
+ :where(.theme-scope)
74575
+ :where([data-block='event-registration'])
74576
+ .er-event-card.er-date-option {
74577
+ display: flex;
74578
+ align-items: center;
74579
+ gap: 0.875rem;
74580
+ padding: 0.875rem 1rem;
74581
+ color: var(--rb-surface-text-color, rgb(var(--tb-text)));
74582
+ }
74583
+
74584
+ :where(.theme-scope)
74585
+ :where([data-block='event-registration'])
74586
+ .er-date-option:focus-within {
74587
+ box-shadow: 0 0 0 3px rgb(var(--tb-primary) / 0.25);
74588
+ }
74589
+
74590
+ :where(.theme-scope)
74591
+ :where([data-block='event-registration'])
74592
+ .er-date-option__radio {
74593
+ flex: 0 0 auto;
74594
+ width: 1.25rem;
74595
+ height: 1.25rem;
74596
+ margin: 0;
74597
+ accent-color: rgb(var(--tb-primary));
74598
+ cursor: pointer;
74599
+ }
74600
+
74601
+ :where(.theme-scope)
74602
+ :where([data-block='event-registration'])
74603
+ .er-date-option__main {
74604
+ flex: 1 1 auto;
74605
+ min-width: 0;
74606
+ display: flex;
74607
+ flex-direction: column;
74608
+ gap: 0.125rem;
74609
+ }
74610
+
74611
+ :where(.theme-scope)
74612
+ :where([data-block='event-registration'])
74613
+ .er-date-option__date {
74614
+ font-weight: 700;
74615
+ line-height: 1.3;
74616
+ }
74617
+
74618
+ :where(.theme-scope)
74619
+ :where([data-block='event-registration'])
74620
+ .er-date-option__time {
74621
+ font-size: 0.875rem;
74622
+ color: var(--rb-surface-supporting-color, var(--er-on-surface-muted));
74623
+ }
74624
+
74625
+ :where(.theme-scope)
74626
+ :where([data-block='event-registration'])
74627
+ .er-date-option__places {
74628
+ flex: 0 0 auto;
74629
+ padding: 0.125rem 0.5rem;
74630
+ border: 1px solid var(--er-border);
74631
+ border-radius: 999px;
74632
+ font-size: 0.75rem;
74633
+ font-weight: 700;
74634
+ white-space: nowrap;
74635
+ }
74636
+
74637
+ /* Full dates stay selectable (a guest can still reach recovery) but read as quiet */
74638
+ :where(.theme-scope)
74639
+ :where([data-block='event-registration'])
74640
+ .er-date-option--full {
74641
+ border-style: dashed;
74642
+ }
74643
+
74644
+ :where(.theme-scope)
74645
+ :where([data-block='event-registration'])
74646
+ .er-date-option--full
74647
+ :is(.er-date-option__main, .er-date-option__places) {
74648
+ opacity: 0.6;
74649
+ }
74650
+
73541
74651
  /* Capacity badges */
73542
74652
  :where(.theme-scope)
73543
74653
  :where([data-block='event-registration'])
@@ -73743,63 +74853,31 @@ const containerResponsiveThemeCss = `/*
73743
74853
  }
73744
74854
  }
73745
74855
 
73746
- /* Form inputs */
73747
- :where(.theme-scope) :where([data-block='event-registration']) .er-input {
73748
- width: 100%;
73749
- min-height: 2.75rem;
73750
- padding: 0.625rem 0.75rem;
73751
- border-radius: calc(var(--rb-block-radius) * 0.5);
73752
- border: 1px solid var(--er-border);
73753
- background: var(--er-control-bg);
73754
- color: var(--er-control-text);
73755
- font: inherit;
73756
- line-height: 1.4;
73757
- transition:
73758
- border-color var(--rb-block-transition) ease,
73759
- background-color var(--rb-block-transition) ease,
73760
- box-shadow var(--rb-block-transition) ease;
73761
- }
74856
+ /* Fields use the theme's own form-label / form-input / form-textarea
74857
+ (theme-core/src/inputs/generateInputCss.ts), like the site's form block. */
73762
74858
 
73763
74859
  :where(.theme-scope)
73764
74860
  :where([data-block='event-registration'])
73765
- .er-input::placeholder {
73766
- color: var(--er-on-surface-faint);
73767
- }
73768
-
73769
- :where(.theme-scope) :where([data-block='event-registration']) .er-input:focus {
73770
- outline: none;
73771
- border-color: var(--er-border-selected);
73772
- box-shadow: 0 0 0 3px var(--er-focus-ring);
73773
- }
73774
-
73775
- :where(.theme-scope)
73776
- :where([data-block='event-registration'])
73777
- .er-input--error {
73778
- border-color: var(--er-border-error);
74861
+ .er-label-optional {
74862
+ font-weight: 400;
74863
+ text-transform: none;
74864
+ letter-spacing: normal;
74865
+ color: var(--rb-surface-supporting-color, var(--er-on-surface-muted));
73779
74866
  }
73780
74867
 
73781
74868
  :where(.theme-scope)
73782
74869
  :where([data-block='event-registration'])
73783
- .er-input--error:focus {
73784
- box-shadow: 0 0 0 3px rgba(var(--tb-destructive), 0.2);
73785
- }
73786
-
73787
- /* Form labels and errors */
73788
- :where(.theme-scope) :where([data-block='event-registration']) .er-label {
73789
- display: block;
73790
- font-size: 0.875rem;
73791
- font-weight: 500;
73792
- margin-bottom: 0.25rem;
74870
+ .er-field-hint {
74871
+ margin: 0.375rem 0 0;
74872
+ font-size: 0.8125rem;
74873
+ line-height: 1.4;
74874
+ color: var(--rb-surface-supporting-color, var(--er-on-surface-muted));
73793
74875
  }
73794
74876
 
73795
74877
  :where(.theme-scope) :where([data-block='event-registration']) .er-consent-check {
73796
74878
  margin-top: 0.75rem;
73797
74879
  }
73798
74880
 
73799
- :where(.theme-scope) :where([data-block='event-registration']) .er-required {
73800
- color: var(--er-required);
73801
- }
73802
-
73803
74881
  :where(.theme-scope) :where([data-block='event-registration']) .er-error {
73804
74882
  font-size: 0.875rem;
73805
74883
  color: var(--er-error-text);
@@ -73808,12 +74886,14 @@ const containerResponsiveThemeCss = `/*
73808
74886
 
73809
74887
  /* Back button */
73810
74888
  :where(.theme-scope) :where([data-block='event-registration']) .er-back-btn {
73811
- font-size: 0.875rem;
73812
- opacity: 0.7;
74889
+ font-size: 0.9375rem;
74890
+ font-weight: 700;
74891
+ opacity: 0.8;
73813
74892
  background: none;
73814
74893
  border: none;
73815
74894
  cursor: pointer;
73816
- padding: 0;
74895
+ padding: 0 0.25rem;
74896
+ min-height: 2.75rem;
73817
74897
  transition: opacity var(--rb-block-transition) ease;
73818
74898
  }
73819
74899
 
@@ -73824,11 +74904,12 @@ const containerResponsiveThemeCss = `/*
73824
74904
  }
73825
74905
 
73826
74906
  /* State icon color variants (layout from registration-surface.css) */
74907
+ /* Success: a solid primary disc with an on-primary tick (issue 1581) */
73827
74908
  :where(.theme-scope)
73828
74909
  :where([data-block='event-registration'])
73829
74910
  .rb-state-icon--success {
73830
- background: var(--er-success-bg);
73831
- color: var(--er-success-text);
74911
+ background: rgb(var(--tb-primary));
74912
+ color: rgb(var(--tb-onPrimary));
73832
74913
  }
73833
74914
 
73834
74915
  :where(.theme-scope)
@@ -73877,14 +74958,15 @@ const containerResponsiveThemeCss = `/*
73877
74958
 
73878
74959
  /* Typography */
73879
74960
  :where(.theme-scope) :where([data-block='event-registration']) .er-title {
73880
- font-size: var(--er-step-title-size, 1.5rem);
73881
- font-weight: 600;
73882
- line-height: 1.3;
74961
+ font-family: var(--font-heading, inherit);
74962
+ font-size: var(--er-step-title-size, 1.75rem);
74963
+ line-height: 1.15;
73883
74964
  }
73884
74965
 
74966
+ /* Confirmation and error titles: never smaller than a step's heading */
73885
74967
  :where(.theme-scope) :where([data-block='event-registration']) .er-title--lg {
73886
- font-size: 1.25rem;
73887
- line-height: 1.75rem;
74968
+ font-size: calc(var(--er-step-title-size, 1.75rem) * 1.15);
74969
+ line-height: 1.1;
73888
74970
  }
73889
74971
 
73890
74972
  :where(.theme-scope) :where([data-block='event-registration']) .er-text {
@@ -74110,7 +75192,7 @@ const containerResponsiveThemeCss = `/*
74110
75192
  padding: 1.25rem;
74111
75193
  border: 1px solid var(--er-border);
74112
75194
  border-radius: var(--rb-block-radius);
74113
- background: rgba(var(--tb-surface), 0.5);
75195
+ background: rgb(var(--tb-surface) / 0.5);
74114
75196
  text-align: center;
74115
75197
  }
74116
75198
 
@@ -74215,7 +75297,7 @@ const containerResponsiveThemeCss = `/*
74215
75297
  :where([data-block='event-registration'])
74216
75298
  .er-payment-option:hover {
74217
75299
  border-color: var(--er-payment-border-hover);
74218
- box-shadow: 0 8px 18px rgba(var(--tb-shadow, 15 23 42), 0.08);
75300
+ box-shadow: 0 8px 18px rgb(var(--tb-shadow, 15 23 42) / 0.08);
74219
75301
  }
74220
75302
 
74221
75303
  :where(.theme-scope)
@@ -74415,103 +75497,6 @@ const containerResponsiveThemeCss = `/*
74415
75497
  color: var(--er-on-surface);
74416
75498
  }
74417
75499
 
74418
- /* Two-column layout (Desktop: sidebar, Mobile: stacked) */
74419
- :where(.theme-scope) :where([data-block='event-registration']) .er-layout {
74420
- display: grid;
74421
- gap: 1.5rem;
74422
- /* Mobile: single column, summary at top */
74423
- grid-template-columns: 1fr;
74424
- grid-template-areas:
74425
- 'summary'
74426
- 'main';
74427
- }
74428
-
74429
- @container rb-site (min-width: 768px) {
74430
- @scope ([data-rb-responsive-mode="container"]) to (:scope [data-rb-responsive-mode]) {
74431
- :where(.theme-scope:is(*, :scope)) :where([data-block='event-registration']) .er-layout {
74432
- /* Desktop: main + sidebar */
74433
- grid-template-columns: 1fr 300px;
74434
- grid-template-areas: 'main summary';
74435
- }
74436
- }
74437
- }
74438
-
74439
- :where(.theme-scope) :where([data-block='event-registration']) .er-layout-main {
74440
- grid-area: main;
74441
- }
74442
-
74443
- /* OrderSummary positions via grid area */
74444
- :where(.theme-scope)
74445
- :where([data-block='event-registration'])
74446
- .er-layout
74447
- > .er-summary {
74448
- grid-area: summary;
74449
- }
74450
-
74451
- /* Step indicator */
74452
- :where(.theme-scope) :where([data-block='event-registration']) .er-steps-nav {
74453
- margin-bottom: 1.5rem;
74454
- }
74455
-
74456
- /* Step indicator internals: styled by the shared .rb-steps / .rb-step-*
74457
- family (registration-surface.css) via the --rb-reg-step-* mappings in the
74458
- event-registration var generator; er-* classes remain in markup as hooks.
74459
- Note: .er-steps-nav above is intentionally retained — its source position
74460
- keeps the wizard's 1.5rem step margin winning over the SSR shell's
74461
- 1.25rem .er-registration-shell__steps override. */
74462
-
74463
- /* Sticky order summary */
74464
- :where(.theme-scope) :where([data-block='event-registration']) .er-summary {
74465
- padding: 1.25rem;
74466
- background: var(--er-summary-bg);
74467
- border: 1px solid var(--er-summary-border);
74468
- border-radius: var(--rb-block-radius);
74469
- display: flex;
74470
- flex-direction: column;
74471
- justify-content: center;
74472
- align-items: center;
74473
- text-align: center;
74474
- min-height: 140px;
74475
- }
74476
-
74477
- @container rb-site (min-width: 768px) {
74478
- @scope ([data-rb-responsive-mode="container"]) to (:scope [data-rb-responsive-mode]) {
74479
- :where(.theme-scope:is(*, :scope)) :where([data-block='event-registration']) .er-summary {
74480
- position: sticky;
74481
- top: 1rem;
74482
- }
74483
- }
74484
- }
74485
-
74486
- :where(.theme-scope)
74487
- :where([data-block='event-registration'])
74488
- .er-summary-event {
74489
- font-weight: 600;
74490
- margin-bottom: 0.25rem;
74491
- }
74492
-
74493
- :where(.theme-scope)
74494
- :where([data-block='event-registration'])
74495
- .er-summary-date {
74496
- font-size: 0.875rem;
74497
- color: rgba(var(--tb-text), 0.7);
74498
- }
74499
-
74500
- :where(.theme-scope)
74501
- :where([data-block='event-registration'])
74502
- .er-summary-tickets {
74503
- font-size: 0.875rem;
74504
- margin-top: 0.75rem;
74505
- }
74506
-
74507
- :where(.theme-scope)
74508
- :where([data-block='event-registration'])
74509
- .er-summary-price {
74510
- font-size: 1.25rem;
74511
- font-weight: 700;
74512
- margin-top: 0.5rem;
74513
- }
74514
-
74515
75500
  /* Guest details section */
74516
75501
  :where(.theme-scope)
74517
75502
  :where([data-block='event-registration'])
@@ -74572,17 +75557,6 @@ const containerResponsiveThemeCss = `/*
74572
75557
  border-top: 1px solid var(--er-border);
74573
75558
  }
74574
75559
 
74575
- @container rb-site (min-width: 768px) {
74576
- @scope ([data-rb-responsive-mode="container"]) to (:scope [data-rb-responsive-mode]) {
74577
- :where(.theme-scope:is(*, :scope))
74578
- :where([data-block='event-registration'])
74579
- .er-guest-card {
74580
- grid-template-columns: minmax(0, 2fr) minmax(0, 1fr);
74581
- column-gap: 1rem;
74582
- align-items: start;
74583
- }
74584
- }
74585
- }
74586
75560
 
74587
75561
  /* Shake animation for validation errors */
74588
75562
  @keyframes er-shake {
@@ -74906,8 +75880,8 @@ const containerResponsiveThemeCss = `/*
74906
75880
  :where(.theme-scope)
74907
75881
  :where([data-block='event-registration'])
74908
75882
  .er-notice--info {
74909
- background-color: rgba(var(--tb-primary-100), 0.5);
74910
- border: 1px solid rgba(var(--tb-primary-300), 0.5);
75883
+ background-color: rgb(var(--tb-primary-100) / 0.5);
75884
+ border: 1px solid rgb(var(--tb-primary-300) / 0.5);
74911
75885
  color: rgb(var(--tb-primary-800));
74912
75886
  }
74913
75887
 
@@ -74993,12 +75967,40 @@ const containerResponsiveThemeCss = `/*
74993
75967
  :where([data-block='event-registration'])
74994
75968
  .er-payment-layout-main {
74995
75969
  grid-area: main;
75970
+ /* A column, so an optional sign-in line can settle at the foot of the step. */
75971
+ display: flex;
75972
+ flex-direction: column;
75973
+ }
75974
+
75975
+ :where(.theme-scope)
75976
+ :where([data-block='event-registration'])
75977
+ .er-payment-layout-main
75978
+ > * {
75979
+ flex-shrink: 0;
75980
+ }
75981
+
75982
+ :where(.theme-scope)
75983
+ :where([data-block='event-registration'])
75984
+ .er-payment-layout-main
75985
+ > .er-portal-auth[data-placement='before'] {
75986
+ margin-bottom: 1.5rem;
74996
75987
  }
74997
75988
 
75989
+ /* The optional sign-in line: pinned to the foot of the step behind a hairline,
75990
+ and never closer than 1.5rem to the step's content. */
74998
75991
  :where(.theme-scope)
74999
75992
  :where([data-block='event-registration'])
75000
75993
  .er-payment-layout-main
75001
- > .er-portal-auth {
75994
+ > .er-portal-auth[data-placement='after'] {
75995
+ margin-top: auto;
75996
+ padding-top: 1rem;
75997
+ border-top: 1px solid var(--er-border);
75998
+ }
75999
+
76000
+ :where(.theme-scope)
76001
+ :where([data-block='event-registration'])
76002
+ .er-payment-layout-main
76003
+ > :has(+ .er-portal-auth[data-placement='after']) {
75002
76004
  margin-bottom: 1.5rem;
75003
76005
  }
75004
76006
 
@@ -75018,7 +76020,7 @@ const containerResponsiveThemeCss = `/*
75018
76020
  }
75019
76021
 
75020
76022
  /* =============================================================================
75021
- * Payment Tiles Grid
76023
+ * Attendance mode tiles (in person / online)
75022
76024
  * =============================================================================
75023
76025
  */
75024
76026
 
@@ -75063,9 +76065,9 @@ const containerResponsiveThemeCss = `/*
75063
76065
 
75064
76066
  :where(.theme-scope)
75065
76067
  :where([data-block='event-registration'])
75066
- .er-payment-tile:hover:not([aria-disabled='true']) {
76068
+ .er-payment-tile:hover {
75067
76069
  border-color: var(--er-payment-border-hover);
75068
- box-shadow: 0 8px 18px rgba(var(--tb-shadow, 15 23 42), 0.08);
76070
+ box-shadow: 0 8px 18px rgb(var(--tb-shadow, 15 23 42) / 0.08);
75069
76071
  }
75070
76072
 
75071
76073
  :where(.theme-scope)
@@ -75076,89 +76078,6 @@ const containerResponsiveThemeCss = `/*
75076
76078
  box-shadow: 0 0 0 1px var(--er-payment-border-selected);
75077
76079
  }
75078
76080
 
75079
- :where(.theme-scope)
75080
- :where([data-block='event-registration'])
75081
- .er-payment-tile--disabled {
75082
- cursor: not-allowed;
75083
- }
75084
-
75085
- :where(.theme-scope)
75086
- :where([data-block='event-registration'])
75087
- .er-payment-tile--disabled
75088
- > :not(.er-payment-tooltip) {
75089
- opacity: 0.5;
75090
- }
75091
-
75092
- :where(.theme-scope)
75093
- :where([data-block='event-registration'])
75094
- .er-payment-tile--disabled.er-payment-tile--selected {
75095
- border-color: var(--er-payment-border);
75096
- background-color: transparent;
75097
- }
75098
-
75099
- :where(.theme-scope)
75100
- :where([data-block='event-registration'])
75101
- .er-payment-tile--disabled:hover {
75102
- border-color: var(--er-payment-border);
75103
- }
75104
-
75105
- /* Tooltip styling for disabled payment tiles */
75106
- :where(.theme-scope)
75107
- :where([data-block='event-registration'])
75108
- .er-payment-tile[aria-disabled='true'] {
75109
- position: relative;
75110
- }
75111
-
75112
- :where(.theme-scope)
75113
- :where([data-block='event-registration'])
75114
- .er-payment-tooltip {
75115
- display: none;
75116
- position: absolute;
75117
- bottom: 100%;
75118
- left: 50%;
75119
- transform: translateX(-50%);
75120
- margin-bottom: 0.5rem;
75121
- padding: 0.5rem 0.75rem;
75122
- background: rgb(var(--tb-text));
75123
- color: rgb(var(--tb-background));
75124
- font-size: 0.8125rem;
75125
- font-weight: 500;
75126
- border-radius: calc(var(--rb-block-radius) * 0.5);
75127
- white-space: normal;
75128
- max-width: 16rem;
75129
- line-height: 1.35;
75130
- text-align: center;
75131
- box-shadow: 0 8px 20px rgba(var(--tb-shadow), 0.28);
75132
- z-index: 10;
75133
- }
75134
-
75135
- :where(.theme-scope)
75136
- :where([data-block='event-registration'])
75137
- .er-payment-tile--disabled:hover
75138
- .er-payment-tooltip {
75139
- display: block;
75140
- }
75141
-
75142
- :where(.theme-scope)
75143
- :where([data-block='event-registration'])
75144
- .er-payment-tile-icon {
75145
- font-size: 1.5rem;
75146
- line-height: 1;
75147
- /* SVG icon sizing */
75148
- display: flex;
75149
- align-items: center;
75150
- justify-content: center;
75151
- }
75152
-
75153
- :where(.theme-scope)
75154
- :where([data-block='event-registration'])
75155
- .er-payment-tile-icon
75156
- svg {
75157
- width: 24px;
75158
- height: 24px;
75159
- color: currentColor;
75160
- }
75161
-
75162
76081
  :where(.theme-scope)
75163
76082
  :where([data-block='event-registration'])
75164
76083
  .er-payment-tile-label {
@@ -75175,27 +76094,6 @@ const containerResponsiveThemeCss = `/*
75175
76094
  line-height: 1.25;
75176
76095
  }
75177
76096
 
75178
- :where(.theme-scope)
75179
- :where([data-block='event-registration'])
75180
- .er-payment-tile-check {
75181
- position: absolute;
75182
- top: 0.5rem;
75183
- right: 0.5rem;
75184
- }
75185
-
75186
- /* Upsell tiles have a subtle indicator */
75187
- :where(.theme-scope)
75188
- :where([data-block='event-registration'])
75189
- .er-payment-tile--upsell {
75190
- border-style: dashed;
75191
- }
75192
-
75193
- :where(.theme-scope)
75194
- :where([data-block='event-registration'])
75195
- .er-payment-tile--upsell.er-payment-tile--selected {
75196
- border-style: solid;
75197
- }
75198
-
75199
76097
  /* =============================================================================
75200
76098
  * Order Summary Bar (horizontal, in footer)
75201
76099
  * Layout: [Title + meta on left] [Price on right]
@@ -75203,14 +76101,12 @@ const containerResponsiveThemeCss = `/*
75203
76101
  */
75204
76102
 
75205
76103
  :where(.theme-scope) :where([data-block='event-registration']) .er-summary-bar {
76104
+ /* One row under the footer's hairline: what's booked, then the total
76105
+ (issue 1581). */
75206
76106
  display: flex;
75207
76107
  justify-content: space-between;
75208
- align-items: flex-start;
76108
+ align-items: baseline;
75209
76109
  gap: 1rem;
75210
- padding: 0.875rem 1rem;
75211
- background: var(--er-surface-muted);
75212
- border: 1px solid var(--er-summary-border);
75213
- border-radius: calc(var(--rb-block-radius) * 0.75);
75214
76110
  }
75215
76111
 
75216
76112
  :where(.theme-scope)
@@ -75233,18 +76129,30 @@ const containerResponsiveThemeCss = `/*
75233
76129
  :where(.theme-scope)
75234
76130
  :where([data-block='event-registration'])
75235
76131
  .er-summary-bar-meta {
75236
- font-size: 0.8125rem;
75237
- color: rgba(var(--tb-text), 0.7);
76132
+ font-size: 0.9375rem;
75238
76133
  line-height: 1.35;
75239
76134
  }
75240
76135
 
76136
+ :where(.theme-scope)
76137
+ :where([data-block='event-registration'])
76138
+ .er-summary-bar-meta
76139
+ > span
76140
+ + span::before {
76141
+ content: ' · ';
76142
+ }
76143
+
76144
+ :where(.theme-scope)
76145
+ :where([data-block='event-registration'])
76146
+ .er-summary-bar-schedule {
76147
+ color: var(--rb-surface-supporting-color, rgb(var(--tb-text) / 0.7));
76148
+ }
76149
+
75241
76150
  :where(.theme-scope)
75242
76151
  :where([data-block='event-registration'])
75243
76152
  .er-summary-bar-price {
75244
- font-size: 1rem;
76153
+ font-size: 1.125rem;
75245
76154
  font-weight: 700;
75246
76155
  flex-shrink: 0;
75247
- display: block;
75248
76156
  text-align: right;
75249
76157
  }
75250
76158
 
@@ -75252,12 +76160,22 @@ const containerResponsiveThemeCss = `/*
75252
76160
  :where([data-block='event-registration'])
75253
76161
  .er-summary-bar-pricing {
75254
76162
  display: flex;
75255
- flex-direction: column;
75256
- align-items: flex-end;
75257
- gap: 0.125rem;
76163
+ flex-wrap: wrap;
76164
+ justify-content: flex-end;
76165
+ align-items: baseline;
76166
+ column-gap: 0.5rem;
76167
+ row-gap: 0.125rem;
75258
76168
  text-align: right;
75259
76169
  }
75260
76170
 
76171
+ /* Notes under the total take their own line */
76172
+ :where(.theme-scope)
76173
+ :where([data-block='event-registration'])
76174
+ .er-summary-bar-pricing
76175
+ > div {
76176
+ flex-basis: 100%;
76177
+ }
76178
+
75261
76179
  /* Product section in summary bar (for pass/membership selection) */
75262
76180
  :where(.theme-scope)
75263
76181
  :where([data-block='event-registration'])
@@ -75303,7 +76221,7 @@ const containerResponsiveThemeCss = `/*
75303
76221
  :where([data-block='event-registration'])
75304
76222
  .er-summary-bar-product-detail {
75305
76223
  font-size: 0.8125rem;
75306
- color: rgba(var(--tb-text), 0.6);
76224
+ color: rgb(var(--tb-text) / 0.6);
75307
76225
  margin-top: 0.125rem;
75308
76226
  }
75309
76227
 
@@ -75320,9 +76238,8 @@ const containerResponsiveThemeCss = `/*
75320
76238
  :where(.theme-scope)
75321
76239
  :where([data-block='event-registration'])
75322
76240
  .er-summary-bar-price--struck {
75323
- display: block;
75324
76241
  text-decoration: line-through;
75325
- color: rgba(var(--tb-text), 0.5);
76242
+ color: rgb(var(--tb-text) / 0.5);
75326
76243
  font-size: 0.9375rem;
75327
76244
  font-weight: 500;
75328
76245
  text-align: right;
@@ -75344,19 +76261,25 @@ const containerResponsiveThemeCss = `/*
75344
76261
  */
75345
76262
 
75346
76263
  :where(.theme-scope) :where([data-block='event-registration']) .er-portal-auth {
75347
- padding: 1.25rem;
75348
- background: rgba(var(--tb-surface), 0.5);
75349
- border: 1px solid var(--er-border);
75350
- border-radius: var(--rb-block-radius);
75351
- color: var(--er-on-surface);
76264
+ /* The surface the panel paints publishes its own foreground; --tb-onSurface
76265
+ can be a different (near-black) colour from the site's text. */
76266
+ color: var(--rb-surface-text-color, rgb(var(--tb-text)));
76267
+ font-size: 0.9375rem;
76268
+ line-height: 1.5;
75352
76269
  }
75353
76270
 
75354
76271
  :where(.theme-scope)
75355
76272
  :where([data-block='event-registration'])
75356
76273
  .er-portal-auth-title {
75357
76274
  font-weight: 600;
75358
- font-size: 1rem;
75359
- margin: 0 0 0.5rem 0;
76275
+ margin: 0 0 0.25rem 0;
76276
+ }
76277
+
76278
+ :where(.theme-scope)
76279
+ :where([data-block='event-registration'])
76280
+ .er-portal-auth[data-placement='after']
76281
+ .er-portal-auth-title {
76282
+ margin: 0;
75360
76283
  }
75361
76284
 
75362
76285
  :where(.theme-scope)
@@ -75368,6 +76291,15 @@ const containerResponsiveThemeCss = `/*
75368
76291
  line-height: 1.4;
75369
76292
  }
75370
76293
 
76294
+ :where(.theme-scope)
76295
+ :where([data-block='event-registration'])
76296
+ .er-portal-auth
76297
+ .er-portal-auth-text {
76298
+ color: inherit;
76299
+ margin: 0;
76300
+ line-height: inherit;
76301
+ }
76302
+
75371
76303
  :where(.theme-scope)
75372
76304
  :where([data-block='event-registration'])
75373
76305
  .er-portal-auth-link {
@@ -75417,7 +76349,7 @@ const containerResponsiveThemeCss = `/*
75417
76349
  left: 0;
75418
76350
  right: 0;
75419
76351
  bottom: 0;
75420
- background: rgba(var(--tb-scrim), 0.5);
76352
+ background: var(--rb-modal-overlay-bg);
75421
76353
  display: flex;
75422
76354
  align-items: center;
75423
76355
  justify-content: center;
@@ -75432,7 +76364,7 @@ const containerResponsiveThemeCss = `/*
75432
76364
  max-width: 400px;
75433
76365
  width: 100%;
75434
76366
  position: relative;
75435
- box-shadow: 0 10px 25px rgba(var(--tb-shadow), 0.2);
76367
+ box-shadow: 0 10px 25px rgb(var(--tb-shadow) / 0.2);
75436
76368
  }
75437
76369
 
75438
76370
  :where(.theme-scope) :where([data-block='event-registration']) .er-modal-close {
@@ -75444,7 +76376,7 @@ const containerResponsiveThemeCss = `/*
75444
76376
  font-size: 1.5rem;
75445
76377
  line-height: 1;
75446
76378
  cursor: pointer;
75447
- color: rgba(var(--tb-text), 0.5);
76379
+ color: rgb(var(--tb-text) / 0.5);
75448
76380
  padding: 0.25rem;
75449
76381
  }
75450
76382
 
@@ -75510,97 +76442,246 @@ const containerResponsiveThemeCss = `/*
75510
76442
  :where(.theme-scope)
75511
76443
  :where([data-block='event-registration'])
75512
76444
  .er-modal-btn--secondary:hover {
75513
- background: rgba(var(--tb-text), 0.05);
76445
+ background: rgb(var(--tb-text) / 0.05);
75514
76446
  }
75515
76447
 
75516
- /* In-flow booking teaser (sits at the block's position in the page) */
76448
+ /* Booking card: in the page where the editor placed the block (issue 1581) */
75517
76449
  :where(.theme-scope)
75518
76450
  :where([data-block='event-registration'])
75519
- .er-booking-teaser {
76451
+ .er-booking-card {
75520
76452
  display: flex;
76453
+ flex-direction: column;
76454
+ gap: 1.125rem;
76455
+ padding: 1.5rem 1.75rem;
76456
+ border: 1px solid var(--er-border);
76457
+ border-radius: calc(var(--rb-block-radius) * 1.25);
76458
+ background: rgb(var(--tb-surface));
76459
+ /* Foreground and button context: theme-core/src/blocks/opaquePanels.ts. */
76460
+ }
76461
+
76462
+ :where(.theme-scope)
76463
+ :where([data-block='event-registration'])
76464
+ .er-booking-card__row {
76465
+ display: flex;
76466
+ align-items: center;
76467
+ gap: 1.25rem 1.75rem;
75521
76468
  flex-wrap: wrap;
76469
+ }
76470
+
76471
+ :where(.theme-scope)
76472
+ :where([data-block='event-registration'])
76473
+ .er-booking-card__tile {
76474
+ flex: 0 0 auto;
76475
+ display: flex;
76476
+ flex-direction: column;
75522
76477
  align-items: center;
75523
- justify-content: space-between;
75524
- gap: 1rem 1.5rem;
75525
- padding: 1.25rem 1.5rem;
75526
- border: 1px solid var(--er-border);
76478
+ justify-content: center;
76479
+ gap: 0.125rem;
76480
+ width: 4.25rem;
76481
+ height: 4.75rem;
75527
76482
  border-radius: var(--rb-block-radius);
75528
- background: var(--er-event-card-bg);
75529
- /* Foreground and button context: theme-core/src/blocks/opaquePanels.ts. */
76483
+ background: rgb(var(--tb-primary));
76484
+ color: rgb(var(--tb-onPrimary, var(--tb-primaryForeground)));
75530
76485
  }
75531
76486
 
75532
76487
  :where(.theme-scope)
75533
76488
  :where([data-block='event-registration'])
75534
- .er-booking-teaser__info {
76489
+ .er-booking-card__tile-month {
76490
+ font-size: 0.75rem;
76491
+ font-weight: 800;
76492
+ letter-spacing: 0.1em;
76493
+ }
76494
+
76495
+ :where(.theme-scope)
76496
+ :where([data-block='event-registration'])
76497
+ .er-booking-card__tile-day {
76498
+ font-family: var(--font-heading, inherit);
76499
+ font-size: 2rem;
76500
+ line-height: 1;
76501
+ }
76502
+
76503
+ :where(.theme-scope)
76504
+ :where([data-block='event-registration'])
76505
+ .er-booking-card__badge {
76506
+ flex: 0 0 auto;
76507
+ display: inline-flex;
76508
+ align-items: center;
76509
+ justify-content: center;
76510
+ width: 3rem;
76511
+ height: 3rem;
76512
+ border-radius: 999px;
76513
+ background: rgb(var(--tb-primary));
76514
+ color: rgb(var(--tb-onPrimary, var(--tb-primaryForeground)));
76515
+ }
76516
+
76517
+ :where(.theme-scope)
76518
+ :where([data-block='event-registration'])
76519
+ .er-booking-card__body {
76520
+ flex: 1 1 16rem;
76521
+ min-width: 0;
75535
76522
  display: flex;
75536
76523
  flex-direction: column;
75537
76524
  gap: 0.25rem;
75538
- min-width: 0;
75539
76525
  }
75540
76526
 
75541
76527
  :where(.theme-scope)
75542
76528
  :where([data-block='event-registration'])
75543
- .er-booking-teaser__title {
75544
- font-size: 1.0625rem;
76529
+ .er-booking-card__when {
76530
+ margin: 0;
76531
+ font-size: 1.125rem;
75545
76532
  font-weight: 700;
75546
- line-height: 1.2;
76533
+ line-height: 1.3;
75547
76534
  }
75548
76535
 
75549
76536
  :where(.theme-scope)
75550
76537
  :where([data-block='event-registration'])
75551
- .er-booking-teaser__meta {
76538
+ .er-booking-card__venue,
76539
+ :where(.theme-scope)
76540
+ :where([data-block='event-registration'])
76541
+ .er-booking-card__facts {
76542
+ margin: 0;
75552
76543
  font-size: 0.9375rem;
75553
- line-height: 1.3;
75554
- opacity: 0.75;
76544
+ line-height: 1.45;
76545
+ color: var(--rb-reg-on-surface-muted, rgb(var(--tb-text) / 0.75));
75555
76546
  }
75556
76547
 
75557
76548
  :where(.theme-scope)
75558
76549
  :where([data-block='event-registration'])
75559
- .er-booking-teaser__tickets {
76550
+ .er-booking-card__facts {
76551
+ margin-top: 0.25rem;
76552
+ font-weight: 600;
76553
+ color: inherit;
76554
+ }
76555
+
76556
+ :where(.theme-scope)
76557
+ :where([data-block='event-registration'])
76558
+ .er-booking-card__cta {
76559
+ flex: 0 0 auto;
76560
+ }
76561
+
76562
+ :where(.theme-scope)
76563
+ :where([data-block='event-registration'])
76564
+ .er-booking-card__dates {
75560
76565
  display: flex;
75561
- flex-direction: column;
75562
- gap: 0.375rem;
75563
- margin-top: 0.5rem;
75564
- padding-top: 0.625rem;
76566
+ flex-wrap: wrap;
76567
+ align-items: center;
76568
+ gap: 0.625rem;
76569
+ padding-top: 1.125rem;
75565
76570
  border-top: 1px solid var(--er-border);
75566
76571
  }
75567
76572
 
75568
76573
  :where(.theme-scope)
75569
76574
  :where([data-block='event-registration'])
75570
- .er-booking-teaser__ticket {
75571
- display: flex;
75572
- align-items: baseline;
75573
- justify-content: space-between;
75574
- gap: 1rem;
75575
- font-size: 0.9375rem;
75576
- line-height: 1.35;
76575
+ .er-booking-card__dates-label {
76576
+ margin-right: 0.375rem;
76577
+ font-size: 0.8125rem;
76578
+ font-weight: 800;
76579
+ letter-spacing: 0.08em;
76580
+ text-transform: uppercase;
76581
+ color: var(--rb-reg-on-surface-muted, rgb(var(--tb-text) / 0.75));
75577
76582
  }
75578
76583
 
75579
76584
  :where(.theme-scope)
75580
76585
  :where([data-block='event-registration'])
75581
- .er-booking-teaser__ticket-name {
75582
- min-width: 0;
76586
+ .er-booking-card__date {
76587
+ min-height: 2.75rem;
76588
+ padding: 0 1rem;
76589
+ border: 1px solid var(--er-border);
76590
+ border-radius: 999px;
76591
+ background: var(--er-control-bg);
76592
+ color: inherit;
76593
+ font: inherit;
76594
+ font-size: 0.875rem;
76595
+ font-weight: 700;
76596
+ cursor: pointer;
76597
+ transition: border-color var(--rb-block-transition) ease;
75583
76598
  }
75584
76599
 
75585
76600
  :where(.theme-scope)
75586
76601
  :where([data-block='event-registration'])
75587
- .er-booking-teaser__cta {
75588
- flex: 0 0 auto;
76602
+ .er-booking-card__date:hover {
76603
+ border-color: rgb(var(--tb-primary));
76604
+ }
76605
+
76606
+ :where(.theme-scope)
76607
+ :where([data-block='event-registration'])
76608
+ .er-booking-card__date[data-full] {
76609
+ border-style: dashed;
76610
+ background: transparent;
76611
+ color: var(--rb-reg-on-surface-muted, rgb(var(--tb-text) / 0.75));
75589
76612
  }
75590
76613
 
75591
- /* Fixed, full-width sticky booking bar (content-agnostic; sits above page flow) */
75592
- :where(.theme-scope) :where([data-block='event-registration']) .er-booking-bar {
76614
+ :where(.theme-scope)
76615
+ :where([data-block='event-registration'])
76616
+ .er-booking-card__more {
76617
+ font-size: 0.875rem;
76618
+ color: var(--rb-reg-on-surface-muted, rgb(var(--tb-text) / 0.75));
76619
+ }
76620
+
76621
+ /* Booking bar: fixed to the bottom once the visitor is past the first screen.
76622
+ It stays mounted and slides: the card pushes it down in step as it rises
76623
+ from the bottom of the screen (--er-bar-push, set per frame), and it slides
76624
+ back up when the visitor scrolls past the card (issue 1581). */
76625
+ :where(.theme-scope)
76626
+ :where([data-block='event-registration'])
76627
+ .er-booking-bar {
75593
76628
  position: fixed;
75594
76629
  left: 0;
75595
76630
  right: 0;
75596
76631
  bottom: 0;
75597
76632
  z-index: 12000;
75598
- padding: 0.75rem max(1rem, env(safe-area-inset-right))
75599
- max(0.75rem, env(safe-area-inset-bottom))
76633
+ padding: 0.625rem max(1rem, env(safe-area-inset-right))
76634
+ max(0.625rem, env(safe-area-inset-bottom))
75600
76635
  max(1rem, env(safe-area-inset-left));
75601
- background: rgb(var(--tb-background));
76636
+ background: rgb(var(--tb-surface));
75602
76637
  border-top: 1px solid var(--er-border);
75603
- box-shadow: 0 -10px 30px rgba(var(--tb-shadow), 0.16);
76638
+ box-shadow: 0 -8px 28px rgb(var(--tb-shadow) / 0.14);
76639
+ /* Set per frame on the element while the card pushes the bar off. */
76640
+ --er-bar-push: 0px;
76641
+ transform: translateY(var(--er-bar-push));
76642
+ transition:
76643
+ transform 220ms ease,
76644
+ visibility 0s linear 0s;
76645
+ /* Foreground and button context: theme-core/src/blocks/opaquePanels.ts. */
76646
+ }
76647
+
76648
+ :where(.theme-scope)
76649
+ :where([data-block='event-registration'])
76650
+ .er-booking-bar[data-state='hidden'] {
76651
+ transform: translateY(calc(100% + 1.75rem));
76652
+ visibility: hidden;
76653
+ transition:
76654
+ transform 220ms ease,
76655
+ visibility 0s linear 220ms;
76656
+ }
76657
+
76658
+ :where(.theme-scope)
76659
+ :where([data-block='event-registration'])
76660
+ .er-booking-bar[data-pushing='true'] {
76661
+ /* Following the card frame by frame: no easing to lag behind. */
76662
+ transition: none;
76663
+ }
76664
+
76665
+ @media (prefers-reduced-motion: reduce) {
76666
+ :where(.theme-scope)
76667
+ :where([data-block='event-registration'])
76668
+ .er-booking-bar {
76669
+ transform: none;
76670
+ transition:
76671
+ opacity 150ms ease,
76672
+ visibility 0s linear 0s;
76673
+ }
76674
+
76675
+ :where(.theme-scope)
76676
+ :where([data-block='event-registration'])
76677
+ .er-booking-bar[data-state='hidden'] {
76678
+ transform: none;
76679
+ opacity: 0;
76680
+ transition:
76681
+ opacity 150ms ease,
76682
+ visibility 0s linear 150ms;
76683
+ }
76684
+
75604
76685
  }
75605
76686
 
75606
76687
  :where(.theme-scope)
@@ -75608,27 +76689,28 @@ const containerResponsiveThemeCss = `/*
75608
76689
  .er-booking-bar__inner {
75609
76690
  display: flex;
75610
76691
  align-items: center;
75611
- justify-content: space-between;
75612
- gap: 1rem;
76692
+ gap: 0.75rem 1.5rem;
75613
76693
  width: 100%;
75614
- max-width: 72rem;
76694
+ max-width: 77rem;
76695
+ min-height: 2.75rem;
75615
76696
  margin-inline: auto;
75616
76697
  }
75617
76698
 
75618
76699
  :where(.theme-scope)
75619
76700
  :where([data-block='event-registration'])
75620
76701
  .er-booking-bar__info {
76702
+ flex: 1 1 auto;
75621
76703
  display: flex;
75622
- flex-direction: column;
75623
- gap: 0.125rem;
76704
+ align-items: center;
76705
+ gap: 0.25rem 0.875rem;
75624
76706
  min-width: 0;
75625
76707
  }
75626
76708
 
75627
76709
  :where(.theme-scope)
75628
76710
  :where([data-block='event-registration'])
75629
76711
  .er-booking-bar__title {
75630
- font-size: 0.95rem;
75631
- font-weight: 700;
76712
+ font-family: var(--font-heading, inherit);
76713
+ font-size: 1.25rem;
75632
76714
  line-height: 1.2;
75633
76715
  white-space: nowrap;
75634
76716
  overflow: hidden;
@@ -75638,18 +76720,202 @@ const containerResponsiveThemeCss = `/*
75638
76720
  :where(.theme-scope)
75639
76721
  :where([data-block='event-registration'])
75640
76722
  .er-booking-bar__meta {
75641
- font-size: 0.8125rem;
75642
- line-height: 1.25;
75643
- opacity: 0.75;
76723
+ display: block;
76724
+ min-width: 0;
76725
+ font-size: 0.9375rem;
76726
+ line-height: 1.3;
76727
+ color: var(--rb-surface-supporting-color, rgb(var(--tb-text) / 0.75));
75644
76728
  white-space: nowrap;
75645
76729
  overflow: hidden;
75646
76730
  text-overflow: ellipsis;
75647
76731
  }
75648
76732
 
76733
+ /* Facts are set apart by a thin muted rule rather than a dot (issue 1581) */
76734
+ :where(.theme-scope)
76735
+ :where([data-block='event-registration'])
76736
+ .er-booking-bar__divider {
76737
+ display: inline-block;
76738
+ width: 0;
76739
+ height: 0.875em;
76740
+ margin-inline: 0.75rem;
76741
+ border-left: 1px solid var(--er-border);
76742
+ vertical-align: -0.0625em;
76743
+ }
76744
+
76745
+ :where(.theme-scope)
76746
+ :where([data-block='event-registration'])
76747
+ .er-booking-bar__fact--price {
76748
+ font-weight: 600;
76749
+ color: var(--rb-surface-text-color, rgb(var(--tb-text)));
76750
+ }
76751
+
76752
+ :where(.theme-scope)
76753
+ :where([data-block='event-registration'])
76754
+ .er-booking-bar[data-entry='inProgress'] .er-booking-bar__meta {
76755
+ font-weight: 600;
76756
+ color: rgb(var(--tb-primary));
76757
+ }
76758
+
76759
+ :where(.theme-scope)
76760
+ :where([data-block='event-registration'])
76761
+ .er-booking-bar__progress {
76762
+ flex: 0 0 7.5rem;
76763
+ height: 4px;
76764
+ border-radius: 4px;
76765
+ background: rgb(var(--tb-text) / 0.12);
76766
+ overflow: hidden;
76767
+ }
76768
+
76769
+ :where(.theme-scope)
76770
+ :where([data-block='event-registration'])
76771
+ .er-booking-bar__progress-fill {
76772
+ display: block;
76773
+ height: 100%;
76774
+ border-radius: 4px;
76775
+ background: rgb(var(--tb-primary));
76776
+ }
76777
+
75649
76778
  :where(.theme-scope)
75650
76779
  :where([data-block='event-registration'])
75651
76780
  .er-booking-bar__cta {
75652
76781
  flex: 0 0 auto;
76782
+ white-space: nowrap;
76783
+ }
76784
+
76785
+ /* Booked or waitlisted: one quiet status line; the whole bar leads back to the card */
76786
+ :where(.theme-scope)
76787
+ :where([data-block='event-registration'])
76788
+ .er-booking-bar__status {
76789
+ display: flex;
76790
+ align-items: center;
76791
+ gap: 0.625rem;
76792
+ width: 100%;
76793
+ min-width: 0;
76794
+ min-height: 2.75rem;
76795
+ padding: 0;
76796
+ border: 0;
76797
+ background: transparent;
76798
+ color: inherit;
76799
+ font: inherit;
76800
+ font-size: 0.9375rem;
76801
+ line-height: 1.3;
76802
+ text-align: start;
76803
+ cursor: pointer;
76804
+ }
76805
+
76806
+ :where(.theme-scope)
76807
+ :where([data-block='event-registration'])
76808
+ .er-booking-bar__status:focus-visible {
76809
+ outline: 2px solid rgb(var(--tb-primary));
76810
+ outline-offset: 4px;
76811
+ border-radius: 4px;
76812
+ }
76813
+
76814
+ :where(.theme-scope)
76815
+ :where([data-block='event-registration'])
76816
+ .er-booking-bar__check {
76817
+ flex: 0 0 auto;
76818
+ display: inline-flex;
76819
+ align-items: center;
76820
+ justify-content: center;
76821
+ width: 1.375rem;
76822
+ height: 1.375rem;
76823
+ border-radius: 999px;
76824
+ background: rgb(var(--tb-primary));
76825
+ color: rgb(var(--tb-onPrimary));
76826
+ }
76827
+
76828
+ :where(.theme-scope)
76829
+ :where([data-block='event-registration'])
76830
+ .er-booking-bar__status-text {
76831
+ display: flex;
76832
+ align-items: center;
76833
+ min-width: 0;
76834
+ white-space: nowrap;
76835
+ }
76836
+
76837
+ :where(.theme-scope)
76838
+ :where([data-block='event-registration'])
76839
+ .er-booking-bar__status-title {
76840
+ flex: 0 0 auto;
76841
+ font-weight: 700;
76842
+ color: var(--rb-surface-text-color, rgb(var(--tb-text)));
76843
+ }
76844
+
76845
+ @container rb-site (max-width: 639px) {
76846
+ @scope ([data-rb-responsive-mode="container"]) to (:scope [data-rb-responsive-mode]) {
76847
+ /* Phones: the title or status on the first line, the facts smaller and
76848
+ quieter below it, beside a compact button (issue 1581). */
76849
+ :where(.theme-scope:is(*, :scope))
76850
+ :where([data-block='event-registration'])
76851
+ .er-booking-bar__info {
76852
+ flex-direction: column;
76853
+ align-items: flex-start;
76854
+ gap: 0.125rem;
76855
+ }
76856
+
76857
+ :where(.theme-scope:is(*, :scope))
76858
+ :where([data-block='event-registration'])
76859
+ .er-booking-bar__title {
76860
+ max-width: 100%;
76861
+ font-family: inherit;
76862
+ font-size: 0.9375rem;
76863
+ font-weight: 700;
76864
+ line-height: 1.25;
76865
+ }
76866
+
76867
+ :where(.theme-scope:is(*, :scope))
76868
+ :where([data-block='event-registration'])
76869
+ .er-booking-bar__meta {
76870
+ max-width: 100%;
76871
+ font-size: 0.8125rem;
76872
+ }
76873
+
76874
+ :where(.theme-scope:is(*, :scope))
76875
+ :where([data-block='event-registration'])
76876
+ .er-booking-bar__divider {
76877
+ margin-inline: 0.5rem;
76878
+ }
76879
+
76880
+ :where(.theme-scope:is(*, :scope))
76881
+ :where([data-block='event-registration'])
76882
+ .er-booking-bar__progress {
76883
+ flex-basis: auto;
76884
+ width: 6rem;
76885
+ }
76886
+
76887
+ :where(.theme-scope:is(*, :scope))
76888
+ :where([data-block='event-registration'])
76889
+ .er-booking-bar__status-text {
76890
+ flex-direction: column;
76891
+ align-items: flex-start;
76892
+ gap: 0.125rem;
76893
+ }
76894
+
76895
+ :where(.theme-scope:is(*, :scope))
76896
+ :where([data-block='event-registration'])
76897
+ .er-booking-overlay__header {
76898
+ row-gap: 0.625rem;
76899
+ padding: 0.875rem 1rem 0.75rem;
76900
+ }
76901
+
76902
+ /* The status and its facts are on separate lines: no rule between them */
76903
+ :where(.theme-scope:is(*, :scope))
76904
+ :where([data-block='event-registration'])
76905
+ .er-booking-bar__status-text > .er-booking-bar__divider {
76906
+ display: none;
76907
+ }
76908
+
76909
+ :where(.theme-scope:is(*, :scope))
76910
+ :where([data-block='event-registration'])
76911
+ .er-booking-bar
76912
+ .er-booking-bar__inner
76913
+ > .er-booking-bar__cta {
76914
+ min-height: 2.5rem;
76915
+ padding: 0.5rem 1rem;
76916
+ font-size: 0.875rem;
76917
+ }
76918
+ }
75653
76919
  }
75654
76920
 
75655
76921
  :where(.theme-scope)
@@ -75676,7 +76942,9 @@ const containerResponsiveThemeCss = `/*
75676
76942
  height: 100dvh;
75677
76943
  min-height: 0;
75678
76944
  overflow: hidden;
75679
- background: rgb(var(--tb-background));
76945
+ /* Surface, like the card, the bar and the system page's column, and what
76946
+ the embedded Stripe checkout is branded with (checkoutBranding.ts). */
76947
+ background: rgb(var(--tb-surface));
75680
76948
  /* Foreground and button context: theme-core/src/blocks/opaquePanels.ts. */
75681
76949
  }
75682
76950
 
@@ -75686,36 +76954,70 @@ const containerResponsiveThemeCss = `/*
75686
76954
  flex: 0 0 auto;
75687
76955
  z-index: 2;
75688
76956
  display: flex;
75689
- align-items: center;
76957
+ flex-wrap: wrap;
76958
+ align-items: flex-start;
75690
76959
  justify-content: space-between;
75691
- gap: 1rem;
75692
- padding: 1rem;
75693
- background: rgb(var(--tb-background));
76960
+ gap: 0.875rem 1rem;
76961
+ padding: 1.125rem 1.25rem 1rem;
76962
+ background: rgb(var(--tb-surface));
75694
76963
  border-bottom: 1px solid var(--er-border);
75695
76964
  }
75696
76965
 
76966
+ :where(.theme-scope)
76967
+ :where([data-block='event-registration'])
76968
+ .er-booking-overlay__progress {
76969
+ /* Pinned under the title, so the step stays in view while the step scrolls
76970
+ (issue 1581). It takes the header's full width, on its own row. */
76971
+ flex: 1 0 100%;
76972
+ }
76973
+
76974
+ :where(.theme-scope)
76975
+ :where([data-block='event-registration'])
76976
+ .er-booking-overlay__progress
76977
+ .rb-progress {
76978
+ margin-bottom: 0;
76979
+ }
76980
+
76981
+ :where(.theme-scope)
76982
+ :where([data-block='event-registration'])
76983
+ .er-booking-overlay__heading {
76984
+ display: flex;
76985
+ flex-direction: column;
76986
+ gap: 0.25rem;
76987
+ min-width: 0;
76988
+ }
76989
+
75697
76990
  :where(.theme-scope)
75698
76991
  :where([data-block='event-registration'])
75699
76992
  .er-booking-overlay__title {
75700
76993
  margin: 0;
75701
- font-size: 1rem;
75702
- line-height: 1.25;
75703
- font-weight: 700;
76994
+ font-family: var(--font-heading, inherit);
76995
+ font-size: 1.5rem;
76996
+ line-height: 1.15;
76997
+ }
76998
+
76999
+ :where(.theme-scope)
77000
+ :where([data-block='event-registration'])
77001
+ .er-booking-overlay__subtitle {
77002
+ margin: 0;
77003
+ font-size: 0.875rem;
77004
+ line-height: 1.4;
77005
+ color: var(--rb-reg-on-surface-muted, rgb(var(--tb-text) / 0.75));
75704
77006
  }
75705
77007
 
75706
77008
  :where(.theme-scope)
75707
77009
  :where([data-block='event-registration'])
75708
77010
  .er-booking-overlay__close {
75709
- width: 2rem;
75710
- height: 2rem;
77011
+ flex: 0 0 auto;
77012
+ width: 2.75rem;
77013
+ height: 2.75rem;
75711
77014
  display: inline-flex;
75712
77015
  align-items: center;
75713
77016
  justify-content: center;
75714
77017
  border: 1px solid var(--er-border);
75715
77018
  border-radius: 999px;
75716
77019
  background: transparent;
75717
- color: rgb(var(--tb-text));
75718
- font-size: 1.25rem;
77020
+ color: inherit;
75719
77021
  line-height: 1;
75720
77022
  cursor: pointer;
75721
77023
  }
@@ -75754,7 +77056,71 @@ const containerResponsiveThemeCss = `/*
75754
77056
  .er-payment-layout-main {
75755
77057
  min-height: 0;
75756
77058
  overflow: auto;
75757
- padding: 1rem;
77059
+ padding: 1.25rem;
77060
+ }
77061
+
77062
+ /* Processing, confirmation and error take the whole panel (issue 1581) */
77063
+ :where(.theme-scope)
77064
+ :where([data-block='event-registration'])
77065
+ .er-container--overlay
77066
+ .er-whole-screen {
77067
+ flex: 1 1 auto;
77068
+ display: flex;
77069
+ flex-direction: column;
77070
+ min-height: 0;
77071
+ }
77072
+
77073
+ :where(.theme-scope)
77074
+ :where([data-block='event-registration'])
77075
+ .er-container--overlay
77076
+ .er-whole-screen__body {
77077
+ flex: 1 1 auto;
77078
+ min-height: 0;
77079
+ overflow: auto;
77080
+ padding: 1.5rem 1.25rem;
77081
+ }
77082
+
77083
+ /* The confirmation's one action sits where the steps' Continue does: pinned
77084
+ and full width in the panel, flowing under the content in the aside. */
77085
+ :where(.theme-scope)
77086
+ :where([data-block='event-registration'])
77087
+ .er-whole-screen__footer {
77088
+ margin-top: 1.5rem;
77089
+ }
77090
+
77091
+ :where(.theme-scope)
77092
+ :where([data-block='event-registration'])
77093
+ .er-container--overlay
77094
+ .er-whole-screen__footer {
77095
+ margin-top: 0;
77096
+ }
77097
+
77098
+ :where(.theme-scope)
77099
+ :where([data-block='event-registration'])
77100
+ .er-container--overlay
77101
+ .er-whole-screen__footer
77102
+ .er-whole-screen__action {
77103
+ width: 100%;
77104
+ justify-content: center;
77105
+ }
77106
+
77107
+ /* The header already names the event and its date, so the footer summary
77108
+ drops its title and schedule; the discount keeps just its name. */
77109
+ :where(.theme-scope)
77110
+ :where([data-block='event-registration'])
77111
+ .er-container--overlay
77112
+ :is(.er-summary-bar-event, .er-summary-bar-schedule, .er-summary-bar-discount-detail) {
77113
+ display: none;
77114
+ }
77115
+
77116
+ /* On the date step the chosen date is the news, so it stays. */
77117
+ :where(.theme-scope)
77118
+ :where([data-block='event-registration'])
77119
+ .er-container--overlay
77120
+ .er-summary-bar[data-step='select-event']
77121
+ .er-summary-bar-schedule {
77122
+ display: inline;
77123
+ color: inherit;
75758
77124
  }
75759
77125
 
75760
77126
  :where(.theme-scope)
@@ -75764,9 +77130,9 @@ const containerResponsiveThemeCss = `/*
75764
77130
  position: relative;
75765
77131
  z-index: 3;
75766
77132
  padding: 0.875rem 1rem max(0.875rem, env(safe-area-inset-bottom));
75767
- background: rgb(var(--tb-background));
77133
+ background: rgb(var(--tb-surface));
75768
77134
  border-top: 1px solid var(--er-border);
75769
- box-shadow: 0 -12px 26px rgba(var(--tb-shadow), 0.12);
77135
+ box-shadow: 0 -12px 26px rgb(var(--tb-shadow) / 0.12);
75770
77136
  }
75771
77137
 
75772
77138
  :where(.theme-scope)
@@ -75789,14 +77155,14 @@ const containerResponsiveThemeCss = `/*
75789
77155
  .er-booking-overlay__panel {
75790
77156
  width: min(32rem, 100vw);
75791
77157
  min-height: 100%;
75792
- box-shadow: -16px 0 40px rgba(var(--tb-shadow), 0.22);
77158
+ box-shadow: -16px 0 40px rgb(var(--tb-shadow) / 0.22);
75793
77159
  }
75794
77160
 
75795
77161
  :where(.theme-scope:is(*, :scope))
75796
77162
  :where([data-block='event-registration'])
75797
77163
  .er-container--overlay
75798
77164
  .er-payment-layout-main {
75799
- padding: 1.25rem;
77165
+ padding: 1.5rem;
75800
77166
  }
75801
77167
 
75802
77168
  :where(.theme-scope:is(*, :scope))
@@ -75808,6 +77174,125 @@ const containerResponsiveThemeCss = `/*
75808
77174
  }
75809
77175
  }
75810
77176
 
77177
+ /* The system event page hosts the same panel in its sticky column (issue 1581):
77178
+ from 1024px the steps scroll inside it and the footer stays pinned. */
77179
+ @container rb-site (min-width: 1024px) {
77180
+ @scope ([data-rb-responsive-mode="container"]) to (:scope [data-rb-responsive-mode]) {
77181
+ :where(.theme-scope:is(*, :scope))
77182
+ :where([data-block='event-registration'].event-registration--embedded)
77183
+ .er-container {
77184
+ display: flex;
77185
+ max-height: calc(100dvh - 9rem);
77186
+ min-height: 0;
77187
+ }
77188
+
77189
+ :where(.theme-scope:is(*, :scope))
77190
+ :where([data-block='event-registration'].event-registration--embedded)
77191
+ .er-payment-layout {
77192
+ flex: 1 1 auto;
77193
+ min-height: 0;
77194
+ gap: 0;
77195
+ grid-template-rows: minmax(0, 1fr) auto;
77196
+ grid-template-areas:
77197
+ 'main'
77198
+ 'footer';
77199
+ }
77200
+
77201
+ :where(.theme-scope:is(*, :scope))
77202
+ :where([data-block='event-registration'].event-registration--embedded)
77203
+ .er-payment-layout-main {
77204
+ min-height: 0;
77205
+ overflow: auto;
77206
+ padding-bottom: 1rem;
77207
+ }
77208
+
77209
+ :where(.theme-scope:is(*, :scope))
77210
+ :where([data-block='event-registration'].event-registration--embedded)
77211
+ .er-payment-layout-footer {
77212
+ padding-top: 0.875rem;
77213
+ border-top: 1px solid var(--er-border);
77214
+ }
77215
+
77216
+ :where(.theme-scope:is(*, :scope))
77217
+ :where([data-block='event-registration'].event-registration--embedded)
77218
+ .er-whole-screen {
77219
+ flex: 1 1 auto;
77220
+ display: flex;
77221
+ flex-direction: column;
77222
+ min-height: 0;
77223
+ }
77224
+
77225
+ :where(.theme-scope:is(*, :scope))
77226
+ :where([data-block='event-registration'].event-registration--embedded)
77227
+ .er-whole-screen__body {
77228
+ flex: 1 1 auto;
77229
+ min-height: 0;
77230
+ overflow: auto;
77231
+ }
77232
+ }
77233
+ }
77234
+
77235
+ /* Confirmation summary: only the facts known for certain */
77236
+ :where(.theme-scope)
77237
+ :where([data-block='event-registration'])
77238
+ .er-confirmation-summary {
77239
+ display: flex;
77240
+ flex-direction: column;
77241
+ gap: 0.75rem;
77242
+ margin: 1.5rem 0 0;
77243
+ padding: 1.125rem 1.25rem;
77244
+ border: 1px solid var(--er-border);
77245
+ border-radius: var(--rb-block-radius);
77246
+ font-size: 0.9375rem;
77247
+ }
77248
+
77249
+ :where(.theme-scope)
77250
+ :where([data-block='event-registration'])
77251
+ .er-confirmation-summary__row {
77252
+ display: flex;
77253
+ justify-content: space-between;
77254
+ gap: 1rem;
77255
+ }
77256
+
77257
+ :where(.theme-scope)
77258
+ :where([data-block='event-registration'])
77259
+ .er-confirmation-summary__row dt {
77260
+ color: var(--rb-reg-on-surface-muted, rgb(var(--tb-text) / 0.75));
77261
+ }
77262
+
77263
+ :where(.theme-scope)
77264
+ :where([data-block='event-registration'])
77265
+ .er-confirmation-summary__row dd {
77266
+ margin: 0;
77267
+ font-weight: 700;
77268
+ text-align: end;
77269
+ }
77270
+
77271
+ /* Why passes and memberships are greyed out for more than one place */
77272
+ :where(.theme-scope)
77273
+ :where([data-block='event-registration'])
77274
+ .er-entitlement-note {
77275
+ margin: 0;
77276
+ padding-top: 0.75rem;
77277
+ border-top: 1px solid var(--er-border);
77278
+ font-size: 0.875rem;
77279
+ color: var(--rb-reg-on-surface-muted, rgb(var(--tb-text) / 0.75));
77280
+ }
77281
+
77282
+ :where(.theme-scope)
77283
+ :where([data-block='event-registration'])
77284
+ .er-entitlement-note__action {
77285
+ padding: 0;
77286
+ border: 0;
77287
+ background: none;
77288
+ color: rgb(var(--tb-primary));
77289
+ font: inherit;
77290
+ font-weight: 700;
77291
+ text-decoration: underline;
77292
+ text-underline-offset: 3px;
77293
+ cursor: pointer;
77294
+ }
77295
+
75811
77296
  /* Magic Link Form */
75812
77297
  :where(.theme-scope)
75813
77298
  :where([data-block='event-registration'])
@@ -75883,8 +77368,8 @@ const containerResponsiveThemeCss = `/*
75883
77368
  align-items: flex-start;
75884
77369
  gap: 0.75rem;
75885
77370
  padding: 1rem 1.25rem;
75886
- background: rgba(var(--tb-primary-100), 0.4);
75887
- border: 1px solid rgba(var(--tb-primary-300), 0.4);
77371
+ background: rgb(var(--tb-primary-100) / 0.4);
77372
+ border: 1px solid rgb(var(--tb-primary-300) / 0.4);
75888
77373
  border-radius: var(--rb-block-radius);
75889
77374
  }
75890
77375
 
@@ -75932,201 +77417,6 @@ const containerResponsiveThemeCss = `/*
75932
77417
  }
75933
77418
 
75934
77419
  /* Selection cards for pass holders */
75935
- :where(.theme-scope)
75936
- :where([data-block='event-registration'])
75937
- .er-booking-mode-cards {
75938
- display: grid;
75939
- grid-template-columns: repeat(auto-fit, minmax(200px, 1fr));
75940
- gap: 1rem;
75941
- }
75942
-
75943
- :where(.theme-scope)
75944
- :where([data-block='event-registration'])
75945
- .er-booking-mode-card {
75946
- display: flex;
75947
- flex-direction: column;
75948
- align-items: center;
75949
- gap: 0.5rem;
75950
- padding: 1.25rem 1rem;
75951
- border: 2px solid var(--er-payment-border);
75952
- border-radius: var(--rb-block-radius);
75953
- background: transparent;
75954
- cursor: pointer;
75955
- text-align: center;
75956
- position: relative;
75957
- transition:
75958
- border-color var(--rb-block-transition) ease,
75959
- background-color var(--rb-block-transition) ease;
75960
- }
75961
-
75962
- :where(.theme-scope)
75963
- :where([data-block='event-registration'])
75964
- .er-booking-mode-card:hover:not([aria-disabled='true']) {
75965
- border-color: var(--er-payment-border-hover);
75966
- }
75967
-
75968
- :where(.theme-scope)
75969
- :where([data-block='event-registration'])
75970
- .er-booking-mode-card--selected {
75971
- border-color: var(--er-payment-border-selected);
75972
- background-color: var(--er-payment-bg-selected);
75973
- }
75974
-
75975
- :where(.theme-scope)
75976
- :where([data-block='event-registration'])
75977
- .er-booking-mode-card--disabled {
75978
- opacity: 1;
75979
- cursor: not-allowed;
75980
- border-color: var(--er-payment-border);
75981
- background: transparent;
75982
- }
75983
-
75984
- :where(.theme-scope)
75985
- :where([data-block='event-registration'])
75986
- .er-booking-mode-card--disabled.er-booking-mode-card--selected {
75987
- border-color: var(--er-payment-border);
75988
- background: transparent;
75989
- }
75990
-
75991
- :where(.theme-scope)
75992
- :where([data-block='event-registration'])
75993
- .er-booking-mode-card--disabled
75994
- > :not(.er-booking-mode-tooltip) {
75995
- opacity: 0.55;
75996
- }
75997
-
75998
- :where(.theme-scope)
75999
- :where([data-block='event-registration'])
76000
- .er-booking-mode-card--disabled:hover {
76001
- border-color: var(--er-payment-border);
76002
- }
76003
-
76004
- :where(.theme-scope)
76005
- :where([data-block='event-registration'])
76006
- .er-booking-mode-card--disabled
76007
- .er-booking-mode-card-icon,
76008
- :where(.theme-scope)
76009
- :where([data-block='event-registration'])
76010
- .er-booking-mode-card--disabled
76011
- .er-booking-mode-card-label {
76012
- color: var(--er-on-surface-disabled);
76013
- }
76014
-
76015
- :where(.theme-scope)
76016
- :where([data-block='event-registration'])
76017
- .er-booking-mode-card--disabled
76018
- .er-booking-mode-card-detail {
76019
- color: var(--er-on-surface-disabled-detail);
76020
- }
76021
-
76022
- :where(.theme-scope)
76023
- :where([data-block='event-registration'])
76024
- .er-booking-mode-card-icon {
76025
- font-size: 1.75rem;
76026
- line-height: 1;
76027
- /* SVG icon sizing */
76028
- display: flex;
76029
- align-items: center;
76030
- justify-content: center;
76031
- }
76032
-
76033
- :where(.theme-scope)
76034
- :where([data-block='event-registration'])
76035
- .er-booking-mode-card-icon
76036
- svg {
76037
- width: 24px;
76038
- height: 24px;
76039
- color: currentColor;
76040
- }
76041
-
76042
- :where(.theme-scope)
76043
- :where([data-block='event-registration'])
76044
- .er-booking-mode-card-label {
76045
- font-weight: 600;
76046
- font-size: 1rem;
76047
- line-height: 1.3;
76048
- }
76049
-
76050
- :where(.theme-scope)
76051
- :where([data-block='event-registration'])
76052
- .er-booking-mode-card-detail {
76053
- font-size: 0.875rem;
76054
- color: var(--er-on-surface-subtle);
76055
- line-height: 1.3;
76056
- }
76057
-
76058
- :where(.theme-scope)
76059
- :where([data-block='event-registration'])
76060
- .er-booking-mode-card-check {
76061
- position: absolute;
76062
- top: 0.5rem;
76063
- right: 0.5rem;
76064
- }
76065
-
76066
- /* Alternative link in booking mode */
76067
- :where(.theme-scope)
76068
- :where([data-block='event-registration'])
76069
- .er-booking-mode-alt {
76070
- margin-top: 1rem;
76071
- text-align: center;
76072
- }
76073
-
76074
- :where(.theme-scope)
76075
- :where([data-block='event-registration'])
76076
- .er-booking-mode-alt-link {
76077
- background: none;
76078
- border: none;
76079
- padding: 0;
76080
- font-size: 0.9375rem;
76081
- color: rgb(var(--tb-primary));
76082
- cursor: pointer;
76083
- text-decoration: underline;
76084
- text-underline-offset: 2px;
76085
- }
76086
-
76087
- :where(.theme-scope)
76088
- :where([data-block='event-registration'])
76089
- .er-booking-mode-alt-link:hover {
76090
- text-decoration: none;
76091
- }
76092
-
76093
- /* Tooltip styling for disabled options */
76094
- :where(.theme-scope)
76095
- :where([data-block='event-registration'])
76096
- .er-booking-mode-card[aria-disabled='true'] {
76097
- position: relative;
76098
- }
76099
-
76100
- /* Tooltip appears on hover for disabled cards */
76101
- :where(.theme-scope)
76102
- :where([data-block='event-registration'])
76103
- .er-booking-mode-tooltip {
76104
- display: none;
76105
- position: absolute;
76106
- bottom: 100%;
76107
- left: 50%;
76108
- transform: translateX(-50%);
76109
- margin-bottom: 0.5rem;
76110
- padding: 0.5rem 0.75rem;
76111
- background: rgb(var(--tb-text));
76112
- color: rgb(var(--tb-background));
76113
- font-size: 0.8125rem;
76114
- font-weight: 500;
76115
- border-radius: calc(var(--rb-block-radius) * 0.5);
76116
- white-space: normal;
76117
- max-width: 16rem;
76118
- line-height: 1.35;
76119
- text-align: center;
76120
- box-shadow: 0 8px 20px rgba(var(--tb-shadow), 0.28);
76121
- z-index: 10;
76122
- }
76123
-
76124
- :where(.theme-scope)
76125
- :where([data-block='event-registration'])
76126
- .er-booking-mode-card--disabled:hover
76127
- .er-booking-mode-tooltip {
76128
- display: block;
76129
- }
76130
77420
 
76131
77421
  /* =============================================================================
76132
77422
  * Block: Event Calendar
@@ -76355,7 +77645,7 @@ const containerResponsiveThemeCss = `/*
76355
77645
  :where(.theme-scope)
76356
77646
  :where([data-block='event-calendar'])
76357
77647
  .event-calendar-more:hover {
76358
- background-color: rgba(var(--tb-primary), 0.1);
77648
+ background-color: rgb(var(--tb-primary) / 0.1);
76359
77649
  }
76360
77650
 
76361
77651
  :where(.theme-scope)
@@ -76429,7 +77719,7 @@ const containerResponsiveThemeCss = `/*
76429
77719
  :where(.theme-scope)
76430
77720
  :where([data-block='event-calendar'])
76431
77721
  .event-category-btn:hover:not(:disabled) {
76432
- border-color: rgba(var(--tb-primary), 0.5);
77722
+ border-color: rgb(var(--tb-primary) / 0.5);
76433
77723
  }
76434
77724
 
76435
77725
  :where(.theme-scope)
@@ -76502,7 +77792,7 @@ const containerResponsiveThemeCss = `/*
76502
77792
  :where([data-block='event-calendar'])
76503
77793
  .event-calendar-view-btn:hover {
76504
77794
  opacity: 1;
76505
- border-color: rgba(var(--tb-primary), 0.5);
77795
+ border-color: rgb(var(--tb-primary) / 0.5);
76506
77796
  }
76507
77797
 
76508
77798
  :where(.theme-scope)
@@ -76619,7 +77909,7 @@ const containerResponsiveThemeCss = `/*
76619
77909
  :where(.theme-scope)
76620
77910
  :where([data-block='event-calendar'])
76621
77911
  .event-agenda-card:hover {
76622
- border-color: rgba(var(--tb-primary), 0.5);
77912
+ border-color: rgb(var(--tb-primary) / 0.5);
76623
77913
  background-color: var(--ec-event-bg);
76624
77914
  }
76625
77915
 
@@ -77068,7 +78358,7 @@ const containerResponsiveThemeCss = `/*
77068
78358
  border-left-width: 4px;
77069
78359
  border-radius: calc(var(--rb-block-radius) / 1.5);
77070
78360
  background-color: var(--ec-surface);
77071
- box-shadow: 0 1px 2px rgba(var(--tb-text), 0.08);
78361
+ box-shadow: 0 1px 2px rgb(var(--tb-text) / 0.08);
77072
78362
  cursor: pointer;
77073
78363
  font: inherit;
77074
78364
  text-align: left;
@@ -77082,7 +78372,7 @@ const containerResponsiveThemeCss = `/*
77082
78372
  :where(.theme-scope)
77083
78373
  :where([data-block='event-calendar'])
77084
78374
  .event-timetable-event:hover {
77085
- box-shadow: 0 4px 12px rgba(var(--tb-text), 0.12);
78375
+ box-shadow: 0 4px 12px rgb(var(--tb-text) / 0.12);
77086
78376
  transform: translateY(-1px);
77087
78377
  }
77088
78378
 
@@ -77234,7 +78524,7 @@ const containerResponsiveThemeCss = `/*
77234
78524
  * available -> secondary, filling -> accent, waitlist -> muted text. */
77235
78525
  --ec-status-available: rgb(var(--tb-secondary));
77236
78526
  --ec-status-filling: rgb(var(--tb-accent));
77237
- --ec-status-waitlist: rgba(var(--tb-text), 0.4);
78527
+ --ec-status-waitlist: rgb(var(--tb-text) / 0.4);
77238
78528
  --event-week-board-cols: 7;
77239
78529
 
77240
78530
  border: 1px solid var(--ec-border);
@@ -77248,7 +78538,7 @@ const containerResponsiveThemeCss = `/*
77248
78538
  :where(.theme-scope)
77249
78539
  :where([data-block='event-calendar'])
77250
78540
  .event-week-board[data-elevated] {
77251
- box-shadow: 0 14px 34px -24px rgba(var(--tb-text), 0.35);
78541
+ box-shadow: 0 14px 34px -24px rgb(var(--tb-text) / 0.35);
77252
78542
  }
77253
78543
 
77254
78544
  /* Top bar: authored title + week navigation + legend */
@@ -77521,8 +78811,8 @@ const containerResponsiveThemeCss = `/*
77521
78811
  :where([data-block='event-calendar'])
77522
78812
  .event-week-board-card:hover {
77523
78813
  transform: translateY(-2px);
77524
- box-shadow: 0 6px 16px -8px rgba(var(--tb-text), 0.28);
77525
- border-color: rgba(var(--tb-primary), 0.4);
78814
+ box-shadow: 0 6px 16px -8px rgb(var(--tb-text) / 0.28);
78815
+ border-color: rgb(var(--tb-primary) / 0.4);
77526
78816
  }
77527
78817
 
77528
78818
  :where(.theme-scope)
@@ -77565,24 +78855,24 @@ const containerResponsiveThemeCss = `/*
77565
78855
  * Filling -> amber and waitlist -> muted outline are handled by the
77566
78856
  * data-status overrides below. */
77567
78857
  border: 1px solid var(--ec-border);
77568
- background-color: rgba(var(--tb-text), 0.06);
77569
- color: rgba(var(--tb-text), 0.62);
78858
+ background-color: rgb(var(--tb-text) / 0.06);
78859
+ color: rgb(var(--tb-text) / 0.62);
77570
78860
  border-color: var(--ec-border);
77571
78861
  }
77572
78862
 
77573
78863
  :where(.theme-scope)
77574
78864
  :where([data-block='event-calendar'])
77575
78865
  .event-week-board-card-pill[data-status='filling'] {
77576
- background-color: rgba(var(--tb-accent), 0.14);
78866
+ background-color: rgb(var(--tb-accent) / 0.14);
77577
78867
  color: var(--ec-status-filling);
77578
- border-color: rgba(var(--tb-accent), 0.32);
78868
+ border-color: rgb(var(--tb-accent) / 0.32);
77579
78869
  }
77580
78870
 
77581
78871
  :where(.theme-scope)
77582
78872
  :where([data-block='event-calendar'])
77583
78873
  .event-week-board-card-pill[data-status='waitlist'] {
77584
78874
  background-color: transparent;
77585
- color: rgba(var(--tb-text), 0.6);
78875
+ color: rgb(var(--tb-text) / 0.6);
77586
78876
  border-color: var(--ec-border);
77587
78877
  }
77588
78878
 
@@ -77867,7 +79157,7 @@ const containerResponsiveThemeCss = `/*
77867
79157
  :where([data-block='event-calendar'])
77868
79158
  .ec-modal-close:hover {
77869
79159
  opacity: 1;
77870
- background-color: rgba(var(--tb-text), 0.1);
79160
+ background-color: rgb(var(--tb-text) / 0.1);
77871
79161
  }
77872
79162
 
77873
79163
  :where(.theme-scope)
@@ -78110,23 +79400,24 @@ const containerResponsiveThemeCss = `/*
78110
79400
  }
78111
79401
 
78112
79402
  /* State icon color variants (layout from registration-surface.css) */
79403
+ /* Success: a solid primary disc with an on-primary tick (issue 1581) */
78113
79404
  :where(.theme-scope) :where([data-block="appointment-booking"]) .rb-state-icon--success {
78114
- background: var(--ab-success-bg, rgba(var(--tb-success, 22 163 74), 0.1));
78115
- color: var(--ab-success-text, rgb(var(--tb-success, 22 163 74)));
79405
+ background: rgb(var(--tb-primary, 37 99 235));
79406
+ color: rgb(var(--tb-onPrimary, 255 255 255));
78116
79407
  }
78117
79408
 
78118
79409
  :where(.theme-scope) :where([data-block="appointment-booking"]) .rb-state-icon--error {
78119
- background: var(--ab-error-bg, rgba(var(--tb-destructive, 220 38 38), 0.1));
79410
+ background: var(--ab-error-bg, rgb(var(--tb-destructive, 220 38 38) / 0.1));
78120
79411
  color: var(--ab-error-text, rgb(var(--tb-destructive, 220 38 38)));
78121
79412
  }
78122
79413
 
78123
79414
  :where(.theme-scope) :where([data-block="appointment-booking"]) .rb-state-icon--info {
78124
- background: var(--ab-info-bg, rgba(var(--tb-info, 14 165 233), 0.1));
79415
+ background: var(--ab-info-bg, rgb(var(--tb-info, 14 165 233) / 0.1));
78125
79416
  color: var(--ab-info-text, rgb(var(--tb-info, 14 165 233)));
78126
79417
  }
78127
79418
 
78128
79419
  :where(.theme-scope) :where([data-block="appointment-booking"]) .rb-state-icon--warning {
78129
- background: var(--ab-warning-bg, rgba(var(--tb-warning, 245 158 11), 0.1));
79420
+ background: var(--ab-warning-bg, rgb(var(--tb-warning, 245 158 11) / 0.1));
78130
79421
  color: var(--ab-warning-text, rgb(var(--tb-warning, 245 158 11)));
78131
79422
  }
78132
79423
 
@@ -78168,7 +79459,7 @@ const containerResponsiveThemeCss = `/*
78168
79459
  letter-spacing: 0;
78169
79460
  line-height: 1.2;
78170
79461
  text-transform: uppercase;
78171
- color: var(--rb-reg-on-surface-subtle, rgba(var(--tb-onSurface, var(--tb-text, 15 23 42)), 0.6));
79462
+ color: var(--rb-reg-on-surface-subtle, rgb(var(--tb-onSurface, var(--tb-text, 15 23 42)) / 0.6));
78172
79463
  }
78173
79464
 
78174
79465
  :where(.theme-scope) :where([data-block="appointment-booking"]) .ab-pill-value {
@@ -78785,11 +80076,11 @@ const containerResponsiveThemeCss = `/*
78785
80076
  height: 2.5rem;
78786
80077
  width: 2.5rem;
78787
80078
  border-radius: 9999px;
78788
- border: 1px solid rgba(var(--tb-border, 229 231 235), 0.35);
78789
- background-color: rgba(var(--tb-surface, 248 250 252), 0.9);
80079
+ border: 1px solid rgb(var(--tb-border, 229 231 235) / 0.35);
80080
+ background-color: rgb(var(--tb-surface, 248 250 252) / 0.9);
78790
80081
  color: rgb(var(--tb-text, 17 24 39));
78791
- box-shadow: 0 4px 6px -1px rgba(var(--tb-shadow), 0.1),
78792
- 0 2px 4px -2px rgba(var(--tb-shadow), 0.1);
80082
+ box-shadow: 0 4px 6px -1px rgb(var(--tb-shadow) / 0.1),
80083
+ 0 2px 4px -2px rgb(var(--tb-shadow) / 0.1);
78793
80084
  cursor: pointer;
78794
80085
  transform: translateY(-50%);
78795
80086
  transition: background-color 0.2s ease, box-shadow 0.2s ease,
@@ -78806,8 +80097,8 @@ const containerResponsiveThemeCss = `/*
78806
80097
 
78807
80098
  :where(.theme-scope) .carousel-root .carousel-nav-btn:hover {
78808
80099
  background-color: rgb(var(--tb-surface, 248 250 252));
78809
- box-shadow: 0 10px 15px -3px rgba(var(--tb-shadow), 0.1),
78810
- 0 4px 6px -4px rgba(var(--tb-shadow), 0.1);
80100
+ box-shadow: 0 10px 15px -3px rgb(var(--tb-shadow) / 0.1),
80101
+ 0 4px 6px -4px rgb(var(--tb-shadow) / 0.1);
78811
80102
  }
78812
80103
 
78813
80104
  :where(.theme-scope) .carousel-root .carousel-nav-btn:disabled {
@@ -78856,10 +80147,10 @@ const containerResponsiveThemeCss = `/*
78856
80147
  }
78857
80148
 
78858
80149
  :where(.theme-scope) .carousel-root.rb-carousel-dots-overlay .carousel-dot {
78859
- background-color: rgba(var(--tb-surface, 248 250 252), 0.55);
80150
+ background-color: rgb(var(--tb-surface, 248 250 252) / 0.55);
78860
80151
  }
78861
80152
  :where(.theme-scope) .carousel-root.rb-carousel-dots-overlay .carousel-dot:hover {
78862
- background-color: rgba(var(--tb-surface, 248 250 252), 0.75);
80153
+ background-color: rgb(var(--tb-surface, 248 250 252) / 0.75);
78863
80154
  }
78864
80155
  :where(.theme-scope) .carousel-root.rb-carousel-dots-overlay .carousel-dot[data-active="true"] {
78865
80156
  background-color: rgb(var(--tb-text, 17 24 39));
@@ -78875,7 +80166,7 @@ const containerResponsiveThemeCss = `/*
78875
80166
  }
78876
80167
 
78877
80168
  :where(.theme-scope) .carousel-root .carousel-dot:hover {
78878
- background-color: rgba(var(--tb-text, 17 24 39), 0.3);
80169
+ background-color: rgb(var(--tb-text, 17 24 39) / 0.3);
78879
80170
  }
78880
80171
 
78881
80172
  :where(.theme-scope) .carousel-root .carousel-dot[data-active="true"] {
@@ -78884,7 +80175,7 @@ const containerResponsiveThemeCss = `/*
78884
80175
 
78885
80176
  :where(.theme-scope) .carousel-root .carousel-dot:focus-visible {
78886
80177
  outline: none;
78887
- box-shadow: 0 0 0 3px rgba(var(--tb-primary, 59 130 246), 0.35);
80178
+ box-shadow: 0 0 0 3px rgb(var(--tb-primary, 59 130 246) / 0.35);
78888
80179
  }
78889
80180
 
78890
80181
  /* =============================================================================
@@ -78921,7 +80212,7 @@ const containerResponsiveThemeCss = `/*
78921
80212
 
78922
80213
  /* Error display */
78923
80214
  :where(.theme-scope) .shop__error {
78924
- background-color: rgba(var(--tb-destructive), 0.1);
80215
+ background-color: rgb(var(--tb-destructive) / 0.1);
78925
80216
  color: rgb(var(--tb-destructive));
78926
80217
  padding: 0.75rem 1rem;
78927
80218
  border-radius: var(--shop-control-radius);
@@ -79193,7 +80484,7 @@ const containerResponsiveThemeCss = `/*
79193
80484
 
79194
80485
  /* Modal error */
79195
80486
  :where(.theme-scope) .shop__modal-error {
79196
- background-color: rgba(var(--tb-destructive), 0.1);
80487
+ background-color: rgb(var(--tb-destructive) / 0.1);
79197
80488
  color: rgb(var(--tb-destructive));
79198
80489
  padding: 0.625rem 0.75rem;
79199
80490
  border-radius: var(--shop-control-radius);
@@ -79245,12 +80536,12 @@ const containerResponsiveThemeCss = `/*
79245
80536
  }
79246
80537
 
79247
80538
  :where(.theme-scope) :where([data-block="shop"]) .rb-state-icon--success {
79248
- background: rgba(var(--tb-success), 0.12);
80539
+ background: rgb(var(--tb-success) / 0.12);
79249
80540
  color: rgb(var(--tb-success));
79250
80541
  }
79251
80542
 
79252
80543
  :where(.theme-scope) :where([data-block="shop"]) .rb-state-icon--warning {
79253
- background: rgba(var(--tb-warning), 0.12);
80544
+ background: rgb(var(--tb-warning) / 0.12);
79254
80545
  color: rgb(var(--tb-warning));
79255
80546
  }
79256
80547
 
@@ -79752,7 +81043,7 @@ const containerResponsiveThemeCss = `/*
79752
81043
 
79753
81044
  :where(.theme-scope) :where([data-block="customer-portal"]) .cp-table thead th {
79754
81045
  text-align: left;
79755
- background: rgba(var(--tb-border), 0.2);
81046
+ background: rgb(var(--tb-border) / 0.2);
79756
81047
  }
79757
81048
 
79758
81049
  :where(.theme-scope)
@@ -80593,17 +81884,17 @@ const containerResponsiveThemeCss = `/*
80593
81884
 
80594
81885
  :where(.theme-scope) :where(.rb-tile--interactive, .er-event-card):focus-visible {
80595
81886
  outline: none;
80596
- box-shadow: 0 0 0 3px rgba(var(--tb-primary), 0.25);
81887
+ box-shadow: 0 0 0 3px rgb(var(--tb-primary) / 0.25);
80597
81888
  }
80598
81889
 
80599
81890
  :where(.theme-scope) :where(.rb-tile--interactive, .er-event-card):hover:not(:disabled) {
80600
- border-color: var(--rb-tile-border-hover, var(--rb-event-tile-border-hover, rgba(var(--tb-primary), 0.5)));
81891
+ border-color: var(--rb-tile-border-hover, var(--rb-event-tile-border-hover, rgb(var(--tb-primary) / 0.5)));
80601
81892
  opacity: var(--rb-tile-hover-opacity, var(--rb-event-tile-hover-opacity, var(--rb-tile-opacity, var(--rb-event-tile-opacity, 1))));
80602
81893
  }
80603
81894
 
80604
81895
  :where(.theme-scope) :where(.rb-tile--selected, .er-event-card--selected) {
80605
81896
  border-color: var(--rb-tile-border-selected, var(--rb-event-tile-border-selected, rgb(var(--tb-primary))));
80606
- background: var(--rb-tile-bg-selected, var(--rb-event-tile-bg-selected, rgba(var(--tb-primary), 0.1)));
81897
+ background: var(--rb-tile-bg-selected, var(--rb-event-tile-bg-selected, rgb(var(--tb-primary) / 0.1)));
80607
81898
  }
80608
81899
 
80609
81900
  :where(.theme-scope) :where(.rb-tile--disabled, .er-event-card--disabled) {
@@ -80917,7 +82208,7 @@ const containerResponsiveThemeCss = `/*
80917
82208
 
80918
82209
  :where(.theme-scope) .newsletter-success .fb-success {
80919
82210
  padding: 1rem 1.5rem;
80920
- background-color: rgba(var(--tb-success, 34 197 94), 0.1);
82211
+ background-color: rgb(var(--tb-success, 34 197 94) / 0.1);
80921
82212
  border-radius: var(--radius-md, 0.5rem);
80922
82213
  color: rgb(var(--tb-text));
80923
82214
  }
@@ -81189,7 +82480,7 @@ const containerResponsiveThemeCss = `/*
81189
82480
  * context (theme-core/src/blocks/opaquePanels.ts) hold on any section. */
81190
82481
  :where(.theme-scope) .feedback-callout {
81191
82482
  background: rgb(var(--tb-surface, 248 250 252));
81192
- border-color: rgba(var(--tb-border, 226 232 240), 0.72);
82483
+ border-color: rgb(var(--tb-border, 226 232 240) / 0.72);
81193
82484
  --rb-feedback-callout-bg-opacity: 0.1;
81194
82485
  --rb-feedback-callout-border-opacity: 0.24;
81195
82486
  }
@@ -81197,33 +82488,33 @@ const containerResponsiveThemeCss = `/*
81197
82488
  :where(.theme-scope) .feedback-callout[data-feedback-tone="info"] {
81198
82489
  --rb-feedback-callout-bg-opacity: 0.08;
81199
82490
  background:
81200
- linear-gradient(rgba(var(--tb-primary, 37 99 235), var(--rb-feedback-callout-bg-opacity)), rgba(var(--tb-primary, 37 99 235), var(--rb-feedback-callout-bg-opacity))),
82491
+ linear-gradient(rgb(var(--tb-primary, 37 99 235) / var(--rb-feedback-callout-bg-opacity)), rgb(var(--tb-primary, 37 99 235) / var(--rb-feedback-callout-bg-opacity))),
81201
82492
  rgb(var(--tb-surface, 248 250 252));
81202
- border-color: rgba(var(--tb-primary, 37 99 235), var(--rb-feedback-callout-border-opacity));
82493
+ border-color: rgb(var(--tb-primary, 37 99 235) / var(--rb-feedback-callout-border-opacity));
81203
82494
  }
81204
82495
 
81205
82496
  :where(.theme-scope) .feedback-callout[data-feedback-tone="success"] {
81206
82497
  background:
81207
- linear-gradient(rgba(var(--tb-success, 34 197 94), var(--rb-feedback-callout-bg-opacity)), rgba(var(--tb-success, 34 197 94), var(--rb-feedback-callout-bg-opacity))),
82498
+ linear-gradient(rgb(var(--tb-success, 34 197 94) / var(--rb-feedback-callout-bg-opacity)), rgb(var(--tb-success, 34 197 94) / var(--rb-feedback-callout-bg-opacity))),
81208
82499
  rgb(var(--tb-surface, 248 250 252));
81209
- border-color: rgba(var(--tb-success, 34 197 94), var(--rb-feedback-callout-border-opacity));
82500
+ border-color: rgb(var(--tb-success, 34 197 94) / var(--rb-feedback-callout-border-opacity));
81210
82501
  }
81211
82502
 
81212
82503
  :where(.theme-scope) .feedback-callout[data-feedback-tone="warning"] {
81213
82504
  --rb-feedback-callout-bg-opacity: 0.12;
81214
82505
  --rb-feedback-callout-border-opacity: 0.28;
81215
82506
  background:
81216
- linear-gradient(rgba(var(--tb-warning, 245 158 11), var(--rb-feedback-callout-bg-opacity)), rgba(var(--tb-warning, 245 158 11), var(--rb-feedback-callout-bg-opacity))),
82507
+ linear-gradient(rgb(var(--tb-warning, 245 158 11) / var(--rb-feedback-callout-bg-opacity)), rgb(var(--tb-warning, 245 158 11) / var(--rb-feedback-callout-bg-opacity))),
81217
82508
  rgb(var(--tb-surface, 248 250 252));
81218
- border-color: rgba(var(--tb-warning, 245 158 11), var(--rb-feedback-callout-border-opacity));
82509
+ border-color: rgb(var(--tb-warning, 245 158 11) / var(--rb-feedback-callout-border-opacity));
81219
82510
  }
81220
82511
 
81221
82512
  :where(.theme-scope) .feedback-callout[data-feedback-tone="error"] {
81222
82513
  --rb-feedback-callout-border-opacity: 0.26;
81223
82514
  background:
81224
- linear-gradient(rgba(var(--tb-destructive, 239 68 68), var(--rb-feedback-callout-bg-opacity)), rgba(var(--tb-destructive, 239 68 68), var(--rb-feedback-callout-bg-opacity))),
82515
+ linear-gradient(rgb(var(--tb-destructive, 239 68 68) / var(--rb-feedback-callout-bg-opacity)), rgb(var(--tb-destructive, 239 68 68) / var(--rb-feedback-callout-bg-opacity))),
81225
82516
  rgb(var(--tb-surface, 248 250 252));
81226
- border-color: rgba(var(--tb-destructive, 239 68 68), var(--rb-feedback-callout-border-opacity));
82517
+ border-color: rgb(var(--tb-destructive, 239 68 68) / var(--rb-feedback-callout-border-opacity));
81227
82518
  }
81228
82519
 
81229
82520
  :where(.theme-scope) .feedback-callout__title {
@@ -81294,7 +82585,7 @@ const containerResponsiveThemeCss = `/*
81294
82585
  }
81295
82586
 
81296
82587
  :where(.theme-scope) .event-compact-row:hover {
81297
- background-color: rgba(var(--tb-primary, 0 0 0), 0.035);
82588
+ background-color: rgb(var(--tb-primary, 0 0 0) / 0.035);
81298
82589
  }
81299
82590
 
81300
82591
  :where(.theme-scope) .event-compact-row-date {
@@ -81702,23 +82993,23 @@ const containerResponsiveThemeCss = `/*
81702
82993
  }
81703
82994
 
81704
82995
  :where(.theme-scope) [data-block="gifting"] .gifting-feedback[data-feedback-tone="success"] {
81705
- border-color: rgba(var(--tb-success, 34 197 94), 0.3);
82996
+ border-color: rgb(var(--tb-success, 34 197 94) / 0.3);
81706
82997
  background:
81707
- linear-gradient(rgba(var(--tb-success, 34 197 94), 0.1), rgba(var(--tb-success, 34 197 94), 0.1)),
82998
+ linear-gradient(rgb(var(--tb-success, 34 197 94) / 0.1), rgb(var(--tb-success, 34 197 94) / 0.1)),
81708
82999
  rgb(var(--tb-surface, 255 255 255));
81709
83000
  }
81710
83001
 
81711
83002
  :where(.theme-scope) [data-block="gifting"] .gifting-feedback[data-feedback-tone="warning"] {
81712
- border-color: rgba(var(--tb-warning, 245 158 11), 0.35);
83003
+ border-color: rgb(var(--tb-warning, 245 158 11) / 0.35);
81713
83004
  background:
81714
- linear-gradient(rgba(var(--tb-warning, 245 158 11), 0.12), rgba(var(--tb-warning, 245 158 11), 0.12)),
83005
+ linear-gradient(rgb(var(--tb-warning, 245 158 11) / 0.12), rgb(var(--tb-warning, 245 158 11) / 0.12)),
81715
83006
  rgb(var(--tb-surface, 255 255 255));
81716
83007
  }
81717
83008
 
81718
83009
  :where(.theme-scope) [data-block="gifting"] .gifting-feedback[data-feedback-tone="error"] {
81719
- border-color: rgba(var(--tb-destructive, 239 68 68), 0.3);
83010
+ border-color: rgb(var(--tb-destructive, 239 68 68) / 0.3);
81720
83011
  background:
81721
- linear-gradient(rgba(var(--tb-destructive, 239 68 68), 0.1), rgba(var(--tb-destructive, 239 68 68), 0.1)),
83012
+ linear-gradient(rgb(var(--tb-destructive, 239 68 68) / 0.1), rgb(var(--tb-destructive, 239 68 68) / 0.1)),
81722
83013
  rgb(var(--tb-surface, 255 255 255));
81723
83014
  }
81724
83015
 
@@ -81832,7 +83123,7 @@ const containerResponsiveThemeCss = `/*
81832
83123
  :where(.theme-scope) .rb-feature-card-icon-zone--utility-badge {
81833
83124
  background-color: rgb(var(--tb-surface));
81834
83125
  border: 1px solid rgb(var(--tb-border));
81835
- box-shadow: 0 1px 2px rgba(var(--tb-shadow), 0.08);
83126
+ box-shadow: 0 1px 2px rgb(var(--tb-shadow) / 0.08);
81836
83127
  }
81837
83128
 
81838
83129
  :where(.theme-scope) .rb-feature-card-icon {
@@ -82621,7 +83912,7 @@ const containerResponsiveThemeCss = `/*
82621
83912
  grid-template-columns: minmax(5.5rem, 0.65fr) minmax(0, 1.35fr);
82622
83913
  gap: 1rem;
82623
83914
  padding-block: 0.6rem;
82624
- border-top: 1px solid rgba(var(--tb-border), 0.72);
83915
+ border-top: 1px solid rgb(var(--tb-border) / 0.72);
82625
83916
  }
82626
83917
 
82627
83918
  :where(.theme-scope)
@@ -82861,13 +84152,13 @@ const containerResponsiveThemeCss = `/*
82861
84152
  :where(.theme-scope) [data-block="testimonials"][data-block-composition="open-editorial"] .rb-testimonial-attribution {
82862
84153
  margin-top: 1.25rem;
82863
84154
  padding-top: 1.25rem;
82864
- border-top: 1px solid rgba(var(--tb-border), 0.75);
84155
+ border-top: 1px solid rgb(var(--tb-border) / 0.75);
82865
84156
  }
82866
84157
 
82867
84158
  :where(.theme-scope) [data-block="testimonials"][data-block-composition="open-editorial"] .rb-testimonial-avatar {
82868
84159
  box-shadow:
82869
84160
  0 0 0 2px rgb(var(--tb-surface)),
82870
- 0 0 0 4px rgba(var(--tb-primary), 0.3);
84161
+ 0 0 0 4px rgb(var(--tb-primary) / 0.3);
82871
84162
  }
82872
84163
 
82873
84164
  /* =============================================================================