@riverbankcms/sdk 0.132.0 → 0.135.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 (328) hide show
  1. package/CHANGELOG.md +14 -3
  2. package/README.md +1 -1
  3. package/dist/{PreviewEditorSidebar-DKQ5eFK9.mjs → PreviewEditorSidebar-roNY0GVy.mjs} +4 -4
  4. package/dist/{PreviewEditorUI-CNTcOjCC.mjs → PreviewEditorUI-KboDbEh_.mjs} +3 -3
  5. package/dist/{PreviewQueryProvider-D51gQaG3.mjs → PreviewQueryProvider-DcgaESkm.mjs} +1 -1
  6. package/dist/{SdkPreviewModeRuntime-DJu3qu33.mjs → SdkPreviewModeRuntime-DBrF7Caa.mjs} +48 -17
  7. package/dist/{SiteChromeCustomizeContext-2TzT3vbj.mjs → SiteChromeCustomizeContext-DrIEpJKn.mjs} +4351 -7964
  8. package/dist/_dts/ai/src/contracts/proposals.d.ts +549 -549
  9. package/dist/_dts/ai/src/contracts/siteStyleProposalSchemas.d.ts +234 -234
  10. package/dist/_dts/api/src/accountApi.d.ts +5 -5
  11. package/dist/_dts/api/src/appointmentEndpointDefinitions.d.ts +1 -1
  12. package/dist/_dts/api/src/bookingConfig.d.ts +1 -1
  13. package/dist/_dts/api/src/bookingManagementEndpoints.d.ts +25 -60
  14. package/dist/_dts/api/src/bookingOperations.d.ts +111 -173
  15. package/dist/_dts/api/src/bookingPaymentTermSchemas.d.ts +123 -0
  16. package/dist/_dts/api/src/bookingRecords.d.ts +13 -13
  17. package/dist/_dts/api/src/bookingRefundOutcomes.d.ts +4 -4
  18. package/dist/_dts/api/src/bookingSessionSummaryTypes.d.ts +34 -0
  19. package/dist/_dts/api/src/bookings.d.ts +7 -11
  20. package/dist/_dts/api/src/commercePortalEndpoints.d.ts +7 -7
  21. package/dist/_dts/api/src/communications.d.ts +1 -1
  22. package/dist/_dts/api/src/contentRuntime.d.ts +1 -1
  23. package/dist/_dts/api/src/endpoints.d.ts +30 -110
  24. package/dist/_dts/api/src/eventManagementContracts.d.ts +1 -1
  25. package/dist/_dts/api/src/eventSeriesRegistrationEndpointDefinitions.d.ts +43 -0
  26. package/dist/_dts/api/src/index.d.ts +3 -4
  27. package/dist/_dts/api/src/indexCoreTypes.d.ts +1 -1
  28. package/dist/_dts/api/src/navigation/contracts.d.ts +9 -6
  29. package/dist/_dts/api/src/navigation/linkResolver.d.ts +6 -2
  30. package/dist/_dts/api/src/navigation/types.d.ts +23 -6
  31. package/dist/_dts/api/src/navigation.d.ts +1 -1
  32. package/dist/_dts/api/src/participantMessaging.d.ts +2 -2
  33. package/dist/_dts/api/src/publicBookingService.d.ts +15 -0
  34. package/dist/_dts/api/src/publicEventEndpointDefinitions.d.ts +8 -0
  35. package/dist/_dts/api/src/publicExperience/commerceEndpoints.d.ts +32 -28
  36. package/dist/_dts/api/src/publicExperience/eventEndpoints.d.ts +88 -6
  37. package/dist/_dts/api/src/publicExperience/sharedTypes.d.ts +1 -1
  38. package/dist/_dts/api/src/publicExperience/wholeSeriesEndpoints.d.ts +9 -98
  39. package/dist/_dts/api/src/publicExperienceEndpoints.d.ts +7 -6
  40. package/dist/_dts/api/src/publicWholeSeriesEndpointDefinitions.d.ts +0 -32
  41. package/dist/_dts/api/src/sdk-event-payment-terms.d.ts +1 -1
  42. package/dist/_dts/api/src/sdk-event-upsert.d.ts +2 -2
  43. package/dist/_dts/api/src/sdkThemeWire.d.ts +50 -50
  44. package/dist/_dts/api/src/siteBanner.d.ts +4 -2
  45. package/dist/_dts/api/src/siteOperations.d.ts +2 -2
  46. package/dist/_dts/api/src/types.d.ts +2 -2
  47. package/dist/_dts/api/src/webhooks.d.ts +12 -12
  48. package/dist/_dts/api/src/{courses.d.ts → wholeSeriesOfferings.d.ts} +43 -95
  49. package/dist/_dts/blocks/src/client.d.ts +1 -6
  50. package/dist/_dts/blocks/src/contracts/index.d.ts +1 -1
  51. package/dist/_dts/blocks/src/contracts/proof-block-islands.d.ts +33 -166
  52. package/dist/_dts/blocks/src/index.d.ts +3 -2
  53. package/dist/_dts/blocks/src/portal/dateFormatting.d.ts +3 -0
  54. package/dist/_dts/blocks/src/portal/types.d.ts +17 -20
  55. package/dist/_dts/blocks/src/primitives/content/components/RichText.d.ts +2 -2
  56. package/dist/_dts/blocks/src/primitives/content/primitives.d.ts +1 -0
  57. package/dist/_dts/blocks/src/system/blocks/event-registration.d.ts +147 -42
  58. package/dist/_dts/blocks/src/system/blocks/events/shared/schemas.d.ts +46 -24
  59. package/dist/_dts/blocks/src/system/blocks/events/shared/types.d.ts +3 -0
  60. package/dist/_dts/blocks/src/system/blocks/events/whole-series/schemas.d.ts +3 -3
  61. package/dist/_dts/blocks/src/system/blocks/events/whole-series/types.d.ts +6 -0
  62. package/dist/_dts/blocks/src/system/blocks/index.d.ts +0 -2
  63. package/dist/_dts/blocks/src/system/blocks/location-map.d.ts +4 -4
  64. package/dist/_dts/blocks/src/system/blocks/media-text.d.ts +148 -148
  65. package/dist/_dts/blocks/src/system/blocks/offerings-preview/model.d.ts +5 -4
  66. package/dist/_dts/blocks/src/system/blocks/offerings-preview/scheduleSummary.d.ts +3 -3
  67. package/dist/_dts/blocks/src/system/blocks/shared/bookingConsent.d.ts +36 -0
  68. package/dist/_dts/blocks/src/system/constants/blockKinds.d.ts +1 -1
  69. package/dist/_dts/blocks/src/system/manifest/hydrateLinks.d.ts +9 -2
  70. package/dist/_dts/blocks/src/system/manifest/resolveBlockData.d.ts +8 -0
  71. package/dist/_dts/blocks/src/system/manifest/schema.d.ts +79 -79
  72. package/dist/_dts/blocks/src/system/node/builder.d.ts +0 -1
  73. package/dist/_dts/blocks/src/system/runtime/api/client.d.ts +9 -12
  74. package/dist/_dts/blocks/src/system/runtime/api/endpoints.d.ts +2 -44
  75. package/dist/_dts/blocks/src/system/runtime/api/index.d.ts +1 -1
  76. package/dist/_dts/blocks/src/system/runtime/api/types/appointments.d.ts +2 -11
  77. package/dist/_dts/blocks/src/system/runtime/api/types/core.d.ts +1 -1
  78. package/dist/_dts/blocks/src/system/runtime/api/types/events.d.ts +100 -59
  79. package/dist/_dts/blocks/src/system/runtime/api/types/portal.d.ts +1 -1
  80. package/dist/_dts/blocks/src/system/runtime/api/types/shop.d.ts +19 -16
  81. package/dist/_dts/blocks/src/system/runtime/api/types/waitlist-claims.d.ts +7 -0
  82. package/dist/_dts/blocks/src/system/runtime/api/types.d.ts +1 -1
  83. package/dist/_dts/blocks/src/system/runtime/components/multi-step/DynamicFormFields.d.ts +3 -19
  84. package/dist/_dts/blocks/src/system/runtime/components/registry.client.d.ts +24 -247
  85. package/dist/_dts/blocks/src/system/runtime/components/runtime-backed-blocks.d.ts +13 -126
  86. package/dist/_dts/blocks/src/system/runtime/hooks/useHeadlessEventRegistrationFlow.d.ts +0 -1
  87. package/dist/_dts/blocks/src/system/runtime/hooks/usePaymentVerification.d.ts +2 -3
  88. package/dist/_dts/blocks/src/system/runtime/hooks/useSelectedAppointmentConsentForm.d.ts +2 -0
  89. package/dist/_dts/blocks/src/system/runtime/nodes/booking-form.consent.d.ts +10 -0
  90. package/dist/_dts/blocks/src/system/runtime/nodes/booking-form.field-values.d.ts +4 -0
  91. package/dist/_dts/blocks/src/system/runtime/nodes/booking-form.fields.d.ts +21 -0
  92. package/dist/_dts/blocks/src/system/runtime/nodes/booking-form.headless.state.d.ts +2 -1
  93. package/dist/_dts/blocks/src/system/runtime/nodes/booking-form.interactive.d.ts +38 -144
  94. package/dist/_dts/blocks/src/system/runtime/nodes/booking-form.state.d.ts +5 -19
  95. package/dist/_dts/blocks/src/system/runtime/nodes/booking-runtime-sources.d.ts +3 -2
  96. package/dist/_dts/blocks/src/system/runtime/nodes/event-details/WholeSeriesPricingDisplay.d.ts +8 -0
  97. package/dist/_dts/blocks/src/system/runtime/nodes/event-registration/AttendeeDetailsStep.d.ts +2 -0
  98. package/dist/_dts/blocks/src/system/runtime/nodes/event-registration/EventRegistrationBookingLayer.d.ts +17 -0
  99. package/dist/_dts/blocks/src/system/runtime/nodes/event-registration/EventRegistrationSurface.d.ts +24 -0
  100. package/dist/_dts/blocks/src/system/runtime/nodes/event-registration/PaymentBlockingPanel.d.ts +18 -0
  101. package/dist/_dts/blocks/src/system/runtime/nodes/event-registration/TicketSelectionStep.d.ts +5 -0
  102. package/dist/_dts/blocks/src/system/runtime/nodes/event-registration/constants.d.ts +1 -0
  103. package/dist/_dts/blocks/src/system/runtime/nodes/event-registration/event-registration.headless.contract.d.ts +1 -3
  104. package/dist/_dts/blocks/src/system/runtime/nodes/event-registration/eventPaymentOptions.d.ts +7 -4
  105. package/dist/_dts/blocks/src/system/runtime/nodes/event-registration/eventScope.d.ts +0 -1
  106. package/dist/_dts/blocks/src/system/runtime/nodes/event-registration/hooks.d.ts +7 -8
  107. package/dist/_dts/blocks/src/system/runtime/nodes/event-registration/index.d.ts +1 -1
  108. package/dist/_dts/blocks/src/system/runtime/nodes/event-registration/registrationDerivations.d.ts +4 -4
  109. package/dist/_dts/blocks/src/system/runtime/nodes/event-registration/registrationEventAdapter.d.ts +3 -0
  110. package/dist/_dts/blocks/src/system/runtime/nodes/event-registration/registrationStateMachine.d.ts +5 -0
  111. package/dist/_dts/blocks/src/system/runtime/nodes/event-registration/registrationSurface.d.ts +18 -1
  112. package/dist/_dts/blocks/src/system/runtime/nodes/event-registration/registrationWizardContext.d.ts +28 -0
  113. package/dist/_dts/blocks/src/system/runtime/nodes/event-registration/sessionStorage.d.ts +12 -11
  114. package/dist/_dts/blocks/src/system/runtime/nodes/event-registration/types.d.ts +53 -45
  115. package/dist/_dts/blocks/src/system/runtime/nodes/event-registration/useEventRegistrationStripeReturn.d.ts +10 -6
  116. package/dist/_dts/blocks/src/system/runtime/nodes/event-registration/useEventRegistrationSubmit.d.ts +9 -1
  117. package/dist/_dts/blocks/src/system/runtime/nodes/event-registration/useEventRegistrationWizard.d.ts +24 -9
  118. package/dist/_dts/blocks/src/system/runtime/nodes/event-registration/useWaitlistClaimRestoration.d.ts +20 -0
  119. package/dist/_dts/blocks/src/system/runtime/nodes/event-registration/utils.d.ts +5 -56
  120. package/dist/_dts/blocks/src/system/runtime/nodes/event-registration/validation.d.ts +2 -1
  121. package/dist/_dts/blocks/src/system/runtime/nodes/event-registration/waitlistClaimRestoration.d.ts +20 -0
  122. package/dist/_dts/blocks/src/system/runtime/nodes/event-registration.interactive.d.ts +6 -22
  123. package/dist/_dts/blocks/src/system/runtime/nodes/events/shared/DateTimeTile.d.ts +1 -1
  124. package/dist/_dts/blocks/src/system/runtime/nodes/events/shared/eventCollectionContract.d.ts +40 -18
  125. package/dist/_dts/blocks/src/system/runtime/nodes/offerings-preview.d.ts +2 -2
  126. package/dist/_dts/blocks/src/system/runtime/shared/bookingPaymentOptions.d.ts +6 -1
  127. package/dist/_dts/blocks/src/system/runtime/shared/components/BookingConsentAgreement.d.ts +7 -0
  128. package/dist/_dts/blocks/src/system/runtime/shared/components/DiscountCodeDisclosure.d.ts +1 -13
  129. package/dist/_dts/blocks/src/system/runtime/shared/components/LoggedInAsUser.d.ts +1 -1
  130. package/dist/_dts/blocks/src/system/runtime/shared/components/MembershipHero.d.ts +1 -1
  131. package/dist/_dts/blocks/src/system/runtime/shared/components/StateIcon.d.ts +1 -1
  132. package/dist/_dts/blocks/src/system/runtime/shared/index.d.ts +1 -1
  133. package/dist/_dts/blocks/src/system/runtime/shared/types.d.ts +2 -1
  134. package/dist/_dts/blocks/src/system/runtime/shared/utils/checkoutUrls.d.ts +2 -2
  135. package/dist/_dts/blocks/src/system/types/link.d.ts +7 -1
  136. package/dist/_dts/commerce/src/index.d.ts +16 -0
  137. package/dist/_dts/commerce/src/money.d.ts +122 -0
  138. package/dist/_dts/commerce/src/moneyContracts.d.ts +178 -0
  139. package/dist/_dts/commerce/src/moneyDateUtils.d.ts +22 -0
  140. package/dist/_dts/commerce/src/moneyPayments.d.ts +59 -0
  141. package/dist/_dts/commerce/src/moneyPlanningTime.d.ts +4 -0
  142. package/dist/_dts/commerce/src/moneyReceiptReadModel.d.ts +68 -0
  143. package/dist/_dts/commerce/src/moneyReport.d.ts +105 -0
  144. package/dist/_dts/commerce/src/moneyReportBreakdowns.d.ts +3 -0
  145. package/dist/_dts/commerce/src/moneyReportKindFilter.d.ts +4 -0
  146. package/dist/_dts/commerce/src/moneyReportPage.d.ts +132 -0
  147. package/dist/_dts/commerce/src/purchase/checkoutCollectionPlan.d.ts +1 -1
  148. package/dist/_dts/commerce/src/purchase/confirmationEmailPayment.d.ts +1 -1
  149. package/dist/_dts/commerce/src/purchase/orderCompletionEmailPlan.d.ts +3 -3
  150. package/dist/_dts/commerce/src/purchase/orderFulfillmentPlan.d.ts +6 -25
  151. package/dist/_dts/commerce/src/purchase/orderItemMetadata.d.ts +4 -4
  152. package/dist/_dts/commerce/src/purchase/orderPlanningTypes.d.ts +11 -11
  153. package/dist/_dts/commerce/src/purchase/orderTypes.d.ts +1 -1
  154. package/dist/_dts/commerce/src/purchase/persistedCheckoutLines.d.ts +1 -1
  155. package/dist/_dts/commerce/src/purchase/types.d.ts +12 -8
  156. package/dist/_dts/commerce/src/shop/digitalFulfillment.d.ts +111 -0
  157. package/dist/_dts/commerce/src/shop/fulfillmentStatus.d.ts +10 -0
  158. package/dist/_dts/commerce/src/shop/inventoryRestore.d.ts +13 -0
  159. package/dist/_dts/commerce/src/shop/shippingAddress.d.ts +18 -0
  160. package/dist/_dts/commerce/src/types/json.d.ts +3 -0
  161. package/dist/_dts/commerce/src/utils/isPlainRecord.d.ts +1 -0
  162. package/dist/_dts/commerce/src/waitlists.d.ts +172 -0
  163. package/dist/_dts/content-model/src/content-types/builtin-schemas.d.ts +0 -30
  164. package/dist/_dts/content-model/src/content-types/builtins.d.ts +2 -39
  165. package/dist/_dts/content-model/src/content-types/schema.d.ts +4 -4
  166. package/dist/_dts/content-model/src/metadataConfig.d.ts +0 -1
  167. package/dist/_dts/content-model/src/templates/defaults.d.ts +0 -68
  168. package/dist/_dts/core/src/booking-consent.d.ts +8 -0
  169. package/dist/_dts/core/src/branded.d.ts +3 -3
  170. package/dist/_dts/core/src/event-pricing.d.ts +6 -6
  171. package/dist/_dts/core/src/index.d.ts +1 -0
  172. package/dist/_dts/core/src/participants.d.ts +17 -17
  173. package/dist/_dts/core/src/rectification.d.ts +1 -1
  174. package/dist/_dts/db/src/generated/supabase/database.types.d.ts +899 -2157
  175. package/dist/_dts/db/src/schemas/forms.d.ts +21 -21
  176. package/dist/_dts/db/src/types/jsonb.d.ts +1 -1
  177. package/dist/_dts/editor/src/primitives/rich-text/RichTextEditorSurface.d.ts +2 -1
  178. package/dist/_dts/editor/src/primitives/rich-text/config.d.ts +2 -1
  179. package/dist/_dts/editor/src/primitives/rich-text/toolbar/linkPopoverUtils.d.ts +3 -2
  180. package/dist/_dts/editor/src/primitives/rich-text/useRichTextEditor.d.ts +3 -4
  181. package/dist/_dts/media-core/src/usageScanner.d.ts +1 -1
  182. package/dist/_dts/sdk/src/bookings/index.d.ts +4 -5
  183. package/dist/_dts/sdk/src/bookings/types.d.ts +8 -60
  184. package/dist/_dts/sdk/src/config/validation.d.ts +30 -30
  185. package/dist/_dts/sdk/src/contracts/content.d.ts +10 -36
  186. package/dist/_dts/sdk/src/contracts/rendering.d.ts +1 -1
  187. package/dist/_dts/sdk/src/manifest/passes/pass1-fields.d.ts +9 -9
  188. package/dist/_dts/sdk/src/public-api/contracts.d.ts +6 -19
  189. package/dist/_dts/sdk/src/rendering/islands/types.d.ts +4 -6
  190. package/dist/_dts/sdk/src/version.d.ts +1 -1
  191. package/dist/_dts/theme-core/src/accordions/types.d.ts +2 -2
  192. package/dist/_dts/theme-core/src/blocks/vars/index.d.ts +0 -2
  193. package/dist/_dts/theme-core/src/buttons/types.d.ts +12 -12
  194. package/dist/_dts/theme-core/src/cards/types.d.ts +5 -5
  195. package/dist/_dts/theme-core/src/generated/containerResponsiveThemeCss.d.ts +1 -1
  196. package/dist/_dts/theme-core/src/mock-themes/all.d.ts +72 -72
  197. package/dist/_dts/theme-core/src/navigation/types.d.ts +4 -4
  198. package/dist/_dts/theme-core/src/palette/colors.d.ts +1 -1
  199. package/dist/_dts/theme-core/src/palette/curated/types.d.ts +2 -2
  200. package/dist/_dts/theme-core/src/schema.d.ts +82 -82
  201. package/dist/_dts/theme-core/src/site-styles/appearancePresetCatalog.d.ts +1 -1
  202. package/dist/_dts/theme-core/src/site-styles/blockAppearancePresets.d.ts +1 -1
  203. package/dist/_dts/theme-core/src/site-styles/cardRoleVocabulary.d.ts +1 -1
  204. package/dist/_dts/theme-core/src/site-styles/designState.d.ts +2 -2
  205. package/dist/_dts/theme-core/src/site-styles/generatedSchemas.d.ts +4 -4
  206. package/dist/_dts/theme-core/src/site-styles/logoBranding.d.ts +4 -4
  207. package/dist/_dts/theme-core/src/tokens/themeColorTokens.d.ts +1 -1
  208. package/dist/_dts/ui/src/badge.d.ts +1 -1
  209. package/dist/_dts/ui/src/button.d.ts +1 -1
  210. package/dist/_dts/ui/src/callout.d.ts +1 -1
  211. package/dist/_dts/ui/src/card.d.ts +1 -1
  212. package/dist/client/{usePolling-M5jG675x.mjs → BookingConsentAgreement-BQqwi8Oa.mjs} +180 -4
  213. package/dist/client/{DiscountCodeDisclosure-DO7llLxm.mjs → DiscountCodeDisclosure-B97aMo0V.mjs} +13 -27
  214. package/dist/client/{EventCombined.client-xID7zN__.mjs → EventCombined.client-Bs2Iw9Q6.mjs} +3 -3
  215. package/dist/client/{EventListing.client-CriBslp0.mjs → EventListing.client-C4QUQdmg.mjs} +2 -2
  216. package/dist/client/{LeafletStaticMap-DYmHnM8g.mjs → LeafletStaticMap-CwWRk69M.mjs} +1 -1
  217. package/dist/client/{accordion-CgFbnnnQ.mjs → accordion-BA0j8Mpw.mjs} +1 -1
  218. package/dist/client/{bookingForm-dUyGpbxc.mjs → bookingForm-Br2e41H0.mjs} +72 -47
  219. package/dist/client/bookings.mjs +1987 -2132
  220. package/dist/client/{carousel-BvBwkUzx.mjs → carousel-B4dmwnpD.mjs} +1 -1
  221. package/dist/client/{cart-DiZENT2E.mjs → cart-B_ckGW4b.mjs} +3 -3
  222. package/dist/client/{checkout-Dq13KIgR.mjs → checkout-DAyspHdf.mjs} +3 -3
  223. package/dist/client/checkoutUrls-BuseL0dw.mjs +189 -0
  224. package/dist/client/client.mjs +5627 -9543
  225. package/dist/client/{context-B83PiNzm.mjs → context-DljQn8L5.mjs} +15 -82
  226. package/dist/client/{eventCalendar-BF0Jatfw.mjs → eventCalendar-pJu3FUod.mjs} +5 -5
  227. package/dist/client/{eventCombined-BuoCF8je.mjs → eventCombined-B6Kacm9F.mjs} +3 -3
  228. package/dist/client/{eventDetails-CKwh0S9s.mjs → eventDetails-CaX9z1pv.mjs} +8 -8
  229. package/dist/client/{eventListing-eUxaWFaB.mjs → eventListing-B9aXPO-I.mjs} +3 -3
  230. package/dist/client/{eventRegistration-CfkNOkPb.mjs → eventRegistration-CBSovBkg.mjs} +4550 -3671
  231. package/dist/client/{form-C17H1c_H.mjs → form-Cm0tu_7o.mjs} +2 -2
  232. package/dist/client/{headerSection-DEwUmrtt.mjs → headerSection-OgRtHeKS.mjs} +2 -2
  233. package/dist/client/hooks.mjs +535 -694
  234. package/dist/client/{locationMap-Pf2QwuvW.mjs → locationMap-DmjcYqNM.mjs} +2 -2
  235. package/dist/client/{newsletterForm-BWQAH5Sv.mjs → newsletterForm-D08OZQAC.mjs} +2 -2
  236. package/dist/client/{productDetail-BZi1Fa_G.mjs → productDetail-BqZeu2P4.mjs} +3 -3
  237. package/dist/client/{productList-qq-55DNk.mjs → productList-mNyIF9FG.mjs} +3 -3
  238. package/dist/client/{propsDecoder-BxmqPKdP.mjs → propsDecoder-DwHXRm9X.mjs} +4850 -4502
  239. package/dist/client/rendering/client.mjs +59921 -62298
  240. package/dist/client/rendering/islands.mjs +17 -19
  241. package/dist/client/rendering.mjs +6226 -10236
  242. package/dist/client/{scrollToBlock-B3CcKdtG.mjs → scrollToBlock-DtmdM3v-.mjs} +2 -2
  243. package/dist/client/{shop-DNWJPut5.mjs → shop-CNjZK16F.mjs} +6 -6
  244. package/dist/client/{shop-commerce-BhvQCosS.mjs → shop-commerce-DkNNao1J.mjs} +7 -164
  245. package/dist/client/{shop-commerce-store-B04sCNnW.mjs → shop-commerce-store-9WA--zuW.mjs} +1 -1
  246. package/dist/client/{shopShared-DNNgZlmW.mjs → shopShared-CHCVfccY.mjs} +3 -3
  247. package/dist/client/{useEventFilters-CUmhE24_.mjs → useEventFilters-DvuaB4ZN.mjs} +3 -3
  248. package/dist/preview-next/before-render.mjs +40 -161
  249. package/dist/preview-next/client/runtime.mjs +4 -4
  250. package/dist/preview-next/keepAlive.mjs +40 -161
  251. package/dist/preview-next/middleware.mjs +40 -161
  252. package/dist/{previewAuthStore-BFKd4LrN.mjs → previewAuthStore-C7ksxt5b.mjs} +40 -161
  253. package/dist/{sdk-runtime-BEXb1wqo.mjs → sdk-runtime-3GhW4knb.mjs} +2 -2
  254. package/dist/{separator-DGMuip1D.mjs → separator-D3bCWYYb.mjs} +1 -1
  255. package/dist/server/components.mjs +634 -2969
  256. package/dist/server/config-validation.mjs +535 -694
  257. package/dist/server/config.mjs +535 -694
  258. package/dist/server/data.mjs +535 -694
  259. package/dist/server/index.mjs +41 -162
  260. package/dist/server/next.mjs +644 -2979
  261. package/dist/server/page-converter.mjs +435 -561
  262. package/dist/server/prebuild.mjs +1 -1
  263. package/dist/server/rendering/server.mjs +635 -2874
  264. package/dist/server/rendering.mjs +634 -2969
  265. package/dist/server/routing.mjs +706 -1138
  266. package/dist/server/server.mjs +549 -708
  267. package/dist/server/theme-bridge.mjs +152 -1635
  268. package/dist/styles/index.css +41 -1348
  269. package/package.json +2 -2
  270. package/dist/_dts/api/src/courseEndpointDefinitions.d.ts +0 -99
  271. package/dist/_dts/blocks/src/client/course-registration.d.ts +0 -5
  272. package/dist/_dts/blocks/src/system/blocks/course-details.d.ts +0 -134
  273. package/dist/_dts/blocks/src/system/blocks/course-registration.d.ts +0 -130
  274. package/dist/_dts/blocks/src/system/blocks/courses/shared/index.d.ts +0 -3
  275. package/dist/_dts/blocks/src/system/blocks/courses/shared/pricing.d.ts +0 -2
  276. package/dist/_dts/blocks/src/system/blocks/courses/shared/schemas.d.ts +0 -1
  277. package/dist/_dts/blocks/src/system/blocks/courses/shared/types.d.ts +0 -1
  278. package/dist/_dts/blocks/src/system/runtime/api/types/courses.d.ts +0 -133
  279. package/dist/_dts/blocks/src/system/runtime/hooks/useHeadlessWholeSeriesRegistrationFlow.d.ts +0 -28
  280. package/dist/_dts/blocks/src/system/runtime/nodes/course-details/logic.d.ts +0 -11
  281. package/dist/_dts/blocks/src/system/runtime/nodes/course-details/runs.d.ts +0 -10
  282. package/dist/_dts/blocks/src/system/runtime/nodes/course-details/view.d.ts +0 -15
  283. package/dist/_dts/blocks/src/system/runtime/nodes/course-details.server.d.ts +0 -20
  284. package/dist/_dts/blocks/src/system/runtime/nodes/course-page-surface-scope.d.ts +0 -14
  285. package/dist/_dts/blocks/src/system/runtime/nodes/course-registration.client.d.ts +0 -10
  286. package/dist/_dts/blocks/src/system/runtime/nodes/course-registration.interactive.d.ts +0 -181
  287. package/dist/_dts/blocks/src/system/runtime/nodes/course-registration.server.d.ts +0 -12
  288. package/dist/_dts/blocks/src/system/runtime/nodes/event-details/CoursePricingDisplay.d.ts +0 -8
  289. package/dist/_dts/blocks/src/system/runtime/nodes/event-registration/whole-series/BookingModeStep.d.ts +0 -32
  290. package/dist/_dts/blocks/src/system/runtime/nodes/event-registration/whole-series/CheckIcon.d.ts +0 -4
  291. package/dist/_dts/blocks/src/system/runtime/nodes/event-registration/whole-series/ErrorStep.d.ts +0 -17
  292. package/dist/_dts/blocks/src/system/runtime/nodes/event-registration/whole-series/MembershipHero.d.ts +0 -12
  293. package/dist/_dts/blocks/src/system/runtime/nodes/event-registration/whole-series/PaymentFailedStep.d.ts +0 -17
  294. package/dist/_dts/blocks/src/system/runtime/nodes/event-registration/whole-series/PortalAuthSidebar.d.ts +0 -9
  295. package/dist/_dts/blocks/src/system/runtime/nodes/event-registration/whole-series/StepIndicator.d.ts +0 -6
  296. package/dist/_dts/blocks/src/system/runtime/nodes/event-registration/whole-series/SuccessStep.d.ts +0 -14
  297. package/dist/_dts/blocks/src/system/runtime/nodes/event-registration/whole-series/VerifyingTimeoutStep.d.ts +0 -17
  298. package/dist/_dts/blocks/src/system/runtime/nodes/event-registration/whole-series/WaitlistStep.d.ts +0 -12
  299. package/dist/_dts/blocks/src/system/runtime/nodes/event-registration/whole-series/WholeSeriesRegistrationActiveSteps.d.ts +0 -9
  300. package/dist/_dts/blocks/src/system/runtime/nodes/event-registration/whole-series/WholeSeriesRegistrationErrorBoundary.d.ts +0 -25
  301. package/dist/_dts/blocks/src/system/runtime/nodes/event-registration/whole-series/WholeSeriesRegistrationTerminalContent.d.ts +0 -8
  302. package/dist/_dts/blocks/src/system/runtime/nodes/event-registration/whole-series/WholeSeriesRegistrationWizard.d.ts +0 -8
  303. package/dist/_dts/blocks/src/system/runtime/nodes/event-registration/whole-series/components.d.ts +0 -45
  304. package/dist/_dts/blocks/src/system/runtime/nodes/event-registration/whole-series/index.d.ts +0 -18
  305. package/dist/_dts/blocks/src/system/runtime/nodes/event-registration/whole-series/presentation.d.ts +0 -7
  306. package/dist/_dts/blocks/src/system/runtime/nodes/event-registration/whole-series/pricing.d.ts +0 -14
  307. package/dist/_dts/blocks/src/system/runtime/nodes/event-registration/whole-series/types.d.ts +0 -105
  308. package/dist/_dts/blocks/src/system/runtime/nodes/event-registration/whole-series/useWholeSeriesEligibility.d.ts +0 -24
  309. package/dist/_dts/blocks/src/system/runtime/nodes/event-registration/whole-series/useWholeSeriesPaymentVerification.d.ts +0 -10
  310. package/dist/_dts/blocks/src/system/runtime/nodes/event-registration/whole-series/useWholeSeriesRegistrationActions.d.ts +0 -35
  311. package/dist/_dts/blocks/src/system/runtime/nodes/event-registration/whole-series/useWholeSeriesRegistrationPortal.d.ts +0 -7
  312. package/dist/_dts/blocks/src/system/runtime/nodes/event-registration/whole-series/useWholeSeriesRegistrationSelection.d.ts +0 -35
  313. package/dist/_dts/blocks/src/system/runtime/nodes/event-registration/whole-series/useWholeSeriesRegistrationWizard.d.ts +0 -185
  314. package/dist/_dts/blocks/src/system/runtime/nodes/event-registration/whole-series/useWholeSeriesWaitlistSelection.d.ts +0 -14
  315. package/dist/_dts/blocks/src/system/runtime/nodes/event-registration/whole-series/utils.d.ts +0 -43
  316. package/dist/_dts/blocks/src/system/runtime/nodes/event-registration/whole-series/whole-series-registration.headless.contract.d.ts +0 -323
  317. package/dist/_dts/blocks/src/system/runtime/nodes/event-registration/whole-series/whole-series-registration.headless.planning.d.ts +0 -27
  318. package/dist/_dts/blocks/src/system/runtime/nodes/event-registration/whole-series/wholeSeriesPageSurfaceScope.d.ts +0 -17
  319. package/dist/_dts/blocks/src/system/runtime/nodes/event-registration/whole-series/wholeSeriesRegistrationViewState.d.ts +0 -21
  320. package/dist/_dts/blocks/src/system/runtime/nodes/event-registration/whole-series/wizardSteps.d.ts +0 -30
  321. package/dist/_dts/sdk/src/rendering/islands/enhancers/courseRegistration.d.ts +0 -3
  322. package/dist/_dts/theme-core/src/blocks/vars/course-details.d.ts +0 -16
  323. package/dist/_dts/theme-core/src/blocks/vars/course-registration.d.ts +0 -21
  324. package/dist/client/StepIndicator-CGixP_LW.mjs +0 -138
  325. package/dist/client/WholeSeriesRegistrationWizard-BEjzSiOA.mjs +0 -2496
  326. package/dist/client/checkoutUrls-Ct8Mxna3.mjs +0 -26
  327. package/dist/client/courseRegistration-CKC5NmyH.mjs +0 -52
  328. package/dist/client/pricing-CVdvbopJ.mjs +0 -195
