@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({
@@ -39059,6 +38727,7 @@ function normalizeGroupPresentation(value) {
39059
38727
  function resolveAutoCtaPath(source, routes) {
39060
38728
  const routeByNormalizedPath = /* @__PURE__ */ new Map();
39061
38729
  for (const route of routes ?? []) {
38730
+ if (route.kind === "pageSurface") continue;
39062
38731
  const normalized = normalizeRoutePath(route.path);
39063
38732
  if (normalized && !routeByNormalizedPath.has(normalized)) routeByNormalizedPath.set(normalized, route.path);
39064
38733
  }
@@ -39109,7 +38778,7 @@ const publicRouteCandidatesSchema = z$1.object({ routes: z$1.array(z$1.object({
39109
38778
  entityId: z$1.string(),
39110
38779
  path: z$1.string(),
39111
38780
  title: z$1.string(),
39112
- kind: z$1.enum(["page", "content"]),
38781
+ kind: z$1.enum(RESOLVED_INTERNAL_LINK_ENTITY_TYPES),
39113
38782
  contentTypeKey: z$1.string().nullable().optional()
39114
38783
  })) });
39115
38784
  const groupOverrideFields = [
@@ -39386,7 +39055,7 @@ const offeringsPreviewManifest = createBlockManifest({
39386
39055
  fallback: "published"
39387
39056
  } },
39388
39057
  routeCandidates: { $bind: { from: "data.routeCandidates" } },
39389
- courses: { $bind: { from: "data.courses" } },
39058
+ wholeSeriesOfferings: { $bind: { from: "data.wholeSeriesOfferings" } },
39390
39059
  ...offeringsPreviewEventDataBindings
39391
39060
  })
39392
39061
  ], { gap: "lg" }),
@@ -39403,7 +39072,7 @@ const offeringsPreviewBlockDefinition = {
39403
39072
  dataSchemas: {
39404
39073
  ...offeringsPreviewEventDataSchemas,
39405
39074
  routeCandidates: publicRouteCandidatesSchema.optional(),
39406
- courses: publicWholeSeriesOfferingsArraySchema.optional()
39075
+ wholeSeriesOfferings: publicWholeSeriesOfferingsArraySchema.optional()
39407
39076
  },
39408
39077
  dataLoaders: {
39409
39078
  ...offeringsPreviewEventDataLoaders,
@@ -39412,7 +39081,7 @@ const offeringsPreviewBlockDefinition = {
39412
39081
  params: {},
39413
39082
  mode: "server"
39414
39083
  },
39415
- courses: {
39084
+ wholeSeriesOfferings: {
39416
39085
  endpoint: "listPublicWholeSeriesOfferings",
39417
39086
  params: {
39418
39087
  siteId: { $bind: { from: "$root.siteId" } },
@@ -44514,22 +44183,6 @@ const systemBlockDefinitions = [
44514
44183
  weight: "standard"
44515
44184
  })]
44516
44185
  })),
44517
- withDesignCapability("block.course-registration", courseRegistrationBlockDefinition, sectionOnly(), defineBlockDesignMetadata({
44518
- flow: conversionFlow,
44519
- layoutProfiles: [layoutProfile({
44520
- variantKey: "default",
44521
- family: "form",
44522
- weight: "standard"
44523
- })]
44524
- })),
44525
- withDesignCapability("block.course-details", courseDetailsBlockDefinition, scheduleDetailsCapable(), defineBlockDesignMetadata({
44526
- flow: offeringsFlow,
44527
- layoutProfiles: [layoutProfile({
44528
- variantKey: "default",
44529
- family: "stack",
44530
- weight: "standard"
44531
- })]
44532
- })),
44533
44186
  withDesignCapability("block.event-spotlight", eventSpotlightBlockDefinition, eventSpotlightCapable(), defineBlockDesignMetadata({
44534
44187
  flow: offeringsFlow,
44535
44188
  layoutProfiles: [layoutProfile({
@@ -45594,7 +45247,7 @@ function normalizeRel(target, rel) {
45594
45247
  tokens.add("noreferrer");
45595
45248
  return Array.from(tokens).join(" ");
45596
45249
  }
45597
- function renderMarks(text, marks, key) {
45250
+ function renderMarks(text, marks, key, linkTarget) {
45598
45251
  if (!marks || marks.length === 0) return text;
45599
45252
  return marks.reduce((acc, mark) => {
45600
45253
  switch (mark.type) {
@@ -45607,7 +45260,8 @@ function renderMarks(text, marks, key) {
45607
45260
  const attrs = mark.attrs ?? {};
45608
45261
  const href = sanitizeHref(attrs.href);
45609
45262
  if (!href) return acc;
45610
- const target = typeof attrs.target === "string" && attrs.target.trim().length > 0 ? attrs.target.trim() : void 0;
45263
+ const storedTarget = typeof attrs.target === "string" && attrs.target.trim().length > 0 ? attrs.target.trim() : void 0;
45264
+ const target = linkTarget === "new-tab" ? "_blank" : storedTarget;
45611
45265
  return /* @__PURE__ */ jsx("a", {
45612
45266
  href,
45613
45267
  target,
@@ -45619,14 +45273,14 @@ function renderMarks(text, marks, key) {
45619
45273
  }
45620
45274
  }, text);
45621
45275
  }
45622
- function renderDoc(node, key, imageResolveContext) {
45276
+ function renderDoc(node, key, imageResolveContext, linkTarget) {
45623
45277
  if (!node || !node.type) return null;
45624
- const children = node.content?.map((child, index) => renderDoc(child, `${key}-${index}`, imageResolveContext));
45278
+ const children = node.content?.map((child, index) => renderDoc(child, `${key}-${index}`, imageResolveContext, linkTarget));
45625
45279
  switch (node.type) {
45626
45280
  case "doc": return /* @__PURE__ */ jsx(Fragment, { children });
45627
45281
  case "paragraph":
45628
45282
  if (!children && !node.text) return /* @__PURE__ */ jsx("p", {}, key);
45629
- return /* @__PURE__ */ jsx("p", { children: children ?? renderMarks(node.text ?? "", node.marks, key) }, key);
45283
+ return /* @__PURE__ */ jsx("p", { children: children ?? renderMarks(node.text ?? "", node.marks, key, linkTarget) }, key);
45630
45284
  case "heading": {
45631
45285
  const headingTag = `h${Math.min(Math.max(node.attrs?.level ?? 2, 1), 6)}`;
45632
45286
  return React.createElement(headingTag, { key }, children);
@@ -45668,14 +45322,14 @@ function renderDoc(node, key, imageResolveContext) {
45668
45322
  decoding: "async"
45669
45323
  }, key);
45670
45324
  }
45671
- case "text": return renderMarks(node.text ?? "", node.marks, key);
45325
+ case "text": return renderMarks(node.text ?? "", node.marks, key, linkTarget);
45672
45326
  default: return null;
45673
45327
  }
45674
45328
  }
45675
45329
  const DEFAULT_RICH_TEXT_CLASS = "rb-prose rb-max-w-none";
45676
- function RichText$2({ as: Comp = "div", className, doc, path }) {
45330
+ function RichText$2({ as: Comp = "div", className, doc, path, linkTarget = "stored" }) {
45677
45331
  const imageResolveContext = getCurrentResolveImageUrlContext() ?? null;
45678
- const content = doc ? renderDoc(doc, "doc", imageResolveContext) : null;
45332
+ const content = doc ? renderDoc(doc, "doc", imageResolveContext, linkTarget) : null;
45679
45333
  const dataAttributes = path ? { "data-builder-richtext": path } : void 0;
45680
45334
  return /* @__PURE__ */ jsx(Comp, {
45681
45335
  className: className?.trim() || DEFAULT_RICH_TEXT_CLASS,
@@ -47031,7 +46685,6 @@ function readBookingFieldType(value) {
47031
46685
  case "select":
47032
46686
  case "radio":
47033
46687
  case "checkbox":
47034
- case "booking_requirement_consent":
47035
46688
  case "tel":
47036
46689
  case "url":
47037
46690
  case "number":
@@ -47066,7 +46719,7 @@ function normalizeBookingSettings(value) {
47066
46719
  };
47067
46720
  }
47068
46721
  function isBookingFormService(value) {
47069
- return isRecord$13(value) && typeof value.id === "string" && typeof value.siteId === "string" && typeof value.title === "string";
46722
+ 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);
47070
46723
  }
47071
46724
  function readNonEmptyString(value) {
47072
46725
  if (typeof value !== "string") return null;
@@ -47091,6 +46744,15 @@ const bookingFieldOptionSchema = z$1.object({
47091
46744
  value: z$1.string(),
47092
46745
  label: z$1.string()
47093
46746
  });
46747
+ const standardBookingFieldRules = {
46748
+ options: z$1.array(bookingFieldOptionSchema).optional(),
46749
+ multiple: z$1.boolean().optional(),
46750
+ minLength: z$1.number().optional(),
46751
+ maxLength: z$1.number().optional(),
46752
+ pattern: z$1.string().optional(),
46753
+ min: z$1.number().optional(),
46754
+ max: z$1.number().optional()
46755
+ };
47094
46756
  const bookingFieldSchema = z$1.object({
47095
46757
  id: z$1.string(),
47096
46758
  label: z$1.string(),
@@ -47101,7 +46763,6 @@ const bookingFieldSchema = z$1.object({
47101
46763
  "select",
47102
46764
  "radio",
47103
46765
  "checkbox",
47104
- "booking_requirement_consent",
47105
46766
  "tel",
47106
46767
  "url",
47107
46768
  "number",
@@ -47111,13 +46772,7 @@ const bookingFieldSchema = z$1.object({
47111
46772
  required: z$1.boolean().optional(),
47112
46773
  placeholder: z$1.string().optional(),
47113
46774
  helpText: z$1.string().optional(),
47114
- options: z$1.array(bookingFieldOptionSchema).optional(),
47115
- multiple: z$1.boolean().optional(),
47116
- minLength: z$1.number().optional(),
47117
- maxLength: z$1.number().optional(),
47118
- pattern: z$1.string().optional(),
47119
- min: z$1.number().optional(),
47120
- max: z$1.number().optional()
46775
+ ...standardBookingFieldRules
47121
46776
  });
47122
46777
  const bookingSettingsSchema = z$1.object({
47123
46778
  type: z$1.literal("booking"),
@@ -47160,7 +46815,8 @@ const bookingServiceSchema = z$1.object({
47160
46815
  priceAmount: z$1.number().nullable().optional(),
47161
46816
  priceCurrency: z$1.string().nullable().optional(),
47162
46817
  paymentTerms: blockBookingPaymentTermsSchema.optional(),
47163
- paymentTermsAvailability: blockBookingPaymentTermsAvailabilitySchema.optional()
46818
+ paymentTermsAvailability: blockBookingPaymentTermsAvailabilitySchema.optional(),
46819
+ consent: blockBookingConsentSchema.optional()
47164
46820
  });
47165
46821
  const bookingServicesSourceSchema = z$1.union([
47166
46822
  z$1.array(bookingServiceSchema),
@@ -47426,7 +47082,7 @@ function emptySelection(timeZone) {
47426
47082
  timeZone
47427
47083
  };
47428
47084
  }
47429
- function parseLimit$1(value, fallback) {
47085
+ function parseLimit(value, fallback) {
47430
47086
  if (value === "all") return Number.MAX_SAFE_INTEGER;
47431
47087
  const n = typeof value === "string" ? parseInt(value, 10) : typeof value === "number" ? value : NaN;
47432
47088
  return Number.isFinite(n) && n > 0 ? n : fallback;
@@ -47509,7 +47165,7 @@ function selectEventDetails(args) {
47509
47165
  subject: args.subject
47510
47166
  }));
47511
47167
  const occurrenceContext = args.occurrenceContext ?? null;
47512
- const otherLimit = parseLimit$1(args.otherDatesLimit, 5);
47168
+ const otherLimit = parseLimit(args.otherDatesLimit, 5);
47513
47169
  const candidate = selectEventCandidate(all, occurrenceContext, args.nowIso);
47514
47170
  const timeZone = toBookingTimeZone(candidate?.event.timeZone ?? all[0]?.timeZone ?? null);
47515
47171
  if (!candidate) return emptySelection(timeZone);
@@ -47585,8 +47241,8 @@ function resolveEventDetailsPresentation(input) {
47585
47241
  };
47586
47242
  }
47587
47243
  //#endregion
47588
- //#region ../blocks/src/system/runtime/nodes/event-details/CoursePricingDisplay.tsx
47589
- function CoursePricingDisplay({ pricing, acceptedItems }) {
47244
+ //#region ../blocks/src/system/runtime/nodes/event-details/WholeSeriesPricingDisplay.tsx
47245
+ function WholeSeriesPricingDisplay({ pricing, acceptedItems }) {
47590
47246
  return /* @__PURE__ */ jsxs("div", {
47591
47247
  className: "rb-mt-6",
47592
47248
  children: [
@@ -47598,7 +47254,8 @@ function CoursePricingDisplay({ pricing, acceptedItems }) {
47598
47254
  className: "rb-flex rb-flex-col rb-gap-2",
47599
47255
  children: pricing.selectableOptions.map((option) => /* @__PURE__ */ jsxs("div", { children: [/* @__PURE__ */ jsxs("strong", { children: [
47600
47256
  option.name,
47601
- ": ",
47257
+ ":",
47258
+ " ",
47602
47259
  formatWholeSeriesPriceAmount(option.priceAmount, pricing.currency)
47603
47260
  ] }), option.description ? /* @__PURE__ */ jsx("p", {
47604
47261
  className: "rb-caption status-muted",
@@ -47619,7 +47276,7 @@ function formatAutoApplyDiscountLine(preview, currency) {
47619
47276
  const label = preview.publicLabel.trim() || "Discount";
47620
47277
  return preview.minTicketsRequired && preview.minTicketsRequired > 1 ? `${label} — ${rate} when buying ${preview.minTicketsRequired}+ tickets` : `${label} — ${rate} applied automatically`;
47621
47278
  }
47622
- function TeamMemberName$1({ name, profilePath }) {
47279
+ function TeamMemberName({ name, profilePath }) {
47623
47280
  return profilePath ? /* @__PURE__ */ jsx("a", {
47624
47281
  href: profilePath,
47625
47282
  className: "rb-hover-opacity-80",
@@ -47656,7 +47313,7 @@ function EventPricingDetails({ isDropIn, coursePricing, acceptedItems, eventCost
47656
47313
  children: "No registration required - just show up"
47657
47314
  })]
47658
47315
  });
47659
- if (coursePricing) return /* @__PURE__ */ jsx(CoursePricingDisplay, {
47316
+ if (coursePricing) return /* @__PURE__ */ jsx(WholeSeriesPricingDisplay, {
47660
47317
  pricing: coursePricing,
47661
47318
  acceptedItems: [...acceptedItems]
47662
47319
  });
@@ -47731,7 +47388,7 @@ function EventFacts({ selection, selected, venue, teamMembers, pricing, showCapa
47731
47388
  children: "With"
47732
47389
  }), /* @__PURE__ */ jsx("div", {
47733
47390
  className: "rb-flex rb-flex-col rb-gap-3",
47734
- children: teamMembers.map((member) => /* @__PURE__ */ jsxs("div", { children: [/* @__PURE__ */ jsx("p", { children: /* @__PURE__ */ jsx(TeamMemberName$1, {
47391
+ children: teamMembers.map((member) => /* @__PURE__ */ jsxs("div", { children: [/* @__PURE__ */ jsx("p", { children: /* @__PURE__ */ jsx(TeamMemberName, {
47735
47392
  name: member.name,
47736
47393
  profilePath: member.profilePath
47737
47394
  }) }), member.summary ? /* @__PURE__ */ jsx("p", {
@@ -48010,352 +47667,6 @@ function LocationMapSSR(props) {
48010
47667
  });
48011
47668
  }
48012
47669
  //#endregion
48013
- //#region ../blocks/src/system/runtime/nodes/event-registration/whole-series/wholeSeriesPageSurfaceScope.ts
48014
- /**
48015
- * Resolves native run-page ownership without falling back to entry or slug
48016
- * coincidence when a page-surface subject is present but invalid.
48017
- */
48018
- function resolveWholeSeriesPageSurfaceScope(runs, subjectValue) {
48019
- if (subjectValue === null || subjectValue === void 0) return { kind: "absent" };
48020
- const parsed = parseEventPageSurfaceSubject(subjectValue);
48021
- if (!parsed.ok) return {
48022
- kind: "unsupported",
48023
- reason: parsed.error.kind
48024
- };
48025
- const seriesIds = eventSeriesIdsForSubject(parsed.value);
48026
- const allowedSeriesIds = new Set(seriesIds);
48027
- return {
48028
- kind: "scoped",
48029
- subject: parsed.value,
48030
- runs: runs.filter((run) => allowedSeriesIds.has(run.eventSeriesId))
48031
- };
48032
- }
48033
- function eventSeriesIdsForSubject(subject) {
48034
- switch (subject.kind) {
48035
- case "eventSeries": return [subject.eventSeriesId];
48036
- case "eventOffering": return subject.availableEventSeriesIds;
48037
- default: return assertNever$23(subject);
48038
- }
48039
- }
48040
- //#endregion
48041
- //#region ../blocks/src/system/runtime/nodes/course-page-surface-scope.ts
48042
- /** Temporary Course-block adapter over canonical Event run scoping. */
48043
- function resolveCoursePageSurfaceScope(courses, subjectValue) {
48044
- const scope = resolveWholeSeriesPageSurfaceScope(courses, subjectValue);
48045
- return scope.kind === "scoped" ? {
48046
- kind: "scoped",
48047
- subject: scope.subject,
48048
- courses: scope.runs
48049
- } : scope;
48050
- }
48051
- //#endregion
48052
- //#region ../blocks/src/system/runtime/nodes/course-details/logic.ts
48053
- function selectCourseDetails(args) {
48054
- const pageSurfaceScope = resolveCoursePageSurfaceScope((args.courses ?? []).filter(Boolean), args.subject);
48055
- if (pageSurfaceScope.kind === "unsupported") return {
48056
- mode: "unsupportedPageSurfaceSubject",
48057
- selected: null,
48058
- scoped: []
48059
- };
48060
- if (pageSurfaceScope.kind === "scoped") {
48061
- const scoped = [...pageSurfaceScope.courses];
48062
- return {
48063
- mode: "pageSurfaceSubject",
48064
- selected: scoped.length === 1 ? scoped[0] ?? null : null,
48065
- scoped
48066
- };
48067
- }
48068
- return {
48069
- mode: "unsupportedPageSurfaceSubject",
48070
- selected: null,
48071
- scoped: []
48072
- };
48073
- }
48074
- //#endregion
48075
- //#region ../blocks/src/system/runtime/nodes/course-details/runs.ts
48076
- function toValidDate(value) {
48077
- if (!value) return null;
48078
- const date = new Date(value);
48079
- return Number.isNaN(date.getTime()) ? null : date;
48080
- }
48081
- function getCourseDateRange(course) {
48082
- const datedSessions = (course.sessions ?? []).map((session) => ({
48083
- session,
48084
- start: toValidDate(session.startsAt),
48085
- end: toValidDate(session.endsAt)
48086
- })).filter((value) => value.start !== null || value.end !== null);
48087
- if (datedSessions.length === 0) return {
48088
- start: null,
48089
- end: null,
48090
- startIso: null,
48091
- endIso: null,
48092
- timeZone: null
48093
- };
48094
- const startSession = datedSessions.filter((value) => value.start !== null).reduce((earliest, current) => earliest === null || current.start.getTime() < earliest.start.getTime() ? current : earliest, null);
48095
- const endSession = datedSessions.filter((value) => value.end !== null).reduce((latest, current) => latest === null || current.end.getTime() > latest.end.getTime() ? current : latest, null);
48096
- return {
48097
- start: startSession?.start ?? null,
48098
- end: endSession?.end ?? null,
48099
- startIso: startSession?.session.startsAt ?? null,
48100
- endIso: endSession?.session.endsAt ?? null,
48101
- timeZone: startSession?.session.timeZone ?? endSession?.session.timeZone ?? null
48102
- };
48103
- }
48104
- function formatCourseDateRange(range) {
48105
- const { startIso, endIso, timeZone } = range;
48106
- const dateFormat = {
48107
- month: "numeric",
48108
- day: "numeric",
48109
- year: "numeric"
48110
- };
48111
- const effectiveTimeZone = toBookingTimeZone(timeZone);
48112
- const formatSingleDate = (iso) => formatBookingDate(toScheduledBookingDateTime({
48113
- startsAt: iso,
48114
- timeZone: effectiveTimeZone
48115
- }), dateFormat);
48116
- const formatRangeDateOnly = (startsAt, endsAt) => {
48117
- const startText = formatSingleDate(startsAt);
48118
- const endText = formatSingleDate(endsAt);
48119
- return startText === endText ? startText : `${startText} – ${endText}`;
48120
- };
48121
- if (!startIso && !endIso) return "Dates TBD";
48122
- if (startIso && !endIso) return formatSingleDate(startIso);
48123
- if (!startIso && endIso) return formatSingleDate(endIso);
48124
- if (!startIso || !endIso) return "Dates TBD";
48125
- return formatRangeDateOnly(startIso, endIso);
48126
- }
48127
- //#endregion
48128
- //#region ../blocks/src/system/runtime/nodes/course-details/view.tsx
48129
- function TeamMemberName({ name, profilePath }) {
48130
- return profilePath ? /* @__PURE__ */ jsx("a", {
48131
- href: profilePath,
48132
- className: "rb-hover-opacity-80",
48133
- children: /* @__PURE__ */ jsx("strong", { children: name })
48134
- }) : /* @__PURE__ */ jsx("strong", { children: name });
48135
- }
48136
- function parseLimit(value, fallback) {
48137
- if (value === "all") return "all";
48138
- const n = typeof value === "string" ? Number.parseInt(value, 10) : typeof value === "number" ? value : NaN;
48139
- return Number.isFinite(n) && n > 0 ? n : fallback;
48140
- }
48141
- function CourseDetailsView(props) {
48142
- const { course, showTitle = false, showDescription = false, showSessions = true, sessionsLimit, showVenue = true, showPrice = true, showCapacity = true, showEnrollmentStatus = true, showMembershipNote = true, emptyMessage = "Course details unavailable." } = props;
48143
- if (!course) return /* @__PURE__ */ jsx("p", {
48144
- className: "rb-caption status-muted",
48145
- children: emptyMessage
48146
- });
48147
- const pricing = resolveWholeSeriesPricingState(course);
48148
- const sessionLimit = parseLimit(sessionsLimit, 10);
48149
- const sortedSessions = [...course.sessions ?? []].sort((a, b) => Date.parse(a.startsAt) - Date.parse(b.startsAt));
48150
- const visibleSessions = sessionLimit === "all" ? sortedSessions : sortedSessions.slice(0, sessionLimit);
48151
- const hasMoreSessions = sessionLimit !== "all" && sortedSessions.length > sessionLimit;
48152
- const descriptionDoc = showDescription ? coerceRichTextDoc(course.description, "block-runtime:course-details:description") : null;
48153
- const teamMembers = course.teamMembers ?? [];
48154
- return /* @__PURE__ */ jsxs("div", {
48155
- className: "rb-flex rb-flex-col rb-gap-6",
48156
- children: [
48157
- showTitle && /* @__PURE__ */ jsx("h3", { children: course.title }),
48158
- /* @__PURE__ */ jsxs("div", {
48159
- className: "rb-grid rb-grid-cols-1 rb-gap-6 rb-items-start rb-sm-grid-cols-2",
48160
- children: [/* @__PURE__ */ jsxs("div", {
48161
- className: "rb-flex rb-flex-col rb-gap-4",
48162
- children: [
48163
- showPrice && /* @__PURE__ */ jsxs("div", { children: [/* @__PURE__ */ jsx("div", {
48164
- className: "rb-label rb-mb-2",
48165
- children: pricing.selectableOptions.length > 0 ? "Pricing" : "Price"
48166
- }), pricing.selectableOptions.length > 1 ? /* @__PURE__ */ jsx("div", {
48167
- className: "rb-flex rb-flex-col rb-gap-2",
48168
- children: pricing.selectableOptions.map((option) => /* @__PURE__ */ jsxs("div", { children: [/* @__PURE__ */ jsxs("strong", { children: [
48169
- option.name,
48170
- ": ",
48171
- formatWholeSeriesPriceAmount(option.priceAmount, pricing.currency)
48172
- ] }), option.description ? /* @__PURE__ */ jsx("p", {
48173
- className: "rb-caption status-muted",
48174
- children: option.description
48175
- }) : null] }, option.id))
48176
- }) : /* @__PURE__ */ jsx("div", { children: /* @__PURE__ */ jsx("strong", { children: formatWholeSeriesPriceDisplay(pricing.display) }) })] }),
48177
- showCapacity && /* @__PURE__ */ jsxs("div", { children: [/* @__PURE__ */ jsx("div", {
48178
- className: "rb-label rb-mb-2",
48179
- children: "Spots"
48180
- }), /* @__PURE__ */ jsx("div", { children: /* @__PURE__ */ jsx("strong", { children: course.enrollmentCapacity === null ? "Unlimited" : `${course.availableSpots ?? Math.max(0, course.enrollmentCapacity - course.enrolledCount)} left` }) })] }),
48181
- showMembershipNote && course.acceptsMemberships && /* @__PURE__ */ jsxs("div", { children: [/* @__PURE__ */ jsx("div", {
48182
- className: "rb-label rb-mb-2",
48183
- children: "Membership"
48184
- }), /* @__PURE__ */ jsx("p", {
48185
- className: "rb-caption status-muted",
48186
- children: "Eligible memberships can be used for free enrollment"
48187
- })] }),
48188
- teamMembers.length > 0 && /* @__PURE__ */ jsxs("div", { children: [/* @__PURE__ */ jsx("div", {
48189
- className: "rb-label rb-mb-2",
48190
- children: "With"
48191
- }), /* @__PURE__ */ jsx("div", {
48192
- className: "rb-flex rb-flex-col rb-gap-3",
48193
- children: teamMembers.map((teamMember) => /* @__PURE__ */ jsxs("div", { children: [/* @__PURE__ */ jsx("p", { children: /* @__PURE__ */ jsx(TeamMemberName, {
48194
- name: teamMember.name,
48195
- profilePath: teamMember.profilePath
48196
- }) }), teamMember.summary && /* @__PURE__ */ jsx("p", {
48197
- className: "rb-caption status-muted",
48198
- children: teamMember.summary
48199
- })] }, teamMember.id))
48200
- })] })
48201
- ]
48202
- }), /* @__PURE__ */ jsxs("div", {
48203
- className: "rb-flex rb-flex-col rb-gap-4",
48204
- children: [showVenue && course.venue && /* @__PURE__ */ jsxs("div", { children: [
48205
- /* @__PURE__ */ jsx("div", {
48206
- className: "rb-label rb-mb-2",
48207
- children: "Venue"
48208
- }),
48209
- /* @__PURE__ */ jsx("h3", { children: course.venue.name }),
48210
- course.venue.address && /* @__PURE__ */ jsx("p", {
48211
- className: "rb-caption status-muted",
48212
- children: course.venue.address
48213
- })
48214
- ] }), showEnrollmentStatus && /* @__PURE__ */ jsxs("div", { children: [/* @__PURE__ */ jsx("div", {
48215
- className: "rb-label rb-mb-2",
48216
- children: "Enrollment"
48217
- }), /* @__PURE__ */ jsx("p", {
48218
- className: course.enrollmentOpen ? "cd-enrollment--open" : "cd-enrollment--closed",
48219
- children: /* @__PURE__ */ jsx("strong", { children: course.enrollmentOpen ? "Open" : "Closed" })
48220
- })] })]
48221
- })]
48222
- }),
48223
- descriptionDoc && /* @__PURE__ */ jsx("div", {
48224
- className: "cd-description",
48225
- children: /* @__PURE__ */ jsx(RichText$2, { doc: descriptionDoc })
48226
- }),
48227
- showSessions && visibleSessions.length > 0 && /* @__PURE__ */ jsxs("div", { children: [
48228
- /* @__PURE__ */ jsx("div", {
48229
- className: "rb-label",
48230
- children: "Sessions"
48231
- }),
48232
- /* @__PURE__ */ jsx("div", {
48233
- className: "rb-mt-2 rb-tiles-grid",
48234
- children: visibleSessions.map((s) => /* @__PURE__ */ jsx("div", {
48235
- className: "rb-tile",
48236
- children: /* @__PURE__ */ jsx(DateTimeTile, {
48237
- startsAt: s.startsAt,
48238
- endsAt: s.endsAt
48239
- })
48240
- }, s.id))
48241
- }),
48242
- hasMoreSessions && /* @__PURE__ */ jsxs("p", {
48243
- className: "cd-sessions__more",
48244
- children: [
48245
- "Showing ",
48246
- visibleSessions.length,
48247
- " of ",
48248
- sortedSessions.length,
48249
- " sessions."
48250
- ]
48251
- })
48252
- ] })
48253
- ]
48254
- });
48255
- }
48256
- //#endregion
48257
- //#region ../blocks/src/system/runtime/nodes/course-details.server.tsx
48258
- function CourseDetailsSSR({ courses, subject, showTitle, showDescription, showSessions, sessionsLimit, showVenue, showPrice, showCapacity, showEnrollmentStatus, showMembershipNote, className, children }) {
48259
- const selection = selectCourseDetails({
48260
- courses: courses ?? null,
48261
- subject
48262
- });
48263
- const parsedSubject = parseEventPageSurfaceSubject(subject);
48264
- const awaitingOfferingRuns = parsedSubject.ok && parsedSubject.value.kind === "eventOffering" && parsedSubject.value.availableEventSeriesIds.length === 0;
48265
- const now = /* @__PURE__ */ new Date();
48266
- const scopedWithRange = selection.scoped.map((c) => ({
48267
- course: c,
48268
- range: getCourseDateRange(c)
48269
- }));
48270
- const scopedSorted = [...scopedWithRange].sort((a, b) => {
48271
- return (a.range.start?.getTime() ?? 0) - (b.range.start?.getTime() ?? 0);
48272
- });
48273
- 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;
48274
- const nonPastRuns = scopedSorted.filter(({ range }) => !(range.end && range.end <= now));
48275
- return /* @__PURE__ */ jsxs("div", {
48276
- className: `course-details ${className ?? ""}`.trim(),
48277
- "data-block": "course-details",
48278
- children: [selection.selected ? /* @__PURE__ */ jsx(CourseDetailsView, {
48279
- course: selection.selected,
48280
- showTitle,
48281
- showDescription,
48282
- showSessions,
48283
- sessionsLimit,
48284
- showVenue,
48285
- showPrice,
48286
- showCapacity,
48287
- showEnrollmentStatus,
48288
- showMembershipNote
48289
- }) : selection.scoped.length > 0 ? /* @__PURE__ */ jsxs("div", {
48290
- className: "rb-flex rb-flex-col rb-gap-3",
48291
- children: [
48292
- /* @__PURE__ */ jsxs("div", { children: [/* @__PURE__ */ jsx("div", {
48293
- className: "rb-label rb-mb-2",
48294
- children: "Upcoming runs"
48295
- }), /* @__PURE__ */ jsx("p", {
48296
- className: "rb-caption status-muted",
48297
- children: "Choose a run to see sessions and details."
48298
- })] }),
48299
- nonPastRuns.length > 0 ? /* @__PURE__ */ jsx("ul", {
48300
- className: "rb-flex rb-flex-col rb-gap-2",
48301
- children: nonPastRuns.map(({ course, range }) => {
48302
- const start = range.start;
48303
- const end = range.end;
48304
- const isInProgress = Boolean(start && end && start <= now && end > now);
48305
- return /* @__PURE__ */ jsx("li", {
48306
- className: "rb-rounded-md rb-border rb-p-3",
48307
- children: /* @__PURE__ */ jsx("div", {
48308
- className: "rb-flex rb-flex-col rb-gap-1",
48309
- children: /* @__PURE__ */ jsxs("div", {
48310
- className: "rb-flex rb-items-center rb-justify-between rb-gap-3",
48311
- children: [/* @__PURE__ */ jsxs("div", {
48312
- className: "rb-min-w-0",
48313
- children: [/* @__PURE__ */ jsx("div", {
48314
- className: "rb-truncate",
48315
- children: /* @__PURE__ */ jsx("strong", { children: course.title })
48316
- }), /* @__PURE__ */ jsx("div", {
48317
- className: "rb-caption status-muted",
48318
- children: formatCourseDateRange(range)
48319
- })]
48320
- }), /* @__PURE__ */ jsx("div", {
48321
- className: "rb-caption status-muted rb-shrink-0",
48322
- children: course.enrollmentOpen ? "Enrollment open" : isInProgress ? "Currently in progress" : "Enrollment closed"
48323
- })]
48324
- })
48325
- })
48326
- }, course.eventSeriesId);
48327
- })
48328
- }) : /* @__PURE__ */ jsx("p", {
48329
- className: "rb-caption status-muted",
48330
- children: "No upcoming runs."
48331
- }),
48332
- lastPastRun ? /* @__PURE__ */ jsxs("div", {
48333
- className: "rb-caption status-muted",
48334
- children: [
48335
- "Last run: ",
48336
- /* @__PURE__ */ jsx("strong", { children: lastPastRun.course.title }),
48337
- " (",
48338
- formatCourseDateRange(lastPastRun.range),
48339
- ")"
48340
- ]
48341
- }) : null
48342
- ]
48343
- }) : /* @__PURE__ */ jsx(CourseDetailsView, {
48344
- course: null,
48345
- emptyMessage: awaitingOfferingRuns ? "New dates are coming soon." : "Course details unavailable.",
48346
- showTitle,
48347
- showDescription,
48348
- showSessions,
48349
- sessionsLimit,
48350
- showVenue,
48351
- showPrice,
48352
- showCapacity,
48353
- showEnrollmentStatus,
48354
- showMembershipNote
48355
- }), children]
48356
- });
48357
- }
48358
- //#endregion
48359
47670
  //#region ../blocks/src/system/runtime/nodes/events/EventSpotlight.tsx
48360
47671
  /**
48361
47672
  * EventSpotlight Component
@@ -48559,7 +47870,7 @@ function deriveCourseScheduleSummary(course) {
48559
47870
  sessionCount: sessions.length
48560
47871
  };
48561
47872
  }
48562
- function nextCourseSessionStart(course) {
47873
+ function nextWholeSeriesSessionStart(course) {
48563
47874
  return [...course.sessions].filter(isValidOccurrence).map((session) => session.startsAt).sort((left, right) => left.localeCompare(right))[0] ?? null;
48564
47875
  }
48565
47876
  function occurrenceFromEvent(event) {
@@ -48713,7 +48024,7 @@ const OFFERINGS_PREVIEW_GRID_STYLE = {
48713
48024
  function buildItemDataMap(props) {
48714
48025
  const routeCandidates = props.routeCandidates?.routes ?? [];
48715
48026
  const entries = OFFERINGS_PREVIEW_EVENT_PRESET_DEFINITIONS.map((definition) => [definition.sourceKey, eventDataFromMaybeArray(props[definition.dataKey])]);
48716
- return new Map([...entries, ["course", courseDataFromMaybeArray(props.courses, routeCandidates)]]);
48027
+ return new Map([...entries, ["course", courseDataFromMaybeArray(props.wholeSeriesOfferings, routeCandidates)]]);
48717
48028
  }
48718
48029
  function eventDataFromMaybeArray(events) {
48719
48030
  return events ? {
@@ -48767,8 +48078,8 @@ function renderOfferingGroupItems(presentation, items, options) {
48767
48078
  }
48768
48079
  }
48769
48080
  function compareCoursesByNextSession(left, right) {
48770
- const leftStart = nextCourseSessionStart(left);
48771
- const rightStart = nextCourseSessionStart(right);
48081
+ const leftStart = nextWholeSeriesSessionStart(left);
48082
+ const rightStart = nextWholeSeriesSessionStart(right);
48772
48083
  if (leftStart === null) return rightStart === null ? 0 : 1;
48773
48084
  if (rightStart === null) return -1;
48774
48085
  return leftStart.localeCompare(rightStart);
@@ -49707,45 +49018,6 @@ function CheckoutSSR({ blockId, siteId, apiBaseUrl, stage, children, ...rest })
49707
49018
  });
49708
49019
  }
49709
49020
  //#endregion
49710
- //#region ../blocks/src/system/runtime/nodes/course-registration.server.tsx
49711
- /**
49712
- * Server-safe placeholder for course registration.
49713
- * Provides a static container for island hydration without importing client hooks.
49714
- */
49715
- function CourseRegistrationSSR({ blockId, siteId, apiBaseUrl, portalToken, subject, courses, className, showSessions, showPrice, showCapacity, showVenue, successMessage, waitlistMessage, membershipMessage, buttonText, buttonVariant, stage, children }) {
49716
- const islandProps = buildCourseRegistrationInteractiveIslandProps({
49717
- siteId,
49718
- apiBaseUrl,
49719
- portalToken,
49720
- subject,
49721
- courses,
49722
- className,
49723
- showSessions,
49724
- showPrice,
49725
- showCapacity,
49726
- showVenue,
49727
- successMessage,
49728
- waitlistMessage,
49729
- membershipMessage,
49730
- buttonText,
49731
- buttonVariant,
49732
- stage
49733
- });
49734
- return /* @__PURE__ */ jsxs("div", {
49735
- className: `course-registration ${className ?? ""}`.trim(),
49736
- "data-block": "course-registration",
49737
- ...getIslandRootProps("course-registration", blockId),
49738
- children: [
49739
- /* @__PURE__ */ jsx(IslandPropsScript, { value: islandProps }),
49740
- /* @__PURE__ */ jsx("div", {
49741
- className: "course-registration__summary",
49742
- children: /* @__PURE__ */ jsx("strong", { children: islandProps.render.display.summaryButtonText })
49743
- }),
49744
- children
49745
- ]
49746
- });
49747
- }
49748
- //#endregion
49749
49021
  //#region ../blocks/src/system/runtime/nodes/gifting.server.tsx
49750
49022
  function GiftingSSR({ blockId, ...rest }) {
49751
49023
  const islandProps = buildGiftingInteractiveIslandProps(rest);
@@ -51231,7 +50503,6 @@ const runtimeBackedBlockServerEntries = {
51231
50503
  "product-detail": defineRuntimeBackedBlockEntry(requireRuntimeBackedBlockDefinition(productDetailBlockDefinition), ProductDetailSSR),
51232
50504
  cart: defineRuntimeBackedBlockEntry(requireRuntimeBackedBlockDefinition(cartBlockDefinition), CartSSR),
51233
50505
  checkout: defineRuntimeBackedBlockEntry(requireRuntimeBackedBlockDefinition(checkoutBlockDefinition), CheckoutSSR),
51234
- "course-registration": defineRuntimeBackedBlockEntry(requireRuntimeBackedBlockDefinition(courseRegistrationBlockDefinition), CourseRegistrationSSR),
51235
50506
  gifting: defineRuntimeBackedBlockEntry(requireRuntimeBackedBlockDefinition(giftingBlockDefinition), GiftingSSR),
51236
50507
  "event-registration": defineRuntimeBackedBlockEntry(requireRuntimeBackedBlockDefinition(eventRegistrationBlockDefinition), EventRegistrationSSR),
51237
50508
  shop: defineRuntimeBackedBlockEntry(requireRuntimeBackedBlockDefinition(shopBlockDefinition), ShopSSR)
@@ -51264,7 +50535,6 @@ const serverComponentRegistry = {
51264
50535
  "booking-form": BookingFormSSR,
51265
50536
  "event-details": EventDetailsSSR,
51266
50537
  "location-map": LocationMapSSR,
51267
- "course-details": CourseDetailsSSR,
51268
50538
  "event-spotlight": EventSpotlight,
51269
50539
  "event-combined": EventCombinedSSR,
51270
50540
  "offerings-preview": OfferingsPreviewNode,
@@ -52751,12 +52021,46 @@ function collectConstrainedVideoMediaValues(options) {
52751
52021
  */
52752
52022
  function hydrateManifestLinks(manifest, content, routes, pagesByIdentifier, entriesByIdentifier) {
52753
52023
  if (!routes || !manifest?.fields?.length) return content;
52754
- return hydrateValue(content, {
52024
+ return hydrateLinks(content, routes, pagesByIdentifier, entriesByIdentifier);
52025
+ }
52026
+ /** Hydrate identifier-aware links in data loaded after manifest content. */
52027
+ function hydrateLinks(value, routes, pagesByIdentifier, entriesByIdentifier) {
52028
+ return hydrateValue(value, {
52029
+ routes,
52030
+ pagesByIdentifier,
52031
+ entriesByIdentifier
52032
+ });
52033
+ }
52034
+ /**
52035
+ * Hydrate links only inside resolved booking-consent documents. Loader payloads are
52036
+ * otherwise opaque and may legitimately contain objects that resemble link values.
52037
+ */
52038
+ function hydrateResolvedBookingConsentLinks(value, routes, pagesByIdentifier, entriesByIdentifier) {
52039
+ return hydrateResolvedBookingConsentValue(value, {
52755
52040
  routes,
52756
52041
  pagesByIdentifier,
52757
52042
  entriesByIdentifier
52758
52043
  });
52759
52044
  }
52045
+ function hydrateResolvedBookingConsentValue(value, context) {
52046
+ if (Array.isArray(value)) {
52047
+ const hydratedItems = value.map((item) => hydrateResolvedBookingConsentValue(item, context));
52048
+ return hydratedItems.every((item, index) => item === value[index]) ? value : hydratedItems;
52049
+ }
52050
+ if (!isRecord$27(value)) return value;
52051
+ if (isBookingConsentCarrier(value)) {
52052
+ const agreement = hydrateValue(value.agreement, context);
52053
+ return agreement === value.agreement ? value : {
52054
+ ...value,
52055
+ agreement
52056
+ };
52057
+ }
52058
+ const hydratedEntries = Object.entries(value).map(([key, entry]) => [key, hydrateResolvedBookingConsentValue(entry, context)]);
52059
+ return hydratedEntries.every(([key, entry]) => entry === value[key]) ? value : Object.fromEntries(hydratedEntries);
52060
+ }
52061
+ function isBookingConsentCarrier(value) {
52062
+ return bookingConsentCarrierSchema.safeParse(value).success;
52063
+ }
52760
52064
  function hydrateValue(value, context) {
52761
52065
  try {
52762
52066
  if (Array.isArray(value)) {
@@ -52825,6 +52129,13 @@ function hydrateEntryLink(link, context) {
52825
52129
  };
52826
52130
  }
52827
52131
  //#endregion
52132
+ //#region ../blocks/src/system/manifest/resolveBlockData.ts
52133
+ function resolveBlockData$1(blockId, dataLoaders, dataContext, routes) {
52134
+ const raw = blockId ? dataContext?.resolvedData?.[blockId] : void 0;
52135
+ if (isRecord$27(raw)) return routes ? hydrateResolvedBookingConsentLinks(raw, routes, dataContext?.pagesByIdentifier, dataContext?.entriesByIdentifier) : raw;
52136
+ return dataLoaders && typeof dataLoaders === "object" && Object.keys(dataLoaders).length > 0 ? {} : void 0;
52137
+ }
52138
+ //#endregion
52828
52139
  //#region ../blocks/src/sdkBlockTransform.ts
52829
52140
  /**
52830
52141
  * Transforms an SDK custom block into a BlockManifest.
@@ -53419,8 +52730,8 @@ function generateInputCss({ themeId, theme, inputSystem }) {
53419
52730
  const radioSelector = `${rootSelector} .form-radio`;
53420
52731
  const checkableRules = [];
53421
52732
  checkableRules.push("appearance: none");
53422
- checkableRules.push("width: 1rem");
53423
- checkableRules.push("height: 1rem");
52733
+ checkableRules.push("width: 1.125rem");
52734
+ checkableRules.push("height: 1.125rem");
53424
52735
  checkableRules.push("flex-shrink: 0");
53425
52736
  checkableRules.push(`border: ${borderPx} solid ${rgbColorValue(inputSystem.base.border.colorToken)}`);
53426
52737
  if (inputSystem.base.background.type === "transparent") checkableRules.push("background-color: transparent");
@@ -55678,176 +54989,6 @@ ${root} {
55678
54989
  `;
55679
54990
  }
55680
54991
  //#endregion
55681
- //#region ../theme-core/src/blocks/vars/course-details.ts
55682
- /**
55683
- * Generate CSS variables for the course-details block.
55684
- *
55685
- * Variables defined:
55686
- * - Enrollment status colors (open/closed)
55687
- * - Capacity indicator colors (available/low/full)
55688
- * - Price display colors (free indicator)
55689
- */
55690
- function generateCourseDetailsVars({ themeId }) {
55691
- return `
55692
- ${`:where([data-theme-scope="${themeId}"]) :where([data-block="course-details"])`} {
55693
- /* Enrollment status */
55694
- --cd-enrollment-open-text: rgb(var(--tb-success));
55695
- --cd-enrollment-closed-text: rgb(var(--tb-mutedText));
55696
-
55697
- /* Capacity indicator */
55698
- --cd-capacity-available-text: rgb(var(--tb-success));
55699
- --cd-capacity-low-text: rgb(var(--tb-warning));
55700
- --cd-capacity-full-text: rgb(var(--tb-destructive, 239 68 68));
55701
-
55702
- /* Price styling */
55703
- --cd-price-free-text: rgb(var(--tb-success));
55704
- }
55705
- `;
55706
- }
55707
- //#endregion
55708
- //#region ../theme-core/src/blocks/vars/course-registration.ts
55709
- const EVENT_WHOLE_SERIES_VARIABLE_BRIDGE = `
55710
- /* Temporary bridge while persisted Course blocks render the Event-owned
55711
- whole-series registration runtime. Removed with the Course block. */
55712
- --er-step-active: var(--cr-step-active);
55713
- --er-step-inactive: var(--cr-step-inactive);
55714
- --er-step-completed: var(--cr-step-completed);
55715
- --er-step-text: var(--cr-step-text);
55716
- --er-step-text-active: var(--cr-step-text-active);
55717
- --er-step-connector: var(--cr-step-connector);
55718
- --er-step-title-size: var(--cr-step-title-size);
55719
- --er-success-bg: var(--cr-success-bg);
55720
- --er-success-text: var(--cr-success-text);
55721
- --er-error-bg: var(--cr-error-bg);
55722
- --er-error-text: var(--cr-error-text);
55723
- --er-waitlist-bg: var(--cr-waitlist-bg);
55724
- --er-waitlist-text: var(--cr-waitlist-text);
55725
- --er-capacity-available-bg: var(--cr-capacity-available-bg);
55726
- --er-capacity-available-text: var(--cr-capacity-available-text);
55727
- --er-capacity-low-bg: var(--cr-capacity-low-bg);
55728
- --er-capacity-low-text: var(--cr-capacity-low-text);
55729
- --er-capacity-soldout-bg: var(--cr-capacity-soldout-bg);
55730
- --er-capacity-soldout-text: var(--cr-capacity-soldout-text);
55731
- --er-border: var(--cr-border);
55732
- --er-border-hover: var(--cr-border-hover);
55733
- --er-border-selected: var(--cr-border-selected);
55734
- --er-border-error: var(--cr-border-error);
55735
- --er-focus-ring: var(--cr-focus-ring);
55736
- --er-required: var(--cr-required);
55737
- --er-payment-border: var(--cr-payment-border);
55738
- --er-payment-border-hover: var(--cr-payment-border-hover);
55739
- --er-payment-border-selected: var(--cr-payment-border-selected);
55740
- --er-payment-bg-selected: var(--cr-payment-bg-selected);
55741
- --er-check-bg: var(--cr-check-bg);
55742
- --er-check-text: var(--cr-check-text);
55743
- --er-summary-bg: var(--cr-summary-bg);
55744
- --er-summary-border: var(--cr-summary-border);
55745
- --er-on-surface: rgb(var(--tb-onSurface, var(--tb-text)));
55746
- --er-on-surface-hover-bg: rgba(var(--tb-onSurface, var(--tb-text)), 0.05);
55747
- `;
55748
- /**
55749
- * Generate CSS variables for the course-registration block.
55750
- *
55751
- * Variables defined:
55752
- * - Step indicator colors (active, inactive, completed, text, connector)
55753
- * - Success/error/waitlist state backgrounds and text colors
55754
- * - Capacity badge colors (available, low, sold-out)
55755
- * - Border colors for various interaction states
55756
- * - Input focus and required marker styling
55757
- * - Payment option card styling
55758
- * - Checkmark indicator colors
55759
- * - Summary styling
55760
- */
55761
- function generateCourseRegistrationVars({ themeId }) {
55762
- return `
55763
- ${`:where([data-theme-scope="${themeId}"]) :where([data-block="course-registration"])`} {
55764
- /* Step indicator */
55765
- --cr-step-active: rgb(var(--tb-primary));
55766
- --cr-step-inactive: rgb(var(--tb-mutedText));
55767
- --cr-step-completed: rgb(var(--tb-success));
55768
- --cr-step-text: rgb(255 255 255);
55769
- --cr-step-text-active: rgb(var(--tb-primaryText, 255 255 255));
55770
- --cr-step-connector: rgba(var(--tb-border), 0.5);
55771
-
55772
- /* Step title */
55773
- --cr-step-title-size: 1.5rem;
55774
-
55775
- /* State backgrounds with alpha */
55776
- --cr-success-bg: rgba(var(--tb-success), 0.1);
55777
- --cr-success-text: rgb(var(--tb-success));
55778
- --cr-error-bg: rgba(var(--tb-destructive, 239 68 68), 0.1);
55779
- --cr-error-text: rgb(var(--tb-destructive, 239 68 68));
55780
- --cr-waitlist-bg: rgba(var(--tb-warning), 0.1);
55781
- --cr-waitlist-text: rgb(var(--tb-warning));
55782
-
55783
- /* Capacity badges */
55784
- --cr-capacity-available-bg: rgba(var(--tb-success), 0.1);
55785
- --cr-capacity-available-text: rgb(var(--tb-success));
55786
- --cr-capacity-low-bg: rgba(var(--tb-warning), 0.1);
55787
- --cr-capacity-low-text: rgb(var(--tb-warning));
55788
- --cr-capacity-soldout-bg: rgba(var(--tb-destructive, 239 68 68), 0.1);
55789
- --cr-capacity-soldout-text: rgb(var(--tb-destructive, 239 68 68));
55790
-
55791
- /* Borders */
55792
- --cr-border: rgb(var(--tb-border));
55793
- --cr-border-hover: rgba(var(--tb-primary), 0.5);
55794
- --cr-border-selected: rgb(var(--tb-primary));
55795
- --cr-border-error: rgb(var(--tb-destructive, 239 68 68));
55796
-
55797
- /* Input focus */
55798
- --cr-focus-ring: rgba(var(--tb-primary), 0.3);
55799
-
55800
- /* Required marker */
55801
- --cr-required: rgb(var(--tb-destructive, 239 68 68));
55802
-
55803
- /* Payment option cards */
55804
- --cr-payment-border: rgb(var(--tb-border));
55805
- --cr-payment-border-hover: rgba(var(--tb-primary), 0.5);
55806
- --cr-payment-border-selected: rgb(var(--tb-primary));
55807
- --cr-payment-bg-selected: rgba(var(--tb-primary), 0.08);
55808
-
55809
- /* Checkmark indicator */
55810
- --cr-check-bg: rgb(var(--tb-primary));
55811
- --cr-check-text: rgb(var(--tb-primaryText, 255 255 255));
55812
-
55813
- /* Summary */
55814
- --cr-summary-bg: rgba(var(--tb-primary), 0.1);
55815
- --cr-summary-border: rgb(var(--tb-border));
55816
-
55817
- ${EVENT_WHOLE_SERIES_VARIABLE_BRIDGE}
55818
-
55819
- /* Shared registration-surface mappings (issue 1174).
55820
- Route the shared --rb-reg-* contract through this block's Tier 3 vars
55821
- (palette tokens where no --cr-* var exists) so existing --cr-* overrides
55822
- keep working unchanged. */
55823
- --rb-reg-radius: var(--rb-block-radius);
55824
- --rb-reg-border: var(--cr-border);
55825
- --rb-reg-border-hover: var(--cr-border-hover);
55826
- --rb-reg-border-selected: var(--cr-border-selected);
55827
- --rb-reg-bg-selected: var(--cr-payment-bg-selected);
55828
- --rb-reg-option-bg: rgb(var(--tb-background));
55829
- --rb-reg-option-hover-shadow: 0 8px 18px rgba(var(--tb-shadow, 15 23 42), 0.08);
55830
- --rb-reg-surface-bg: rgb(var(--tb-surface));
55831
- --rb-reg-on-surface: rgb(var(--tb-onSurface, var(--tb-text)));
55832
- --rb-reg-on-surface-muted: rgba(var(--tb-onSurface, var(--tb-text)), 0.7);
55833
- --rb-reg-on-surface-subtle: rgba(var(--tb-onSurface, var(--tb-text)), 0.6);
55834
- --rb-reg-on-surface-faint: rgba(var(--tb-onSurface, var(--tb-text)), 0.5);
55835
- --rb-reg-check-bg: var(--cr-check-bg);
55836
- --rb-reg-check-text: var(--cr-check-text);
55837
- --rb-reg-step-active: var(--cr-step-active);
55838
- --rb-reg-step-completed: var(--cr-step-completed);
55839
- --rb-reg-step-inactive: var(--cr-step-inactive);
55840
- --rb-reg-step-text: var(--cr-step-text);
55841
- --rb-reg-step-text-active: var(--cr-step-text-active);
55842
- --rb-reg-step-connector: var(--cr-step-connector);
55843
- --rb-reg-summary-bg: var(--cr-summary-bg);
55844
- --rb-reg-summary-border: var(--cr-summary-border);
55845
- --rb-reg-focus-ring: var(--cr-focus-ring);
55846
- --rb-reg-shell-line: rgba(var(--tb-mutedText, 100 116 139), 0.22);
55847
- }
55848
- `;
55849
- }
55850
- //#endregion
55851
54992
  //#region ../theme-core/src/blocks/registry.ts
55852
54993
  /**
55853
54994
  * Global registry of block var generators.
@@ -55862,8 +55003,6 @@ blockVarRegistry.set("appointment-booking", generateAppointmentBookingVars);
55862
55003
  blockVarRegistry.set("form", generateFormBlockVars);
55863
55004
  blockVarRegistry.set("customer-portal", generateCustomerPortalVars);
55864
55005
  blockVarRegistry.set("testimonials", generateTestimonialsVars);
55865
- blockVarRegistry.set("course-details", generateCourseDetailsVars);
55866
- blockVarRegistry.set("course-registration", generateCourseRegistrationVars);
55867
55006
  /**
55868
55007
  * Generate all Tier 3 block-specific CSS variables.
55869
55008
  *
@@ -57204,11 +56343,7 @@ const MemoBlockSection = React$1.memo(function MemoBlockSection({ themeResources
57204
56343
  try {
57205
56344
  const routes = routeMap ?? dataContext?.routes;
57206
56345
  const hydratedContent = routes ? hydrateManifestLinks(definition.manifest, data, routes, dataContext?.pagesByIdentifier, dataContext?.entriesByIdentifier) : data;
57207
- const resolved = resolveBlockData$1({
57208
- block,
57209
- definition,
57210
- dataContext
57211
- });
56346
+ const resolved = resolveBlockData$1(block.id, definition.dataLoaders, dataContext, routes);
57212
56347
  const hasResolvedData = !!resolved && typeof resolved === "object" && Object.keys(resolved).length > 0;
57213
56348
  const baseProps = {
57214
56349
  content: hydratedContent,
@@ -57298,12 +56433,6 @@ function shouldDebugCustomBlocks() {
57298
56433
  return false;
57299
56434
  }
57300
56435
  }
57301
- function resolveBlockData$1({ block, definition, dataContext }) {
57302
- const blockId = block.id ?? null;
57303
- const raw = blockId ? dataContext?.resolvedData?.[blockId] : void 0;
57304
- if (isObjectRecord$1(raw)) return { ...raw };
57305
- return definition.dataLoaders && Object.keys(definition.dataLoaders).length > 0 ? {} : void 0;
57306
- }
57307
56436
  /**
57308
56437
  * Resolves block content based on stage priority.
57309
56438
  * For draft/preview: draftContent takes priority over content.
@@ -60765,7 +59894,7 @@ const containerResponsiveThemeCss = `/*
60765
59894
  * Shared: Registration Surface (issue 1174)
60766
59895
  *
60767
59896
  * Wizard-surface primitives shared by the event-registration,
60768
- * course-registration and appointment-booking blocks: surface container,
59897
+ * appointment-booking blocks: surface container,
60769
59898
  * selectable option cards, step indicator, wizard actions row, on-surface
60770
59899
  * text ramp, layout stacks, summary box and skeleton shell lines.
60771
59900
  *
@@ -60808,7 +59937,7 @@ const containerResponsiveThemeCss = `/*
60808
59937
  }
60809
59938
 
60810
59939
  /* Surface container */
60811
- :where(.theme-scope) :where([data-block="event-registration"], [data-block="course-registration"], [data-block="appointment-booking"]) .rb-reg-surface {
59940
+ :where(.theme-scope) :where([data-block="event-registration"], [data-block="appointment-booking"]) .rb-reg-surface {
60812
59941
  border-radius: var(--rb-reg-radius, var(--rb-block-radius, 1rem));
60813
59942
  border: 1px solid var(--rb-reg-border, rgb(var(--tb-border, 226 232 240)));
60814
59943
  padding: clamp(1rem, 2vw, 1.5rem);
@@ -60838,7 +59967,7 @@ const containerResponsiveThemeCss = `/*
60838
59967
  *
60839
59968
  * Mirrors \`contextualButtonSurfaceResetStyles()\` in theme-core/buttons; the
60840
59969
  * pairing is pinned by registration-surface-action-reset.test.ts. */
60841
- :where(.theme-scope) :where([data-block="event-registration"], [data-block="course-registration"], [data-block="appointment-booking"]) .rb-reg-surface {
59970
+ :where(.theme-scope) :where([data-block="event-registration"], [data-block="appointment-booking"]) .rb-reg-surface {
60842
59971
  --rb-action-primary-base-background-color: initial;
60843
59972
  --rb-action-primary-base-background-image: initial;
60844
59973
  --rb-action-primary-base-color: initial;
@@ -60946,7 +60075,7 @@ const containerResponsiveThemeCss = `/*
60946
60075
  }
60947
60076
 
60948
60077
  /* Selectable option card */
60949
- :where(.theme-scope) :where([data-block="event-registration"], [data-block="course-registration"], [data-block="appointment-booking"]) .rb-option-card {
60078
+ :where(.theme-scope) :where([data-block="event-registration"], [data-block="appointment-booking"]) .rb-option-card {
60950
60079
  position: relative;
60951
60080
  display: flex;
60952
60081
  align-items: flex-start;
@@ -60963,34 +60092,34 @@ const containerResponsiveThemeCss = `/*
60963
60092
  box-shadow var(--rb-block-transition, 150ms) ease;
60964
60093
  }
60965
60094
 
60966
- :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"]) {
60095
+ :where(.theme-scope) :where([data-block="event-registration"], [data-block="appointment-booking"]) .rb-option-card:hover:not(:disabled):not([aria-disabled="true"]) {
60967
60096
  border-color: var(--rb-reg-border-hover, rgba(var(--tb-primary, 17 24 39), 0.5));
60968
60097
  box-shadow: var(--rb-reg-option-hover-shadow, 0 8px 18px rgba(var(--tb-shadow, 15 23 42), 0.08));
60969
60098
  }
60970
60099
 
60971
- :where(.theme-scope) :where([data-block="event-registration"], [data-block="course-registration"], [data-block="appointment-booking"]) .rb-option-card:focus-visible {
60100
+ :where(.theme-scope) :where([data-block="event-registration"], [data-block="appointment-booking"]) .rb-option-card:focus-visible {
60972
60101
  outline: 2px solid var(--rb-reg-focus-ring, rgba(var(--tb-primary, 17 24 39), 0.3));
60973
60102
  outline-offset: 2px;
60974
60103
  }
60975
60104
 
60976
- :where(.theme-scope) :where([data-block="event-registration"], [data-block="course-registration"], [data-block="appointment-booking"]) .rb-option-card--selected {
60105
+ :where(.theme-scope) :where([data-block="event-registration"], [data-block="appointment-booking"]) .rb-option-card--selected {
60977
60106
  border-color: var(--rb-reg-border-selected, rgb(var(--tb-primary, 17 24 39)));
60978
60107
  background-color: var(--rb-reg-bg-selected, rgba(var(--tb-primary, 17 24 39), 0.08));
60979
60108
  box-shadow: 0 0 0 1px var(--rb-reg-border-selected, rgb(var(--tb-primary, 17 24 39)));
60980
60109
  }
60981
60110
 
60982
- :where(.theme-scope) :where([data-block="event-registration"], [data-block="course-registration"], [data-block="appointment-booking"]) .rb-option-card--disabled {
60111
+ :where(.theme-scope) :where([data-block="event-registration"], [data-block="appointment-booking"]) .rb-option-card--disabled {
60983
60112
  cursor: not-allowed;
60984
60113
  opacity: 0.7;
60985
60114
  }
60986
60115
 
60987
- :where(.theme-scope) :where([data-block="event-registration"], [data-block="course-registration"], [data-block="appointment-booking"]) .rb-option-card--disabled:hover {
60116
+ :where(.theme-scope) :where([data-block="event-registration"], [data-block="appointment-booking"]) .rb-option-card--disabled:hover {
60988
60117
  border-color: var(--rb-reg-border, rgb(var(--tb-border, 226 232 240)));
60989
60118
  box-shadow: none;
60990
60119
  }
60991
60120
 
60992
60121
  /* Check indicator */
60993
- :where(.theme-scope) :where([data-block="event-registration"], [data-block="course-registration"], [data-block="appointment-booking"]) .rb-option-check {
60122
+ :where(.theme-scope) :where([data-block="event-registration"], [data-block="appointment-booking"]) .rb-option-check {
60994
60123
  flex-shrink: 0;
60995
60124
  width: 1.25rem;
60996
60125
  height: 1.25rem;
@@ -61001,18 +60130,18 @@ const containerResponsiveThemeCss = `/*
61001
60130
  justify-content: center;
61002
60131
  }
61003
60132
 
61004
- :where(.theme-scope) :where([data-block="event-registration"], [data-block="course-registration"], [data-block="appointment-booking"]) .rb-option-check svg {
60133
+ :where(.theme-scope) :where([data-block="event-registration"], [data-block="appointment-booking"]) .rb-option-check svg {
61005
60134
  width: 0.75rem;
61006
60135
  height: 0.75rem;
61007
60136
  color: var(--rb-reg-check-text, rgb(var(--tb-primaryText, var(--tb-primaryForeground, 255 255 255))));
61008
60137
  }
61009
60138
 
61010
60139
  /* Step indicator */
61011
- :where(.theme-scope) :where([data-block="event-registration"], [data-block="course-registration"], [data-block="appointment-booking"]) .rb-steps-nav {
60140
+ :where(.theme-scope) :where([data-block="event-registration"], [data-block="appointment-booking"]) .rb-steps-nav {
61012
60141
  margin-bottom: 1.5rem;
61013
60142
  }
61014
60143
 
61015
- :where(.theme-scope) :where([data-block="event-registration"], [data-block="course-registration"], [data-block="appointment-booking"]) .rb-steps {
60144
+ :where(.theme-scope) :where([data-block="event-registration"], [data-block="appointment-booking"]) .rb-steps {
61016
60145
  display: flex;
61017
60146
  align-items: center;
61018
60147
  justify-content: center;
@@ -61022,13 +60151,13 @@ const containerResponsiveThemeCss = `/*
61022
60151
  margin: 0;
61023
60152
  }
61024
60153
 
61025
- :where(.theme-scope) :where([data-block="event-registration"], [data-block="course-registration"], [data-block="appointment-booking"]) .rb-step {
60154
+ :where(.theme-scope) :where([data-block="event-registration"], [data-block="appointment-booking"]) .rb-step {
61026
60155
  display: flex;
61027
60156
  align-items: center;
61028
60157
  gap: 0.5rem;
61029
60158
  }
61030
60159
 
61031
- :where(.theme-scope) :where([data-block="event-registration"], [data-block="course-registration"], [data-block="appointment-booking"]) .rb-step-circle {
60160
+ :where(.theme-scope) :where([data-block="event-registration"], [data-block="appointment-booking"]) .rb-step-circle {
61032
60161
  width: 1.75rem;
61033
60162
  height: 1.75rem;
61034
60163
  border-radius: 50%;
@@ -61042,47 +60171,47 @@ const containerResponsiveThemeCss = `/*
61042
60171
  transition: background-color var(--rb-block-transition, 150ms) ease;
61043
60172
  }
61044
60173
 
61045
- :where(.theme-scope) :where([data-block="event-registration"], [data-block="course-registration"], [data-block="appointment-booking"]) .rb-step-circle--active {
60174
+ :where(.theme-scope) :where([data-block="event-registration"], [data-block="appointment-booking"]) .rb-step-circle--active {
61046
60175
  background: var(--rb-reg-step-active, rgb(var(--tb-primary, 17 24 39)));
61047
60176
  color: var(--rb-reg-step-text-active, rgb(var(--tb-primaryText, var(--tb-primaryForeground, 255 255 255))));
61048
60177
  }
61049
60178
 
61050
- :where(.theme-scope) :where([data-block="event-registration"], [data-block="course-registration"], [data-block="appointment-booking"]) .rb-step-circle--completed {
60179
+ :where(.theme-scope) :where([data-block="event-registration"], [data-block="appointment-booking"]) .rb-step-circle--completed {
61051
60180
  background: var(--rb-reg-step-completed, rgb(var(--tb-success, 22 163 74)));
61052
60181
  color: var(--rb-reg-step-text-active, rgb(var(--tb-primaryText, var(--tb-primaryForeground, 255 255 255))));
61053
60182
  }
61054
60183
 
61055
- :where(.theme-scope) :where([data-block="event-registration"], [data-block="course-registration"], [data-block="appointment-booking"]) .rb-step-check {
60184
+ :where(.theme-scope) :where([data-block="event-registration"], [data-block="appointment-booking"]) .rb-step-check {
61056
60185
  width: 0.75rem;
61057
60186
  height: 0.75rem;
61058
60187
  }
61059
60188
 
61060
- :where(.theme-scope) :where([data-block="event-registration"], [data-block="course-registration"], [data-block="appointment-booking"]) .rb-step-connector {
60189
+ :where(.theme-scope) :where([data-block="event-registration"], [data-block="appointment-booking"]) .rb-step-connector {
61061
60190
  width: 2rem;
61062
60191
  height: 2px;
61063
60192
  background: var(--rb-reg-step-connector, rgba(var(--tb-border, 226 232 240), 0.5));
61064
60193
  }
61065
60194
 
61066
- :where(.theme-scope) :where([data-block="event-registration"], [data-block="course-registration"], [data-block="appointment-booking"]) .rb-step-label {
60195
+ :where(.theme-scope) :where([data-block="event-registration"], [data-block="appointment-booking"]) .rb-step-label {
61067
60196
  font-size: 0.75rem;
61068
60197
  color: var(--rb-reg-on-surface, rgb(var(--tb-onSurface, var(--tb-text, 15 23 42))));
61069
60198
  display: none;
61070
60199
  }
61071
60200
 
61072
- :where(.theme-scope) :where([data-block="event-registration"], [data-block="course-registration"], [data-block="appointment-booking"]) .rb-step-label--active {
60201
+ :where(.theme-scope) :where([data-block="event-registration"], [data-block="appointment-booking"]) .rb-step-label--active {
61073
60202
  font-weight: 500;
61074
60203
  }
61075
60204
 
61076
60205
  @container rb-site (min-width: 640px) {
61077
60206
  @scope ([data-rb-responsive-mode="container"]) to (:scope [data-rb-responsive-mode]) {
61078
- :where(.theme-scope) :where([data-block="event-registration"], [data-block="course-registration"], [data-block="appointment-booking"]) .rb-step-label {
60207
+ :where(.theme-scope) :where([data-block="event-registration"], [data-block="appointment-booking"]) .rb-step-label {
61079
60208
  display: inline;
61080
60209
  }
61081
60210
  }
61082
60211
  }
61083
60212
 
61084
60213
  /* Wizard actions row */
61085
- :where(.theme-scope) :where([data-block="event-registration"], [data-block="course-registration"], [data-block="appointment-booking"]) .rb-wizard-actions {
60214
+ :where(.theme-scope) :where([data-block="event-registration"], [data-block="appointment-booking"]) .rb-wizard-actions {
61086
60215
  display: flex;
61087
60216
  justify-content: space-between;
61088
60217
  align-items: center;
@@ -61091,56 +60220,56 @@ const containerResponsiveThemeCss = `/*
61091
60220
  }
61092
60221
 
61093
60222
  /* When there's only one action (no back button), push it to the right */
61094
- :where(.theme-scope) :where([data-block="event-registration"], [data-block="course-registration"], [data-block="appointment-booking"]) .rb-wizard-actions > :only-child {
60223
+ :where(.theme-scope) :where([data-block="event-registration"], [data-block="appointment-booking"]) .rb-wizard-actions > :only-child {
61095
60224
  margin-inline-start: auto;
61096
60225
  }
61097
60226
 
61098
60227
  /* On-surface text ramp */
61099
- :where(.theme-scope) :where([data-block="event-registration"], [data-block="course-registration"], [data-block="appointment-booking"]) .rb-on-surface {
60228
+ :where(.theme-scope) :where([data-block="event-registration"], [data-block="appointment-booking"]) .rb-on-surface {
61100
60229
  color: var(--rb-reg-on-surface, rgb(var(--tb-onSurface, var(--tb-text, 15 23 42))));
61101
60230
  }
61102
60231
 
61103
- :where(.theme-scope) :where([data-block="event-registration"], [data-block="course-registration"], [data-block="appointment-booking"]) .rb-on-surface--muted {
60232
+ :where(.theme-scope) :where([data-block="event-registration"], [data-block="appointment-booking"]) .rb-on-surface--muted {
61104
60233
  color: var(--rb-reg-on-surface-muted, rgba(var(--tb-onSurface, var(--tb-text, 15 23 42)), 0.7));
61105
60234
  }
61106
60235
 
61107
- :where(.theme-scope) :where([data-block="event-registration"], [data-block="course-registration"], [data-block="appointment-booking"]) .rb-on-surface--subtle {
60236
+ :where(.theme-scope) :where([data-block="event-registration"], [data-block="appointment-booking"]) .rb-on-surface--subtle {
61108
60237
  color: var(--rb-reg-on-surface-subtle, rgba(var(--tb-onSurface, var(--tb-text, 15 23 42)), 0.6));
61109
60238
  }
61110
60239
 
61111
- :where(.theme-scope) :where([data-block="event-registration"], [data-block="course-registration"], [data-block="appointment-booking"]) .rb-on-surface--faint {
60240
+ :where(.theme-scope) :where([data-block="event-registration"], [data-block="appointment-booking"]) .rb-on-surface--faint {
61112
60241
  color: var(--rb-reg-on-surface-faint, rgba(var(--tb-onSurface, var(--tb-text, 15 23 42)), 0.5));
61113
60242
  }
61114
60243
 
61115
60244
  /* Layout stacks */
61116
- :where(.theme-scope) :where([data-block="event-registration"], [data-block="course-registration"], [data-block="appointment-booking"]) .rb-reg-stack {
60245
+ :where(.theme-scope) :where([data-block="event-registration"], [data-block="appointment-booking"]) .rb-reg-stack {
61117
60246
  display: flex;
61118
60247
  flex-direction: column;
61119
60248
  gap: 1rem;
61120
60249
  }
61121
60250
 
61122
- :where(.theme-scope) :where([data-block="event-registration"], [data-block="course-registration"], [data-block="appointment-booking"]) .rb-reg-stack--sm {
60251
+ :where(.theme-scope) :where([data-block="event-registration"], [data-block="appointment-booking"]) .rb-reg-stack--sm {
61123
60252
  gap: 0.75rem;
61124
60253
  }
61125
60254
 
61126
- :where(.theme-scope) :where([data-block="event-registration"], [data-block="course-registration"], [data-block="appointment-booking"]) .rb-reg-row {
60255
+ :where(.theme-scope) :where([data-block="event-registration"], [data-block="appointment-booking"]) .rb-reg-row {
61127
60256
  display: flex;
61128
60257
  align-items: center;
61129
60258
  gap: 1rem;
61130
60259
  }
61131
60260
 
61132
- :where(.theme-scope) :where([data-block="event-registration"], [data-block="course-registration"], [data-block="appointment-booking"]) .rb-reg-row--between {
60261
+ :where(.theme-scope) :where([data-block="event-registration"], [data-block="appointment-booking"]) .rb-reg-row--between {
61133
60262
  justify-content: space-between;
61134
60263
  align-items: flex-start;
61135
60264
  }
61136
60265
 
61137
- :where(.theme-scope) :where([data-block="event-registration"], [data-block="course-registration"], [data-block="appointment-booking"]) .rb-reg-grid {
60266
+ :where(.theme-scope) :where([data-block="event-registration"], [data-block="appointment-booking"]) .rb-reg-grid {
61138
60267
  display: grid;
61139
60268
  gap: 0.75rem;
61140
60269
  }
61141
60270
 
61142
60271
  /* Summary box */
61143
- :where(.theme-scope) :where([data-block="event-registration"], [data-block="course-registration"], [data-block="appointment-booking"]) .rb-reg-summary {
60272
+ :where(.theme-scope) :where([data-block="event-registration"], [data-block="appointment-booking"]) .rb-reg-summary {
61144
60273
  padding: 1rem;
61145
60274
  border-radius: calc(var(--rb-reg-radius, var(--rb-block-radius, 1rem)) * 0.75);
61146
60275
  border: 1px solid var(--rb-reg-summary-border, rgb(var(--tb-border, 226 232 240)));
@@ -61148,7 +60277,7 @@ const containerResponsiveThemeCss = `/*
61148
60277
  }
61149
60278
 
61150
60279
  /* Skeleton shell lines */
61151
- :where(.theme-scope) :where([data-block="event-registration"], [data-block="course-registration"], [data-block="appointment-booking"]) .rb-shell-line {
60280
+ :where(.theme-scope) :where([data-block="event-registration"], [data-block="appointment-booking"]) .rb-shell-line {
61152
60281
  height: 0.75rem;
61153
60282
  border-radius: 9999px;
61154
60283
  background: linear-gradient(
@@ -61159,24 +60288,24 @@ const containerResponsiveThemeCss = `/*
61159
60288
  );
61160
60289
  }
61161
60290
 
61162
- :where(.theme-scope) :where([data-block="event-registration"], [data-block="course-registration"], [data-block="appointment-booking"]) .rb-shell-line--lg {
60291
+ :where(.theme-scope) :where([data-block="event-registration"], [data-block="appointment-booking"]) .rb-shell-line--lg {
61163
60292
  width: min(26rem, 82%);
61164
60293
  }
61165
60294
 
61166
- :where(.theme-scope) :where([data-block="event-registration"], [data-block="course-registration"], [data-block="appointment-booking"]) .rb-shell-line--md {
60295
+ :where(.theme-scope) :where([data-block="event-registration"], [data-block="appointment-booking"]) .rb-shell-line--md {
61167
60296
  width: min(19rem, 68%);
61168
60297
  }
61169
60298
 
61170
- :where(.theme-scope) :where([data-block="event-registration"], [data-block="course-registration"], [data-block="appointment-booking"]) .rb-shell-line--sm {
60299
+ :where(.theme-scope) :where([data-block="event-registration"], [data-block="appointment-booking"]) .rb-shell-line--sm {
61171
60300
  width: min(14rem, 52%);
61172
60301
  }
61173
60302
 
61174
- :where(.theme-scope) :where([data-block="event-registration"], [data-block="course-registration"], [data-block="appointment-booking"]) .rb-shell-line--xs {
60303
+ :where(.theme-scope) :where([data-block="event-registration"], [data-block="appointment-booking"]) .rb-shell-line--xs {
61175
60304
  width: min(10rem, 42%);
61176
60305
  }
61177
60306
 
61178
60307
  /* Skeleton block (rectangular placeholder, pulses) */
61179
- :where(.theme-scope) :where([data-block="event-registration"], [data-block="course-registration"], [data-block="appointment-booking"]) .rb-shell-block {
60308
+ :where(.theme-scope) :where([data-block="event-registration"], [data-block="appointment-booking"]) .rb-shell-block {
61180
60309
  height: 2.5rem;
61181
60310
  width: 100%;
61182
60311
  border-radius: var(--rb-reg-radius, var(--rb-block-radius, 1rem));
@@ -61194,7 +60323,7 @@ const containerResponsiveThemeCss = `/*
61194
60323
  }
61195
60324
 
61196
60325
  @media (prefers-reduced-motion: reduce) {
61197
- :where(.theme-scope) :where([data-block="event-registration"], [data-block="course-registration"], [data-block="appointment-booking"]) .rb-shell-block {
60326
+ :where(.theme-scope) :where([data-block="event-registration"], [data-block="appointment-booking"]) .rb-shell-block {
61198
60327
  animation: none;
61199
60328
  }
61200
60329
  }
@@ -67576,1648 +66705,337 @@ const containerResponsiveThemeCss = `/*
67576
66705
  cursor: not-allowed;
67577
66706
  }
67578
66707
 
67579
- /*
67580
- * Course Details (runtime node)
67581
- * Minimal rules - most styling via rb-* utilities
66708
+ /* =============================================================================
66709
+ * Block: Newsletter Signup
66710
+ * =============================================================================
67582
66711
  */
67583
66712
 
67584
- :where(.theme-scope) .course-details {
67585
- width: 100%;
67586
- max-width: 56.25rem; /* 900px */
67587
- margin-inline: auto;
66713
+ /* Newsletter copy styling */
66714
+ :where(.theme-scope) :where([data-block="newsletter-signup"]) .newsletter-copy-title {
66715
+ font-size: 1.5rem;
66716
+ font-weight: 600;
67588
66717
  }
67589
66718
 
67590
- /* Description prose wrapper */
67591
- :where(.theme-scope) .course-details .cd-description {
67592
- margin-top: 1rem;
66719
+ :where(.theme-scope) :where([data-block="newsletter-signup"]) .newsletter-copy-subtitle {
66720
+ font-size: 1rem;
66721
+ color: var(--rb-surface-text-color, rgb(var(--tb-text, 17 24 39)));
66722
+ opacity: 0.85;
67593
66723
  }
67594
66724
 
67595
- /* "Showing X of Y" text */
67596
- :where(.theme-scope) .course-details .cd-sessions__more {
67597
- margin-top: 0.5rem;
67598
- opacity: 0.7;
67599
- font-size: 0.875rem;
66725
+ /* Newsletter form container */
66726
+ :where(.theme-scope) .newsletter-form {
66727
+ width: 100%;
66728
+ max-width: 32rem;
66729
+ margin-left: auto;
66730
+ margin-right: auto;
67600
66731
  }
67601
66732
 
67602
- /* Enrollment status colors (using Tier 3 vars) */
67603
- :where(.theme-scope) .course-details .cd-enrollment--open {
67604
- color: var(--cd-enrollment-open-text);
66733
+ /* Newsletter form fields container */
66734
+ :where(.theme-scope) .newsletter-form-fields {
66735
+ display: flex;
66736
+ flex-direction: column;
66737
+ gap: var(--rb-gap-sm, 0.75rem);
67605
66738
  }
67606
66739
 
67607
- :where(.theme-scope) .course-details .cd-enrollment--closed {
67608
- color: var(--cd-enrollment-closed-text);
66740
+ /* Individual field styling */
66741
+ :where(.theme-scope) .newsletter-field {
66742
+ display: flex;
66743
+ flex-direction: column;
66744
+ gap: 0.25rem;
67609
66745
  }
67610
66746
 
67611
- /* =============================================================================
67612
- * Block: Event whole-series registration
67613
- * Keep rules minimal and theme-driven; class names are prefixed with \`er-whole-series-\`.
67614
- * =============================================================================
67615
- */
67616
-
67617
- /* Block-local surface text tokens for cards/modals that sit on theme surface. */
67618
- :where(.theme-scope)
67619
- :where(
67620
- [data-block='event-registration'],
67621
- [data-block='course-registration']
67622
- ) {
67623
- --er-on-surface: rgb(var(--tb-onSurface, var(--tb-text)));
67624
- --er-on-surface-hover-bg: rgba(var(--tb-onSurface, var(--tb-text)), 0.05);
66747
+ /* Required indicator */
66748
+ :where(.theme-scope) .newsletter-required {
66749
+ color: rgb(var(--tb-primary));
66750
+ margin-left: 0.125rem;
67625
66751
  }
67626
66752
 
67627
- /* Container: base styling comes from the shared .rb-reg-surface
67628
- (registration-surface.css); these overrides preserve whole-series
67629
- whole-series registration's established look (fixed padding, centered). */
67630
- :where(.theme-scope)
67631
- :where([data-block='event-registration'], [data-block='course-registration'])
67632
- .er-whole-series-container {
67633
- padding: 1.5rem;
67634
- margin-inline: auto;
66753
+ /* Submit button container */
66754
+ :where(.theme-scope) .newsletter-submit {
66755
+ margin-top: 0.5rem;
67635
66756
  }
67636
66757
 
67637
- /* Empty/unavailable */
67638
- :where(.theme-scope)
67639
- :where([data-block='event-registration'], [data-block='course-registration'])
67640
- .er-whole-series-empty {
67641
- border-radius: var(--rb-block-radius);
67642
- border: 1px dashed rgba(var(--tb-foreground), 0.2);
67643
- padding: 2.5rem;
67644
- text-align: center;
66758
+ /* ALTCHA widget container */
66759
+ :where(.theme-scope) .newsletter-altcha {
66760
+ margin-top: 0.75rem;
66761
+ display: flex;
66762
+ justify-content: center;
67645
66763
  }
67646
66764
 
67647
- :where(.theme-scope)
67648
- :where([data-block='event-registration'], [data-block='course-registration'])
67649
- .er-whole-series-empty__text {
67650
- opacity: 0.7;
66765
+ /* Privacy note */
66766
+ :where(.theme-scope) .newsletter-privacy-note {
66767
+ margin-top: 0.75rem;
66768
+ font-size: 1rem;
66769
+ line-height: 1.6;
66770
+ color: var(--rb-surface-text-color, rgb(var(--tb-text, 17 24 39)));
66771
+ text-align: center;
67651
66772
  }
67652
66773
 
67653
66774
  /* =============================================================================
67654
- * Layout (two-column)
66775
+ * Inline Variant - Horizontal layout
67655
66776
  * =============================================================================
67656
66777
  */
67657
- :where(.theme-scope)
67658
- :where([data-block='event-registration'], [data-block='course-registration'])
67659
- .er-whole-series-layout {
67660
- display: grid;
67661
- gap: 1.5rem;
67662
- grid-template-columns: 1fr;
67663
- }
67664
66778
 
67665
- @container rb-site (min-width: 768px) {
67666
- @scope ([data-rb-responsive-mode="container"]) to (:scope [data-rb-responsive-mode]) {
67667
- :where(.theme-scope)
67668
- :where(
67669
- [data-block='event-registration'],
67670
- [data-block='course-registration']
67671
- )
67672
- .er-whole-series-layout--with-sidebar {
67673
- grid-template-columns: 1fr 280px;
67674
- }
67675
- }
66779
+ :where(.theme-scope) .newsletter-inline .newsletter-form-fields {
66780
+ flex-direction: row;
66781
+ align-items: flex-end;
66782
+ flex-wrap: wrap;
66783
+ gap: var(--rb-gap-sm, 0.75rem);
67676
66784
  }
67677
66785
 
67678
- :where(.theme-scope)
67679
- :where([data-block='event-registration'], [data-block='course-registration'])
67680
- .er-whole-series-layout__main {
67681
- min-width: 0;
66786
+ :where(.theme-scope) .newsletter-inline .newsletter-field {
66787
+ flex: 1 1 auto;
66788
+ min-width: 10rem;
67682
66789
  }
67683
66790
 
67684
- :where(.theme-scope)
67685
- :where([data-block='event-registration'], [data-block='course-registration'])
67686
- .er-whole-series-layout__sidebar {
67687
- display: none;
66791
+ :where(.theme-scope) .newsletter-inline .newsletter-submit {
66792
+ margin-top: 0;
66793
+ flex-shrink: 0;
67688
66794
  }
67689
66795
 
67690
- @container rb-site (min-width: 768px) {
66796
+ /* Mobile fallback for inline variant */
66797
+ @container rb-site (max-width: 640px) {
67691
66798
  @scope ([data-rb-responsive-mode="container"]) to (:scope [data-rb-responsive-mode]) {
67692
- :where(.theme-scope)
67693
- :where(
67694
- [data-block='event-registration'],
67695
- [data-block='course-registration']
67696
- )
67697
- .er-whole-series-layout__sidebar {
67698
- display: block;
66799
+ :where(.theme-scope) .newsletter-inline .newsletter-form-fields {
66800
+ flex-direction: column;
66801
+ }
66802
+
66803
+ :where(.theme-scope) .newsletter-inline .newsletter-field {
66804
+ min-width: 100%;
67699
66805
  }
67700
66806
  }
67701
66807
  }
67702
66808
 
67703
66809
  /* =============================================================================
67704
- * Step Indicator
66810
+ * Editorial Split Variant
67705
66811
  * =============================================================================
67706
66812
  */
67707
- :where(.theme-scope)
67708
- :where([data-block='event-registration'], [data-block='course-registration'])
67709
- .er-whole-series-steps {
67710
- display: flex;
67711
- align-items: center;
67712
- gap: 0.5rem;
67713
- margin-bottom: 1.5rem;
67714
- }
67715
66813
 
67716
- :where(.theme-scope)
67717
- :where([data-block='event-registration'], [data-block='course-registration'])
67718
- .er-whole-series-step {
67719
- display: flex;
66814
+ :where(.theme-scope) .newsletter-editorial-split {
66815
+ display: grid;
66816
+ grid-template-columns: minmax(0, 0.9fr) minmax(20rem, 1.1fr);
66817
+ gap: clamp(2.5rem, 7vw, 7rem);
67720
66818
  align-items: center;
67721
- gap: 0.5rem;
66819
+ text-align: left;
67722
66820
  }
67723
66821
 
67724
- :where(.theme-scope)
67725
- :where([data-block='event-registration'], [data-block='course-registration'])
67726
- .er-whole-series-step-circle {
67727
- width: 1.75rem;
67728
- height: 1.75rem;
67729
- border-radius: 9999px;
66822
+ :where(.theme-scope) .newsletter-editorial-split-copy {
67730
66823
  display: flex;
67731
- align-items: center;
67732
- justify-content: center;
67733
- font-size: 0.75rem;
67734
- font-weight: 600;
67735
- background: var(--er-step-inactive);
67736
- color: var(--er-step-text);
67737
- transition: background-color 0.2s ease;
66824
+ flex-direction: column;
66825
+ gap: var(--rb-gap-sm, 0.75rem);
67738
66826
  }
67739
66827
 
67740
- :where(.theme-scope)
67741
- :where([data-block='event-registration'], [data-block='course-registration'])
67742
- .er-whole-series-step-circle--active {
67743
- background: var(--er-step-active);
67744
- color: var(--er-step-text-active);
66828
+ :where(.theme-scope) .newsletter-editorial-split-form {
66829
+ min-width: 0;
67745
66830
  }
67746
66831
 
67747
- :where(.theme-scope)
67748
- :where([data-block='event-registration'], [data-block='course-registration'])
67749
- .er-whole-series-step-circle--completed {
67750
- background: var(--er-step-completed);
67751
- color: var(--er-step-text);
66832
+ :where(.theme-scope) .newsletter-editorial-split .newsletter-form {
66833
+ max-width: none;
66834
+ margin-inline: 0;
67752
66835
  }
67753
66836
 
67754
- :where(.theme-scope)
67755
- :where([data-block='event-registration'], [data-block='course-registration'])
67756
- .er-whole-series-step-label {
67757
- font-size: 0.875rem;
66837
+ :where(.theme-scope) .newsletter-editorial-split .newsletter-copy-title {
66838
+ font-size: clamp(2rem, 4vw, 3.5rem);
67758
66839
  font-weight: 500;
67759
- color: rgb(var(--tb-mutedText));
67760
- display: none;
67761
66840
  }
67762
66841
 
67763
- @container rb-site (min-width: 640px) {
66842
+ :where(.theme-scope) .newsletter-editorial-split .newsletter-privacy-note {
66843
+ text-align: left;
66844
+ }
66845
+
66846
+ @container rb-site (max-width: 767px) {
67764
66847
  @scope ([data-rb-responsive-mode="container"]) to (:scope [data-rb-responsive-mode]) {
67765
- :where(.theme-scope)
67766
- :where(
67767
- [data-block='event-registration'],
67768
- [data-block='course-registration']
67769
- )
67770
- .er-whole-series-step-label {
67771
- display: block;
66848
+ :where(.theme-scope) .newsletter-editorial-split {
66849
+ grid-template-columns: minmax(0, 1fr);
66850
+ gap: 2rem;
67772
66851
  }
67773
66852
  }
67774
66853
  }
67775
66854
 
67776
- :where(.theme-scope)
67777
- :where([data-block='event-registration'], [data-block='course-registration'])
67778
- .er-whole-series-step-label--active {
67779
- color: var(--er-on-surface);
67780
- font-weight: 600;
67781
- }
67782
-
67783
- :where(.theme-scope)
67784
- :where([data-block='event-registration'], [data-block='course-registration'])
67785
- .er-whole-series-step-connector {
67786
- flex: 1;
67787
- height: 2px;
67788
- background: var(--er-step-connector);
67789
- min-width: 1rem;
67790
- }
66855
+ /* =============================================================================
66856
+ * Success State
66857
+ * =============================================================================
66858
+ */
67791
66859
 
67792
- :where(.theme-scope)
67793
- :where([data-block='event-registration'], [data-block='course-registration'])
67794
- .er-whole-series-step-connector--completed {
67795
- background: var(--er-step-completed);
66860
+ :where(.theme-scope) .newsletter-success {
66861
+ text-align: center;
67796
66862
  }
67797
66863
 
67798
- :where(.theme-scope)
67799
- :where([data-block='event-registration'], [data-block='course-registration'])
67800
- .er-whole-series-step-check {
67801
- width: 0.875rem;
67802
- height: 0.875rem;
66864
+ :where(.theme-scope) .newsletter-success .fb-success {
66865
+ padding: 1rem 1.5rem;
66866
+ background-color: rgba(var(--tb-success, 34 197 94), 0.1);
66867
+ border-radius: var(--radius-md, 0.5rem);
66868
+ color: rgb(var(--tb-text));
67803
66869
  }
67804
66870
 
67805
66871
  /* =============================================================================
67806
- * Lists
66872
+ * Block: Contact + Newsletter
67807
66873
  * =============================================================================
67808
66874
  */
67809
- :where(.theme-scope)
67810
- :where([data-block='event-registration'], [data-block='course-registration'])
67811
- .er-whole-series-run-list {
66875
+
66876
+ :where(.theme-scope) :where([data-block="contact-newsletter"]) .contact-newsletter-grid {
67812
66877
  display: grid;
67813
- gap: 1rem;
66878
+ grid-template-columns: repeat(auto-fit, minmax(min(24rem, 100%), 1fr));
66879
+ gap: clamp(2.5rem, 6vw, 4rem);
66880
+ align-items: start;
67814
66881
  }
67815
66882
 
67816
- /* =============================================================================
67817
- * Run cards
67818
- * =============================================================================
67819
- */
67820
- :where(.theme-scope)
67821
- :where([data-block='event-registration'], [data-block='course-registration'])
67822
- .er-whole-series-run-card {
67823
- border-radius: var(--rb-block-radius);
67824
- border: 1px solid var(--er-border);
67825
- padding: 1rem;
67826
- background: rgb(var(--tb-background));
67827
- cursor: pointer;
67828
- transition:
67829
- border-color var(--rb-block-transition) ease,
67830
- transform var(--rb-block-transition) ease;
66883
+ :where(.theme-scope) :where([data-block="contact-newsletter"]) .contact-newsletter-column {
66884
+ min-width: 0;
67831
66885
  }
67832
66886
 
67833
- :where(.theme-scope)
67834
- :where([data-block='event-registration'], [data-block='course-registration'])
67835
- .er-whole-series-run-card:hover {
67836
- border-color: var(--er-border-hover);
67837
- transform: translateY(-1px);
66887
+ :where(.theme-scope) :where([data-block="contact-newsletter"]) .contact-newsletter-copy {
66888
+ margin-bottom: 1.5rem;
67838
66889
  }
67839
66890
 
67840
- :where(.theme-scope)
67841
- :where([data-block='event-registration'], [data-block='course-registration'])
67842
- .er-whole-series-run-card:focus-visible {
67843
- outline: 2px solid var(--er-focus-ring);
67844
- outline-offset: 2px;
66891
+ :where(.theme-scope) :where([data-block="contact-newsletter"]) .form-copy-title,
66892
+ :where(.theme-scope) :where([data-block="contact-newsletter"]) .newsletter-copy-title {
66893
+ margin: 0 0 0.75rem;
67845
66894
  }
67846
66895
 
67847
- :where(.theme-scope)
67848
- :where([data-block='event-registration'], [data-block='course-registration'])
67849
- .er-whole-series-run-card--selected {
67850
- border-color: var(--er-border-selected);
67851
- box-shadow: 0 0 0 3px var(--er-focus-ring);
66896
+ :where(.theme-scope) :where([data-block="contact-newsletter"]) .form-copy-intro,
66897
+ :where(.theme-scope) :where([data-block="contact-newsletter"]) .newsletter-copy-subtitle {
66898
+ color: var(--rb-surface-text-color, rgb(var(--tb-text, 17 24 39)));
67852
66899
  }
67853
66900
 
67854
- :where(.theme-scope)
67855
- :where([data-block='event-registration'], [data-block='course-registration'])
67856
- .er-whole-series-run-card__title {
67857
- margin: 0 0 0.25rem 0;
67858
- font-weight: 700;
67859
- font-size: 1.125rem;
66901
+ :where(.theme-scope) :where([data-block="contact-newsletter"]) .contact-newsletter-info {
66902
+ display: flex;
66903
+ flex-direction: column;
66904
+ align-items: flex-start;
67860
66905
  }
67861
66906
 
67862
- :where(.theme-scope)
67863
- :where([data-block='event-registration'], [data-block='course-registration'])
67864
- .er-whole-series-run-card__status {
67865
- margin: 0.25rem 0 0 0;
67866
- opacity: 0.8;
66907
+ :where(.theme-scope) :where([data-block="contact-newsletter"]) .newsletter-form {
66908
+ max-width: none;
66909
+ margin-left: 0;
66910
+ margin-right: 0;
67867
66911
  }
67868
66912
 
67869
- :where(.theme-scope)
67870
- :where([data-block='event-registration'], [data-block='course-registration'])
67871
- .er-whole-series-run-card__sessions,
67872
- :where(.theme-scope)
67873
- :where([data-block='event-registration'], [data-block='course-registration'])
67874
- .er-whole-series-run-card__price,
67875
- :where(.theme-scope)
67876
- :where([data-block='event-registration'], [data-block='course-registration'])
67877
- .er-whole-series-run-card__capacity,
67878
- :where(.theme-scope)
67879
- :where([data-block='event-registration'], [data-block='course-registration'])
67880
- .er-whole-series-run-card__venue {
67881
- margin: 0.25rem 0 0 0;
67882
- opacity: 0.85;
66913
+ :where(.theme-scope) :where([data-block="contact-newsletter"]) .newsletter-privacy-note {
66914
+ text-align: left;
67883
66915
  }
67884
66916
 
67885
- /* =============================================================================
67886
- * Capacity Badges
67887
- * =============================================================================
67888
- */
67889
- :where(.theme-scope)
67890
- :where([data-block='event-registration'], [data-block='course-registration'])
67891
- .er-whole-series-capacity-badge {
67892
- display: inline-block;
67893
- padding: 0.125rem 0.5rem;
67894
- border-radius: 9999px;
67895
- font-size: 0.75rem;
67896
- font-weight: 500;
66917
+ :where(.theme-scope) :where([data-block="contact-newsletter"]) .fb-form {
66918
+ display: flex;
66919
+ flex-direction: column;
66920
+ gap: 1rem;
67897
66921
  }
67898
66922
 
67899
- :where(.theme-scope)
67900
- :where([data-block='event-registration'], [data-block='course-registration'])
67901
- .er-whole-series-capacity-badge--available {
67902
- background: var(--er-capacity-available-bg);
67903
- color: var(--er-capacity-available-text);
66923
+ :where(.theme-scope) :where([data-block="contact-newsletter"]) .fb-row-2 {
66924
+ display: grid;
66925
+ grid-template-columns: repeat(auto-fit, minmax(min(14rem, 100%), 1fr));
66926
+ gap: 1rem;
67904
66927
  }
67905
66928
 
67906
- :where(.theme-scope)
67907
- :where([data-block='event-registration'], [data-block='course-registration'])
67908
- .er-whole-series-capacity-badge--low {
67909
- background: var(--er-capacity-low-bg);
67910
- color: var(--er-capacity-low-text);
66929
+ :where(.theme-scope) :where([data-block="contact-newsletter"]) .fb-field {
66930
+ display: flex;
66931
+ flex-direction: column;
66932
+ gap: 0.25rem;
67911
66933
  }
67912
66934
 
67913
- :where(.theme-scope)
67914
- :where([data-block='event-registration'], [data-block='course-registration'])
67915
- .er-whole-series-capacity-badge--soldout {
67916
- background: var(--er-capacity-soldout-bg);
67917
- color: var(--er-capacity-soldout-text);
66935
+ :where(.theme-scope) :where([data-block="contact-newsletter"]) .fb-fieldset {
66936
+ display: flex;
66937
+ flex-direction: column;
66938
+ gap: 0.5rem;
66939
+ border: none;
66940
+ padding: 0;
66941
+ margin: 0;
67918
66942
  }
67919
66943
 
67920
- /* =============================================================================
67921
- * Summary + Details
67922
- * =============================================================================
67923
- */
67924
- :where(.theme-scope)
67925
- :where([data-block='event-registration'], [data-block='course-registration'])
67926
- .er-whole-series-details {
67927
- display: grid;
67928
- gap: 1rem;
66944
+ :where(.theme-scope) :where([data-block="contact-newsletter"]) .fb-inline {
66945
+ display: flex;
66946
+ align-items: center;
66947
+ gap: 0.5rem;
67929
66948
  }
67930
66949
 
67931
- :where(.theme-scope)
67932
- :where([data-block='event-registration'], [data-block='course-registration'])
67933
- .er-whole-series-summary {
66950
+ :where(.theme-scope) :where([data-block="contact-newsletter"]) .fb-success,
66951
+ :where(.theme-scope) :where([data-block="contact-newsletter"]) .fb-error,
66952
+ :where(.theme-scope) :where([data-block="contact-newsletter"]) .fb-empty {
67934
66953
  border-radius: var(--rb-block-radius);
67935
- border: 1px solid var(--er-summary-border);
67936
66954
  padding: 1rem;
67937
- background: var(--er-summary-bg);
67938
- }
67939
-
67940
- :where(.theme-scope)
67941
- :where([data-block='event-registration'], [data-block='course-registration'])
67942
- .er-whole-series-summary__title {
67943
- margin: 0;
67944
- font-size: 1.25rem;
67945
- font-weight: 800;
66955
+ font-size: 0.875rem;
67946
66956
  }
67947
66957
 
67948
- :where(.theme-scope)
67949
- :where([data-block='event-registration'], [data-block='course-registration'])
67950
- .er-whole-series-summary__sessions-title {
67951
- margin: 0.75rem 0 0.5rem 0;
67952
- font-weight: 700;
66958
+ :where(.theme-scope) :where([data-block="contact-newsletter"]) .fb-success {
66959
+ background-color: var(--fb-success-bg);
66960
+ color: var(--fb-success-text);
66961
+ border: 1px solid var(--fb-success-border);
67953
66962
  }
67954
66963
 
67955
- :where(.theme-scope)
67956
- :where([data-block='event-registration'], [data-block='course-registration'])
67957
- .er-whole-series-summary__sessions-list {
67958
- list-style: none;
67959
- padding: 0;
67960
- margin: 0;
67961
- display: grid;
67962
- gap: 0.35rem;
66964
+ :where(.theme-scope) :where([data-block="contact-newsletter"]) .fb-error {
66965
+ background-color: var(--fb-error-bg);
66966
+ color: var(--fb-error-text);
66967
+ border: 1px solid var(--fb-error-border);
67963
66968
  }
67964
66969
 
67965
- :where(.theme-scope)
67966
- :where([data-block='event-registration'], [data-block='course-registration'])
67967
- .er-whole-series-summary__session {
67968
- opacity: 0.9;
66970
+ :where(.theme-scope) :where([data-block="contact-newsletter"]) .fb-empty {
66971
+ background-color: var(--fb-empty-bg);
66972
+ color: var(--fb-empty-text);
66973
+ border: 1px dashed var(--fb-empty-border);
66974
+ text-align: center;
67969
66975
  }
67970
66976
 
67971
- :where(.theme-scope)
67972
- :where([data-block='event-registration'], [data-block='course-registration'])
67973
- .er-whole-series-summary__venue,
67974
- :where(.theme-scope)
67975
- :where([data-block='event-registration'], [data-block='course-registration'])
67976
- .er-whole-series-summary__price,
67977
- :where(.theme-scope)
67978
- :where([data-block='event-registration'], [data-block='course-registration'])
67979
- .er-whole-series-summary__membership {
67980
- margin: 0.5rem 0 0 0;
67981
- opacity: 0.9;
66977
+ :where(.theme-scope) :where([data-block="contact-newsletter"]) .fb-actions {
66978
+ margin-top: 0.5rem;
67982
66979
  }
67983
66980
 
67984
66981
  /* =============================================================================
67985
- * Form
66982
+ * Block: Team Members
67986
66983
  * =============================================================================
66984
+ *
66985
+ * Site/theme authors sometimes need different thumbnail shapes/sizes without
66986
+ * changing global fragment defaults. We expose these controls on the block and
66987
+ * style them via data attributes on the \`.rb-team-members\` wrapper.
67987
66988
  */
67988
- :where(.theme-scope)
67989
- :where([data-block='event-registration'], [data-block='course-registration'])
67990
- .er-whole-series-form {
67991
- display: grid;
67992
- gap: 1rem;
67993
- }
67994
66989
 
67995
- :where(.theme-scope)
67996
- :where([data-block='event-registration'], [data-block='course-registration'])
67997
- .er-whole-series-form__field {
67998
- display: grid;
67999
- gap: 0.35rem;
66990
+ /* Scope all block-static CSS to ThemeScope to avoid leaking into host apps/dashboard. */
66991
+ :where(.theme-scope) :where([data-block="team-members"]) :where(.rb-team-members[data-layout-align="left"]) {
66992
+ text-align: left;
68000
66993
  }
68001
66994
 
68002
- :where(.theme-scope)
68003
- :where([data-block='event-registration'], [data-block='course-registration'])
68004
- .er-whole-series-form__label {
68005
- font-size: 0.875rem;
68006
- font-weight: 600;
66995
+ :where(.theme-scope) :where([data-block="team-members"]) :where(.rb-team-members[data-layout-align="left"]) :where(.rb-team-member) {
66996
+ align-items: flex-start;
66997
+ text-align: left;
68007
66998
  }
68008
66999
 
68009
- :where(.theme-scope)
68010
- :where([data-block='event-registration'], [data-block='course-registration'])
68011
- .er-whole-series-form__label--required::after {
68012
- content: ' *';
68013
- color: var(--er-required);
67000
+ @container rb-site (min-width: 1024px) {
67001
+ @scope ([data-rb-responsive-mode="container"]) to (:scope [data-rb-responsive-mode]) {
67002
+ :where(.theme-scope) :where([data-block="team-members"]) :where(.rb-team-members[data-layout-width="lg-3-4-left"]) {
67003
+ width: 75%;
67004
+ margin-left: 0;
67005
+ margin-right: auto;
67006
+ }
67007
+ }
68014
67008
  }
68015
67009
 
68016
- :where(.theme-scope)
68017
- :where([data-block='event-registration'], [data-block='course-registration'])
68018
- .er-whole-series-form__input {
68019
- border-radius: calc(var(--rb-block-radius) * 0.6);
68020
- border: 1px solid var(--er-border);
68021
- padding: 0.6rem 0.75rem;
68022
- background: rgb(var(--tb-background));
68023
- color: rgb(var(--tb-foreground));
67010
+ :where(.theme-scope) :where([data-block="team-members"]) .rb-team-member-photo {
67011
+ display: block;
67012
+ width: 100%;
67013
+ height: auto;
68024
67014
  }
68025
67015
 
68026
- :where(.theme-scope)
68027
- :where([data-block='event-registration'], [data-block='course-registration'])
68028
- .er-whole-series-form__textarea {
68029
- border-radius: calc(var(--rb-block-radius) * 0.6);
68030
- border: 1px solid var(--er-border);
68031
- padding: 0.6rem 0.75rem;
68032
- background: rgb(var(--tb-background));
68033
- color: rgb(var(--tb-foreground));
68034
- resize: vertical;
67016
+ :where(.theme-scope) :where([data-block="team-members"]) .rb-team-member-role {
67017
+ font-weight: 600;
68035
67018
  }
68036
67019
 
68037
- :where(.theme-scope)
68038
- :where([data-block='event-registration'], [data-block='course-registration'])
68039
- .er-whole-series-form__input:focus,
68040
- :where(.theme-scope)
68041
- :where([data-block='event-registration'], [data-block='course-registration'])
68042
- .er-whole-series-form__textarea:focus {
68043
- outline: 2px solid var(--er-focus-ring);
68044
- outline-offset: 2px;
67020
+ /* Thumbnail sizing: map \`data-image-col-size\` to a sensible max thumbnail width. */
67021
+ :where(.theme-scope) :where([data-block="team-members"]) :where(.rb-team-members) {
67022
+ --rb-team-thumb-max: 11.25rem; /* ~180px default */
67023
+ --rb-team-image-basis: 33.333%;
68045
67024
  }
68046
67025
 
68047
- :where(.theme-scope)
68048
- :where([data-block='event-registration'], [data-block='course-registration'])
68049
- .er-whole-series-form__input--error,
68050
- :where(.theme-scope)
68051
- :where([data-block='event-registration'], [data-block='course-registration'])
68052
- .er-whole-series-form__textarea.er-whole-series-form__input--error {
68053
- border-color: var(--er-border-error);
67026
+ :where(.theme-scope) :where([data-block="team-members"]) :where(.rb-team-members[data-image-col-size="1/4"]) {
67027
+ --rb-team-thumb-max: 8.75rem; /* ~140px */
67028
+ --rb-team-image-basis: 25%;
68054
67029
  }
68055
67030
 
68056
- :where(.theme-scope)
68057
- :where([data-block='event-registration'], [data-block='course-registration'])
68058
- .er-whole-series-form__error {
68059
- font-size: 0.875rem;
68060
- color: var(--er-error-text);
67031
+ :where(.theme-scope) :where([data-block="team-members"]) :where(.rb-team-members[data-image-col-size="1/3"]) {
67032
+ --rb-team-thumb-max: 11.25rem; /* ~180px */
67033
+ --rb-team-image-basis: 33.333%;
68061
67034
  }
68062
67035
 
68063
- :where(.theme-scope)
68064
- :where([data-block='event-registration'], [data-block='course-registration'])
68065
- .er-whole-series-form__hint {
68066
- font-size: 0.875rem;
68067
- opacity: 0.7;
68068
- }
68069
-
68070
- /* Logged-in user hint with logout link */
68071
- :where(.theme-scope)
68072
- :where([data-block='event-registration'], [data-block='course-registration'])
68073
- .er-whole-series-logged-in-hint {
68074
- font-size: 0.875rem;
68075
- opacity: 0.7;
68076
- margin: 0.25rem 0 0 0;
68077
- }
68078
-
68079
- :where(.theme-scope)
68080
- :where([data-block='event-registration'], [data-block='course-registration'])
68081
- .er-whole-series-link {
68082
- background: none;
68083
- border: none;
68084
- padding: 0;
68085
- font-size: inherit;
68086
- color: rgb(var(--tb-primary));
68087
- cursor: pointer;
68088
- text-decoration: underline;
68089
- text-underline-offset: 2px;
68090
- }
68091
-
68092
- :where(.theme-scope)
68093
- :where([data-block='event-registration'], [data-block='course-registration'])
68094
- .er-whole-series-link:hover {
68095
- text-decoration: none;
68096
- }
68097
-
68098
- /* =============================================================================
68099
- * Actions
68100
- * =============================================================================
68101
- */
68102
- :where(.theme-scope)
68103
- :where([data-block='event-registration'], [data-block='course-registration'])
68104
- .er-whole-series-actions {
68105
- display: flex;
68106
- align-items: center;
68107
- justify-content: space-between;
68108
- gap: 0.75rem;
68109
- margin-top: 0.25rem;
68110
- }
68111
-
68112
- :where(.theme-scope)
68113
- :where([data-block='event-registration'], [data-block='course-registration'])
68114
- .er-whole-series-back-btn {
68115
- border: 0;
68116
- background: transparent;
68117
- color: var(--er-on-surface);
68118
- opacity: 0.8;
68119
- padding: 0.25rem 0.25rem;
68120
- cursor: pointer;
68121
- }
68122
-
68123
- :where(.theme-scope)
68124
- :where([data-block='event-registration'], [data-block='course-registration'])
68125
- .er-whole-series-back-btn:hover {
68126
- opacity: 1;
68127
- text-decoration: underline;
68128
- }
68129
-
68130
- /* =============================================================================
68131
- * Payment Options
68132
- * =============================================================================
68133
- */
68134
- :where(.theme-scope)
68135
- :where([data-block='event-registration'], [data-block='course-registration'])
68136
- .er-whole-series-payment__options {
68137
- display: grid;
68138
- gap: 0.5rem;
68139
- }
68140
-
68141
- :where(.theme-scope)
68142
- :where([data-block='event-registration'], [data-block='course-registration'])
68143
- .er-whole-series-payment__option {
68144
- display: flex;
68145
- align-items: center;
68146
- gap: 0.5rem;
68147
- }
68148
-
68149
- /* =============================================================================
68150
- * Payment Tiles (Card Grid)
68151
- * =============================================================================
68152
- */
68153
- :where(.theme-scope)
68154
- :where([data-block='event-registration'], [data-block='course-registration'])
68155
- .er-whole-series-payment-tiles {
68156
- display: grid;
68157
- grid-template-columns: repeat(auto-fill, minmax(200px, 1fr));
68158
- gap: 0.75rem;
68159
- }
68160
-
68161
- :where(.theme-scope)
68162
- :where([data-block='event-registration'], [data-block='course-registration'])
68163
- .er-whole-series-payment-tile {
68164
- border-radius: var(--rb-block-radius);
68165
- border: 1px solid var(--er-payment-border);
68166
- padding: 1rem;
68167
- background: rgb(var(--tb-background));
68168
- cursor: pointer;
68169
- transition:
68170
- border-color 0.15s ease,
68171
- box-shadow 0.15s ease,
68172
- background-color 0.15s ease;
68173
- position: relative;
68174
- }
68175
-
68176
- :where(.theme-scope)
68177
- :where([data-block='event-registration'], [data-block='course-registration'])
68178
- .er-whole-series-payment-tile:hover {
68179
- border-color: var(--er-payment-border-hover);
68180
- }
68181
-
68182
- :where(.theme-scope)
68183
- :where([data-block='event-registration'], [data-block='course-registration'])
68184
- .er-whole-series-payment-tile:focus-visible {
68185
- outline: 2px solid var(--er-focus-ring);
68186
- outline-offset: 2px;
68187
- }
68188
-
68189
- :where(.theme-scope)
68190
- :where([data-block='event-registration'], [data-block='course-registration'])
68191
- .er-whole-series-payment-tile--selected {
68192
- border-color: var(--er-payment-border-selected);
68193
- background: var(--er-payment-bg-selected);
68194
- box-shadow: 0 0 0 3px var(--er-focus-ring);
68195
- }
68196
-
68197
- :where(.theme-scope)
68198
- :where([data-block='event-registration'], [data-block='course-registration'])
68199
- .er-whole-series-payment-tile--upsell {
68200
- border-style: dashed;
68201
- }
68202
-
68203
- :where(.theme-scope)
68204
- :where([data-block='event-registration'], [data-block='course-registration'])
68205
- .er-whole-series-payment-tile__header {
68206
- display: flex;
68207
- align-items: flex-start;
68208
- justify-content: space-between;
68209
- gap: 0.5rem;
68210
- }
68211
-
68212
- :where(.theme-scope)
68213
- :where([data-block='event-registration'], [data-block='course-registration'])
68214
- .er-whole-series-payment-tile__name {
68215
- margin: 0;
68216
- font-weight: 600;
68217
- font-size: 1rem;
68218
- }
68219
-
68220
- :where(.theme-scope)
68221
- :where([data-block='event-registration'], [data-block='course-registration'])
68222
- .er-whole-series-payment-tile__description {
68223
- margin: 0.25rem 0 0 0;
68224
- font-size: 0.875rem;
68225
- opacity: 0.7;
68226
- }
68227
-
68228
- :where(.theme-scope)
68229
- :where([data-block='event-registration'], [data-block='course-registration'])
68230
- .er-whole-series-payment-tile__price {
68231
- font-weight: 600;
68232
- font-size: 0.875rem;
68233
- white-space: nowrap;
68234
- }
68235
-
68236
- :where(.theme-scope)
68237
- :where([data-block='event-registration'], [data-block='course-registration'])
68238
- .er-whole-series-payment-tile__badge {
68239
- display: inline-block;
68240
- padding: 0.125rem 0.5rem;
68241
- border-radius: 9999px;
68242
- font-size: 0.75rem;
68243
- font-weight: 500;
68244
- margin-top: 0.5rem;
68245
- }
68246
-
68247
- /* Checkmark indicator on selected tile */
68248
- :where(.theme-scope)
68249
- :where([data-block='event-registration'], [data-block='course-registration'])
68250
- .er-whole-series-payment-tile__check {
68251
- position: absolute;
68252
- top: 0.5rem;
68253
- right: 0.5rem;
68254
- width: 1.25rem;
68255
- height: 1.25rem;
68256
- border-radius: 9999px;
68257
- background: var(--er-check-bg);
68258
- color: var(--er-check-text);
68259
- display: flex;
68260
- align-items: center;
68261
- justify-content: center;
68262
- opacity: 0;
68263
- transition: opacity 0.15s ease;
68264
- }
68265
-
68266
- :where(.theme-scope)
68267
- :where([data-block='event-registration'], [data-block='course-registration'])
68268
- .er-whole-series-payment-tile--selected
68269
- .er-whole-series-payment-tile__check {
68270
- opacity: 1;
68271
- }
68272
-
68273
- /* =============================================================================
68274
- * Booking Mode Step
68275
- * =============================================================================
68276
- */
68277
- :where(.theme-scope)
68278
- :where([data-block='event-registration'], [data-block='course-registration'])
68279
- .er-whole-series-booking-mode {
68280
- display: grid;
68281
- gap: 1rem;
68282
- }
68283
-
68284
- :where(.theme-scope)
68285
- :where([data-block='event-registration'], [data-block='course-registration'])
68286
- .er-whole-series-booking-mode__title {
68287
- margin: 0;
68288
- font-size: var(--er-step-title-size);
68289
- font-weight: 700;
68290
- }
68291
-
68292
- :where(.theme-scope)
68293
- :where([data-block='event-registration'], [data-block='course-registration'])
68294
- .er-whole-series-booking-mode__subtitle {
68295
- margin: 0.25rem 0 0 0;
68296
- opacity: 0.7;
68297
- }
68298
-
68299
- :where(.theme-scope)
68300
- :where([data-block='event-registration'], [data-block='course-registration'])
68301
- .er-whole-series-booking-mode__link {
68302
- margin-top: 0.5rem;
68303
- font-size: 0.875rem;
68304
- }
68305
-
68306
- :where(.theme-scope)
68307
- :where([data-block='event-registration'], [data-block='course-registration'])
68308
- .er-whole-series-booking-mode__link
68309
- a {
68310
- color: rgb(var(--tb-primary));
68311
- text-decoration: underline;
68312
- cursor: pointer;
68313
- }
68314
-
68315
- :where(.theme-scope)
68316
- :where([data-block='event-registration'], [data-block='course-registration'])
68317
- .er-whole-series-booking-mode__link
68318
- a:hover {
68319
- text-decoration: none;
68320
- }
68321
-
68322
- /* =============================================================================
68323
- * Membership Hero
68324
- * =============================================================================
68325
- */
68326
- :where(.theme-scope)
68327
- :where([data-block='event-registration'], [data-block='course-registration'])
68328
- .er-whole-series-membership-hero {
68329
- border-radius: var(--rb-block-radius);
68330
- background: var(--er-success-bg);
68331
- border: 1px solid rgba(var(--tb-success), 0.2);
68332
- padding: 1.5rem;
68333
- text-align: center;
68334
- }
68335
-
68336
- :where(.theme-scope)
68337
- :where([data-block='event-registration'], [data-block='course-registration'])
68338
- .er-whole-series-membership-hero__icon {
68339
- font-size: 2rem;
68340
- margin-bottom: 0.75rem;
68341
- }
68342
-
68343
- :where(.theme-scope)
68344
- :where([data-block='event-registration'], [data-block='course-registration'])
68345
- .er-whole-series-membership-hero__title {
68346
- margin: 0;
68347
- font-size: 1.25rem;
68348
- font-weight: 700;
68349
- color: var(--er-success-text);
68350
- }
68351
-
68352
- :where(.theme-scope)
68353
- :where([data-block='event-registration'], [data-block='course-registration'])
68354
- .er-whole-series-membership-hero__subtitle {
68355
- margin: 0.25rem 0 0 0;
68356
- font-size: 0.875rem;
68357
- opacity: 0.8;
68358
- }
68359
-
68360
- /* =============================================================================
68361
- * Portal Auth Sidebar
68362
- * =============================================================================
68363
- */
68364
- :where(.theme-scope)
68365
- :where([data-block='event-registration'], [data-block='course-registration'])
68366
- .er-whole-series-portal-sidebar {
68367
- border-radius: var(--rb-block-radius);
68368
- border: 1px solid var(--er-border);
68369
- padding: 1.25rem;
68370
- background: rgb(var(--tb-surface));
68371
- color: var(--er-on-surface);
68372
- }
68373
-
68374
- :where(.theme-scope)
68375
- :where([data-block='event-registration'], [data-block='course-registration'])
68376
- .er-whole-series-portal-sidebar__icon {
68377
- font-size: 1.5rem;
68378
- margin-bottom: 0.5rem;
68379
- }
68380
-
68381
- :where(.theme-scope)
68382
- :where([data-block='event-registration'], [data-block='course-registration'])
68383
- .er-whole-series-portal-sidebar__title {
68384
- margin: 0;
68385
- font-size: 1rem;
68386
- font-weight: 600;
68387
- }
68388
-
68389
- :where(.theme-scope)
68390
- :where([data-block='event-registration'], [data-block='course-registration'])
68391
- .er-whole-series-portal-sidebar__text {
68392
- margin: 0.5rem 0 0 0;
68393
- font-size: 0.875rem;
68394
- opacity: 0.8;
68395
- }
68396
-
68397
- :where(.theme-scope)
68398
- :where([data-block='event-registration'], [data-block='course-registration'])
68399
- .er-whole-series-portal-sidebar__action {
68400
- margin-top: 1rem;
68401
- }
68402
-
68403
- :where(.theme-scope)
68404
- :where([data-block='event-registration'], [data-block='course-registration'])
68405
- .er-whole-series-portal-sidebar__link {
68406
- color: rgb(var(--tb-primary));
68407
- cursor: pointer;
68408
- text-decoration: underline;
68409
- font-size: 0.875rem;
68410
- }
68411
-
68412
- :where(.theme-scope)
68413
- :where([data-block='event-registration'], [data-block='course-registration'])
68414
- .er-whole-series-portal-sidebar__link:hover {
68415
- text-decoration: none;
68416
- }
68417
-
68418
- /* =============================================================================
68419
- * Modal (for Magic Link)
68420
- * =============================================================================
68421
- */
68422
- :where(.theme-scope)
68423
- :where([data-block='event-registration'], [data-block='course-registration'])
68424
- .er-whole-series-modal-overlay {
68425
- position: fixed;
68426
- inset: 0;
68427
- background: rgba(var(--tb-scrim), 0.5);
68428
- display: flex;
68429
- align-items: center;
68430
- justify-content: center;
68431
- z-index: 100;
68432
- animation: er-whole-series-fade-in 0.15s ease;
68433
- }
68434
-
68435
- :where(.theme-scope)
68436
- :where([data-block='event-registration'], [data-block='course-registration'])
68437
- .er-whole-series-modal {
68438
- background: rgb(var(--tb-surface));
68439
- color: var(--er-on-surface);
68440
- border-radius: var(--rb-block-radius);
68441
- padding: 1.5rem;
68442
- max-width: 28rem;
68443
- width: calc(100% - 2rem);
68444
- position: relative;
68445
- animation: er-whole-series-slide-up 0.2s ease;
68446
- }
68447
-
68448
- :where(.theme-scope)
68449
- :where([data-block='event-registration'], [data-block='course-registration'])
68450
- .er-whole-series-modal-close {
68451
- position: absolute;
68452
- top: 0.75rem;
68453
- right: 0.75rem;
68454
- background: transparent;
68455
- border: 0;
68456
- padding: 0.25rem;
68457
- cursor: pointer;
68458
- opacity: 0.6;
68459
- transition: opacity 0.15s ease;
68460
- }
68461
-
68462
- :where(.theme-scope)
68463
- :where([data-block='event-registration'], [data-block='course-registration'])
68464
- .er-whole-series-modal-close:hover {
68465
- opacity: 1;
68466
- }
68467
-
68468
- @keyframes er-whole-series-fade-in {
68469
- from {
68470
- opacity: 0;
68471
- }
68472
- to {
68473
- opacity: 1;
68474
- }
68475
- }
68476
-
68477
- @keyframes er-whole-series-slide-up {
68478
- from {
68479
- opacity: 0;
68480
- transform: translateY(10px);
68481
- }
68482
- to {
68483
- opacity: 1;
68484
- transform: translateY(0);
68485
- }
68486
- }
68487
-
68488
- /* Reduced motion */
68489
- @media (prefers-reduced-motion: reduce) {
68490
- :where(.theme-scope)
68491
- :where(
68492
- [data-block='event-registration'],
68493
- [data-block='course-registration']
68494
- )
68495
- .er-whole-series-modal-overlay,
68496
- :where(.theme-scope)
68497
- :where(
68498
- [data-block='event-registration'],
68499
- [data-block='course-registration']
68500
- )
68501
- .er-whole-series-modal {
68502
- animation: none;
68503
- }
68504
- }
68505
-
68506
- /* =============================================================================
68507
- * Center States
68508
- * =============================================================================
68509
- */
68510
- :where(.theme-scope)
68511
- :where([data-block='event-registration'], [data-block='course-registration'])
68512
- .er-whole-series-center {
68513
- display: grid;
68514
- place-items: center;
68515
- gap: 0.75rem;
68516
- padding: 2rem 0;
68517
- }
68518
-
68519
- /* =============================================================================
68520
- * Success/Waitlist/Error States
68521
- * =============================================================================
68522
- */
68523
- :where(.theme-scope)
68524
- :where([data-block='event-registration'], [data-block='course-registration'])
68525
- .er-whole-series-success,
68526
- :where(.theme-scope)
68527
- :where([data-block='event-registration'], [data-block='course-registration'])
68528
- .er-whole-series-waitlist,
68529
- :where(.theme-scope)
68530
- :where([data-block='event-registration'], [data-block='course-registration'])
68531
- .er-whole-series-error,
68532
- :where(.theme-scope)
68533
- :where([data-block='event-registration'], [data-block='course-registration'])
68534
- .er-whole-series-payment-failed {
68535
- text-align: center;
68536
- padding: 2rem 1rem;
68537
- }
68538
-
68539
- /* State icon color variants (layout from registration-surface.css) */
68540
- :where(.theme-scope)
68541
- :where([data-block='event-registration'], [data-block='course-registration'])
68542
- .rb-state-icon--success {
68543
- background: var(--er-success-bg);
68544
- color: var(--er-success-text);
68545
- }
68546
-
68547
- :where(.theme-scope)
68548
- :where([data-block='event-registration'], [data-block='course-registration'])
68549
- .rb-state-icon--error {
68550
- background: var(--er-error-bg);
68551
- color: var(--er-error-text);
68552
- }
68553
-
68554
- :where(.theme-scope)
68555
- :where([data-block='event-registration'], [data-block='course-registration'])
68556
- .rb-state-icon--waitlist,
68557
- :where(.theme-scope)
68558
- :where([data-block='event-registration'], [data-block='course-registration'])
68559
- .rb-state-icon--warning {
68560
- background: var(--er-waitlist-bg);
68561
- color: var(--er-waitlist-text);
68562
- }
68563
-
68564
- :where(.theme-scope)
68565
- :where([data-block='event-registration'], [data-block='course-registration'])
68566
- .er-whole-series-success__title,
68567
- :where(.theme-scope)
68568
- :where([data-block='event-registration'], [data-block='course-registration'])
68569
- .er-whole-series-waitlist__title,
68570
- :where(.theme-scope)
68571
- :where([data-block='event-registration'], [data-block='course-registration'])
68572
- .er-whole-series-error__title,
68573
- :where(.theme-scope)
68574
- :where([data-block='event-registration'], [data-block='course-registration'])
68575
- .er-whole-series-payment-failed__title {
68576
- margin: 0.75rem 0 0.5rem 0;
68577
- font-size: 1.125rem;
68578
- font-weight: 700;
68579
- }
68580
-
68581
- :where(.theme-scope)
68582
- :where([data-block='event-registration'], [data-block='course-registration'])
68583
- .er-whole-series-success__message,
68584
- :where(.theme-scope)
68585
- :where([data-block='event-registration'], [data-block='course-registration'])
68586
- .er-whole-series-waitlist__message,
68587
- :where(.theme-scope)
68588
- :where([data-block='event-registration'], [data-block='course-registration'])
68589
- .er-whole-series-error__message,
68590
- :where(.theme-scope)
68591
- :where([data-block='event-registration'], [data-block='course-registration'])
68592
- .er-whole-series-payment-failed__message {
68593
- margin: 0;
68594
- opacity: 0.7;
68595
- }
68596
-
68597
- :where(.theme-scope)
68598
- :where([data-block='event-registration'], [data-block='course-registration'])
68599
- .er-whole-series-success__membership {
68600
- margin-top: 0.5rem;
68601
- font-size: 0.875rem;
68602
- color: var(--er-success-text);
68603
- }
68604
-
68605
- :where(.theme-scope)
68606
- :where([data-block='event-registration'], [data-block='course-registration'])
68607
- .er-whole-series-error__retry,
68608
- :where(.theme-scope)
68609
- :where([data-block='event-registration'], [data-block='course-registration'])
68610
- .er-whole-series-payment-failed__retry {
68611
- margin-top: 1rem;
68612
- }
68613
-
68614
- /* =============================================================================
68615
- * Discount Code Section
68616
- * =============================================================================
68617
- */
68618
- :where(.theme-scope)
68619
- :where([data-block='event-registration'], [data-block='course-registration'])
68620
- .er-whole-series-discount {
68621
- margin-top: 0.5rem;
68622
- }
68623
-
68624
- :where(.theme-scope)
68625
- :where([data-block='event-registration'], [data-block='course-registration'])
68626
- .er-whole-series-discount__form {
68627
- display: grid;
68628
- gap: 0.5rem;
68629
- }
68630
-
68631
- :where(.theme-scope)
68632
- :where([data-block='event-registration'], [data-block='course-registration'])
68633
- .er-whole-series-discount__toggle {
68634
- background: transparent;
68635
- border: 0;
68636
- padding: 0;
68637
- color: rgb(var(--tb-primary));
68638
- cursor: pointer;
68639
- font-size: 0.875rem;
68640
- text-decoration: underline;
68641
- }
68642
-
68643
- :where(.theme-scope)
68644
- :where([data-block='event-registration'], [data-block='course-registration'])
68645
- .er-whole-series-discount__toggle:hover {
68646
- text-decoration: none;
68647
- }
68648
-
68649
- :where(.theme-scope)
68650
- :where([data-block='event-registration'], [data-block='course-registration'])
68651
- .er-whole-series-discount__label {
68652
- font-size: 0.875rem;
68653
- font-weight: 600;
68654
- }
68655
-
68656
- :where(.theme-scope)
68657
- :where([data-block='event-registration'], [data-block='course-registration'])
68658
- .er-whole-series-discount__row {
68659
- display: flex;
68660
- gap: 0.5rem;
68661
- }
68662
-
68663
- :where(.theme-scope)
68664
- :where([data-block='event-registration'], [data-block='course-registration'])
68665
- .er-whole-series-discount__input {
68666
- flex: 1;
68667
- border-radius: calc(var(--rb-block-radius) * 0.6);
68668
- border: 1px solid var(--er-border);
68669
- padding: 0.5rem 0.75rem;
68670
- background: rgb(var(--tb-background));
68671
- color: rgb(var(--tb-foreground));
68672
- font-size: 0.875rem;
68673
- }
68674
-
68675
- :where(.theme-scope)
68676
- :where([data-block='event-registration'], [data-block='course-registration'])
68677
- .er-whole-series-discount__input:focus {
68678
- outline: 2px solid var(--er-focus-ring);
68679
- outline-offset: 2px;
68680
- }
68681
-
68682
- :where(.theme-scope)
68683
- :where([data-block='event-registration'], [data-block='course-registration'])
68684
- .er-whole-series-discount__remove {
68685
- background: transparent;
68686
- border: 0;
68687
- padding: 0.25rem;
68688
- cursor: pointer;
68689
- opacity: 0.6;
68690
- }
68691
-
68692
- :where(.theme-scope)
68693
- :where([data-block='event-registration'], [data-block='course-registration'])
68694
- .er-whole-series-discount__apply {
68695
- background: transparent;
68696
- border: 0;
68697
- padding: 0.25rem;
68698
- cursor: pointer;
68699
- opacity: 0.8;
68700
- }
68701
-
68702
- :where(.theme-scope)
68703
- :where([data-block='event-registration'], [data-block='course-registration'])
68704
- .er-whole-series-discount__remove:hover {
68705
- opacity: 1;
68706
- }
68707
-
68708
- :where(.theme-scope)
68709
- :where([data-block='event-registration'], [data-block='course-registration'])
68710
- .er-whole-series-discount__apply:hover {
68711
- opacity: 1;
68712
- }
68713
-
68714
- :where(.theme-scope)
68715
- :where([data-block='event-registration'], [data-block='course-registration'])
68716
- .er-whole-series-discount__hint {
68717
- margin: 0;
68718
- font-size: 0.875rem;
68719
- opacity: 0.7;
68720
- }
68721
-
68722
- :where(.theme-scope)
68723
- :where([data-block='event-registration'], [data-block='course-registration'])
68724
- .er-whole-series-discount__feedback {
68725
- margin: 0;
68726
- font-size: 0.875rem;
68727
- }
68728
-
68729
- /* =============================================================================
68730
- * Altcha (Spam Protection)
68731
- * =============================================================================
68732
- */
68733
- :where(.theme-scope)
68734
- :where([data-block='event-registration'], [data-block='course-registration'])
68735
- .er-whole-series-altcha {
68736
- margin-top: 1rem;
68737
- }
68738
-
68739
- /* =============================================================================
68740
- * Magic Link Form
68741
- * =============================================================================
68742
- */
68743
- :where(.theme-scope)
68744
- :where([data-block='event-registration'], [data-block='course-registration'])
68745
- .er-whole-series-magic-link-form {
68746
- display: flex;
68747
- flex-direction: column;
68748
- gap: 0.75rem;
68749
- }
68750
-
68751
- :where(.theme-scope)
68752
- :where([data-block='event-registration'], [data-block='course-registration'])
68753
- .er-whole-series-magic-link-title {
68754
- margin: 0;
68755
- font-size: 1.25rem;
68756
- font-weight: 700;
68757
- }
68758
-
68759
- :where(.theme-scope)
68760
- :where([data-block='event-registration'], [data-block='course-registration'])
68761
- .er-whole-series-magic-link-success {
68762
- display: flex;
68763
- flex-direction: column;
68764
- gap: 0.75rem;
68765
- }
68766
-
68767
- :where(.theme-scope)
68768
- :where([data-block='event-registration'], [data-block='course-registration'])
68769
- .er-whole-series-portal-auth-text {
68770
- margin: 0;
68771
- font-size: 0.875rem;
68772
- opacity: 0.8;
68773
- }
68774
-
68775
- :where(.theme-scope)
68776
- :where([data-block='event-registration'], [data-block='course-registration'])
68777
- .er-whole-series-portal-auth-text--success {
68778
- color: var(--er-success-text);
68779
- }
68780
-
68781
- :where(.theme-scope)
68782
- :where([data-block='event-registration'], [data-block='course-registration'])
68783
- .er-whole-series-portal-auth-text--error {
68784
- color: var(--er-error-text);
68785
- }
68786
-
68787
- :where(.theme-scope)
68788
- :where([data-block='event-registration'], [data-block='course-registration'])
68789
- .er-whole-series-modal-btn {
68790
- border-radius: calc(var(--rb-block-radius) * 0.6);
68791
- border: 0;
68792
- padding: 0.6rem 1rem;
68793
- font-size: 0.875rem;
68794
- font-weight: 600;
68795
- cursor: pointer;
68796
- transition: opacity 0.15s ease;
68797
- background: rgb(var(--tb-primary));
68798
- color: rgb(var(--tb-primaryText, 255 255 255));
68799
- }
68800
-
68801
- :where(.theme-scope)
68802
- :where([data-block='event-registration'], [data-block='course-registration'])
68803
- .er-whole-series-modal-btn:hover {
68804
- opacity: 0.9;
68805
- }
68806
-
68807
- :where(.theme-scope)
68808
- :where([data-block='event-registration'], [data-block='course-registration'])
68809
- .er-whole-series-modal-btn:disabled {
68810
- opacity: 0.5;
68811
- cursor: not-allowed;
68812
- }
68813
-
68814
- :where(.theme-scope)
68815
- :where([data-block='event-registration'], [data-block='course-registration'])
68816
- .er-whole-series-modal-btn--secondary {
68817
- background: transparent;
68818
- color: var(--er-on-surface);
68819
- border: 1px solid var(--er-border);
68820
- }
68821
-
68822
- :where(.theme-scope)
68823
- :where([data-block='event-registration'], [data-block='course-registration'])
68824
- .er-whole-series-modal-btn--secondary:hover {
68825
- background: var(--er-on-surface-hover-bg);
68826
- }
68827
-
68828
- /* =============================================================================
68829
- * Utility Classes
68830
- * =============================================================================
68831
- */
68832
- :where(.theme-scope)
68833
- :where([data-block='event-registration'], [data-block='course-registration'])
68834
- .er-whole-series-text--muted {
68835
- opacity: 0.7;
68836
- }
68837
-
68838
- :where(.theme-scope)
68839
- :where([data-block='event-registration'], [data-block='course-registration'])
68840
- .er-whole-series-text--error {
68841
- color: var(--er-error-text);
68842
- }
68843
-
68844
- :where(.theme-scope)
68845
- :where([data-block='event-registration'], [data-block='course-registration'])
68846
- .er-whole-series-text--success {
68847
- color: var(--er-success-text);
68848
- }
68849
-
68850
- :where(.theme-scope)
68851
- :where([data-block='event-registration'], [data-block='course-registration'])
68852
- .er-whole-series-sr-only {
68853
- position: absolute;
68854
- width: 1px;
68855
- height: 1px;
68856
- padding: 0;
68857
- margin: -1px;
68858
- overflow: hidden;
68859
- clip: rect(0, 0, 0, 0);
68860
- white-space: nowrap;
68861
- border-width: 0;
68862
- }
68863
-
68864
- /* Stack utility */
68865
- :where(.theme-scope)
68866
- :where([data-block='event-registration'], [data-block='course-registration'])
68867
- .er-whole-series-stack {
68868
- display: flex;
68869
- flex-direction: column;
68870
- }
68871
-
68872
- :where(.theme-scope)
68873
- :where([data-block='event-registration'], [data-block='course-registration'])
68874
- .er-whole-series-stack--gap-sm {
68875
- gap: 0.5rem;
68876
- }
68877
-
68878
- :where(.theme-scope)
68879
- :where([data-block='event-registration'], [data-block='course-registration'])
68880
- .er-whole-series-stack--gap-md {
68881
- gap: 1rem;
68882
- }
68883
-
68884
- :where(.theme-scope)
68885
- :where([data-block='event-registration'], [data-block='course-registration'])
68886
- .er-whole-series-stack--gap-lg {
68887
- gap: 1.5rem;
68888
- }
68889
-
68890
- /* =============================================================================
68891
- * Block: Newsletter Signup
68892
- * =============================================================================
68893
- */
68894
-
68895
- /* Newsletter copy styling */
68896
- :where(.theme-scope) :where([data-block="newsletter-signup"]) .newsletter-copy-title {
68897
- font-size: 1.5rem;
68898
- font-weight: 600;
68899
- }
68900
-
68901
- :where(.theme-scope) :where([data-block="newsletter-signup"]) .newsletter-copy-subtitle {
68902
- font-size: 1rem;
68903
- color: var(--rb-surface-text-color, rgb(var(--tb-text, 17 24 39)));
68904
- opacity: 0.85;
68905
- }
68906
-
68907
- /* Newsletter form container */
68908
- :where(.theme-scope) .newsletter-form {
68909
- width: 100%;
68910
- max-width: 32rem;
68911
- margin-left: auto;
68912
- margin-right: auto;
68913
- }
68914
-
68915
- /* Newsletter form fields container */
68916
- :where(.theme-scope) .newsletter-form-fields {
68917
- display: flex;
68918
- flex-direction: column;
68919
- gap: var(--rb-gap-sm, 0.75rem);
68920
- }
68921
-
68922
- /* Individual field styling */
68923
- :where(.theme-scope) .newsletter-field {
68924
- display: flex;
68925
- flex-direction: column;
68926
- gap: 0.25rem;
68927
- }
68928
-
68929
- /* Required indicator */
68930
- :where(.theme-scope) .newsletter-required {
68931
- color: rgb(var(--tb-primary));
68932
- margin-left: 0.125rem;
68933
- }
68934
-
68935
- /* Submit button container */
68936
- :where(.theme-scope) .newsletter-submit {
68937
- margin-top: 0.5rem;
68938
- }
68939
-
68940
- /* ALTCHA widget container */
68941
- :where(.theme-scope) .newsletter-altcha {
68942
- margin-top: 0.75rem;
68943
- display: flex;
68944
- justify-content: center;
68945
- }
68946
-
68947
- /* Privacy note */
68948
- :where(.theme-scope) .newsletter-privacy-note {
68949
- margin-top: 0.75rem;
68950
- font-size: 1rem;
68951
- line-height: 1.6;
68952
- color: var(--rb-surface-text-color, rgb(var(--tb-text, 17 24 39)));
68953
- text-align: center;
68954
- }
68955
-
68956
- /* =============================================================================
68957
- * Inline Variant - Horizontal layout
68958
- * =============================================================================
68959
- */
68960
-
68961
- :where(.theme-scope) .newsletter-inline .newsletter-form-fields {
68962
- flex-direction: row;
68963
- align-items: flex-end;
68964
- flex-wrap: wrap;
68965
- gap: var(--rb-gap-sm, 0.75rem);
68966
- }
68967
-
68968
- :where(.theme-scope) .newsletter-inline .newsletter-field {
68969
- flex: 1 1 auto;
68970
- min-width: 10rem;
68971
- }
68972
-
68973
- :where(.theme-scope) .newsletter-inline .newsletter-submit {
68974
- margin-top: 0;
68975
- flex-shrink: 0;
68976
- }
68977
-
68978
- /* Mobile fallback for inline variant */
68979
- @container rb-site (max-width: 640px) {
68980
- @scope ([data-rb-responsive-mode="container"]) to (:scope [data-rb-responsive-mode]) {
68981
- :where(.theme-scope) .newsletter-inline .newsletter-form-fields {
68982
- flex-direction: column;
68983
- }
68984
-
68985
- :where(.theme-scope) .newsletter-inline .newsletter-field {
68986
- min-width: 100%;
68987
- }
68988
- }
68989
- }
68990
-
68991
- /* =============================================================================
68992
- * Editorial Split Variant
68993
- * =============================================================================
68994
- */
68995
-
68996
- :where(.theme-scope) .newsletter-editorial-split {
68997
- display: grid;
68998
- grid-template-columns: minmax(0, 0.9fr) minmax(20rem, 1.1fr);
68999
- gap: clamp(2.5rem, 7vw, 7rem);
69000
- align-items: center;
69001
- text-align: left;
69002
- }
69003
-
69004
- :where(.theme-scope) .newsletter-editorial-split-copy {
69005
- display: flex;
69006
- flex-direction: column;
69007
- gap: var(--rb-gap-sm, 0.75rem);
69008
- }
69009
-
69010
- :where(.theme-scope) .newsletter-editorial-split-form {
69011
- min-width: 0;
69012
- }
69013
-
69014
- :where(.theme-scope) .newsletter-editorial-split .newsletter-form {
69015
- max-width: none;
69016
- margin-inline: 0;
69017
- }
69018
-
69019
- :where(.theme-scope) .newsletter-editorial-split .newsletter-copy-title {
69020
- font-size: clamp(2rem, 4vw, 3.5rem);
69021
- font-weight: 500;
69022
- }
69023
-
69024
- :where(.theme-scope) .newsletter-editorial-split .newsletter-privacy-note {
69025
- text-align: left;
69026
- }
69027
-
69028
- @container rb-site (max-width: 767px) {
69029
- @scope ([data-rb-responsive-mode="container"]) to (:scope [data-rb-responsive-mode]) {
69030
- :where(.theme-scope) .newsletter-editorial-split {
69031
- grid-template-columns: minmax(0, 1fr);
69032
- gap: 2rem;
69033
- }
69034
- }
69035
- }
69036
-
69037
- /* =============================================================================
69038
- * Success State
69039
- * =============================================================================
69040
- */
69041
-
69042
- :where(.theme-scope) .newsletter-success {
69043
- text-align: center;
69044
- }
69045
-
69046
- :where(.theme-scope) .newsletter-success .fb-success {
69047
- padding: 1rem 1.5rem;
69048
- background-color: rgba(var(--tb-success, 34 197 94), 0.1);
69049
- border-radius: var(--radius-md, 0.5rem);
69050
- color: rgb(var(--tb-text));
69051
- }
69052
-
69053
- /* =============================================================================
69054
- * Block: Contact + Newsletter
69055
- * =============================================================================
69056
- */
69057
-
69058
- :where(.theme-scope) :where([data-block="contact-newsletter"]) .contact-newsletter-grid {
69059
- display: grid;
69060
- grid-template-columns: repeat(auto-fit, minmax(min(24rem, 100%), 1fr));
69061
- gap: clamp(2.5rem, 6vw, 4rem);
69062
- align-items: start;
69063
- }
69064
-
69065
- :where(.theme-scope) :where([data-block="contact-newsletter"]) .contact-newsletter-column {
69066
- min-width: 0;
69067
- }
69068
-
69069
- :where(.theme-scope) :where([data-block="contact-newsletter"]) .contact-newsletter-copy {
69070
- margin-bottom: 1.5rem;
69071
- }
69072
-
69073
- :where(.theme-scope) :where([data-block="contact-newsletter"]) .form-copy-title,
69074
- :where(.theme-scope) :where([data-block="contact-newsletter"]) .newsletter-copy-title {
69075
- margin: 0 0 0.75rem;
69076
- }
69077
-
69078
- :where(.theme-scope) :where([data-block="contact-newsletter"]) .form-copy-intro,
69079
- :where(.theme-scope) :where([data-block="contact-newsletter"]) .newsletter-copy-subtitle {
69080
- color: var(--rb-surface-text-color, rgb(var(--tb-text, 17 24 39)));
69081
- }
69082
-
69083
- :where(.theme-scope) :where([data-block="contact-newsletter"]) .contact-newsletter-info {
69084
- display: flex;
69085
- flex-direction: column;
69086
- align-items: flex-start;
69087
- }
69088
-
69089
- :where(.theme-scope) :where([data-block="contact-newsletter"]) .newsletter-form {
69090
- max-width: none;
69091
- margin-left: 0;
69092
- margin-right: 0;
69093
- }
69094
-
69095
- :where(.theme-scope) :where([data-block="contact-newsletter"]) .newsletter-privacy-note {
69096
- text-align: left;
69097
- }
69098
-
69099
- :where(.theme-scope) :where([data-block="contact-newsletter"]) .fb-form {
69100
- display: flex;
69101
- flex-direction: column;
69102
- gap: 1rem;
69103
- }
69104
-
69105
- :where(.theme-scope) :where([data-block="contact-newsletter"]) .fb-row-2 {
69106
- display: grid;
69107
- grid-template-columns: repeat(auto-fit, minmax(min(14rem, 100%), 1fr));
69108
- gap: 1rem;
69109
- }
69110
-
69111
- :where(.theme-scope) :where([data-block="contact-newsletter"]) .fb-field {
69112
- display: flex;
69113
- flex-direction: column;
69114
- gap: 0.25rem;
69115
- }
69116
-
69117
- :where(.theme-scope) :where([data-block="contact-newsletter"]) .fb-fieldset {
69118
- display: flex;
69119
- flex-direction: column;
69120
- gap: 0.5rem;
69121
- border: none;
69122
- padding: 0;
69123
- margin: 0;
69124
- }
69125
-
69126
- :where(.theme-scope) :where([data-block="contact-newsletter"]) .fb-inline {
69127
- display: flex;
69128
- align-items: center;
69129
- gap: 0.5rem;
69130
- }
69131
-
69132
- :where(.theme-scope) :where([data-block="contact-newsletter"]) .fb-success,
69133
- :where(.theme-scope) :where([data-block="contact-newsletter"]) .fb-error,
69134
- :where(.theme-scope) :where([data-block="contact-newsletter"]) .fb-empty {
69135
- border-radius: var(--rb-block-radius);
69136
- padding: 1rem;
69137
- font-size: 0.875rem;
69138
- }
69139
-
69140
- :where(.theme-scope) :where([data-block="contact-newsletter"]) .fb-success {
69141
- background-color: var(--fb-success-bg);
69142
- color: var(--fb-success-text);
69143
- border: 1px solid var(--fb-success-border);
69144
- }
69145
-
69146
- :where(.theme-scope) :where([data-block="contact-newsletter"]) .fb-error {
69147
- background-color: var(--fb-error-bg);
69148
- color: var(--fb-error-text);
69149
- border: 1px solid var(--fb-error-border);
69150
- }
69151
-
69152
- :where(.theme-scope) :where([data-block="contact-newsletter"]) .fb-empty {
69153
- background-color: var(--fb-empty-bg);
69154
- color: var(--fb-empty-text);
69155
- border: 1px dashed var(--fb-empty-border);
69156
- text-align: center;
69157
- }
69158
-
69159
- :where(.theme-scope) :where([data-block="contact-newsletter"]) .fb-actions {
69160
- margin-top: 0.5rem;
69161
- }
69162
-
69163
- /* =============================================================================
69164
- * Block: Team Members
69165
- * =============================================================================
69166
- *
69167
- * Site/theme authors sometimes need different thumbnail shapes/sizes without
69168
- * changing global fragment defaults. We expose these controls on the block and
69169
- * style them via data attributes on the \`.rb-team-members\` wrapper.
69170
- */
69171
-
69172
- /* Scope all block-static CSS to ThemeScope to avoid leaking into host apps/dashboard. */
69173
- :where(.theme-scope) :where([data-block="team-members"]) :where(.rb-team-members[data-layout-align="left"]) {
69174
- text-align: left;
69175
- }
69176
-
69177
- :where(.theme-scope) :where([data-block="team-members"]) :where(.rb-team-members[data-layout-align="left"]) :where(.rb-team-member) {
69178
- align-items: flex-start;
69179
- text-align: left;
69180
- }
69181
-
69182
- @container rb-site (min-width: 1024px) {
69183
- @scope ([data-rb-responsive-mode="container"]) to (:scope [data-rb-responsive-mode]) {
69184
- :where(.theme-scope) :where([data-block="team-members"]) :where(.rb-team-members[data-layout-width="lg-3-4-left"]) {
69185
- width: 75%;
69186
- margin-left: 0;
69187
- margin-right: auto;
69188
- }
69189
- }
69190
- }
69191
-
69192
- :where(.theme-scope) :where([data-block="team-members"]) .rb-team-member-photo {
69193
- display: block;
69194
- width: 100%;
69195
- height: auto;
69196
- }
69197
-
69198
- :where(.theme-scope) :where([data-block="team-members"]) .rb-team-member-role {
69199
- font-weight: 600;
69200
- }
69201
-
69202
- /* Thumbnail sizing: map \`data-image-col-size\` to a sensible max thumbnail width. */
69203
- :where(.theme-scope) :where([data-block="team-members"]) :where(.rb-team-members) {
69204
- --rb-team-thumb-max: 11.25rem; /* ~180px default */
69205
- --rb-team-image-basis: 33.333%;
69206
- }
69207
-
69208
- :where(.theme-scope) :where([data-block="team-members"]) :where(.rb-team-members[data-image-col-size="1/4"]) {
69209
- --rb-team-thumb-max: 8.75rem; /* ~140px */
69210
- --rb-team-image-basis: 25%;
69211
- }
69212
-
69213
- :where(.theme-scope) :where([data-block="team-members"]) :where(.rb-team-members[data-image-col-size="1/3"]) {
69214
- --rb-team-thumb-max: 11.25rem; /* ~180px */
69215
- --rb-team-image-basis: 33.333%;
69216
- }
69217
-
69218
- :where(.theme-scope) :where([data-block="team-members"]) :where(.rb-team-members[data-image-col-size="2/5"]) {
69219
- --rb-team-thumb-max: 13.75rem; /* ~220px */
69220
- --rb-team-image-basis: 40%;
67036
+ :where(.theme-scope) :where([data-block="team-members"]) :where(.rb-team-members[data-image-col-size="2/5"]) {
67037
+ --rb-team-thumb-max: 13.75rem; /* ~220px */
67038
+ --rb-team-image-basis: 40%;
69221
67039
  }
69222
67040
 
69223
67041
  :where(.theme-scope) :where([data-block="team-members"]) :where(.rb-team-members[data-image-col-size="1/2"]) {
@@ -74467,69 +72285,8 @@ const ACCOUNT_ENDPOINT_DEFINITIONS = defineEndpointDefinitions({
74467
72285
  }
74468
72286
  });
74469
72287
  //#endregion
74470
- //#region ../api/src/courseEndpointDefinitions.ts
74471
- const COURSE_ENDPOINT_DEFINITIONS = defineEndpointDefinitions({
74472
- listCourses: {
74473
- path: "/sites/{siteId}/bookings/courses",
74474
- method: "GET",
74475
- auth: "user",
74476
- responseKind: "json"
74477
- },
74478
- exportCoursesCsv: {
74479
- path: "/sites/{siteId}/bookings/courses/export.csv",
74480
- method: "GET",
74481
- tags: [
74482
- "site-{siteId}",
74483
- "bookings",
74484
- "courses-{siteId}"
74485
- ],
74486
- errors: [],
74487
- auth: "user",
74488
- responseKind: "blob"
74489
- },
74490
- createCourse: {
74491
- path: "/sites/{siteId}/bookings/courses",
74492
- method: "POST",
74493
- auth: "user",
74494
- responseKind: "json",
74495
- errors: [
74496
- "validation:invalid_input",
74497
- "resource:not_found",
74498
- "resource:already_exists",
74499
- "resource:conflict",
74500
- "server:internal_error"
74501
- ]
74502
- },
74503
- getCourse: {
74504
- path: "/sites/{siteId}/bookings/courses/{courseId}",
74505
- method: "GET",
74506
- auth: "user",
74507
- responseKind: "json"
74508
- },
74509
- updateCourse: {
74510
- path: "/sites/{siteId}/bookings/courses/{courseId}",
74511
- method: "PATCH",
74512
- auth: "user",
74513
- responseKind: "json",
74514
- errors: [
74515
- "validation:invalid_input",
74516
- "resource:not_found",
74517
- "resource:conflict",
74518
- "server:internal_error"
74519
- ]
74520
- },
74521
- deleteCourse: {
74522
- path: "/sites/{siteId}/bookings/courses/{courseId}",
74523
- method: "DELETE",
74524
- auth: "user",
74525
- responseKind: "json",
74526
- errors: [
74527
- "validation:invalid_input",
74528
- "resource:not_found",
74529
- "resource:conflict",
74530
- "server:internal_error"
74531
- ]
74532
- },
72288
+ //#region ../api/src/eventSeriesRegistrationEndpointDefinitions.ts
72289
+ const EVENT_SERIES_REGISTRATION_ENDPOINT_DEFINITIONS = defineEndpointDefinitions({
74533
72290
  deleteEventOffering: {
74534
72291
  path: "/sites/{siteId}/bookings/event-offerings/{eventOfferingId}",
74535
72292
  method: "DELETE",
@@ -74542,20 +72299,8 @@ const COURSE_ENDPOINT_DEFINITIONS = defineEndpointDefinitions({
74542
72299
  "server:internal_error"
74543
72300
  ]
74544
72301
  },
74545
- duplicateCourse: {
74546
- path: "/sites/{siteId}/bookings/courses/{courseId}/duplicate",
74547
- method: "POST",
74548
- auth: "user",
74549
- responseKind: "json",
74550
- errors: [
74551
- "validation:invalid_input",
74552
- "resource:not_found",
74553
- "resource:already_exists",
74554
- "server:internal_error"
74555
- ]
74556
- },
74557
- changeCourseContentOwnership: {
74558
- path: "/sites/{siteId}/bookings/courses/{courseId}/content-ownership",
72302
+ changeEventSeriesContentOwnership: {
72303
+ path: "/sites/{siteId}/bookings/event-series/{seriesId}/content-ownership",
74559
72304
  method: "POST",
74560
72305
  auth: "user",
74561
72306
  responseKind: "json",
@@ -74566,8 +72311,8 @@ const COURSE_ENDPOINT_DEFINITIONS = defineEndpointDefinitions({
74566
72311
  "server:internal_error"
74567
72312
  ]
74568
72313
  },
74569
- addCourseEnrollment: {
74570
- path: "/sites/{siteId}/bookings/courses/{courseId}/enrollments",
72314
+ addEventSeriesRegistration: {
72315
+ path: "/sites/{siteId}/bookings/event-series/{seriesId}/registrations",
74571
72316
  method: "POST",
74572
72317
  auth: "user",
74573
72318
  responseKind: "json",
@@ -74578,33 +72323,21 @@ const COURSE_ENDPOINT_DEFINITIONS = defineEndpointDefinitions({
74578
72323
  "server:internal_error"
74579
72324
  ]
74580
72325
  },
74581
- listCourseEnrollments: {
74582
- path: "/sites/{siteId}/bookings/courses/{courseId}/enrollments",
72326
+ listEventSeriesRegistrations: {
72327
+ path: "/sites/{siteId}/bookings/event-series/{seriesId}/registrations",
74583
72328
  method: "GET",
74584
72329
  auth: "user",
74585
72330
  responseKind: "json"
74586
72331
  },
74587
- exportCourseEnrollmentsCsv: {
74588
- path: "/sites/{siteId}/bookings/courses/{courseId}/enrollments/export.csv",
72332
+ exportEventSeriesRegistrationsCsv: {
72333
+ path: "/sites/{siteId}/bookings/event-series/{seriesId}/registrations/export.csv",
74589
72334
  method: "GET",
74590
72335
  auth: "user",
74591
72336
  errors: [],
74592
72337
  responseKind: "blob"
74593
72338
  },
74594
- exportCourseWaitlistCsv: {
74595
- path: "/sites/{siteId}/bookings/courses/{courseId}/waitlist/export.csv",
74596
- method: "GET",
74597
- tags: [
74598
- "site-{siteId}",
74599
- "bookings",
74600
- "courses-{courseId}"
74601
- ],
74602
- auth: "user",
74603
- responseKind: "blob",
74604
- errors: []
74605
- },
74606
- updateCourseEnrollment: {
74607
- path: "/sites/{siteId}/bookings/courses/{courseId}/enrollments/{enrollmentId}",
72339
+ updateEventSeriesRegistration: {
72340
+ path: "/sites/{siteId}/bookings/event-series/{seriesId}/registrations/{registrationId}",
74608
72341
  method: "PATCH",
74609
72342
  auth: "user",
74610
72343
  responseKind: "json",
@@ -74992,71 +72725,35 @@ const PUBLIC_WHOLE_SERIES_ENDPOINT_DEFINITIONS = defineEndpointDefinitions({
74992
72725
  errors: ["resource:not_found", "server:internal_error"],
74993
72726
  auth: "public",
74994
72727
  responseKind: "json"
74995
- },
74996
- registerForWholeSeries: {
74997
- path: "/public/sites/{siteId}/dated-offerings/whole-series/enroll",
74998
- method: "POST",
74999
- tags: [TAG_TEMPLATES.publicWholeSeriesOfferings, "course-enrollment"],
75000
- errors: [
75001
- "auth:unauthenticated",
75002
- "auth:forbidden",
75003
- "validation:invalid_input",
75004
- "resource:not_found",
75005
- "resource:conflict",
75006
- "resource:already_exists",
75007
- "server:internal_error"
75008
- ],
75009
- auth: "public",
75010
- responseKind: "json"
75011
- },
75012
- checkWholeSeriesEligibility: {
75013
- path: "/public/sites/{siteId}/dated-offerings/whole-series/check-eligibility",
75014
- method: "POST",
75015
- tags: [TAG_TEMPLATES.publicWholeSeriesOfferings, "course-enrollment"],
75016
- errors: [
75017
- "auth:unauthenticated",
75018
- "resource:not_found",
75019
- "resource:conflict",
75020
- "server:internal_error"
75021
- ],
75022
- auth: "public",
75023
- responseKind: "json"
75024
- },
75025
- createWholeSeriesCheckout: {
75026
- path: "/public/sites/{siteId}/dated-offerings/whole-series/checkout",
72728
+ }
72729
+ });
72730
+ //#endregion
72731
+ //#region ../api/src/publicEventEndpointDefinitions.ts
72732
+ const PUBLIC_EVENT_ENDPOINT_DEFINITIONS = defineEndpointDefinitions({
72733
+ getPublicEventRegistrationOptions: {
72734
+ path: "/public/sites/{siteId}/events/registration-options",
75027
72735
  method: "POST",
75028
- tags: [TAG_TEMPLATES.publicWholeSeriesOfferings, "course-checkout"],
72736
+ tags: [TAG_TEMPLATES.publicEvents, "event-registration-options"],
75029
72737
  auth: "public",
75030
72738
  responseKind: "json",
75031
72739
  errors: [
75032
- "auth:unauthenticated",
75033
72740
  "validation:invalid_input",
75034
72741
  "resource:not_found",
75035
72742
  "resource:conflict",
75036
72743
  "server:internal_error"
75037
72744
  ]
75038
72745
  },
75039
- getWholeSeriesRegistrationStatus: {
75040
- path: "/public/sites/{siteId}/dated-offerings/whole-series/registration-status",
72746
+ resolveEventSubroute: {
72747
+ path: "/public/sites/{siteId}/events/subroutes/resolve",
75041
72748
  method: "GET",
75042
- tags: [TAG_TEMPLATES.publicWholeSeriesOfferings, "course-checkout"],
75043
- errors: ["resource:not_found", "server:internal_error"],
72749
+ revalidate: 60,
72750
+ tags: [TAG_TEMPLATES.publicEvents, "event-subroute"],
75044
72751
  auth: "public",
75045
- responseKind: "json"
72752
+ responseKind: "json",
72753
+ errors: []
75046
72754
  }
75047
72755
  });
75048
72756
  //#endregion
75049
- //#region ../api/src/publicEventEndpointDefinitions.ts
75050
- const PUBLIC_EVENT_ENDPOINT_DEFINITIONS = defineEndpointDefinitions({ resolveEventSubroute: {
75051
- path: "/public/sites/{siteId}/events/subroutes/resolve",
75052
- method: "GET",
75053
- revalidate: 60,
75054
- tags: [TAG_TEMPLATES.publicEvents, "event-subroute"],
75055
- auth: "public",
75056
- responseKind: "json",
75057
- errors: []
75058
- } });
75059
- //#endregion
75060
72757
  //#region ../api/src/siteApiKeyEndpointDefinitions.ts
75061
72758
  const SITE_API_KEY_ENDPOINT_DEFINITIONS = defineEndpointDefinitions({
75062
72759
  listSiteApiKeys: {
@@ -75424,7 +73121,7 @@ const SDK_ENDPOINT_DEFINITIONS = defineEndpointDefinitions({
75424
73121
  }), 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, {
75425
73122
  ...NEWSLETTER_ENDPOINT_DEFINITIONS,
75426
73123
  ...APPOINTMENT_ENDPOINT_DEFINITIONS,
75427
- ...COURSE_ENDPOINT_DEFINITIONS
73124
+ ...EVENT_SERIES_REGISTRATION_ENDPOINT_DEFINITIONS
75428
73125
  }, 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 };
75429
73126
  z$1.object({ refreshToken: z$1.string().min(1).max(4096) }).strict();
75430
73127
  z$1.object({
@@ -75546,7 +73243,7 @@ const internalLinkPayloadSchema = z$1.object({
75546
73243
  kind: z$1.literal("internal"),
75547
73244
  routeId: z$1.string().uuid(),
75548
73245
  entityId: z$1.string().uuid(),
75549
- entityType: z$1.enum(["page", "content"]),
73246
+ entityType: z$1.enum(RESOLVED_INTERNAL_LINK_ENTITY_TYPES),
75550
73247
  href: z$1.string().min(1),
75551
73248
  title: z$1.string().min(1),
75552
73249
  typeLabel: z$1.string().min(1),
@@ -76597,6 +74294,68 @@ function parsePublicProductCategorySelector(value) {
76597
74294
  };
76598
74295
  }
76599
74296
  //#endregion
74297
+ //#region ../api/src/bookingPaymentTermSchemas.ts
74298
+ const bookingDepositRefundPolicySchema = z$1.enum(["refundable", "non_refundable"]);
74299
+ const bookingInstalmentPlanSchema = z$1.discriminatedUnion("kind", [
74300
+ z$1.object({
74301
+ kind: z$1.literal("deposit_plus_one_remainder"),
74302
+ depositAmountCents: z$1.number().int().nonnegative(),
74303
+ depositRefundability: bookingDepositRefundPolicySchema,
74304
+ remainderDueCount: z$1.number().int().positive(),
74305
+ intervalUnit: z$1.enum([
74306
+ "day",
74307
+ "week",
74308
+ "month"
74309
+ ])
74310
+ }),
74311
+ z$1.object({
74312
+ kind: z$1.literal("deposit_plus_scheduled_instalments"),
74313
+ depositAmountCents: z$1.number().int().nonnegative(),
74314
+ depositRefundability: bookingDepositRefundPolicySchema,
74315
+ instalmentCount: z$1.number().int().positive(),
74316
+ intervalCount: z$1.number().int().positive(),
74317
+ intervalUnit: z$1.enum([
74318
+ "day",
74319
+ "week",
74320
+ "month"
74321
+ ])
74322
+ }),
74323
+ z$1.object({
74324
+ kind: z$1.literal("equal_scheduled_instalments"),
74325
+ instalmentCount: z$1.number().int().positive(),
74326
+ intervalCount: z$1.number().int().positive(),
74327
+ intervalUnit: z$1.enum([
74328
+ "day",
74329
+ "week",
74330
+ "month"
74331
+ ])
74332
+ })
74333
+ ]);
74334
+ const bookingFlexibleBalanceDueDateRuleSchema = z$1.discriminatedUnion("kind", [z$1.object({
74335
+ kind: z$1.literal("relative_to_start_date"),
74336
+ daysBeforeStart: z$1.number().int().positive()
74337
+ }), z$1.object({
74338
+ kind: z$1.literal("fixed_calendar_date"),
74339
+ dueAt: z$1.string().datetime()
74340
+ })]);
74341
+ const bookingFlexibleBalanceConfigSchema = z$1.object({
74342
+ upfrontAmountCents: z$1.number().int().nonnegative(),
74343
+ dueDateRule: bookingFlexibleBalanceDueDateRuleSchema,
74344
+ depositRefundability: bookingDepositRefundPolicySchema
74345
+ });
74346
+ z$1.discriminatedUnion("kind", [
74347
+ z$1.object({ kind: z$1.literal("upfront") }),
74348
+ z$1.object({ kind: z$1.literal("deferred_manual") }),
74349
+ z$1.object({
74350
+ kind: z$1.literal("instalment_plan"),
74351
+ plan: bookingInstalmentPlanSchema
74352
+ }),
74353
+ z$1.object({
74354
+ kind: z$1.literal("flexible_balance"),
74355
+ config: bookingFlexibleBalanceConfigSchema
74356
+ })
74357
+ ]);
74358
+ //#endregion
76600
74359
  //#region ../api/src/navigationMenuValidation.ts
76601
74360
  function hasChildren(item) {
76602
74361
  return Array.isArray(item.children) && item.children.length > 0;
@@ -78861,40 +76620,6 @@ const BUILTIN_CONTENT_TYPE_SCHEMAS = {
78861
76620
  plural: "Events"
78862
76621
  }
78863
76622
  },
78864
- course: {
78865
- version: 1,
78866
- fields: [
78867
- {
78868
- id: "summary",
78869
- type: "textarea",
78870
- label: "Summary",
78871
- description: "Short teaser shown in listings.",
78872
- rows: 3
78873
- },
78874
- {
78875
- id: "image",
78876
- type: "media",
78877
- label: "Listing image",
78878
- description: "Optional image used for course cards and previews."
78879
- },
78880
- {
78881
- id: "body",
78882
- type: "richText",
78883
- label: "Details",
78884
- description: "Full course details and curriculum."
78885
- }
78886
- ],
78887
- routing: {
78888
- enabled: true,
78889
- pattern: "/courses/{slug}",
78890
- slugField: "slug",
78891
- prefix: "/courses/"
78892
- },
78893
- labels: {
78894
- singular: "Course",
78895
- plural: "Courses"
78896
- }
78897
- },
78898
76623
  "team-member": {
78899
76624
  version: 1,
78900
76625
  fields: [
@@ -79094,7 +76819,7 @@ const BUILTIN_CONTENT_TYPE_SCHEMAS = {
79094
76819
  function deriveFieldIdSet(schema) {
79095
76820
  return new Set(schema.fields.map((f) => f.id));
79096
76821
  }
79097
- 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"]);
76822
+ 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"]);
79098
76823
  //#endregion
79099
76824
  //#region ../field-primitives/src/bindings/index.ts
79100
76825
  const BINDING_TRANSFORMS$1 = {
@@ -79177,7 +76902,6 @@ function selectBlocksForDeclaredEntrySlot(input) {
79177
76902
  //#region ../content-model/src/templates/defaults.ts
79178
76903
  const POST_EXCERPT_FALLBACK = fallbackBinding$1(fieldBinding$1("excerpt"), transformBinding$1(TEMPLATE_BINDING_TRANSFORMS.RICHTEXT_FIRST_PARAGRAPH, { input: fieldBinding$1("body") }));
79179
76904
  const EVENT_SUBHEADLINE_FALLBACK = fallbackBinding$1(fieldBinding$1("summary"), transformBinding$1(TEMPLATE_BINDING_TRANSFORMS.RICHTEXT_FIRST_PARAGRAPH, { input: fieldBinding$1("body") }));
79180
- const COURSE_SUMMARY_FALLBACK = fallbackBinding$1(fieldBinding$1("summary"), transformBinding$1(TEMPLATE_BINDING_TRANSFORMS.RICHTEXT_FIRST_PARAGRAPH, { input: fieldBinding$1("body") }));
79181
76905
  const ENTRY_TITLE_INLINE_TEXT = transformBinding$1(TEMPLATE_BINDING_TRANSFORMS.TEXT_INLINE_TEXT, { input: metaBinding$1("title") });
79182
76906
  const POST_BODY_TEXT_BINDINGS = {
79183
76907
  body: fieldBinding$1("body"),
@@ -79292,7 +77016,6 @@ const DEFAULT_TEMPLATE_DEFINITIONS = {
79292
77016
  showVenue: true,
79293
77017
  showCapacity: true,
79294
77018
  successMessage: "Thank you for registering! Check your email for confirmation details.",
79295
- waitlistMessage: "You've been added to the waitlist. We'll email you a claim link if a spot opens up.",
79296
77019
  buttonText: "Complete Registration",
79297
77020
  buttonVariant: "primary"
79298
77021
  },
@@ -79303,64 +77026,6 @@ const DEFAULT_TEMPLATE_DEFINITIONS = {
79303
77026
  }
79304
77027
  ]
79305
77028
  },
79306
- course: {
79307
- templateKey: "default",
79308
- name: "Course detail",
79309
- description: "Standard landing page for multi-session courses.",
79310
- metadata: {},
79311
- blocks: [
79312
- {
79313
- blockKind: "block.hero",
79314
- scope: "entry",
79315
- bindings: {
79316
- eyebrow: literalBinding$1("Course"),
79317
- headline: metaBinding$1("title"),
79318
- headlineInline: ENTRY_TITLE_INLINE_TEXT,
79319
- subheadline: COURSE_SUMMARY_FALLBACK
79320
- }
79321
- },
79322
- {
79323
- blockKind: "block.course-details",
79324
- scope: "entry",
79325
- content: {
79326
- heading: "Course details",
79327
- showTitle: false,
79328
- showDescription: false,
79329
- showSessions: true,
79330
- sessionsLimit: "10",
79331
- showVenue: true,
79332
- showPrice: true,
79333
- showCapacity: true,
79334
- showEnrollmentStatus: true,
79335
- showMembershipNote: true
79336
- }
79337
- },
79338
- {
79339
- blockKind: SYSTEM_ENTRY_SLOT_BLOCK_KIND,
79340
- scope: "template",
79341
- content: {
79342
- slotKey: "main",
79343
- label: "Page content"
79344
- }
79345
- },
79346
- {
79347
- blockKind: "block.course-registration",
79348
- scope: "entry",
79349
- content: {
79350
- heading: "Enroll in this course",
79351
- showSessions: true,
79352
- showPrice: true,
79353
- showCapacity: true,
79354
- showVenue: true,
79355
- successMessage: "You're enrolled! Check your email for confirmation and session details.",
79356
- waitlistMessage: "You've been added to the waitlist. We'll email you a claim link if a spot opens up.",
79357
- membershipMessage: "Enrolled using your membership! Check your email for session details.",
79358
- buttonText: "Complete Enrollment",
79359
- buttonVariant: "primary"
79360
- }
79361
- }
79362
- ]
79363
- },
79364
77029
  "team-member": {
79365
77030
  templateKey: "default",
79366
77031
  name: "Team member profile",