@@ -9495,6 +9495,11 @@ z$1.object({
9495
9495
  //#endregion
9496
9496
  //#region ../blocks/src/system/types/link.ts
9497
9497
  const nullableString = z$1.union([z$1.string().min(1), z$1.null()]);
9498
+ const RESOLVED_INTERNAL_LINK_ENTITY_TYPES = [
9499
+ "page",
9500
+ "content",
9501
+ "pageSurface"
9502
+ ];
9498
9503
  const resolvedInternalLinkKeys = [
9499
9504
  "entityId",
9500
9505
  "entityType",
@@ -9516,7 +9521,7 @@ const internalResolvedLinkSchema = z$1.object({
9516
9521
  kind: z$1.literal("internal"),
9517
9522
  routeId: z$1.string().min(1),
9518
9523
  entityId: z$1.string().min(1),
9519
- entityType: z$1.enum(["page", "content"]),
9524
+ entityType: z$1.enum(RESOLVED_INTERNAL_LINK_ENTITY_TYPES),
9520
9525
  href: z$1.string().min(1),
9521
9526
  title: z$1.string().min(1),
9522
9527
  typeLabel: z$1.string().min(1),
@@ -9646,7 +9651,7 @@ function publicEventPricingType(pricing) {
9646
9651
  case "single_paid":
9647
9652
  case "ticket_types":
9648
9653
  case "sliding_scale":
9649
- case "course": return isFreePublicEventPriceDisplay(pricing.display) ? "free" : "paid";
9654
+ case "whole_series": return isFreePublicEventPriceDisplay(pricing.display) ? "free" : "paid";
9650
9655
  case "external": return "external";
9651
9656
  }
9652
9657
  }
@@ -9657,14 +9662,14 @@ function publicEventPricingCurrency(pricing) {
9657
9662
  case "single_paid":
9658
9663
  case "ticket_types":
9659
9664
  case "sliding_scale": return pricing.currency;
9660
- case "course": return pricing.display.display.currency;
9665
+ case "whole_series": return pricing.display.display.currency;
9661
9666
  case "external": return null;
9662
9667
  }
9663
9668
  }
9664
9669
  function isFreePublicEventPriceDisplay(display) {
9665
9670
  switch (display.kind) {
9666
9671
  case "free": return true;
9667
- case "course": return display.display.kind === "free";
9672
+ case "whole_series": return display.display.kind === "free";
9668
9673
  case "exact":
9669
9674
  case "from":
9670
9675
  case "range":
@@ -9700,7 +9705,7 @@ function formatBookingPriceDisplay(display, options = {}) {
9700
9705
  case "mixed": return display.paidToAmount > display.paidFromAmount ? `Free / ${formatCurrencyAmount(display.paidFromAmount, display.currency, options)} - ${formatCurrencyAmount(display.paidToAmount, display.currency, options)}` : `Free / ${formatCurrencyAmount(display.paidFromAmount, display.currency, options)}`;
9701
9706
  case "unavailable": return "Pricing unavailable";
9702
9707
  case "external": return display.label;
9703
- case "course": return formatCoursePriceDisplayLabel(display.display, options);
9708
+ case "whole_series": return formatCoursePriceDisplayLabel(display.display, options);
9704
9709
  default: return assertNever$23(display);
9705
9710
  }
9706
9711
  }
@@ -14888,7 +14893,7 @@ defineBlockAppearancePreset({
14888
14893
  id: "schedule-details-brand-depth",
14889
14894
  target: "events",
14890
14895
  label: "Brand-depth schedule details",
14891
- blockKinds: ["block.event-details", "block.course-details"],
14896
+ blockKinds: ["block.event-details"],
14892
14897
  design: {
14893
14898
  sectionSurface: "brand-depth-band",
14894
14899
  contentFrame: plainFrame,
@@ -21505,7 +21510,6 @@ const productDetail = (props, children, ...mods) => el("product-detail", props,
21505
21510
  const cart = (props, children, ...mods) => el("cart", props, children, ...mods);
21506
21511
  const checkout = (props, children, ...mods) => el("checkout", props, children, ...mods);
21507
21512
  const gifting = (props, children, ...mods) => el("gifting", props, children, ...mods);
21508
- const courseRegistration = (props, children, ...mods) => el("course-registration", props, children, ...mods);
21509
21513
  function bind(from, options) {
21510
21514
  return (node) => ({
21511
21515
  ...node,
@@ -31599,12 +31603,12 @@ const weeklySlotAvailabilityBlockDefinition = {
31599
31603
  };
31600
31604
  //#endregion
31601
31605
  //#region ../blocks/src/system/blocks/shared/bookingPaymentTerms.ts
31602
- const bookingDepositRefundPolicySchema = z$1.enum(["refundable", "non_refundable"]);
31603
- const bookingInstalmentPlanSchema = z$1.union([
31606
+ const bookingDepositRefundPolicySchema$1 = z$1.enum(["refundable", "non_refundable"]);
31607
+ const bookingInstalmentPlanSchema$1 = z$1.union([
31604
31608
  z$1.object({
31605
31609
  kind: z$1.literal("deposit_plus_one_remainder"),
31606
31610
  depositAmountCents: z$1.number().int().min(0),
31607
- depositRefundability: bookingDepositRefundPolicySchema,
31611
+ depositRefundability: bookingDepositRefundPolicySchema$1,
31608
31612
  remainderDueCount: z$1.number().int().positive(),
31609
31613
  intervalUnit: z$1.enum([
31610
31614
  "day",
@@ -31615,7 +31619,7 @@ const bookingInstalmentPlanSchema = z$1.union([
31615
31619
  z$1.object({
31616
31620
  kind: z$1.literal("deposit_plus_scheduled_instalments"),
31617
31621
  depositAmountCents: z$1.number().int().min(0),
31618
- depositRefundability: bookingDepositRefundPolicySchema,
31622
+ depositRefundability: bookingDepositRefundPolicySchema$1,
31619
31623
  instalmentCount: z$1.number().int().positive(),
31620
31624
  intervalCount: z$1.number().int().positive(),
31621
31625
  intervalUnit: z$1.enum([
@@ -31635,31 +31639,47 @@ const bookingInstalmentPlanSchema = z$1.union([
31635
31639
  ])
31636
31640
  })
31637
31641
  ]);
31638
- const bookingFlexibleBalanceDueDateRuleSchema = z$1.union([z$1.object({
31642
+ const bookingFlexibleBalanceDueDateRuleSchema$1 = z$1.union([z$1.object({
31639
31643
  kind: z$1.literal("relative_to_start_date"),
31640
31644
  daysBeforeStart: z$1.number().int().positive()
31641
31645
  }), z$1.object({
31642
31646
  kind: z$1.literal("fixed_calendar_date"),
31643
31647
  dueAt: z$1.string().datetime()
31644
31648
  })]);
31645
- const bookingFlexibleBalanceConfigSchema = z$1.object({
31649
+ const bookingFlexibleBalanceConfigSchema$1 = z$1.object({
31646
31650
  upfrontAmountCents: z$1.number().int().min(0),
31647
- dueDateRule: bookingFlexibleBalanceDueDateRuleSchema,
31648
- depositRefundability: bookingDepositRefundPolicySchema
31651
+ dueDateRule: bookingFlexibleBalanceDueDateRuleSchema$1,
31652
+ depositRefundability: bookingDepositRefundPolicySchema$1
31649
31653
  });
31650
31654
  const blockBookingPaymentCollectionOptionSchema = z$1.union([
31651
31655
  z$1.object({ kind: z$1.literal("upfront") }),
31652
31656
  z$1.object({ kind: z$1.literal("deferred_manual") }),
31653
31657
  z$1.object({
31654
31658
  kind: z$1.literal("instalment_plan"),
31655
- plan: bookingInstalmentPlanSchema
31659
+ plan: bookingInstalmentPlanSchema$1
31656
31660
  }),
31657
31661
  z$1.object({
31658
31662
  kind: z$1.literal("flexible_balance"),
31659
- config: bookingFlexibleBalanceConfigSchema
31663
+ config: bookingFlexibleBalanceConfigSchema$1
31660
31664
  })
31661
31665
  ]);
31662
31666
  const blockBookingPaymentTermsSchema = z$1.object({ allowedOptions: z$1.array(blockBookingPaymentCollectionOptionSchema).min(1) });
31667
+ const blockBookingConsentSchema = z$1.object({
31668
+ requirementId: z$1.string(),
31669
+ title: z$1.string(),
31670
+ agreement: RichTextDocSchema,
31671
+ checkboxLabel: z$1.string()
31672
+ });
31673
+ const bookingRequirementConsentFieldSchema = z$1.object({
31674
+ id: z$1.string(),
31675
+ label: z$1.string(),
31676
+ type: z$1.literal("booking_requirement_consent"),
31677
+ required: z$1.literal(true),
31678
+ agreement: RichTextDocSchema,
31679
+ checkboxLabel: z$1.string().min(1)
31680
+ });
31681
+ /** The two live public carriers for consent copy: Event data and appointment fields. */
31682
+ const bookingConsentCarrierSchema = z$1.union([blockBookingConsentSchema, bookingRequirementConsentFieldSchema]);
31663
31683
  //#endregion
31664
31684
  //#region ../blocks/src/system/blocks/events/whole-series/pricing.ts
31665
31685
  function isSaleWindowOpen(option, now) {
@@ -31894,11 +31914,19 @@ const publicWholeSeriesOfferingSchema = z$1.object({
31894
31914
  title: z$1.string(),
31895
31915
  slug: z$1.string(),
31896
31916
  description: z$1.unknown().nullable(),
31917
+ deliveryMode: z$1.enum([
31918
+ "in_person",
31919
+ "online",
31920
+ "hybrid"
31921
+ ]),
31922
+ waitlistEnabled: z$1.boolean(),
31923
+ requireGuestDetails: z$1.boolean(),
31897
31924
  teamMembers: z$1.array(wholeSeriesTeamMemberSummarySchema).optional(),
31898
31925
  enrollmentOpen: z$1.boolean(),
31899
31926
  pricing: wholeSeriesPricingSchema,
31900
31927
  currency: z$1.string(),
31901
31928
  paymentTerms: blockBookingPaymentTermsSchema,
31929
+ consent: blockBookingConsentSchema.nullable(),
31902
31930
  enrollmentCapacity: z$1.number().nullable(),
31903
31931
  acceptsMemberships: z$1.boolean(),
31904
31932
  status: z$1.enum([
@@ -32008,7 +32036,7 @@ const mixedPriceDisplaySchema = z$1.object({
32008
32036
  paidToAmount: z$1.number(),
32009
32037
  currency: z$1.string()
32010
32038
  });
32011
- const publicCoursePriceDisplaySchema = z$1.discriminatedUnion("kind", [
32039
+ const publicWholeSeriesPriceDisplaySchema = z$1.discriminatedUnion("kind", [
32012
32040
  freePriceDisplaySchema,
32013
32041
  exactPriceDisplaySchema,
32014
32042
  fromPriceDisplaySchema,
@@ -32026,8 +32054,8 @@ z$1.discriminatedUnion("kind", [
32026
32054
  label: z$1.string()
32027
32055
  }),
32028
32056
  z$1.object({
32029
- kind: z$1.literal("course"),
32030
- display: publicCoursePriceDisplaySchema
32057
+ kind: z$1.literal("whole_series"),
32058
+ display: publicWholeSeriesPriceDisplaySchema
32031
32059
  })
32032
32060
  ]);
32033
32061
  const publicEventTicketTypePriceDisplaySchema = z$1.union([
@@ -32129,10 +32157,10 @@ const publicEventPricingSchema = z$1.discriminatedUnion("kind", [
32129
32157
  })
32130
32158
  }),
32131
32159
  z$1.object({
32132
- kind: z$1.literal("course"),
32160
+ kind: z$1.literal("whole_series"),
32133
32161
  display: z$1.object({
32134
- kind: z$1.literal("course"),
32135
- display: publicCoursePriceDisplaySchema
32162
+ kind: z$1.literal("whole_series"),
32163
+ display: publicWholeSeriesPriceDisplaySchema
32136
32164
  })
32137
32165
  }),
32138
32166
  z$1.object({
@@ -32216,6 +32244,7 @@ const publicEventSchema = z$1.object({
32216
32244
  timeZone: z$1.string(),
32217
32245
  pricing: publicEventPricingSchema,
32218
32246
  paymentTerms: blockBookingPaymentTermsSchema,
32247
+ consent: blockBookingConsentSchema.nullable(),
32219
32248
  accessRestriction: accessRestrictionSchema,
32220
32249
  allowedCategoryIds: z$1.array(z$1.string()),
32221
32250
  requireGuestDetails: z$1.boolean().optional(),
@@ -32574,7 +32603,8 @@ function resolveEventRegistrationScope(context) {
32574
32603
  };
32575
32604
  return { kind: "unscoped" };
32576
32605
  }
32577
- function applyEventRegistrationScope(events, scope) {
32606
+ function resolveEventRegistrationScopedEvents(events, context) {
32607
+ const scope = resolveEventRegistrationScope(context);
32578
32608
  switch (scope.kind) {
32579
32609
  case "occurrenceSeries":
32580
32610
  case "pageSurfaceSeries": return events.filter((event) => event.seriesId === scope.seriesId);
@@ -32586,8 +32616,24 @@ function applyEventRegistrationScope(events, scope) {
32586
32616
  case "unscoped": return [...events];
32587
32617
  }
32588
32618
  }
32589
- function resolveEventRegistrationScopedEvents(events, context) {
32590
- return applyEventRegistrationScope(events, resolveEventRegistrationScope(context));
32619
+ //#endregion
32620
+ //#region ../blocks/src/system/runtime/nodes/event-registration/registrationSurface.ts
32621
+ function planEventRegistrationScope(input) {
32622
+ const subject = input.subject;
32623
+ const selectedRunOffering = input.wholeSeriesOffering;
32624
+ if (subject?.kind !== "eventOffering" || !selectedRunOffering) return {
32625
+ kind: "context",
32626
+ events: resolveEventRegistrationScopedEvents(input.events, {
32627
+ occurrenceContext: input.occurrenceContext,
32628
+ subject
32629
+ })
32630
+ };
32631
+ if (!(selectedRunOffering.eventOfferingId === subject.eventOfferingId && subject.availableEventSeriesIds.some((seriesId) => seriesId === selectedRunOffering.eventSeriesId))) return { kind: "invalidSelectedRun" };
32632
+ return {
32633
+ kind: "selectedRun",
32634
+ events: input.events.filter((event) => event.seriesId === selectedRunOffering.eventSeriesId),
32635
+ offering: selectedRunOffering
32636
+ };
32591
32637
  }
32592
32638
  //#endregion
32593
32639
  //#region ../blocks/src/system/runtime/nodes/events/shared/destination.ts
@@ -32663,14 +32709,14 @@ function isRecord$23(value) {
32663
32709
  }
32664
32710
  function isPublicEventPricing(value) {
32665
32711
  if (!isRecord$23(value) || typeof value.kind !== "string") return false;
32666
- return value.kind === "drop_in" || value.kind === "free_registration" || value.kind === "single_paid" || value.kind === "sliding_scale" || value.kind === "ticket_types" || value.kind === "course" || value.kind === "external";
32712
+ return value.kind === "drop_in" || value.kind === "free_registration" || value.kind === "single_paid" || value.kind === "sliding_scale" || value.kind === "ticket_types" || value.kind === "whole_series" || value.kind === "external";
32667
32713
  }
32668
32714
  function isPublicEventTicketType(value) {
32669
32715
  return isRecord$23(value) && typeof value.id === "string";
32670
32716
  }
32671
32717
  function readTicketTypePriceDisplay(value, currency) {
32672
32718
  const display = readLegacyPriceDisplay(value, currency);
32673
- return display.kind === "course" || display.kind === "external" ? {
32719
+ return display.kind === "whole_series" || display.kind === "external" ? {
32674
32720
  kind: "unavailable",
32675
32721
  currency
32676
32722
  } : display;
@@ -32728,11 +32774,11 @@ function readLegacyPriceDisplay(value, currency) {
32728
32774
  kind: "unavailable",
32729
32775
  currency: displayCurrency
32730
32776
  };
32731
- case "course": return isRecord$23(value.display) ? {
32732
- kind: "course",
32777
+ case "whole_series": return isRecord$23(value.display) ? {
32778
+ kind: "whole_series",
32733
32779
  display: readCoursePriceDisplay(value.display, displayCurrency)
32734
32780
  } : {
32735
- kind: "course",
32781
+ kind: "whole_series",
32736
32782
  display: {
32737
32783
  kind: "unavailable",
32738
32784
  currency: displayCurrency
@@ -32855,7 +32901,7 @@ function getWizardStepsForContext(hasPreSelectedContext, needsPaymentStep) {
32855
32901
  //#endregion
32856
32902
  //#region ../blocks/src/system/runtime/nodes/event-registration/registrationDerivations.ts
32857
32903
  function eventMatchesOccurrenceId(event, occurrenceId) {
32858
- return event.registrationOccurrenceId === occurrenceId || event.publicEventId === occurrenceId;
32904
+ return event.registrationSubject.kind === "occurrence" && (event.registrationSubject.occurrenceId === occurrenceId || event.selectionId === occurrenceId);
32859
32905
  }
32860
32906
  function findPreSelectedEvent(input) {
32861
32907
  const occurrenceContext = input.occurrenceContext;
@@ -32881,12 +32927,127 @@ function toRegistrationEvent(event) {
32881
32927
  return {
32882
32928
  ...event,
32883
32929
  pricing: resolveRuntimeEventPricing(event),
32884
- publicEventId: event.id,
32885
- registrationOccurrenceId: event.occurrenceId
32930
+ selectionId: event.id,
32931
+ registrationSubject: {
32932
+ kind: "occurrence",
32933
+ occurrenceId: event.occurrenceId
32934
+ }
32886
32935
  };
32887
32936
  }
32888
32937
  function toRegistrationEvents(events) {
32889
- return events.map(toRegistrationEvent);
32938
+ return events.filter((event) => event.bookingScope === "single_occurrence").map(toRegistrationEvent);
32939
+ }
32940
+ function toWholeSeriesTicketType(option) {
32941
+ return {
32942
+ ...option,
32943
+ capacityMode: option.capacityLimit === null ? "unlimited" : "limited",
32944
+ attendanceScope: option.attendanceScope ?? void 0,
32945
+ availability: {
32946
+ kind: "available",
32947
+ remainingCapacity: option.capacityLimit
32948
+ }
32949
+ };
32950
+ }
32951
+ function toWholeSeriesPricing(offering) {
32952
+ const resolved = resolveWholeSeriesPricingState(offering);
32953
+ switch (offering.pricing.pricingStrategy) {
32954
+ case "free": return {
32955
+ kind: "free_registration",
32956
+ currency: offering.currency,
32957
+ display: {
32958
+ kind: "free",
32959
+ currency: offering.currency
32960
+ }
32961
+ };
32962
+ case "single": {
32963
+ const amount = offering.pricing.singlePriceAmount ?? 0;
32964
+ return amount === 0 ? {
32965
+ kind: "free_registration",
32966
+ currency: offering.currency,
32967
+ display: {
32968
+ kind: "free",
32969
+ currency: offering.currency
32970
+ }
32971
+ } : {
32972
+ kind: "single_paid",
32973
+ amount,
32974
+ currency: offering.currency,
32975
+ display: {
32976
+ kind: "exact",
32977
+ amount,
32978
+ currency: offering.currency
32979
+ }
32980
+ };
32981
+ }
32982
+ case "tiered": return {
32983
+ kind: "ticket_types",
32984
+ currency: offering.currency,
32985
+ ticketTypes: resolved.selectableOptions.map((option) => toWholeSeriesTicketType(option)),
32986
+ display: resolved.display
32987
+ };
32988
+ case "sliding_scale": return {
32989
+ kind: "sliding_scale",
32990
+ minAmount: offering.pricing.slidingMinAmount ?? 0,
32991
+ maxAmount: offering.pricing.slidingMaxAmount ?? 0,
32992
+ suggestedAmount: offering.pricing.slidingSuggestedAmount ?? null,
32993
+ currency: offering.currency,
32994
+ display: {
32995
+ kind: "range",
32996
+ minAmount: offering.pricing.slidingMinAmount ?? 0,
32997
+ maxAmount: offering.pricing.slidingMaxAmount ?? 0,
32998
+ currency: offering.currency
32999
+ }
33000
+ };
33001
+ }
33002
+ }
33003
+ function toAttendanceModes(offering) {
33004
+ return (offering.deliveryMode === "hybrid" ? ["in_person", "online"] : [offering.deliveryMode]).map((mode) => ({
33005
+ mode,
33006
+ capacity: offering.enrollmentCapacity,
33007
+ registeredCount: offering.enrolledCount,
33008
+ availableSpots: offering.availableSpots,
33009
+ waitlistEnabled: offering.waitlistEnabled
33010
+ }));
33011
+ }
33012
+ function toWholeSeriesRegistrationEvent(offering) {
33013
+ const firstSession = offering.sessions[0];
33014
+ const lastSession = offering.sessions[offering.sessions.length - 1];
33015
+ return {
33016
+ selectionId: offering.eventSeriesId,
33017
+ registrationSubject: {
33018
+ kind: "wholeSeries",
33019
+ eventSeriesId: offering.eventSeriesId,
33020
+ sessions: offering.sessions
33021
+ },
33022
+ seriesId: offering.eventSeriesId,
33023
+ title: offering.title,
33024
+ startsAt: firstSession?.startsAt ?? "",
33025
+ endsAt: lastSession?.endsAt ?? firstSession?.endsAt ?? "",
33026
+ bookingAvailability: offering.enrollmentOpen ? { kind: "open" } : {
33027
+ kind: "closed",
33028
+ reason: "enrollment_closed"
33029
+ },
33030
+ deliveryMode: offering.deliveryMode,
33031
+ attendanceModes: toAttendanceModes(offering),
33032
+ capacity: offering.enrollmentCapacity,
33033
+ registeredCount: offering.enrolledCount,
33034
+ availableSpots: offering.availableSpots,
33035
+ waitlistEnabled: offering.waitlistEnabled,
33036
+ venue: offering.venue ? {
33037
+ ...offering.venue,
33038
+ location: null
33039
+ } : null,
33040
+ eventCategory: null,
33041
+ teamMembers: offering.teamMembers,
33042
+ status: offering.status,
33043
+ timeZone: firstSession?.timeZone ?? "UTC",
33044
+ pricing: toWholeSeriesPricing(offering),
33045
+ paymentTerms: offering.paymentTerms,
33046
+ consent: offering.consent,
33047
+ requireGuestDetails: offering.requireGuestDetails,
33048
+ acceptsPasses: false,
33049
+ acceptsMemberships: offering.acceptsMemberships
33050
+ };
32890
33051
  }
32891
33052
  //#endregion
32892
33053
  //#region ../blocks/src/system/runtime/nodes/event-registration.interactive.ts
@@ -32912,11 +33073,7 @@ const eventRegistrationHydrationSchemaShape = {
32912
33073
  maxTickets: z$1.string().optional(),
32913
33074
  showVenue: z$1.boolean().optional(),
32914
33075
  showCapacity: z$1.boolean().optional(),
32915
- showSessions: z$1.boolean().optional(),
32916
- showPrice: z$1.boolean().optional(),
32917
33076
  successMessage: z$1.string().optional(),
32918
- waitlistMessage: z$1.string().optional(),
32919
- membershipMessage: z$1.string().optional(),
32920
33077
  buttonVariant: registrationButtonVariantSchema.optional(),
32921
33078
  overlayEnabled: z$1.boolean().optional(),
32922
33079
  spamProtectionEnabled: z$1.boolean().optional(),
@@ -32986,6 +33143,15 @@ function resolveWholeSeriesOffering(source) {
32986
33143
  return source.wholeSeriesOffering ?? source.subjectWholeSeriesOffering ?? null;
32987
33144
  }
32988
33145
  function buildEventRegistrationShellStepLabels(source) {
33146
+ const selectedOffering = resolveWholeSeriesOffering(source);
33147
+ if (selectedOffering) {
33148
+ const selectedEvent = toWholeSeriesRegistrationEvent(selectedOffering);
33149
+ return getWizardStepsForContext(true, resolveEventRequiresPayment({
33150
+ eligibility: null,
33151
+ selectedTicketType: null,
33152
+ event: selectedEvent
33153
+ })).map((step) => shellLabelForRegistrationStep(step, [selectedEvent]));
33154
+ }
32989
33155
  const scopedEvents = scopeEventRegistrationEvents(source);
32990
33156
  if (scopedEvents.length === 0) return EVENT_REGISTRATION_GENERIC_SHELL_STEP_LABELS;
32991
33157
  const preSelectedEvent = findPreSelectedEvent({
@@ -33000,10 +33166,13 @@ function buildEventRegistrationShellStepLabels(source) {
33000
33166
  }) : false).map((step) => shellLabelForRegistrationStep(step, scopedEvents));
33001
33167
  }
33002
33168
  function scopeEventRegistrationEvents(source) {
33003
- return resolveEventRegistrationScopedEvents(toRegistrationEvents(source.events ?? []), {
33169
+ const scope = planEventRegistrationScope({
33170
+ events: toRegistrationEvents(source.events ?? []),
33171
+ wholeSeriesOffering: source.wholeSeriesOffering,
33004
33172
  occurrenceContext: source.occurrenceContext,
33005
33173
  subject: source.subject
33006
33174
  });
33175
+ return scope.kind === "invalidSelectedRun" ? [] : scope.events;
33007
33176
  }
33008
33177
  function shellLabelForRegistrationStep(step, events) {
33009
33178
  switch (step) {
@@ -33046,11 +33215,7 @@ const eventRegistrationBlockRuntime = defineClientOwnedBlockRuntime({
33046
33215
  maxTickets: source.maxTickets ?? void 0,
33047
33216
  showVenue: source.showVenue,
33048
33217
  showCapacity: source.showCapacity,
33049
- showSessions: source.showSessions,
33050
- showPrice: source.showPrice,
33051
33218
  successMessage: source.successMessage,
33052
- waitlistMessage: source.waitlistMessage,
33053
- membershipMessage: source.membershipMessage,
33054
33219
  buttonVariant: source.buttonVariant,
33055
33220
  overlayEnabled: source.overlayEnabled,
33056
33221
  spamProtectionEnabled: source.spamProtectionEnabled,
@@ -33180,24 +33345,6 @@ const eventRegistrationBlockDefinition = {
33180
33345
  defaultValue: true,
33181
33346
  ui: { intent: "display" }
33182
33347
  },
33183
- {
33184
- id: "showSessions",
33185
- type: "boolean",
33186
- label: "Show complete schedule",
33187
- description: "Display every session for whole-series registrations",
33188
- required: false,
33189
- defaultValue: true,
33190
- ui: { intent: "display" }
33191
- },
33192
- {
33193
- id: "showPrice",
33194
- type: "boolean",
33195
- label: "Show price",
33196
- description: "Display the whole-series price",
33197
- required: false,
33198
- defaultValue: true,
33199
- ui: { intent: "display" }
33200
- },
33201
33348
  {
33202
33349
  id: "successMessage",
33203
33350
  type: "text",
@@ -33208,26 +33355,6 @@ const eventRegistrationBlockDefinition = {
33208
33355
  defaultValue: "Thank you for registering! Check your email for confirmation details.",
33209
33356
  maxLength: 500
33210
33357
  },
33211
- {
33212
- id: "waitlistMessage",
33213
- type: "text",
33214
- label: "Waitlist message",
33215
- description: "Message shown after joining a whole-series waitlist",
33216
- required: false,
33217
- multiline: true,
33218
- defaultValue: "You've been added to the waitlist. We'll email you if a place becomes available.",
33219
- maxLength: 500
33220
- },
33221
- {
33222
- id: "membershipMessage",
33223
- type: "text",
33224
- label: "Membership registration message",
33225
- description: "Message shown when a whole-series place is covered by membership",
33226
- required: false,
33227
- multiline: true,
33228
- defaultValue: "Registered using your membership. Check your email for session details.",
33229
- maxLength: 500
33230
- },
33231
33358
  {
33232
33359
  id: "buttonText",
33233
33360
  type: "text",
@@ -33259,11 +33386,7 @@ const eventRegistrationBlockDefinition = {
33259
33386
  } },
33260
33387
  showVenue: { $bind: { from: "content.showVenue" } },
33261
33388
  showCapacity: { $bind: { from: "content.showCapacity" } },
33262
- showSessions: { $bind: { from: "content.showSessions" } },
33263
- showPrice: { $bind: { from: "content.showPrice" } },
33264
33389
  successMessage: { $bind: { from: "content.successMessage" } },
33265
- waitlistMessage: { $bind: { from: "content.waitlistMessage" } },
33266
- membershipMessage: { $bind: { from: "content.membershipMessage" } },
33267
33390
  buttonText: { $bind: {
33268
33391
  from: "content.buttonText",
33269
33392
  fallback: "Complete Registration"
@@ -33380,267 +33503,6 @@ const eventRegistrationBlockDefinition = {
33380
33503
  }
33381
33504
  };
33382
33505
  //#endregion
33383
- //#region ../blocks/src/system/runtime/nodes/course-registration.interactive.ts
33384
- const courseRegistrationHydrationSchemaShape = {
33385
- subject: eventRegistrationPageSurfaceSubjectSchema.nullable().optional(),
33386
- courses: z$1.array(publicWholeSeriesOfferingSchema).nullable().optional(),
33387
- showSessions: z$1.boolean().optional(),
33388
- showPrice: z$1.boolean().optional(),
33389
- showCapacity: z$1.boolean().optional(),
33390
- showVenue: z$1.boolean().optional(),
33391
- successMessage: z$1.string().optional(),
33392
- waitlistMessage: z$1.string().optional(),
33393
- membershipMessage: z$1.string().optional(),
33394
- buttonVariant: registrationButtonVariantSchema.optional()
33395
- };
33396
- const courseRegistrationSourceSchema = z$1.object({
33397
- siteId: z$1.string().optional(),
33398
- apiBaseUrl: z$1.string().optional(),
33399
- portalToken: z$1.string().nullable().optional(),
33400
- ...courseRegistrationHydrationSchemaShape,
33401
- className: z$1.string().nullable().optional(),
33402
- buttonText: z$1.string().nullable().optional(),
33403
- stage: previewStageSchema.optional()
33404
- });
33405
- const courseRegistrationDisplaySchema = z$1.object({
33406
- kind: z$1.literal("course-registration"),
33407
- state: z$1.literal("shell"),
33408
- className: z$1.string().nullable(),
33409
- summaryButtonText: z$1.string()
33410
- });
33411
- const courseRegistrationHydrationSchema = z$1.object(courseRegistrationHydrationSchemaShape);
33412
- const courseRegistrationRenderSchema = z$1.object({
33413
- display: courseRegistrationDisplaySchema,
33414
- hydration: courseRegistrationHydrationSchema
33415
- });
33416
- z$1.object({
33417
- siteId: z$1.string().optional(),
33418
- apiBaseUrl: z$1.string().optional(),
33419
- portalToken: z$1.string().nullable().optional(),
33420
- stage: previewStageSchema.optional()
33421
- });
33422
- function buildCourseRegistrationDisplay(source) {
33423
- return {
33424
- kind: "course-registration",
33425
- state: "shell",
33426
- className: source.className ?? null,
33427
- summaryButtonText: source.buttonText?.trim() || "Sign up"
33428
- };
33429
- }
33430
- const courseRegistrationBlockRuntime = defineClientOwnedBlockRuntime({
33431
- kind: "client-owned",
33432
- contracts: {
33433
- source: createZodCodec(courseRegistrationSourceSchema),
33434
- render: createZodCodec(courseRegistrationRenderSchema)
33435
- },
33436
- buildRender: (source) => ({
33437
- display: buildCourseRegistrationDisplay(source),
33438
- hydration: {
33439
- subject: source.subject ?? null,
33440
- courses: source.courses ?? null,
33441
- showSessions: source.showSessions,
33442
- showPrice: source.showPrice,
33443
- showCapacity: source.showCapacity,
33444
- showVenue: source.showVenue,
33445
- successMessage: source.successMessage,
33446
- waitlistMessage: source.waitlistMessage,
33447
- membershipMessage: source.membershipMessage,
33448
- buttonVariant: source.buttonVariant
33449
- }
33450
- })
33451
- });
33452
- function buildCourseRegistrationInteractiveIslandProps(props) {
33453
- return buildInteractiveIslandProps({
33454
- runtime: courseRegistrationBlockRuntime,
33455
- mode: "course-registration",
33456
- meta: {
33457
- siteId: props.siteId,
33458
- apiBaseUrl: props.apiBaseUrl,
33459
- portalToken: props.portalToken,
33460
- stage: props.stage
33461
- },
33462
- source: props
33463
- });
33464
- }
33465
- const courseRegistrationBlockDefinition = {
33466
- manifest: createBlockManifest({
33467
- id: "block.course-registration",
33468
- version: "1.0.0",
33469
- title: "Course Registration",
33470
- titleSource: "heading",
33471
- description: "Enrollment form for multi-session courses",
33472
- category: "interactive",
33473
- contentSource: { kind: "inline" },
33474
- tags: [
33475
- "courses",
33476
- "enrollment",
33477
- "booking",
33478
- "form",
33479
- "signup",
33480
- "education"
33481
- ],
33482
- icon: "GraduationCap",
33483
- styleTokens: {
33484
- background: "surface",
33485
- typography: "body",
33486
- spacing: "md"
33487
- },
33488
- behaviours: {
33489
- supportsThemeSwitching: true,
33490
- inlineEditing: false,
33491
- animation: false,
33492
- paletteHidden: false
33493
- },
33494
- additionalFields: [
33495
- {
33496
- id: "heading",
33497
- type: "text",
33498
- label: "Heading",
33499
- description: "Main heading for the registration form",
33500
- required: false,
33501
- multiline: false,
33502
- defaultValue: "Sign up"
33503
- },
33504
- {
33505
- id: "description",
33506
- type: "richText",
33507
- label: "Description",
33508
- description: "Optional introductory text",
33509
- required: false
33510
- },
33511
- {
33512
- id: "showSessions",
33513
- type: "boolean",
33514
- label: "Show sessions",
33515
- description: "Display the list of course sessions",
33516
- required: false,
33517
- defaultValue: true,
33518
- ui: { intent: "display" }
33519
- },
33520
- {
33521
- id: "showPrice",
33522
- type: "boolean",
33523
- label: "Show price",
33524
- description: "Display the course price",
33525
- required: false,
33526
- defaultValue: true,
33527
- ui: { intent: "display" }
33528
- },
33529
- {
33530
- id: "showCapacity",
33531
- type: "boolean",
33532
- label: "Show available spots",
33533
- description: "Display remaining enrollment capacity",
33534
- required: false,
33535
- defaultValue: true,
33536
- ui: { intent: "display" }
33537
- },
33538
- {
33539
- id: "showVenue",
33540
- type: "boolean",
33541
- label: "Show venue",
33542
- description: "Display venue information",
33543
- required: false,
33544
- defaultValue: true,
33545
- ui: { intent: "display" }
33546
- },
33547
- {
33548
- id: "successMessage",
33549
- type: "text",
33550
- label: "Success message",
33551
- description: "Message shown after successful enrollment",
33552
- required: false,
33553
- multiline: true,
33554
- defaultValue: "You're enrolled! Check your email for confirmation and session details.",
33555
- maxLength: 500
33556
- },
33557
- {
33558
- id: "waitlistMessage",
33559
- type: "text",
33560
- label: "Waitlist message",
33561
- description: "Message when added to waitlist",
33562
- required: false,
33563
- multiline: true,
33564
- defaultValue: "You've been added to the waitlist. We'll email you a claim link if a spot opens up.",
33565
- maxLength: 500
33566
- },
33567
- {
33568
- id: "membershipMessage",
33569
- type: "text",
33570
- label: "Membership enrollment message",
33571
- description: "Message when enrolled using a membership",
33572
- required: false,
33573
- multiline: true,
33574
- defaultValue: "Enrolled using your membership! Check your email for session details.",
33575
- maxLength: 500
33576
- },
33577
- {
33578
- id: "buttonText",
33579
- type: "text",
33580
- label: "Submit button text",
33581
- description: "Text for the enrollment submit button",
33582
- required: false,
33583
- multiline: false,
33584
- defaultValue: "Sign up",
33585
- maxLength: 40
33586
- },
33587
- createButtonVariantField()
33588
- ],
33589
- layout: [styledSection({
33590
- baseClass: "",
33591
- spacing: "spacious",
33592
- children: sectionContainer([
33593
- text({ as: "h2" }, bind("content.heading"), when("content.heading")),
33594
- richText({ className: "rb-prose rb-max-w-none" }, bind("content.description"), when("content.description")),
33595
- courseRegistration(withApiBindings({
33596
- subject: { $bind: {
33597
- from: "$root.subject",
33598
- fallback: null
33599
- } },
33600
- portalToken: { $bind: {
33601
- from: "$root.portalToken",
33602
- fallback: null
33603
- } },
33604
- showSessions: { $bind: { from: "content.showSessions" } },
33605
- showPrice: { $bind: { from: "content.showPrice" } },
33606
- showCapacity: { $bind: { from: "content.showCapacity" } },
33607
- showVenue: { $bind: { from: "content.showVenue" } },
33608
- successMessage: { $bind: { from: "content.successMessage" } },
33609
- waitlistMessage: { $bind: { from: "content.waitlistMessage" } },
33610
- membershipMessage: { $bind: { from: "content.membershipMessage" } },
33611
- buttonText: { $bind: {
33612
- from: "content.buttonText",
33613
- fallback: "Sign up"
33614
- } },
33615
- buttonVariant: { $bind: {
33616
- from: "content.buttonVariant",
33617
- fallback: "primary"
33618
- } },
33619
- courses: { $bind: { from: "data.courses" } },
33620
- stage: { $bind: {
33621
- from: "$root.previewStage",
33622
- fallback: "published"
33623
- } }
33624
- }))
33625
- ], { gap: "lg" })
33626
- })]
33627
- }),
33628
- runtime: courseRegistrationBlockRuntime,
33629
- dataSchemas: { courses: publicWholeSeriesOfferingsArraySchema.optional() },
33630
- dataLoaders: { courses: {
33631
- endpoint: "listPublicWholeSeriesOfferings",
33632
- params: {
33633
- siteId: { $bind: { from: "$root.siteId" } },
33634
- limit: "50",
33635
- stage: { $bind: {
33636
- from: "$root.previewStage",
33637
- fallback: "published"
33638
- } }
33639
- },
33640
- mode: "server"
33641
- } }
33642
- };
33643
- //#endregion
33644
33506
  //#region ../blocks/src/system/blocks/event-details.ts
33645
33507
  /**
33646
33508
  * Event Details Block
@@ -33887,200 +33749,6 @@ const eventDetailsBlockDefinition = {
33887
33749
  mode: "server"
33888
33750
  } }
33889
33751
  };
33890
- const courseDetailsBlockDefinition = {
33891
- manifest: createBlockManifest({
33892
- id: "block.course-details",
33893
- version: "1.0.0",
33894
- title: "Course Details",
33895
- titleSource: "heading",
33896
- description: "Schedule, venue, price, and enrollment status for a course",
33897
- category: "content",
33898
- contentSource: { kind: "entries" },
33899
- tags: [
33900
- "courses",
33901
- "schedule",
33902
- "sessions",
33903
- "venue",
33904
- "pricing"
33905
- ],
33906
- icon: "GraduationCap",
33907
- styleTokens: {
33908
- background: "surface",
33909
- typography: "body",
33910
- spacing: "md"
33911
- },
33912
- behaviours: {
33913
- supportsThemeSwitching: true,
33914
- inlineEditing: false,
33915
- animation: false,
33916
- paletteHidden: false
33917
- },
33918
- additionalFields: [
33919
- {
33920
- id: "heading",
33921
- type: "text",
33922
- label: "Heading",
33923
- description: "Optional heading shown above course details",
33924
- required: false,
33925
- multiline: false,
33926
- defaultValue: "Course details"
33927
- },
33928
- {
33929
- id: "showTitle",
33930
- type: "boolean",
33931
- label: "Show course title",
33932
- required: false,
33933
- defaultValue: false,
33934
- ui: { intent: "display" }
33935
- },
33936
- {
33937
- id: "showDescription",
33938
- type: "boolean",
33939
- label: "Show course description",
33940
- description: "Render the course description from the bookings course record",
33941
- required: false,
33942
- defaultValue: false,
33943
- ui: { intent: "display" }
33944
- },
33945
- {
33946
- id: "showSessions",
33947
- type: "boolean",
33948
- label: "Show sessions",
33949
- required: false,
33950
- defaultValue: true,
33951
- ui: { intent: "display" }
33952
- },
33953
- {
33954
- id: "sessionsLimit",
33955
- type: "select",
33956
- label: "Sessions limit",
33957
- required: false,
33958
- multiple: false,
33959
- defaultValue: "10",
33960
- options: [
33961
- {
33962
- value: "3",
33963
- label: "3 sessions"
33964
- },
33965
- {
33966
- value: "5",
33967
- label: "5 sessions"
33968
- },
33969
- {
33970
- value: "10",
33971
- label: "10 sessions"
33972
- },
33973
- {
33974
- value: "all",
33975
- label: "All sessions"
33976
- }
33977
- ],
33978
- ui: { intent: "display" }
33979
- },
33980
- {
33981
- id: "showVenue",
33982
- type: "boolean",
33983
- label: "Show venue",
33984
- required: false,
33985
- defaultValue: true,
33986
- ui: { intent: "display" }
33987
- },
33988
- {
33989
- id: "showPrice",
33990
- type: "boolean",
33991
- label: "Show price",
33992
- required: false,
33993
- defaultValue: true,
33994
- ui: { intent: "display" }
33995
- },
33996
- {
33997
- id: "showCapacity",
33998
- type: "boolean",
33999
- label: "Show capacity",
34000
- required: false,
34001
- defaultValue: true,
34002
- ui: { intent: "display" }
34003
- },
34004
- {
34005
- id: "showEnrollmentStatus",
34006
- type: "boolean",
34007
- label: "Show enrollment status",
34008
- required: false,
34009
- defaultValue: true,
34010
- ui: { intent: "display" }
34011
- },
34012
- {
34013
- id: "showMembershipNote",
34014
- type: "boolean",
34015
- label: "Show membership note",
34016
- description: "Indicate when memberships can be used for free enrollment",
34017
- required: false,
34018
- defaultValue: true,
34019
- ui: { intent: "display" }
34020
- }
34021
- ],
34022
- layout: [styledSection({
34023
- baseClass: "",
34024
- spacing: "spacious",
34025
- children: sectionContainer([text({ as: "h2" }, bind("content.heading"), when("content.heading")), el("course-details", {
34026
- subject: { $bind: {
34027
- from: "$root.subject",
34028
- fallback: null
34029
- } },
34030
- courses: { $bind: { from: "data.courses" } },
34031
- showTitle: { $bind: {
34032
- from: "content.showTitle",
34033
- fallback: false
34034
- } },
34035
- showDescription: { $bind: {
34036
- from: "content.showDescription",
34037
- fallback: false
34038
- } },
34039
- showSessions: { $bind: {
34040
- from: "content.showSessions",
34041
- fallback: true
34042
- } },
34043
- sessionsLimit: { $bind: {
34044
- from: "content.sessionsLimit",
34045
- fallback: "10"
34046
- } },
34047
- showVenue: { $bind: {
34048
- from: "content.showVenue",
34049
- fallback: true
34050
- } },
34051
- showPrice: { $bind: {
34052
- from: "content.showPrice",
34053
- fallback: true
34054
- } },
34055
- showCapacity: { $bind: {
34056
- from: "content.showCapacity",
34057
- fallback: true
34058
- } },
34059
- showEnrollmentStatus: { $bind: {
34060
- from: "content.showEnrollmentStatus",
34061
- fallback: true
34062
- } },
34063
- showMembershipNote: { $bind: {
34064
- from: "content.showMembershipNote",
34065
- fallback: true
34066
- } }
34067
- })], { gap: "lg" })
34068
- })]
34069
- }),
34070
- dataSchemas: { courses: publicWholeSeriesOfferingsArraySchema.optional() },
34071
- dataLoaders: { courses: {
34072
- endpoint: "listPublicWholeSeriesOfferings",
34073
- params: {
34074
- siteId: { $bind: { from: "$root.siteId" } },
34075
- limit: "50",
34076
- stage: { $bind: {
34077
- from: "$root.previewStage",
34078
- fallback: "published"
34079
- } }
34080
- },
34081
- mode: "server"
34082
- } }
34083
- };
34084
33752
  const eventSpotlightBlockDefinition = {
34085
33753
  manifest: createBlockManifest({
34086
33754
  id: "block.event-spotlight",
@@ -36635,7 +36303,7 @@ const EmptyState = ({ message = "No upcoming events scheduled.", className, hasA
36635
36303
  //#region ../blocks/src/system/runtime/nodes/events/shared/DateTimeTile.tsx
36636
36304
  /**
36637
36305
  * Shared tile content for displaying date and time range.
36638
- * Used by event-details "Other dates" and course-details "Sessions".
36306
+ * Used by event-details "Other dates".
36639
36307
  */
36640
36308
  function DateTimeTile({ startsAt, endsAt, timeZone }) {
36641
36309
  const { date, timeRange } = formatEventDateParts({
@@ -38836,6 +38504,7 @@ function normalizeGroupPresentation(value) {
38836
38504
  function resolveAutoCtaPath(source, routes) {
38837
38505
  const routeByNormalizedPath = /* @__PURE__ */ new Map();
38838
38506
  for (const route of routes ?? []) {
38507
+ if (route.kind === "pageSurface") continue;
38839
38508
  const normalized = normalizeRoutePath(route.path);
38840
38509
  if (normalized && !routeByNormalizedPath.has(normalized)) routeByNormalizedPath.set(normalized, route.path);
38841
38510
  }
@@ -38886,7 +38555,7 @@ const publicRouteCandidatesSchema = z$1.object({ routes: z$1.array(z$1.object({
38886
38555
  entityId: z$1.string(),
38887
38556
  path: z$1.string(),
38888
38557
  title: z$1.string(),
38889
- kind: z$1.enum(["page", "content"]),
38558
+ kind: z$1.enum(RESOLVED_INTERNAL_LINK_ENTITY_TYPES),
38890
38559
  contentTypeKey: z$1.string().nullable().optional()
38891
38560
  })) });
38892
38561
  const groupOverrideFields = [
@@ -39163,7 +38832,7 @@ const offeringsPreviewManifest = createBlockManifest({
39163
38832
  fallback: "published"
39164
38833
  } },
39165
38834
  routeCandidates: { $bind: { from: "data.routeCandidates" } },
39166
- courses: { $bind: { from: "data.courses" } },
38835
+ wholeSeriesOfferings: { $bind: { from: "data.wholeSeriesOfferings" } },
39167
38836
  ...offeringsPreviewEventDataBindings
39168
38837
  })
39169
38838
  ], { gap: "lg" }),
@@ -39180,7 +38849,7 @@ const offeringsPreviewBlockDefinition = {
39180
38849
  dataSchemas: {
39181
38850
  ...offeringsPreviewEventDataSchemas,
39182
38851
  routeCandidates: publicRouteCandidatesSchema.optional(),
39183
- courses: publicWholeSeriesOfferingsArraySchema.optional()
38852
+ wholeSeriesOfferings: publicWholeSeriesOfferingsArraySchema.optional()
39184
38853
  },
39185
38854
  dataLoaders: {
39186
38855
  ...offeringsPreviewEventDataLoaders,
@@ -39189,7 +38858,7 @@ const offeringsPreviewBlockDefinition = {
39189
38858
  params: {},
39190
38859
  mode: "server"
39191
38860
  },
39192
- courses: {
38861
+ wholeSeriesOfferings: {
39193
38862
  endpoint: "listPublicWholeSeriesOfferings",
39194
38863
  params: {
39195
38864
  siteId: { $bind: { from: "$root.siteId" } },
@@ -44271,22 +43940,6 @@ const systemBlockDefinitions = [
44271
43940
  weight: "standard"
44272
43941
  })]
44273
43942
  })),
44274
- withDesignCapability("block.course-registration", courseRegistrationBlockDefinition, sectionOnly(), defineBlockDesignMetadata({
44275
- flow: conversionFlow,
44276
- layoutProfiles: [layoutProfile({
44277
- variantKey: "default",
44278
- family: "form",
44279
- weight: "standard"
44280
- })]
44281
- })),
44282
- withDesignCapability("block.course-details", courseDetailsBlockDefinition, scheduleDetailsCapable(), defineBlockDesignMetadata({
44283
- flow: offeringsFlow,
44284
- layoutProfiles: [layoutProfile({
44285
- variantKey: "default",
44286
- family: "stack",
44287
- weight: "standard"
44288
- })]
44289
- })),
44290
43943
  withDesignCapability("block.event-spotlight", eventSpotlightBlockDefinition, eventSpotlightCapable(), defineBlockDesignMetadata({
44291
43944
  flow: offeringsFlow,
44292
43945
  layoutProfiles: [layoutProfile({
@@ -45214,7 +44867,7 @@ function normalizeRel(target, rel) {
45214
44867
  tokens.add("noreferrer");
45215
44868
  return Array.from(tokens).join(" ");
45216
44869
  }
45217
- function renderMarks(text, marks, key) {
44870
+ function renderMarks(text, marks, key, linkTarget) {
45218
44871
  if (!marks || marks.length === 0) return text;
45219
44872
  return marks.reduce((acc, mark) => {
45220
44873
  switch (mark.type) {
@@ -45227,7 +44880,8 @@ function renderMarks(text, marks, key) {
45227
44880
  const attrs = mark.attrs ?? {};
45228
44881
  const href = sanitizeHref(attrs.href);
45229
44882
  if (!href) return acc;
45230
- const target = typeof attrs.target === "string" && attrs.target.trim().length > 0 ? attrs.target.trim() : void 0;
44883
+ const storedTarget = typeof attrs.target === "string" && attrs.target.trim().length > 0 ? attrs.target.trim() : void 0;
44884
+ const target = linkTarget === "new-tab" ? "_blank" : storedTarget;
45231
44885
  return /* @__PURE__ */ jsx("a", {
45232
44886
  href,
45233
44887
  target,
@@ -45239,14 +44893,14 @@ function renderMarks(text, marks, key) {
45239
44893
  }
45240
44894
  }, text);
45241
44895
  }
45242
- function renderDoc(node, key, imageResolveContext) {
44896
+ function renderDoc(node, key, imageResolveContext, linkTarget) {
45243
44897
  if (!node || !node.type) return null;
45244
- const children = node.content?.map((child, index) => renderDoc(child, `${key}-${index}`, imageResolveContext));
44898
+ const children = node.content?.map((child, index) => renderDoc(child, `${key}-${index}`, imageResolveContext, linkTarget));
45245
44899
  switch (node.type) {
45246
44900
  case "doc": return /* @__PURE__ */ jsx(Fragment, { children });
45247
44901
  case "paragraph":
45248
44902
  if (!children && !node.text) return /* @__PURE__ */ jsx("p", {}, key);
45249
- return /* @__PURE__ */ jsx("p", { children: children ?? renderMarks(node.text ?? "", node.marks, key) }, key);
44903
+ return /* @__PURE__ */ jsx("p", { children: children ?? renderMarks(node.text ?? "", node.marks, key, linkTarget) }, key);
45250
44904
  case "heading": {
45251
44905
  const headingTag = `h${Math.min(Math.max(node.attrs?.level ?? 2, 1), 6)}`;
45252
44906
  return React.createElement(headingTag, { key }, children);
@@ -45288,14 +44942,14 @@ function renderDoc(node, key, imageResolveContext) {
45288
44942
  decoding: "async"
45289
44943
  }, key);
45290
44944
  }
45291
- case "text": return renderMarks(node.text ?? "", node.marks, key);
44945
+ case "text": return renderMarks(node.text ?? "", node.marks, key, linkTarget);
45292
44946
  default: return null;
45293
44947
  }
45294
44948
  }
45295
44949
  const DEFAULT_RICH_TEXT_CLASS = "rb-prose rb-max-w-none";
45296
- function RichText$2({ as: Comp = "div", className, doc, path }) {
44950
+ function RichText$2({ as: Comp = "div", className, doc, path, linkTarget = "stored" }) {
45297
44951
  const imageResolveContext = getCurrentResolveImageUrlContext() ?? null;
45298
- const content = doc ? renderDoc(doc, "doc", imageResolveContext) : null;
44952
+ const content = doc ? renderDoc(doc, "doc", imageResolveContext, linkTarget) : null;
45299
44953
  const dataAttributes = path ? { "data-builder-richtext": path } : void 0;
45300
44954
  return /* @__PURE__ */ jsx(Comp, {
45301
44955
  className: className?.trim() || DEFAULT_RICH_TEXT_CLASS,
@@ -46651,7 +46305,6 @@ function readBookingFieldType(value) {
46651
46305
  case "select":
46652
46306
  case "radio":
46653
46307
  case "checkbox":
46654
- case "booking_requirement_consent":
46655
46308
  case "tel":
46656
46309
  case "url":
46657
46310
  case "number":
@@ -46686,7 +46339,7 @@ function normalizeBookingSettings(value) {
46686
46339
  };
46687
46340
  }
46688
46341
  function isBookingFormService(value) {
46689
- return isRecord$13(value) && typeof value.id === "string" && typeof value.siteId === "string" && typeof value.title === "string";
46342
+ return isRecord$13(value) && typeof value.id === "string" && typeof value.siteId === "string" && typeof value.title === "string" && (value.consent === void 0 || blockBookingConsentSchema.safeParse(value.consent).success);
46690
46343
  }
46691
46344
  function readNonEmptyString(value) {
46692
46345
  if (typeof value !== "string") return null;
@@ -46711,6 +46364,15 @@ const bookingFieldOptionSchema = z$1.object({
46711
46364
  value: z$1.string(),
46712
46365
  label: z$1.string()
46713
46366
  });
46367
+ const standardBookingFieldRules = {
46368
+ options: z$1.array(bookingFieldOptionSchema).optional(),
46369
+ multiple: z$1.boolean().optional(),
46370
+ minLength: z$1.number().optional(),
46371
+ maxLength: z$1.number().optional(),
46372
+ pattern: z$1.string().optional(),
46373
+ min: z$1.number().optional(),
46374
+ max: z$1.number().optional()
46375
+ };
46714
46376
  const bookingFieldSchema = z$1.object({
46715
46377
  id: z$1.string(),
46716
46378
  label: z$1.string(),
@@ -46721,7 +46383,6 @@ const bookingFieldSchema = z$1.object({
46721
46383
  "select",
46722
46384
  "radio",
46723
46385
  "checkbox",
46724
- "booking_requirement_consent",
46725
46386
  "tel",
46726
46387
  "url",
46727
46388
  "number",
@@ -46731,13 +46392,7 @@ const bookingFieldSchema = z$1.object({
46731
46392
  required: z$1.boolean().optional(),
46732
46393
  placeholder: z$1.string().optional(),
46733
46394
  helpText: z$1.string().optional(),
46734
- options: z$1.array(bookingFieldOptionSchema).optional(),
46735
- multiple: z$1.boolean().optional(),
46736
- minLength: z$1.number().optional(),
46737
- maxLength: z$1.number().optional(),
46738
- pattern: z$1.string().optional(),
46739
- min: z$1.number().optional(),
46740
- max: z$1.number().optional()
46395
+ ...standardBookingFieldRules
46741
46396
  });
46742
46397
  const bookingSettingsSchema = z$1.object({
46743
46398
  type: z$1.literal("booking"),
@@ -46780,7 +46435,8 @@ const bookingServiceSchema = z$1.object({
46780
46435
  priceAmount: z$1.number().nullable().optional(),
46781
46436
  priceCurrency: z$1.string().nullable().optional(),
46782
46437
  paymentTerms: blockBookingPaymentTermsSchema.optional(),
46783
- paymentTermsAvailability: blockBookingPaymentTermsAvailabilitySchema.optional()
46438
+ paymentTermsAvailability: blockBookingPaymentTermsAvailabilitySchema.optional(),
46439
+ consent: blockBookingConsentSchema.optional()
46784
46440
  });
46785
46441
  const bookingServicesSourceSchema = z$1.union([
46786
46442
  z$1.array(bookingServiceSchema),
@@ -47046,7 +46702,7 @@ function emptySelection(timeZone) {
47046
46702
  timeZone
47047
46703
  };
47048
46704
  }
47049
- function parseLimit$1(value, fallback) {
46705
+ function parseLimit(value, fallback) {
47050
46706
  if (value === "all") return Number.MAX_SAFE_INTEGER;
47051
46707
  const n = typeof value === "string" ? parseInt(value, 10) : typeof value === "number" ? value : NaN;
47052
46708
  return Number.isFinite(n) && n > 0 ? n : fallback;
@@ -47129,7 +46785,7 @@ function selectEventDetails(args) {
47129
46785
  subject: args.subject
47130
46786
  }));
47131
46787
  const occurrenceContext = args.occurrenceContext ?? null;
47132
- const otherLimit = parseLimit$1(args.otherDatesLimit, 5);
46788
+ const otherLimit = parseLimit(args.otherDatesLimit, 5);
47133
46789
  const candidate = selectEventCandidate(all, occurrenceContext, args.nowIso);
47134
46790
  const timeZone = toBookingTimeZone(candidate?.event.timeZone ?? all[0]?.timeZone ?? null);
47135
46791
  if (!candidate) return emptySelection(timeZone);
@@ -47205,8 +46861,8 @@ function resolveEventDetailsPresentation(input) {
47205
46861
  };
47206
46862
  }
47207
46863
  //#endregion
47208
- //#region ../blocks/src/system/runtime/nodes/event-details/CoursePricingDisplay.tsx
47209
- function CoursePricingDisplay({ pricing, acceptedItems }) {
46864
+ //#region ../blocks/src/system/runtime/nodes/event-details/WholeSeriesPricingDisplay.tsx
46865
+ function WholeSeriesPricingDisplay({ pricing, acceptedItems }) {
47210
46866
  return /* @__PURE__ */ jsxs("div", {
47211
46867
  className: "rb-mt-6",
47212
46868
  children: [
@@ -47218,7 +46874,8 @@ function CoursePricingDisplay({ pricing, acceptedItems }) {
47218
46874
  className: "rb-flex rb-flex-col rb-gap-2",
47219
46875
  children: pricing.selectableOptions.map((option) => /* @__PURE__ */ jsxs("div", { children: [/* @__PURE__ */ jsxs("strong", { children: [
47220
46876
  option.name,
47221
- ": ",
46877
+ ":",
46878
+ " ",
47222
46879
  formatWholeSeriesPriceAmount(option.priceAmount, pricing.currency)
47223
46880
  ] }), option.description ? /* @__PURE__ */ jsx("p", {
47224
46881
  className: "rb-caption status-muted",
@@ -47239,7 +46896,7 @@ function formatAutoApplyDiscountLine(preview, currency) {
47239
46896
  const label = preview.publicLabel.trim() || "Discount";
47240
46897
  return preview.minTicketsRequired && preview.minTicketsRequired > 1 ? `${label} — ${rate} when buying ${preview.minTicketsRequired}+ tickets` : `${label} — ${rate} applied automatically`;
47241
46898
  }
47242
- function TeamMemberName$1({ name, profilePath }) {
46899
+ function TeamMemberName({ name, profilePath }) {
47243
46900
  return profilePath ? /* @__PURE__ */ jsx("a", {
47244
46901
  href: profilePath,
47245
46902
  className: "rb-hover-opacity-80",
@@ -47276,7 +46933,7 @@ function EventPricingDetails({ isDropIn, coursePricing, acceptedItems, eventCost
47276
46933
  children: "No registration required - just show up"
47277
46934
  })]
47278
46935
  });
47279
- if (coursePricing) return /* @__PURE__ */ jsx(CoursePricingDisplay, {
46936
+ if (coursePricing) return /* @__PURE__ */ jsx(WholeSeriesPricingDisplay, {
47280
46937
  pricing: coursePricing,
47281
46938
  acceptedItems: [...acceptedItems]
47282
46939
  });
@@ -47351,7 +47008,7 @@ function EventFacts({ selection, selected, venue, teamMembers, pricing, showCapa
47351
47008
  children: "With"
47352
47009
  }), /* @__PURE__ */ jsx("div", {
47353
47010
  className: "rb-flex rb-flex-col rb-gap-3",
47354
- children: teamMembers.map((member) => /* @__PURE__ */ jsxs("div", { children: [/* @__PURE__ */ jsx("p", { children: /* @__PURE__ */ jsx(TeamMemberName$1, {
47011
+ children: teamMembers.map((member) => /* @__PURE__ */ jsxs("div", { children: [/* @__PURE__ */ jsx("p", { children: /* @__PURE__ */ jsx(TeamMemberName, {
47355
47012
  name: member.name,
47356
47013
  profilePath: member.profilePath
47357
47014
  }) }), member.summary ? /* @__PURE__ */ jsx("p", {
@@ -47630,352 +47287,6 @@ function LocationMapSSR(props) {
47630
47287
  });
47631
47288
  }
47632
47289
  //#endregion
47633
- //#region ../blocks/src/system/runtime/nodes/event-registration/whole-series/wholeSeriesPageSurfaceScope.ts
47634
- /**
47635
- * Resolves native run-page ownership without falling back to entry or slug
47636
- * coincidence when a page-surface subject is present but invalid.
47637
- */
47638
- function resolveWholeSeriesPageSurfaceScope(runs, subjectValue) {
47639
- if (subjectValue === null || subjectValue === void 0) return { kind: "absent" };
47640
- const parsed = parseEventPageSurfaceSubject(subjectValue);
47641
- if (!parsed.ok) return {
47642
- kind: "unsupported",
47643
- reason: parsed.error.kind
47644
- };
47645
- const seriesIds = eventSeriesIdsForSubject(parsed.value);
47646
- const allowedSeriesIds = new Set(seriesIds);
47647
- return {
47648
- kind: "scoped",
47649
- subject: parsed.value,
47650
- runs: runs.filter((run) => allowedSeriesIds.has(run.eventSeriesId))
47651
- };
47652
- }
47653
- function eventSeriesIdsForSubject(subject) {
47654
- switch (subject.kind) {
47655
- case "eventSeries": return [subject.eventSeriesId];
47656
- case "eventOffering": return subject.availableEventSeriesIds;
47657
- default: return assertNever$23(subject);
47658
- }
47659
- }
47660
- //#endregion
47661
- //#region ../blocks/src/system/runtime/nodes/course-page-surface-scope.ts
47662
- /** Temporary Course-block adapter over canonical Event run scoping. */
47663
- function resolveCoursePageSurfaceScope(courses, subjectValue) {
47664
- const scope = resolveWholeSeriesPageSurfaceScope(courses, subjectValue);
47665
- return scope.kind === "scoped" ? {
47666
- kind: "scoped",
47667
- subject: scope.subject,
47668
- courses: scope.runs
47669
- } : scope;
47670
- }
47671
- //#endregion
47672
- //#region ../blocks/src/system/runtime/nodes/course-details/logic.ts
47673
- function selectCourseDetails(args) {
47674
- const pageSurfaceScope = resolveCoursePageSurfaceScope((args.courses ?? []).filter(Boolean), args.subject);
47675
- if (pageSurfaceScope.kind === "unsupported") return {
47676
- mode: "unsupportedPageSurfaceSubject",
47677
- selected: null,
47678
- scoped: []
47679
- };
47680
- if (pageSurfaceScope.kind === "scoped") {
47681
- const scoped = [...pageSurfaceScope.courses];
47682
- return {
47683
- mode: "pageSurfaceSubject",
47684
- selected: scoped.length === 1 ? scoped[0] ?? null : null,
47685
- scoped
47686
- };
47687
- }
47688
- return {
47689
- mode: "unsupportedPageSurfaceSubject",
47690
- selected: null,
47691
- scoped: []
47692
- };
47693
- }
47694
- //#endregion
47695
- //#region ../blocks/src/system/runtime/nodes/course-details/runs.ts
47696
- function toValidDate(value) {
47697
- if (!value) return null;
47698
- const date = new Date(value);
47699
- return Number.isNaN(date.getTime()) ? null : date;
47700
- }
47701
- function getCourseDateRange(course) {
47702
- const datedSessions = (course.sessions ?? []).map((session) => ({
47703
- session,
47704
- start: toValidDate(session.startsAt),
47705
- end: toValidDate(session.endsAt)
47706
- })).filter((value) => value.start !== null || value.end !== null);
47707
- if (datedSessions.length === 0) return {
47708
- start: null,
47709
- end: null,
47710
- startIso: null,
47711
- endIso: null,
47712
- timeZone: null
47713
- };
47714
- const startSession = datedSessions.filter((value) => value.start !== null).reduce((earliest, current) => earliest === null || current.start.getTime() < earliest.start.getTime() ? current : earliest, null);
47715
- const endSession = datedSessions.filter((value) => value.end !== null).reduce((latest, current) => latest === null || current.end.getTime() > latest.end.getTime() ? current : latest, null);
47716
- return {
47717
- start: startSession?.start ?? null,
47718
- end: endSession?.end ?? null,
47719
- startIso: startSession?.session.startsAt ?? null,
47720
- endIso: endSession?.session.endsAt ?? null,
47721
- timeZone: startSession?.session.timeZone ?? endSession?.session.timeZone ?? null
47722
- };
47723
- }
47724
- function formatCourseDateRange(range) {
47725
- const { startIso, endIso, timeZone } = range;
47726
- const dateFormat = {
47727
- month: "numeric",
47728
- day: "numeric",
47729
- year: "numeric"
47730
- };
47731
- const effectiveTimeZone = toBookingTimeZone(timeZone);
47732
- const formatSingleDate = (iso) => formatBookingDate(toScheduledBookingDateTime({
47733
- startsAt: iso,
47734
- timeZone: effectiveTimeZone
47735
- }), dateFormat);
47736
- const formatRangeDateOnly = (startsAt, endsAt) => {
47737
- const startText = formatSingleDate(startsAt);
47738
- const endText = formatSingleDate(endsAt);
47739
- return startText === endText ? startText : `${startText} – ${endText}`;
47740
- };
47741
- if (!startIso && !endIso) return "Dates TBD";
47742
- if (startIso && !endIso) return formatSingleDate(startIso);
47743
- if (!startIso && endIso) return formatSingleDate(endIso);
47744
- if (!startIso || !endIso) return "Dates TBD";
47745
- return formatRangeDateOnly(startIso, endIso);
47746
- }
47747
- //#endregion
47748
- //#region ../blocks/src/system/runtime/nodes/course-details/view.tsx
47749
- function TeamMemberName({ name, profilePath }) {
47750
- return profilePath ? /* @__PURE__ */ jsx("a", {
47751
- href: profilePath,
47752
- className: "rb-hover-opacity-80",
47753
- children: /* @__PURE__ */ jsx("strong", { children: name })
47754
- }) : /* @__PURE__ */ jsx("strong", { children: name });
47755
- }
47756
- function parseLimit(value, fallback) {
47757
- if (value === "all") return "all";
47758
- const n = typeof value === "string" ? Number.parseInt(value, 10) : typeof value === "number" ? value : NaN;
47759
- return Number.isFinite(n) && n > 0 ? n : fallback;
47760
- }
47761
- function CourseDetailsView(props) {
47762
- const { course, showTitle = false, showDescription = false, showSessions = true, sessionsLimit, showVenue = true, showPrice = true, showCapacity = true, showEnrollmentStatus = true, showMembershipNote = true, emptyMessage = "Course details unavailable." } = props;
47763
- if (!course) return /* @__PURE__ */ jsx("p", {
47764
- className: "rb-caption status-muted",
47765
- children: emptyMessage
47766
- });
47767
- const pricing = resolveWholeSeriesPricingState(course);
47768
- const sessionLimit = parseLimit(sessionsLimit, 10);
47769
- const sortedSessions = [...course.sessions ?? []].sort((a, b) => Date.parse(a.startsAt) - Date.parse(b.startsAt));
47770
- const visibleSessions = sessionLimit === "all" ? sortedSessions : sortedSessions.slice(0, sessionLimit);
47771
- const hasMoreSessions = sessionLimit !== "all" && sortedSessions.length > sessionLimit;
47772
- const descriptionDoc = showDescription ? coerceRichTextDoc(course.description, "block-runtime:course-details:description") : null;
47773
- const teamMembers = course.teamMembers ?? [];
47774
- return /* @__PURE__ */ jsxs("div", {
47775
- className: "rb-flex rb-flex-col rb-gap-6",
47776
- children: [
47777
- showTitle && /* @__PURE__ */ jsx("h3", { children: course.title }),
47778
- /* @__PURE__ */ jsxs("div", {
47779
- className: "rb-grid rb-grid-cols-1 rb-gap-6 rb-items-start rb-sm-grid-cols-2",
47780
- children: [/* @__PURE__ */ jsxs("div", {
47781
- className: "rb-flex rb-flex-col rb-gap-4",
47782
- children: [
47783
- showPrice && /* @__PURE__ */ jsxs("div", { children: [/* @__PURE__ */ jsx("div", {
47784
- className: "rb-label rb-mb-2",
47785
- children: pricing.selectableOptions.length > 0 ? "Pricing" : "Price"
47786
- }), pricing.selectableOptions.length > 1 ? /* @__PURE__ */ jsx("div", {
47787
- className: "rb-flex rb-flex-col rb-gap-2",
47788
- children: pricing.selectableOptions.map((option) => /* @__PURE__ */ jsxs("div", { children: [/* @__PURE__ */ jsxs("strong", { children: [
47789
- option.name,
47790
- ": ",
47791
- formatWholeSeriesPriceAmount(option.priceAmount, pricing.currency)
47792
- ] }), option.description ? /* @__PURE__ */ jsx("p", {
47793
- className: "rb-caption status-muted",
47794
- children: option.description
47795
- }) : null] }, option.id))
47796
- }) : /* @__PURE__ */ jsx("div", { children: /* @__PURE__ */ jsx("strong", { children: formatWholeSeriesPriceDisplay(pricing.display) }) })] }),
47797
- showCapacity && /* @__PURE__ */ jsxs("div", { children: [/* @__PURE__ */ jsx("div", {
47798
- className: "rb-label rb-mb-2",
47799
- children: "Spots"
47800
- }), /* @__PURE__ */ jsx("div", { children: /* @__PURE__ */ jsx("strong", { children: course.enrollmentCapacity === null ? "Unlimited" : `${course.availableSpots ?? Math.max(0, course.enrollmentCapacity - course.enrolledCount)} left` }) })] }),
47801
- showMembershipNote && course.acceptsMemberships && /* @__PURE__ */ jsxs("div", { children: [/* @__PURE__ */ jsx("div", {
47802
- className: "rb-label rb-mb-2",
47803
- children: "Membership"
47804
- }), /* @__PURE__ */ jsx("p", {
47805
- className: "rb-caption status-muted",
47806
- children: "Eligible memberships can be used for free enrollment"
47807
- })] }),
47808
- teamMembers.length > 0 && /* @__PURE__ */ jsxs("div", { children: [/* @__PURE__ */ jsx("div", {
47809
- className: "rb-label rb-mb-2",
47810
- children: "With"
47811
- }), /* @__PURE__ */ jsx("div", {
47812
- className: "rb-flex rb-flex-col rb-gap-3",
47813
- children: teamMembers.map((teamMember) => /* @__PURE__ */ jsxs("div", { children: [/* @__PURE__ */ jsx("p", { children: /* @__PURE__ */ jsx(TeamMemberName, {
47814
- name: teamMember.name,
47815
- profilePath: teamMember.profilePath
47816
- }) }), teamMember.summary && /* @__PURE__ */ jsx("p", {
47817
- className: "rb-caption status-muted",
47818
- children: teamMember.summary
47819
- })] }, teamMember.id))
47820
- })] })
47821
- ]
47822
- }), /* @__PURE__ */ jsxs("div", {
47823
- className: "rb-flex rb-flex-col rb-gap-4",
47824
- children: [showVenue && course.venue && /* @__PURE__ */ jsxs("div", { children: [
47825
- /* @__PURE__ */ jsx("div", {
47826
- className: "rb-label rb-mb-2",
47827
- children: "Venue"
47828
- }),
47829
- /* @__PURE__ */ jsx("h3", { children: course.venue.name }),
47830
- course.venue.address && /* @__PURE__ */ jsx("p", {
47831
- className: "rb-caption status-muted",
47832
- children: course.venue.address
47833
- })
47834
- ] }), showEnrollmentStatus && /* @__PURE__ */ jsxs("div", { children: [/* @__PURE__ */ jsx("div", {
47835
- className: "rb-label rb-mb-2",
47836
- children: "Enrollment"
47837
- }), /* @__PURE__ */ jsx("p", {
47838
- className: course.enrollmentOpen ? "cd-enrollment--open" : "cd-enrollment--closed",
47839
- children: /* @__PURE__ */ jsx("strong", { children: course.enrollmentOpen ? "Open" : "Closed" })
47840
- })] })]
47841
- })]
47842
- }),
47843
- descriptionDoc && /* @__PURE__ */ jsx("div", {
47844
- className: "cd-description",
47845
- children: /* @__PURE__ */ jsx(RichText$2, { doc: descriptionDoc })
47846
- }),
47847
- showSessions && visibleSessions.length > 0 && /* @__PURE__ */ jsxs("div", { children: [
47848
- /* @__PURE__ */ jsx("div", {
47849
- className: "rb-label",
47850
- children: "Sessions"
47851
- }),
47852
- /* @__PURE__ */ jsx("div", {
47853
- className: "rb-mt-2 rb-tiles-grid",
47854
- children: visibleSessions.map((s) => /* @__PURE__ */ jsx("div", {
47855
- className: "rb-tile",
47856
- children: /* @__PURE__ */ jsx(DateTimeTile, {
47857
- startsAt: s.startsAt,
47858
- endsAt: s.endsAt
47859
- })
47860
- }, s.id))
47861
- }),
47862
- hasMoreSessions && /* @__PURE__ */ jsxs("p", {
47863
- className: "cd-sessions__more",
47864
- children: [
47865
- "Showing ",
47866
- visibleSessions.length,
47867
- " of ",
47868
- sortedSessions.length,
47869
- " sessions."
47870
- ]
47871
- })
47872
- ] })
47873
- ]
47874
- });
47875
- }
47876
- //#endregion
47877
- //#region ../blocks/src/system/runtime/nodes/course-details.server.tsx
47878
- function CourseDetailsSSR({ courses, subject, showTitle, showDescription, showSessions, sessionsLimit, showVenue, showPrice, showCapacity, showEnrollmentStatus, showMembershipNote, className, children }) {
47879
- const selection = selectCourseDetails({
47880
- courses: courses ?? null,
47881
- subject
47882
- });
47883
- const parsedSubject = parseEventPageSurfaceSubject(subject);
47884
- const awaitingOfferingRuns = parsedSubject.ok && parsedSubject.value.kind === "eventOffering" && parsedSubject.value.availableEventSeriesIds.length === 0;
47885
- const now = /* @__PURE__ */ new Date();
47886
- const scopedWithRange = selection.scoped.map((c) => ({
47887
- course: c,
47888
- range: getCourseDateRange(c)
47889
- }));
47890
- const scopedSorted = [...scopedWithRange].sort((a, b) => {
47891
- return (a.range.start?.getTime() ?? 0) - (b.range.start?.getTime() ?? 0);
47892
- });
47893
- const lastPastRun = scopedWithRange.filter(({ range }) => Boolean(range.end && range.end <= now)).sort((a, b) => (b.range.end?.getTime() ?? 0) - (a.range.end?.getTime() ?? 0))[0] ?? null;
47894
- const nonPastRuns = scopedSorted.filter(({ range }) => !(range.end && range.end <= now));
47895
- return /* @__PURE__ */ jsxs("div", {
47896
- className: `course-details ${className ?? ""}`.trim(),
47897
- "data-block": "course-details",
47898
- children: [selection.selected ? /* @__PURE__ */ jsx(CourseDetailsView, {
47899
- course: selection.selected,
47900
- showTitle,
47901
- showDescription,
47902
- showSessions,
47903
- sessionsLimit,
47904
- showVenue,
47905
- showPrice,
47906
- showCapacity,
47907
- showEnrollmentStatus,
47908
- showMembershipNote
47909
- }) : selection.scoped.length > 0 ? /* @__PURE__ */ jsxs("div", {
47910
- className: "rb-flex rb-flex-col rb-gap-3",
47911
- children: [
47912
- /* @__PURE__ */ jsxs("div", { children: [/* @__PURE__ */ jsx("div", {
47913
- className: "rb-label rb-mb-2",
47914
- children: "Upcoming runs"
47915
- }), /* @__PURE__ */ jsx("p", {
47916
- className: "rb-caption status-muted",
47917
- children: "Choose a run to see sessions and details."
47918
- })] }),
47919
- nonPastRuns.length > 0 ? /* @__PURE__ */ jsx("ul", {
47920
- className: "rb-flex rb-flex-col rb-gap-2",
47921
- children: nonPastRuns.map(({ course, range }) => {
47922
- const start = range.start;
47923
- const end = range.end;
47924
- const isInProgress = Boolean(start && end && start <= now && end > now);
47925
- return /* @__PURE__ */ jsx("li", {
47926
- className: "rb-rounded-md rb-border rb-p-3",
47927
- children: /* @__PURE__ */ jsx("div", {
47928
- className: "rb-flex rb-flex-col rb-gap-1",
47929
- children: /* @__PURE__ */ jsxs("div", {
47930
- className: "rb-flex rb-items-center rb-justify-between rb-gap-3",
47931
- children: [/* @__PURE__ */ jsxs("div", {
47932
- className: "rb-min-w-0",
47933
- children: [/* @__PURE__ */ jsx("div", {
47934
- className: "rb-truncate",
47935
- children: /* @__PURE__ */ jsx("strong", { children: course.title })
47936
- }), /* @__PURE__ */ jsx("div", {
47937
- className: "rb-caption status-muted",
47938
- children: formatCourseDateRange(range)
47939
- })]
47940
- }), /* @__PURE__ */ jsx("div", {
47941
- className: "rb-caption status-muted rb-shrink-0",
47942
- children: course.enrollmentOpen ? "Enrollment open" : isInProgress ? "Currently in progress" : "Enrollment closed"
47943
- })]
47944
- })
47945
- })
47946
- }, course.eventSeriesId);
47947
- })
47948
- }) : /* @__PURE__ */ jsx("p", {
47949
- className: "rb-caption status-muted",
47950
- children: "No upcoming runs."
47951
- }),
47952
- lastPastRun ? /* @__PURE__ */ jsxs("div", {
47953
- className: "rb-caption status-muted",
47954
- children: [
47955
- "Last run: ",
47956
- /* @__PURE__ */ jsx("strong", { children: lastPastRun.course.title }),
47957
- " (",
47958
- formatCourseDateRange(lastPastRun.range),
47959
- ")"
47960
- ]
47961
- }) : null
47962
- ]
47963
- }) : /* @__PURE__ */ jsx(CourseDetailsView, {
47964
- course: null,
47965
- emptyMessage: awaitingOfferingRuns ? "New dates are coming soon." : "Course details unavailable.",
47966
- showTitle,
47967
- showDescription,
47968
- showSessions,
47969
- sessionsLimit,
47970
- showVenue,
47971
- showPrice,
47972
- showCapacity,
47973
- showEnrollmentStatus,
47974
- showMembershipNote
47975
- }), children]
47976
- });
47977
- }
47978
- //#endregion
47979
47290
  //#region ../blocks/src/system/runtime/nodes/events/EventSpotlight.tsx
47980
47291
  /**
47981
47292
  * EventSpotlight Component
@@ -48179,7 +47490,7 @@ function deriveCourseScheduleSummary(course) {
48179
47490
  sessionCount: sessions.length
48180
47491
  };
48181
47492
  }
48182
- function nextCourseSessionStart(course) {
47493
+ function nextWholeSeriesSessionStart(course) {
48183
47494
  return [...course.sessions].filter(isValidOccurrence).map((session) => session.startsAt).sort((left, right) => left.localeCompare(right))[0] ?? null;
48184
47495
  }
48185
47496
  function occurrenceFromEvent(event) {
@@ -48333,7 +47644,7 @@ const OFFERINGS_PREVIEW_GRID_STYLE = {
48333
47644
  function buildItemDataMap(props) {
48334
47645
  const routeCandidates = props.routeCandidates?.routes ?? [];
48335
47646
  const entries = OFFERINGS_PREVIEW_EVENT_PRESET_DEFINITIONS.map((definition) => [definition.sourceKey, eventDataFromMaybeArray(props[definition.dataKey])]);
48336
- return new Map([...entries, ["course", courseDataFromMaybeArray(props.courses, routeCandidates)]]);
47647
+ return new Map([...entries, ["course", courseDataFromMaybeArray(props.wholeSeriesOfferings, routeCandidates)]]);
48337
47648
  }
48338
47649
  function eventDataFromMaybeArray(events) {
48339
47650
  return events ? {
@@ -48387,8 +47698,8 @@ function renderOfferingGroupItems(presentation, items, options) {
48387
47698
  }
48388
47699
  }
48389
47700
  function compareCoursesByNextSession(left, right) {
48390
- const leftStart = nextCourseSessionStart(left);
48391
- const rightStart = nextCourseSessionStart(right);
47701
+ const leftStart = nextWholeSeriesSessionStart(left);
47702
+ const rightStart = nextWholeSeriesSessionStart(right);
48392
47703
  if (leftStart === null) return rightStart === null ? 0 : 1;
48393
47704
  if (rightStart === null) return -1;
48394
47705
  return leftStart.localeCompare(rightStart);
@@ -49327,45 +48638,6 @@ function CheckoutSSR({ blockId, siteId, apiBaseUrl, stage, children, ...rest })
49327
48638
  });
49328
48639
  }
49329
48640
  //#endregion
49330
- //#region ../blocks/src/system/runtime/nodes/course-registration.server.tsx
49331
- /**
49332
- * Server-safe placeholder for course registration.
49333
- * Provides a static container for island hydration without importing client hooks.
49334
- */
49335
- function CourseRegistrationSSR({ blockId, siteId, apiBaseUrl, portalToken, subject, courses, className, showSessions, showPrice, showCapacity, showVenue, successMessage, waitlistMessage, membershipMessage, buttonText, buttonVariant, stage, children }) {
49336
- const islandProps = buildCourseRegistrationInteractiveIslandProps({
49337
- siteId,
49338
- apiBaseUrl,
49339
- portalToken,
49340
- subject,
49341
- courses,
49342
- className,
49343
- showSessions,
49344
- showPrice,
49345
- showCapacity,
49346
- showVenue,
49347
- successMessage,
49348
- waitlistMessage,
49349
- membershipMessage,
49350
- buttonText,
49351
- buttonVariant,
49352
- stage
49353
- });
49354
- return /* @__PURE__ */ jsxs("div", {
49355
- className: `course-registration ${className ?? ""}`.trim(),
49356
- "data-block": "course-registration",
49357
- ...getIslandRootProps("course-registration", blockId),
49358
- children: [
49359
- /* @__PURE__ */ jsx(IslandPropsScript, { value: islandProps }),
49360
- /* @__PURE__ */ jsx("div", {
49361
- className: "course-registration__summary",
49362
- children: /* @__PURE__ */ jsx("strong", { children: islandProps.render.display.summaryButtonText })
49363
- }),
49364
- children
49365
- ]
49366
- });
49367
- }
49368
- //#endregion
49369
48641
  //#region ../blocks/src/system/runtime/nodes/gifting.server.tsx
49370
48642
  function GiftingSSR({ blockId, ...rest }) {
49371
48643
  const islandProps = buildGiftingInteractiveIslandProps(rest);
@@ -50851,7 +50123,6 @@ const runtimeBackedBlockServerEntries = {
50851
50123
  "product-detail": defineRuntimeBackedBlockEntry(requireRuntimeBackedBlockDefinition(productDetailBlockDefinition), ProductDetailSSR),
50852
50124
  cart: defineRuntimeBackedBlockEntry(requireRuntimeBackedBlockDefinition(cartBlockDefinition), CartSSR),
50853
50125
  checkout: defineRuntimeBackedBlockEntry(requireRuntimeBackedBlockDefinition(checkoutBlockDefinition), CheckoutSSR),
50854
- "course-registration": defineRuntimeBackedBlockEntry(requireRuntimeBackedBlockDefinition(courseRegistrationBlockDefinition), CourseRegistrationSSR),
50855
50126
  gifting: defineRuntimeBackedBlockEntry(requireRuntimeBackedBlockDefinition(giftingBlockDefinition), GiftingSSR),
50856
50127
  "event-registration": defineRuntimeBackedBlockEntry(requireRuntimeBackedBlockDefinition(eventRegistrationBlockDefinition), EventRegistrationSSR),
50857
50128
  shop: defineRuntimeBackedBlockEntry(requireRuntimeBackedBlockDefinition(shopBlockDefinition), ShopSSR)
@@ -50884,7 +50155,6 @@ const serverComponentRegistry = {
50884
50155
  "booking-form": BookingFormSSR,
50885
50156
  "event-details": EventDetailsSSR,
50886
50157
  "location-map": LocationMapSSR,
50887
- "course-details": CourseDetailsSSR,
50888
50158
  "event-spotlight": EventSpotlight,
50889
50159
  "event-combined": EventCombinedSSR,
50890
50160
  "offerings-preview": OfferingsPreviewNode,
@@ -52371,12 +51641,46 @@ function collectConstrainedVideoMediaValues(options) {
52371
51641
  */
52372
51642
  function hydrateManifestLinks(manifest, content, routes, pagesByIdentifier, entriesByIdentifier) {
52373
51643
  if (!routes || !manifest?.fields?.length) return content;
52374
- return hydrateValue(content, {
51644
+ return hydrateLinks(content, routes, pagesByIdentifier, entriesByIdentifier);
51645
+ }
51646
+ /** Hydrate identifier-aware links in data loaded after manifest content. */
51647
+ function hydrateLinks(value, routes, pagesByIdentifier, entriesByIdentifier) {
51648
+ return hydrateValue(value, {
51649
+ routes,
51650
+ pagesByIdentifier,
51651
+ entriesByIdentifier
51652
+ });
51653
+ }
51654
+ /**
51655
+ * Hydrate links only inside resolved booking-consent documents. Loader payloads are
51656
+ * otherwise opaque and may legitimately contain objects that resemble link values.
51657
+ */
51658
+ function hydrateResolvedBookingConsentLinks(value, routes, pagesByIdentifier, entriesByIdentifier) {
51659
+ return hydrateResolvedBookingConsentValue(value, {
52375
51660
  routes,
52376
51661
  pagesByIdentifier,
52377
51662
  entriesByIdentifier
52378
51663
  });
52379
51664
  }
51665
+ function hydrateResolvedBookingConsentValue(value, context) {
51666
+ if (Array.isArray(value)) {
51667
+ const hydratedItems = value.map((item) => hydrateResolvedBookingConsentValue(item, context));
51668
+ return hydratedItems.every((item, index) => item === value[index]) ? value : hydratedItems;
51669
+ }
51670
+ if (!isRecord$27(value)) return value;
51671
+ if (isBookingConsentCarrier(value)) {
51672
+ const agreement = hydrateValue(value.agreement, context);
51673
+ return agreement === value.agreement ? value : {
51674
+ ...value,
51675
+ agreement
51676
+ };
51677
+ }
51678
+ const hydratedEntries = Object.entries(value).map(([key, entry]) => [key, hydrateResolvedBookingConsentValue(entry, context)]);
51679
+ return hydratedEntries.every(([key, entry]) => entry === value[key]) ? value : Object.fromEntries(hydratedEntries);
51680
+ }
51681
+ function isBookingConsentCarrier(value) {
51682
+ return bookingConsentCarrierSchema.safeParse(value).success;
51683
+ }
52380
51684
  function hydrateValue(value, context) {
52381
51685
  try {
52382
51686
  if (Array.isArray(value)) {
@@ -52445,6 +51749,13 @@ function hydrateEntryLink(link, context) {
52445
51749
  };
52446
51750
  }
52447
51751
  //#endregion
51752
+ //#region ../blocks/src/system/manifest/resolveBlockData.ts
51753
+ function resolveBlockData$1(blockId, dataLoaders, dataContext, routes) {
51754
+ const raw = blockId ? dataContext?.resolvedData?.[blockId] : void 0;
51755
+ if (isRecord$27(raw)) return routes ? hydrateResolvedBookingConsentLinks(raw, routes, dataContext?.pagesByIdentifier, dataContext?.entriesByIdentifier) : raw;
51756
+ return dataLoaders && typeof dataLoaders === "object" && Object.keys(dataLoaders).length > 0 ? {} : void 0;
51757
+ }
51758
+ //#endregion
52448
51759
  //#region ../blocks/src/sdkBlockTransform.ts
52449
51760
  /**
52450
51761
  * Transforms an SDK custom block into a BlockManifest.
@@ -53039,8 +52350,8 @@ function generateInputCss({ themeId, theme, inputSystem }) {
53039
52350
  const radioSelector = `${rootSelector} .form-radio`;
53040
52351
  const checkableRules = [];
53041
52352
  checkableRules.push("appearance: none");
53042
- checkableRules.push("width: 1rem");
53043
- checkableRules.push("height: 1rem");
52353
+ checkableRules.push("width: 1.125rem");
52354
+ checkableRules.push("height: 1.125rem");
53044
52355
  checkableRules.push("flex-shrink: 0");
53045
52356
  checkableRules.push(`border: ${borderPx} solid ${rgbColorValue(inputSystem.base.border.colorToken)}`);
53046
52357
  if (inputSystem.base.background.type === "transparent") checkableRules.push("background-color: transparent");
@@ -55298,176 +54609,6 @@ ${root} {
55298
54609
  `;
55299
54610
  }
55300
54611
  //#endregion
55301
- //#region ../theme-core/src/blocks/vars/course-details.ts
55302
- /**
55303
- * Generate CSS variables for the course-details block.
55304
- *
55305
- * Variables defined:
55306
- * - Enrollment status colors (open/closed)
55307
- * - Capacity indicator colors (available/low/full)
55308
- * - Price display colors (free indicator)
55309
- */
55310
- function generateCourseDetailsVars({ themeId }) {
55311
- return `
55312
- ${`:where([data-theme-scope="${themeId}"]) :where([data-block="course-details"])`} {
55313
- /* Enrollment status */
55314
- --cd-enrollment-open-text: rgb(var(--tb-success));
55315
- --cd-enrollment-closed-text: rgb(var(--tb-mutedText));
55316
-
55317
- /* Capacity indicator */
55318
- --cd-capacity-available-text: rgb(var(--tb-success));
55319
- --cd-capacity-low-text: rgb(var(--tb-warning));
55320
- --cd-capacity-full-text: rgb(var(--tb-destructive, 239 68 68));
55321
-
55322
- /* Price styling */
55323
- --cd-price-free-text: rgb(var(--tb-success));
55324
- }
55325
- `;
55326
- }
55327
- //#endregion
55328
- //#region ../theme-core/src/blocks/vars/course-registration.ts
55329
- const EVENT_WHOLE_SERIES_VARIABLE_BRIDGE = `
55330
- /* Temporary bridge while persisted Course blocks render the Event-owned
55331
- whole-series registration runtime. Removed with the Course block. */
55332
- --er-step-active: var(--cr-step-active);
55333
- --er-step-inactive: var(--cr-step-inactive);
55334
- --er-step-completed: var(--cr-step-completed);
55335
- --er-step-text: var(--cr-step-text);
55336
- --er-step-text-active: var(--cr-step-text-active);
55337
- --er-step-connector: var(--cr-step-connector);
55338
- --er-step-title-size: var(--cr-step-title-size);
55339
- --er-success-bg: var(--cr-success-bg);
55340
- --er-success-text: var(--cr-success-text);
55341
- --er-error-bg: var(--cr-error-bg);
55342
- --er-error-text: var(--cr-error-text);
55343
- --er-waitlist-bg: var(--cr-waitlist-bg);
55344
- --er-waitlist-text: var(--cr-waitlist-text);
55345
- --er-capacity-available-bg: var(--cr-capacity-available-bg);
55346
- --er-capacity-available-text: var(--cr-capacity-available-text);
55347
- --er-capacity-low-bg: var(--cr-capacity-low-bg);
55348
- --er-capacity-low-text: var(--cr-capacity-low-text);
55349
- --er-capacity-soldout-bg: var(--cr-capacity-soldout-bg);
55350
- --er-capacity-soldout-text: var(--cr-capacity-soldout-text);
55351
- --er-border: var(--cr-border);
55352
- --er-border-hover: var(--cr-border-hover);
55353
- --er-border-selected: var(--cr-border-selected);
55354
- --er-border-error: var(--cr-border-error);
55355
- --er-focus-ring: var(--cr-focus-ring);
55356
- --er-required: var(--cr-required);
55357
- --er-payment-border: var(--cr-payment-border);
55358
- --er-payment-border-hover: var(--cr-payment-border-hover);
55359
- --er-payment-border-selected: var(--cr-payment-border-selected);
55360
- --er-payment-bg-selected: var(--cr-payment-bg-selected);
55361
- --er-check-bg: var(--cr-check-bg);
55362
- --er-check-text: var(--cr-check-text);
55363
- --er-summary-bg: var(--cr-summary-bg);
55364
- --er-summary-border: var(--cr-summary-border);
55365
- --er-on-surface: rgb(var(--tb-onSurface, var(--tb-text)));
55366
- --er-on-surface-hover-bg: rgba(var(--tb-onSurface, var(--tb-text)), 0.05);
55367
- `;
55368
- /**
55369
- * Generate CSS variables for the course-registration block.
55370
- *
55371
- * Variables defined:
55372
- * - Step indicator colors (active, inactive, completed, text, connector)
55373
- * - Success/error/waitlist state backgrounds and text colors
55374
- * - Capacity badge colors (available, low, sold-out)
55375
- * - Border colors for various interaction states
55376
- * - Input focus and required marker styling
55377
- * - Payment option card styling
55378
- * - Checkmark indicator colors
55379
- * - Summary styling
55380
- */
55381
- function generateCourseRegistrationVars({ themeId }) {
55382
- return `
55383
- ${`:where([data-theme-scope="${themeId}"]) :where([data-block="course-registration"])`} {
55384
- /* Step indicator */
55385
- --cr-step-active: rgb(var(--tb-primary));
55386
- --cr-step-inactive: rgb(var(--tb-mutedText));
55387
- --cr-step-completed: rgb(var(--tb-success));
55388
- --cr-step-text: rgb(255 255 255);
55389
- --cr-step-text-active: rgb(var(--tb-primaryText, 255 255 255));
55390
- --cr-step-connector: rgba(var(--tb-border), 0.5);
55391
-
55392
- /* Step title */
55393
- --cr-step-title-size: 1.5rem;
55394
-
55395
- /* State backgrounds with alpha */
55396
- --cr-success-bg: rgba(var(--tb-success), 0.1);
55397
- --cr-success-text: rgb(var(--tb-success));
55398
- --cr-error-bg: rgba(var(--tb-destructive, 239 68 68), 0.1);
55399
- --cr-error-text: rgb(var(--tb-destructive, 239 68 68));
55400
- --cr-waitlist-bg: rgba(var(--tb-warning), 0.1);
55401
- --cr-waitlist-text: rgb(var(--tb-warning));
55402
-
55403
- /* Capacity badges */
55404
- --cr-capacity-available-bg: rgba(var(--tb-success), 0.1);
55405
- --cr-capacity-available-text: rgb(var(--tb-success));
55406
- --cr-capacity-low-bg: rgba(var(--tb-warning), 0.1);
55407
- --cr-capacity-low-text: rgb(var(--tb-warning));
55408
- --cr-capacity-soldout-bg: rgba(var(--tb-destructive, 239 68 68), 0.1);
55409
- --cr-capacity-soldout-text: rgb(var(--tb-destructive, 239 68 68));
55410
-
55411
- /* Borders */
55412
- --cr-border: rgb(var(--tb-border));
55413
- --cr-border-hover: rgba(var(--tb-primary), 0.5);
55414
- --cr-border-selected: rgb(var(--tb-primary));
55415
- --cr-border-error: rgb(var(--tb-destructive, 239 68 68));
55416
-
55417
- /* Input focus */
55418
- --cr-focus-ring: rgba(var(--tb-primary), 0.3);
55419
-
55420
- /* Required marker */
55421
- --cr-required: rgb(var(--tb-destructive, 239 68 68));
55422
-
55423
- /* Payment option cards */
55424
- --cr-payment-border: rgb(var(--tb-border));
55425
- --cr-payment-border-hover: rgba(var(--tb-primary), 0.5);
55426
- --cr-payment-border-selected: rgb(var(--tb-primary));
55427
- --cr-payment-bg-selected: rgba(var(--tb-primary), 0.08);
55428
-
55429
- /* Checkmark indicator */
55430
- --cr-check-bg: rgb(var(--tb-primary));
55431
- --cr-check-text: rgb(var(--tb-primaryText, 255 255 255));
55432
-
55433
- /* Summary */
55434
- --cr-summary-bg: rgba(var(--tb-primary), 0.1);
55435
- --cr-summary-border: rgb(var(--tb-border));
55436
-
55437
- ${EVENT_WHOLE_SERIES_VARIABLE_BRIDGE}
55438
-
55439
- /* Shared registration-surface mappings (issue 1174).
55440
- Route the shared --rb-reg-* contract through this block's Tier 3 vars
55441
- (palette tokens where no --cr-* var exists) so existing --cr-* overrides
55442
- keep working unchanged. */
55443
- --rb-reg-radius: var(--rb-block-radius);
55444
- --rb-reg-border: var(--cr-border);
55445
- --rb-reg-border-hover: var(--cr-border-hover);
55446
- --rb-reg-border-selected: var(--cr-border-selected);
55447
- --rb-reg-bg-selected: var(--cr-payment-bg-selected);
55448
- --rb-reg-option-bg: rgb(var(--tb-background));
55449
- --rb-reg-option-hover-shadow: 0 8px 18px rgba(var(--tb-shadow, 15 23 42), 0.08);
55450
- --rb-reg-surface-bg: rgb(var(--tb-surface));
55451
- --rb-reg-on-surface: rgb(var(--tb-onSurface, var(--tb-text)));
55452
- --rb-reg-on-surface-muted: rgba(var(--tb-onSurface, var(--tb-text)), 0.7);
55453
- --rb-reg-on-surface-subtle: rgba(var(--tb-onSurface, var(--tb-text)), 0.6);
55454
- --rb-reg-on-surface-faint: rgba(var(--tb-onSurface, var(--tb-text)), 0.5);
55455
- --rb-reg-check-bg: var(--cr-check-bg);
55456
- --rb-reg-check-text: var(--cr-check-text);
55457
- --rb-reg-step-active: var(--cr-step-active);
55458
- --rb-reg-step-completed: var(--cr-step-completed);
55459
- --rb-reg-step-inactive: var(--cr-step-inactive);
55460
- --rb-reg-step-text: var(--cr-step-text);
55461
- --rb-reg-step-text-active: var(--cr-step-text-active);
55462
- --rb-reg-step-connector: var(--cr-step-connector);
55463
- --rb-reg-summary-bg: var(--cr-summary-bg);
55464
- --rb-reg-summary-border: var(--cr-summary-border);
55465
- --rb-reg-focus-ring: var(--cr-focus-ring);
55466
- --rb-reg-shell-line: rgba(var(--tb-mutedText, 100 116 139), 0.22);
55467
- }
55468
- `;
55469
- }
55470
- //#endregion
55471
54612
  //#region ../theme-core/src/blocks/registry.ts
55472
54613
  /**
55473
54614
  * Global registry of block var generators.
@@ -55482,8 +54623,6 @@ blockVarRegistry.set("appointment-booking", generateAppointmentBookingVars);
55482
54623
  blockVarRegistry.set("form", generateFormBlockVars);
55483
54624
  blockVarRegistry.set("customer-portal", generateCustomerPortalVars);
55484
54625
  blockVarRegistry.set("testimonials", generateTestimonialsVars);
55485
- blockVarRegistry.set("course-details", generateCourseDetailsVars);
55486
- blockVarRegistry.set("course-registration", generateCourseRegistrationVars);
55487
54626
  /**
55488
54627
  * Generate all Tier 3 block-specific CSS variables.
55489
54628
  *
@@ -56824,11 +55963,7 @@ const MemoBlockSection = React$1.memo(function MemoBlockSection({ themeResources
56824
55963
  try {
56825
55964
  const routes = routeMap ?? dataContext?.routes;
56826
55965
  const hydratedContent = routes ? hydrateManifestLinks(definition.manifest, data, routes, dataContext?.pagesByIdentifier, dataContext?.entriesByIdentifier) : data;
56827
- const resolved = resolveBlockData$1({
56828
- block,
56829
- definition,
56830
- dataContext
56831
- });
55966
+ const resolved = resolveBlockData$1(block.id, definition.dataLoaders, dataContext, routes);
56832
55967
  const hasResolvedData = !!resolved && typeof resolved === "object" && Object.keys(resolved).length > 0;
56833
55968
  const baseProps = {
56834
55969
  content: hydratedContent,
@@ -56918,12 +56053,6 @@ function shouldDebugCustomBlocks() {
56918
56053
  return false;
56919
56054
  }
56920
56055
  }
56921
- function resolveBlockData$1({ block, definition, dataContext }) {
56922
- const blockId = block.id ?? null;
56923
- const raw = blockId ? dataContext?.resolvedData?.[blockId] : void 0;
56924
- if (isObjectRecord$1(raw)) return { ...raw };
56925
- return definition.dataLoaders && Object.keys(definition.dataLoaders).length > 0 ? {} : void 0;
56926
- }
56927
56056
  /**
56928
56057
  * Resolves block content based on stage priority.
56929
56058
  * For draft/preview: draftContent takes priority over content.
@@ -60385,7 +59514,7 @@ const containerResponsiveThemeCss = `/*
60385
59514
  * Shared: Registration Surface (issue 1174)
60386
59515
  *
60387
59516
  * Wizard-surface primitives shared by the event-registration,
60388
- * course-registration and appointment-booking blocks: surface container,
59517
+ * appointment-booking blocks: surface container,
60389
59518
  * selectable option cards, step indicator, wizard actions row, on-surface
60390
59519
  * text ramp, layout stacks, summary box and skeleton shell lines.
60391
59520
  *
@@ -60428,7 +59557,7 @@ const containerResponsiveThemeCss = `/*
60428
59557
  }
60429
59558
 
60430
59559
  /* Surface container */
60431
- :where(.theme-scope) :where([data-block="event-registration"], [data-block="course-registration"], [data-block="appointment-booking"]) .rb-reg-surface {
59560
+ :where(.theme-scope) :where([data-block="event-registration"], [data-block="appointment-booking"]) .rb-reg-surface {
60432
59561
  border-radius: var(--rb-reg-radius, var(--rb-block-radius, 1rem));
60433
59562
  border: 1px solid var(--rb-reg-border, rgb(var(--tb-border, 226 232 240)));
60434
59563
  padding: clamp(1rem, 2vw, 1.5rem);
@@ -60458,7 +59587,7 @@ const containerResponsiveThemeCss = `/*
60458
59587
  *
60459
59588
  * Mirrors \`contextualButtonSurfaceResetStyles()\` in theme-core/buttons; the
60460
59589
  * pairing is pinned by registration-surface-action-reset.test.ts. */
60461
- :where(.theme-scope) :where([data-block="event-registration"], [data-block="course-registration"], [data-block="appointment-booking"]) .rb-reg-surface {
59590
+ :where(.theme-scope) :where([data-block="event-registration"], [data-block="appointment-booking"]) .rb-reg-surface {
60462
59591
  --rb-action-primary-base-background-color: initial;
60463
59592
  --rb-action-primary-base-background-image: initial;
60464
59593
  --rb-action-primary-base-color: initial;
@@ -60566,7 +59695,7 @@ const containerResponsiveThemeCss = `/*
60566
59695
  }
60567
59696
 
60568
59697
  /* Selectable option card */
60569
- :where(.theme-scope) :where([data-block="event-registration"], [data-block="course-registration"], [data-block="appointment-booking"]) .rb-option-card {
59698
+ :where(.theme-scope) :where([data-block="event-registration"], [data-block="appointment-booking"]) .rb-option-card {
60570
59699
  position: relative;
60571
59700
  display: flex;
60572
59701
  align-items: flex-start;
@@ -60583,34 +59712,34 @@ const containerResponsiveThemeCss = `/*
60583
59712
  box-shadow var(--rb-block-transition, 150ms) ease;
60584
59713
  }
60585
59714
 
60586
- :where(.theme-scope) :where([data-block="event-registration"], [data-block="course-registration"], [data-block="appointment-booking"]) .rb-option-card:hover:not(:disabled):not([aria-disabled="true"]) {
59715
+ :where(.theme-scope) :where([data-block="event-registration"], [data-block="appointment-booking"]) .rb-option-card:hover:not(:disabled):not([aria-disabled="true"]) {
60587
59716
  border-color: var(--rb-reg-border-hover, rgba(var(--tb-primary, 17 24 39), 0.5));
60588
59717
  box-shadow: var(--rb-reg-option-hover-shadow, 0 8px 18px rgba(var(--tb-shadow, 15 23 42), 0.08));
60589
59718
  }
60590
59719
 
60591
- :where(.theme-scope) :where([data-block="event-registration"], [data-block="course-registration"], [data-block="appointment-booking"]) .rb-option-card:focus-visible {
59720
+ :where(.theme-scope) :where([data-block="event-registration"], [data-block="appointment-booking"]) .rb-option-card:focus-visible {
60592
59721
  outline: 2px solid var(--rb-reg-focus-ring, rgba(var(--tb-primary, 17 24 39), 0.3));
60593
59722
  outline-offset: 2px;
60594
59723
  }
60595
59724
 
60596
- :where(.theme-scope) :where([data-block="event-registration"], [data-block="course-registration"], [data-block="appointment-booking"]) .rb-option-card--selected {
59725
+ :where(.theme-scope) :where([data-block="event-registration"], [data-block="appointment-booking"]) .rb-option-card--selected {
60597
59726
  border-color: var(--rb-reg-border-selected, rgb(var(--tb-primary, 17 24 39)));
60598
59727
  background-color: var(--rb-reg-bg-selected, rgba(var(--tb-primary, 17 24 39), 0.08));
60599
59728
  box-shadow: 0 0 0 1px var(--rb-reg-border-selected, rgb(var(--tb-primary, 17 24 39)));
60600
59729
  }
60601
59730
 
60602
- :where(.theme-scope) :where([data-block="event-registration"], [data-block="course-registration"], [data-block="appointment-booking"]) .rb-option-card--disabled {
59731
+ :where(.theme-scope) :where([data-block="event-registration"], [data-block="appointment-booking"]) .rb-option-card--disabled {
60603
59732
  cursor: not-allowed;
60604
59733
  opacity: 0.7;
60605
59734
  }
60606
59735
 
60607
- :where(.theme-scope) :where([data-block="event-registration"], [data-block="course-registration"], [data-block="appointment-booking"]) .rb-option-card--disabled:hover {
59736
+ :where(.theme-scope) :where([data-block="event-registration"], [data-block="appointment-booking"]) .rb-option-card--disabled:hover {
60608
59737
  border-color: var(--rb-reg-border, rgb(var(--tb-border, 226 232 240)));
60609
59738
  box-shadow: none;
60610
59739
  }
60611
59740
 
60612
59741
  /* Check indicator */
60613
- :where(.theme-scope) :where([data-block="event-registration"], [data-block="course-registration"], [data-block="appointment-booking"]) .rb-option-check {
59742
+ :where(.theme-scope) :where([data-block="event-registration"], [data-block="appointment-booking"]) .rb-option-check {
60614
59743
  flex-shrink: 0;
60615
59744
  width: 1.25rem;
60616
59745
  height: 1.25rem;
@@ -60621,18 +59750,18 @@ const containerResponsiveThemeCss = `/*
60621
59750
  justify-content: center;
60622
59751
  }
60623
59752
 
60624
- :where(.theme-scope) :where([data-block="event-registration"], [data-block="course-registration"], [data-block="appointment-booking"]) .rb-option-check svg {
59753
+ :where(.theme-scope) :where([data-block="event-registration"], [data-block="appointment-booking"]) .rb-option-check svg {
60625
59754
  width: 0.75rem;
60626
59755
  height: 0.75rem;
60627
59756
  color: var(--rb-reg-check-text, rgb(var(--tb-primaryText, var(--tb-primaryForeground, 255 255 255))));
60628
59757
  }
60629
59758
 
60630
59759
  /* Step indicator */
60631
- :where(.theme-scope) :where([data-block="event-registration"], [data-block="course-registration"], [data-block="appointment-booking"]) .rb-steps-nav {
59760
+ :where(.theme-scope) :where([data-block="event-registration"], [data-block="appointment-booking"]) .rb-steps-nav {
60632
59761
  margin-bottom: 1.5rem;
60633
59762
  }
60634
59763
 
60635
- :where(.theme-scope) :where([data-block="event-registration"], [data-block="course-registration"], [data-block="appointment-booking"]) .rb-steps {
59764
+ :where(.theme-scope) :where([data-block="event-registration"], [data-block="appointment-booking"]) .rb-steps {
60636
59765
  display: flex;
60637
59766
  align-items: center;
60638
59767
  justify-content: center;
@@ -60642,13 +59771,13 @@ const containerResponsiveThemeCss = `/*
60642
59771
  margin: 0;
60643
59772
  }
60644
59773
 
60645
- :where(.theme-scope) :where([data-block="event-registration"], [data-block="course-registration"], [data-block="appointment-booking"]) .rb-step {
59774
+ :where(.theme-scope) :where([data-block="event-registration"], [data-block="appointment-booking"]) .rb-step {
60646
59775
  display: flex;
60647
59776
  align-items: center;
60648
59777
  gap: 0.5rem;
60649
59778
  }
60650
59779
 
60651
- :where(.theme-scope) :where([data-block="event-registration"], [data-block="course-registration"], [data-block="appointment-booking"]) .rb-step-circle {
59780
+ :where(.theme-scope) :where([data-block="event-registration"], [data-block="appointment-booking"]) .rb-step-circle {
60652
59781
  width: 1.75rem;
60653
59782
  height: 1.75rem;
60654
59783
  border-radius: 50%;
@@ -60662,47 +59791,47 @@ const containerResponsiveThemeCss = `/*
60662
59791
  transition: background-color var(--rb-block-transition, 150ms) ease;
60663
59792
  }
60664
59793
 
60665
- :where(.theme-scope) :where([data-block="event-registration"], [data-block="course-registration"], [data-block="appointment-booking"]) .rb-step-circle--active {
59794
+ :where(.theme-scope) :where([data-block="event-registration"], [data-block="appointment-booking"]) .rb-step-circle--active {
60666
59795
  background: var(--rb-reg-step-active, rgb(var(--tb-primary, 17 24 39)));
60667
59796
  color: var(--rb-reg-step-text-active, rgb(var(--tb-primaryText, var(--tb-primaryForeground, 255 255 255))));
60668
59797
  }
60669
59798
 
60670
- :where(.theme-scope) :where([data-block="event-registration"], [data-block="course-registration"], [data-block="appointment-booking"]) .rb-step-circle--completed {
59799
+ :where(.theme-scope) :where([data-block="event-registration"], [data-block="appointment-booking"]) .rb-step-circle--completed {
60671
59800
  background: var(--rb-reg-step-completed, rgb(var(--tb-success, 22 163 74)));
60672
59801
  color: var(--rb-reg-step-text-active, rgb(var(--tb-primaryText, var(--tb-primaryForeground, 255 255 255))));
60673
59802
  }
60674
59803
 
60675
- :where(.theme-scope) :where([data-block="event-registration"], [data-block="course-registration"], [data-block="appointment-booking"]) .rb-step-check {
59804
+ :where(.theme-scope) :where([data-block="event-registration"], [data-block="appointment-booking"]) .rb-step-check {
60676
59805
  width: 0.75rem;
60677
59806
  height: 0.75rem;
60678
59807
  }
60679
59808
 
60680
- :where(.theme-scope) :where([data-block="event-registration"], [data-block="course-registration"], [data-block="appointment-booking"]) .rb-step-connector {
59809
+ :where(.theme-scope) :where([data-block="event-registration"], [data-block="appointment-booking"]) .rb-step-connector {
60681
59810
  width: 2rem;
60682
59811
  height: 2px;
60683
59812
  background: var(--rb-reg-step-connector, rgba(var(--tb-border, 226 232 240), 0.5));
60684
59813
  }
60685
59814
 
60686
- :where(.theme-scope) :where([data-block="event-registration"], [data-block="course-registration"], [data-block="appointment-booking"]) .rb-step-label {
59815
+ :where(.theme-scope) :where([data-block="event-registration"], [data-block="appointment-booking"]) .rb-step-label {
60687
59816
  font-size: 0.75rem;
60688
59817
  color: var(--rb-reg-on-surface, rgb(var(--tb-onSurface, var(--tb-text, 15 23 42))));
60689
59818
  display: none;
60690
59819
  }
60691
59820
 
60692
- :where(.theme-scope) :where([data-block="event-registration"], [data-block="course-registration"], [data-block="appointment-booking"]) .rb-step-label--active {
59821
+ :where(.theme-scope) :where([data-block="event-registration"], [data-block="appointment-booking"]) .rb-step-label--active {
60693
59822
  font-weight: 500;
60694
59823
  }
60695
59824
 
60696
59825
  @container rb-site (min-width: 640px) {
60697
59826
  @scope ([data-rb-responsive-mode="container"]) to (:scope [data-rb-responsive-mode]) {
60698
- :where(.theme-scope) :where([data-block="event-registration"], [data-block="course-registration"], [data-block="appointment-booking"]) .rb-step-label {
59827
+ :where(.theme-scope) :where([data-block="event-registration"], [data-block="appointment-booking"]) .rb-step-label {
60699
59828
  display: inline;
60700
59829
  }
60701
59830
  }
60702
59831
  }
60703
59832
 
60704
59833
  /* Wizard actions row */
60705
- :where(.theme-scope) :where([data-block="event-registration"], [data-block="course-registration"], [data-block="appointment-booking"]) .rb-wizard-actions {
59834
+ :where(.theme-scope) :where([data-block="event-registration"], [data-block="appointment-booking"]) .rb-wizard-actions {
60706
59835
  display: flex;
60707
59836
  justify-content: space-between;
60708
59837
  align-items: center;
@@ -60711,56 +59840,56 @@ const containerResponsiveThemeCss = `/*
60711
59840
  }
60712
59841
 
60713
59842
  /* When there's only one action (no back button), push it to the right */
60714
- :where(.theme-scope) :where([data-block="event-registration"], [data-block="course-registration"], [data-block="appointment-booking"]) .rb-wizard-actions > :only-child {
59843
+ :where(.theme-scope) :where([data-block="event-registration"], [data-block="appointment-booking"]) .rb-wizard-actions > :only-child {
60715
59844
  margin-inline-start: auto;
60716
59845
  }
60717
59846
 
60718
59847
  /* On-surface text ramp */
60719
- :where(.theme-scope) :where([data-block="event-registration"], [data-block="course-registration"], [data-block="appointment-booking"]) .rb-on-surface {
59848
+ :where(.theme-scope) :where([data-block="event-registration"], [data-block="appointment-booking"]) .rb-on-surface {
60720
59849
  color: var(--rb-reg-on-surface, rgb(var(--tb-onSurface, var(--tb-text, 15 23 42))));
60721
59850
  }
60722
59851
 
60723
- :where(.theme-scope) :where([data-block="event-registration"], [data-block="course-registration"], [data-block="appointment-booking"]) .rb-on-surface--muted {
59852
+ :where(.theme-scope) :where([data-block="event-registration"], [data-block="appointment-booking"]) .rb-on-surface--muted {
60724
59853
  color: var(--rb-reg-on-surface-muted, rgba(var(--tb-onSurface, var(--tb-text, 15 23 42)), 0.7));
60725
59854
  }
60726
59855
 
60727
- :where(.theme-scope) :where([data-block="event-registration"], [data-block="course-registration"], [data-block="appointment-booking"]) .rb-on-surface--subtle {
59856
+ :where(.theme-scope) :where([data-block="event-registration"], [data-block="appointment-booking"]) .rb-on-surface--subtle {
60728
59857
  color: var(--rb-reg-on-surface-subtle, rgba(var(--tb-onSurface, var(--tb-text, 15 23 42)), 0.6));
60729
59858
  }
60730
59859
 
60731
- :where(.theme-scope) :where([data-block="event-registration"], [data-block="course-registration"], [data-block="appointment-booking"]) .rb-on-surface--faint {
59860
+ :where(.theme-scope) :where([data-block="event-registration"], [data-block="appointment-booking"]) .rb-on-surface--faint {
60732
59861
  color: var(--rb-reg-on-surface-faint, rgba(var(--tb-onSurface, var(--tb-text, 15 23 42)), 0.5));
60733
59862
  }
60734
59863
 
60735
59864
  /* Layout stacks */
60736
- :where(.theme-scope) :where([data-block="event-registration"], [data-block="course-registration"], [data-block="appointment-booking"]) .rb-reg-stack {
59865
+ :where(.theme-scope) :where([data-block="event-registration"], [data-block="appointment-booking"]) .rb-reg-stack {
60737
59866
  display: flex;
60738
59867
  flex-direction: column;
60739
59868
  gap: 1rem;
60740
59869
  }
60741
59870
 
60742
- :where(.theme-scope) :where([data-block="event-registration"], [data-block="course-registration"], [data-block="appointment-booking"]) .rb-reg-stack--sm {
59871
+ :where(.theme-scope) :where([data-block="event-registration"], [data-block="appointment-booking"]) .rb-reg-stack--sm {
60743
59872
  gap: 0.75rem;
60744
59873
  }
60745
59874
 
60746
- :where(.theme-scope) :where([data-block="event-registration"], [data-block="course-registration"], [data-block="appointment-booking"]) .rb-reg-row {
59875
+ :where(.theme-scope) :where([data-block="event-registration"], [data-block="appointment-booking"]) .rb-reg-row {
60747
59876
  display: flex;
60748
59877
  align-items: center;
60749
59878
  gap: 1rem;
60750
59879
  }
60751
59880
 
60752
- :where(.theme-scope) :where([data-block="event-registration"], [data-block="course-registration"], [data-block="appointment-booking"]) .rb-reg-row--between {
59881
+ :where(.theme-scope) :where([data-block="event-registration"], [data-block="appointment-booking"]) .rb-reg-row--between {
60753
59882
  justify-content: space-between;
60754
59883
  align-items: flex-start;
60755
59884
  }
60756
59885
 
60757
- :where(.theme-scope) :where([data-block="event-registration"], [data-block="course-registration"], [data-block="appointment-booking"]) .rb-reg-grid {
59886
+ :where(.theme-scope) :where([data-block="event-registration"], [data-block="appointment-booking"]) .rb-reg-grid {
60758
59887
  display: grid;
60759
59888
  gap: 0.75rem;
60760
59889
  }
60761
59890
 
60762
59891
  /* Summary box */
60763
- :where(.theme-scope) :where([data-block="event-registration"], [data-block="course-registration"], [data-block="appointment-booking"]) .rb-reg-summary {
59892
+ :where(.theme-scope) :where([data-block="event-registration"], [data-block="appointment-booking"]) .rb-reg-summary {
60764
59893
  padding: 1rem;
60765
59894
  border-radius: calc(var(--rb-reg-radius, var(--rb-block-radius, 1rem)) * 0.75);
60766
59895
  border: 1px solid var(--rb-reg-summary-border, rgb(var(--tb-border, 226 232 240)));
@@ -60768,7 +59897,7 @@ const containerResponsiveThemeCss = `/*
60768
59897
  }
60769
59898
 
60770
59899
  /* Skeleton shell lines */
60771
- :where(.theme-scope) :where([data-block="event-registration"], [data-block="course-registration"], [data-block="appointment-booking"]) .rb-shell-line {
59900
+ :where(.theme-scope) :where([data-block="event-registration"], [data-block="appointment-booking"]) .rb-shell-line {
60772
59901
  height: 0.75rem;
60773
59902
  border-radius: 9999px;
60774
59903
  background: linear-gradient(
@@ -60779,24 +59908,24 @@ const containerResponsiveThemeCss = `/*
60779
59908
  );
60780
59909
  }
60781
59910
 
60782
- :where(.theme-scope) :where([data-block="event-registration"], [data-block="course-registration"], [data-block="appointment-booking"]) .rb-shell-line--lg {
59911
+ :where(.theme-scope) :where([data-block="event-registration"], [data-block="appointment-booking"]) .rb-shell-line--lg {
60783
59912
  width: min(26rem, 82%);
60784
59913
  }
60785
59914
 
60786
- :where(.theme-scope) :where([data-block="event-registration"], [data-block="course-registration"], [data-block="appointment-booking"]) .rb-shell-line--md {
59915
+ :where(.theme-scope) :where([data-block="event-registration"], [data-block="appointment-booking"]) .rb-shell-line--md {
60787
59916
  width: min(19rem, 68%);
60788
59917
  }
60789
59918
 
60790
- :where(.theme-scope) :where([data-block="event-registration"], [data-block="course-registration"], [data-block="appointment-booking"]) .rb-shell-line--sm {
59919
+ :where(.theme-scope) :where([data-block="event-registration"], [data-block="appointment-booking"]) .rb-shell-line--sm {
60791
59920
  width: min(14rem, 52%);
60792
59921
  }
60793
59922
 
60794
- :where(.theme-scope) :where([data-block="event-registration"], [data-block="course-registration"], [data-block="appointment-booking"]) .rb-shell-line--xs {
59923
+ :where(.theme-scope) :where([data-block="event-registration"], [data-block="appointment-booking"]) .rb-shell-line--xs {
60795
59924
  width: min(10rem, 42%);
60796
59925
  }
60797
59926
 
60798
59927
  /* Skeleton block (rectangular placeholder, pulses) */
60799
- :where(.theme-scope) :where([data-block="event-registration"], [data-block="course-registration"], [data-block="appointment-booking"]) .rb-shell-block {
59928
+ :where(.theme-scope) :where([data-block="event-registration"], [data-block="appointment-booking"]) .rb-shell-block {
60800
59929
  height: 2.5rem;
60801
59930
  width: 100%;
60802
59931
  border-radius: var(--rb-reg-radius, var(--rb-block-radius, 1rem));
@@ -60814,7 +59943,7 @@ const containerResponsiveThemeCss = `/*
60814
59943
  }
60815
59944
 
60816
59945
  @media (prefers-reduced-motion: reduce) {
60817
- :where(.theme-scope) :where([data-block="event-registration"], [data-block="course-registration"], [data-block="appointment-booking"]) .rb-shell-block {
59946
+ :where(.theme-scope) :where([data-block="event-registration"], [data-block="appointment-booking"]) .rb-shell-block {
60818
59947
  animation: none;
60819
59948
  }
60820
59949
  }
@@ -67196,1648 +66325,337 @@ const containerResponsiveThemeCss = `/*
67196
66325
  cursor: not-allowed;
67197
66326
  }
67198
66327
 
67199
- /*
67200
- * Course Details (runtime node)
67201
- * Minimal rules - most styling via rb-* utilities
66328
+ /* =============================================================================
66329
+ * Block: Newsletter Signup
66330
+ * =============================================================================
67202
66331
  */
67203
66332
 
67204
- :where(.theme-scope) .course-details {
67205
- width: 100%;
67206
- max-width: 56.25rem; /* 900px */
67207
- margin-inline: auto;
66333
+ /* Newsletter copy styling */
66334
+ :where(.theme-scope) :where([data-block="newsletter-signup"]) .newsletter-copy-title {
66335
+ font-size: 1.5rem;
66336
+ font-weight: 600;
67208
66337
  }
67209
66338
 
67210
- /* Description prose wrapper */
67211
- :where(.theme-scope) .course-details .cd-description {
67212
- margin-top: 1rem;
66339
+ :where(.theme-scope) :where([data-block="newsletter-signup"]) .newsletter-copy-subtitle {
66340
+ font-size: 1rem;
66341
+ color: var(--rb-surface-text-color, rgb(var(--tb-text, 17 24 39)));
66342
+ opacity: 0.85;
67213
66343
  }
67214
66344
 
67215
- /* "Showing X of Y" text */
67216
- :where(.theme-scope) .course-details .cd-sessions__more {
67217
- margin-top: 0.5rem;
67218
- opacity: 0.7;
67219
- font-size: 0.875rem;
66345
+ /* Newsletter form container */
66346
+ :where(.theme-scope) .newsletter-form {
66347
+ width: 100%;
66348
+ max-width: 32rem;
66349
+ margin-left: auto;
66350
+ margin-right: auto;
67220
66351
  }
67221
66352
 
67222
- /* Enrollment status colors (using Tier 3 vars) */
67223
- :where(.theme-scope) .course-details .cd-enrollment--open {
67224
- color: var(--cd-enrollment-open-text);
66353
+ /* Newsletter form fields container */
66354
+ :where(.theme-scope) .newsletter-form-fields {
66355
+ display: flex;
66356
+ flex-direction: column;
66357
+ gap: var(--rb-gap-sm, 0.75rem);
67225
66358
  }
67226
66359
 
67227
- :where(.theme-scope) .course-details .cd-enrollment--closed {
67228
- color: var(--cd-enrollment-closed-text);
66360
+ /* Individual field styling */
66361
+ :where(.theme-scope) .newsletter-field {
66362
+ display: flex;
66363
+ flex-direction: column;
66364
+ gap: 0.25rem;
67229
66365
  }
67230
66366
 
67231
- /* =============================================================================
67232
- * Block: Event whole-series registration
67233
- * Keep rules minimal and theme-driven; class names are prefixed with \`er-whole-series-\`.
67234
- * =============================================================================
67235
- */
67236
-
67237
- /* Block-local surface text tokens for cards/modals that sit on theme surface. */
67238
- :where(.theme-scope)
67239
- :where(
67240
- [data-block='event-registration'],
67241
- [data-block='course-registration']
67242
- ) {
67243
- --er-on-surface: rgb(var(--tb-onSurface, var(--tb-text)));
67244
- --er-on-surface-hover-bg: rgba(var(--tb-onSurface, var(--tb-text)), 0.05);
66367
+ /* Required indicator */
66368
+ :where(.theme-scope) .newsletter-required {
66369
+ color: rgb(var(--tb-primary));
66370
+ margin-left: 0.125rem;
67245
66371
  }
67246
66372
 
67247
- /* Container: base styling comes from the shared .rb-reg-surface
67248
- (registration-surface.css); these overrides preserve whole-series
67249
- whole-series registration's established look (fixed padding, centered). */
67250
- :where(.theme-scope)
67251
- :where([data-block='event-registration'], [data-block='course-registration'])
67252
- .er-whole-series-container {
67253
- padding: 1.5rem;
67254
- margin-inline: auto;
66373
+ /* Submit button container */
66374
+ :where(.theme-scope) .newsletter-submit {
66375
+ margin-top: 0.5rem;
67255
66376
  }
67256
66377
 
67257
- /* Empty/unavailable */
67258
- :where(.theme-scope)
67259
- :where([data-block='event-registration'], [data-block='course-registration'])
67260
- .er-whole-series-empty {
67261
- border-radius: var(--rb-block-radius);
67262
- border: 1px dashed rgba(var(--tb-foreground), 0.2);
67263
- padding: 2.5rem;
67264
- text-align: center;
66378
+ /* ALTCHA widget container */
66379
+ :where(.theme-scope) .newsletter-altcha {
66380
+ margin-top: 0.75rem;
66381
+ display: flex;
66382
+ justify-content: center;
67265
66383
  }
67266
66384
 
67267
- :where(.theme-scope)
67268
- :where([data-block='event-registration'], [data-block='course-registration'])
67269
- .er-whole-series-empty__text {
67270
- opacity: 0.7;
66385
+ /* Privacy note */
66386
+ :where(.theme-scope) .newsletter-privacy-note {
66387
+ margin-top: 0.75rem;
66388
+ font-size: 1rem;
66389
+ line-height: 1.6;
66390
+ color: var(--rb-surface-text-color, rgb(var(--tb-text, 17 24 39)));
66391
+ text-align: center;
67271
66392
  }
67272
66393
 
67273
66394
  /* =============================================================================
67274
- * Layout (two-column)
66395
+ * Inline Variant - Horizontal layout
67275
66396
  * =============================================================================
67276
66397
  */
67277
- :where(.theme-scope)
67278
- :where([data-block='event-registration'], [data-block='course-registration'])
67279
- .er-whole-series-layout {
67280
- display: grid;
67281
- gap: 1.5rem;
67282
- grid-template-columns: 1fr;
67283
- }
67284
66398
 
67285
- @container rb-site (min-width: 768px) {
67286
- @scope ([data-rb-responsive-mode="container"]) to (:scope [data-rb-responsive-mode]) {
67287
- :where(.theme-scope)
67288
- :where(
67289
- [data-block='event-registration'],
67290
- [data-block='course-registration']
67291
- )
67292
- .er-whole-series-layout--with-sidebar {
67293
- grid-template-columns: 1fr 280px;
67294
- }
67295
- }
66399
+ :where(.theme-scope) .newsletter-inline .newsletter-form-fields {
66400
+ flex-direction: row;
66401
+ align-items: flex-end;
66402
+ flex-wrap: wrap;
66403
+ gap: var(--rb-gap-sm, 0.75rem);
67296
66404
  }
67297
66405
 
67298
- :where(.theme-scope)
67299
- :where([data-block='event-registration'], [data-block='course-registration'])
67300
- .er-whole-series-layout__main {
67301
- min-width: 0;
66406
+ :where(.theme-scope) .newsletter-inline .newsletter-field {
66407
+ flex: 1 1 auto;
66408
+ min-width: 10rem;
67302
66409
  }
67303
66410
 
67304
- :where(.theme-scope)
67305
- :where([data-block='event-registration'], [data-block='course-registration'])
67306
- .er-whole-series-layout__sidebar {
67307
- display: none;
66411
+ :where(.theme-scope) .newsletter-inline .newsletter-submit {
66412
+ margin-top: 0;
66413
+ flex-shrink: 0;
67308
66414
  }
67309
66415
 
67310
- @container rb-site (min-width: 768px) {
66416
+ /* Mobile fallback for inline variant */
66417
+ @container rb-site (max-width: 640px) {
67311
66418
  @scope ([data-rb-responsive-mode="container"]) to (:scope [data-rb-responsive-mode]) {
67312
- :where(.theme-scope)
67313
- :where(
67314
- [data-block='event-registration'],
67315
- [data-block='course-registration']
67316
- )
67317
- .er-whole-series-layout__sidebar {
67318
- display: block;
66419
+ :where(.theme-scope) .newsletter-inline .newsletter-form-fields {
66420
+ flex-direction: column;
66421
+ }
66422
+
66423
+ :where(.theme-scope) .newsletter-inline .newsletter-field {
66424
+ min-width: 100%;
67319
66425
  }
67320
66426
  }
67321
66427
  }
67322
66428
 
67323
66429
  /* =============================================================================
67324
- * Step Indicator
66430
+ * Editorial Split Variant
67325
66431
  * =============================================================================
67326
66432
  */
67327
- :where(.theme-scope)
67328
- :where([data-block='event-registration'], [data-block='course-registration'])
67329
- .er-whole-series-steps {
67330
- display: flex;
67331
- align-items: center;
67332
- gap: 0.5rem;
67333
- margin-bottom: 1.5rem;
67334
- }
67335
66433
 
67336
- :where(.theme-scope)
67337
- :where([data-block='event-registration'], [data-block='course-registration'])
67338
- .er-whole-series-step {
67339
- display: flex;
66434
+ :where(.theme-scope) .newsletter-editorial-split {
66435
+ display: grid;
66436
+ grid-template-columns: minmax(0, 0.9fr) minmax(20rem, 1.1fr);
66437
+ gap: clamp(2.5rem, 7vw, 7rem);
67340
66438
  align-items: center;
67341
- gap: 0.5rem;
66439
+ text-align: left;
67342
66440
  }
67343
66441
 
67344
- :where(.theme-scope)
67345
- :where([data-block='event-registration'], [data-block='course-registration'])
67346
- .er-whole-series-step-circle {
67347
- width: 1.75rem;
67348
- height: 1.75rem;
67349
- border-radius: 9999px;
66442
+ :where(.theme-scope) .newsletter-editorial-split-copy {
67350
66443
  display: flex;
67351
- align-items: center;
67352
- justify-content: center;
67353
- font-size: 0.75rem;
67354
- font-weight: 600;
67355
- background: var(--er-step-inactive);
67356
- color: var(--er-step-text);
67357
- transition: background-color 0.2s ease;
66444
+ flex-direction: column;
66445
+ gap: var(--rb-gap-sm, 0.75rem);
67358
66446
  }
67359
66447
 
67360
- :where(.theme-scope)
67361
- :where([data-block='event-registration'], [data-block='course-registration'])
67362
- .er-whole-series-step-circle--active {
67363
- background: var(--er-step-active);
67364
- color: var(--er-step-text-active);
66448
+ :where(.theme-scope) .newsletter-editorial-split-form {
66449
+ min-width: 0;
67365
66450
  }
67366
66451
 
67367
- :where(.theme-scope)
67368
- :where([data-block='event-registration'], [data-block='course-registration'])
67369
- .er-whole-series-step-circle--completed {
67370
- background: var(--er-step-completed);
67371
- color: var(--er-step-text);
66452
+ :where(.theme-scope) .newsletter-editorial-split .newsletter-form {
66453
+ max-width: none;
66454
+ margin-inline: 0;
67372
66455
  }
67373
66456
 
67374
- :where(.theme-scope)
67375
- :where([data-block='event-registration'], [data-block='course-registration'])
67376
- .er-whole-series-step-label {
67377
- font-size: 0.875rem;
66457
+ :where(.theme-scope) .newsletter-editorial-split .newsletter-copy-title {
66458
+ font-size: clamp(2rem, 4vw, 3.5rem);
67378
66459
  font-weight: 500;
67379
- color: rgb(var(--tb-mutedText));
67380
- display: none;
67381
66460
  }
67382
66461
 
67383
- @container rb-site (min-width: 640px) {
66462
+ :where(.theme-scope) .newsletter-editorial-split .newsletter-privacy-note {
66463
+ text-align: left;
66464
+ }
66465
+
66466
+ @container rb-site (max-width: 767px) {
67384
66467
  @scope ([data-rb-responsive-mode="container"]) to (:scope [data-rb-responsive-mode]) {
67385
- :where(.theme-scope)
67386
- :where(
67387
- [data-block='event-registration'],
67388
- [data-block='course-registration']
67389
- )
67390
- .er-whole-series-step-label {
67391
- display: block;
66468
+ :where(.theme-scope) .newsletter-editorial-split {
66469
+ grid-template-columns: minmax(0, 1fr);
66470
+ gap: 2rem;
67392
66471
  }
67393
66472
  }
67394
66473
  }
67395
66474
 
67396
- :where(.theme-scope)
67397
- :where([data-block='event-registration'], [data-block='course-registration'])
67398
- .er-whole-series-step-label--active {
67399
- color: var(--er-on-surface);
67400
- font-weight: 600;
67401
- }
67402
-
67403
- :where(.theme-scope)
67404
- :where([data-block='event-registration'], [data-block='course-registration'])
67405
- .er-whole-series-step-connector {
67406
- flex: 1;
67407
- height: 2px;
67408
- background: var(--er-step-connector);
67409
- min-width: 1rem;
67410
- }
66475
+ /* =============================================================================
66476
+ * Success State
66477
+ * =============================================================================
66478
+ */
67411
66479
 
67412
- :where(.theme-scope)
67413
- :where([data-block='event-registration'], [data-block='course-registration'])
67414
- .er-whole-series-step-connector--completed {
67415
- background: var(--er-step-completed);
66480
+ :where(.theme-scope) .newsletter-success {
66481
+ text-align: center;
67416
66482
  }
67417
66483
 
67418
- :where(.theme-scope)
67419
- :where([data-block='event-registration'], [data-block='course-registration'])
67420
- .er-whole-series-step-check {
67421
- width: 0.875rem;
67422
- height: 0.875rem;
66484
+ :where(.theme-scope) .newsletter-success .fb-success {
66485
+ padding: 1rem 1.5rem;
66486
+ background-color: rgba(var(--tb-success, 34 197 94), 0.1);
66487
+ border-radius: var(--radius-md, 0.5rem);
66488
+ color: rgb(var(--tb-text));
67423
66489
  }
67424
66490
 
67425
66491
  /* =============================================================================
67426
- * Lists
66492
+ * Block: Contact + Newsletter
67427
66493
  * =============================================================================
67428
66494
  */
67429
- :where(.theme-scope)
67430
- :where([data-block='event-registration'], [data-block='course-registration'])
67431
- .er-whole-series-run-list {
66495
+
66496
+ :where(.theme-scope) :where([data-block="contact-newsletter"]) .contact-newsletter-grid {
67432
66497
  display: grid;
67433
- gap: 1rem;
66498
+ grid-template-columns: repeat(auto-fit, minmax(min(24rem, 100%), 1fr));
66499
+ gap: clamp(2.5rem, 6vw, 4rem);
66500
+ align-items: start;
67434
66501
  }
67435
66502
 
67436
- /* =============================================================================
67437
- * Run cards
67438
- * =============================================================================
67439
- */
67440
- :where(.theme-scope)
67441
- :where([data-block='event-registration'], [data-block='course-registration'])
67442
- .er-whole-series-run-card {
67443
- border-radius: var(--rb-block-radius);
67444
- border: 1px solid var(--er-border);
67445
- padding: 1rem;
67446
- background: rgb(var(--tb-background));
67447
- cursor: pointer;
67448
- transition:
67449
- border-color var(--rb-block-transition) ease,
67450
- transform var(--rb-block-transition) ease;
66503
+ :where(.theme-scope) :where([data-block="contact-newsletter"]) .contact-newsletter-column {
66504
+ min-width: 0;
67451
66505
  }
67452
66506
 
67453
- :where(.theme-scope)
67454
- :where([data-block='event-registration'], [data-block='course-registration'])
67455
- .er-whole-series-run-card:hover {
67456
- border-color: var(--er-border-hover);
67457
- transform: translateY(-1px);
66507
+ :where(.theme-scope) :where([data-block="contact-newsletter"]) .contact-newsletter-copy {
66508
+ margin-bottom: 1.5rem;
67458
66509
  }
67459
66510
 
67460
- :where(.theme-scope)
67461
- :where([data-block='event-registration'], [data-block='course-registration'])
67462
- .er-whole-series-run-card:focus-visible {
67463
- outline: 2px solid var(--er-focus-ring);
67464
- outline-offset: 2px;
66511
+ :where(.theme-scope) :where([data-block="contact-newsletter"]) .form-copy-title,
66512
+ :where(.theme-scope) :where([data-block="contact-newsletter"]) .newsletter-copy-title {
66513
+ margin: 0 0 0.75rem;
67465
66514
  }
67466
66515
 
67467
- :where(.theme-scope)
67468
- :where([data-block='event-registration'], [data-block='course-registration'])
67469
- .er-whole-series-run-card--selected {
67470
- border-color: var(--er-border-selected);
67471
- box-shadow: 0 0 0 3px var(--er-focus-ring);
66516
+ :where(.theme-scope) :where([data-block="contact-newsletter"]) .form-copy-intro,
66517
+ :where(.theme-scope) :where([data-block="contact-newsletter"]) .newsletter-copy-subtitle {
66518
+ color: var(--rb-surface-text-color, rgb(var(--tb-text, 17 24 39)));
67472
66519
  }
67473
66520
 
67474
- :where(.theme-scope)
67475
- :where([data-block='event-registration'], [data-block='course-registration'])
67476
- .er-whole-series-run-card__title {
67477
- margin: 0 0 0.25rem 0;
67478
- font-weight: 700;
67479
- font-size: 1.125rem;
66521
+ :where(.theme-scope) :where([data-block="contact-newsletter"]) .contact-newsletter-info {
66522
+ display: flex;
66523
+ flex-direction: column;
66524
+ align-items: flex-start;
67480
66525
  }
67481
66526
 
67482
- :where(.theme-scope)
67483
- :where([data-block='event-registration'], [data-block='course-registration'])
67484
- .er-whole-series-run-card__status {
67485
- margin: 0.25rem 0 0 0;
67486
- opacity: 0.8;
66527
+ :where(.theme-scope) :where([data-block="contact-newsletter"]) .newsletter-form {
66528
+ max-width: none;
66529
+ margin-left: 0;
66530
+ margin-right: 0;
67487
66531
  }
67488
66532
 
67489
- :where(.theme-scope)
67490
- :where([data-block='event-registration'], [data-block='course-registration'])
67491
- .er-whole-series-run-card__sessions,
67492
- :where(.theme-scope)
67493
- :where([data-block='event-registration'], [data-block='course-registration'])
67494
- .er-whole-series-run-card__price,
67495
- :where(.theme-scope)
67496
- :where([data-block='event-registration'], [data-block='course-registration'])
67497
- .er-whole-series-run-card__capacity,
67498
- :where(.theme-scope)
67499
- :where([data-block='event-registration'], [data-block='course-registration'])
67500
- .er-whole-series-run-card__venue {
67501
- margin: 0.25rem 0 0 0;
67502
- opacity: 0.85;
66533
+ :where(.theme-scope) :where([data-block="contact-newsletter"]) .newsletter-privacy-note {
66534
+ text-align: left;
67503
66535
  }
67504
66536
 
67505
- /* =============================================================================
67506
- * Capacity Badges
67507
- * =============================================================================
67508
- */
67509
- :where(.theme-scope)
67510
- :where([data-block='event-registration'], [data-block='course-registration'])
67511
- .er-whole-series-capacity-badge {
67512
- display: inline-block;
67513
- padding: 0.125rem 0.5rem;
67514
- border-radius: 9999px;
67515
- font-size: 0.75rem;
67516
- font-weight: 500;
66537
+ :where(.theme-scope) :where([data-block="contact-newsletter"]) .fb-form {
66538
+ display: flex;
66539
+ flex-direction: column;
66540
+ gap: 1rem;
67517
66541
  }
67518
66542
 
67519
- :where(.theme-scope)
67520
- :where([data-block='event-registration'], [data-block='course-registration'])
67521
- .er-whole-series-capacity-badge--available {
67522
- background: var(--er-capacity-available-bg);
67523
- color: var(--er-capacity-available-text);
66543
+ :where(.theme-scope) :where([data-block="contact-newsletter"]) .fb-row-2 {
66544
+ display: grid;
66545
+ grid-template-columns: repeat(auto-fit, minmax(min(14rem, 100%), 1fr));
66546
+ gap: 1rem;
67524
66547
  }
67525
66548
 
67526
- :where(.theme-scope)
67527
- :where([data-block='event-registration'], [data-block='course-registration'])
67528
- .er-whole-series-capacity-badge--low {
67529
- background: var(--er-capacity-low-bg);
67530
- color: var(--er-capacity-low-text);
66549
+ :where(.theme-scope) :where([data-block="contact-newsletter"]) .fb-field {
66550
+ display: flex;
66551
+ flex-direction: column;
66552
+ gap: 0.25rem;
67531
66553
  }
67532
66554
 
67533
- :where(.theme-scope)
67534
- :where([data-block='event-registration'], [data-block='course-registration'])
67535
- .er-whole-series-capacity-badge--soldout {
67536
- background: var(--er-capacity-soldout-bg);
67537
- color: var(--er-capacity-soldout-text);
66555
+ :where(.theme-scope) :where([data-block="contact-newsletter"]) .fb-fieldset {
66556
+ display: flex;
66557
+ flex-direction: column;
66558
+ gap: 0.5rem;
66559
+ border: none;
66560
+ padding: 0;
66561
+ margin: 0;
67538
66562
  }
67539
66563
 
67540
- /* =============================================================================
67541
- * Summary + Details
67542
- * =============================================================================
67543
- */
67544
- :where(.theme-scope)
67545
- :where([data-block='event-registration'], [data-block='course-registration'])
67546
- .er-whole-series-details {
67547
- display: grid;
67548
- gap: 1rem;
66564
+ :where(.theme-scope) :where([data-block="contact-newsletter"]) .fb-inline {
66565
+ display: flex;
66566
+ align-items: center;
66567
+ gap: 0.5rem;
67549
66568
  }
67550
66569
 
67551
- :where(.theme-scope)
67552
- :where([data-block='event-registration'], [data-block='course-registration'])
67553
- .er-whole-series-summary {
66570
+ :where(.theme-scope) :where([data-block="contact-newsletter"]) .fb-success,
66571
+ :where(.theme-scope) :where([data-block="contact-newsletter"]) .fb-error,
66572
+ :where(.theme-scope) :where([data-block="contact-newsletter"]) .fb-empty {
67554
66573
  border-radius: var(--rb-block-radius);
67555
- border: 1px solid var(--er-summary-border);
67556
66574
  padding: 1rem;
67557
- background: var(--er-summary-bg);
67558
- }
67559
-
67560
- :where(.theme-scope)
67561
- :where([data-block='event-registration'], [data-block='course-registration'])
67562
- .er-whole-series-summary__title {
67563
- margin: 0;
67564
- font-size: 1.25rem;
67565
- font-weight: 800;
66575
+ font-size: 0.875rem;
67566
66576
  }
67567
66577
 
67568
- :where(.theme-scope)
67569
- :where([data-block='event-registration'], [data-block='course-registration'])
67570
- .er-whole-series-summary__sessions-title {
67571
- margin: 0.75rem 0 0.5rem 0;
67572
- font-weight: 700;
66578
+ :where(.theme-scope) :where([data-block="contact-newsletter"]) .fb-success {
66579
+ background-color: var(--fb-success-bg);
66580
+ color: var(--fb-success-text);
66581
+ border: 1px solid var(--fb-success-border);
67573
66582
  }
67574
66583
 
67575
- :where(.theme-scope)
67576
- :where([data-block='event-registration'], [data-block='course-registration'])
67577
- .er-whole-series-summary__sessions-list {
67578
- list-style: none;
67579
- padding: 0;
67580
- margin: 0;
67581
- display: grid;
67582
- gap: 0.35rem;
66584
+ :where(.theme-scope) :where([data-block="contact-newsletter"]) .fb-error {
66585
+ background-color: var(--fb-error-bg);
66586
+ color: var(--fb-error-text);
66587
+ border: 1px solid var(--fb-error-border);
67583
66588
  }
67584
66589
 
67585
- :where(.theme-scope)
67586
- :where([data-block='event-registration'], [data-block='course-registration'])
67587
- .er-whole-series-summary__session {
67588
- opacity: 0.9;
66590
+ :where(.theme-scope) :where([data-block="contact-newsletter"]) .fb-empty {
66591
+ background-color: var(--fb-empty-bg);
66592
+ color: var(--fb-empty-text);
66593
+ border: 1px dashed var(--fb-empty-border);
66594
+ text-align: center;
67589
66595
  }
67590
66596
 
67591
- :where(.theme-scope)
67592
- :where([data-block='event-registration'], [data-block='course-registration'])
67593
- .er-whole-series-summary__venue,
67594
- :where(.theme-scope)
67595
- :where([data-block='event-registration'], [data-block='course-registration'])
67596
- .er-whole-series-summary__price,
67597
- :where(.theme-scope)
67598
- :where([data-block='event-registration'], [data-block='course-registration'])
67599
- .er-whole-series-summary__membership {
67600
- margin: 0.5rem 0 0 0;
67601
- opacity: 0.9;
66597
+ :where(.theme-scope) :where([data-block="contact-newsletter"]) .fb-actions {
66598
+ margin-top: 0.5rem;
67602
66599
  }
67603
66600
 
67604
66601
  /* =============================================================================
67605
- * Form
66602
+ * Block: Team Members
67606
66603
  * =============================================================================
66604
+ *
66605
+ * Site/theme authors sometimes need different thumbnail shapes/sizes without
66606
+ * changing global fragment defaults. We expose these controls on the block and
66607
+ * style them via data attributes on the \`.rb-team-members\` wrapper.
67607
66608
  */
67608
- :where(.theme-scope)
67609
- :where([data-block='event-registration'], [data-block='course-registration'])
67610
- .er-whole-series-form {
67611
- display: grid;
67612
- gap: 1rem;
67613
- }
67614
66609
 
67615
- :where(.theme-scope)
67616
- :where([data-block='event-registration'], [data-block='course-registration'])
67617
- .er-whole-series-form__field {
67618
- display: grid;
67619
- gap: 0.35rem;
66610
+ /* Scope all block-static CSS to ThemeScope to avoid leaking into host apps/dashboard. */
66611
+ :where(.theme-scope) :where([data-block="team-members"]) :where(.rb-team-members[data-layout-align="left"]) {
66612
+ text-align: left;
67620
66613
  }
67621
66614
 
67622
- :where(.theme-scope)
67623
- :where([data-block='event-registration'], [data-block='course-registration'])
67624
- .er-whole-series-form__label {
67625
- font-size: 0.875rem;
67626
- font-weight: 600;
66615
+ :where(.theme-scope) :where([data-block="team-members"]) :where(.rb-team-members[data-layout-align="left"]) :where(.rb-team-member) {
66616
+ align-items: flex-start;
66617
+ text-align: left;
67627
66618
  }
67628
66619
 
67629
- :where(.theme-scope)
67630
- :where([data-block='event-registration'], [data-block='course-registration'])
67631
- .er-whole-series-form__label--required::after {
67632
- content: ' *';
67633
- color: var(--er-required);
66620
+ @container rb-site (min-width: 1024px) {
66621
+ @scope ([data-rb-responsive-mode="container"]) to (:scope [data-rb-responsive-mode]) {
66622
+ :where(.theme-scope) :where([data-block="team-members"]) :where(.rb-team-members[data-layout-width="lg-3-4-left"]) {
66623
+ width: 75%;
66624
+ margin-left: 0;
66625
+ margin-right: auto;
66626
+ }
66627
+ }
67634
66628
  }
67635
66629
 
67636
- :where(.theme-scope)
67637
- :where([data-block='event-registration'], [data-block='course-registration'])
67638
- .er-whole-series-form__input {
67639
- border-radius: calc(var(--rb-block-radius) * 0.6);
67640
- border: 1px solid var(--er-border);
67641
- padding: 0.6rem 0.75rem;
67642
- background: rgb(var(--tb-background));
67643
- color: rgb(var(--tb-foreground));
66630
+ :where(.theme-scope) :where([data-block="team-members"]) .rb-team-member-photo {
66631
+ display: block;
66632
+ width: 100%;
66633
+ height: auto;
67644
66634
  }
67645
66635
 
67646
- :where(.theme-scope)
67647
- :where([data-block='event-registration'], [data-block='course-registration'])
67648
- .er-whole-series-form__textarea {
67649
- border-radius: calc(var(--rb-block-radius) * 0.6);
67650
- border: 1px solid var(--er-border);
67651
- padding: 0.6rem 0.75rem;
67652
- background: rgb(var(--tb-background));
67653
- color: rgb(var(--tb-foreground));
67654
- resize: vertical;
66636
+ :where(.theme-scope) :where([data-block="team-members"]) .rb-team-member-role {
66637
+ font-weight: 600;
67655
66638
  }
67656
66639
 
67657
- :where(.theme-scope)
67658
- :where([data-block='event-registration'], [data-block='course-registration'])
67659
- .er-whole-series-form__input:focus,
67660
- :where(.theme-scope)
67661
- :where([data-block='event-registration'], [data-block='course-registration'])
67662
- .er-whole-series-form__textarea:focus {
67663
- outline: 2px solid var(--er-focus-ring);
67664
- outline-offset: 2px;
66640
+ /* Thumbnail sizing: map \`data-image-col-size\` to a sensible max thumbnail width. */
66641
+ :where(.theme-scope) :where([data-block="team-members"]) :where(.rb-team-members) {
66642
+ --rb-team-thumb-max: 11.25rem; /* ~180px default */
66643
+ --rb-team-image-basis: 33.333%;
67665
66644
  }
67666
66645
 
67667
- :where(.theme-scope)
67668
- :where([data-block='event-registration'], [data-block='course-registration'])
67669
- .er-whole-series-form__input--error,
67670
- :where(.theme-scope)
67671
- :where([data-block='event-registration'], [data-block='course-registration'])
67672
- .er-whole-series-form__textarea.er-whole-series-form__input--error {
67673
- border-color: var(--er-border-error);
66646
+ :where(.theme-scope) :where([data-block="team-members"]) :where(.rb-team-members[data-image-col-size="1/4"]) {
66647
+ --rb-team-thumb-max: 8.75rem; /* ~140px */
66648
+ --rb-team-image-basis: 25%;
67674
66649
  }
67675
66650
 
67676
- :where(.theme-scope)
67677
- :where([data-block='event-registration'], [data-block='course-registration'])
67678
- .er-whole-series-form__error {
67679
- font-size: 0.875rem;
67680
- color: var(--er-error-text);
66651
+ :where(.theme-scope) :where([data-block="team-members"]) :where(.rb-team-members[data-image-col-size="1/3"]) {
66652
+ --rb-team-thumb-max: 11.25rem; /* ~180px */
66653
+ --rb-team-image-basis: 33.333%;
67681
66654
  }
67682
66655
 
67683
- :where(.theme-scope)
67684
- :where([data-block='event-registration'], [data-block='course-registration'])
67685
- .er-whole-series-form__hint {
67686
- font-size: 0.875rem;
67687
- opacity: 0.7;
67688
- }
67689
-
67690
- /* Logged-in user hint with logout link */
67691
- :where(.theme-scope)
67692
- :where([data-block='event-registration'], [data-block='course-registration'])
67693
- .er-whole-series-logged-in-hint {
67694
- font-size: 0.875rem;
67695
- opacity: 0.7;
67696
- margin: 0.25rem 0 0 0;
67697
- }
67698
-
67699
- :where(.theme-scope)
67700
- :where([data-block='event-registration'], [data-block='course-registration'])
67701
- .er-whole-series-link {
67702
- background: none;
67703
- border: none;
67704
- padding: 0;
67705
- font-size: inherit;
67706
- color: rgb(var(--tb-primary));
67707
- cursor: pointer;
67708
- text-decoration: underline;
67709
- text-underline-offset: 2px;
67710
- }
67711
-
67712
- :where(.theme-scope)
67713
- :where([data-block='event-registration'], [data-block='course-registration'])
67714
- .er-whole-series-link:hover {
67715
- text-decoration: none;
67716
- }
67717
-
67718
- /* =============================================================================
67719
- * Actions
67720
- * =============================================================================
67721
- */
67722
- :where(.theme-scope)
67723
- :where([data-block='event-registration'], [data-block='course-registration'])
67724
- .er-whole-series-actions {
67725
- display: flex;
67726
- align-items: center;
67727
- justify-content: space-between;
67728
- gap: 0.75rem;
67729
- margin-top: 0.25rem;
67730
- }
67731
-
67732
- :where(.theme-scope)
67733
- :where([data-block='event-registration'], [data-block='course-registration'])
67734
- .er-whole-series-back-btn {
67735
- border: 0;
67736
- background: transparent;
67737
- color: var(--er-on-surface);
67738
- opacity: 0.8;
67739
- padding: 0.25rem 0.25rem;
67740
- cursor: pointer;
67741
- }
67742
-
67743
- :where(.theme-scope)
67744
- :where([data-block='event-registration'], [data-block='course-registration'])
67745
- .er-whole-series-back-btn:hover {
67746
- opacity: 1;
67747
- text-decoration: underline;
67748
- }
67749
-
67750
- /* =============================================================================
67751
- * Payment Options
67752
- * =============================================================================
67753
- */
67754
- :where(.theme-scope)
67755
- :where([data-block='event-registration'], [data-block='course-registration'])
67756
- .er-whole-series-payment__options {
67757
- display: grid;
67758
- gap: 0.5rem;
67759
- }
67760
-
67761
- :where(.theme-scope)
67762
- :where([data-block='event-registration'], [data-block='course-registration'])
67763
- .er-whole-series-payment__option {
67764
- display: flex;
67765
- align-items: center;
67766
- gap: 0.5rem;
67767
- }
67768
-
67769
- /* =============================================================================
67770
- * Payment Tiles (Card Grid)
67771
- * =============================================================================
67772
- */
67773
- :where(.theme-scope)
67774
- :where([data-block='event-registration'], [data-block='course-registration'])
67775
- .er-whole-series-payment-tiles {
67776
- display: grid;
67777
- grid-template-columns: repeat(auto-fill, minmax(200px, 1fr));
67778
- gap: 0.75rem;
67779
- }
67780
-
67781
- :where(.theme-scope)
67782
- :where([data-block='event-registration'], [data-block='course-registration'])
67783
- .er-whole-series-payment-tile {
67784
- border-radius: var(--rb-block-radius);
67785
- border: 1px solid var(--er-payment-border);
67786
- padding: 1rem;
67787
- background: rgb(var(--tb-background));
67788
- cursor: pointer;
67789
- transition:
67790
- border-color 0.15s ease,
67791
- box-shadow 0.15s ease,
67792
- background-color 0.15s ease;
67793
- position: relative;
67794
- }
67795
-
67796
- :where(.theme-scope)
67797
- :where([data-block='event-registration'], [data-block='course-registration'])
67798
- .er-whole-series-payment-tile:hover {
67799
- border-color: var(--er-payment-border-hover);
67800
- }
67801
-
67802
- :where(.theme-scope)
67803
- :where([data-block='event-registration'], [data-block='course-registration'])
67804
- .er-whole-series-payment-tile:focus-visible {
67805
- outline: 2px solid var(--er-focus-ring);
67806
- outline-offset: 2px;
67807
- }
67808
-
67809
- :where(.theme-scope)
67810
- :where([data-block='event-registration'], [data-block='course-registration'])
67811
- .er-whole-series-payment-tile--selected {
67812
- border-color: var(--er-payment-border-selected);
67813
- background: var(--er-payment-bg-selected);
67814
- box-shadow: 0 0 0 3px var(--er-focus-ring);
67815
- }
67816
-
67817
- :where(.theme-scope)
67818
- :where([data-block='event-registration'], [data-block='course-registration'])
67819
- .er-whole-series-payment-tile--upsell {
67820
- border-style: dashed;
67821
- }
67822
-
67823
- :where(.theme-scope)
67824
- :where([data-block='event-registration'], [data-block='course-registration'])
67825
- .er-whole-series-payment-tile__header {
67826
- display: flex;
67827
- align-items: flex-start;
67828
- justify-content: space-between;
67829
- gap: 0.5rem;
67830
- }
67831
-
67832
- :where(.theme-scope)
67833
- :where([data-block='event-registration'], [data-block='course-registration'])
67834
- .er-whole-series-payment-tile__name {
67835
- margin: 0;
67836
- font-weight: 600;
67837
- font-size: 1rem;
67838
- }
67839
-
67840
- :where(.theme-scope)
67841
- :where([data-block='event-registration'], [data-block='course-registration'])
67842
- .er-whole-series-payment-tile__description {
67843
- margin: 0.25rem 0 0 0;
67844
- font-size: 0.875rem;
67845
- opacity: 0.7;
67846
- }
67847
-
67848
- :where(.theme-scope)
67849
- :where([data-block='event-registration'], [data-block='course-registration'])
67850
- .er-whole-series-payment-tile__price {
67851
- font-weight: 600;
67852
- font-size: 0.875rem;
67853
- white-space: nowrap;
67854
- }
67855
-
67856
- :where(.theme-scope)
67857
- :where([data-block='event-registration'], [data-block='course-registration'])
67858
- .er-whole-series-payment-tile__badge {
67859
- display: inline-block;
67860
- padding: 0.125rem 0.5rem;
67861
- border-radius: 9999px;
67862
- font-size: 0.75rem;
67863
- font-weight: 500;
67864
- margin-top: 0.5rem;
67865
- }
67866
-
67867
- /* Checkmark indicator on selected tile */
67868
- :where(.theme-scope)
67869
- :where([data-block='event-registration'], [data-block='course-registration'])
67870
- .er-whole-series-payment-tile__check {
67871
- position: absolute;
67872
- top: 0.5rem;
67873
- right: 0.5rem;
67874
- width: 1.25rem;
67875
- height: 1.25rem;
67876
- border-radius: 9999px;
67877
- background: var(--er-check-bg);
67878
- color: var(--er-check-text);
67879
- display: flex;
67880
- align-items: center;
67881
- justify-content: center;
67882
- opacity: 0;
67883
- transition: opacity 0.15s ease;
67884
- }
67885
-
67886
- :where(.theme-scope)
67887
- :where([data-block='event-registration'], [data-block='course-registration'])
67888
- .er-whole-series-payment-tile--selected
67889
- .er-whole-series-payment-tile__check {
67890
- opacity: 1;
67891
- }
67892
-
67893
- /* =============================================================================
67894
- * Booking Mode Step
67895
- * =============================================================================
67896
- */
67897
- :where(.theme-scope)
67898
- :where([data-block='event-registration'], [data-block='course-registration'])
67899
- .er-whole-series-booking-mode {
67900
- display: grid;
67901
- gap: 1rem;
67902
- }
67903
-
67904
- :where(.theme-scope)
67905
- :where([data-block='event-registration'], [data-block='course-registration'])
67906
- .er-whole-series-booking-mode__title {
67907
- margin: 0;
67908
- font-size: var(--er-step-title-size);
67909
- font-weight: 700;
67910
- }
67911
-
67912
- :where(.theme-scope)
67913
- :where([data-block='event-registration'], [data-block='course-registration'])
67914
- .er-whole-series-booking-mode__subtitle {
67915
- margin: 0.25rem 0 0 0;
67916
- opacity: 0.7;
67917
- }
67918
-
67919
- :where(.theme-scope)
67920
- :where([data-block='event-registration'], [data-block='course-registration'])
67921
- .er-whole-series-booking-mode__link {
67922
- margin-top: 0.5rem;
67923
- font-size: 0.875rem;
67924
- }
67925
-
67926
- :where(.theme-scope)
67927
- :where([data-block='event-registration'], [data-block='course-registration'])
67928
- .er-whole-series-booking-mode__link
67929
- a {
67930
- color: rgb(var(--tb-primary));
67931
- text-decoration: underline;
67932
- cursor: pointer;
67933
- }
67934
-
67935
- :where(.theme-scope)
67936
- :where([data-block='event-registration'], [data-block='course-registration'])
67937
- .er-whole-series-booking-mode__link
67938
- a:hover {
67939
- text-decoration: none;
67940
- }
67941
-
67942
- /* =============================================================================
67943
- * Membership Hero
67944
- * =============================================================================
67945
- */
67946
- :where(.theme-scope)
67947
- :where([data-block='event-registration'], [data-block='course-registration'])
67948
- .er-whole-series-membership-hero {
67949
- border-radius: var(--rb-block-radius);
67950
- background: var(--er-success-bg);
67951
- border: 1px solid rgba(var(--tb-success), 0.2);
67952
- padding: 1.5rem;
67953
- text-align: center;
67954
- }
67955
-
67956
- :where(.theme-scope)
67957
- :where([data-block='event-registration'], [data-block='course-registration'])
67958
- .er-whole-series-membership-hero__icon {
67959
- font-size: 2rem;
67960
- margin-bottom: 0.75rem;
67961
- }
67962
-
67963
- :where(.theme-scope)
67964
- :where([data-block='event-registration'], [data-block='course-registration'])
67965
- .er-whole-series-membership-hero__title {
67966
- margin: 0;
67967
- font-size: 1.25rem;
67968
- font-weight: 700;
67969
- color: var(--er-success-text);
67970
- }
67971
-
67972
- :where(.theme-scope)
67973
- :where([data-block='event-registration'], [data-block='course-registration'])
67974
- .er-whole-series-membership-hero__subtitle {
67975
- margin: 0.25rem 0 0 0;
67976
- font-size: 0.875rem;
67977
- opacity: 0.8;
67978
- }
67979
-
67980
- /* =============================================================================
67981
- * Portal Auth Sidebar
67982
- * =============================================================================
67983
- */
67984
- :where(.theme-scope)
67985
- :where([data-block='event-registration'], [data-block='course-registration'])
67986
- .er-whole-series-portal-sidebar {
67987
- border-radius: var(--rb-block-radius);
67988
- border: 1px solid var(--er-border);
67989
- padding: 1.25rem;
67990
- background: rgb(var(--tb-surface));
67991
- color: var(--er-on-surface);
67992
- }
67993
-
67994
- :where(.theme-scope)
67995
- :where([data-block='event-registration'], [data-block='course-registration'])
67996
- .er-whole-series-portal-sidebar__icon {
67997
- font-size: 1.5rem;
67998
- margin-bottom: 0.5rem;
67999
- }
68000
-
68001
- :where(.theme-scope)
68002
- :where([data-block='event-registration'], [data-block='course-registration'])
68003
- .er-whole-series-portal-sidebar__title {
68004
- margin: 0;
68005
- font-size: 1rem;
68006
- font-weight: 600;
68007
- }
68008
-
68009
- :where(.theme-scope)
68010
- :where([data-block='event-registration'], [data-block='course-registration'])
68011
- .er-whole-series-portal-sidebar__text {
68012
- margin: 0.5rem 0 0 0;
68013
- font-size: 0.875rem;
68014
- opacity: 0.8;
68015
- }
68016
-
68017
- :where(.theme-scope)
68018
- :where([data-block='event-registration'], [data-block='course-registration'])
68019
- .er-whole-series-portal-sidebar__action {
68020
- margin-top: 1rem;
68021
- }
68022
-
68023
- :where(.theme-scope)
68024
- :where([data-block='event-registration'], [data-block='course-registration'])
68025
- .er-whole-series-portal-sidebar__link {
68026
- color: rgb(var(--tb-primary));
68027
- cursor: pointer;
68028
- text-decoration: underline;
68029
- font-size: 0.875rem;
68030
- }
68031
-
68032
- :where(.theme-scope)
68033
- :where([data-block='event-registration'], [data-block='course-registration'])
68034
- .er-whole-series-portal-sidebar__link:hover {
68035
- text-decoration: none;
68036
- }
68037
-
68038
- /* =============================================================================
68039
- * Modal (for Magic Link)
68040
- * =============================================================================
68041
- */
68042
- :where(.theme-scope)
68043
- :where([data-block='event-registration'], [data-block='course-registration'])
68044
- .er-whole-series-modal-overlay {
68045
- position: fixed;
68046
- inset: 0;
68047
- background: rgba(var(--tb-scrim), 0.5);
68048
- display: flex;
68049
- align-items: center;
68050
- justify-content: center;
68051
- z-index: 100;
68052
- animation: er-whole-series-fade-in 0.15s ease;
68053
- }
68054
-
68055
- :where(.theme-scope)
68056
- :where([data-block='event-registration'], [data-block='course-registration'])
68057
- .er-whole-series-modal {
68058
- background: rgb(var(--tb-surface));
68059
- color: var(--er-on-surface);
68060
- border-radius: var(--rb-block-radius);
68061
- padding: 1.5rem;
68062
- max-width: 28rem;
68063
- width: calc(100% - 2rem);
68064
- position: relative;
68065
- animation: er-whole-series-slide-up 0.2s ease;
68066
- }
68067
-
68068
- :where(.theme-scope)
68069
- :where([data-block='event-registration'], [data-block='course-registration'])
68070
- .er-whole-series-modal-close {
68071
- position: absolute;
68072
- top: 0.75rem;
68073
- right: 0.75rem;
68074
- background: transparent;
68075
- border: 0;
68076
- padding: 0.25rem;
68077
- cursor: pointer;
68078
- opacity: 0.6;
68079
- transition: opacity 0.15s ease;
68080
- }
68081
-
68082
- :where(.theme-scope)
68083
- :where([data-block='event-registration'], [data-block='course-registration'])
68084
- .er-whole-series-modal-close:hover {
68085
- opacity: 1;
68086
- }
68087
-
68088
- @keyframes er-whole-series-fade-in {
68089
- from {
68090
- opacity: 0;
68091
- }
68092
- to {
68093
- opacity: 1;
68094
- }
68095
- }
68096
-
68097
- @keyframes er-whole-series-slide-up {
68098
- from {
68099
- opacity: 0;
68100
- transform: translateY(10px);
68101
- }
68102
- to {
68103
- opacity: 1;
68104
- transform: translateY(0);
68105
- }
68106
- }
68107
-
68108
- /* Reduced motion */
68109
- @media (prefers-reduced-motion: reduce) {
68110
- :where(.theme-scope)
68111
- :where(
68112
- [data-block='event-registration'],
68113
- [data-block='course-registration']
68114
- )
68115
- .er-whole-series-modal-overlay,
68116
- :where(.theme-scope)
68117
- :where(
68118
- [data-block='event-registration'],
68119
- [data-block='course-registration']
68120
- )
68121
- .er-whole-series-modal {
68122
- animation: none;
68123
- }
68124
- }
68125
-
68126
- /* =============================================================================
68127
- * Center States
68128
- * =============================================================================
68129
- */
68130
- :where(.theme-scope)
68131
- :where([data-block='event-registration'], [data-block='course-registration'])
68132
- .er-whole-series-center {
68133
- display: grid;
68134
- place-items: center;
68135
- gap: 0.75rem;
68136
- padding: 2rem 0;
68137
- }
68138
-
68139
- /* =============================================================================
68140
- * Success/Waitlist/Error States
68141
- * =============================================================================
68142
- */
68143
- :where(.theme-scope)
68144
- :where([data-block='event-registration'], [data-block='course-registration'])
68145
- .er-whole-series-success,
68146
- :where(.theme-scope)
68147
- :where([data-block='event-registration'], [data-block='course-registration'])
68148
- .er-whole-series-waitlist,
68149
- :where(.theme-scope)
68150
- :where([data-block='event-registration'], [data-block='course-registration'])
68151
- .er-whole-series-error,
68152
- :where(.theme-scope)
68153
- :where([data-block='event-registration'], [data-block='course-registration'])
68154
- .er-whole-series-payment-failed {
68155
- text-align: center;
68156
- padding: 2rem 1rem;
68157
- }
68158
-
68159
- /* State icon color variants (layout from registration-surface.css) */
68160
- :where(.theme-scope)
68161
- :where([data-block='event-registration'], [data-block='course-registration'])
68162
- .rb-state-icon--success {
68163
- background: var(--er-success-bg);
68164
- color: var(--er-success-text);
68165
- }
68166
-
68167
- :where(.theme-scope)
68168
- :where([data-block='event-registration'], [data-block='course-registration'])
68169
- .rb-state-icon--error {
68170
- background: var(--er-error-bg);
68171
- color: var(--er-error-text);
68172
- }
68173
-
68174
- :where(.theme-scope)
68175
- :where([data-block='event-registration'], [data-block='course-registration'])
68176
- .rb-state-icon--waitlist,
68177
- :where(.theme-scope)
68178
- :where([data-block='event-registration'], [data-block='course-registration'])
68179
- .rb-state-icon--warning {
68180
- background: var(--er-waitlist-bg);
68181
- color: var(--er-waitlist-text);
68182
- }
68183
-
68184
- :where(.theme-scope)
68185
- :where([data-block='event-registration'], [data-block='course-registration'])
68186
- .er-whole-series-success__title,
68187
- :where(.theme-scope)
68188
- :where([data-block='event-registration'], [data-block='course-registration'])
68189
- .er-whole-series-waitlist__title,
68190
- :where(.theme-scope)
68191
- :where([data-block='event-registration'], [data-block='course-registration'])
68192
- .er-whole-series-error__title,
68193
- :where(.theme-scope)
68194
- :where([data-block='event-registration'], [data-block='course-registration'])
68195
- .er-whole-series-payment-failed__title {
68196
- margin: 0.75rem 0 0.5rem 0;
68197
- font-size: 1.125rem;
68198
- font-weight: 700;
68199
- }
68200
-
68201
- :where(.theme-scope)
68202
- :where([data-block='event-registration'], [data-block='course-registration'])
68203
- .er-whole-series-success__message,
68204
- :where(.theme-scope)
68205
- :where([data-block='event-registration'], [data-block='course-registration'])
68206
- .er-whole-series-waitlist__message,
68207
- :where(.theme-scope)
68208
- :where([data-block='event-registration'], [data-block='course-registration'])
68209
- .er-whole-series-error__message,
68210
- :where(.theme-scope)
68211
- :where([data-block='event-registration'], [data-block='course-registration'])
68212
- .er-whole-series-payment-failed__message {
68213
- margin: 0;
68214
- opacity: 0.7;
68215
- }
68216
-
68217
- :where(.theme-scope)
68218
- :where([data-block='event-registration'], [data-block='course-registration'])
68219
- .er-whole-series-success__membership {
68220
- margin-top: 0.5rem;
68221
- font-size: 0.875rem;
68222
- color: var(--er-success-text);
68223
- }
68224
-
68225
- :where(.theme-scope)
68226
- :where([data-block='event-registration'], [data-block='course-registration'])
68227
- .er-whole-series-error__retry,
68228
- :where(.theme-scope)
68229
- :where([data-block='event-registration'], [data-block='course-registration'])
68230
- .er-whole-series-payment-failed__retry {
68231
- margin-top: 1rem;
68232
- }
68233
-
68234
- /* =============================================================================
68235
- * Discount Code Section
68236
- * =============================================================================
68237
- */
68238
- :where(.theme-scope)
68239
- :where([data-block='event-registration'], [data-block='course-registration'])
68240
- .er-whole-series-discount {
68241
- margin-top: 0.5rem;
68242
- }
68243
-
68244
- :where(.theme-scope)
68245
- :where([data-block='event-registration'], [data-block='course-registration'])
68246
- .er-whole-series-discount__form {
68247
- display: grid;
68248
- gap: 0.5rem;
68249
- }
68250
-
68251
- :where(.theme-scope)
68252
- :where([data-block='event-registration'], [data-block='course-registration'])
68253
- .er-whole-series-discount__toggle {
68254
- background: transparent;
68255
- border: 0;
68256
- padding: 0;
68257
- color: rgb(var(--tb-primary));
68258
- cursor: pointer;
68259
- font-size: 0.875rem;
68260
- text-decoration: underline;
68261
- }
68262
-
68263
- :where(.theme-scope)
68264
- :where([data-block='event-registration'], [data-block='course-registration'])
68265
- .er-whole-series-discount__toggle:hover {
68266
- text-decoration: none;
68267
- }
68268
-
68269
- :where(.theme-scope)
68270
- :where([data-block='event-registration'], [data-block='course-registration'])
68271
- .er-whole-series-discount__label {
68272
- font-size: 0.875rem;
68273
- font-weight: 600;
68274
- }
68275
-
68276
- :where(.theme-scope)
68277
- :where([data-block='event-registration'], [data-block='course-registration'])
68278
- .er-whole-series-discount__row {
68279
- display: flex;
68280
- gap: 0.5rem;
68281
- }
68282
-
68283
- :where(.theme-scope)
68284
- :where([data-block='event-registration'], [data-block='course-registration'])
68285
- .er-whole-series-discount__input {
68286
- flex: 1;
68287
- border-radius: calc(var(--rb-block-radius) * 0.6);
68288
- border: 1px solid var(--er-border);
68289
- padding: 0.5rem 0.75rem;
68290
- background: rgb(var(--tb-background));
68291
- color: rgb(var(--tb-foreground));
68292
- font-size: 0.875rem;
68293
- }
68294
-
68295
- :where(.theme-scope)
68296
- :where([data-block='event-registration'], [data-block='course-registration'])
68297
- .er-whole-series-discount__input:focus {
68298
- outline: 2px solid var(--er-focus-ring);
68299
- outline-offset: 2px;
68300
- }
68301
-
68302
- :where(.theme-scope)
68303
- :where([data-block='event-registration'], [data-block='course-registration'])
68304
- .er-whole-series-discount__remove {
68305
- background: transparent;
68306
- border: 0;
68307
- padding: 0.25rem;
68308
- cursor: pointer;
68309
- opacity: 0.6;
68310
- }
68311
-
68312
- :where(.theme-scope)
68313
- :where([data-block='event-registration'], [data-block='course-registration'])
68314
- .er-whole-series-discount__apply {
68315
- background: transparent;
68316
- border: 0;
68317
- padding: 0.25rem;
68318
- cursor: pointer;
68319
- opacity: 0.8;
68320
- }
68321
-
68322
- :where(.theme-scope)
68323
- :where([data-block='event-registration'], [data-block='course-registration'])
68324
- .er-whole-series-discount__remove:hover {
68325
- opacity: 1;
68326
- }
68327
-
68328
- :where(.theme-scope)
68329
- :where([data-block='event-registration'], [data-block='course-registration'])
68330
- .er-whole-series-discount__apply:hover {
68331
- opacity: 1;
68332
- }
68333
-
68334
- :where(.theme-scope)
68335
- :where([data-block='event-registration'], [data-block='course-registration'])
68336
- .er-whole-series-discount__hint {
68337
- margin: 0;
68338
- font-size: 0.875rem;
68339
- opacity: 0.7;
68340
- }
68341
-
68342
- :where(.theme-scope)
68343
- :where([data-block='event-registration'], [data-block='course-registration'])
68344
- .er-whole-series-discount__feedback {
68345
- margin: 0;
68346
- font-size: 0.875rem;
68347
- }
68348
-
68349
- /* =============================================================================
68350
- * Altcha (Spam Protection)
68351
- * =============================================================================
68352
- */
68353
- :where(.theme-scope)
68354
- :where([data-block='event-registration'], [data-block='course-registration'])
68355
- .er-whole-series-altcha {
68356
- margin-top: 1rem;
68357
- }
68358
-
68359
- /* =============================================================================
68360
- * Magic Link Form
68361
- * =============================================================================
68362
- */
68363
- :where(.theme-scope)
68364
- :where([data-block='event-registration'], [data-block='course-registration'])
68365
- .er-whole-series-magic-link-form {
68366
- display: flex;
68367
- flex-direction: column;
68368
- gap: 0.75rem;
68369
- }
68370
-
68371
- :where(.theme-scope)
68372
- :where([data-block='event-registration'], [data-block='course-registration'])
68373
- .er-whole-series-magic-link-title {
68374
- margin: 0;
68375
- font-size: 1.25rem;
68376
- font-weight: 700;
68377
- }
68378
-
68379
- :where(.theme-scope)
68380
- :where([data-block='event-registration'], [data-block='course-registration'])
68381
- .er-whole-series-magic-link-success {
68382
- display: flex;
68383
- flex-direction: column;
68384
- gap: 0.75rem;
68385
- }
68386
-
68387
- :where(.theme-scope)
68388
- :where([data-block='event-registration'], [data-block='course-registration'])
68389
- .er-whole-series-portal-auth-text {
68390
- margin: 0;
68391
- font-size: 0.875rem;
68392
- opacity: 0.8;
68393
- }
68394
-
68395
- :where(.theme-scope)
68396
- :where([data-block='event-registration'], [data-block='course-registration'])
68397
- .er-whole-series-portal-auth-text--success {
68398
- color: var(--er-success-text);
68399
- }
68400
-
68401
- :where(.theme-scope)
68402
- :where([data-block='event-registration'], [data-block='course-registration'])
68403
- .er-whole-series-portal-auth-text--error {
68404
- color: var(--er-error-text);
68405
- }
68406
-
68407
- :where(.theme-scope)
68408
- :where([data-block='event-registration'], [data-block='course-registration'])
68409
- .er-whole-series-modal-btn {
68410
- border-radius: calc(var(--rb-block-radius) * 0.6);
68411
- border: 0;
68412
- padding: 0.6rem 1rem;
68413
- font-size: 0.875rem;
68414
- font-weight: 600;
68415
- cursor: pointer;
68416
- transition: opacity 0.15s ease;
68417
- background: rgb(var(--tb-primary));
68418
- color: rgb(var(--tb-primaryText, 255 255 255));
68419
- }
68420
-
68421
- :where(.theme-scope)
68422
- :where([data-block='event-registration'], [data-block='course-registration'])
68423
- .er-whole-series-modal-btn:hover {
68424
- opacity: 0.9;
68425
- }
68426
-
68427
- :where(.theme-scope)
68428
- :where([data-block='event-registration'], [data-block='course-registration'])
68429
- .er-whole-series-modal-btn:disabled {
68430
- opacity: 0.5;
68431
- cursor: not-allowed;
68432
- }
68433
-
68434
- :where(.theme-scope)
68435
- :where([data-block='event-registration'], [data-block='course-registration'])
68436
- .er-whole-series-modal-btn--secondary {
68437
- background: transparent;
68438
- color: var(--er-on-surface);
68439
- border: 1px solid var(--er-border);
68440
- }
68441
-
68442
- :where(.theme-scope)
68443
- :where([data-block='event-registration'], [data-block='course-registration'])
68444
- .er-whole-series-modal-btn--secondary:hover {
68445
- background: var(--er-on-surface-hover-bg);
68446
- }
68447
-
68448
- /* =============================================================================
68449
- * Utility Classes
68450
- * =============================================================================
68451
- */
68452
- :where(.theme-scope)
68453
- :where([data-block='event-registration'], [data-block='course-registration'])
68454
- .er-whole-series-text--muted {
68455
- opacity: 0.7;
68456
- }
68457
-
68458
- :where(.theme-scope)
68459
- :where([data-block='event-registration'], [data-block='course-registration'])
68460
- .er-whole-series-text--error {
68461
- color: var(--er-error-text);
68462
- }
68463
-
68464
- :where(.theme-scope)
68465
- :where([data-block='event-registration'], [data-block='course-registration'])
68466
- .er-whole-series-text--success {
68467
- color: var(--er-success-text);
68468
- }
68469
-
68470
- :where(.theme-scope)
68471
- :where([data-block='event-registration'], [data-block='course-registration'])
68472
- .er-whole-series-sr-only {
68473
- position: absolute;
68474
- width: 1px;
68475
- height: 1px;
68476
- padding: 0;
68477
- margin: -1px;
68478
- overflow: hidden;
68479
- clip: rect(0, 0, 0, 0);
68480
- white-space: nowrap;
68481
- border-width: 0;
68482
- }
68483
-
68484
- /* Stack utility */
68485
- :where(.theme-scope)
68486
- :where([data-block='event-registration'], [data-block='course-registration'])
68487
- .er-whole-series-stack {
68488
- display: flex;
68489
- flex-direction: column;
68490
- }
68491
-
68492
- :where(.theme-scope)
68493
- :where([data-block='event-registration'], [data-block='course-registration'])
68494
- .er-whole-series-stack--gap-sm {
68495
- gap: 0.5rem;
68496
- }
68497
-
68498
- :where(.theme-scope)
68499
- :where([data-block='event-registration'], [data-block='course-registration'])
68500
- .er-whole-series-stack--gap-md {
68501
- gap: 1rem;
68502
- }
68503
-
68504
- :where(.theme-scope)
68505
- :where([data-block='event-registration'], [data-block='course-registration'])
68506
- .er-whole-series-stack--gap-lg {
68507
- gap: 1.5rem;
68508
- }
68509
-
68510
- /* =============================================================================
68511
- * Block: Newsletter Signup
68512
- * =============================================================================
68513
- */
68514
-
68515
- /* Newsletter copy styling */
68516
- :where(.theme-scope) :where([data-block="newsletter-signup"]) .newsletter-copy-title {
68517
- font-size: 1.5rem;
68518
- font-weight: 600;
68519
- }
68520
-
68521
- :where(.theme-scope) :where([data-block="newsletter-signup"]) .newsletter-copy-subtitle {
68522
- font-size: 1rem;
68523
- color: var(--rb-surface-text-color, rgb(var(--tb-text, 17 24 39)));
68524
- opacity: 0.85;
68525
- }
68526
-
68527
- /* Newsletter form container */
68528
- :where(.theme-scope) .newsletter-form {
68529
- width: 100%;
68530
- max-width: 32rem;
68531
- margin-left: auto;
68532
- margin-right: auto;
68533
- }
68534
-
68535
- /* Newsletter form fields container */
68536
- :where(.theme-scope) .newsletter-form-fields {
68537
- display: flex;
68538
- flex-direction: column;
68539
- gap: var(--rb-gap-sm, 0.75rem);
68540
- }
68541
-
68542
- /* Individual field styling */
68543
- :where(.theme-scope) .newsletter-field {
68544
- display: flex;
68545
- flex-direction: column;
68546
- gap: 0.25rem;
68547
- }
68548
-
68549
- /* Required indicator */
68550
- :where(.theme-scope) .newsletter-required {
68551
- color: rgb(var(--tb-primary));
68552
- margin-left: 0.125rem;
68553
- }
68554
-
68555
- /* Submit button container */
68556
- :where(.theme-scope) .newsletter-submit {
68557
- margin-top: 0.5rem;
68558
- }
68559
-
68560
- /* ALTCHA widget container */
68561
- :where(.theme-scope) .newsletter-altcha {
68562
- margin-top: 0.75rem;
68563
- display: flex;
68564
- justify-content: center;
68565
- }
68566
-
68567
- /* Privacy note */
68568
- :where(.theme-scope) .newsletter-privacy-note {
68569
- margin-top: 0.75rem;
68570
- font-size: 1rem;
68571
- line-height: 1.6;
68572
- color: var(--rb-surface-text-color, rgb(var(--tb-text, 17 24 39)));
68573
- text-align: center;
68574
- }
68575
-
68576
- /* =============================================================================
68577
- * Inline Variant - Horizontal layout
68578
- * =============================================================================
68579
- */
68580
-
68581
- :where(.theme-scope) .newsletter-inline .newsletter-form-fields {
68582
- flex-direction: row;
68583
- align-items: flex-end;
68584
- flex-wrap: wrap;
68585
- gap: var(--rb-gap-sm, 0.75rem);
68586
- }
68587
-
68588
- :where(.theme-scope) .newsletter-inline .newsletter-field {
68589
- flex: 1 1 auto;
68590
- min-width: 10rem;
68591
- }
68592
-
68593
- :where(.theme-scope) .newsletter-inline .newsletter-submit {
68594
- margin-top: 0;
68595
- flex-shrink: 0;
68596
- }
68597
-
68598
- /* Mobile fallback for inline variant */
68599
- @container rb-site (max-width: 640px) {
68600
- @scope ([data-rb-responsive-mode="container"]) to (:scope [data-rb-responsive-mode]) {
68601
- :where(.theme-scope) .newsletter-inline .newsletter-form-fields {
68602
- flex-direction: column;
68603
- }
68604
-
68605
- :where(.theme-scope) .newsletter-inline .newsletter-field {
68606
- min-width: 100%;
68607
- }
68608
- }
68609
- }
68610
-
68611
- /* =============================================================================
68612
- * Editorial Split Variant
68613
- * =============================================================================
68614
- */
68615
-
68616
- :where(.theme-scope) .newsletter-editorial-split {
68617
- display: grid;
68618
- grid-template-columns: minmax(0, 0.9fr) minmax(20rem, 1.1fr);
68619
- gap: clamp(2.5rem, 7vw, 7rem);
68620
- align-items: center;
68621
- text-align: left;
68622
- }
68623
-
68624
- :where(.theme-scope) .newsletter-editorial-split-copy {
68625
- display: flex;
68626
- flex-direction: column;
68627
- gap: var(--rb-gap-sm, 0.75rem);
68628
- }
68629
-
68630
- :where(.theme-scope) .newsletter-editorial-split-form {
68631
- min-width: 0;
68632
- }
68633
-
68634
- :where(.theme-scope) .newsletter-editorial-split .newsletter-form {
68635
- max-width: none;
68636
- margin-inline: 0;
68637
- }
68638
-
68639
- :where(.theme-scope) .newsletter-editorial-split .newsletter-copy-title {
68640
- font-size: clamp(2rem, 4vw, 3.5rem);
68641
- font-weight: 500;
68642
- }
68643
-
68644
- :where(.theme-scope) .newsletter-editorial-split .newsletter-privacy-note {
68645
- text-align: left;
68646
- }
68647
-
68648
- @container rb-site (max-width: 767px) {
68649
- @scope ([data-rb-responsive-mode="container"]) to (:scope [data-rb-responsive-mode]) {
68650
- :where(.theme-scope) .newsletter-editorial-split {
68651
- grid-template-columns: minmax(0, 1fr);
68652
- gap: 2rem;
68653
- }
68654
- }
68655
- }
68656
-
68657
- /* =============================================================================
68658
- * Success State
68659
- * =============================================================================
68660
- */
68661
-
68662
- :where(.theme-scope) .newsletter-success {
68663
- text-align: center;
68664
- }
68665
-
68666
- :where(.theme-scope) .newsletter-success .fb-success {
68667
- padding: 1rem 1.5rem;
68668
- background-color: rgba(var(--tb-success, 34 197 94), 0.1);
68669
- border-radius: var(--radius-md, 0.5rem);
68670
- color: rgb(var(--tb-text));
68671
- }
68672
-
68673
- /* =============================================================================
68674
- * Block: Contact + Newsletter
68675
- * =============================================================================
68676
- */
68677
-
68678
- :where(.theme-scope) :where([data-block="contact-newsletter"]) .contact-newsletter-grid {
68679
- display: grid;
68680
- grid-template-columns: repeat(auto-fit, minmax(min(24rem, 100%), 1fr));
68681
- gap: clamp(2.5rem, 6vw, 4rem);
68682
- align-items: start;
68683
- }
68684
-
68685
- :where(.theme-scope) :where([data-block="contact-newsletter"]) .contact-newsletter-column {
68686
- min-width: 0;
68687
- }
68688
-
68689
- :where(.theme-scope) :where([data-block="contact-newsletter"]) .contact-newsletter-copy {
68690
- margin-bottom: 1.5rem;
68691
- }
68692
-
68693
- :where(.theme-scope) :where([data-block="contact-newsletter"]) .form-copy-title,
68694
- :where(.theme-scope) :where([data-block="contact-newsletter"]) .newsletter-copy-title {
68695
- margin: 0 0 0.75rem;
68696
- }
68697
-
68698
- :where(.theme-scope) :where([data-block="contact-newsletter"]) .form-copy-intro,
68699
- :where(.theme-scope) :where([data-block="contact-newsletter"]) .newsletter-copy-subtitle {
68700
- color: var(--rb-surface-text-color, rgb(var(--tb-text, 17 24 39)));
68701
- }
68702
-
68703
- :where(.theme-scope) :where([data-block="contact-newsletter"]) .contact-newsletter-info {
68704
- display: flex;
68705
- flex-direction: column;
68706
- align-items: flex-start;
68707
- }
68708
-
68709
- :where(.theme-scope) :where([data-block="contact-newsletter"]) .newsletter-form {
68710
- max-width: none;
68711
- margin-left: 0;
68712
- margin-right: 0;
68713
- }
68714
-
68715
- :where(.theme-scope) :where([data-block="contact-newsletter"]) .newsletter-privacy-note {
68716
- text-align: left;
68717
- }
68718
-
68719
- :where(.theme-scope) :where([data-block="contact-newsletter"]) .fb-form {
68720
- display: flex;
68721
- flex-direction: column;
68722
- gap: 1rem;
68723
- }
68724
-
68725
- :where(.theme-scope) :where([data-block="contact-newsletter"]) .fb-row-2 {
68726
- display: grid;
68727
- grid-template-columns: repeat(auto-fit, minmax(min(14rem, 100%), 1fr));
68728
- gap: 1rem;
68729
- }
68730
-
68731
- :where(.theme-scope) :where([data-block="contact-newsletter"]) .fb-field {
68732
- display: flex;
68733
- flex-direction: column;
68734
- gap: 0.25rem;
68735
- }
68736
-
68737
- :where(.theme-scope) :where([data-block="contact-newsletter"]) .fb-fieldset {
68738
- display: flex;
68739
- flex-direction: column;
68740
- gap: 0.5rem;
68741
- border: none;
68742
- padding: 0;
68743
- margin: 0;
68744
- }
68745
-
68746
- :where(.theme-scope) :where([data-block="contact-newsletter"]) .fb-inline {
68747
- display: flex;
68748
- align-items: center;
68749
- gap: 0.5rem;
68750
- }
68751
-
68752
- :where(.theme-scope) :where([data-block="contact-newsletter"]) .fb-success,
68753
- :where(.theme-scope) :where([data-block="contact-newsletter"]) .fb-error,
68754
- :where(.theme-scope) :where([data-block="contact-newsletter"]) .fb-empty {
68755
- border-radius: var(--rb-block-radius);
68756
- padding: 1rem;
68757
- font-size: 0.875rem;
68758
- }
68759
-
68760
- :where(.theme-scope) :where([data-block="contact-newsletter"]) .fb-success {
68761
- background-color: var(--fb-success-bg);
68762
- color: var(--fb-success-text);
68763
- border: 1px solid var(--fb-success-border);
68764
- }
68765
-
68766
- :where(.theme-scope) :where([data-block="contact-newsletter"]) .fb-error {
68767
- background-color: var(--fb-error-bg);
68768
- color: var(--fb-error-text);
68769
- border: 1px solid var(--fb-error-border);
68770
- }
68771
-
68772
- :where(.theme-scope) :where([data-block="contact-newsletter"]) .fb-empty {
68773
- background-color: var(--fb-empty-bg);
68774
- color: var(--fb-empty-text);
68775
- border: 1px dashed var(--fb-empty-border);
68776
- text-align: center;
68777
- }
68778
-
68779
- :where(.theme-scope) :where([data-block="contact-newsletter"]) .fb-actions {
68780
- margin-top: 0.5rem;
68781
- }
68782
-
68783
- /* =============================================================================
68784
- * Block: Team Members
68785
- * =============================================================================
68786
- *
68787
- * Site/theme authors sometimes need different thumbnail shapes/sizes without
68788
- * changing global fragment defaults. We expose these controls on the block and
68789
- * style them via data attributes on the \`.rb-team-members\` wrapper.
68790
- */
68791
-
68792
- /* Scope all block-static CSS to ThemeScope to avoid leaking into host apps/dashboard. */
68793
- :where(.theme-scope) :where([data-block="team-members"]) :where(.rb-team-members[data-layout-align="left"]) {
68794
- text-align: left;
68795
- }
68796
-
68797
- :where(.theme-scope) :where([data-block="team-members"]) :where(.rb-team-members[data-layout-align="left"]) :where(.rb-team-member) {
68798
- align-items: flex-start;
68799
- text-align: left;
68800
- }
68801
-
68802
- @container rb-site (min-width: 1024px) {
68803
- @scope ([data-rb-responsive-mode="container"]) to (:scope [data-rb-responsive-mode]) {
68804
- :where(.theme-scope) :where([data-block="team-members"]) :where(.rb-team-members[data-layout-width="lg-3-4-left"]) {
68805
- width: 75%;
68806
- margin-left: 0;
68807
- margin-right: auto;
68808
- }
68809
- }
68810
- }
68811
-
68812
- :where(.theme-scope) :where([data-block="team-members"]) .rb-team-member-photo {
68813
- display: block;
68814
- width: 100%;
68815
- height: auto;
68816
- }
68817
-
68818
- :where(.theme-scope) :where([data-block="team-members"]) .rb-team-member-role {
68819
- font-weight: 600;
68820
- }
68821
-
68822
- /* Thumbnail sizing: map \`data-image-col-size\` to a sensible max thumbnail width. */
68823
- :where(.theme-scope) :where([data-block="team-members"]) :where(.rb-team-members) {
68824
- --rb-team-thumb-max: 11.25rem; /* ~180px default */
68825
- --rb-team-image-basis: 33.333%;
68826
- }
68827
-
68828
- :where(.theme-scope) :where([data-block="team-members"]) :where(.rb-team-members[data-image-col-size="1/4"]) {
68829
- --rb-team-thumb-max: 8.75rem; /* ~140px */
68830
- --rb-team-image-basis: 25%;
68831
- }
68832
-
68833
- :where(.theme-scope) :where([data-block="team-members"]) :where(.rb-team-members[data-image-col-size="1/3"]) {
68834
- --rb-team-thumb-max: 11.25rem; /* ~180px */
68835
- --rb-team-image-basis: 33.333%;
68836
- }
68837
-
68838
- :where(.theme-scope) :where([data-block="team-members"]) :where(.rb-team-members[data-image-col-size="2/5"]) {
68839
- --rb-team-thumb-max: 13.75rem; /* ~220px */
68840
- --rb-team-image-basis: 40%;
66656
+ :where(.theme-scope) :where([data-block="team-members"]) :where(.rb-team-members[data-image-col-size="2/5"]) {
66657
+ --rb-team-thumb-max: 13.75rem; /* ~220px */
66658
+ --rb-team-image-basis: 40%;
68841
66659
  }
68842
66660
 
68843
66661
  :where(.theme-scope) :where([data-block="team-members"]) :where(.rb-team-members[data-image-col-size="1/2"]) {
@@ -73865,69 +71683,8 @@ const ACCOUNT_ENDPOINT_DEFINITIONS = defineEndpointDefinitions({
73865
71683
  }
73866
71684
  });
73867
71685
  //#endregion
73868
- //#region ../api/src/courseEndpointDefinitions.ts
73869
- const COURSE_ENDPOINT_DEFINITIONS = defineEndpointDefinitions({
73870
- listCourses: {
73871
- path: "/sites/{siteId}/bookings/courses",
73872
- method: "GET",
73873
- auth: "user",
73874
- responseKind: "json"
73875
- },
73876
- exportCoursesCsv: {
73877
- path: "/sites/{siteId}/bookings/courses/export.csv",
73878
- method: "GET",
73879
- tags: [
73880
- "site-{siteId}",
73881
- "bookings",
73882
- "courses-{siteId}"
73883
- ],
73884
- errors: [],
73885
- auth: "user",
73886
- responseKind: "blob"
73887
- },
73888
- createCourse: {
73889
- path: "/sites/{siteId}/bookings/courses",
73890
- method: "POST",
73891
- auth: "user",
73892
- responseKind: "json",
73893
- errors: [
73894
- "validation:invalid_input",
73895
- "resource:not_found",
73896
- "resource:already_exists",
73897
- "resource:conflict",
73898
- "server:internal_error"
73899
- ]
73900
- },
73901
- getCourse: {
73902
- path: "/sites/{siteId}/bookings/courses/{courseId}",
73903
- method: "GET",
73904
- auth: "user",
73905
- responseKind: "json"
73906
- },
73907
- updateCourse: {
73908
- path: "/sites/{siteId}/bookings/courses/{courseId}",
73909
- method: "PATCH",
73910
- auth: "user",
73911
- responseKind: "json",
73912
- errors: [
73913
- "validation:invalid_input",
73914
- "resource:not_found",
73915
- "resource:conflict",
73916
- "server:internal_error"
73917
- ]
73918
- },
73919
- deleteCourse: {
73920
- path: "/sites/{siteId}/bookings/courses/{courseId}",
73921
- method: "DELETE",
73922
- auth: "user",
73923
- responseKind: "json",
73924
- errors: [
73925
- "validation:invalid_input",
73926
- "resource:not_found",
73927
- "resource:conflict",
73928
- "server:internal_error"
73929
- ]
73930
- },
71686
+ //#region ../api/src/eventSeriesRegistrationEndpointDefinitions.ts
71687
+ const EVENT_SERIES_REGISTRATION_ENDPOINT_DEFINITIONS = defineEndpointDefinitions({
73931
71688
  deleteEventOffering: {
73932
71689
  path: "/sites/{siteId}/bookings/event-offerings/{eventOfferingId}",
73933
71690
  method: "DELETE",
@@ -73940,20 +71697,8 @@ const COURSE_ENDPOINT_DEFINITIONS = defineEndpointDefinitions({
73940
71697
  "server:internal_error"
73941
71698
  ]
73942
71699
  },
73943
- duplicateCourse: {
73944
- path: "/sites/{siteId}/bookings/courses/{courseId}/duplicate",
73945
- method: "POST",
73946
- auth: "user",
73947
- responseKind: "json",
73948
- errors: [
73949
- "validation:invalid_input",
73950
- "resource:not_found",
73951
- "resource:already_exists",
73952
- "server:internal_error"
73953
- ]
73954
- },
73955
- changeCourseContentOwnership: {
73956
- path: "/sites/{siteId}/bookings/courses/{courseId}/content-ownership",
71700
+ changeEventSeriesContentOwnership: {
71701
+ path: "/sites/{siteId}/bookings/event-series/{seriesId}/content-ownership",
73957
71702
  method: "POST",
73958
71703
  auth: "user",
73959
71704
  responseKind: "json",
@@ -73964,8 +71709,8 @@ const COURSE_ENDPOINT_DEFINITIONS = defineEndpointDefinitions({
73964
71709
  "server:internal_error"
73965
71710
  ]
73966
71711
  },
73967
- addCourseEnrollment: {
73968
- path: "/sites/{siteId}/bookings/courses/{courseId}/enrollments",
71712
+ addEventSeriesRegistration: {
71713
+ path: "/sites/{siteId}/bookings/event-series/{seriesId}/registrations",
73969
71714
  method: "POST",
73970
71715
  auth: "user",
73971
71716
  responseKind: "json",
@@ -73976,33 +71721,21 @@ const COURSE_ENDPOINT_DEFINITIONS = defineEndpointDefinitions({
73976
71721
  "server:internal_error"
73977
71722
  ]
73978
71723
  },
73979
- listCourseEnrollments: {
73980
- path: "/sites/{siteId}/bookings/courses/{courseId}/enrollments",
71724
+ listEventSeriesRegistrations: {
71725
+ path: "/sites/{siteId}/bookings/event-series/{seriesId}/registrations",
73981
71726
  method: "GET",
73982
71727
  auth: "user",
73983
71728
  responseKind: "json"
73984
71729
  },
73985
- exportCourseEnrollmentsCsv: {
73986
- path: "/sites/{siteId}/bookings/courses/{courseId}/enrollments/export.csv",
71730
+ exportEventSeriesRegistrationsCsv: {
71731
+ path: "/sites/{siteId}/bookings/event-series/{seriesId}/registrations/export.csv",
73987
71732
  method: "GET",
73988
71733
  auth: "user",
73989
71734
  errors: [],
73990
71735
  responseKind: "blob"
73991
71736
  },
73992
- exportCourseWaitlistCsv: {
73993
- path: "/sites/{siteId}/bookings/courses/{courseId}/waitlist/export.csv",
73994
- method: "GET",
73995
- tags: [
73996
- "site-{siteId}",
73997
- "bookings",
73998
- "courses-{courseId}"
73999
- ],
74000
- auth: "user",
74001
- responseKind: "blob",
74002
- errors: []
74003
- },
74004
- updateCourseEnrollment: {
74005
- path: "/sites/{siteId}/bookings/courses/{courseId}/enrollments/{enrollmentId}",
71737
+ updateEventSeriesRegistration: {
71738
+ path: "/sites/{siteId}/bookings/event-series/{seriesId}/registrations/{registrationId}",
74006
71739
  method: "PATCH",
74007
71740
  auth: "user",
74008
71741
  responseKind: "json",
@@ -74390,71 +72123,35 @@ const PUBLIC_WHOLE_SERIES_ENDPOINT_DEFINITIONS = defineEndpointDefinitions({
74390
72123
  errors: ["resource:not_found", "server:internal_error"],
74391
72124
  auth: "public",
74392
72125
  responseKind: "json"
74393
- },
74394
- registerForWholeSeries: {
74395
- path: "/public/sites/{siteId}/dated-offerings/whole-series/enroll",
74396
- method: "POST",
74397
- tags: [TAG_TEMPLATES.publicWholeSeriesOfferings, "course-enrollment"],
74398
- errors: [
74399
- "auth:unauthenticated",
74400
- "auth:forbidden",
74401
- "validation:invalid_input",
74402
- "resource:not_found",
74403
- "resource:conflict",
74404
- "resource:already_exists",
74405
- "server:internal_error"
74406
- ],
74407
- auth: "public",
74408
- responseKind: "json"
74409
- },
74410
- checkWholeSeriesEligibility: {
74411
- path: "/public/sites/{siteId}/dated-offerings/whole-series/check-eligibility",
74412
- method: "POST",
74413
- tags: [TAG_TEMPLATES.publicWholeSeriesOfferings, "course-enrollment"],
74414
- errors: [
74415
- "auth:unauthenticated",
74416
- "resource:not_found",
74417
- "resource:conflict",
74418
- "server:internal_error"
74419
- ],
74420
- auth: "public",
74421
- responseKind: "json"
74422
- },
74423
- createWholeSeriesCheckout: {
74424
- path: "/public/sites/{siteId}/dated-offerings/whole-series/checkout",
72126
+ }
72127
+ });
72128
+ //#endregion
72129
+ //#region ../api/src/publicEventEndpointDefinitions.ts
72130
+ const PUBLIC_EVENT_ENDPOINT_DEFINITIONS = defineEndpointDefinitions({
72131
+ getPublicEventRegistrationOptions: {
72132
+ path: "/public/sites/{siteId}/events/registration-options",
74425
72133
  method: "POST",
74426
- tags: [TAG_TEMPLATES.publicWholeSeriesOfferings, "course-checkout"],
72134
+ tags: [TAG_TEMPLATES.publicEvents, "event-registration-options"],
74427
72135
  auth: "public",
74428
72136
  responseKind: "json",
74429
72137
  errors: [
74430
- "auth:unauthenticated",
74431
72138
  "validation:invalid_input",
74432
72139
  "resource:not_found",
74433
72140
  "resource:conflict",
74434
72141
  "server:internal_error"
74435
72142
  ]
74436
72143
  },
74437
- getWholeSeriesRegistrationStatus: {
74438
- path: "/public/sites/{siteId}/dated-offerings/whole-series/registration-status",
72144
+ resolveEventSubroute: {
72145
+ path: "/public/sites/{siteId}/events/subroutes/resolve",
74439
72146
  method: "GET",
74440
- tags: [TAG_TEMPLATES.publicWholeSeriesOfferings, "course-checkout"],
74441
- errors: ["resource:not_found", "server:internal_error"],
72147
+ revalidate: 60,
72148
+ tags: [TAG_TEMPLATES.publicEvents, "event-subroute"],
74442
72149
  auth: "public",
74443
- responseKind: "json"
72150
+ responseKind: "json",
72151
+ errors: []
74444
72152
  }
74445
72153
  });
74446
72154
  //#endregion
74447
- //#region ../api/src/publicEventEndpointDefinitions.ts
74448
- const PUBLIC_EVENT_ENDPOINT_DEFINITIONS = defineEndpointDefinitions({ resolveEventSubroute: {
74449
- path: "/public/sites/{siteId}/events/subroutes/resolve",
74450
- method: "GET",
74451
- revalidate: 60,
74452
- tags: [TAG_TEMPLATES.publicEvents, "event-subroute"],
74453
- auth: "public",
74454
- responseKind: "json",
74455
- errors: []
74456
- } });
74457
- //#endregion
74458
72155
  //#region ../api/src/siteApiKeyEndpointDefinitions.ts
74459
72156
  const SITE_API_KEY_ENDPOINT_DEFINITIONS = defineEndpointDefinitions({
74460
72157
  listSiteApiKeys: {
@@ -74822,7 +72519,7 @@ const SDK_ENDPOINT_DEFINITIONS = defineEndpointDefinitions({
74822
72519
  }), TAG_TEMPLATES.siteCollection, TAG_TEMPLATES.siteTheme, TAG_TEMPLATES.siteCollection, { ...SITE_API_KEY_ENDPOINT_DEFINITIONS }, TAG_TEMPLATES.site, TAG_TEMPLATES.siteBookingSettings, TAG_TEMPLATES.site, TAG_TEMPLATES.siteBookingSettings, TAG_TEMPLATES.site, TAG_TEMPLATES.siteEmailSettings, TAG_TEMPLATES.site, TAG_TEMPLATES.siteEmailSettings, TAG_TEMPLATES.site, TAG_TEMPLATES.siteEmailSettings, TAG_TEMPLATES.site, TAG_TEMPLATES.siteEmailSettings, {
74823
72520
  ...NEWSLETTER_ENDPOINT_DEFINITIONS,
74824
72521
  ...APPOINTMENT_ENDPOINT_DEFINITIONS,
74825
- ...COURSE_ENDPOINT_DEFINITIONS
72522
+ ...EVENT_SERIES_REGISTRATION_ENDPOINT_DEFINITIONS
74826
72523
  }, TAG_TEMPLATES.siteCollection, TAG_TEMPLATES.siteById, TAG_TEMPLATES.siteBySlug, TAG_TEMPLATES.siteByDomain, TAG_TEMPLATES.siteCollection, TAG_TEMPLATES.siteById, TAG_TEMPLATES.siteBySlug, TAG_TEMPLATES.siteByDomain, TAG_TEMPLATES.siteCollection, TAG_TEMPLATES.pageSurfaceById, TAG_TEMPLATES.siteCollection, TAG_TEMPLATES.pageSurfaceById, TAG_TEMPLATES.siteCollection, TAG_TEMPLATES.siteRoutableContent, TAG_TEMPLATES.pageSurfaceById, TAG_TEMPLATES.siteCollection, TAG_TEMPLATES.siteRoutableContent, TAG_TEMPLATES.pageSurfaceById, TAG_TEMPLATES.workflowRunById, TAG_TEMPLATES.siteCollection, TAG_TEMPLATES.siteRoutableContent, TAG_TEMPLATES.routeById, TAG_TEMPLATES.site, TAG_TEMPLATES.siteSettings, TAG_TEMPLATES.siteCollection, TAG_TEMPLATES.site, TAG_TEMPLATES.siteSettings, TAG_TEMPLATES.siteCollection, TAG_TEMPLATES.site, TAG_TEMPLATES.siteSettings, TAG_TEMPLATES.siteCollection, TAG_TEMPLATES.site, TAG_TEMPLATES.site, TAG_TEMPLATES.siteSettings, TAG_TEMPLATES.site, TAG_TEMPLATES.siteSettings, TAG_TEMPLATES.site, TAG_TEMPLATES.siteSettings, TAG_TEMPLATES.site, TAG_TEMPLATES.siteSettings, TAG_TEMPLATES.site, TAG_TEMPLATES.siteSettings, TAG_TEMPLATES.site, TAG_TEMPLATES.siteSettings, TAG_TEMPLATES.site, TAG_TEMPLATES.siteSettings, TAG_TEMPLATES.site, TAG_TEMPLATES.siteSettings, TAG_TEMPLATES.site, TAG_TEMPLATES.siteSettings, TAG_TEMPLATES.site, TAG_TEMPLATES.siteSettings, TAG_TEMPLATES.site, TAG_TEMPLATES.siteSettings, TAG_TEMPLATES.site, TAG_TEMPLATES.siteSettings, TAG_TEMPLATES.site, TAG_TEMPLATES.siteSettings, TAG_TEMPLATES.site, TAG_TEMPLATES.siteSettings, TAG_TEMPLATES.site, TAG_TEMPLATES.siteSettings, TAG_TEMPLATES.site, TAG_TEMPLATES.siteSettings, TAG_TEMPLATES.site, TAG_TEMPLATES.siteSettings, TAG_TEMPLATES.site, TAG_TEMPLATES.siteSettings, TAG_TEMPLATES.site, TAG_TEMPLATES.siteSettings, TAG_TEMPLATES.site, TAG_TEMPLATES.siteSettings, TAG_TEMPLATES.site, TAG_TEMPLATES.siteSettings, TAG_TEMPLATES.site, TAG_TEMPLATES.siteSettings, TAG_TEMPLATES.site, TAG_TEMPLATES.siteSettings, TAG_TEMPLATES.site, TAG_TEMPLATES.siteSettings, TAG_TEMPLATES.site, TAG_TEMPLATES.siteSettings, TAG_TEMPLATES.site, TAG_TEMPLATES.siteSettings, TAG_TEMPLATES.siteCollection, TAG_TEMPLATES.siteNavigation, TAG_TEMPLATES.siteCollection, TAG_TEMPLATES.siteNavigation, TAG_TEMPLATES.siteCollection, TAG_TEMPLATES.siteNavigation, TAG_TEMPLATES.navigationMenuById, TAG_TEMPLATES.siteCollection, TAG_TEMPLATES.siteNavigation, TAG_TEMPLATES.navigationMenuById, TAG_TEMPLATES.siteCollection, TAG_TEMPLATES.siteNavigation, TAG_TEMPLATES.navigationMenuById, TAG_TEMPLATES.siteCollection, TAG_TEMPLATES.siteNavigation, TAG_TEMPLATES.navigationMenuById, TAG_TEMPLATES.siteCollection, TAG_TEMPLATES.siteNavigation, TAG_TEMPLATES.navigationMenuById, TAG_TEMPLATES.navigationItemById, TAG_TEMPLATES.siteCollection, TAG_TEMPLATES.siteNavigation, TAG_TEMPLATES.navigationMenuById, TAG_TEMPLATES.navigationItemById, TAG_TEMPLATES.siteCollection, TAG_TEMPLATES.siteNavigation, TAG_TEMPLATES.navigationMenuById, TAG_TEMPLATES.siteRoutableContent, TAG_TEMPLATES.siteRoutableContent, TAG_TEMPLATES.siteRoutableContent, TAG_TEMPLATES.siteSettings, TAG_TEMPLATES.siteCollection, TAG_TEMPLATES.siteTheme, TAG_TEMPLATES.siteCollection, TAG_TEMPLATES.siteTheme, TAG_TEMPLATES.siteCollection, TAG_TEMPLATES.siteTheme, TAG_TEMPLATES.siteCollection, TAG_TEMPLATES.pageSurfaceById, TAG_TEMPLATES.siteCollection, TAG_TEMPLATES.pageSurfaceById, TAG_TEMPLATES.siteCollection, TAG_TEMPLATES.pageSurfaceById, TAG_TEMPLATES.siteCollection, TAG_TEMPLATES.pageSurfaceById, TAG_TEMPLATES.siteRoutableContent, TAG_TEMPLATES.pageById, TAG_TEMPLATES.siteRoutableContent, TAG_TEMPLATES.pageById, TAG_TEMPLATES.siteRoutableContent, TAG_TEMPLATES.pageById, TAG_TEMPLATES.siteRoutableContent, TAG_TEMPLATES.pageById, TAG_TEMPLATES.siteRoutableContent, TAG_TEMPLATES.pageById, TAG_TEMPLATES.siteRoutableContent, TAG_TEMPLATES.pageById, TAG_TEMPLATES.siteRoutableContent, TAG_TEMPLATES.pageById, TAG_TEMPLATES.siteRoutableContent, TAG_TEMPLATES.pageById, TAG_TEMPLATES.siteRoutableContent, TAG_TEMPLATES.pageById, TAG_TEMPLATES.siteRoutableContent, TAG_TEMPLATES.siteRoutableContent, TAG_TEMPLATES.siteRedirects, TAG_TEMPLATES.siteRouteOutcomes, TAG_TEMPLATES.siteRoutableContent, TAG_TEMPLATES.siteRedirects, TAG_TEMPLATES.siteRouteOutcomes, TAG_TEMPLATES.siteRoutableContent, TAG_TEMPLATES.siteForms, TAG_TEMPLATES.siteForms, TAG_TEMPLATES.siteForms, TAG_TEMPLATES.siteForms, TAG_TEMPLATES.siteForms, TAG_TEMPLATES.siteForms, TAG_TEMPLATES.formSubmissionsBySlug, TAG_TEMPLATES.siteForms, TAG_TEMPLATES.formSubmissionsBySlug, TAG_TEMPLATES.siteForms, TAG_TEMPLATES.formSubmissionsBySlug, TAG_TEMPLATES.formById, TAG_TEMPLATES.siteForms, TAG_TEMPLATES.publicEvents, TAG_TEMPLATES.publicEventFilters, { ...PUBLIC_WHOLE_SERIES_ENDPOINT_DEFINITIONS }, TAG_TEMPLATES.publicTeamMembers, TAG_TEMPLATES.publicWholeSeriesOfferings, TAG_TEMPLATES.publicEvents, TAG_TEMPLATES.publicPasses, TAG_TEMPLATES.publicMemberships, TAG_TEMPLATES.publicProducts, TAG_TEMPLATES.publicShop, TAG_TEMPLATES.publicCheckout, TAG_TEMPLATES.siteRoutableContent, TAG_TEMPLATES.publicEvents, TAG_TEMPLATES.publicEvents, TAG_TEMPLATES.publicEvents, TAG_TEMPLATES.publicEvents, TAG_TEMPLATES.publicEvents, { ...EVENT_MANAGEMENT_ENDPOINT_DEFINITIONS }, { ...SDK_ENDPOINT_DEFINITIONS }, { ...SDK_ENTRY_READ_ENDPOINTS };
74827
72524
  z$1.object({ refreshToken: z$1.string().min(1).max(4096) }).strict();
74828
72525
  z$1.object({
@@ -74944,7 +72641,7 @@ const internalLinkPayloadSchema = z$1.object({
74944
72641
  kind: z$1.literal("internal"),
74945
72642
  routeId: z$1.string().uuid(),
74946
72643
  entityId: z$1.string().uuid(),
74947
- entityType: z$1.enum(["page", "content"]),
72644
+ entityType: z$1.enum(RESOLVED_INTERNAL_LINK_ENTITY_TYPES),
74948
72645
  href: z$1.string().min(1),
74949
72646
  title: z$1.string().min(1),
74950
72647
  typeLabel: z$1.string().min(1),
@@ -75968,6 +73665,68 @@ function stableSerialize(value) {
75968
73665
  return JSON.stringify(value);
75969
73666
  }
75970
73667
  //#endregion
73668
+ //#region ../api/src/bookingPaymentTermSchemas.ts
73669
+ const bookingDepositRefundPolicySchema = z$1.enum(["refundable", "non_refundable"]);
73670
+ const bookingInstalmentPlanSchema = z$1.discriminatedUnion("kind", [
73671
+ z$1.object({
73672
+ kind: z$1.literal("deposit_plus_one_remainder"),
73673
+ depositAmountCents: z$1.number().int().nonnegative(),
73674
+ depositRefundability: bookingDepositRefundPolicySchema,
73675
+ remainderDueCount: z$1.number().int().positive(),
73676
+ intervalUnit: z$1.enum([
73677
+ "day",
73678
+ "week",
73679
+ "month"
73680
+ ])
73681
+ }),
73682
+ z$1.object({
73683
+ kind: z$1.literal("deposit_plus_scheduled_instalments"),
73684
+ depositAmountCents: z$1.number().int().nonnegative(),
73685
+ depositRefundability: bookingDepositRefundPolicySchema,
73686
+ instalmentCount: z$1.number().int().positive(),
73687
+ intervalCount: z$1.number().int().positive(),
73688
+ intervalUnit: z$1.enum([
73689
+ "day",
73690
+ "week",
73691
+ "month"
73692
+ ])
73693
+ }),
73694
+ z$1.object({
73695
+ kind: z$1.literal("equal_scheduled_instalments"),
73696
+ instalmentCount: z$1.number().int().positive(),
73697
+ intervalCount: z$1.number().int().positive(),
73698
+ intervalUnit: z$1.enum([
73699
+ "day",
73700
+ "week",
73701
+ "month"
73702
+ ])
73703
+ })
73704
+ ]);
73705
+ const bookingFlexibleBalanceDueDateRuleSchema = z$1.discriminatedUnion("kind", [z$1.object({
73706
+ kind: z$1.literal("relative_to_start_date"),
73707
+ daysBeforeStart: z$1.number().int().positive()
73708
+ }), z$1.object({
73709
+ kind: z$1.literal("fixed_calendar_date"),
73710
+ dueAt: z$1.string().datetime()
73711
+ })]);
73712
+ const bookingFlexibleBalanceConfigSchema = z$1.object({
73713
+ upfrontAmountCents: z$1.number().int().nonnegative(),
73714
+ dueDateRule: bookingFlexibleBalanceDueDateRuleSchema,
73715
+ depositRefundability: bookingDepositRefundPolicySchema
73716
+ });
73717
+ z$1.discriminatedUnion("kind", [
73718
+ z$1.object({ kind: z$1.literal("upfront") }),
73719
+ z$1.object({ kind: z$1.literal("deferred_manual") }),
73720
+ z$1.object({
73721
+ kind: z$1.literal("instalment_plan"),
73722
+ plan: bookingInstalmentPlanSchema
73723
+ }),
73724
+ z$1.object({
73725
+ kind: z$1.literal("flexible_balance"),
73726
+ config: bookingFlexibleBalanceConfigSchema
73727
+ })
73728
+ ]);
73729
+ //#endregion
75971
73730
  //#region ../api/src/navigationMenuValidation.ts
75972
73731
  function hasChildren(item) {
75973
73732
  return Array.isArray(item.children) && item.children.length > 0;
@@ -77064,40 +74823,6 @@ const BUILTIN_CONTENT_TYPE_SCHEMAS = {
77064
74823
  plural: "Events"
77065
74824
  }
77066
74825
  },
77067
- course: {
77068
- version: 1,
77069
- fields: [
77070
- {
77071
- id: "summary",
77072
- type: "textarea",
77073
- label: "Summary",
77074
- description: "Short teaser shown in listings.",
77075
- rows: 3
77076
- },
77077
- {
77078
- id: "image",
77079
- type: "media",
77080
- label: "Listing image",
77081
- description: "Optional image used for course cards and previews."
77082
- },
77083
- {
77084
- id: "body",
77085
- type: "richText",
77086
- label: "Details",
77087
- description: "Full course details and curriculum."
77088
- }
77089
- ],
77090
- routing: {
77091
- enabled: true,
77092
- pattern: "/courses/{slug}",
77093
- slugField: "slug",
77094
- prefix: "/courses/"
77095
- },
77096
- labels: {
77097
- singular: "Course",
77098
- plural: "Courses"
77099
- }
77100
- },
77101
74826
  "team-member": {
77102
74827
  version: 1,
77103
74828
  fields: [
@@ -77297,7 +75022,7 @@ const BUILTIN_CONTENT_TYPE_SCHEMAS = {
77297
75022
  function deriveFieldIdSet(schema) {
77298
75023
  return new Set(schema.fields.map((f) => f.id));
77299
75024
  }
77300
- deriveFieldIdSet(BUILTIN_CONTENT_TYPE_SCHEMAS.post), deriveFieldIdSet(BUILTIN_CONTENT_TYPE_SCHEMAS.event), deriveFieldIdSet(BUILTIN_CONTENT_TYPE_SCHEMAS.course), deriveFieldIdSet(BUILTIN_CONTENT_TYPE_SCHEMAS["team-member"]), deriveFieldIdSet(BUILTIN_CONTENT_TYPE_SCHEMAS.product), deriveFieldIdSet(BUILTIN_CONTENT_TYPE_SCHEMAS.testimonial), deriveFieldIdSet(BUILTIN_CONTENT_TYPE_SCHEMAS.page), deriveFieldIdSet(BUILTIN_CONTENT_TYPE_SCHEMAS["product-category"]);
75025
+ deriveFieldIdSet(BUILTIN_CONTENT_TYPE_SCHEMAS.post), deriveFieldIdSet(BUILTIN_CONTENT_TYPE_SCHEMAS.event), deriveFieldIdSet(BUILTIN_CONTENT_TYPE_SCHEMAS["team-member"]), deriveFieldIdSet(BUILTIN_CONTENT_TYPE_SCHEMAS.product), deriveFieldIdSet(BUILTIN_CONTENT_TYPE_SCHEMAS.testimonial), deriveFieldIdSet(BUILTIN_CONTENT_TYPE_SCHEMAS.page), deriveFieldIdSet(BUILTIN_CONTENT_TYPE_SCHEMAS["product-category"]);
77301
75026
  //#endregion
77302
75027
  //#region ../field-primitives/src/bindings/index.ts
77303
75028
  const BINDING_TRANSFORMS$1 = {
@@ -77349,7 +75074,6 @@ const SYSTEM_ENTRY_SLOT_BLOCK_KIND = "system.entry-slot";
77349
75074
  //#region ../content-model/src/templates/defaults.ts
77350
75075
  const POST_EXCERPT_FALLBACK = fallbackBinding$1(fieldBinding$1("excerpt"), transformBinding$1(TEMPLATE_BINDING_TRANSFORMS.RICHTEXT_FIRST_PARAGRAPH, { input: fieldBinding$1("body") }));
77351
75076
  const EVENT_SUBHEADLINE_FALLBACK = fallbackBinding$1(fieldBinding$1("summary"), transformBinding$1(TEMPLATE_BINDING_TRANSFORMS.RICHTEXT_FIRST_PARAGRAPH, { input: fieldBinding$1("body") }));
77352
- const COURSE_SUMMARY_FALLBACK = fallbackBinding$1(fieldBinding$1("summary"), transformBinding$1(TEMPLATE_BINDING_TRANSFORMS.RICHTEXT_FIRST_PARAGRAPH, { input: fieldBinding$1("body") }));
77353
75077
  const ENTRY_TITLE_INLINE_TEXT = transformBinding$1(TEMPLATE_BINDING_TRANSFORMS.TEXT_INLINE_TEXT, { input: metaBinding$1("title") });
77354
75078
  const POST_BODY_TEXT_BINDINGS = {
77355
75079
  body: fieldBinding$1("body"),
@@ -77464,7 +75188,6 @@ const DEFAULT_TEMPLATE_DEFINITIONS = {
77464
75188
  showVenue: true,
77465
75189
  showCapacity: true,
77466
75190
  successMessage: "Thank you for registering! Check your email for confirmation details.",
77467
- waitlistMessage: "You've been added to the waitlist. We'll email you a claim link if a spot opens up.",
77468
75191
  buttonText: "Complete Registration",
77469
75192
  buttonVariant: "primary"
77470
75193
  },
@@ -77475,64 +75198,6 @@ const DEFAULT_TEMPLATE_DEFINITIONS = {
77475
75198
  }
77476
75199
  ]
77477
75200
  },
77478
- course: {
77479
- templateKey: "default",
77480
- name: "Course detail",
77481
- description: "Standard landing page for multi-session courses.",
77482
- metadata: {},
77483
- blocks: [
77484
- {
77485
- blockKind: "block.hero",
77486
- scope: "entry",
77487
- bindings: {
77488
- eyebrow: literalBinding$1("Course"),
77489
- headline: metaBinding$1("title"),
77490
- headlineInline: ENTRY_TITLE_INLINE_TEXT,
77491
- subheadline: COURSE_SUMMARY_FALLBACK
77492
- }
77493
- },
77494
- {
77495
- blockKind: "block.course-details",
77496
- scope: "entry",
77497
- content: {
77498
- heading: "Course details",
77499
- showTitle: false,
77500
- showDescription: false,
77501
- showSessions: true,
77502
- sessionsLimit: "10",
77503
- showVenue: true,
77504
- showPrice: true,
77505
- showCapacity: true,
77506
- showEnrollmentStatus: true,
77507
- showMembershipNote: true
77508
- }
77509
- },
77510
- {
77511
- blockKind: SYSTEM_ENTRY_SLOT_BLOCK_KIND,
77512
- scope: "template",
77513
- content: {
77514
- slotKey: "main",
77515
- label: "Page content"
77516
- }
77517
- },
77518
- {
77519
- blockKind: "block.course-registration",
77520
- scope: "entry",
77521
- content: {
77522
- heading: "Enroll in this course",
77523
- showSessions: true,
77524
- showPrice: true,
77525
- showCapacity: true,
77526
- showVenue: true,
77527
- successMessage: "You're enrolled! Check your email for confirmation and session details.",
77528
- waitlistMessage: "You've been added to the waitlist. We'll email you a claim link if a spot opens up.",
77529
- membershipMessage: "Enrolled using your membership! Check your email for session details.",
77530
- buttonText: "Complete Enrollment",
77531
- buttonVariant: "primary"
77532
- }
77533
- }
77534
- ]
77535
- },
77536
75201
  "team-member": {
77537
75202
  templateKey: "default",
77538
75203
  name: "Team member profile",