@riverbankcms/sdk 0.123.0 → 0.125.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 (263) hide show
  1. package/README.md +14 -9
  2. package/dist/{PreviewEditorSidebar-DvJFmC29.mjs → PreviewEditorSidebar-BezDOtQ7.mjs} +22 -39
  3. package/dist/{PreviewEditorUI-DVHP4bCo.mjs → PreviewEditorUI-CgSqmfo2.mjs} +3 -3
  4. package/dist/{PreviewQueryProvider-07EE4uWL.mjs → PreviewQueryProvider-BH-3-jSj.mjs} +1 -1
  5. package/dist/{SdkPreviewModeRuntime-BE5eFayo.mjs → SdkPreviewModeRuntime-Co3AHfj0.mjs} +1031 -1237
  6. package/dist/{SiteChromeCustomizeContext-4hn4A0HX.mjs → SiteChromeCustomizeContext-BHF-KANn.mjs} +1949 -2004
  7. package/dist/_dts/ai/src/contracts/proposals.d.ts +1236 -4152
  8. package/dist/_dts/api/src/accessAdmin.d.ts +2 -14
  9. package/dist/_dts/api/src/appointmentEndpointDefinitions.d.ts +435 -0
  10. package/dist/_dts/api/src/bookingClosures.d.ts +3 -3
  11. package/dist/_dts/api/src/bookingConfig.d.ts +72 -73
  12. package/dist/_dts/api/src/bookingManagementEndpoints.d.ts +26 -35
  13. package/dist/_dts/api/src/bookingRecords.d.ts +4 -15
  14. package/dist/_dts/api/src/bookingVerticalCatalog.d.ts +746 -0
  15. package/dist/_dts/api/src/bookingVerticalPreset.d.ts +38 -0
  16. package/dist/_dts/api/src/bookingVerticals.d.ts +11 -652
  17. package/dist/_dts/api/src/bookings.d.ts +11 -9
  18. package/dist/_dts/api/src/cache-tags.d.ts +2 -2
  19. package/dist/_dts/api/src/commercePortalEndpoints.d.ts +10 -10
  20. package/dist/_dts/api/src/common/envelope.d.ts +2 -0
  21. package/dist/_dts/api/src/contentRuntime.d.ts +0 -17
  22. package/dist/_dts/api/src/courseEndpointDefinitions.d.ts +99 -0
  23. package/dist/_dts/api/src/courses.d.ts +22 -33
  24. package/dist/_dts/api/src/defineEndpointDefinitions.d.ts +14 -0
  25. package/dist/_dts/api/src/demoMutationPolicies.d.ts +4 -0
  26. package/dist/_dts/api/src/endpoints.d.ts +3740 -3733
  27. package/dist/_dts/api/src/event-destination-policy.d.ts +1 -1
  28. package/dist/_dts/api/src/event-presentation.d.ts +4 -9
  29. package/dist/_dts/api/src/index.d.ts +9 -11
  30. package/dist/_dts/api/src/newsletterEndpointDefinitions.d.ts +376 -0
  31. package/dist/_dts/api/src/participantMessaging.d.ts +2 -2
  32. package/dist/_dts/api/src/public/endpoints.d.ts +1 -1
  33. package/dist/_dts/api/src/publicExperience/commerceEndpoints.d.ts +272 -0
  34. package/dist/_dts/api/src/publicExperience/eventEndpoints.d.ts +274 -0
  35. package/dist/_dts/api/src/publicExperience/newsletterEndpoints.d.ts +31 -0
  36. package/dist/_dts/api/src/publicExperience/sharedTypes.d.ts +152 -0
  37. package/dist/_dts/api/src/publicExperience/siteEndpoints.d.ts +95 -0
  38. package/dist/_dts/api/src/publicExperience/wholeSeriesEndpoints.d.ts +154 -0
  39. package/dist/_dts/api/src/publicExperienceEndpoints.d.ts +10 -962
  40. package/dist/_dts/api/src/publicWholeSeriesEndpointDefinitions.d.ts +52 -0
  41. package/dist/_dts/api/src/sdkContracts.d.ts +0 -51
  42. package/dist/_dts/api/src/sdkEntryReadEndpoints.d.ts +23 -0
  43. package/dist/_dts/api/src/siteAccessAdmin.d.ts +23 -0
  44. package/dist/_dts/api/src/sitePlatformEndpoints.d.ts +1 -38
  45. package/dist/_dts/api/src/siteRuntimeEndpoints.d.ts +3 -4
  46. package/dist/_dts/billing/src/plans/types.d.ts +24 -5
  47. package/dist/_dts/blocks/src/PageRenderer.d.ts +4 -15
  48. package/dist/_dts/blocks/src/contracts/index.d.ts +1 -1
  49. package/dist/_dts/blocks/src/contracts/non-block-islands.d.ts +4 -16
  50. package/dist/_dts/blocks/src/contracts/proof-block-islands.d.ts +8 -222
  51. package/dist/_dts/blocks/src/portal/types.d.ts +3 -3
  52. package/dist/_dts/blocks/src/subroutes/fold.d.ts +1 -14
  53. package/dist/_dts/blocks/src/subroutes/index.d.ts +1 -1
  54. package/dist/_dts/blocks/src/subroutes/kinds.d.ts +3 -3
  55. package/dist/_dts/blocks/src/system/blocks/course-details.d.ts +0 -11
  56. package/dist/_dts/blocks/src/system/blocks/course-registration.d.ts +3 -4
  57. package/dist/_dts/blocks/src/system/blocks/courses/shared/pricing.d.ts +1 -1
  58. package/dist/_dts/blocks/src/system/blocks/courses/shared/schemas.d.ts +401 -12
  59. package/dist/_dts/blocks/src/system/blocks/courses/shared/types.d.ts +9 -10
  60. package/dist/_dts/blocks/src/system/blocks/events/event-calendar.d.ts +14 -13
  61. package/dist/_dts/blocks/src/system/blocks/events/event-listing.d.ts +1 -2
  62. package/dist/_dts/blocks/src/system/blocks/events/shared/filtering.d.ts +1 -4
  63. package/dist/_dts/blocks/src/system/blocks/events/shared/schemas.d.ts +19 -18
  64. package/dist/_dts/blocks/src/system/blocks/events/shared/types.d.ts +9 -11
  65. package/dist/_dts/blocks/src/system/blocks/offerings-preview/model.d.ts +2 -2
  66. package/dist/_dts/blocks/src/system/data/loaderEndpoints.d.ts +1 -1
  67. package/dist/_dts/blocks/src/system/runtime/api/client.d.ts +10 -10
  68. package/dist/_dts/blocks/src/system/runtime/api/endpoints.d.ts +10 -10
  69. package/dist/_dts/blocks/src/system/runtime/api/index.d.ts +1 -1
  70. package/dist/_dts/blocks/src/system/runtime/api/types/appointments.d.ts +162 -0
  71. package/dist/_dts/blocks/src/system/runtime/api/types/core.d.ts +59 -0
  72. package/dist/_dts/blocks/src/system/runtime/api/types/courses.d.ts +134 -0
  73. package/dist/_dts/blocks/src/system/runtime/api/types/discounts.d.ts +85 -0
  74. package/dist/_dts/blocks/src/system/runtime/api/types/events.d.ts +241 -0
  75. package/dist/_dts/blocks/src/system/runtime/api/types/forms.d.ts +53 -0
  76. package/dist/_dts/blocks/src/system/runtime/api/types/newsletter.d.ts +32 -0
  77. package/dist/_dts/blocks/src/system/runtime/api/types/portal.d.ts +220 -0
  78. package/dist/_dts/blocks/src/system/runtime/api/types/shop.d.ts +176 -0
  79. package/dist/_dts/blocks/src/system/runtime/api/types.d.ts +12 -1121
  80. package/dist/_dts/blocks/src/system/runtime/components/registry.client.d.ts +20 -583
  81. package/dist/_dts/blocks/src/system/runtime/components/runtime-backed-blocks.d.ts +9 -276
  82. package/dist/_dts/blocks/src/system/runtime/hooks/useEventFilters.d.ts +1 -12
  83. package/dist/_dts/blocks/src/system/runtime/hooks/useHeadlessEventRegistrationFlow.d.ts +0 -1
  84. package/dist/_dts/blocks/src/system/runtime/hooks/useHeadlessWholeSeriesRegistrationFlow.d.ts +0 -1
  85. package/dist/_dts/blocks/src/system/runtime/nodes/booking-runtime-sources.d.ts +2 -3
  86. package/dist/_dts/blocks/src/system/runtime/nodes/course-details/logic.d.ts +1 -18
  87. package/dist/_dts/blocks/src/system/runtime/nodes/course-details/runs.d.ts +0 -2
  88. package/dist/_dts/blocks/src/system/runtime/nodes/course-details.server.d.ts +1 -5
  89. package/dist/_dts/blocks/src/system/runtime/nodes/course-registration/courseRegistrationViewState.d.ts +21 -0
  90. package/dist/_dts/blocks/src/system/runtime/nodes/course-registration/index.d.ts +1 -1
  91. package/dist/_dts/blocks/src/system/runtime/nodes/course-registration/pricing.d.ts +14 -0
  92. package/dist/_dts/blocks/src/system/runtime/nodes/course-registration/types.d.ts +0 -25
  93. package/dist/_dts/blocks/src/system/runtime/nodes/course-registration/useCourseEligibility.d.ts +24 -0
  94. package/dist/_dts/blocks/src/system/runtime/nodes/course-registration/useCoursePaymentVerification.d.ts +9 -0
  95. package/dist/_dts/blocks/src/system/runtime/nodes/course-registration/useCourseRegistrationActions.d.ts +35 -0
  96. package/dist/_dts/blocks/src/system/runtime/nodes/course-registration/useCourseRegistrationPortal.d.ts +7 -0
  97. package/dist/_dts/blocks/src/system/runtime/nodes/course-registration/useCourseRegistrationSelection.d.ts +31 -0
  98. package/dist/_dts/blocks/src/system/runtime/nodes/course-registration/useCourseRegistrationWizard.d.ts +80 -55
  99. package/dist/_dts/blocks/src/system/runtime/nodes/course-registration/useCourseWaitlistSelection.d.ts +14 -0
  100. package/dist/_dts/blocks/src/system/runtime/nodes/course-registration/whole-series-registration.headless.contract.d.ts +4 -5
  101. package/dist/_dts/blocks/src/system/runtime/nodes/course-registration.interactive.d.ts +0 -38
  102. package/dist/_dts/blocks/src/system/runtime/nodes/course-registration.server.d.ts +1 -1
  103. package/dist/_dts/blocks/src/system/runtime/nodes/event-details/logic.d.ts +2 -0
  104. package/dist/_dts/blocks/src/system/runtime/nodes/event-details.client.d.ts +4 -3
  105. package/dist/_dts/blocks/src/system/runtime/nodes/event-details.server.d.ts +2 -2
  106. package/dist/_dts/blocks/src/system/runtime/nodes/event-registration/EventRegistrationWizardActions.d.ts +12 -0
  107. package/dist/_dts/blocks/src/system/runtime/nodes/event-registration/event-registration.headless.contract.d.ts +0 -4
  108. package/dist/_dts/blocks/src/system/runtime/nodes/event-registration/eventScope.d.ts +0 -9
  109. package/dist/_dts/blocks/src/system/runtime/nodes/event-registration/types.d.ts +0 -5
  110. package/dist/_dts/blocks/src/system/runtime/nodes/event-registration/useEventRegistrationWizard.d.ts +0 -11
  111. package/dist/_dts/blocks/src/system/runtime/nodes/event-registration/utils.d.ts +13 -0
  112. package/dist/_dts/blocks/src/system/runtime/nodes/event-registration.interactive.d.ts +0 -21
  113. package/dist/_dts/blocks/src/system/runtime/nodes/event-registration.server.d.ts +1 -1
  114. package/dist/_dts/blocks/src/system/runtime/nodes/events/EventCalendar.interactive.d.ts +24 -433
  115. package/dist/_dts/blocks/src/system/runtime/nodes/events/EventCombined.client.d.ts +1 -2
  116. package/dist/_dts/blocks/src/system/runtime/nodes/events/EventCombined.interactive.d.ts +52 -266
  117. package/dist/_dts/blocks/src/system/runtime/nodes/events/EventListing.interactive.d.ts +5 -15
  118. package/dist/_dts/blocks/src/system/runtime/nodes/events/shared/EventFilters.d.ts +0 -8
  119. package/dist/_dts/blocks/src/system/runtime/nodes/events/shared/eventCollectionContract.d.ts +1573 -0
  120. package/dist/_dts/blocks/src/system/runtime/nodes/events/shared/listOptions.d.ts +1 -3
  121. package/dist/_dts/content-editor/src/ui/editorSnapshot.d.ts +2 -3
  122. package/dist/_dts/content-editor/src/ui/editorUiStore.d.ts +2 -2
  123. package/dist/_dts/content-model/src/content-types/builtin-schemas.d.ts +0 -5
  124. package/dist/_dts/content-model/src/content-types/builtins.d.ts +0 -5
  125. package/dist/_dts/content-model/src/templates/defaults.d.ts +6 -3
  126. package/dist/_dts/core/src/editor-state.d.ts +1 -13
  127. package/dist/_dts/db/src/generated/supabase/database.types.d.ts +1646 -37
  128. package/dist/_dts/preview-next/src/client/preview/siteChromeBrandPreferences.d.ts +6 -6
  129. package/dist/_dts/preview-next/src/client/preview/siteChromeSavePlan.d.ts +6 -1
  130. package/dist/_dts/preview-next/src/client/preview/siteStylePreviewPlanner.d.ts +27 -4
  131. package/dist/_dts/sdk/src/cli/commands/audit.d.ts +1 -2
  132. package/dist/_dts/sdk/src/cli/commands/pull-dated-offering-scope.d.ts +1 -1
  133. package/dist/_dts/sdk/src/cli/commands/pull-dry-run.d.ts +4 -6
  134. package/dist/_dts/sdk/src/cli/commands/push/consts.d.ts +1 -1
  135. package/dist/_dts/sdk/src/cli/commands/push/options.d.ts +1 -1
  136. package/dist/_dts/sdk/src/cli/commands/push/pushAllExtras.d.ts +0 -1
  137. package/dist/_dts/sdk/src/cli/commands/push/verification.d.ts +1 -1
  138. package/dist/_dts/sdk/src/cli/content/collectionWriters.d.ts +23 -0
  139. package/dist/_dts/sdk/src/cli/content/metadataAfterPush.d.ts +25 -0
  140. package/dist/_dts/sdk/src/cli/content/reader.d.ts +0 -52
  141. package/dist/_dts/sdk/src/cli/content/writer.d.ts +3 -81
  142. package/dist/_dts/sdk/src/cli/site-commands/datedOfferingCommands.d.ts +6 -9
  143. package/dist/_dts/sdk/src/client/contentReadOperations.d.ts +40 -0
  144. package/dist/_dts/sdk/src/client/management/index.d.ts +1 -3
  145. package/dist/_dts/sdk/src/client/management/types.d.ts +3 -91
  146. package/dist/_dts/sdk/src/client/runtimeCacheKeys.d.ts +72 -0
  147. package/dist/_dts/sdk/src/client/runtimeCachePolicy.d.ts +10 -75
  148. package/dist/_dts/sdk/src/client/types.d.ts +7 -33
  149. package/dist/_dts/sdk/src/components.d.ts +1 -1
  150. package/dist/_dts/sdk/src/config/types.d.ts +1 -1
  151. package/dist/_dts/sdk/src/config/validation.d.ts +3 -6
  152. package/dist/_dts/sdk/src/contracts/index.d.ts +1 -1
  153. package/dist/_dts/sdk/src/contracts/page.d.ts +0 -8
  154. package/dist/_dts/sdk/src/contracts/system-block-content.d.ts +1 -34
  155. package/dist/_dts/sdk/src/data/prefetchBlockData.d.ts +4 -3
  156. package/dist/_dts/sdk/src/next/catch-all-utils.d.ts +0 -11
  157. package/dist/_dts/sdk/src/next/catch-all.d.ts +1 -76
  158. package/dist/_dts/sdk/src/next/types.d.ts +0 -19
  159. package/dist/_dts/sdk/src/public-api/contracts.d.ts +7 -207
  160. package/dist/_dts/sdk/src/public-api/runtime.d.ts +1 -1
  161. package/dist/_dts/sdk/src/rendering/blocks-page-renderer.d.ts +2 -1
  162. package/dist/_dts/sdk/src/rendering/components/pageShared.d.ts +2 -2
  163. package/dist/_dts/sdk/src/rendering/helpers/loadContent.d.ts +0 -7
  164. package/dist/_dts/sdk/src/rendering/helpers/templateContent.d.ts +81 -0
  165. package/dist/_dts/sdk/src/rendering/index.d.ts +1 -1
  166. package/dist/_dts/sdk/src/rendering/islands/types.d.ts +1 -51
  167. package/dist/_dts/sdk/src/rendering/overrides.d.ts +2 -1
  168. package/dist/_dts/sdk/src/routing/entrySubroutes.d.ts +6 -6
  169. package/dist/_dts/sdk/src/routing/index.d.ts +0 -2
  170. package/dist/_dts/sdk/src/routing/resolveOccurrence.d.ts +3 -3
  171. package/dist/_dts/sdk/src/routing/resolvePageContent.d.ts +10 -39
  172. package/dist/_dts/sdk/src/types/block-kinds.d.ts +1 -1
  173. package/dist/_dts/sdk/src/version.d.ts +1 -1
  174. package/dist/_dts/site-commands/src/adapter.d.ts +1 -1
  175. package/dist/_dts/site-commands/src/appointmentCommandSchemas.d.ts +100 -0
  176. package/dist/_dts/site-commands/src/capabilityGaps.d.ts +2 -2
  177. package/dist/_dts/site-commands/src/commandContract.d.ts +1242 -0
  178. package/dist/_dts/site-commands/src/commandDomain.d.ts +20 -0
  179. package/dist/_dts/site-commands/src/commandIdentifiers.d.ts +7 -0
  180. package/dist/_dts/site-commands/src/commandValidation.d.ts +10 -0
  181. package/dist/_dts/site-commands/src/commands.d.ts +729 -2659
  182. package/dist/_dts/site-commands/src/domain.d.ts +1 -1
  183. package/dist/_dts/site-commands/src/eventCommandContent.d.ts +11 -0
  184. package/dist/_dts/site-commands/src/exposure.d.ts +1 -1
  185. package/dist/_dts/site-commands/src/index.d.ts +6 -0
  186. package/dist/_dts/site-commands/src/metadata.d.ts +1 -27
  187. package/dist/_dts/site-commands/src/planner.d.ts +1 -1
  188. package/dist/_dts/site-commands/src/refContributions.d.ts +1 -1
  189. package/dist/_dts/site-commands/src/refs.d.ts +1 -4
  190. package/dist/_dts/site-commands/src/siteStyleCommandSchema.d.ts +378 -0
  191. package/dist/_dts/site-commands/src/siteStyleSelectionSchemaBuilder.d.ts +46 -0
  192. package/dist/_dts/site-commands/src/staticExecutionGaps.d.ts +2 -2
  193. package/dist/_dts/site-commands/src/venueCommandMapping.d.ts +21 -0
  194. package/dist/_dts/theme-core/src/site-styles/compilationPlan.d.ts +58 -0
  195. package/dist/_dts/theme-core/src/site-styles/headerLooks.d.ts +1 -0
  196. package/dist/_dts/theme-core/src/site-styles/index.d.ts +1 -0
  197. package/dist/_dts/theme-core/src/site-styles/previewCompiler.d.ts +47 -24
  198. package/dist/cli/index.mjs +7267 -8479
  199. package/dist/cli/init-docs/content/cli-reference.md +5 -21
  200. package/dist/cli/init-docs/content/content-management.md +4 -5
  201. package/dist/client/{DiscountCodeDisclosure-DIWj-P9v.mjs → DiscountCodeDisclosure-CyPpekBp.mjs} +2 -2
  202. package/dist/client/{EventCombined.client-De8YWBSr.mjs → EventCombined.client-zywit-60.mjs} +5 -16
  203. package/dist/client/{EventListing.client-seHTjimY.mjs → EventListing.client-J2nLhkKT.mjs} +3 -10
  204. package/dist/client/{LeafletStaticMap-BmQxFcJW.mjs → LeafletStaticMap-CSubXWt6.mjs} +1 -1
  205. package/dist/client/{MagicLinkForm-OoJAIUIj.mjs → MagicLinkForm-DDLIfiq9.mjs} +2 -2
  206. package/dist/client/{StepIndicator-CiZ8kdPk.mjs → StepIndicator-DE8EvHIp.mjs} +2 -2
  207. package/dist/client/{accordion-6lnN__XJ.mjs → accordion-Ct5T5NiA.mjs} +1 -1
  208. package/dist/client/{bookingForm-5uyqhONU.mjs → bookingForm-DMxtLPxw.mjs} +6 -6
  209. package/dist/client/bookings.mjs +753 -818
  210. package/dist/client/{carousel-Dtnifil_.mjs → carousel--FMqgvob.mjs} +1 -1
  211. package/dist/client/{cart-5Tc5S7NV.mjs → cart-BKX1bWiU.mjs} +3 -3
  212. package/dist/client/{checkout-CYKKN5Hr.mjs → checkout-B_jxi4WW.mjs} +3 -3
  213. package/dist/client/client.mjs +6876 -7150
  214. package/dist/client/{context-BGZNlGXB.mjs → context-CJz1Vlsz.mjs} +40 -43
  215. package/dist/client/{courseRegistration-CxCBybB4.mjs → courseRegistration-DH4MlkRD.mjs} +606 -621
  216. package/dist/client/{eventCalendar-Xj2jZS9X.mjs → eventCalendar-BQILwAcL.mjs} +5 -13
  217. package/dist/client/{eventCombined-CgcMoOgM.mjs → eventCombined-DFFW_Vmo.mjs} +3 -3
  218. package/dist/client/{eventDetails-CEAH8Edc.mjs → eventDetails-B045CTSJ.mjs} +147 -118
  219. package/dist/client/{eventListing-qyPVQ0wP.mjs → eventListing-BDMYNVzS.mjs} +3 -3
  220. package/dist/client/{eventRegistration-DDu79CtL.mjs → eventRegistration-CQ2-BSnB.mjs} +165 -68
  221. package/dist/client/{form-Bc7JKI7I.mjs → form-DJKuyZgN.mjs} +2 -2
  222. package/dist/client/{headerSection-vTku_LEl.mjs → headerSection-DeTjfiDo.mjs} +2 -2
  223. package/dist/client/hooks.mjs +3454 -2363
  224. package/dist/client/{locationMap-Bg7X4Jna.mjs → locationMap-i2wDA8gB.mjs} +2 -2
  225. package/dist/client/{newsletterForm-lpylVdp5.mjs → newsletterForm-DKiueauk.mjs} +2 -2
  226. package/dist/client/{pricing-DE8fjJiT.mjs → pricing-C01J3Epx.mjs} +3 -19
  227. package/dist/client/{productDetail-D7Bo2RMH.mjs → productDetail-Dfc1sZaX.mjs} +3 -3
  228. package/dist/client/{productList-VjnZqiqN.mjs → productList-BXbvXWTF.mjs} +3 -3
  229. package/dist/client/{propsDecoder-DreFXjNP.mjs → propsDecoder-CIR5DQ1l.mjs} +213 -376
  230. package/dist/client/rendering/client.mjs +3036 -3292
  231. package/dist/client/rendering/islands.mjs +18 -18
  232. package/dist/client/rendering.mjs +5489 -4585
  233. package/dist/client/{shop-IRsHHbf7.mjs → shop-BbNwPKM-.mjs} +6 -6
  234. package/dist/client/{shop-commerce-gnI8PieZ.mjs → shop-commerce-XO-XMFEt.mjs} +5 -5
  235. package/dist/client/{shop-commerce-store-BTbrhObn.mjs → shop-commerce-store-Byh6OUGK.mjs} +1 -1
  236. package/dist/client/{shopShared-D6KS2_qk.mjs → shopShared-Bbq39mwr.mjs} +3 -3
  237. package/dist/client/{useDiscountCodeUi-DCccGCxV.mjs → useDiscountCodeUi-Bcyh4508.mjs} +2 -2
  238. package/dist/client/{useEventFilters-eGs3rPZQ.mjs → useEventFilters-C8OOJ3el.mjs} +59 -124
  239. package/dist/client/{usePolling-CvSU2sur.mjs → usePolling-CyJVo9kF.mjs} +2 -2
  240. package/dist/preview-next/before-render.mjs +1115 -1044
  241. package/dist/preview-next/client/runtime.mjs +4 -4
  242. package/dist/preview-next/middleware.mjs +1118 -1047
  243. package/dist/{previewAuthStore-ShY26RNz.mjs → previewAuthStore-CJX21dGi.mjs} +1121 -1047
  244. package/dist/{sdk-runtime-CJxkFq2B.mjs → sdk-runtime-BGhyuE-E.mjs} +2 -2
  245. package/dist/{separator-CoFmo8uA.mjs → separator-BFs-Kmv5.mjs} +1 -1
  246. package/dist/server/components.mjs +5909 -5011
  247. package/dist/server/config-validation.mjs +3456 -2354
  248. package/dist/server/config.mjs +3456 -2354
  249. package/dist/server/data.mjs +3454 -2365
  250. package/dist/server/index.mjs +1501 -1491
  251. package/dist/server/next.mjs +7534 -8067
  252. package/dist/server/page-converter.mjs +1900 -2038
  253. package/dist/server/prebuild.mjs +1 -1
  254. package/dist/server/rendering/server.mjs +5618 -4723
  255. package/dist/server/rendering.mjs +6238 -5393
  256. package/dist/server/routing.mjs +3616 -2507
  257. package/dist/server/server.mjs +3300 -3477
  258. package/package.json +1 -1
  259. package/dist/_dts/api/src/previewContentContract.d.ts +0 -4
  260. package/dist/_dts/sdk/src/cli/commands/course.d.ts +0 -6
  261. package/dist/_dts/sdk/src/cli/commands/push/scopes/courses.d.ts +0 -4
  262. package/dist/_dts/sdk/src/client/management/courses.d.ts +0 -10
  263. package/dist/_dts/sdk/src/routing/resolveEntrySubroute.d.ts +0 -36
@@ -1,7 +1,7 @@
1
1
  "use client";
2
- import { $ as confirmAutosaveBatch, $a as toLocationMapHydrationProps, $c as cn, $n as uiTransforms, $o as CircleMinusIcon, $r as productItemKey, $s as mapCurrentValueForSelect, $t as undoHistory, Aa as eventCalendarDefaultViewSchema, Al as unsafeAsFormId, An as deriveLaunchReadiness, Ao as mediaSchema, Ar as buildGiftingInteractiveIslandProps, As as parseThemeButtonVariantId, At as ReferenceField, Ba as eventBlockKindValues, Bi as getGradientPreset, Bl as Star, Bn as mergeContentWithBlockStyleOverrides, Bo as isObjectRecord, Br as buildProductListInteractiveIslandProps, Bs as assertNever$6, Bt as hideThemeV2RawStyleFields, Ca as resolveEventListPaginationAction, Cc as Dialog, Ci as formatSiteChromeBackgroundTokenLabel, Cl as assertNever$5, Cn as useMediaEditorOptional, Co as defineProgressiveBlockRuntime, Cr as resolveDiscountContext, Cs as siblingPath, Ct as IconPickerField, Da as calendarTabViewsSchema, Dc as DialogHeader, Di as retargetCompiledRuntimeFieldsForContentAdjacency, Dl as unsafeAsAppointmentResourceId, Do as splitPositioningClasses, Dr as getStepNumber$1, Dt as ButtonWidgetProvider, Ea as normalizeOptionalId, Ec as DialogFooter, Ei as retargetCompiledBoundaryRuntimeForContentAdjacency, El as parseSiteId, En as getPageDesignEditorState, Eo as markEditableSurfaceForwarding, Er as WIZARD_STEPS$1, Et as ButtonVariantField, Fa as eventCalendarListLayoutCompatibleDisplayModeValues, Fc as createCollapsibleScope, Fl as Upload, Fn as createCustomBlockRegistry, Fo as parseBlockIconValue, Fr as checkoutBlockDefinition, Fs as resolveOnColorForThemeToken, Ft as EditorProvider, Ga as normalizeEventScheduleScope, Gc as createCollection, Gi as sectionTransitionVariantForBoundaryOptionId, Gn as siteHeaderManifest, Go as isInlineTextEmpty, Gr as buildProductDetailDisplay, Gs as mergeStyles, Gt as useEditorUiStore, Ha as eventSurfaceScopeValues, Hi as defaultSectionTransitionVariantForFamily, Hn as getBlockDefinition, Ho as logger, Hr as getShopDisplayForItems, Hs as normalizeBoxStylesCardVariant, Ht as stripTopLevelRoutingUi, Ia as eventCalendarListLayoutOptions, In as buildThemeRuntime, Io as resolveBlockIconRenderValue, Ir as cartBlockDefinition, Is as resolveTokenOrCssColorValue, It as useEditor, Ja as normalizeEventSurfaceScope, Jc as composeEventHandlers, Ji as backgroundAppearanceQuickColorTokenNames, Jn as planSiteOverlayHeaderClearance, Jo as isBlockButtonRole, Jr as EMPTY_COMMERCE_CART_STATE, Js as getFieldIntent, Jt as canRedoHistory, Ka as normalizeEventStaffMemberId, Kc as useControllableState, Ki as BACKGROUND_BODY_TEXT_MIN_CONTRAST_RATIO, Kl as Plus, Kn as SITE_CHROME_VISIBLE_HEADER_SELECTOR, Ko as parseInlineTextFromUnknown, Kr as formatCommercePrice, Ks as rgbColorValue, Kt as useEditorUiStoreInstance, La as el, Li as gradientToCss, Ln as DEFAULT_THEME_RESPONSIVE_MODE, Lo as parseGeneratedIconAssetId, Lr as buildCartInteractiveIslandProps, Ls as isThemeV2NormalEditorRawStyleFieldName, Lt as LinkField, Ma as filterAutoShowSchema, Mc as Content, Ml as err$2, Mn as isSupportedLoaderEndpoint, Mo as resolveFeatureCardGeneratedIconSizePx, Mr as buildCourseRegistrationInteractiveIslandProps, Ms as parseThemeForPersistence, Mt as useRichTextImagePicker, Na as previewStageSchema, Nc as Root, Ni as surfaceResolutionContextFromTheme, Nl as ok$3, Nn as ThemeScope, No as shouldReserveFeatureCardIconZone, Nr as normalizeEventRegistrationPageSurfaceSubject, Ns as getTextColorForBackground, Nt as RichTextField, Oa as columnOptionSchema, Oc as DialogTitle, Oi as planPageDesignLayoutLookCompatibility, Ol as unsafeAsAppointmentServiceId, On as decodePublicProductCategorySelectorQuery, Oo as planSiteChromePlacement, Or as getWizardStepsForContext$1, Ot as FileField, Pa as weekStartSchema, Pc as Trigger, Pl as X, Pn as containerResponsiveThemeCss, Po as buildGeneratedBlockIconRenderAssetLookupFromUnknown, Pr as resolveEventRegistrationScopedEvents, Ps as isCssColorLiteral, Pt as RichTextWidgetProvider, Q as beginAutosaveBatch, Qa as normalizeLocationMapProps, Qc as useComposedRefs, Qn as layoutTransforms, Qo as ChevronDownIcon, Qr as parseStoredCommerceCartState, Qs as hasEmptyOption, Qt as redoHistory, Ra as when, Ri as GRADIENT_PRESETS, Rl as Ticket, Rn as getResponsiveScopeSpec, Ro as parseGeneratedIconSetId, Rr as buildCheckoutInteractiveIslandProps, Rs as pageDesignEditorBackgroundOverrideOwner, Rt as LinkWidgetProvider, S as usePreviewThemeOverlay, Sa as resolveEventCalendarListPageSize, Sc as TabsTrigger, Si as resolveBackgroundColorValue, Sl as formatCurrencyAmount, Sn as MediaEditorContextProvider, So as defineClientOwnedBlockRuntime, Sr as findPreSelectedEvent, Ss as getAtPath, St as InlineTextField, Ta as normalizeCsvString, Tc as DialogDescription, Ti as compileEditorModelRuntime, Tl as parseMediaAssetId, Tn as applyPageDesignEditorAction, To as composeHeaderSectionWrapperClassName, Tr as resolveRegistrationTarget, Tt as EntryPickerWidgetProvider, Ua as normalizeEventBlockKind, Uc as useId$1, Ui as sectionTransitionFamilies, Un as projectRecurringSchedule, Uo as coerceInlineTextWithFallback, Ur as buildCartDisplay, Us as normalizeCardVariantRole, Ut as getBlockManifestFromSdkConfig, Va as eventScheduleScopeValues, Vi as parseGradientPresetId, Vl as Sparkles, Vn as generateDefaultAccordionSystem, Vo as isRecord$20, Vr as buildShopInteractiveIslandProps, Vs as ICON_CONFIG, Vt as prepareBlockEditorManifest, Wa as normalizeEventCategoryIdsCsv, Wc as useDirection, Wi as sectionTransitionFamilyForBoundaryOptionId, Wl as RotateCcw, Wn as siteFooterManifest, Wo as inlineTextToPlainText, Wr as buildProductCardDisplay, Ws as backgroundColorStyle, Xa as publicEventSchema, Xc as Button, Xi as parseBackgroundAppearanceColorToken, Xn as contentTransforms, Xo as ArrowDownIcon, Xr as buildProductCartItem, Xs as SdkConfigProvider, Xt as createHistoryState, Ya as normalizeEventVenueId, Yc as Primitive, Yi as foregroundTokenForBackgroundAppearanceColorToken, Yn as visibleHeaderClearancePx, Yo as getIconComponent, Yr as buildPassCartItem, Ys as isHeaderField, Yt as canUndoHistory, Za as buildGoogleMapsDirectionsUrl, Zi as defaultThemeTokens, Zl as Minus, Zn as mediaTransforms, Zo as ArrowRightIcon, Zr as deriveCommerceCheckoutState, Zs as useSdkConfig, Zt as pushHistoryEntry, _a as resolveSpacing, _i as defineFragment, _l as publicEventPricingCurrency, _o as blockBookingPaymentTermsSchema, _r as buildFormInteractiveIslandProps, _s as resolveMediaNodeResponsiveImage, _t as createSiteOptionWidgetAdapters, aa as runTransforms, ai as faqHeadingFragment, al as formatBookingDate, an as createSnapshotFromPageRecord, ao as formatEventTeacherLine, ar as shopBlockDefinition, as as FileSpreadsheetIcon, at as resolvePreviewSidebarTab, au as CirclePlus, ba as eventPageSizeSchema, bc as TabsContent, bi as boxStylesTransforms, bl as publicEventScalarPrice, bn as createStoreBackend, bo as defineInteractiveIslandMetaKeys, br as toRegistrationEvents, bs as SECTION_BACKGROUND_MIN_SOURCE_WIDTH, bt as OfferingsPreviewGroupOrderField, cc as SelectContent, ci as formEmbedFragment, cl as formatBookingTime, cn as parseReferenceKind, co as getContainerClass, cr as newsletterSignupBlockDefinition, cs as PlusIcon, ct as PreviewInlineTextEditor, cu as ChevronLeft, da as buildOfferingsPreviewRenderStates, dc as SelectValue, di as testimonialsHeadingFragment, dl as parseBookingLocalDate, do as resolveEventLinkProps, dr as buildEventListingInteractiveIslandProps, ds as buildResolveImageUrlContext, dt as useUISelector, du as ArrowDown, ec as mapOptionValueForSelect, ei as reduceCommerceCart, el as clsx, en as unsafeAsLinkedContentEntryId, eo as formatDate$3, er as formattingTransforms, es as CirclePlusIcon, et as deriveTransactionCapabilities, eu as Image, f as PREVIEW_DESIGN_SAVE_ERROR_MESSAGE, fa as normalizeOfferingsPreviewItemLimit, fi as ctaCopyFragment, fl as resolveBookingTimeZoneId, fn as PaletteProvider, fo as getEventAvailability, fr as eventCalendarBlockDefinition, fs as computeMediaTransformStyle, ft as EditableBlockProvider, fu as __exportAll, ga as isSemanticSpacing, gi as bodyCopyFragment, gl as formatBookingPriceDisplay, gn as createManifestFormAdapter, go as resolveRuntimeEventPricing, gr as formBlockDefinition, gs as resolveImageUrlWithContext, gt as createSiteOptionApiLoader, ha as resolveOfferingsPreviewGroups, hi as heroCopyFragment, hl as parseEventPageSurfaceSubject, ho as getLocalMinuteOfDay, hr as buildEventCalendarListingRender, hs as renderVideo, ht as useEntryEditorController, i as usePreviewDesignHistoryOrder, ia as createTransformRegistry, ii as faqAccordionFragment, il as addLocalScheduleDays, in as createRoutingHelpers, io as formatEventPriceDisplay, ir as NAV_DROPDOWN_SHIFT_PROPERTY, is as FileAudioIcon, iu as CreditCard, ja as eventLayoutSchema, ji as designRuntimeRulesForTheme, jl as unsafeAsPassId, jn as AMBIENT_BACKGROUND_ROLES, jo as FEATURE_CARD_ICON_TREATMENTS, jr as courseRegistrationBlockDefinition, js as themeButtonClassName, jt as ReferenceWidgetProvider, ka as eventButtonVariantSchema, ki as componentRuntimeRulesForTheme, kl as unsafeAsCustomerPassId, kn as DEFAULT_LAUNCH_READINESS_INPUT, ko as PUBLIC_DOWNLOAD_MEDIA_TYPES, kr as giftingBlockDefinition, ks as AFFORDANCE_SUPPRESS_CLASS, kt as MediaField, lc as SelectItem, li as formCopyFragment, ll as formatLocalScheduleDate, lo as groupEventsByDate, lr as buildNewsletterFormInteractiveIslandProps, ls as ImagePresets, lt as PreviewTextEditor, lu as ChevronDown, ma as resolveOfferingsPreviewGroupCta, mi as ctaRowFragment, ml as toScheduledBookingDateTime, mn as validateBlockManifestIssues, mo as getLocalDateKey, mr as buildEventCalendarListingDisplay, ms as renderAudio, n as useSiteChromeCustomizeOptional, nc as FieldFrame, ni as headingFragment, nl as unsafeAsEditorBlockId, no as formatEventDateParts, nr as ImageResolveContextProvider, ns as DownloadIcon, nt as idleEditorTransactionQueueState, oa as ctaButton, oi as blogFeaturedPostFragment, ol as formatBookingDateTime, on as BUILT_IN_REFERENCE_KINDS, oo as formatTime$3, or as productListBlockDefinition, os as FileTextIcon, ou as CircleMinus, p as reportPreviewDesignError, pa as resolveOfferingsPreviewCoursePath, pi as heroCtaRowFragment, pl as toBookingTimeZone, pn as usePalette, po as getEventAvailabilityStatus, pr as buildEventCalendarInteractiveIslandProps, ps as getCurrentResolveImageUrlContext, pt as EntryControllerProvider, qa as normalizeEventSurfacePresetsCsv, qc as createContextScope, qi as backgroundAppearanceColorTokenNames, qn as SITE_OVERLAY_HEADER_CLEARANCE_CSS_VAR, qo as canonicalizePersistedBlockButtonRole, qr as formatInterval, qs as textColorStyle, qt as useOptionalEditorUiStoreInstance, r as PreviewDesignHistoryOrderProvider, rc as useField, ri as cardFragment, rl as unsafeAsEditorBlockValues, rn as useDebouncedLatestSave, ro as formatEventPrice, rr as useImageResolveContextOptional, rs as FileArchiveIcon, rt as rejectAutosaveBatch, sc as Select, si as singleButtonFragment, sl as formatBookingInstant, so as getCardOrientation, sr as productDetailBlockDefinition, ss as MinusIcon, st as PreviewRichTextEditor, su as ChevronRight, t as SiteChromeCustomizeProvider, tc as unmapValueFromSelect, ti as richTextFragment, tl as parseFooterModuleId, tn as recordsEqual, to as formatEventCompactDateRail, tr as createManifestValidator, ts as ClockIcon$1, tt as enqueueTransaction, tu as GripVertical, u as PREVIEW_DESIGN_LOAD_ERROR_MESSAGE, ua as OFFERINGS_PREVIEW_EVENT_PRESET_DEFINITIONS, uc as SelectTrigger, ui as testimonialsCarouselFragment, ul as getBookingLocalDateKey, uo as resolveEventCta, ur as eventListingBlockDefinition, us as MediaPlaceholder, va as buildEventRuntimeFilters, vi as BACKGROUND_POSITION_PRESET_VALUES, vl as publicEventPricingMode, vn as FormRenderer, vo as buildInteractiveIslandProps, vr as eventRegistrationBlockDefinition, vs as resolveMediaStorageUrl, vt as SiteOptionPickerField, wa as normalizeCsvIds, wc as DialogContent, wi as applyCompiledRuntimeFieldsToContent, wl as expectParsedBrandedId, wn as useApiMediaUploader, wr as resolveEventRequiresPayment, wt as EntryPickerField, x as PreviewThemeOverlayProvider, xa as getEventRuntimeFiltersKey, xc as TabsList, xi as resolveSurfaceForegroundStyles, xl as publicEventTicketTypes, xn as MediaEditor, xo as createZodCodec, xr as findEventByOccurrenceId, xs as attachRenderableMediaAssetFields, xt as OfferingsPreviewWidgetProvider, y as PreviewDesignCoordinatorProvider, ya as eventListPaginationActionSchema, yc as Tabs, yi as getAnchorClasses, yl as publicEventPricingType, yn as evaluateVisibility, yo as createInteractiveIslandCodec, yr as buildEventRegistrationInteractiveIslandProps, ys as setContextResolveImageUrlContext, yt as SiteOptionWidgetProvider, za as bindingSchema, zi as GRADIENT_PRESET_IDS, zn as escapeStyleContent, zo as RichTextDocSchema, zr as buildProductDetailInteractiveIslandProps, zs as asDesignBlockId } from "./SiteChromeCustomizeContext-4hn4A0HX.mjs";
3
- import { i as useOptionalPreviewLayout, t as PreviewQueryProvider } from "./PreviewQueryProvider-07EE4uWL.mjs";
4
- import { _ as API_ENDPOINTS, a as usePreviewToken, c as createBearerAPIClient, d as unwrapResponse, g as resolveSurfaceDocumentAttributes, h as SURFACE_IDS, i as usePreviewAuthFetch, m as SURFACE_DOCUMENT_DATA_ATTRIBUTE, n as markPreviewAuthExpired, o as isPreviewRuntimeSessionEditable, r as usePreviewAuth, s as ApiRequestError, t as initPreviewAuth } from "./previewAuthStore-ShY26RNz.mjs";
2
+ import { $ as beginAutosaveBatch, $a as resolveRuntimeEventPricing, $c as toScheduledBookingDateTime, $n as layoutTransforms, $o as renderAudio, $r as reduceCommerceCart, $t as redoHistory, Aa as bindingSchema, Ac as createCollection, Ai as designRuntimeRulesForTheme, An as DEFAULT_LAUNCH_READINESS_INPUT, Ao as isInlineTextEmpty, Ar as giftingBlockDefinition, As as mergeStyles, At as MediaField, Ba as formatEventPrice, Bc as parseFooterModuleId, Bi as sectionTransitionFamilies, Bl as GripVertical, Bn as escapeStyleContent, Bo as ClockIcon$1, Br as buildShopInteractiveIslandProps, Bs as unmapValueFromSelect, C as usePreviewThemeOverlay, Ca as buildEventRuntimeFilters, Ci as applyCompiledRuntimeFieldsToContent, Cl as Ticket, Cn as MediaEditorContextProvider, Co as parseGeneratedIconSetId, Cr as findPreSelectedEvent, Cs as pageDesignEditorBackgroundOverrideOwner, Ct as InlineTextField, Da as normalizeOptionalId, Di as planPageDesignLayoutLookCompatibility, Dn as getPageDesignEditorState, Do as logger, Dr as WIZARD_STEPS$1, Ds as normalizeBoxStylesCardVariant, Dt as ButtonVariantField, Ea as normalizeCsvString, Ei as retargetCompiledRuntimeFieldsForContentAdjacency, El as Sparkles, En as applyPageDesignEditorAction, Eo as isRecord$20, Er as resolveRegistrationTarget, Es as ICON_CONFIG, Et as EntryPickerWidgetProvider, Fa as normalizeLocationMapProps, Fc as Button, Fi as GRADIENT_PRESETS, Fn as containerResponsiveThemeCss, Fo as ArrowDownIcon, Fr as cartBlockDefinition, Fs as SdkConfigProvider, Ft as RichTextWidgetProvider, Ga as getContainerClass, Gc as formatBookingDateTime, Gi as BACKGROUND_BODY_TEXT_MIN_CONTRAST_RATIO, Gl as CircleMinus, Gn as siteFooterManifest, Go as FileTextIcon, Gr as formatCommercePrice, Ha as formatEventTeacherLine, Hc as unsafeAsEditorBlockValues, Hi as sectionTransitionVariantForBoundaryOptionId, Hn as generateDefaultAccordionSystem, Ho as FileArchiveIcon, Hr as buildCartDisplay, Hs as useField, Ht as prepareBlockEditorManifest, Ia as toLocationMapHydrationProps, Ii as GRADIENT_PRESET_IDS, Il as Minus, In as createCustomBlockRegistry, Io as ArrowRightIcon, Ir as buildCartInteractiveIslandProps, Is as useSdkConfig, It as EditorProvider, Ja as resolveEventLinkProps, Jc as formatLocalScheduleDate, Ji as foregroundTokenForBackgroundAppearanceColorToken, Jl as ChevronDown, Jn as SITE_OVERLAY_HEADER_CLEARANCE_CSS_VAR, Jo as ImagePresets, Jr as buildPassCartItem, Js as SelectItem, Jt as useOptionalEditorUiStoreInstance, Ka as groupEventsByDate, Kc as formatBookingInstant, Ki as backgroundAppearanceColorTokenNames, Kl as ChevronRight, Kn as siteHeaderManifest, Ko as MinusIcon, Kr as formatInterval, Ks as Select, Kt as useEditorUiStore, La as formatDate$3, Lc as useComposedRefs, Li as getGradientPreset, Ln as buildThemeRuntime, Lo as ChevronDownIcon, Lr as buildCheckoutInteractiveIslandProps, Ls as hasEmptyOption, Lt as useEditor, Ma as eventCalendarListLayoutCompatibleDisplayModeValues, Mc as createContextScope, Mi as surfaceResolutionContextFromTheme, Mn as AMBIENT_BACKGROUND_ROLES, Mo as canonicalizePersistedBlockButtonRole, Mr as courseRegistrationBlockDefinition, Ms as textColorStyle, Mt as ReferenceWidgetProvider, Na as eventCalendarListLayoutOptions, Nc as composeEventHandlers, Nn as isSupportedLoaderEndpoint, No as isBlockButtonRole, Nr as buildCourseRegistrationInteractiveIslandProps, Ns as getFieldIntent, Nt as useRichTextImagePicker, Oa as el, Oc as useId$1, Oi as componentRuntimeRulesForTheme, Oo as coerceInlineTextWithFallback, Or as getStepNumber$1, Os as normalizeCardVariantRole, Ot as ButtonWidgetProvider, Pa as buildGoogleMapsDirectionsUrl, Pc as Primitive, Pi as gradientToCss, Pn as ThemeScope, Po as getIconComponent, Pr as checkoutBlockDefinition, Ps as isHeaderField, Pt as RichTextField, Qa as getLocalMinuteOfDay, Qc as toBookingTimeZone, Qn as mediaTransforms, Qo as getCurrentResolveImageUrlContext, Qr as productItemKey, Qt as pushHistoryEntry, Ra as formatEventCompactDateRail, Rc as cn, Ri as parseGradientPresetId, Rn as DEFAULT_THEME_RESPONSIVE_MODE, Ro as CircleMinusIcon, Rr as buildProductDetailInteractiveIslandProps, Rs as mapCurrentValueForSelect, Rt as LinkField, S as PreviewThemeOverlayProvider, Sa as eventCollectionSourceSchemaShape, Si as formatSiteChromeBackgroundTokenLabel, Sn as MediaEditor, So as parseGeneratedIconAssetId, Sr as findEventByOccurrenceId, Ss as isThemeV2NormalEditorRawStyleFieldName, St as OfferingsPreviewWidgetProvider, Ta as normalizeCsvIds, Ti as retargetCompiledBoundaryRuntimeForContentAdjacency, Tl as Star, Tn as useApiMediaUploader, To as isObjectRecord, Tr as resolveEventRequiresPayment, Ts as assertNever$6, Tt as EntryPickerField, Ua as formatTime$3, Uc as addLocalScheduleDays, Ul as CreditCard, Un as getBlockDefinition, Uo as FileAudioIcon, Ur as buildProductCardDisplay, Ut as stripTopLevelRoutingUi, Va as formatEventPriceDisplay, Vc as unsafeAsEditorBlockId, Vi as sectionTransitionFamilyForBoundaryOptionId, Vn as mergeContentWithBlockStyleOverrides, Vo as DownloadIcon, Vr as getShopDisplayForItems, Vs as FieldFrame, Vt as hideThemeV2RawStyleFields, Wa as getCardOrientation, Wc as formatBookingDate, Wl as CirclePlus, Wn as projectRecurringSchedule, Wo as FileSpreadsheetIcon, Wr as buildProductDetailDisplay, Wt as getBlockManifestFromSdkConfig, Xa as getEventAvailabilityStatus, Xc as parseBookingLocalDate, Xi as defaultThemeTokens, Xl as ArrowDown, Xn as visibleHeaderClearancePx, Xo as buildResolveImageUrlContext, Xr as deriveCommerceCheckoutState, Xs as SelectValue, Xt as canUndoHistory, Ya as getEventAvailability, Yc as getBookingLocalDateKey, Yi as parseBackgroundAppearanceColorToken, Yn as planSiteOverlayHeaderClearance, Yo as MediaPlaceholder, Yr as buildProductCartItem, Ys as SelectTrigger, Yt as canRedoHistory, Za as getLocalDateKey, Zc as resolveBookingTimeZoneId, Zl as __exportAll, Zn as contentTransforms, Zo as computeMediaTransformStyle, Zr as parseStoredCommerceCartState, Zt as createHistoryState, _a as buildEventCollectionDisplay, _c as Content, _i as BACKGROUND_POSITION_PRESET_VALUES, _l as err$2, _n as createManifestFormAdapter, _o as resolveFeatureCardGeneratedIconSizePx, _r as formBlockDefinition, _s as parseThemeForPersistence, _t as createSiteOptionApiLoader, aa as ctaButton, ac as TabsContent, ai as blogFeaturedPostFragment, al as publicEventScalarPrice, an as createRoutingHelpers, ao as defineInteractiveIslandMetaKeys, ar as NAV_DROPDOWN_SHIFT_PROPERTY, as as SECTION_BACKGROUND_MIN_SOURCE_WIDTH, b as PreviewDesignCoordinatorProvider, ba as eventCollectionDisplaySchemaShape, bc as createCollapsibleScope, bi as resolveSurfaceForegroundStyles, bl as Upload, bn as evaluateVisibility, bo as parseBlockIconValue, br as buildEventRegistrationInteractiveIslandProps, bs as resolveOnColorForThemeToken, bt as SiteOptionWidgetProvider, cc as Dialog, ci as formCopyFragment, cl as assertNever$5, co as defineProgressiveBlockRuntime, cr as productDetailBlockDefinition, cs as siblingPath, ct as PreviewRichTextEditor, da as normalizeOfferingsPreviewItemLimit, dc as DialogFooter, di as ctaCopyFragment, dl as parseSiteId, do as markEditableSurfaceForwarding, dr as eventListingBlockDefinition, ei as richTextFragment, el as parseEventPageSurfaceSubject, en as undoHistory, eo as normalizeEventRegistrationPageSurfaceSubject, er as uiTransforms, es as renderVideo, et as confirmAutosaveBatch, f as PREVIEW_DESIGN_SAVE_ERROR_MESSAGE, fa as resolveOfferingsPreviewCoursePath, fc as DialogHeader, fi as heroCtaRowFragment, fl as unsafeAsAppointmentResourceId, fo as splitPositioningClasses, fr as buildEventListingInteractiveIslandProps, ft as useUISelector, ga as resolveSpacing, gi as defineFragment, gl as unsafeAsPassId, go as FEATURE_CARD_ICON_TREATMENTS, gr as buildEventCalendarListingRender, gs as themeButtonClassName, gt as useEntryEditorController, ha as isSemanticSpacing, hi as bodyCopyFragment, hl as unsafeAsFormId, hn as validateBlockManifestIssues, ho as mediaSchema, hr as buildEventCalendarListingDisplay, hs as parseThemeButtonVariantId, i as usePreviewDesignHistoryOrder, ia as runTransforms, ic as Tabs, ii as faqHeadingFragment, il as publicEventPricingType, in as useDebouncedLatestSave, io as createInteractiveIslandCodec, ir as useImageResolveContextOptional, is as setContextResolveImageUrlContext, it as rejectAutosaveBatch, ja as previewStageSchema, jc as useControllableState, jl as Plus, jn as deriveLaunchReadiness, jo as parseInlineTextFromUnknown, jr as buildGiftingInteractiveIslandProps, js as rgbColorValue, jt as ReferenceField, ka as when, kc as useDirection, kl as RotateCcw, kn as decodePublicProductCategorySelectorQuery, ko as inlineTextToPlainText, kr as getWizardStepsForContext$1, ks as backgroundColorStyle, kt as FileField, la as OFFERINGS_PREVIEW_EVENT_PRESET_DEFINITIONS, lc as DialogContent, li as testimonialsCarouselFragment, ll as expectParsedBrandedId, ln as parseReferenceKind, lr as newsletterSignupBlockDefinition, lt as PreviewInlineTextEditor, ma as resolveOfferingsPreviewGroups, mi as heroCopyFragment, ml as unsafeAsCustomerPassId, mn as usePalette, mo as PUBLIC_DOWNLOAD_MEDIA_TYPES, mr as buildEventCalendarInteractiveIslandProps, ms as AFFORDANCE_SUPPRESS_CLASS, mt as EntryControllerProvider, n as useSiteChromeCustomizeOptional, ni as cardFragment, nl as publicEventPricingCurrency, nn as recordsEqual, no as blockBookingPaymentTermsSchema, nr as createManifestValidator, ns as resolveMediaNodeResponsiveImage, nt as enqueueTransaction, oc as TabsList, oi as singleButtonFragment, ol as publicEventTicketTypes, on as createSnapshotFromPageRecord, oo as createZodCodec, or as shopBlockDefinition, os as attachRenderableMediaAssetFields, ot as resolvePreviewSidebarTab, p as reportPreviewDesignError, pa as resolveOfferingsPreviewGroupCta, pc as DialogTitle, pi as ctaRowFragment, pl as unsafeAsAppointmentServiceId, pn as PaletteProvider, po as planSiteChromePlacement, pr as eventCalendarBlockDefinition, pt as EditableBlockProvider, qa as resolveEventCta, qc as formatBookingTime, qi as backgroundAppearanceQuickColorTokenNames, ql as ChevronLeft, qn as SITE_CHROME_VISIBLE_HEADER_SELECTOR, qo as PlusIcon, qr as EMPTY_COMMERCE_CART_STATE, qs as SelectContent, qt as useEditorUiStoreInstance, r as PreviewDesignHistoryOrderProvider, ra as createTransformRegistry, ri as faqAccordionFragment, rl as publicEventPricingMode, ro as buildInteractiveIslandProps, rr as ImageResolveContextProvider, rs as resolveMediaStorageUrl, rt as idleEditorTransactionQueueState, sc as TabsTrigger, si as formEmbedFragment, sl as formatCurrencyAmount, sn as BUILT_IN_REFERENCE_KINDS, so as defineClientOwnedBlockRuntime, sr as productListBlockDefinition, ss as getAtPath, t as SiteChromeCustomizeProvider, ti as headingFragment, tl as formatBookingPriceDisplay, tn as unsafeAsLinkedContentEntryId, to as resolveEventRegistrationScopedEvents, tr as formattingTransforms, ts as resolveImageUrlWithContext, tt as deriveTransactionCapabilities, u as PREVIEW_DESIGN_LOAD_ERROR_MESSAGE, ua as buildOfferingsPreviewRenderStates, uc as DialogDescription, ui as testimonialsHeadingFragment, ul as parseMediaAssetId, uo as composeHeaderSectionWrapperClassName, ur as buildNewsletterFormInteractiveIslandProps, ut as PreviewTextEditor, va as buildEventCollectionHydration, vc as Root, vi as getAnchorClasses, vl as ok$3, vo as shouldReserveFeatureCardIconZone, vr as buildFormInteractiveIslandProps, vs as getTextColorForBackground, vt as createSiteOptionWidgetAdapters, wa as getEventRuntimeFiltersKey, wi as compileEditorModelRuntime, wn as useMediaEditorOptional, wo as RichTextDocSchema, wr as resolveDiscountContext, ws as asDesignBlockId, wt as IconPickerField, xa as eventCollectionHydrationSchema, xi as resolveBackgroundColorValue, xn as createStoreBackend, xo as resolveBlockIconRenderValue, xr as toRegistrationEvents, xs as resolveTokenOrCssColorValue, xt as OfferingsPreviewGroupOrderField, ya as buildEventCollectionListingDisplay, yc as Trigger, yi as boxStylesTransforms, yl as X, yn as FormRenderer, yo as buildGeneratedBlockIconRenderAssetLookupFromUnknown, yr as eventRegistrationBlockDefinition, ys as isCssColorLiteral, yt as SiteOptionPickerField, za as formatEventDateParts, zc as clsx, zi as defaultSectionTransitionVariantForFamily, zl as Image, zn as getResponsiveScopeSpec, zo as CirclePlusIcon, zr as buildProductListInteractiveIslandProps, zs as mapOptionValueForSelect, zt as LinkWidgetProvider } from "./SiteChromeCustomizeContext-BHF-KANn.mjs";
3
+ import { i as useOptionalPreviewLayout, t as PreviewQueryProvider } from "./PreviewQueryProvider-BH-3-jSj.mjs";
4
+ import { _ as API_ENDPOINTS, a as usePreviewToken, c as createBearerAPIClient, d as unwrapResponse, g as resolveSurfaceDocumentAttributes, h as SURFACE_IDS, i as usePreviewAuthFetch, m as SURFACE_DOCUMENT_DATA_ATTRIBUTE, n as markPreviewAuthExpired, o as isPreviewRuntimeSessionEditable, r as usePreviewAuth, s as ApiRequestError, t as initPreviewAuth } from "./previewAuthStore-CJX21dGi.mjs";
5
5
  import * as React$1 from "react";
6
6
  import React, { Children, Component, Fragment, cloneElement, createContext, createElement, forwardRef, isValidElement, startTransition, useCallback, useContext, useEffect, useId, useLayoutEffect, useMemo, useReducer, useRef, useState, useSyncExternalStore } from "react";
7
7
  import { Fragment as Fragment$1, jsx, jsxs } from "react/jsx-runtime";
@@ -487,23 +487,23 @@ const EVENTS = {
487
487
  method: "GET"
488
488
  }
489
489
  };
490
- const COURSES = {
490
+ const WHOLE_SERIES = {
491
491
  list: {
492
- path: "/public/sites/{siteId}/courses",
492
+ path: "/public/sites/{siteId}/dated-offerings/whole-series",
493
493
  method: "GET"
494
494
  },
495
495
  enroll: {
496
- path: "/public/sites/{siteId}/courses/enroll",
496
+ path: "/public/sites/{siteId}/dated-offerings/whole-series/enroll",
497
497
  method: "POST",
498
498
  authScope: "portal"
499
499
  },
500
500
  checkout: {
501
- path: "/public/sites/{siteId}/courses/checkout",
501
+ path: "/public/sites/{siteId}/dated-offerings/whole-series/checkout",
502
502
  method: "POST",
503
503
  authScope: "portal"
504
504
  },
505
505
  checkEligibility: {
506
- path: "/public/sites/{siteId}/courses/check-eligibility",
506
+ path: "/public/sites/{siteId}/dated-offerings/whole-series/check-eligibility",
507
507
  method: "POST",
508
508
  authScope: "portal"
509
509
  },
@@ -513,7 +513,7 @@ const COURSES = {
513
513
  authScope: "portal"
514
514
  },
515
515
  registrationStatus: {
516
- path: "/public/sites/{siteId}/courses/registration-status",
516
+ path: "/public/sites/{siteId}/dated-offerings/whole-series/registration-status",
517
517
  method: "GET",
518
518
  authScope: "portal"
519
519
  }
@@ -669,26 +669,26 @@ const PORTAL = {
669
669
  authScope: "portal",
670
670
  skipPreviewStage: true
671
671
  },
672
- getCourses: {
673
- path: "/portal/courses",
672
+ getWholeSeriesRegistrations: {
673
+ path: "/portal/dated-offerings/whole-series",
674
674
  method: "GET",
675
675
  authScope: "portal",
676
676
  skipPreviewStage: true
677
677
  },
678
- getCourseBookingQuestions: {
679
- path: "/portal/courses/{enrollmentId}/booking-questions",
678
+ getWholeSeriesBookingQuestions: {
679
+ path: "/portal/dated-offerings/whole-series/{enrollmentId}/booking-questions",
680
680
  method: "GET",
681
681
  authScope: "portal",
682
682
  skipPreviewStage: true
683
683
  },
684
- updateCourseBookingQuestions: {
685
- path: "/portal/courses/{enrollmentId}/booking-questions",
684
+ updateWholeSeriesBookingQuestions: {
685
+ path: "/portal/dated-offerings/whole-series/{enrollmentId}/booking-questions",
686
686
  method: "PUT",
687
687
  authScope: "portal",
688
688
  skipPreviewStage: true
689
689
  },
690
- cancelCourseEnrollment: {
691
- path: "/portal/courses/{enrollmentId}/cancel",
690
+ cancelWholeSeriesRegistration: {
691
+ path: "/portal/dated-offerings/whole-series/{enrollmentId}/cancel",
692
692
  method: "POST",
693
693
  authScope: "portal",
694
694
  skipPreviewStage: true
@@ -1041,14 +1041,12 @@ function createBlockApi(config) {
1041
1041
  afterId: params?.afterId,
1042
1042
  limit: params?.limit,
1043
1043
  stage: params?.stage,
1044
- kind: params?.kind,
1045
1044
  eventSurface: params?.eventSurface,
1046
1045
  eventPresets: params?.eventPresets,
1047
1046
  scheduleScope: params?.scheduleScope,
1048
1047
  categoryIds: params?.categoryIds,
1049
1048
  venueId: params?.venueId,
1050
1049
  staffMemberId: params?.staffMemberId,
1051
- entryId: params?.entryId,
1052
1050
  seriesId: params?.seriesId,
1053
1051
  includeOccurrenceId: params?.includeOccurrenceId,
1054
1052
  detailLevel: params?.detailLevel
@@ -1064,7 +1062,6 @@ function createBlockApi(config) {
1064
1062
  categoryIds: params?.categoryIds,
1065
1063
  venueId: params?.venueId,
1066
1064
  staffMemberId: params?.staffMemberId,
1067
- kind: params?.kind,
1068
1065
  eventSurface: params?.eventSurface,
1069
1066
  eventPresets: params?.eventPresets,
1070
1067
  scheduleScope: params?.scheduleScope
@@ -1104,37 +1101,37 @@ function createBlockApi(config) {
1104
1101
  skipDedup: true
1105
1102
  });
1106
1103
  },
1107
- async enrollInCourse(data) {
1104
+ async registerForWholeSeries(data) {
1108
1105
  const sid = requireSiteId();
1109
- const path = buildPath(COURSES.enroll.path, { siteId: sid });
1110
- return request(COURSES.enroll, {
1106
+ const path = buildPath(WHOLE_SERIES.enroll.path, { siteId: sid });
1107
+ return request(WHOLE_SERIES.enroll, {
1111
1108
  path,
1112
1109
  body: withRequestOverrides(data, shouldUsePreviewStageForNonPortalRequests ? { stage: "preview" } : {})
1113
1110
  });
1114
1111
  },
1115
- async checkCourseEligibility(data) {
1112
+ async checkWholeSeriesEligibility(data) {
1116
1113
  const sid = requireSiteId();
1117
- const path = buildPath(COURSES.checkEligibility.path, { siteId: sid });
1118
- return request(COURSES.checkEligibility, {
1114
+ const path = buildPath(WHOLE_SERIES.checkEligibility.path, { siteId: sid });
1115
+ return request(WHOLE_SERIES.checkEligibility, {
1119
1116
  path,
1120
1117
  body: data
1121
1118
  });
1122
1119
  },
1123
1120
  async resolveWaitlistClaim(data) {
1124
1121
  const sid = requireSiteId();
1125
- const path = buildPath(COURSES.waitlistClaimResolve.path, { siteId: sid });
1126
- return request(COURSES.waitlistClaimResolve, {
1122
+ const path = buildPath(WHOLE_SERIES.waitlistClaimResolve.path, { siteId: sid });
1123
+ return request(WHOLE_SERIES.waitlistClaimResolve, {
1127
1124
  path,
1128
1125
  body: { claimToken: data.claimToken }
1129
1126
  });
1130
1127
  },
1131
- async createCourseCheckout(data) {
1128
+ async createWholeSeriesCheckout(data) {
1132
1129
  const sid = requireSiteId();
1133
- const path = buildPath(COURSES.checkout.path, { siteId: sid });
1134
- return request(COURSES.checkout, {
1130
+ const path = buildPath(WHOLE_SERIES.checkout.path, { siteId: sid });
1131
+ return request(WHOLE_SERIES.checkout, {
1135
1132
  path,
1136
1133
  body: {
1137
- courseId: data.courseId,
1134
+ eventSeriesId: data.eventSeriesId,
1138
1135
  ...data.pricingOptionId ? { pricingOptionId: data.pricingOptionId } : {},
1139
1136
  ...data.selectedSlidingAmount !== void 0 ? { selectedSlidingAmount: data.selectedSlidingAmount } : {},
1140
1137
  email: data.email,
@@ -1149,10 +1146,10 @@ function createBlockApi(config) {
1149
1146
  }
1150
1147
  });
1151
1148
  },
1152
- async getCourseRegistrationStatus(params) {
1149
+ async getWholeSeriesRegistrationStatus(params) {
1153
1150
  const sid = requireSiteId();
1154
- const path = buildPath(COURSES.registrationStatus.path, { siteId: sid });
1155
- return request(COURSES.registrationStatus, {
1151
+ const path = buildPath(WHOLE_SERIES.registrationStatus.path, { siteId: sid });
1152
+ return request(WHOLE_SERIES.registrationStatus, {
1156
1153
  path,
1157
1154
  query: { sessionId: params.sessionId },
1158
1155
  skipDedup: true
@@ -1325,23 +1322,23 @@ function createBlockApi(config) {
1325
1322
  body: data
1326
1323
  })).task;
1327
1324
  },
1328
- async getPortalCourses() {
1329
- return (await request(PORTAL.getCourses)).enrollments;
1325
+ async getPortalWholeSeriesRegistrations() {
1326
+ return (await request(PORTAL.getWholeSeriesRegistrations)).enrollments;
1330
1327
  },
1331
- async getPortalCourseBookingQuestions(enrollmentId) {
1332
- const path = buildPath(PORTAL.getCourseBookingQuestions.path, { enrollmentId });
1333
- return (await request(PORTAL.getCourseBookingQuestions, { path })).task;
1328
+ async getPortalWholeSeriesBookingQuestions(enrollmentId) {
1329
+ const path = buildPath(PORTAL.getWholeSeriesBookingQuestions.path, { enrollmentId });
1330
+ return (await request(PORTAL.getWholeSeriesBookingQuestions, { path })).task;
1334
1331
  },
1335
- async updatePortalCourseBookingQuestions(enrollmentId, data) {
1336
- const path = buildPath(PORTAL.updateCourseBookingQuestions.path, { enrollmentId });
1337
- return (await request(PORTAL.updateCourseBookingQuestions, {
1332
+ async updatePortalWholeSeriesBookingQuestions(enrollmentId, data) {
1333
+ const path = buildPath(PORTAL.updateWholeSeriesBookingQuestions.path, { enrollmentId });
1334
+ return (await request(PORTAL.updateWholeSeriesBookingQuestions, {
1338
1335
  path,
1339
1336
  body: data
1340
1337
  })).task;
1341
1338
  },
1342
- async cancelCourseEnrollment(enrollmentId, options) {
1343
- const path = buildPath(PORTAL.cancelCourseEnrollment.path, { enrollmentId });
1344
- return (await request(PORTAL.cancelCourseEnrollment, {
1339
+ async cancelWholeSeriesRegistration(enrollmentId, options) {
1340
+ const path = buildPath(PORTAL.cancelWholeSeriesRegistration.path, { enrollmentId });
1341
+ return (await request(PORTAL.cancelWholeSeriesRegistration, {
1345
1342
  path,
1346
1343
  body: options ?? {}
1347
1344
  })).result;
@@ -3685,7 +3682,10 @@ function uniqByOccurrenceId(events) {
3685
3682
  return out;
3686
3683
  }
3687
3684
  function selectEventDetails(args) {
3688
- const all = uniqByOccurrenceId((args.events ?? []).filter(Boolean));
3685
+ const all = uniqByOccurrenceId(resolveEventRegistrationScopedEvents((args.events ?? []).filter(Boolean), {
3686
+ occurrenceContext: args.occurrenceContext,
3687
+ subject: args.subject
3688
+ }));
3689
3689
  const occurrenceContext = args.occurrenceContext ?? null;
3690
3690
  const otherLimit = parseLimit$1(args.otherDatesLimit, 5);
3691
3691
  const selectedFromContext = (() => {
@@ -3742,7 +3742,7 @@ function toExactOrFreeDisplay(amount, currency) {
3742
3742
  };
3743
3743
  }
3744
3744
  function getSelectableCoursePricingOptionsForNow(course, now) {
3745
- if (!course.pricing || course.pricing.pricingStrategy !== "tiered") return [];
3745
+ if (course.pricing.pricingStrategy !== "tiered") return [];
3746
3746
  return [...course.pricing.options].filter((option) => isSaleWindowOpen(option, now)).sort((left, right) => {
3747
3747
  if (left.sortOrder !== right.sortOrder) return left.sortOrder - right.sortOrder;
3748
3748
  if (left.priceAmount !== right.priceAmount) return left.priceAmount - right.priceAmount;
@@ -3752,23 +3752,7 @@ function getSelectableCoursePricingOptionsForNow(course, now) {
3752
3752
  function resolveCoursePricingState(course, selectedPricingOptionId, selectedSlidingAmountOrNowInput, nowInput = {}) {
3753
3753
  const selectedSlidingAmount = typeof selectedSlidingAmountOrNowInput === "number" || selectedSlidingAmountOrNowInput === null ? selectedSlidingAmountOrNowInput : null;
3754
3754
  const effectiveNowInput = typeof selectedSlidingAmountOrNowInput === "object" && selectedSlidingAmountOrNowInput !== null ? selectedSlidingAmountOrNowInput : nowInput;
3755
- const currency = course.pricing?.currency ?? course.currency;
3756
- if (!course.pricing) {
3757
- const legacyAmount = course.priceCents ?? 0;
3758
- return {
3759
- currency,
3760
- display: toExactOrFreeDisplay(legacyAmount, currency),
3761
- selectableOptions: [],
3762
- requiresSelection: false,
3763
- selectedOption: null,
3764
- slidingScale: null,
3765
- selectedSlidingAmount: null,
3766
- selectedPriceAmount: legacyAmount,
3767
- selectedRequiresPayment: legacyAmount > 0,
3768
- hasPaidSelection: legacyAmount > 0,
3769
- hasFreeSelection: legacyAmount <= 0
3770
- };
3771
- }
3755
+ const currency = course.pricing.currency;
3772
3756
  switch (course.pricing.pricingStrategy) {
3773
3757
  case "free": return {
3774
3758
  currency,
@@ -4461,6 +4445,123 @@ function TicketTypePriceList({ ticketTypes, currency }) {
4461
4445
  }, ticketType.id))
4462
4446
  });
4463
4447
  }
4448
+ function EventPricingDetails({ isDropIn, coursePricing, acceptedItems, eventCostLabel, eventPricingCurrency, ticketTypes, autoApplyDiscount }) {
4449
+ if (isDropIn) return /* @__PURE__ */ jsxs("div", {
4450
+ className: "rb-mt-6",
4451
+ children: [/* @__PURE__ */ jsx("div", {
4452
+ className: "rb-label rb-mb-2",
4453
+ children: "Registration"
4454
+ }), /* @__PURE__ */ jsx("p", {
4455
+ className: "rb-caption status-muted",
4456
+ children: "No registration required - just show up"
4457
+ })]
4458
+ });
4459
+ if (coursePricing) return /* @__PURE__ */ jsx(CoursePricingDisplay, {
4460
+ pricing: coursePricing,
4461
+ acceptedItems: [...acceptedItems]
4462
+ });
4463
+ if (eventCostLabel) return /* @__PURE__ */ jsxs("div", {
4464
+ className: "rb-mt-6",
4465
+ children: [
4466
+ /* @__PURE__ */ jsx("div", {
4467
+ className: "rb-label rb-mb-2",
4468
+ children: "Cost"
4469
+ }),
4470
+ /* @__PURE__ */ jsx("p", { children: /* @__PURE__ */ jsx("strong", { children: eventCostLabel }) }),
4471
+ autoApplyDiscount ? /* @__PURE__ */ jsx("p", {
4472
+ className: "rb-caption rb-mt-1",
4473
+ children: formatAutoApplyDiscountLine(autoApplyDiscount, eventPricingCurrency)
4474
+ }) : null,
4475
+ /* @__PURE__ */ jsx(TicketTypePriceList, {
4476
+ ticketTypes,
4477
+ currency: eventPricingCurrency
4478
+ }),
4479
+ acceptedItems.length > 0 ? /* @__PURE__ */ jsxs("p", {
4480
+ className: "rb-caption rb-mt-1",
4481
+ children: ["You can also attend with: ", acceptedItems.join(", ")]
4482
+ }) : null
4483
+ ]
4484
+ });
4485
+ return acceptedItems.length > 0 ? /* @__PURE__ */ jsx("div", {
4486
+ className: "rb-mt-6",
4487
+ children: /* @__PURE__ */ jsxs("p", {
4488
+ className: "rb-caption",
4489
+ children: ["You can also attend with: ", acceptedItems.join(", ")]
4490
+ })
4491
+ }) : null;
4492
+ }
4493
+ function EventFacts({ selection, selected, venue, teamMembers, pricing }) {
4494
+ const { date, timeRange } = formatEventDateParts({
4495
+ startsAt: selected.startsAt,
4496
+ endsAt: selected.endsAt,
4497
+ timeZone: selection.timeZone
4498
+ });
4499
+ return /* @__PURE__ */ jsxs("div", {
4500
+ className: "rb-flex rb-flex-col rb-gap-4",
4501
+ children: [
4502
+ /* @__PURE__ */ jsxs("div", { children: [
4503
+ /* @__PURE__ */ jsx("div", {
4504
+ className: "rb-label rb-mb-2",
4505
+ children: selection.mode === "next" ? "Next date" : "Date"
4506
+ }),
4507
+ /* @__PURE__ */ jsx("p", { children: /* @__PURE__ */ jsx("strong", { children: date }) }),
4508
+ /* @__PURE__ */ jsx("p", {
4509
+ className: "rb-caption",
4510
+ children: timeRange
4511
+ })
4512
+ ] }),
4513
+ venue ? /* @__PURE__ */ jsxs("div", {
4514
+ className: "rb-mt-6",
4515
+ children: [
4516
+ /* @__PURE__ */ jsx("div", {
4517
+ className: "rb-label rb-mb-2",
4518
+ children: "Venue"
4519
+ }),
4520
+ /* @__PURE__ */ jsx("p", { children: /* @__PURE__ */ jsx("strong", { children: venue.name }) }),
4521
+ venue.address ? /* @__PURE__ */ jsx("p", {
4522
+ className: "rb-caption",
4523
+ children: venue.address
4524
+ }) : null
4525
+ ]
4526
+ }) : null,
4527
+ teamMembers.length > 0 ? /* @__PURE__ */ jsxs("div", {
4528
+ className: "rb-mt-6",
4529
+ children: [/* @__PURE__ */ jsx("div", {
4530
+ className: "rb-label rb-mb-2",
4531
+ children: "With"
4532
+ }), /* @__PURE__ */ jsx("div", {
4533
+ className: "rb-flex rb-flex-col rb-gap-3",
4534
+ children: teamMembers.map((member) => /* @__PURE__ */ jsxs("div", { children: [/* @__PURE__ */ jsx("p", { children: /* @__PURE__ */ jsx(TeamMemberName$1, {
4535
+ name: member.name,
4536
+ profilePath: member.profilePath
4537
+ }) }), member.summary ? /* @__PURE__ */ jsx("p", {
4538
+ className: "rb-caption status-muted",
4539
+ children: member.summary
4540
+ }) : null] }, member.id))
4541
+ })]
4542
+ }) : null,
4543
+ pricing
4544
+ ]
4545
+ });
4546
+ }
4547
+ function OtherEventDates({ selection }) {
4548
+ if (selection.otherDates.length === 0) return null;
4549
+ return /* @__PURE__ */ jsxs("div", { children: [/* @__PURE__ */ jsx("div", {
4550
+ className: "rb-label",
4551
+ children: "Other dates"
4552
+ }), /* @__PURE__ */ jsx("div", {
4553
+ className: "rb-mt-2 rb-tiles-grid",
4554
+ children: selection.otherDates.map((event) => /* @__PURE__ */ jsx("a", {
4555
+ className: "rb-tile rb-tile--interactive",
4556
+ ...resolveEventLinkProps(event),
4557
+ children: /* @__PURE__ */ jsx(DateTimeTile, {
4558
+ startsAt: event.startsAt,
4559
+ endsAt: event.endsAt,
4560
+ timeZone: selection.timeZone
4561
+ })
4562
+ }, event.occurrenceId || event.id))
4563
+ })] });
4564
+ }
4464
4565
  function EventDetailsView({ selection, showVenue, showMap, showOtherDates, showCost = true, showAcceptedPasses = true, showAcceptedMemberships = true, applicablePasses = [], applicableMemberships = [], autoApplyDiscount = null, mapHeight = 200, mapClassName = "event-details-map", renderVenueMap }) {
4465
4566
  const selected = selection.selected;
4466
4567
  if (!selected) return /* @__PURE__ */ jsx("p", {
@@ -4468,147 +4569,57 @@ function EventDetailsView({ selection, showVenue, showMap, showOtherDates, showC
4468
4569
  children: "No upcoming dates scheduled."
4469
4570
  });
4470
4571
  const venue = showVenue ? selected.venue : void 0;
4471
- const isDropIn = selected.kind !== "course_session" && selected.requiresRegistration === false;
4572
+ const isDropIn = selected.bookingScope === "single_occurrence" && selected.requiresRegistration === false;
4472
4573
  const teamMembers = selected.teamMembers ?? [];
4473
- const coursePricing = selected.kind === "course_session" && selected.course ? resolveCoursePricingState({
4474
- pricing: selected.course.pricing,
4475
- priceCents: selected.course.priceCents,
4476
- currency: selected.course.currency
4574
+ const coursePricing = selected.bookingScope === "whole_series" && selected.wholeSeries ? resolveCoursePricingState({
4575
+ pricing: selected.wholeSeries.pricing,
4576
+ currency: selected.wholeSeries.currency
4477
4577
  }) : null;
4478
4578
  const eventPricing = resolveRuntimeEventPricing(selected);
4479
4579
  const eventPricingType = publicEventPricingType(eventPricing);
4480
4580
  const eventPricingCurrency = publicEventPricingCurrency(eventPricing) ?? "USD";
4481
- const isPaid = eventPricingType === "paid";
4482
- const shouldShowCoursePricing = showCost && !isDropIn && coursePricing !== null;
4483
- const shouldShowEventCost = showCost && isPaid && !isDropIn && coursePricing === null;
4581
+ const shouldShowEventCost = showCost && eventPricingType === "paid" && !isDropIn && coursePricing === null;
4484
4582
  const eventCostLabel = shouldShowEventCost ? formatEventPrice(selected) : null;
4485
4583
  const ticketTypes = shouldShowEventCost ? getActiveTicketTypes$1(selected) : [];
4486
4584
  const acceptedItems = [];
4487
4585
  if (showAcceptedPasses) acceptedItems.push(...applicablePasses.map((p) => p.name));
4488
4586
  if (showAcceptedMemberships) acceptedItems.push(...applicableMemberships.map((m) => m.name));
4489
- const hasAcceptedItems = acceptedItems.length > 0;
4490
4587
  return /* @__PURE__ */ jsxs("div", {
4491
4588
  className: "rb-flex rb-flex-col rb-gap-6 rb-text-left",
4492
4589
  children: [/* @__PURE__ */ jsxs("div", {
4493
4590
  className: "rb-grid rb-grid-cols-1 rb-gap-6 rb-items-start rb-sm-grid-cols-2",
4494
- children: [/* @__PURE__ */ jsxs("div", {
4495
- className: "rb-flex rb-flex-col rb-gap-4",
4496
- children: [
4497
- /* @__PURE__ */ jsxs("div", { children: [/* @__PURE__ */ jsx("div", {
4498
- className: "rb-label rb-mb-2",
4499
- children: selection.mode === "next" ? "Next date" : "Date"
4500
- }), (() => {
4501
- const { date, timeRange } = formatEventDateParts({
4502
- startsAt: selected.startsAt,
4503
- endsAt: selected.endsAt,
4504
- timeZone: selection.timeZone
4505
- });
4506
- return /* @__PURE__ */ jsxs(Fragment$1, { children: [/* @__PURE__ */ jsx("p", { children: /* @__PURE__ */ jsx("strong", { children: date }) }), /* @__PURE__ */ jsx("p", {
4507
- className: "rb-caption",
4508
- children: timeRange
4509
- })] });
4510
- })()] }),
4511
- venue ? /* @__PURE__ */ jsxs("div", {
4512
- className: "rb-mt-6",
4513
- children: [
4514
- /* @__PURE__ */ jsx("div", {
4515
- className: "rb-label rb-mb-2",
4516
- children: "Venue"
4517
- }),
4518
- /* @__PURE__ */ jsx("p", { children: /* @__PURE__ */ jsx("strong", { children: venue.name }) }),
4519
- venue.address ? /* @__PURE__ */ jsx("p", {
4520
- className: "rb-caption",
4521
- children: venue.address
4522
- }) : null
4523
- ]
4524
- }) : null,
4525
- teamMembers.length > 0 ? /* @__PURE__ */ jsxs("div", {
4526
- className: "rb-mt-6",
4527
- children: [/* @__PURE__ */ jsx("div", {
4528
- className: "rb-label rb-mb-2",
4529
- children: "With"
4530
- }), /* @__PURE__ */ jsx("div", {
4531
- className: "rb-flex rb-flex-col rb-gap-3",
4532
- children: teamMembers.map((teamMember) => /* @__PURE__ */ jsxs("div", { children: [/* @__PURE__ */ jsx("p", { children: /* @__PURE__ */ jsx(TeamMemberName$1, {
4533
- name: teamMember.name,
4534
- profilePath: teamMember.profilePath
4535
- }) }), teamMember.summary ? /* @__PURE__ */ jsx("p", {
4536
- className: "rb-caption status-muted",
4537
- children: teamMember.summary
4538
- }) : null] }, teamMember.id))
4539
- })]
4540
- }) : null,
4541
- isDropIn ? /* @__PURE__ */ jsxs("div", {
4542
- className: "rb-mt-6",
4543
- children: [/* @__PURE__ */ jsx("div", {
4544
- className: "rb-label rb-mb-2",
4545
- children: "Registration"
4546
- }), /* @__PURE__ */ jsx("p", {
4547
- className: "rb-caption status-muted",
4548
- children: "No registration required - just show up"
4549
- })]
4550
- }) : shouldShowCoursePricing ? /* @__PURE__ */ jsx(CoursePricingDisplay, {
4551
- pricing: coursePricing,
4552
- acceptedItems
4553
- }) : shouldShowEventCost ? /* @__PURE__ */ jsxs("div", {
4554
- className: "rb-mt-6",
4555
- children: [
4556
- /* @__PURE__ */ jsx("div", {
4557
- className: "rb-label rb-mb-2",
4558
- children: "Cost"
4559
- }),
4560
- /* @__PURE__ */ jsx("p", { children: /* @__PURE__ */ jsx("strong", { children: eventCostLabel }) }),
4561
- autoApplyDiscount ? /* @__PURE__ */ jsx("p", {
4562
- className: "rb-caption rb-mt-1",
4563
- children: formatAutoApplyDiscountLine(autoApplyDiscount, eventPricingCurrency)
4564
- }) : null,
4565
- /* @__PURE__ */ jsx(TicketTypePriceList, {
4566
- ticketTypes,
4567
- currency: eventPricingCurrency
4568
- }),
4569
- hasAcceptedItems ? /* @__PURE__ */ jsxs("p", {
4570
- className: "rb-caption rb-mt-1",
4571
- children: ["You can also attend with: ", acceptedItems.join(", ")]
4572
- }) : null
4573
- ]
4574
- }) : hasAcceptedItems ? /* @__PURE__ */ jsx("div", {
4575
- className: "rb-mt-6",
4576
- children: /* @__PURE__ */ jsxs("p", {
4577
- className: "rb-caption",
4578
- children: ["You can also attend with: ", acceptedItems.join(", ")]
4579
- })
4580
- }) : null
4581
- ]
4591
+ children: [/* @__PURE__ */ jsx(EventFacts, {
4592
+ selection,
4593
+ selected,
4594
+ venue,
4595
+ teamMembers,
4596
+ pricing: /* @__PURE__ */ jsx(EventPricingDetails, {
4597
+ isDropIn,
4598
+ coursePricing: showCost ? coursePricing : null,
4599
+ acceptedItems,
4600
+ eventCostLabel,
4601
+ eventPricingCurrency,
4602
+ ticketTypes,
4603
+ autoApplyDiscount
4604
+ })
4582
4605
  }), showMap && renderVenueMap && venue?.location ? /* @__PURE__ */ jsx(Fragment$1, { children: renderVenueMap({
4583
4606
  venueName: venue.name,
4584
4607
  location: venue.location,
4585
4608
  className: mapClassName,
4586
4609
  height: mapHeight
4587
4610
  }) }) : null]
4588
- }), showOtherDates && selection.otherDates.length > 0 ? /* @__PURE__ */ jsxs("div", { children: [/* @__PURE__ */ jsx("div", {
4589
- className: "rb-label",
4590
- children: "Other dates"
4591
- }), /* @__PURE__ */ jsx("div", {
4592
- className: "rb-mt-2 rb-tiles-grid",
4593
- children: selection.otherDates.map((e) => /* @__PURE__ */ jsx("a", {
4594
- className: "rb-tile rb-tile--interactive",
4595
- ...resolveEventLinkProps(e),
4596
- children: /* @__PURE__ */ jsx(DateTimeTile, {
4597
- startsAt: e.startsAt,
4598
- endsAt: e.endsAt,
4599
- timeZone: selection.timeZone
4600
- })
4601
- }, e.occurrenceId || e.id))
4602
- })] }) : null]
4611
+ }), showOtherDates ? /* @__PURE__ */ jsx(OtherEventDates, { selection }) : null]
4603
4612
  });
4604
4613
  }
4605
4614
  //#endregion
4606
4615
  //#region ../blocks/src/system/runtime/nodes/event-details.server.tsx
4607
- function EventDetailsSSR({ blockId, occurrenceContext, events, showVenue = true, showMap = true, showOtherDates = true, otherDatesLimit, showCost = true, showAcceptedPasses = true, showAcceptedMemberships = true, sitePasses, siteMemberships, autoApplyDiscount, className, children }) {
4616
+ function EventDetailsSSR({ blockId, occurrenceContext, subject, events, showVenue = true, showMap = true, showOtherDates = true, otherDatesLimit, showCost = true, showAcceptedPasses = true, showAcceptedMemberships = true, sitePasses, siteMemberships, autoApplyDiscount, className, children }) {
4608
4617
  const nowIso = (/* @__PURE__ */ new Date()).toISOString();
4618
+ const normalizedSubject = normalizeEventRegistrationPageSurfaceSubject(subject);
4609
4619
  const selection = selectEventDetails({
4610
4620
  events: events ?? null,
4611
4621
  occurrenceContext: occurrenceContext ?? null,
4622
+ subject: normalizedSubject,
4612
4623
  nowIso,
4613
4624
  otherDatesLimit
4614
4625
  });
@@ -4623,6 +4634,7 @@ function EventDetailsSSR({ blockId, occurrenceContext, events, showVenue = true,
4623
4634
  children: [
4624
4635
  /* @__PURE__ */ jsx(IslandPropsScript, { value: {
4625
4636
  occurrenceContext,
4637
+ subject: normalizedSubject,
4626
4638
  events,
4627
4639
  showVenue,
4628
4640
  showMap,
@@ -4763,7 +4775,7 @@ function resolveCoursePageSurfaceScope(courses, subjectValue) {
4763
4775
  return {
4764
4776
  kind: "scoped",
4765
4777
  subject: parsed.value,
4766
- courses: courses.filter((course) => allowedSeriesIds.has(course.seriesId))
4778
+ courses: courses.filter((course) => allowedSeriesIds.has(course.eventSeriesId))
4767
4779
  };
4768
4780
  }
4769
4781
  function eventSeriesIdsForSubject(subject) {
@@ -4775,43 +4787,8 @@ function eventSeriesIdsForSubject(subject) {
4775
4787
  }
4776
4788
  //#endregion
4777
4789
  //#region ../blocks/src/system/runtime/nodes/course-details/logic.ts
4778
- function coerceContentEntry(value) {
4779
- if (!value || typeof value !== "object") return null;
4780
- const obj = value;
4781
- return {
4782
- id: typeof obj.id === "string" ? obj.id : null,
4783
- slug: typeof obj.slug === "string" ? obj.slug : null
4784
- };
4785
- }
4786
- function coerceEntrySubrouteContext(value) {
4787
- if (!value || typeof value !== "object") return null;
4788
- const obj = value;
4789
- const kind = typeof obj.kind === "string" ? obj.kind : null;
4790
- if (!kind) return null;
4791
- if (kind === "course-run") {
4792
- const run = obj.run && typeof obj.run === "object" ? obj.run : null;
4793
- return {
4794
- kind: "course-run",
4795
- run: { courseId: typeof run?.courseId === "string" ? run.courseId : null }
4796
- };
4797
- }
4798
- if (kind === "event-occurrence") return { kind: "event-occurrence" };
4799
- return null;
4800
- }
4801
4790
  function selectCourseDetails(args) {
4802
- const courses = (args.courses ?? []).filter(Boolean);
4803
- const contentEntry = coerceContentEntry(args.contentEntry);
4804
- const entrySubrouteContext = coerceEntrySubrouteContext(args.entrySubrouteContext);
4805
- const slugOverride = (args.courseSlug ?? "").trim() || null;
4806
- if (entrySubrouteContext?.kind === "course-run" && entrySubrouteContext.run?.courseId) {
4807
- const byCourseId = courses.find((c) => c.id === entrySubrouteContext.run?.courseId) ?? null;
4808
- if (byCourseId) return {
4809
- mode: "runContext",
4810
- selected: byCourseId,
4811
- scoped: [byCourseId]
4812
- };
4813
- }
4814
- const pageSurfaceScope = resolveCoursePageSurfaceScope(courses, args.subject);
4791
+ const pageSurfaceScope = resolveCoursePageSurfaceScope((args.courses ?? []).filter(Boolean), args.subject);
4815
4792
  if (pageSurfaceScope.kind === "unsupported") return {
4816
4793
  mode: "unsupportedPageSurfaceSubject",
4817
4794
  selected: null,
@@ -4825,42 +4802,8 @@ function selectCourseDetails(args) {
4825
4802
  scoped
4826
4803
  };
4827
4804
  }
4828
- if (contentEntry?.id) {
4829
- const scoped = courses.filter((c) => c.contentEntryId === contentEntry.id);
4830
- if (scoped.length === 1) return {
4831
- mode: "contentEntry",
4832
- selected: scoped[0] ?? null,
4833
- scoped
4834
- };
4835
- if (scoped.length > 1) return {
4836
- mode: "contentEntry",
4837
- selected: null,
4838
- scoped
4839
- };
4840
- }
4841
- if (slugOverride) {
4842
- const bySlug = courses.find((c) => c.slug === slugOverride) ?? null;
4843
- if (bySlug) return {
4844
- mode: "slugOverride",
4845
- selected: bySlug,
4846
- scoped: [bySlug]
4847
- };
4848
- }
4849
- if (contentEntry?.slug) {
4850
- const bySlug = courses.find((c) => c.slug === contentEntry.slug) ?? null;
4851
- if (bySlug) return {
4852
- mode: "contentEntry",
4853
- selected: bySlug,
4854
- scoped: [bySlug]
4855
- };
4856
- }
4857
- if (courses.length === 1) return {
4858
- mode: "single",
4859
- selected: courses[0] ?? null,
4860
- scoped: courses
4861
- };
4862
4805
  return {
4863
- mode: "none",
4806
+ mode: "unsupportedPageSurfaceSubject",
4864
4807
  selected: null,
4865
4808
  scoped: []
4866
4809
  };
@@ -4872,12 +4815,6 @@ function toValidDate(value) {
4872
4815
  const date = new Date(value);
4873
4816
  return Number.isNaN(date.getTime()) ? null : date;
4874
4817
  }
4875
- function getEntryBasePath(contentEntry) {
4876
- if (!contentEntry) return null;
4877
- const path = contentEntry.path ?? contentEntry._entryPath ?? null;
4878
- if (!path) return null;
4879
- return path.startsWith("/") ? path : `/${path}`;
4880
- }
4881
4818
  function getCourseDateRange(course) {
4882
4819
  const datedSessions = (course.sessions ?? []).map((session) => ({
4883
4820
  session,
@@ -5055,17 +4992,13 @@ function CourseDetailsView(props) {
5055
4992
  }
5056
4993
  //#endregion
5057
4994
  //#region ../blocks/src/system/runtime/nodes/course-details.server.tsx
5058
- function CourseDetailsSSR({ courses, contentEntry, entrySubrouteContext, subject, courseSlug, showTitle, showDescription, showSessions, sessionsLimit, showVenue, showPrice, showCapacity, showEnrollmentStatus, showMembershipNote, className, children }) {
4995
+ function CourseDetailsSSR({ courses, subject, showTitle, showDescription, showSessions, sessionsLimit, showVenue, showPrice, showCapacity, showEnrollmentStatus, showMembershipNote, className, children }) {
5059
4996
  const selection = selectCourseDetails({
5060
4997
  courses: courses ?? null,
5061
- contentEntry,
5062
- entrySubrouteContext,
5063
- subject,
5064
- courseSlug
4998
+ subject
5065
4999
  });
5066
5000
  const parsedSubject = parseEventPageSurfaceSubject(subject);
5067
5001
  const awaitingOfferingRuns = parsedSubject.ok && parsedSubject.value.kind === "eventOffering" && parsedSubject.value.availableEventSeriesIds.length === 0;
5068
- const basePath = getEntryBasePath(contentEntry);
5069
5002
  const now = /* @__PURE__ */ new Date();
5070
5003
  const scopedWithRange = selection.scoped.map((c) => ({
5071
5004
  course: c,
@@ -5106,7 +5039,6 @@ function CourseDetailsSSR({ courses, contentEntry, entrySubrouteContext, subject
5106
5039
  const start = range.start;
5107
5040
  const end = range.end;
5108
5041
  const isInProgress = Boolean(start && end && start <= now && end > now);
5109
- const href = basePath ? `${basePath.replace(/\/$/, "")}/${course.slug}` : null;
5110
5042
  return /* @__PURE__ */ jsx("li", {
5111
5043
  className: "rb-rounded-md rb-border rb-p-3",
5112
5044
  children: /* @__PURE__ */ jsx("div", {
@@ -5115,11 +5047,7 @@ function CourseDetailsSSR({ courses, contentEntry, entrySubrouteContext, subject
5115
5047
  className: "rb-flex rb-items-center rb-justify-between rb-gap-3",
5116
5048
  children: [/* @__PURE__ */ jsxs("div", {
5117
5049
  className: "rb-min-w-0",
5118
- children: [href ? /* @__PURE__ */ jsx("a", {
5119
- href,
5120
- className: "rb-truncate",
5121
- children: /* @__PURE__ */ jsx("strong", { children: course.title })
5122
- }) : /* @__PURE__ */ jsx("div", {
5050
+ children: [/* @__PURE__ */ jsx("div", {
5123
5051
  className: "rb-truncate",
5124
5052
  children: /* @__PURE__ */ jsx("strong", { children: course.title })
5125
5053
  }), /* @__PURE__ */ jsx("div", {
@@ -5132,7 +5060,7 @@ function CourseDetailsSSR({ courses, contentEntry, entrySubrouteContext, subject
5132
5060
  })]
5133
5061
  })
5134
5062
  })
5135
- }, course.id);
5063
+ }, course.eventSeriesId);
5136
5064
  })
5137
5065
  }) : /* @__PURE__ */ jsx("p", {
5138
5066
  className: "rb-caption status-muted",
@@ -5524,80 +5452,13 @@ const EventSpotlight = ({ events, layout = "grid", columns = "3", cardVariant =
5524
5452
  };
5525
5453
  //#endregion
5526
5454
  //#region ../blocks/src/system/runtime/nodes/events/EventCombined.interactive.ts
5527
- const eventBlockKindSchema = z$1.enum(eventBlockKindValues);
5528
- const eventSurfaceScopeSchema = z$1.enum(eventSurfaceScopeValues);
5529
- const eventScheduleScopeSchema = z$1.enum(eventScheduleScopeValues);
5530
- const eventCombinedSourceSchema = z$1.object({
5531
- events: z$1.array(publicEventSchema).nullable().optional(),
5532
- siteId: z$1.string(),
5533
- apiBaseUrl: z$1.string().optional(),
5534
- stage: previewStageSchema.optional(),
5535
- listLayout: eventLayoutSchema.optional(),
5536
- listColumns: columnOptionSchema.optional(),
5537
- eventsPerPage: z$1.string().optional(),
5538
- paginationMode: z$1.enum(["loadMore", "seeAllLink"]).optional(),
5539
- seeAllUrl: z$1.string().optional(),
5540
- loadMoreText: z$1.string().optional(),
5541
- startOfWeek: weekStartSchema.optional(),
5542
- calendarTabViews: calendarTabViewsSchema.optional(),
5543
- defaultCalendarView: eventCalendarDefaultViewSchema.optional(),
5544
- showFilters: z$1.boolean().nullable().optional(),
5545
- showCategoryFilter: filterAutoShowSchema.optional(),
5546
- showVenueFilter: z$1.boolean().nullable().optional(),
5547
- showStaffFilter: z$1.boolean().nullable().optional(),
5548
- eventKind: eventBlockKindSchema.nullable().optional(),
5549
- eventSurface: eventSurfaceScopeSchema.nullable().optional(),
5550
- filterEventPresets: z$1.union([z$1.string(), z$1.array(z$1.string())]).nullable().optional(),
5551
- scheduleScope: eventScheduleScopeSchema.nullable().optional(),
5552
- filterCategoryIds: z$1.union([z$1.string(), z$1.array(z$1.string())]).nullable().optional(),
5553
- filterStaffMemberId: z$1.string().nullable().optional(),
5554
- filterVenueId: z$1.string().nullable().optional(),
5555
- showVenue: z$1.boolean().nullable().optional(),
5556
- showMap: z$1.boolean().nullable().optional(),
5557
- showCapacity: z$1.boolean().nullable().optional(),
5558
- buttonVariant: eventButtonVariantSchema.optional(),
5559
- buttonText: z$1.string().optional(),
5560
- emptyMessage: z$1.string().optional(),
5561
- className: z$1.string().optional()
5562
- });
5455
+ const eventCombinedSourceSchema = z$1.object({ ...eventCollectionSourceSchemaShape });
5563
5456
  const eventCombinedDisplaySchema = z$1.object({
5564
5457
  kind: z$1.literal("event-combined"),
5565
5458
  className: z$1.string().nullable(),
5566
- events: z$1.array(publicEventSchema),
5567
- listLayout: eventLayoutSchema,
5568
- listColumns: columnOptionSchema,
5569
- eventsPerPage: eventPageSizeSchema,
5570
- paginationAction: eventListPaginationActionSchema,
5571
- startOfWeek: weekStartSchema,
5572
- calendarTabViews: calendarTabViewsSchema,
5573
- defaultCalendarView: eventCalendarDefaultViewSchema,
5574
- showFilters: z$1.boolean(),
5575
- showCategoryFilter: filterAutoShowSchema,
5576
- showVenueFilter: z$1.boolean(),
5577
- showStaffFilter: z$1.boolean(),
5578
- eventKind: eventBlockKindSchema,
5579
- eventSurface: eventSurfaceScopeSchema,
5580
- filterEventPresets: z$1.string().nullable(),
5581
- scheduleScope: eventScheduleScopeSchema,
5582
- filterCategoryIds: z$1.string().nullable(),
5583
- filterStaffMemberId: z$1.string().nullable(),
5584
- filterVenueId: z$1.string().nullable(),
5585
- showVenue: z$1.boolean(),
5586
- showMap: z$1.boolean(),
5587
- showCapacity: z$1.boolean(),
5588
- buttonVariant: eventButtonVariantSchema,
5589
- buttonText: z$1.string(),
5590
- emptyMessage: z$1.string()
5591
- });
5592
- const eventCombinedHydrationSchema = z$1.object({
5593
- siteId: z$1.string(),
5594
- stage: previewStageSchema.optional(),
5595
- prefetchedEvents: z$1.boolean(),
5596
- eventKind: eventBlockKindSchema,
5597
- eventSurface: eventSurfaceScopeSchema,
5598
- filterEventPresets: z$1.string().nullable(),
5599
- scheduleScope: eventScheduleScopeSchema
5459
+ ...eventCollectionDisplaySchemaShape
5600
5460
  });
5461
+ const eventCombinedHydrationSchema = eventCollectionHydrationSchema;
5601
5462
  const eventCombinedRenderSchema = z$1.object({
5602
5463
  display: eventCombinedDisplaySchema,
5603
5464
  hydration: eventCombinedHydrationSchema
@@ -5609,62 +5470,14 @@ const eventCombinedIslandMetaCodec = createZodCodec(z$1.object({
5609
5470
  }));
5610
5471
  const eventCombinedIslandMetaKeys = defineInteractiveIslandMetaKeys("siteId", "apiBaseUrl", "stage");
5611
5472
  function buildEventCombinedDisplay(source) {
5612
- const listLayout = source.listLayout ?? "stack";
5613
5473
  return {
5474
+ ...buildEventCollectionDisplay(source),
5614
5475
  kind: "event-combined",
5615
- className: source.className ?? null,
5616
- events: Array.isArray(source.events) ? [...source.events] : [],
5617
- listLayout,
5618
- listColumns: source.listColumns ?? "3",
5619
- eventsPerPage: resolveEventCalendarListPageSize({ eventsPerPage: source.eventsPerPage }),
5620
- paginationAction: resolveEventListPaginationAction({
5621
- paginationMode: source.paginationMode,
5622
- seeAllUrl: source.seeAllUrl,
5623
- loadMoreText: source.loadMoreText
5624
- }),
5625
- startOfWeek: source.startOfWeek ?? "monday",
5626
- calendarTabViews: source.calendarTabViews ?? "both",
5627
- defaultCalendarView: source.defaultCalendarView ?? "month",
5628
- showFilters: source.showFilters ?? true,
5629
- showCategoryFilter: source.showCategoryFilter ?? "auto",
5630
- showVenueFilter: source.showVenueFilter ?? false,
5631
- showStaffFilter: source.showStaffFilter ?? true,
5632
- eventKind: normalizeEventBlockKind(source.eventKind),
5633
- eventSurface: normalizeEventSurfaceScope(source.eventSurface),
5634
- filterEventPresets: normalizeEventSurfacePresetsCsv(source.filterEventPresets),
5635
- scheduleScope: normalizeEventScheduleScope(source.scheduleScope),
5636
- filterCategoryIds: normalizeEventCategoryIdsCsv(source.filterCategoryIds),
5637
- filterStaffMemberId: normalizeEventStaffMemberId(source.filterStaffMemberId),
5638
- filterVenueId: normalizeEventVenueId(source.filterVenueId),
5639
- showVenue: source.showVenue ?? true,
5640
- showMap: source.showMap ?? true,
5641
- showCapacity: source.showCapacity ?? true,
5642
- buttonVariant: source.buttonVariant ?? "primary",
5643
- buttonText: source.buttonText ?? "Book",
5644
- emptyMessage: source.emptyMessage ?? "No upcoming events scheduled."
5476
+ className: source.className ?? null
5645
5477
  };
5646
5478
  }
5647
5479
  function buildEventCombinedListingDisplay(render, className = "event-combined-content") {
5648
- const { display, hydration } = render;
5649
- const pageSize = display.eventsPerPage;
5650
- const initialEvents = display.events.slice(0, pageSize);
5651
- return {
5652
- kind: "event-listing",
5653
- state: initialEvents.length === 0 ? hydration.prefetchedEvents ? "empty" : "loading" : "ready",
5654
- listLayout: display.listLayout,
5655
- className,
5656
- emptyMessage: display.emptyMessage,
5657
- loadingMessage: "Loading events…",
5658
- containerClass: getContainerClass(display.listLayout, display.listColumns),
5659
- cardVariant: "default",
5660
- buttonVariant: display.buttonVariant,
5661
- buttonText: display.buttonText,
5662
- showVenue: display.showVenue,
5663
- showMap: display.showMap,
5664
- showCapacity: display.showCapacity,
5665
- orientation: getCardOrientation(display.listLayout),
5666
- events: initialEvents
5667
- };
5480
+ return buildEventCollectionListingDisplay(render.display, render.hydration.prefetchedEvents, className);
5668
5481
  }
5669
5482
  const eventCombinedBlockRuntime = defineProgressiveBlockRuntime({
5670
5483
  kind: "progressive",
@@ -5674,15 +5487,7 @@ const eventCombinedBlockRuntime = defineProgressiveBlockRuntime({
5674
5487
  },
5675
5488
  buildRender: (source) => ({
5676
5489
  display: buildEventCombinedDisplay(source),
5677
- hydration: {
5678
- siteId: source.siteId,
5679
- stage: source.stage,
5680
- prefetchedEvents: source.events != null,
5681
- eventKind: normalizeEventBlockKind(source.eventKind),
5682
- eventSurface: normalizeEventSurfaceScope(source.eventSurface),
5683
- filterEventPresets: normalizeEventSurfacePresetsCsv(source.filterEventPresets),
5684
- scheduleScope: normalizeEventScheduleScope(source.scheduleScope)
5685
- }
5490
+ hydration: buildEventCollectionHydration(source)
5686
5491
  })
5687
5492
  });
5688
5493
  createInteractiveIslandCodec({
@@ -6112,7 +5917,7 @@ function renderOfferingCompactItem(item, options) {
6112
5917
  case "course": return /* @__PURE__ */ jsx(CourseCompactRow, {
6113
5918
  course: item.course,
6114
5919
  path: item.path
6115
- }, item.course.id);
5920
+ }, item.course.eventSeriesId);
6116
5921
  }
6117
5922
  }
6118
5923
  function renderSingleOfferingCard(item, options) {
@@ -6130,7 +5935,7 @@ function renderSingleOfferingCard(item, options) {
6130
5935
  path: item.path,
6131
5936
  buttonVariant: options.buttonVariant,
6132
5937
  buttonText: options.buttonText
6133
- }, item.course.id);
5938
+ }, item.course.eventSeriesId);
6134
5939
  }
6135
5940
  }
6136
5941
  function CourseCompactRow({ course, path }) {
@@ -7098,13 +6903,11 @@ function CheckoutSSR({ blockId, siteId, apiBaseUrl, stage, children, ...rest })
7098
6903
  * Server-safe placeholder for course registration.
7099
6904
  * Provides a static container for island hydration without importing client hooks.
7100
6905
  */
7101
- function CourseRegistrationSSR({ blockId, siteId, apiBaseUrl, portalToken, contentEntry, entrySubrouteContext, subject, courses, className, showSessions, showPrice, showCapacity, showVenue, successMessage, waitlistMessage, membershipMessage, buttonText, buttonVariant, stage, children }) {
6906
+ function CourseRegistrationSSR({ blockId, siteId, apiBaseUrl, portalToken, subject, courses, className, showSessions, showPrice, showCapacity, showVenue, successMessage, waitlistMessage, membershipMessage, buttonText, buttonVariant, stage, children }) {
7102
6907
  const islandProps = buildCourseRegistrationInteractiveIslandProps({
7103
6908
  siteId,
7104
6909
  apiBaseUrl,
7105
6910
  portalToken,
7106
- contentEntry,
7107
- entrySubrouteContext,
7108
6911
  subject,
7109
6912
  courses,
7110
6913
  className,
@@ -8072,14 +7875,13 @@ function cx(...classes) {
8072
7875
  * Server-safe placeholder for event registration.
8073
7876
  * Provides a static container for island hydration without importing client hooks.
8074
7877
  */
8075
- function EventRegistrationSSR({ blockId, siteId, apiBaseUrl, portalToken, previewToken, occurrenceContext, contentEntry, subject, events, className, buttonText, maxTickets, showVenue, showCapacity, successMessage, waitlistMessage, buttonVariant, overlayEnabled, spamProtectionEnabled, stage, supportEmail, sitePasses, siteMemberships, children }) {
7878
+ function EventRegistrationSSR({ blockId, siteId, apiBaseUrl, portalToken, previewToken, occurrenceContext, subject, events, className, buttonText, maxTickets, showVenue, showCapacity, successMessage, waitlistMessage, buttonVariant, overlayEnabled, spamProtectionEnabled, stage, supportEmail, sitePasses, siteMemberships, children }) {
8076
7879
  const islandProps = buildEventRegistrationInteractiveIslandProps({
8077
7880
  siteId,
8078
7881
  apiBaseUrl,
8079
7882
  portalToken,
8080
7883
  previewToken,
8081
7884
  occurrenceContext,
8082
- contentEntry,
8083
7885
  subject: normalizeEventRegistrationPageSurfaceSubject(subject),
8084
7886
  events,
8085
7887
  className,
@@ -9440,7 +9242,7 @@ function useBookingSubmission(_siteId) {
9440
9242
  };
9441
9243
  }
9442
9244
  //#endregion
9443
- //#region ../blocks/src/system/runtime/api/types.ts
9245
+ //#region ../blocks/src/system/runtime/api/types/discounts.ts
9444
9246
  function discountAvailabilityHasDiscounts(availability) {
9445
9247
  return availability.type !== "none";
9446
9248
  }
@@ -9472,7 +9274,7 @@ function getDiscountContextKey(context) {
9472
9274
  context.ticketsCount ?? ""
9473
9275
  ].join(":");
9474
9276
  case "appointment": return [context.type, context.serviceId].join(":");
9475
- case "course": return [context.type, context.courseId].join(":");
9277
+ case "whole_series": return [context.type, context.eventSeriesId].join(":");
9476
9278
  case "pass": return [context.type, context.passId].join(":");
9477
9279
  case "membership": return [context.type, context.membershipId].join(":");
9478
9280
  case "product": return [
@@ -13270,6 +13072,23 @@ function areEntitlementsDisabledForTicketCount(ticketsCount) {
13270
13072
  return ticketsCount > 1;
13271
13073
  }
13272
13074
  /**
13075
+ * Describe what redeeming a pass costs the customer.
13076
+ *
13077
+ * The balance is what they hold *before* this booking, so "1 of 5" means four
13078
+ * are left afterwards. Spelling out the balance is what stops people missing
13079
+ * that a credit is being spent at all.
13080
+ *
13081
+ * Always one credit: passes are only redeemable for single-ticket bookings,
13082
+ * per {@link areEntitlementsDisabledForTicketCount}.
13083
+ *
13084
+ * @param creditsRemaining - Credits on the pass before this booking, if known
13085
+ */
13086
+ function formatPassCreditUsageLabel(creditsRemaining) {
13087
+ if (typeof creditsRemaining !== "number" || creditsRemaining <= 0) return "Uses 1 pass credit";
13088
+ if (creditsRemaining === 1) return "Uses your last credit";
13089
+ return `Uses 1 of ${creditsRemaining} credits`;
13090
+ }
13091
+ /**
13273
13092
  * Transform API eligibility response to internal eligibility data.
13274
13093
  *
13275
13094
  * @param response - The raw API response from checkEligibility
@@ -14240,6 +14059,23 @@ function isDirectPaymentOptionSelected(option, selectionState) {
14240
14059
  return selectionState.kind === "valid" && selectionState.selection.collectionOptionKind === option.kind;
14241
14060
  }
14242
14061
  /**
14062
+ * Label for the button that acts on the chosen payment method.
14063
+ *
14064
+ * A pass redemption spends a credit the moment it is pressed, so the label
14065
+ * names the pass instead of describing the step.
14066
+ */
14067
+ function resolvePaymentButtonText(method) {
14068
+ switch (method) {
14069
+ case "stripe": return "Continue to Payment";
14070
+ case "pass": return "Book using class pass";
14071
+ case "pass_bundle":
14072
+ case "membership_bundle": return "Purchase & Register";
14073
+ case "free":
14074
+ case "membership":
14075
+ case null: return "Complete Registration";
14076
+ }
14077
+ }
14078
+ /**
14243
14079
  * Payment Selection Step
14244
14080
  *
14245
14081
  * Shows payment options based on event pricing type and user eligibility.
@@ -14279,11 +14115,7 @@ const PaymentSelectionStep = ({ event, occurrenceContext, ticketsCount, email, i
14279
14115
  collectionOptionKind: directPaymentFallbackKind
14280
14116
  });
14281
14117
  }, [directPaymentFallbackKind, onSelectionChange]);
14282
- const getButtonText = useCallback(() => {
14283
- if (selectedMethod === "stripe") return "Continue to Payment";
14284
- if (selectedMethod === "pass_bundle" || selectedMethod === "membership_bundle") return "Purchase & Register";
14285
- return "Complete Registration";
14286
- }, [selectedMethod]);
14118
+ const getButtonText = useCallback(() => resolvePaymentButtonText(selectedMethod), [selectedMethod]);
14287
14119
  useEffect(() => {
14288
14120
  if (!onStateChange) return;
14289
14121
  let status = "ready";
@@ -14830,6 +14662,21 @@ function EventRegistrationWizardContent(props) {
14830
14662
  }
14831
14663
  //#endregion
14832
14664
  //#region ../blocks/src/system/runtime/nodes/event-registration/EventRegistrationWizardActions.tsx
14665
+ /**
14666
+ * Label for the button that submits the details step.
14667
+ *
14668
+ * When a pass covers the booking there is no payment step to follow, so this
14669
+ * button is the last thing read before a credit is spent — it names the pass
14670
+ * rather than leaving that to the summary above it.
14671
+ */
14672
+ function resolveDetailsButtonText(input) {
14673
+ const { wizard } = input;
14674
+ if (wizard.eligibility?.canJoinWaitlist) return "Join Waitlist";
14675
+ if (!input.hasWaitlistClaim && wizard.eligibility?.isFull) return "Sold out";
14676
+ if (wizard.paymentSelection.method === "pass") return "Book using class pass";
14677
+ if (wizard.paymentSelection.method === "membership") return input.fallbackText;
14678
+ return wizard.eventRequiresPayment ? "Continue to Payment" : input.fallbackText;
14679
+ }
14833
14680
  function EventRegistrationWizardActions(props) {
14834
14681
  const { wizard } = props;
14835
14682
  const nextStepAfterTickets = "enter-details";
@@ -14837,12 +14684,11 @@ function EventRegistrationWizardActions(props) {
14837
14684
  const hasWaitlistClaim = wizard.waitlistClaim.claim !== null;
14838
14685
  const currentEvent = wizard.selectedEvent ?? wizard.preSelectedEvent;
14839
14686
  const isSoldOutWithoutWaitlist = !hasWaitlistClaim && currentEvent?.availableSpots === 0 && currentEvent.waitlistEnabled !== true;
14840
- const getDetailsButtonText = () => {
14841
- if (wizard.eligibility?.canJoinWaitlist) return "Join Waitlist";
14842
- if (!hasWaitlistClaim && wizard.eligibility?.isFull && !wizard.eligibility.canJoinWaitlist) return "Sold out";
14843
- if (wizard.paymentSelection.method === "pass" || wizard.paymentSelection.method === "membership") return props.buttonText;
14844
- return wizard.eventRequiresPayment ? "Continue to Payment" : props.buttonText;
14845
- };
14687
+ const getDetailsButtonText = () => resolveDetailsButtonText({
14688
+ wizard,
14689
+ hasWaitlistClaim,
14690
+ fallbackText: props.buttonText
14691
+ });
14846
14692
  switch (wizard.step) {
14847
14693
  case "error":
14848
14694
  case "success":
@@ -14938,6 +14784,41 @@ function isProductMethod(method) {
14938
14784
  "membership_bundle"
14939
14785
  ].includes(method);
14940
14786
  }
14787
+ /** Credits held on the pass the customer is about to redeem, before this booking. */
14788
+ function getSelectedPassCreditsRemaining(wizard) {
14789
+ const { method, passId } = wizard.paymentSelection;
14790
+ if (method !== "pass" || !passId) return null;
14791
+ return (wizard.eligibility?.eligiblePasses ?? []).find((candidate) => candidate.id === passId)?.creditsRemaining ?? null;
14792
+ }
14793
+ /**
14794
+ * Copy describing how a pass or membership covers the booking.
14795
+ *
14796
+ * Pass redemptions spend something, so they say so and name the balance;
14797
+ * memberships already include the class, so "Included" stays accurate.
14798
+ */
14799
+ function resolveEntitlementSummaryCopy(method, passCreditsRemaining) {
14800
+ switch (method) {
14801
+ case "pass": return {
14802
+ productPrice: "1 credit",
14803
+ pricingNote: formatPassCreditUsageLabel(passCreditsRemaining)
14804
+ };
14805
+ case "pass_bundle": return {
14806
+ productPrice: null,
14807
+ pricingNote: "1 pass credit"
14808
+ };
14809
+ case "membership": return {
14810
+ productPrice: "Included",
14811
+ pricingNote: "Included in membership"
14812
+ };
14813
+ case "membership_bundle":
14814
+ case "free":
14815
+ case "stripe":
14816
+ case null: return {
14817
+ productPrice: null,
14818
+ pricingNote: "Included in membership"
14819
+ };
14820
+ }
14821
+ }
14941
14822
  function getSummaryRow(option, label) {
14942
14823
  return option.summaryRows.find((row) => row.label === label)?.value ?? null;
14943
14824
  }
@@ -14954,6 +14835,35 @@ function getSelectedDirectPaymentOption(input) {
14954
14835
  const requestedKind = input.wizard.paymentSelection.collectionOptionKind ?? "upfront";
14955
14836
  return options.find((option) => option.kind === requestedKind) ?? options.find((option) => option.kind === "upfront") ?? options[0] ?? null;
14956
14837
  }
14838
+ /** Product row naming the pass or membership that covers this booking. */
14839
+ function EntitlementSummaryRow(props) {
14840
+ const { paymentSelection } = props.wizard;
14841
+ return /* @__PURE__ */ jsxs("div", {
14842
+ className: "er-summary-bar-product",
14843
+ children: [/* @__PURE__ */ jsxs("div", { children: [
14844
+ /* @__PURE__ */ jsx("div", {
14845
+ className: "er-summary-bar-product-name",
14846
+ children: paymentSelection.productName
14847
+ }),
14848
+ props.showPassEscape && /* @__PURE__ */ jsx("button", {
14849
+ type: "button",
14850
+ className: "er-summary-bar-pass-escape",
14851
+ onClick: props.wizard.handleUseCardInsteadOfPass,
14852
+ children: "Pay by card instead"
14853
+ }),
14854
+ paymentSelection.productInterval && /* @__PURE__ */ jsx("div", {
14855
+ className: "er-summary-bar-product-detail",
14856
+ children: paymentSelection.productInterval
14857
+ })
14858
+ ] }), /* @__PURE__ */ jsx("div", {
14859
+ className: "er-summary-bar-product-price",
14860
+ children: props.copy.productPrice ? /* @__PURE__ */ jsx("span", {
14861
+ className: "er-summary-bar-included",
14862
+ children: props.copy.productPrice
14863
+ }) : paymentSelection.productPrice ? formatPrice(paymentSelection.productPrice, paymentSelection.productCurrency ?? "usd") : null
14864
+ })]
14865
+ });
14866
+ }
14957
14867
  function EventRegistrationSummaryBar(props) {
14958
14868
  const { wizard } = props;
14959
14869
  const summaryEvent = wizard.selectedEvent ?? wizard.preSelectedEvent;
@@ -14981,30 +14891,13 @@ function EventRegistrationSummaryBar(props) {
14981
14891
  } : null;
14982
14892
  if (!summaryTitle) return null;
14983
14893
  const productMethod = isProductMethod(wizard.paymentSelection.method);
14984
- return /* @__PURE__ */ jsxs(Fragment$1, { children: [productMethod && wizard.paymentSelection.productName && /* @__PURE__ */ jsxs("div", {
14985
- className: "er-summary-bar-product",
14986
- children: [/* @__PURE__ */ jsxs("div", { children: [
14987
- /* @__PURE__ */ jsx("div", {
14988
- className: "er-summary-bar-product-name",
14989
- children: wizard.paymentSelection.productName
14990
- }),
14991
- wizard.paymentSelection.method === "pass" && wizard.step === "enter-details" && /* @__PURE__ */ jsx("button", {
14992
- type: "button",
14993
- className: "er-summary-bar-pass-escape",
14994
- onClick: wizard.handleUseCardInsteadOfPass,
14995
- children: "Don't want to use your pass?"
14996
- }),
14997
- wizard.paymentSelection.productInterval && /* @__PURE__ */ jsx("div", {
14998
- className: "er-summary-bar-product-detail",
14999
- children: wizard.paymentSelection.productInterval
15000
- })
15001
- ] }), /* @__PURE__ */ jsx("div", {
15002
- className: "er-summary-bar-product-price",
15003
- children: wizard.paymentSelection.method === "pass" || wizard.paymentSelection.method === "membership" ? /* @__PURE__ */ jsx("span", {
15004
- className: "er-summary-bar-included",
15005
- children: "Included"
15006
- }) : wizard.paymentSelection.productPrice ? formatPrice(wizard.paymentSelection.productPrice, wizard.paymentSelection.productCurrency ?? "usd") : null
15007
- })]
14894
+ const isPassRedemption = wizard.paymentSelection.method === "pass";
14895
+ const entitlementCopy = resolveEntitlementSummaryCopy(wizard.paymentSelection.method, getSelectedPassCreditsRemaining(wizard));
14896
+ const showPassEscape = isPassRedemption && (wizard.step === "enter-details" || wizard.step === "select-tickets");
14897
+ return /* @__PURE__ */ jsxs(Fragment$1, { children: [productMethod && wizard.paymentSelection.productName && /* @__PURE__ */ jsx(EntitlementSummaryRow, {
14898
+ wizard,
14899
+ copy: entitlementCopy,
14900
+ showPassEscape
15008
14901
  }), /* @__PURE__ */ jsxs("div", {
15009
14902
  className: "er-summary-bar",
15010
14903
  children: [/* @__PURE__ */ jsxs("div", {
@@ -15035,7 +14928,7 @@ function EventRegistrationSummaryBar(props) {
15035
14928
  children: formatPrice(subtotalCents, summaryCurrency)
15036
14929
  }), /* @__PURE__ */ jsx("div", {
15037
14930
  className: "er-summary-bar-included",
15038
- children: wizard.paymentSelection.method === "pass" || wizard.paymentSelection.method === "pass_bundle" ? "1 pass credit" : "Included in membership"
14931
+ children: entitlementCopy.pricingNote
15039
14932
  })] }) : flexibleBalanceSummary ? /* @__PURE__ */ jsxs(Fragment$1, { children: [
15040
14933
  flexibleBalanceSummary.total ? /* @__PURE__ */ jsxs("div", {
15041
14934
  className: "er-summary-bar-product-detail",
@@ -15781,6 +15674,33 @@ const eventRegistrationSubmitDeps = { savePendingRegistration };
15781
15674
  function useEventRegistrationSubmit(options) {
15782
15675
  return useEventRegistrationSubmitWithDeps(options, eventRegistrationSubmitDeps);
15783
15676
  }
15677
+ /**
15678
+ * Describe a completed registration to the success step.
15679
+ *
15680
+ * Only pass redemptions adopt the server's message: it names the credits spent
15681
+ * and the balance left, which the block's copy cannot. Every other method keeps
15682
+ * whatever success message the site configured.
15683
+ */
15684
+ function toRegistrationResult(result) {
15685
+ if (result.alreadyRegistered) {
15686
+ const waitlisted = result.status === "waitlist";
15687
+ return {
15688
+ status: result.status,
15689
+ variant: "info",
15690
+ title: waitlisted ? "Already waitlisted" : "Already registered",
15691
+ message: result.message ?? (waitlisted ? "You are already on the waitlist for this event." : "You are already registered for this event.")
15692
+ };
15693
+ }
15694
+ if (result.status === "waitlist") return {
15695
+ status: "waitlist",
15696
+ title: "Added to waitlist",
15697
+ message: result.message ?? (typeof result.waitlistPosition === "number" ? `You've been added to the waitlist (position ${result.waitlistPosition}).` : "You've been added to the waitlist.")
15698
+ };
15699
+ return {
15700
+ status: result.status,
15701
+ message: result.paymentMethod === "pass" ? result.message : void 0
15702
+ };
15703
+ }
15784
15704
  function useEventRegistrationSubmitWithDeps(options, deps) {
15785
15705
  return async (method, passId, membershipId, selection, submitOptions) => {
15786
15706
  const submitOccurrenceId = options.registrationTarget?.occurrenceId;
@@ -15890,23 +15810,7 @@ function useEventRegistrationSubmitWithDeps(options, deps) {
15890
15810
  }
15891
15811
  };
15892
15812
  }
15893
- if (result.alreadyRegistered) {
15894
- const title = result.status === "waitlist" ? "Already waitlisted" : "Already registered";
15895
- const fallbackMessage = result.status === "waitlist" ? "You are already on the waitlist for this event." : "You are already registered for this event.";
15896
- options.setRegistrationResult({
15897
- status: result.status,
15898
- variant: "info",
15899
- title,
15900
- message: result.message ?? fallbackMessage
15901
- });
15902
- } else if (result.status === "waitlist") {
15903
- const waitlistMessage = typeof result.waitlistPosition === "number" ? `You've been added to the waitlist (position ${result.waitlistPosition}).` : "You've been added to the waitlist.";
15904
- options.setRegistrationResult({
15905
- status: "waitlist",
15906
- title: "Added to waitlist",
15907
- message: result.message ?? waitlistMessage
15908
- });
15909
- } else options.setRegistrationResult({ status: result.status });
15813
+ options.setRegistrationResult(toRegistrationResult(result));
15910
15814
  options.setStep("success");
15911
15815
  return {
15912
15816
  ok: true,
@@ -15969,16 +15873,13 @@ function useEventRegistrationWizardWithDeps(options, deps) {
15969
15873
  const scopedEvents = useMemo(() => {
15970
15874
  return resolveEventRegistrationScopedEvents(registrationEvents, {
15971
15875
  occurrenceContext: options.occurrenceContext,
15972
- subject: options.subject,
15973
- contentEntry: options.contentEntry
15876
+ subject: options.subject
15974
15877
  });
15975
15878
  }, [
15976
15879
  registrationEvents,
15977
15880
  options.occurrenceContext?.seriesId,
15978
15881
  options.subject?.kind,
15979
- options.subject?.kind === "eventSeries" ? options.subject.eventSeriesId : options.subject?.kind === "eventOffering" ? `${options.subject.eventOfferingId}:${options.subject.availableEventSeriesIds.join(",")}` : options.subject?.reason,
15980
- options.contentEntry?.slug,
15981
- options.contentEntry?.contentTypeSlug
15882
+ options.subject?.kind === "eventSeries" ? options.subject.eventSeriesId : options.subject?.kind === "eventOffering" ? `${options.subject.eventOfferingId}:${options.subject.availableEventSeriesIds.join(",")}` : options.subject?.reason
15982
15883
  ]);
15983
15884
  const preSelectedEvent = useMemo(() => findPreSelectedEvent({
15984
15885
  scopedEvents,
@@ -16518,7 +16419,6 @@ function useEventRegistrationWizardWithDeps(options, deps) {
16518
16419
  anchorId: options.anchorId,
16519
16420
  occurrenceContext: options.occurrenceContext,
16520
16421
  registrationTarget,
16521
- contentEntry: options.contentEntry,
16522
16422
  subject: options.subject,
16523
16423
  events: options.events,
16524
16424
  maxTicketsNum: waitlistClaim.claim ? 1 : options.maxTicketsNum,
@@ -16862,7 +16762,7 @@ function formatTicketTypePrice(ticketType, currency) {
16862
16762
  return formatCurrencyAmount(ticketType.priceAmount, currency, { decimals: "auto" });
16863
16763
  }
16864
16764
  function EventRegistrationWizard(props) {
16865
- const { occurrenceContext, contentEntry, subject, events, maxTickets = "5", showVenue = true, showCapacity = true, successMessage = "Thank you for registering! Check your email for confirmation details.", waitlistMessage: _waitlistMessage = "You've been added to the waitlist. We'll email you a claim link if a spot opens up.", buttonText = "Complete Registration", buttonVariant = "primary", className, spamProtectionEnabled, supportEmail, sitePasses, siteMemberships } = props;
16765
+ const { occurrenceContext, subject, events, maxTickets = "5", showVenue = true, showCapacity = true, successMessage = "Thank you for registering! Check your email for confirmation details.", waitlistMessage: _waitlistMessage = "You've been added to the waitlist. We'll email you a claim link if a spot opens up.", buttonText = "Complete Registration", buttonVariant = "primary", className, spamProtectionEnabled, supportEmail, sitePasses, siteMemberships } = props;
16866
16766
  const maxTicketsNum = normalizeEventRegistrationMaxTickets(maxTickets);
16867
16767
  const showSpamProtection = spamProtectionEnabled ?? isSpamProtectionEnabled();
16868
16768
  const buttonClass = themeButtonClassName({
@@ -16874,7 +16774,6 @@ function EventRegistrationWizard(props) {
16874
16774
  const wizard = useEventRegistrationWizard({
16875
16775
  anchorId: EVENT_REGISTRATION_ANCHOR_ID,
16876
16776
  occurrenceContext: occurrenceContext ?? null,
16877
- contentEntry: contentEntry ?? null,
16878
16777
  subject: subject ?? null,
16879
16778
  events: events ?? [],
16880
16779
  maxTicketsNum
@@ -17626,6 +17525,37 @@ function EnrollmentForm({ formData, errors, onChange, isEmailLocked, isLoading,
17626
17525
  ] });
17627
17526
  }
17628
17527
  //#endregion
17528
+ //#region ../blocks/src/system/runtime/nodes/course-registration/pricing.ts
17529
+ function parseCurrencyInputToCents(value) {
17530
+ const trimmed = value.trim();
17531
+ if (!trimmed) return null;
17532
+ const amount = Number(trimmed);
17533
+ if (!Number.isFinite(amount) || amount < 0) return null;
17534
+ return Math.round(amount * 100);
17535
+ }
17536
+ function formatCentsAsCurrencyInput(amount) {
17537
+ const major = amount / 100;
17538
+ return Number.isInteger(major) ? String(major) : major.toFixed(2);
17539
+ }
17540
+ function getMissingCoursePricingSelectionMessage(pricing) {
17541
+ if (pricing?.requiresSelection && !pricing.selectedOption) return pricing.slidingScale ? "Choose an amount to continue." : "Choose a pricing option to continue.";
17542
+ const selectedAmount = pricing?.selectedSlidingAmount;
17543
+ const scale = pricing?.slidingScale;
17544
+ if (scale && selectedAmount !== null && selectedAmount !== void 0 && (selectedAmount < scale.minAmount || selectedAmount > scale.maxAmount)) return "Choose an amount within the sliding scale.";
17545
+ return null;
17546
+ }
17547
+ function buildCoursePricingOptionPayload(pricing) {
17548
+ if (pricing?.selectedOption) return { pricingOptionId: pricing.selectedOption.id };
17549
+ if (pricing?.slidingScale && pricing.selectedSlidingAmount !== null) return { selectedSlidingAmount: pricing.selectedSlidingAmount };
17550
+ return {};
17551
+ }
17552
+ function defaultCoursePricingSelection(pricing, previousOptionId) {
17553
+ return {
17554
+ pricingOptionId: previousOptionId && pricing.selectableOptions.some((option) => option.id === previousOptionId) ? previousOptionId : pricing.selectedOption?.id ?? null,
17555
+ slidingAmountInput: pricing.slidingScale?.suggestedAmount !== null && pricing.slidingScale?.suggestedAmount !== void 0 ? formatCentsAsCurrencyInput(pricing.slidingScale.suggestedAmount) : ""
17556
+ };
17557
+ }
17558
+ //#endregion
17629
17559
  //#region ../blocks/src/system/runtime/nodes/course-registration/wizardSteps.ts
17630
17560
  /**
17631
17561
  * Steps that are part of the main wizard and should show the step indicator.
@@ -17698,654 +17628,608 @@ function getStepLabels(steps) {
17698
17628
  return steps.map((step) => STEP_LABELS[step] ?? step);
17699
17629
  }
17700
17630
  //#endregion
17701
- //#region ../blocks/src/system/runtime/nodes/course-registration/useCourseRegistrationWizard.ts
17702
- function parseCurrencyInputToCents(value) {
17703
- const trimmed = value.trim();
17704
- if (!trimmed) return null;
17705
- const amount = Number(trimmed);
17706
- if (!Number.isFinite(amount) || amount < 0) return null;
17707
- return Math.round(amount * 100);
17631
+ //#region ../blocks/src/system/runtime/nodes/course-registration/courseRegistrationViewState.ts
17632
+ function deriveCourseRegistrationViewState(input) {
17633
+ const hasCoursePayment = resolveCoursePaymentRequirement(input.pricing);
17634
+ const canUseMembership = hasCoursePayment && input.selectedCourse?.acceptsMemberships === true && input.portalAuthState === "authenticated" && input.eligibleMembershipCount > 0;
17635
+ const hasPreSelectedCourse = input.scopedCourses.length === 1;
17636
+ const fastTrack = canUseMembership && input.eligibleMembershipCount === 1 && input.bookingMode === "membership";
17637
+ const wizardSteps = getWizardStepsForContext(hasPreSelectedCourse, hasCoursePayment, canUseMembership, input.bookingMode, fastTrack);
17638
+ const showPortalAuthSidebar = shouldShowPortalAuthSidebar({
17639
+ ...input,
17640
+ hasCoursePayment
17641
+ });
17642
+ return {
17643
+ hasCoursePayment,
17644
+ canUseMembership,
17645
+ hasPreSelectedCourse,
17646
+ wizardSteps,
17647
+ currentStepNumber: getStepNumber(input.step, wizardSteps),
17648
+ totalSteps: wizardSteps.length,
17649
+ stepLabels: getStepLabels(wizardSteps),
17650
+ showPortalAuthSidebar
17651
+ };
17708
17652
  }
17709
- function formatCentsAsCurrencyInput(amount) {
17710
- const major = amount / 100;
17711
- return Number.isInteger(major) ? String(major) : major.toFixed(2);
17653
+ function resolveCoursePaymentRequirement(pricing) {
17654
+ if (!pricing) return false;
17655
+ return pricing.selectedOption ? pricing.selectedRequiresPayment : pricing.hasPaidSelection;
17712
17656
  }
17713
- function shouldFetchCourseEligibility(course, hasPaidSelection, portalAuthState, hasWaitlistClaimToken) {
17714
- if (!course || portalAuthState === "checking") return false;
17715
- if (hasWaitlistClaimToken) return false;
17716
- const needsMembershipEligibility = portalAuthState === "authenticated" && hasPaidSelection && course.acceptsMemberships;
17717
- const needsWaitlistAvailabilityCheck = course.availableSpots !== null && course.availableSpots <= 0;
17718
- return needsMembershipEligibility || needsWaitlistAvailabilityCheck;
17657
+ function shouldShowPortalAuthSidebar(input) {
17658
+ if (input.portalAuthState !== "unauthenticated") return false;
17659
+ if (input.step === "success" || input.step === "waitlist" || input.step === "error") return false;
17660
+ return input.waitlistRequiresPortalLogin || input.hasCoursePayment && input.selectedCourse?.acceptsMemberships === true && input.step !== "select-course";
17719
17661
  }
17720
- /**
17721
- * Extracts session_id from URL, checking both query params and hash fragment.
17722
- *
17723
- * Stripe appends session_id to the success URL, but if our URL contains a hash
17724
- * (e.g., #course-registration), Stripe ends up appending session_id after the hash:
17725
- * Expected: ?enrollment=success&session_id=cs_test_...#course-registration
17726
- * Actual: ?enrollment=success#course-registration&session_id=cs_test_...
17727
- *
17728
- * This helper checks both locations to handle this edge case.
17729
- */
17730
- function getSessionIdFromUrl() {
17662
+ //#endregion
17663
+ //#region ../blocks/src/system/runtime/nodes/course-registration/useCourseEligibility.ts
17664
+ function shouldFetchEligibility(input) {
17665
+ if (!input.course || input.portalAuthState === "checking" || input.hasWaitlistClaimToken) return false;
17666
+ const membershipCheck = input.portalAuthState === "authenticated" && input.hasPaidSelection && input.course.acceptsMemberships;
17667
+ const capacityCheck = input.course.availableSpots !== null && input.course.availableSpots <= 0;
17668
+ return membershipCheck || capacityCheck;
17669
+ }
17670
+ function useCourseEligibility(input) {
17671
+ const [loading, setLoading] = useState(false);
17672
+ const [error, setError] = useState(null);
17673
+ const [eligibility, setEligibility] = useState(null);
17674
+ const [memberships, setMemberships] = useState([]);
17675
+ const [paymentChoice, setPaymentChoice] = useState("checkout");
17676
+ const [selectedMembershipId, setSelectedMembershipId] = useState(null);
17677
+ const choosePaymentChoice = useCallback((choice) => {
17678
+ setPaymentChoice(choice);
17679
+ }, []);
17680
+ const chooseMembership = useCallback((membershipId) => {
17681
+ setSelectedMembershipId(membershipId);
17682
+ }, []);
17683
+ useEffect(() => {
17684
+ let cancelled = false;
17685
+ setEligibility(null);
17686
+ setMemberships([]);
17687
+ setSelectedMembershipId(null);
17688
+ setError(null);
17689
+ setPaymentChoice("checkout");
17690
+ const eligibilityInput = {
17691
+ course: input.selectedCourse,
17692
+ hasPaidSelection: input.hasPaidSelection,
17693
+ portalAuthState: input.portalAuthState,
17694
+ hasWaitlistClaimToken: input.waitlistClaimToken !== null
17695
+ };
17696
+ if (!shouldFetchEligibility(eligibilityInput)) return;
17697
+ const course = eligibilityInput.course;
17698
+ setLoading(true);
17699
+ input.api.checkWholeSeriesEligibility({ eventSeriesId: course.eventSeriesId }).then((result) => {
17700
+ if (cancelled) return;
17701
+ const eligibleMemberships = result.eligibleMemberships ?? [];
17702
+ setEligibility(result);
17703
+ setMemberships(eligibleMemberships);
17704
+ if (input.portalAuthState === "authenticated" && eligibleMemberships.length > 0) {
17705
+ setPaymentChoice("membership");
17706
+ if (eligibleMemberships.length === 1) setSelectedMembershipId(eligibleMemberships[0]?.customerMembershipId ?? null);
17707
+ }
17708
+ }).catch((cause) => {
17709
+ if (!cancelled) setError(cause instanceof Error ? cause.message : "Failed to check membership eligibility");
17710
+ }).finally(() => {
17711
+ if (!cancelled) setLoading(false);
17712
+ });
17713
+ return () => {
17714
+ cancelled = true;
17715
+ };
17716
+ }, [
17717
+ input.api,
17718
+ input.hasPaidSelection,
17719
+ input.portalAuthState,
17720
+ input.selectedCourse,
17721
+ input.waitlistClaimToken
17722
+ ]);
17723
+ return {
17724
+ eligibilityLoading: loading,
17725
+ eligibilityError: error,
17726
+ courseEligibility: eligibility,
17727
+ eligibleMemberships: memberships,
17728
+ paymentChoice,
17729
+ choosePaymentChoice,
17730
+ selectedMembershipId,
17731
+ chooseMembership
17732
+ };
17733
+ }
17734
+ //#endregion
17735
+ //#region ../blocks/src/system/runtime/nodes/course-registration/useCourseRegistrationSelection.ts
17736
+ function selectScopedCourses(props) {
17737
+ const surfaceScope = resolveCoursePageSurfaceScope(props.courses ?? [], props.subject);
17738
+ if (surfaceScope.kind === "unsupported") return [];
17739
+ if (surfaceScope.kind === "scoped") return surfaceScope.courses;
17740
+ return [];
17741
+ }
17742
+ function getCourseCheckoutSessionId() {
17731
17743
  const fromSearch = new URLSearchParams(window.location.search).get("session_id");
17732
17744
  if (fromSearch) return fromSearch;
17733
17745
  return window.location.hash.match(/[?&]session_id=([^&]+)/)?.[1] ?? null;
17734
17746
  }
17735
- function getMissingCoursePricingSelectionMessage(pricing) {
17736
- if (pricing?.requiresSelection && !pricing.selectedOption) {
17737
- if (pricing.slidingScale) return "Choose an amount to continue.";
17738
- return "Choose a pricing option to continue.";
17739
- }
17740
- if (pricing?.slidingScale && pricing.selectedSlidingAmount !== null && pricing.selectedSlidingAmount < pricing.slidingScale.minAmount) return "Choose an amount within the sliding scale.";
17741
- if (pricing?.slidingScale && pricing.selectedSlidingAmount !== null && pricing.selectedSlidingAmount > pricing.slidingScale.maxAmount) return "Choose an amount within the sliding scale.";
17742
- return null;
17743
- }
17744
- function buildCoursePricingOptionPayload(pricing) {
17745
- if (pricing?.selectedOption) return { pricingOptionId: pricing.selectedOption.id };
17746
- if (pricing?.slidingScale && pricing.selectedSlidingAmount !== null) return { selectedSlidingAmount: pricing.selectedSlidingAmount };
17747
- return {};
17748
- }
17749
- function resolveHasCoursePayment(pricing) {
17750
- if (!pricing) return false;
17751
- if (pricing.selectedOption) return pricing.selectedRequiresPayment;
17752
- return pricing.hasPaidSelection;
17747
+ function initialStep(courses) {
17748
+ if (new URLSearchParams(window.location.search).get("enrollment") === "success" && getCourseCheckoutSessionId()) return "verifying-payment";
17749
+ return courses.length === 1 ? "enter-details" : "select-course";
17753
17750
  }
17754
- function useCourseRegistrationWizard(props, options = {}) {
17755
- const api = useBlockApi();
17756
- const { contentEntry, courses, entrySubrouteContext, subject } = props;
17757
- const scopedCourses = useMemo(() => {
17758
- const allCourses = courses ?? [];
17759
- if (entrySubrouteContext?.kind === "course-run") {
17760
- const matched = allCourses.find((c) => c.id === entrySubrouteContext.run.courseId) ?? null;
17761
- if (matched) return [matched];
17762
- }
17763
- const pageSurfaceScope = resolveCoursePageSurfaceScope(allCourses, subject);
17764
- if (pageSurfaceScope.kind === "unsupported") return [];
17765
- if (pageSurfaceScope.kind === "scoped") return [...pageSurfaceScope.courses];
17766
- if (contentEntry?.id) {
17767
- const matchedCourses = allCourses.filter((c) => c.contentEntryId === contentEntry.id);
17768
- if (matchedCourses.length > 0) return matchedCourses;
17769
- }
17770
- if (contentEntry?.slug) {
17771
- const matchedCourse = allCourses.find((c) => c.slug === contentEntry.slug);
17772
- if (matchedCourse) return [matchedCourse];
17773
- }
17774
- return allCourses;
17775
- }, [
17776
- courses,
17777
- contentEntry?.id,
17778
- contentEntry?.slug,
17779
- entrySubrouteContext,
17780
- subject
17781
- ]);
17782
- const [step, setStep] = useState(() => {
17783
- const enrollment = new URLSearchParams(window.location.search).get("enrollment");
17784
- const sessionId = getSessionIdFromUrl();
17785
- if (enrollment === "success" && sessionId) return "verifying-payment";
17786
- return scopedCourses.length === 1 ? "enter-details" : "select-course";
17787
- });
17751
+ function useCourseRegistrationSelection(props) {
17752
+ const scopedCourses = useMemo(() => selectScopedCourses(props), [props.courses, props.subject]);
17753
+ const [step, setStep] = useState(() => initialStep(scopedCourses));
17788
17754
  const [selectedCourse, setSelectedCourse] = useState(scopedCourses.length === 1 ? scopedCourses[0] ?? null : null);
17789
17755
  const [selectedPricingOptionId, setSelectedPricingOptionId] = useState(null);
17790
17756
  const [selectedSlidingAmountInput, setSelectedSlidingAmountInput] = useState("");
17791
- const [formData, setFormData] = useState({
17792
- name: "",
17793
- email: "",
17794
- phone: "",
17795
- notes: ""
17796
- });
17797
- const [errors, setErrors] = useState({});
17798
- const [enrollmentResult, setEnrollmentResult] = useState(null);
17799
- const [errorMessage, setErrorMessage] = useState("");
17800
- const [portalAuthState, setPortalAuthState] = useState("checking");
17801
- const [altchaSolution, setAltchaSolution] = useState(null);
17802
- const showSpamProtection = isSpamProtectionEnabled();
17803
- const [eligibilityLoading, setEligibilityLoading] = useState(false);
17804
- const [eligibilityError, setEligibilityError] = useState(null);
17805
- const [courseEligibility, setCourseEligibility] = useState(null);
17806
- const [eligibleMemberships, setEligibleMemberships] = useState([]);
17807
- const [paymentChoice, setPaymentChoice] = useState("checkout");
17808
- const [selectedMembershipId, setSelectedMembershipId] = useState(null);
17809
- const [bookingMode, setBookingMode] = useState(null);
17810
- const waitlistClaim = useWaitlistClaim();
17757
+ const goToStep = useCallback((nextStep) => {
17758
+ setStep(nextStep);
17759
+ }, []);
17760
+ const chooseCourse = useCallback((course) => {
17761
+ setSelectedCourse(course);
17762
+ }, []);
17763
+ const choosePricingOption = useCallback((pricingOptionId) => {
17764
+ setSelectedPricingOptionId(pricingOptionId);
17765
+ }, []);
17766
+ const changeSlidingAmount = useCallback((amount) => {
17767
+ setSelectedSlidingAmountInput(amount);
17768
+ }, []);
17811
17769
  const selectedCoursePricing = useMemo(() => selectedCourse ? resolveCoursePricingState(selectedCourse, selectedPricingOptionId, parseCurrencyInputToCents(selectedSlidingAmountInput)) : null, [
17812
17770
  selectedCourse,
17813
17771
  selectedPricingOptionId,
17814
17772
  selectedSlidingAmountInput
17815
17773
  ]);
17816
- const missingPricingSelectionMessage = getMissingCoursePricingSelectionMessage(selectedCoursePricing);
17817
- const selectedCoursePricingPayload = buildCoursePricingOptionPayload(selectedCoursePricing);
17818
- const showSoldOutCourseError = () => {
17819
- setErrorMessage(courseEligibility?.reason ?? "This course is fully booked.");
17820
- setStep("error");
17821
- return true;
17822
- };
17823
- useEffect(() => {
17824
- let cancelled = false;
17825
- async function checkPortalAuth() {
17826
- if (!(api.config.auth.type === "bearer" || api.config.authOverrides?.portal?.type === "bearer")) {
17827
- setPortalAuthState("unauthenticated");
17828
- return;
17829
- }
17830
- setPortalAuthState("checking");
17831
- try {
17832
- const me = await api.getPortalProfile();
17833
- if (cancelled) return;
17834
- setPortalAuthState("authenticated");
17835
- setFormData((prev) => ({
17836
- ...prev,
17837
- email: me.profile.email,
17838
- name: prev.name || me.profile.name,
17839
- phone: prev.phone || me.profile.phone || ""
17840
- }));
17841
- } catch {
17842
- if (cancelled) return;
17843
- setPortalAuthState("unauthenticated");
17844
- }
17845
- }
17846
- checkPortalAuth();
17847
- return () => {
17848
- cancelled = true;
17849
- };
17850
- }, [api]);
17851
- useEffect(() => {
17852
- const claim = waitlistClaim.claim;
17853
- if (!claim || claim.subject.kind !== "course") return;
17854
- const courseId = claim.subject.courseId;
17855
- const matchedCourse = scopedCourses.find((course) => course.id === courseId) ?? null;
17856
- if (!matchedCourse) {
17857
- setErrorMessage("This waitlist claim is for a different course.");
17858
- setStep("error");
17859
- return;
17860
- }
17861
- setSelectedCourse(matchedCourse);
17862
- setFormData((prev) => ({
17863
- ...prev,
17864
- email: claim.prefill.email,
17865
- name: claim.prefill.name,
17866
- phone: claim.prefill.phone ?? "",
17867
- notes: claim.prefill.notes ?? ""
17868
- }));
17869
- if (step === "select-course") setStep("enter-details");
17870
- }, [
17871
- waitlistClaim.claim,
17872
- scopedCourses,
17873
- step
17874
- ]);
17875
- useEffect(() => {
17876
- if (waitlistClaim.requiresPortalLogin) return;
17877
- if (!waitlistClaim.error) return;
17878
- setErrorMessage(waitlistClaim.error);
17879
- setStep("error");
17880
- }, [waitlistClaim.error, waitlistClaim.requiresPortalLogin]);
17881
17774
  useEffect(() => {
17882
17775
  if (!selectedCourse) {
17883
17776
  setSelectedPricingOptionId(null);
17884
17777
  setSelectedSlidingAmountInput("");
17885
17778
  return;
17886
17779
  }
17887
- const defaultPricing = resolveCoursePricingState(selectedCourse, null);
17888
- setSelectedSlidingAmountInput(defaultPricing.slidingScale?.suggestedAmount !== null && defaultPricing.slidingScale?.suggestedAmount !== void 0 ? formatCentsAsCurrencyInput(defaultPricing.slidingScale.suggestedAmount) : "");
17889
- setSelectedPricingOptionId((previous) => {
17890
- if (previous && defaultPricing.selectableOptions.some((option) => option.id === previous)) return previous;
17891
- return defaultPricing.selectedOption?.id ?? null;
17892
- });
17780
+ const selection = defaultCoursePricingSelection(resolveCoursePricingState(selectedCourse, null), selectedPricingOptionId);
17781
+ setSelectedPricingOptionId(selection.pricingOptionId);
17782
+ setSelectedSlidingAmountInput(selection.slidingAmountInput);
17893
17783
  }, [selectedCourse]);
17894
- useEffect(() => {
17895
- let cancelled = false;
17896
- async function fetchEligibility() {
17897
- setCourseEligibility(null);
17898
- setEligibleMemberships([]);
17899
- setSelectedMembershipId(null);
17900
- setEligibilityError(null);
17901
- setPaymentChoice("checkout");
17902
- const course = selectedCourse;
17903
- if (!shouldFetchCourseEligibility(course, selectedCoursePricing?.hasPaidSelection ?? false, portalAuthState, waitlistClaim.token !== null)) return;
17904
- if (!course) return;
17905
- setEligibilityLoading(true);
17906
- try {
17907
- const res = await api.checkCourseEligibility({ courseId: course.id });
17908
- if (cancelled) return;
17909
- setCourseEligibility(res);
17910
- const memberships = res.eligibleMemberships ?? [];
17911
- setEligibleMemberships(memberships);
17912
- if (portalAuthState === "authenticated" && memberships.length > 0) {
17913
- setPaymentChoice("membership");
17914
- if (memberships.length === 1) setSelectedMembershipId(memberships[0]?.customerMembershipId ?? null);
17915
- }
17916
- } catch (error) {
17917
- if (cancelled) return;
17918
- setEligibilityError(error instanceof Error ? error.message : "Failed to check membership eligibility");
17919
- } finally {
17920
- if (!cancelled) setEligibilityLoading(false);
17784
+ return {
17785
+ scopedCourses,
17786
+ step,
17787
+ goToStep,
17788
+ selectedCourse,
17789
+ chooseCourse,
17790
+ selectedPricingOptionId,
17791
+ choosePricingOption,
17792
+ selectedSlidingAmountInput,
17793
+ changeSlidingAmount,
17794
+ selectedCoursePricing
17795
+ };
17796
+ }
17797
+ //#endregion
17798
+ //#region ../blocks/src/system/runtime/nodes/course-registration/useCoursePaymentVerification.ts
17799
+ function applyTerminalStatus(status, setters) {
17800
+ if (status === "enrolled" || status === "completed") {
17801
+ setters.setEnrollmentResult({
17802
+ status: "enrolled",
17803
+ usedMembership: false
17804
+ });
17805
+ setters.setStep("success");
17806
+ return true;
17807
+ }
17808
+ if (status === "waitlist") {
17809
+ setters.setEnrollmentResult({
17810
+ status: "waitlist",
17811
+ usedMembership: false
17812
+ });
17813
+ setters.setStep("waitlist");
17814
+ return true;
17815
+ }
17816
+ setters.setErrorMessage("Payment did not complete. Please try again.");
17817
+ setters.setStep("error");
17818
+ return true;
17819
+ }
17820
+ async function pollCourseRegistrationStatus(api, sessionId, setters, isCancelled) {
17821
+ const startedAt = Date.now();
17822
+ while (!isCancelled()) {
17823
+ try {
17824
+ const result = await api.getWholeSeriesRegistrationStatus({ sessionId });
17825
+ if (isCancelled()) return;
17826
+ if (result.status !== "pending_payment") {
17827
+ applyTerminalStatus(result.status, setters);
17828
+ return;
17921
17829
  }
17830
+ } catch (cause) {
17831
+ setters.setErrorMessage(cause instanceof Error ? cause.message : "Failed to verify payment");
17922
17832
  }
17923
- fetchEligibility();
17924
- return () => {
17925
- cancelled = true;
17926
- };
17927
- }, [
17928
- api,
17929
- selectedCourse,
17930
- selectedCoursePricing?.hasPaidSelection,
17931
- portalAuthState,
17932
- waitlistClaim.token
17933
- ]);
17833
+ if (Date.now() - startedAt > 3e4) {
17834
+ setters.setErrorMessage("Payment is still processing. Please check your email for confirmation.");
17835
+ setters.setStep("error");
17836
+ return;
17837
+ }
17838
+ await new Promise((resolve) => setTimeout(resolve, 1500));
17839
+ }
17840
+ }
17841
+ function useCoursePaymentVerification(api, setters) {
17934
17842
  useEffect(() => {
17935
17843
  let cancelled = false;
17936
- async function verifyAfterCheckout() {
17937
- const enrollment = new URLSearchParams(window.location.search).get("enrollment");
17938
- const sessionId = getSessionIdFromUrl();
17939
- if (enrollment === "cancelled") {
17940
- scrollToBlock(COURSE_REGISTRATION_ANCHOR_ID);
17941
- setErrorMessage("Payment was cancelled. You can try again.");
17942
- setStep("error");
17943
- return;
17944
- }
17945
- if (enrollment !== "success" || !sessionId) return;
17844
+ const enrollment = new URLSearchParams(window.location.search).get("enrollment");
17845
+ const sessionId = getCourseCheckoutSessionId();
17846
+ if (enrollment === "cancelled") {
17946
17847
  scrollToBlock(COURSE_REGISTRATION_ANCHOR_ID);
17947
- setStep("verifying-payment");
17948
- const startedAt = Date.now();
17949
- const timeoutMs = 3e4;
17950
- while (!cancelled) {
17951
- try {
17952
- const status = await api.getCourseRegistrationStatus({ sessionId });
17953
- if (cancelled) return;
17954
- if (status.status === "enrolled" || status.status === "completed") {
17955
- setEnrollmentResult({
17956
- status: "enrolled",
17957
- usedMembership: false
17958
- });
17959
- setStep("success");
17960
- return;
17961
- }
17962
- if (status.status === "waitlist") {
17963
- setEnrollmentResult({
17964
- status: "waitlist",
17965
- usedMembership: false
17966
- });
17967
- setStep("waitlist");
17968
- return;
17969
- }
17970
- if (status.status === "cancelled") {
17971
- setErrorMessage("Payment did not complete. Please try again.");
17972
- setStep("error");
17973
- return;
17974
- }
17975
- } catch (error) {
17976
- setErrorMessage(error instanceof Error ? error.message : "Failed to verify payment");
17977
- }
17978
- if (Date.now() - startedAt > timeoutMs) {
17979
- setErrorMessage("Payment is still processing. Please check your email for confirmation.");
17980
- setStep("error");
17981
- return;
17982
- }
17983
- await new Promise((r) => setTimeout(r, 1500));
17984
- }
17848
+ setters.setErrorMessage("Payment was cancelled. You can try again.");
17849
+ setters.setStep("error");
17850
+ return;
17985
17851
  }
17986
- verifyAfterCheckout();
17852
+ if (enrollment !== "success" || !sessionId) return;
17853
+ scrollToBlock(COURSE_REGISTRATION_ANCHOR_ID);
17854
+ setters.setStep("verifying-payment");
17855
+ pollCourseRegistrationStatus(api, sessionId, setters, () => cancelled);
17987
17856
  return () => {
17988
17857
  cancelled = true;
17989
17858
  };
17990
- }, [api]);
17991
- const handleValidateForm = () => {
17992
- const newErrors = validateFormData$1(formData);
17993
- setErrors(newErrors);
17994
- return Object.keys(newErrors).length === 0;
17859
+ }, [
17860
+ api,
17861
+ setters.setEnrollmentResult,
17862
+ setters.setErrorMessage,
17863
+ setters.setStep
17864
+ ]);
17865
+ }
17866
+ //#endregion
17867
+ //#region ../blocks/src/system/runtime/nodes/course-registration/useCourseRegistrationActions.ts
17868
+ function blocked(message, setters) {
17869
+ setters.setErrorMessage(message);
17870
+ setters.setStep("error");
17871
+ return {
17872
+ kind: "blocked",
17873
+ message
17995
17874
  };
17996
- const handleCourseSelect = (course) => {
17997
- setSelectedCourse(course);
17998
- setStep("enter-details");
17875
+ }
17876
+ function validateSubmission(state, setters) {
17877
+ if (!state.selectedCourse) return {
17878
+ kind: "blocked",
17879
+ message: "Choose an available set of dates to continue."
17880
+ };
17881
+ const errors = validateFormData$1(state.formData);
17882
+ setters.setErrors(errors);
17883
+ if (Object.keys(errors).length > 0) return { kind: "validation-failed" };
17884
+ const pricingMessage = getMissingCoursePricingSelectionMessage(state.pricing);
17885
+ if (pricingMessage) return blocked(pricingMessage, setters);
17886
+ if (!state.hasClaim && state.eligibility?.isFull && !state.eligibility.canJoinWaitlist) return blocked(state.eligibility.reason ?? "This course is fully booked.", setters);
17887
+ if (isSpamProtectionEnabled() && !state.altchaSolution) return blocked("Please complete the verification check.", setters);
17888
+ return null;
17889
+ }
17890
+ function enrollmentPayload(state, payment) {
17891
+ return {
17892
+ ...registrantPayload(state),
17893
+ paymentMethod: payment.method,
17894
+ ...payment.method === "membership" ? { customerMembershipId: payment.membershipId } : {}
17999
17895
  };
18000
- const handleSubmit = async () => {
18001
- if (!selectedCourse) return {
18002
- kind: "blocked",
18003
- message: "Choose an available set of dates to continue."
18004
- };
18005
- if (!handleValidateForm()) return { kind: "validation-failed" };
18006
- if (missingPricingSelectionMessage) {
18007
- setErrorMessage(missingPricingSelectionMessage);
18008
- setStep("error");
18009
- return {
18010
- kind: "blocked",
18011
- message: missingPricingSelectionMessage
18012
- };
18013
- }
18014
- const requiresPayment = selectedCoursePricing?.selectedRequiresPayment ?? false;
18015
- const canUseMembership = requiresPayment && selectedCourse.acceptsMemberships && portalAuthState === "authenticated" && eligibleMemberships.length > 0;
18016
- if (showSpamProtection && !altchaSolution) {
18017
- const message = "Please complete the verification check.";
18018
- setErrorMessage(message);
18019
- setStep("error");
18020
- return {
18021
- kind: "blocked",
18022
- message
18023
- };
18024
- }
18025
- if (!waitlistClaim.claim && courseEligibility?.isFull && !courseEligibility.canJoinWaitlist && showSoldOutCourseError()) return {
18026
- kind: "blocked",
18027
- message: courseEligibility.reason ?? "This course is fully booked."
17896
+ }
17897
+ function registrantPayload(state) {
17898
+ return {
17899
+ eventSeriesId: state.selectedCourse.eventSeriesId,
17900
+ ...buildCoursePricingOptionPayload(state.pricing),
17901
+ email: state.formData.email.trim().toLowerCase(),
17902
+ name: state.formData.name.trim(),
17903
+ phone: state.formData.phone.trim() || void 0,
17904
+ formData: { notes: state.formData.notes.trim() || void 0 },
17905
+ altchaSolution: state.altchaSolution,
17906
+ claimToken: state.claimToken ?? void 0
17907
+ };
17908
+ }
17909
+ async function enroll(state, setters, payment) {
17910
+ setters.setStep("submitting");
17911
+ try {
17912
+ const result = await state.api.registerForWholeSeries(enrollmentPayload(state, payment));
17913
+ setters.setEnrollmentResult({
17914
+ status: result.status,
17915
+ waitlistPosition: result.waitlistPosition ?? void 0,
17916
+ usedMembership: payment.method === "membership"
17917
+ });
17918
+ setters.setStep(result.status === "waitlist" ? "waitlist" : "success");
17919
+ return { kind: "state-updated" };
17920
+ } catch (cause) {
17921
+ const message = cause instanceof Error ? cause.message : "Booking failed";
17922
+ setters.setErrorMessage(message);
17923
+ setters.setStep("error");
17924
+ return {
17925
+ kind: "failed",
17926
+ message
18028
17927
  };
18029
- if (courseEligibility?.canJoinWaitlist) {
18030
- setStep("submitting");
18031
- try {
18032
- const result = await api.enrollInCourse({
18033
- courseId: selectedCourse.id,
18034
- ...selectedCoursePricingPayload,
18035
- email: formData.email.trim().toLowerCase(),
18036
- name: formData.name.trim(),
18037
- phone: formData.phone.trim() || void 0,
18038
- formData: { notes: formData.notes.trim() || void 0 },
18039
- altchaSolution,
18040
- paymentMethod: "free",
18041
- claimToken: waitlistClaim.token ?? void 0
18042
- });
18043
- setEnrollmentResult({
18044
- status: result.status,
18045
- waitlistPosition: result.waitlistPosition ?? void 0,
18046
- usedMembership: false
18047
- });
18048
- setStep(result.status === "waitlist" ? "waitlist" : "success");
18049
- return { kind: "state-updated" };
18050
- } catch (error) {
18051
- const message = error instanceof Error ? error.message : "Booking failed";
18052
- setErrorMessage(message);
18053
- setStep("error");
18054
- return {
18055
- kind: "failed",
18056
- message
18057
- };
18058
- }
18059
- }
18060
- if (requiresPayment && canUseMembership) {
18061
- setStep("select-payment");
18062
- return { kind: "state-updated" };
18063
- }
18064
- if (requiresPayment) {
18065
- setStep("submitting");
18066
- try {
18067
- const { successUrl, cancelUrl } = buildCheckoutReturnUrls("enrollment", COURSE_REGISTRATION_ANCHOR_ID);
18068
- const checkoutResult = await api.createCourseCheckout({
18069
- courseId: selectedCourse.id,
18070
- ...selectedCoursePricingPayload,
18071
- email: formData.email.trim().toLowerCase(),
18072
- name: formData.name.trim(),
18073
- phone: formData.phone.trim() || void 0,
18074
- formData: { notes: formData.notes.trim() || void 0 },
18075
- altchaSolution,
18076
- discountCode: discountCode.trim() ? discountCode.trim() : void 0,
18077
- successUrl,
18078
- cancelUrl,
18079
- claimToken: waitlistClaim.token ?? void 0
18080
- });
18081
- if (checkoutResult.bypassed) {
18082
- setEnrollmentResult({
18083
- status: "enrolled",
18084
- waitlistPosition: void 0,
18085
- usedMembership: false
18086
- });
18087
- setStep("success");
18088
- return { kind: "state-updated" };
18089
- }
18090
- if (!checkoutResult.checkoutUrl) throw new Error("Checkout URL missing");
18091
- setStep("redirecting");
18092
- if (options.onCheckoutRedirect) options.onCheckoutRedirect(checkoutResult.checkoutUrl);
18093
- else window.location.href = checkoutResult.checkoutUrl;
18094
- return {
18095
- kind: "checkout-redirect",
18096
- checkoutUrl: checkoutResult.checkoutUrl
18097
- };
18098
- } catch (error) {
18099
- const message = error instanceof Error ? error.message : "Checkout failed";
18100
- setErrorMessage(message);
18101
- setStep("error");
18102
- return {
18103
- kind: "failed",
18104
- message
18105
- };
18106
- }
18107
- }
18108
- setStep("submitting");
18109
- try {
18110
- const result = await api.enrollInCourse({
18111
- courseId: selectedCourse.id,
18112
- ...selectedCoursePricingPayload,
18113
- email: formData.email.trim().toLowerCase(),
18114
- name: formData.name.trim(),
18115
- phone: formData.phone.trim() || void 0,
18116
- formData: { notes: formData.notes.trim() || void 0 },
18117
- altchaSolution,
18118
- paymentMethod: "free",
18119
- claimToken: waitlistClaim.token ?? void 0
18120
- });
18121
- setEnrollmentResult({
18122
- status: result.status,
18123
- waitlistPosition: result.waitlistPosition ?? void 0,
18124
- usedMembership: result.paymentMethod === "membership"
17928
+ }
17929
+ }
17930
+ async function checkout(state, setters) {
17931
+ setters.setStep("submitting");
17932
+ try {
17933
+ const urls = buildCheckoutReturnUrls("enrollment", COURSE_REGISTRATION_ANCHOR_ID);
17934
+ const result = await state.api.createWholeSeriesCheckout({
17935
+ ...registrantPayload(state),
17936
+ discountCode: state.discountCode.trim() || void 0,
17937
+ successUrl: urls.successUrl,
17938
+ cancelUrl: urls.cancelUrl
17939
+ });
17940
+ if (result.bypassed) {
17941
+ setters.setEnrollmentResult({
17942
+ status: "enrolled",
17943
+ usedMembership: false
18125
17944
  });
18126
- setStep(result.status === "waitlist" ? "waitlist" : "success");
17945
+ setters.setStep("success");
18127
17946
  return { kind: "state-updated" };
18128
- } catch (error) {
18129
- const message = error instanceof Error ? error.message : "Booking failed";
18130
- setErrorMessage(message);
18131
- setStep("error");
18132
- return {
18133
- kind: "failed",
18134
- message
18135
- };
18136
17947
  }
18137
- };
18138
- const handlePaymentContinue = async () => {
18139
- if (!selectedCourse) return {
18140
- kind: "blocked",
18141
- message: "Choose an available set of dates to continue."
17948
+ if (!result.checkoutUrl) throw new Error("Checkout URL missing");
17949
+ setters.setStep("redirecting");
17950
+ if (state.options.onCheckoutRedirect) state.options.onCheckoutRedirect(result.checkoutUrl);
17951
+ else window.location.href = result.checkoutUrl;
17952
+ return {
17953
+ kind: "checkout-redirect",
17954
+ checkoutUrl: result.checkoutUrl
18142
17955
  };
18143
- if (!handleValidateForm()) return { kind: "validation-failed" };
18144
- if (missingPricingSelectionMessage) {
18145
- setErrorMessage(missingPricingSelectionMessage);
18146
- setStep("error");
18147
- return {
18148
- kind: "blocked",
18149
- message: missingPricingSelectionMessage
18150
- };
18151
- }
18152
- const requiresPayment = selectedCoursePricing?.selectedRequiresPayment ?? false;
18153
- if (!waitlistClaim.claim && courseEligibility?.isFull && !courseEligibility.canJoinWaitlist && showSoldOutCourseError()) return {
18154
- kind: "blocked",
18155
- message: courseEligibility.reason ?? "This course is fully booked."
17956
+ } catch (cause) {
17957
+ const message = cause instanceof Error ? cause.message : "Checkout failed";
17958
+ setters.setErrorMessage(message);
17959
+ setters.setStep("error");
17960
+ return {
17961
+ kind: "failed",
17962
+ message
18156
17963
  };
18157
- if (!requiresPayment) {
18158
- setStep("enter-details");
18159
- return { kind: "state-updated" };
18160
- }
18161
- if (showSpamProtection && !altchaSolution) {
18162
- const message = "Please complete the verification check.";
18163
- setErrorMessage(message);
18164
- setStep("error");
18165
- return {
18166
- kind: "blocked",
18167
- message
18168
- };
18169
- }
18170
- if (paymentChoice === "membership") {
18171
- if (!selectedMembershipId) {
18172
- const message = "Select a membership to sign up.";
18173
- setErrorMessage(message);
18174
- setStep("error");
18175
- return {
18176
- kind: "blocked",
18177
- message
18178
- };
18179
- }
18180
- setStep("submitting");
18181
- try {
18182
- const result = await api.enrollInCourse({
18183
- courseId: selectedCourse.id,
18184
- ...selectedCoursePricingPayload,
18185
- email: formData.email.trim().toLowerCase(),
18186
- name: formData.name.trim(),
18187
- phone: formData.phone.trim() || void 0,
18188
- formData: { notes: formData.notes.trim() || void 0 },
18189
- altchaSolution,
18190
- paymentMethod: "membership",
18191
- customerMembershipId: selectedMembershipId,
18192
- claimToken: waitlistClaim.token ?? void 0
18193
- });
18194
- setEnrollmentResult({
18195
- status: result.status,
18196
- waitlistPosition: result.waitlistPosition ?? void 0,
18197
- usedMembership: true
18198
- });
18199
- setStep(result.status === "waitlist" ? "waitlist" : "success");
18200
- return { kind: "state-updated" };
18201
- } catch (error) {
18202
- const message = error instanceof Error ? error.message : "Booking failed";
18203
- setErrorMessage(message);
18204
- setStep("error");
18205
- return {
18206
- kind: "failed",
18207
- message
18208
- };
18209
- }
18210
- }
18211
- setStep("submitting");
18212
- try {
18213
- const { successUrl, cancelUrl } = buildCheckoutReturnUrls("enrollment", COURSE_REGISTRATION_ANCHOR_ID);
18214
- const checkoutResult = await api.createCourseCheckout({
18215
- courseId: selectedCourse.id,
18216
- ...selectedCoursePricingPayload,
18217
- email: formData.email.trim().toLowerCase(),
18218
- name: formData.name.trim(),
18219
- phone: formData.phone.trim() || void 0,
18220
- formData: { notes: formData.notes.trim() || void 0 },
18221
- altchaSolution,
18222
- discountCode: discountCode.trim() ? discountCode.trim() : void 0,
18223
- successUrl,
18224
- cancelUrl,
18225
- claimToken: waitlistClaim.token ?? void 0
18226
- });
18227
- if (checkoutResult.bypassed) {
18228
- setEnrollmentResult({
18229
- status: "enrolled",
18230
- waitlistPosition: void 0,
18231
- usedMembership: false
18232
- });
18233
- setStep("success");
18234
- return { kind: "state-updated" };
18235
- }
18236
- if (!checkoutResult.checkoutUrl) throw new Error("Checkout URL missing");
18237
- setStep("redirecting");
18238
- if (options.onCheckoutRedirect) options.onCheckoutRedirect(checkoutResult.checkoutUrl);
18239
- else window.location.href = checkoutResult.checkoutUrl;
18240
- return {
18241
- kind: "checkout-redirect",
18242
- checkoutUrl: checkoutResult.checkoutUrl
18243
- };
18244
- } catch (error) {
18245
- const message = error instanceof Error ? error.message : "Checkout failed";
18246
- setErrorMessage(message);
18247
- setStep("error");
18248
- return {
18249
- kind: "failed",
18250
- message
18251
- };
18252
- }
17964
+ }
17965
+ }
17966
+ async function submitDetails(state, setters) {
17967
+ const invalid = validateSubmission(state, setters);
17968
+ if (invalid || !state.selectedCourse) return invalid ?? { kind: "validation-failed" };
17969
+ if (state.eligibility?.canJoinWaitlist) return enroll(state, setters, { method: "free" });
17970
+ const requiresPayment = state.pricing?.selectedRequiresPayment ?? false;
17971
+ const canUseMembership = requiresPayment && state.selectedCourse.acceptsMemberships && state.portalAuthState === "authenticated" && state.eligibleMemberships.length > 0;
17972
+ if (requiresPayment && canUseMembership) {
17973
+ setters.setStep("select-payment");
17974
+ return { kind: "state-updated" };
17975
+ }
17976
+ if (requiresPayment) return checkout(state, setters);
17977
+ return enroll(state, setters, { method: "free" });
17978
+ }
17979
+ async function continuePayment(state, setters) {
17980
+ const invalid = validateSubmission(state, setters);
17981
+ if (invalid || !state.selectedCourse) return invalid ?? { kind: "validation-failed" };
17982
+ if (!state.pricing?.selectedRequiresPayment) {
17983
+ setters.setStep("enter-details");
17984
+ return { kind: "state-updated" };
17985
+ }
17986
+ const selectedState = state;
17987
+ if (state.paymentChoice === "membership") {
17988
+ if (!state.selectedMembershipId) return blocked("Select a membership to sign up.", setters);
17989
+ return enroll(selectedState, setters, {
17990
+ method: "membership",
17991
+ membershipId: state.selectedMembershipId
17992
+ });
17993
+ }
17994
+ return checkout(selectedState, setters);
17995
+ }
17996
+ function useCourseRegistrationActions(state, setStep) {
17997
+ const [errors, setErrors] = useState({});
17998
+ const [enrollmentResult, setEnrollmentResult] = useState(null);
17999
+ const [errorMessage, setErrorMessage] = useState("");
18000
+ const reportError = useCallback((message) => {
18001
+ setErrorMessage(message);
18002
+ }, []);
18003
+ const recordEnrollmentResult = useCallback((result) => {
18004
+ setEnrollmentResult(result);
18005
+ }, []);
18006
+ const setters = {
18007
+ setStep,
18008
+ setErrors,
18009
+ setEnrollmentResult,
18010
+ setErrorMessage
18253
18011
  };
18254
- const handleRetry = () => {
18255
- setStep(scopedCourses.length === 1 ? "enter-details" : "select-course");
18256
- setErrorMessage("");
18012
+ return {
18013
+ errors,
18014
+ enrollmentResult,
18015
+ errorMessage,
18016
+ reportError,
18017
+ recordEnrollmentResult,
18018
+ handleSubmit: () => submitDetails(state, setters),
18019
+ handlePaymentContinue: () => continuePayment(state, setters)
18257
18020
  };
18258
- const handleBookingModeChange = (mode) => {
18259
- setBookingMode(mode);
18260
- if (mode === "membership") setPaymentChoice("membership");
18261
- else setPaymentChoice("checkout");
18021
+ }
18022
+ //#endregion
18023
+ //#region ../blocks/src/system/runtime/nodes/course-registration/useCourseRegistrationPortal.ts
18024
+ const EMPTY_FORM$1 = {
18025
+ name: "",
18026
+ email: "",
18027
+ phone: "",
18028
+ notes: ""
18029
+ };
18030
+ function useCourseRegistrationPortal(api) {
18031
+ const [formData, setFormData] = useState(EMPTY_FORM$1);
18032
+ const [portalAuthState, setPortalAuthState] = useState("checking");
18033
+ const updateFormData = useCallback((updater) => {
18034
+ setFormData(updater);
18035
+ }, []);
18036
+ useEffect(() => {
18037
+ let cancelled = false;
18038
+ if (!(api.config.auth.type === "bearer" || api.config.authOverrides?.portal?.type === "bearer")) {
18039
+ setPortalAuthState("unauthenticated");
18040
+ return;
18041
+ }
18042
+ setPortalAuthState("checking");
18043
+ api.getPortalProfile().then((result) => {
18044
+ if (cancelled) return;
18045
+ setPortalAuthState("authenticated");
18046
+ setFormData((current) => ({
18047
+ ...current,
18048
+ email: result.profile.email,
18049
+ name: current.name || result.profile.name,
18050
+ phone: current.phone || result.profile.phone || ""
18051
+ }));
18052
+ }).catch(() => {
18053
+ if (!cancelled) setPortalAuthState("unauthenticated");
18054
+ });
18055
+ return () => {
18056
+ cancelled = true;
18057
+ };
18058
+ }, [api]);
18059
+ return {
18060
+ formData,
18061
+ updateFormData,
18062
+ portalAuthState
18262
18063
  };
18064
+ }
18065
+ //#endregion
18066
+ //#region ../blocks/src/system/runtime/nodes/course-registration/useCourseWaitlistSelection.ts
18067
+ function useCourseWaitlistSelection(input) {
18068
+ useEffect(() => {
18069
+ const claim = input.waitlistClaim.claim;
18070
+ if (!claim || claim.subject.kind !== "whole_series") return;
18071
+ const eventSeriesId = claim.subject.eventSeriesId;
18072
+ const course = input.scopedCourses.find((candidate) => candidate.eventSeriesId === eventSeriesId);
18073
+ if (!course) {
18074
+ input.reportError("This waitlist claim is for a different course.");
18075
+ input.goToStep("error");
18076
+ return;
18077
+ }
18078
+ input.chooseCourse(course);
18079
+ input.updateFormData((current) => ({
18080
+ ...current,
18081
+ email: claim.prefill.email,
18082
+ name: claim.prefill.name,
18083
+ phone: claim.prefill.phone ?? "",
18084
+ notes: claim.prefill.notes ?? ""
18085
+ }));
18086
+ if (input.step === "select-course") input.goToStep("enter-details");
18087
+ }, [
18088
+ input.chooseCourse,
18089
+ input.goToStep,
18090
+ input.reportError,
18091
+ input.scopedCourses,
18092
+ input.step,
18093
+ input.updateFormData,
18094
+ input.waitlistClaim.claim
18095
+ ]);
18096
+ useEffect(() => {
18097
+ if (input.waitlistClaim.requiresPortalLogin || !input.waitlistClaim.error) return;
18098
+ input.reportError(input.waitlistClaim.error);
18099
+ input.goToStep("error");
18100
+ }, [
18101
+ input.goToStep,
18102
+ input.reportError,
18103
+ input.waitlistClaim.error,
18104
+ input.waitlistClaim.requiresPortalLogin
18105
+ ]);
18106
+ }
18107
+ //#endregion
18108
+ //#region ../blocks/src/system/runtime/nodes/course-registration/useCourseRegistrationWizard.ts
18109
+ function useCourseRegistrationWizard(props, options = {}) {
18110
+ const api = useBlockApi();
18111
+ const selection = useCourseRegistrationSelection(props);
18112
+ const portal = useCourseRegistrationPortal(api);
18113
+ const waitlistClaim = useWaitlistClaim();
18114
+ const [bookingMode, setBookingMode] = useState(null);
18115
+ const [altchaSolution, setAltchaSolution] = useState(null);
18116
+ const eligibility = useCourseEligibility({
18117
+ api,
18118
+ selectedCourse: selection.selectedCourse,
18119
+ hasPaidSelection: selection.selectedCoursePricing?.hasPaidSelection ?? false,
18120
+ portalAuthState: portal.portalAuthState,
18121
+ waitlistClaimToken: waitlistClaim.token
18122
+ });
18263
18123
  const discountUi = useDiscountCodeUi({
18264
18124
  api,
18265
- discountContext: useMemo(() => {
18266
- if (!selectedCourse) return null;
18267
- if (!selectedCoursePricing?.selectedRequiresPayment) return null;
18268
- if (paymentChoice !== "checkout") return null;
18269
- return {
18270
- type: "course",
18271
- courseId: selectedCourse.id
18272
- };
18273
- }, [
18274
- selectedCourse,
18275
- selectedCoursePricing?.selectedRequiresPayment,
18276
- paymentChoice
18125
+ discountContext: useMemo(() => selection.selectedCourse && selection.selectedCoursePricing?.selectedRequiresPayment && eligibility.paymentChoice === "checkout" ? {
18126
+ type: "whole_series",
18127
+ eventSeriesId: selection.selectedCourse.eventSeriesId
18128
+ } : null, [
18129
+ eligibility.paymentChoice,
18130
+ selection.selectedCourse,
18131
+ selection.selectedCoursePricing?.selectedRequiresPayment
18277
18132
  ]),
18278
- subtotalCents: selectedCoursePricing?.selectedPriceAmount ?? void 0
18279
- });
18280
- const discountCode = discountUi.discountCode;
18281
- const hasCoursePayment = resolveHasCoursePayment(selectedCoursePricing);
18282
- const canUseMembership = hasCoursePayment && selectedCourse?.acceptsMemberships === true && portalAuthState === "authenticated" && eligibleMemberships.length > 0;
18283
- const hasPreSelectedCourse = scopedCourses.length === 1;
18284
- const isMembershipFastTrack = canUseMembership && eligibleMemberships.length === 1 && bookingMode === "membership";
18285
- const wizardSteps = useMemo(() => getWizardStepsForContext(hasPreSelectedCourse, hasCoursePayment, canUseMembership, bookingMode, isMembershipFastTrack), [
18286
- hasPreSelectedCourse,
18287
- hasCoursePayment,
18288
- canUseMembership,
18289
- bookingMode,
18290
- isMembershipFastTrack
18291
- ]);
18292
- const currentStepNumber = getStepNumber(step, wizardSteps);
18293
- const totalSteps = wizardSteps.length;
18294
- const stepLabels = getStepLabels(wizardSteps);
18295
- const canShowPortalAuthSidebarOnCurrentStep = step !== "success" && step !== "waitlist" && step !== "error";
18296
- const showPortalAuthSidebar = portalAuthState === "unauthenticated" && waitlistClaim.requiresPortalLogin && canShowPortalAuthSidebarOnCurrentStep || portalAuthState === "unauthenticated" && hasCoursePayment && selectedCourse?.acceptsMemberships === true && step !== "select-course" && canShowPortalAuthSidebarOnCurrentStep;
18297
- return {
18133
+ subtotalCents: selection.selectedCoursePricing?.selectedPriceAmount ?? void 0
18134
+ });
18135
+ const actions = useCourseRegistrationActions({
18298
18136
  api,
18299
- scopedCourses,
18300
- step,
18301
- setStep,
18302
- selectedCourse,
18303
- selectedPricingOptionId,
18304
- setSelectedPricingOptionId,
18305
- selectedSlidingAmountInput,
18306
- setSelectedSlidingAmountInput,
18307
- selectedCoursePricing,
18308
- setSelectedCourse,
18309
- formData,
18310
- setFormData,
18311
- errors,
18312
- enrollmentResult,
18313
- errorMessage,
18314
- portalAuthState,
18315
- handleLogout: portalAuthState === "authenticated" ? () => logoutPortal(COURSE_REGISTRATION_ANCHOR_ID) : void 0,
18137
+ selectedCourse: selection.selectedCourse,
18138
+ pricing: selection.selectedCoursePricing,
18139
+ formData: portal.formData,
18140
+ portalAuthState: portal.portalAuthState,
18141
+ eligibility: eligibility.courseEligibility,
18142
+ eligibleMemberships: eligibility.eligibleMemberships,
18143
+ paymentChoice: eligibility.paymentChoice,
18144
+ selectedMembershipId: eligibility.selectedMembershipId,
18145
+ claimToken: waitlistClaim.token,
18146
+ hasClaim: waitlistClaim.claim !== null,
18316
18147
  altchaSolution,
18317
- setAltchaSolution,
18318
- showSpamProtection,
18319
- eligibilityLoading,
18320
- eligibilityError,
18321
- courseEligibility,
18322
- eligibleMemberships,
18323
- paymentChoice,
18324
- setPaymentChoice,
18325
- selectedMembershipId,
18326
- setSelectedMembershipId,
18327
- discountUiOpen: discountUi.discountUiOpen,
18328
- setDiscountUiOpen: discountUi.setDiscountUiOpen,
18329
18148
  discountCode: discountUi.discountCode,
18330
- setDiscountCode: discountUi.setDiscountCode,
18331
- discountsAvailable: discountUi.discountsAvailable,
18332
- manualCodeEntryAllowed: discountUi.manualCodeEntryAllowed,
18333
- discountsAvailableLoading: discountUi.discountsAvailableLoading,
18334
- canUseMembership,
18149
+ options
18150
+ }, selection.goToStep);
18151
+ useCourseRegistrationEffects({
18152
+ api,
18153
+ actions,
18154
+ portal,
18155
+ selection,
18156
+ waitlistClaim
18157
+ });
18158
+ return buildCourseRegistrationWizardResult({
18159
+ api,
18160
+ selection,
18161
+ portal,
18162
+ eligibility,
18163
+ actions,
18164
+ discountUi,
18335
18165
  waitlistClaim,
18166
+ view: deriveCourseRegistrationViewState({
18167
+ scopedCourses: selection.scopedCourses,
18168
+ selectedCourse: selection.selectedCourse,
18169
+ pricing: selection.selectedCoursePricing,
18170
+ portalAuthState: portal.portalAuthState,
18171
+ eligibleMembershipCount: eligibility.eligibleMemberships.length,
18172
+ bookingMode,
18173
+ step: selection.step,
18174
+ waitlistRequiresPortalLogin: waitlistClaim.requiresPortalLogin
18175
+ }),
18336
18176
  bookingMode,
18337
- wizardSteps,
18338
- currentStepNumber,
18339
- totalSteps,
18340
- stepLabels,
18341
- showPortalAuthSidebar,
18342
- hasPreSelectedCourse,
18343
- hasCoursePayment,
18344
- handleCourseSelect,
18345
- handleSubmit,
18346
- handlePaymentContinue,
18347
- handleRetry,
18348
- handleBookingModeChange
18177
+ setBookingMode,
18178
+ altchaSolution,
18179
+ setAltchaSolution
18180
+ });
18181
+ }
18182
+ function useCourseRegistrationEffects(input) {
18183
+ useCoursePaymentVerification(input.api, {
18184
+ setStep: input.selection.goToStep,
18185
+ setErrorMessage: input.actions.reportError,
18186
+ setEnrollmentResult: input.actions.recordEnrollmentResult
18187
+ });
18188
+ useCourseWaitlistSelection({
18189
+ waitlistClaim: input.waitlistClaim,
18190
+ scopedCourses: input.selection.scopedCourses,
18191
+ step: input.selection.step,
18192
+ goToStep: input.selection.goToStep,
18193
+ chooseCourse: input.selection.chooseCourse,
18194
+ updateFormData: input.portal.updateFormData,
18195
+ reportError: input.actions.reportError
18196
+ });
18197
+ }
18198
+ function buildCourseRegistrationWizardResult(parts) {
18199
+ const handleBookingModeChange = (mode) => {
18200
+ parts.setBookingMode(mode);
18201
+ parts.eligibility.choosePaymentChoice(mode === "membership" ? "membership" : "checkout");
18202
+ };
18203
+ return {
18204
+ api: parts.api,
18205
+ ...parts.selection,
18206
+ ...parts.portal,
18207
+ ...parts.eligibility,
18208
+ ...parts.actions,
18209
+ waitlistClaim: parts.waitlistClaim,
18210
+ bookingMode: parts.bookingMode,
18211
+ altchaSolution: parts.altchaSolution,
18212
+ setAltchaSolution: parts.setAltchaSolution,
18213
+ showSpamProtection: isSpamProtectionEnabled(),
18214
+ discountUiOpen: parts.discountUi.discountUiOpen,
18215
+ setDiscountUiOpen: parts.discountUi.setDiscountUiOpen,
18216
+ discountCode: parts.discountUi.discountCode,
18217
+ setDiscountCode: parts.discountUi.setDiscountCode,
18218
+ discountsAvailable: parts.discountUi.discountsAvailable,
18219
+ manualCodeEntryAllowed: parts.discountUi.manualCodeEntryAllowed,
18220
+ discountsAvailableLoading: parts.discountUi.discountsAvailableLoading,
18221
+ ...parts.view,
18222
+ handleCourseSelect: (course) => {
18223
+ parts.selection.chooseCourse(course);
18224
+ parts.selection.goToStep("enter-details");
18225
+ },
18226
+ handleRetry: () => {
18227
+ parts.selection.goToStep(parts.selection.scopedCourses.length === 1 ? "enter-details" : "select-course");
18228
+ parts.actions.reportError("");
18229
+ },
18230
+ handleBookingModeChange,
18231
+ handleLogout: parts.portal.portalAuthState === "authenticated" ? () => logoutPortal(COURSE_REGISTRATION_ANCHOR_ID) : void 0,
18232
+ selectedCoursePricingPayload: buildCoursePricingOptionPayload(parts.selection.selectedCoursePricing)
18349
18233
  };
18350
18234
  }
18351
18235
  //#endregion
@@ -18761,7 +18645,7 @@ function getCourseSlidingScaleMessage(pricing) {
18761
18645
  }
18762
18646
  function CourseRegistrationWizard(props) {
18763
18647
  const { showSessions = true, showPrice = true, showCapacity = true, showVenue = true, successMessage = "You're booked in! Check your email for confirmation and session details.", waitlistMessage = "You've been added to the waitlist. We'll email you a claim link if a spot opens up.", membershipMessage = "Booked using your membership! Check your email for session details.", buttonText = "Sign up", buttonVariant = "primary", className } = props;
18764
- const { api, scopedCourses, step, setStep, selectedCourse, selectedPricingOptionId, setSelectedPricingOptionId, selectedSlidingAmountInput, setSelectedSlidingAmountInput, selectedCoursePricing, formData, setFormData, errors, enrollmentResult, errorMessage, portalAuthState, handleLogout, altchaSolution: _altchaSolution, setAltchaSolution, showSpamProtection, eligibilityLoading, eligibilityError, courseEligibility, eligibleMemberships, paymentChoice, setPaymentChoice, selectedMembershipId, setSelectedMembershipId, discountUiOpen, setDiscountUiOpen, discountCode, setDiscountCode, discountsAvailable, manualCodeEntryAllowed, discountsAvailableLoading, waitlistClaim, canUseMembership: _canUseMembership, bookingMode, currentStepNumber, totalSteps, stepLabels, showPortalAuthSidebar, hasPreSelectedCourse: _hasPreSelectedCourse, hasCoursePayment: _hasCoursePayment, handleCourseSelect, handleSubmit, handlePaymentContinue, handleRetry, handleBookingModeChange } = useCourseRegistrationWizard(props);
18648
+ const { api, scopedCourses, step, goToStep, selectedCourse, selectedPricingOptionId, choosePricingOption, selectedSlidingAmountInput, changeSlidingAmount, selectedCoursePricing, formData, updateFormData, errors, enrollmentResult, errorMessage, portalAuthState, handleLogout, altchaSolution: _altchaSolution, setAltchaSolution, showSpamProtection, eligibilityLoading, eligibilityError, courseEligibility, eligibleMemberships, paymentChoice, choosePaymentChoice, selectedMembershipId, chooseMembership, discountUiOpen, setDiscountUiOpen, discountCode, setDiscountCode, discountsAvailable, manualCodeEntryAllowed, discountsAvailableLoading, waitlistClaim, canUseMembership: _canUseMembership, bookingMode, currentStepNumber, totalSteps, stepLabels, showPortalAuthSidebar, hasPreSelectedCourse: _hasPreSelectedCourse, hasCoursePayment: _hasCoursePayment, handleCourseSelect, handleSubmit, handlePaymentContinue, handleRetry, handleBookingModeChange } = useCourseRegistrationWizard(props);
18765
18649
  const buttonClass = themeButtonClassName({
18766
18650
  variant: buttonVariant,
18767
18651
  size: "md"
@@ -18826,13 +18710,13 @@ function CourseRegistrationWizard(props) {
18826
18710
  className: "cr-course-list",
18827
18711
  children: scopedCourses.map((course) => /* @__PURE__ */ jsx(CourseCard, {
18828
18712
  course,
18829
- isSelected: selectedCourse?.id === course.id,
18713
+ isSelected: selectedCourse?.eventSeriesId === course.eventSeriesId,
18830
18714
  onSelect: () => handleCourseSelect(course),
18831
18715
  showSessions,
18832
18716
  showPrice,
18833
18717
  showCapacity,
18834
18718
  showVenue
18835
- }, course.id))
18719
+ }, course.eventSeriesId))
18836
18720
  }),
18837
18721
  step === "enter-details" && selectedCourseWithPricing && /* @__PURE__ */ jsxs("div", {
18838
18722
  className: "cr-details",
@@ -18849,7 +18733,7 @@ function CourseRegistrationWizard(props) {
18849
18733
  className: "cr-actions",
18850
18734
  children: /* @__PURE__ */ jsx("button", {
18851
18735
  type: "button",
18852
- onClick: () => setStep("select-course"),
18736
+ onClick: () => goToStep("select-course"),
18853
18737
  className: "cr-back-btn",
18854
18738
  children: "← Back"
18855
18739
  })
@@ -18868,7 +18752,7 @@ function CourseRegistrationWizard(props) {
18868
18752
  /* @__PURE__ */ jsx(EnrollmentForm, {
18869
18753
  formData,
18870
18754
  errors,
18871
- onChange: setFormData,
18755
+ onChange: updateFormData,
18872
18756
  isEmailLocked: portalAuthState === "authenticated" || waitlistClaim.claim !== null,
18873
18757
  isLoading: portalAuthState === "checking" || waitlistClaim.isLoading,
18874
18758
  onLogout: handleLogout
@@ -18876,12 +18760,12 @@ function CourseRegistrationWizard(props) {
18876
18760
  /* @__PURE__ */ jsx(CoursePricingSelector, {
18877
18761
  pricing: selectedCourseWithPricing.pricing,
18878
18762
  selectedPricingOptionId,
18879
- onSelect: setSelectedPricingOptionId
18763
+ onSelect: choosePricingOption
18880
18764
  }),
18881
18765
  /* @__PURE__ */ jsx(CourseSlidingScaleInput, {
18882
18766
  pricing: selectedCourseWithPricing.pricing,
18883
18767
  value: selectedSlidingAmountInput,
18884
- onChange: setSelectedSlidingAmountInput
18768
+ onChange: changeSlidingAmount
18885
18769
  }),
18886
18770
  showSpamProtection && /* @__PURE__ */ jsx("div", {
18887
18771
  className: "cr-altcha",
@@ -18906,7 +18790,7 @@ function CourseRegistrationWizard(props) {
18906
18790
  className: "cr-actions",
18907
18791
  children: [scopedCourses.length > 1 && /* @__PURE__ */ jsx("button", {
18908
18792
  type: "button",
18909
- onClick: () => setStep("select-course"),
18793
+ onClick: () => goToStep("select-course"),
18910
18794
  className: "cr-back-btn",
18911
18795
  children: "← Back"
18912
18796
  }), /* @__PURE__ */ jsx("button", {
@@ -18956,7 +18840,7 @@ function CourseRegistrationWizard(props) {
18956
18840
  onBookingModeChange: handleBookingModeChange,
18957
18841
  eligibleMemberships,
18958
18842
  selectedMembershipId,
18959
- onMembershipSelect: setSelectedMembershipId,
18843
+ onMembershipSelect: chooseMembership,
18960
18844
  priceCents: selectedCoursePricing?.selectedPriceAmount ?? null,
18961
18845
  currency: selectedCourseWithPricing.course.currency ?? "GBP"
18962
18846
  }),
@@ -18964,7 +18848,7 @@ function CourseRegistrationWizard(props) {
18964
18848
  className: "cr-actions",
18965
18849
  children: [/* @__PURE__ */ jsx("button", {
18966
18850
  type: "button",
18967
- onClick: () => setStep("enter-details"),
18851
+ onClick: () => goToStep("enter-details"),
18968
18852
  className: "cr-back-btn",
18969
18853
  children: "← Back"
18970
18854
  }), /* @__PURE__ */ jsx("button", {
@@ -19003,7 +18887,7 @@ function CourseRegistrationWizard(props) {
19003
18887
  type: "radio",
19004
18888
  name: "paymentChoice",
19005
18889
  checked: paymentChoice === "membership",
19006
- onChange: () => setPaymentChoice("membership")
18890
+ onChange: () => choosePaymentChoice("membership")
19007
18891
  }), /* @__PURE__ */ jsx("span", { children: "Use a membership (free)" })]
19008
18892
  }),
19009
18893
  paymentChoice === "membership" && eligibleMemberships.length > 1 && /* @__PURE__ */ jsxs("div", {
@@ -19016,7 +18900,7 @@ function CourseRegistrationWizard(props) {
19016
18900
  id: "cr-membership",
19017
18901
  className: "cr-form__input",
19018
18902
  value: selectedMembershipId ?? "",
19019
- onChange: (e) => setSelectedMembershipId(e.target.value || null),
18903
+ onChange: (e) => chooseMembership(e.target.value || null),
19020
18904
  children: [/* @__PURE__ */ jsx("option", {
19021
18905
  value: "",
19022
18906
  disabled: true,
@@ -19033,7 +18917,7 @@ function CourseRegistrationWizard(props) {
19033
18917
  type: "radio",
19034
18918
  name: "paymentChoice",
19035
18919
  checked: paymentChoice === "checkout",
19036
- onChange: () => setPaymentChoice("checkout")
18920
+ onChange: () => choosePaymentChoice("checkout")
19037
18921
  }), /* @__PURE__ */ jsx("span", { children: "Pay by card" })]
19038
18922
  })
19039
18923
  ]
@@ -19055,7 +18939,7 @@ function CourseRegistrationWizard(props) {
19055
18939
  className: "cr-actions",
19056
18940
  children: [/* @__PURE__ */ jsx("button", {
19057
18941
  type: "button",
19058
- onClick: () => setStep("enter-details"),
18942
+ onClick: () => goToStep("enter-details"),
19059
18943
  className: "cr-back-btn",
19060
18944
  children: "← Back"
19061
18945
  }), /* @__PURE__ */ jsx("button", {
@@ -19287,7 +19171,7 @@ const LeafletStaticMap = ({ location, label, className = "", height = 200, zoom
19287
19171
  function toEventDetailsClientProps(props) {
19288
19172
  return {
19289
19173
  occurrenceContext: props.occurrenceContext,
19290
- contentEntry: props.contentEntry,
19174
+ subject: props.subject,
19291
19175
  events: props.events ? [...props.events] : props.events,
19292
19176
  showVenue: props.showVenue,
19293
19177
  showMap: props.showMap,
@@ -19303,10 +19187,11 @@ function toEventDetailsClientProps(props) {
19303
19187
  nowIso: props.nowIso
19304
19188
  };
19305
19189
  }
19306
- function EventDetailsClient({ occurrenceContext, events, showVenue = true, showMap = true, showOtherDates = true, otherDatesLimit, showCost = true, showAcceptedPasses = true, showAcceptedMemberships = true, sitePasses, siteMemberships, autoApplyDiscount, className, nowIso, children }) {
19190
+ function EventDetailsClient({ occurrenceContext, subject, events, showVenue = true, showMap = true, showOtherDates = true, otherDatesLimit, showCost = true, showAcceptedPasses = true, showAcceptedMemberships = true, sitePasses, siteMemberships, autoApplyDiscount, className, nowIso, children }) {
19307
19191
  const selection = selectEventDetails({
19308
19192
  events: events ?? null,
19309
19193
  occurrenceContext: occurrenceContext ?? null,
19194
+ subject,
19310
19195
  nowIso: nowIso ?? (/* @__PURE__ */ new Date()).toISOString(),
19311
19196
  otherDatesLimit
19312
19197
  });
@@ -24186,7 +24071,7 @@ var header_section_client_default = markEditableSurfaceForwarding(HeaderSectionN
24186
24071
  * Renders category filter buttons and venue dropdown for event lists.
24187
24072
  * Uses semantic CSS classes for styling.
24188
24073
  */
24189
- const EventFilters = ({ categories, venues, staffMembers, selectedKind, selectedCategoryId, selectedStaffMemberId, selectedVenueId, showCategoryFilter, showVenueFilter, showStaffFilter, showCourseOption, courseOptionLabel, onCategoryChange, onKindChange, onStaffMemberChange, onVenueChange, loading, idBase, className }) => {
24074
+ const EventFilters = ({ categories, venues, staffMembers, selectedCategoryId, selectedStaffMemberId, selectedVenueId, showCategoryFilter, showVenueFilter, showStaffFilter, onCategoryChange, onStaffMemberChange, onVenueChange, loading, idBase, className }) => {
24190
24075
  const reactId = useId();
24191
24076
  const baseId = idBase ?? reactId;
24192
24077
  const staffSelectId = `${baseId}-event-staff-filter`;
@@ -24204,29 +24089,19 @@ const EventFilters = ({ categories, venues, staffMembers, selectedKind, selected
24204
24089
  className: "event-category-buttons",
24205
24090
  role: "group",
24206
24091
  "aria-label": "Filter by category",
24207
- children: [
24208
- /* @__PURE__ */ jsx("button", {
24209
- type: "button",
24210
- className: `event-category-btn ${selectedKind !== "courses" && selectedCategoryId === "all" ? "event-category-btn--active" : ""}`,
24211
- onClick: () => onCategoryChange("all"),
24212
- disabled: loading,
24213
- children: "All"
24214
- }),
24215
- showCourseOption ? /* @__PURE__ */ jsx("button", {
24216
- type: "button",
24217
- className: `event-category-btn ${selectedKind === "courses" ? "event-category-btn--active" : ""}`,
24218
- onClick: () => onKindChange("courses"),
24219
- disabled: loading,
24220
- children: courseOptionLabel
24221
- }) : null,
24222
- categories.map((category) => /* @__PURE__ */ jsx("button", {
24223
- type: "button",
24224
- className: `event-category-btn ${selectedKind !== "courses" && selectedCategoryId === category.id ? "event-category-btn--active" : ""}`,
24225
- onClick: () => onCategoryChange(category.id),
24226
- disabled: loading,
24227
- children: category.name
24228
- }, category.id))
24229
- ]
24092
+ children: [/* @__PURE__ */ jsx("button", {
24093
+ type: "button",
24094
+ className: `event-category-btn ${selectedCategoryId === "all" ? "event-category-btn--active" : ""}`,
24095
+ onClick: () => onCategoryChange("all"),
24096
+ disabled: loading,
24097
+ children: "All"
24098
+ }), categories.map((category) => /* @__PURE__ */ jsx("button", {
24099
+ type: "button",
24100
+ className: `event-category-btn ${selectedCategoryId === category.id ? "event-category-btn--active" : ""}`,
24101
+ onClick: () => onCategoryChange(category.id),
24102
+ disabled: loading,
24103
+ children: category.name
24104
+ }, category.id))]
24230
24105
  })]
24231
24106
  }),
24232
24107
  showStaffFilter && /* @__PURE__ */ jsxs("div", {
@@ -24482,7 +24357,6 @@ function useEventPagination({ siteId: _siteId, initialEvents = [], fetchInitialO
24482
24357
  const normalizedCategoryIds = normalizeCsvString(filters?.categoryIds);
24483
24358
  const normalizedStaffMemberId = normalizeOptionalId(filters?.staffMemberId);
24484
24359
  const normalizedVenueId = normalizeOptionalId(filters?.venueId);
24485
- const kind = filters?.kind;
24486
24360
  const eventSurface = filters?.eventSurface;
24487
24361
  const eventPresets = normalizeCsvString(filters?.eventPresets);
24488
24362
  const scheduleScope = filters?.scheduleScope;
@@ -24518,7 +24392,6 @@ function useEventPagination({ siteId: _siteId, initialEvents = [], fetchInitialO
24518
24392
  limit: pageSize,
24519
24393
  stage,
24520
24394
  detailLevel: "listing",
24521
- kind,
24522
24395
  eventSurface,
24523
24396
  eventPresets: eventPresets ?? void 0,
24524
24397
  scheduleScope,
@@ -24549,7 +24422,6 @@ function useEventPagination({ siteId: _siteId, initialEvents = [], fetchInitialO
24549
24422
  getPublicEvents,
24550
24423
  pageSize,
24551
24424
  stage,
24552
- kind,
24553
24425
  eventSurface,
24554
24426
  eventPresets,
24555
24427
  scheduleScope,
@@ -24629,8 +24501,7 @@ function useEventPagination({ siteId: _siteId, initialEvents = [], fetchInitialO
24629
24501
  const EMPTY_EVENT_FILTERS = Object.freeze({
24630
24502
  categories: [],
24631
24503
  venues: [],
24632
- staffMembers: [],
24633
- labels: Object.freeze({ courseOption: "Course" })
24504
+ staffMembers: []
24634
24505
  });
24635
24506
  function createInitialEventFiltersLoadState() {
24636
24507
  return {
@@ -24701,13 +24572,12 @@ function getEventFiltersError(state) {
24701
24572
  * const events = await api.getPublicEvents(params);
24702
24573
  * ```
24703
24574
  */
24704
- function useEventFilters({ showCategoryFilter = "auto", showVenueFilter = false, showStaffFilter = false, preFilterCategoryIds, preFilterStaffMemberId, preFilterVenueId, preFilterKind, preFilterEventSurface, preFilterEventPresets, preFilterScheduleScope } = {}) {
24575
+ function useEventFilters({ showCategoryFilter = "auto", showVenueFilter = false, showStaffFilter = false, preFilterCategoryIds, preFilterStaffMemberId, preFilterVenueId, preFilterEventSurface, preFilterEventPresets, preFilterScheduleScope } = {}) {
24705
24576
  const api = useBlockApi();
24706
24577
  const [loadState, dispatchLoadState] = useReducer(eventFiltersLoadReducer, void 0, createInitialEventFiltersLoadState);
24707
24578
  const filters = getEventFiltersData(loadState);
24708
24579
  const loading = isEventFiltersLoading(loadState);
24709
24580
  const error = getEventFiltersError(loadState);
24710
- const [selectedKind, setSelectedKindState] = useState("all");
24711
24581
  const [selectedCategoryId, setSelectedCategoryId] = useState("all");
24712
24582
  const [selectedStaffMemberId, setSelectedStaffMemberId] = useState("all");
24713
24583
  const [selectedVenueId, setSelectedVenueId] = useState("all");
@@ -24715,21 +24585,19 @@ function useEventFilters({ showCategoryFilter = "auto", showVenueFilter = false,
24715
24585
  const allowedCategorySet = useMemo(() => new Set(allowedCategoryIds), [allowedCategoryIds.join(",")]);
24716
24586
  const fixedVenueId = useMemo(() => normalizeOptionalId(preFilterVenueId), [preFilterVenueId]);
24717
24587
  const fixedStaffMemberId = useMemo(() => normalizeOptionalId(preFilterStaffMemberId), [preFilterStaffMemberId]);
24718
- const fixedKind = useMemo(() => normalizeEventBlockKind(preFilterKind), [preFilterKind]);
24719
24588
  const fixedEventSurface = preFilterEventSurface && preFilterEventSurface !== "all" ? preFilterEventSurface : void 0;
24720
24589
  const fixedEventPresets = preFilterEventPresets?.trim() || void 0;
24721
24590
  const fixedScheduleScope = preFilterScheduleScope && preFilterScheduleScope !== "any" ? preFilterScheduleScope : void 0;
24722
24591
  const hasFetchedRef = useRef(false);
24723
24592
  useEffect(() => {
24724
24593
  if (hasFetchedRef.current) return;
24725
- if (!(showCategoryFilter !== "never" && fixedKind !== "courses" || showVenueFilter || showStaffFilter)) return;
24594
+ if (!(showCategoryFilter !== "never" || showVenueFilter || showStaffFilter)) return;
24726
24595
  hasFetchedRef.current = true;
24727
24596
  dispatchLoadState({ type: "started" });
24728
24597
  api.getEventFilters({
24729
24598
  categoryIds: allowedCategoryIds.length > 0 ? allowedCategoryIds.join(",") : void 0,
24730
24599
  venueId: fixedVenueId ?? void 0,
24731
24600
  staffMemberId: fixedStaffMemberId ?? void 0,
24732
- kind: fixedKind === "all" ? void 0 : fixedKind,
24733
24601
  eventSurface: fixedEventSurface,
24734
24602
  eventPresets: fixedEventPresets,
24735
24603
  scheduleScope: fixedScheduleScope
@@ -24749,7 +24617,6 @@ function useEventFilters({ showCategoryFilter = "auto", showVenueFilter = false,
24749
24617
  api,
24750
24618
  fixedEventPresets,
24751
24619
  fixedEventSurface,
24752
- fixedKind,
24753
24620
  fixedScheduleScope,
24754
24621
  fixedStaffMemberId,
24755
24622
  fixedVenueId,
@@ -24777,23 +24644,10 @@ function useEventFilters({ showCategoryFilter = "auto", showVenueFilter = false,
24777
24644
  return available.filter((staffMember) => staffMember.id === fixedStaffMemberId);
24778
24645
  }, [filters.staffMembers, fixedStaffMemberId]);
24779
24646
  useEffect(() => {
24780
- if ((fixedKind === "courses" || selectedKind === "courses") && selectedCategoryId !== "all") {
24781
- setSelectedCategoryId("all");
24782
- return;
24783
- }
24784
- if (fixedKind !== "all" && selectedKind === "courses") {
24785
- setSelectedKindState("all");
24786
- return;
24787
- }
24788
24647
  if (selectedCategoryId !== "all") {
24789
24648
  if (!categoriesForSelect.some((c) => c.id === selectedCategoryId)) setSelectedCategoryId("all");
24790
24649
  }
24791
- }, [
24792
- categoriesForSelect,
24793
- fixedKind,
24794
- selectedCategoryId,
24795
- selectedKind
24796
- ]);
24650
+ }, [categoriesForSelect, selectedCategoryId]);
24797
24651
  useEffect(() => {
24798
24652
  if (fixedVenueId) {
24799
24653
  setSelectedVenueId("all");
@@ -24822,12 +24676,10 @@ function useEventFilters({ showCategoryFilter = "auto", showVenueFilter = false,
24822
24676
  ]);
24823
24677
  const shouldShowCategoryFilter = (() => {
24824
24678
  if (showCategoryFilter === "never") return false;
24825
- if (fixedKind === "courses") return false;
24826
24679
  if (allowedCategoryIds.length > 0 && allowedCategoryIds.length <= 1) return false;
24827
24680
  if (showCategoryFilter === "always") return categoriesForSelect.length > 0;
24828
24681
  return categoriesForSelect.length > 1;
24829
24682
  })();
24830
- const showCourseOption = fixedKind === "all" && !Boolean(fixedEventSurface || fixedEventPresets || fixedScheduleScope);
24831
24683
  const shouldShowVenueFilter = (() => {
24832
24684
  if (!showVenueFilter) return false;
24833
24685
  if (fixedVenueId) return false;
@@ -24838,76 +24690,13 @@ function useEventFilters({ showCategoryFilter = "auto", showVenueFilter = false,
24838
24690
  if (fixedStaffMemberId) return false;
24839
24691
  return staffMembersForSelect.length > 1;
24840
24692
  })();
24841
- const setSelectedKind = useCallback((kind) => {
24842
- if (fixedKind !== "all") return;
24843
- setSelectedKindState(kind);
24844
- if (kind === "courses") setSelectedCategoryId("all");
24845
- if (kind === "all") setSelectedCategoryId("all");
24846
- }, [fixedKind]);
24847
24693
  const setSelectedCategory = useCallback((id) => {
24848
- if (fixedKind === "courses") return;
24849
24694
  setSelectedCategoryId(id);
24850
- if (id === "all") setSelectedKindState("all");
24851
- else setSelectedKindState("events");
24852
- }, [fixedKind]);
24853
- const hasActiveFilters = useMemo(() => {
24854
- return selectedKind !== "all" || selectedCategoryId !== "all" || selectedStaffMemberId !== "all" || selectedVenueId !== "all";
24855
- }, [
24856
- selectedCategoryId,
24857
- selectedKind,
24858
- selectedStaffMemberId,
24859
- selectedVenueId
24860
- ]);
24861
- const resetFilters = useCallback(() => {
24862
- setSelectedKindState(fixedKind !== "all" ? fixedKind : "all");
24863
- setSelectedCategoryId("all");
24864
- setSelectedStaffMemberId("all");
24865
- setSelectedVenueId("all");
24866
- }, [fixedKind]);
24867
- const getFilterParams = useCallback(() => {
24868
- const params = {};
24869
- const effectiveKind = fixedKind === "all" ? selectedKind : fixedKind;
24870
- if (fixedEventSurface) params.eventSurface = fixedEventSurface;
24871
- if (fixedEventPresets) params.eventPresets = fixedEventPresets;
24872
- if (fixedScheduleScope) params.scheduleScope = fixedScheduleScope;
24873
- if (effectiveKind === "courses") {
24874
- params.kind = "courses";
24875
- if (fixedVenueId) params.venueId = fixedVenueId;
24876
- if (selectedVenueId !== "all") params.venueId = selectedVenueId;
24877
- params.staffMemberId = fixedStaffMemberId ?? (selectedStaffMemberId !== "all" ? selectedStaffMemberId : void 0);
24878
- return params;
24879
- }
24880
- if (allowedCategoryIds.length > 0) params.categoryIds = allowedCategoryIds.join(",");
24881
- if (effectiveKind === "events") params.kind = "events";
24882
- if (selectedCategoryId !== "all") {
24883
- if (allowedCategoryIds.length === 0 || allowedCategorySet.has(selectedCategoryId)) {
24884
- params.categoryIds = selectedCategoryId;
24885
- params.kind = "events";
24886
- }
24887
- }
24888
- if (fixedVenueId) params.venueId = fixedVenueId;
24889
- if (selectedVenueId !== "all") params.venueId = selectedVenueId;
24890
- params.staffMemberId = fixedStaffMemberId ?? (selectedStaffMemberId !== "all" ? selectedStaffMemberId : void 0);
24891
- return params;
24892
- }, [
24893
- allowedCategoryIds,
24894
- allowedCategorySet,
24895
- fixedEventPresets,
24896
- fixedEventSurface,
24897
- fixedKind,
24898
- fixedScheduleScope,
24899
- fixedStaffMemberId,
24900
- fixedVenueId,
24901
- selectedCategoryId,
24902
- selectedKind,
24903
- selectedStaffMemberId,
24904
- selectedVenueId
24905
- ]);
24695
+ }, []);
24906
24696
  return {
24907
24697
  categories: categoriesForSelect,
24908
24698
  venues: venuesForSelect,
24909
24699
  staffMembers: staffMembersForSelect,
24910
- selectedKind,
24911
24700
  selectedCategoryId,
24912
24701
  selectedStaffMemberId,
24913
24702
  selectedVenueId,
@@ -24916,15 +24705,46 @@ function useEventFilters({ showCategoryFilter = "auto", showVenueFilter = false,
24916
24705
  shouldShowCategoryFilter,
24917
24706
  shouldShowVenueFilter,
24918
24707
  shouldShowStaffFilter,
24919
- showCourseOption,
24920
- courseOptionLabel: filters.labels.courseOption,
24921
- hasActiveFilters,
24922
- setSelectedKind,
24708
+ hasActiveFilters: useMemo(() => {
24709
+ return selectedCategoryId !== "all" || selectedStaffMemberId !== "all" || selectedVenueId !== "all";
24710
+ }, [
24711
+ selectedCategoryId,
24712
+ selectedStaffMemberId,
24713
+ selectedVenueId
24714
+ ]),
24923
24715
  setSelectedCategoryId: setSelectedCategory,
24924
24716
  setSelectedStaffMemberId,
24925
24717
  setSelectedVenueId,
24926
- resetFilters,
24927
- getFilterParams
24718
+ resetFilters: useCallback(() => {
24719
+ setSelectedCategoryId("all");
24720
+ setSelectedStaffMemberId("all");
24721
+ setSelectedVenueId("all");
24722
+ }, []),
24723
+ getFilterParams: useCallback(() => {
24724
+ const params = {};
24725
+ if (fixedEventSurface) params.eventSurface = fixedEventSurface;
24726
+ if (fixedEventPresets) params.eventPresets = fixedEventPresets;
24727
+ if (fixedScheduleScope) params.scheduleScope = fixedScheduleScope;
24728
+ if (allowedCategoryIds.length > 0) params.categoryIds = allowedCategoryIds.join(",");
24729
+ if (selectedCategoryId !== "all") {
24730
+ if (allowedCategoryIds.length === 0 || allowedCategorySet.has(selectedCategoryId)) params.categoryIds = selectedCategoryId;
24731
+ }
24732
+ if (fixedVenueId) params.venueId = fixedVenueId;
24733
+ if (selectedVenueId !== "all") params.venueId = selectedVenueId;
24734
+ params.staffMemberId = fixedStaffMemberId ?? (selectedStaffMemberId !== "all" ? selectedStaffMemberId : void 0);
24735
+ return params;
24736
+ }, [
24737
+ allowedCategoryIds,
24738
+ allowedCategorySet,
24739
+ fixedEventPresets,
24740
+ fixedEventSurface,
24741
+ fixedScheduleScope,
24742
+ fixedStaffMemberId,
24743
+ fixedVenueId,
24744
+ selectedCategoryId,
24745
+ selectedStaffMemberId,
24746
+ selectedVenueId
24747
+ ])
24928
24748
  };
24929
24749
  }
24930
24750
  //#endregion
@@ -24938,7 +24758,6 @@ const EventListingController = ({ render }) => {
24938
24758
  const filtersIdBase = useId();
24939
24759
  const initialListEvents = useMemo(() => [...display.events], [display.events]);
24940
24760
  const initialListFilters = useMemo(() => buildEventRuntimeFilters({
24941
- eventKind: hydration.eventKind,
24942
24761
  eventSurface: hydration.eventSurface,
24943
24762
  filterEventPresets: hydration.filterEventPresets,
24944
24763
  scheduleScope: hydration.scheduleScope,
@@ -24946,7 +24765,6 @@ const EventListingController = ({ render }) => {
24946
24765
  filterStaffMemberId: hydration.filterStaffMemberId,
24947
24766
  filterVenueId: hydration.filterVenueId
24948
24767
  }), [
24949
- hydration.eventKind,
24950
24768
  hydration.eventSurface,
24951
24769
  hydration.filterEventPresets,
24952
24770
  hydration.scheduleScope,
@@ -24954,14 +24772,13 @@ const EventListingController = ({ render }) => {
24954
24772
  hydration.filterStaffMemberId,
24955
24773
  hydration.filterVenueId
24956
24774
  ]);
24957
- const { categories, venues, staffMembers, selectedKind, selectedCategoryId, selectedStaffMemberId, selectedVenueId, loading: filtersLoading, shouldShowCategoryFilter, shouldShowVenueFilter, shouldShowStaffFilter, showCourseOption, courseOptionLabel, hasActiveFilters, setSelectedKind, setSelectedCategoryId, setSelectedStaffMemberId, setSelectedVenueId, resetFilters, getFilterParams } = useEventFilters({
24775
+ const { categories, venues, staffMembers, selectedCategoryId, selectedStaffMemberId, selectedVenueId, loading: filtersLoading, shouldShowCategoryFilter, shouldShowVenueFilter, shouldShowStaffFilter, hasActiveFilters, setSelectedCategoryId, setSelectedStaffMemberId, setSelectedVenueId, resetFilters, getFilterParams } = useEventFilters({
24958
24776
  showCategoryFilter: hydration.showFilters ? hydration.showCategoryFilter : "never",
24959
24777
  showVenueFilter: hydration.showFilters ? hydration.showVenueFilter : false,
24960
24778
  showStaffFilter: hydration.showFilters ? hydration.showStaffFilter : false,
24961
24779
  preFilterCategoryIds: hydration.filterCategoryIds ?? void 0,
24962
24780
  preFilterStaffMemberId: hydration.filterStaffMemberId ?? void 0,
24963
24781
  preFilterVenueId: hydration.filterVenueId ?? void 0,
24964
- preFilterKind: hydration.eventKind,
24965
24782
  preFilterEventSurface: hydration.eventSurface,
24966
24783
  preFilterEventPresets: hydration.filterEventPresets,
24967
24784
  preFilterScheduleScope: hydration.scheduleScope
@@ -24982,16 +24799,12 @@ const EventListingController = ({ render }) => {
24982
24799
  categories,
24983
24800
  venues,
24984
24801
  staffMembers,
24985
- selectedKind,
24986
24802
  selectedCategoryId,
24987
24803
  selectedStaffMemberId,
24988
24804
  selectedVenueId,
24989
24805
  showCategoryFilter: shouldShowCategoryFilter,
24990
24806
  showVenueFilter: shouldShowVenueFilter,
24991
24807
  showStaffFilter: shouldShowStaffFilter,
24992
- showCourseOption,
24993
- courseOptionLabel,
24994
- onKindChange: setSelectedKind,
24995
24808
  onCategoryChange: setSelectedCategoryId,
24996
24809
  onStaffMemberChange: setSelectedStaffMemberId,
24997
24810
  onVenueChange: setSelectedVenueId,
@@ -25161,7 +24974,6 @@ function useCalendarEventCache({ viewDate, initialEvents = [], preloadMonths = 1
25161
24974
  filters?.categoryIds,
25162
24975
  filters?.eventPresets,
25163
24976
  filters?.eventSurface,
25164
- filters?.kind,
25165
24977
  filters?.scheduleScope,
25166
24978
  filters?.staffMemberId,
25167
24979
  filters?.venueId
@@ -25198,7 +25010,6 @@ function useCalendarEventCache({ viewDate, initialEvents = [], preloadMonths = 1
25198
25010
  limit: CALENDAR_FETCH_LIMIT,
25199
25011
  stage,
25200
25012
  detailLevel: "listing",
25201
- kind: filters?.kind,
25202
25013
  eventSurface: filters?.eventSurface,
25203
25014
  eventPresets: filters?.eventPresets,
25204
25015
  scheduleScope: filters?.scheduleScope,
@@ -25232,7 +25043,6 @@ function useCalendarEventCache({ viewDate, initialEvents = [], preloadMonths = 1
25232
25043
  filters?.categoryIds,
25233
25044
  filters?.eventPresets,
25234
25045
  filters?.eventSurface,
25235
- filters?.kind,
25236
25046
  filters?.scheduleScope,
25237
25047
  filters?.staffMemberId,
25238
25048
  filters?.venueId,
@@ -25640,7 +25450,6 @@ function toEventCombinedControllerProps(props) {
25640
25450
  showCategoryFilter: props.render.display.showCategoryFilter,
25641
25451
  showVenueFilter: props.render.display.showVenueFilter,
25642
25452
  showStaffFilter: props.render.display.showStaffFilter,
25643
- eventKind: props.render.display.eventKind,
25644
25453
  eventSurface: props.render.display.eventSurface,
25645
25454
  filterEventPresets: props.render.display.filterEventPresets,
25646
25455
  scheduleScope: props.render.display.scheduleScope,
@@ -25665,7 +25474,7 @@ function toEventCombinedControllerProps(props) {
25665
25474
  const EventCombinedClient = ({ events: initialEvents, siteId, stage, listLayout = "stack", listColumns = "3", eventsPerPage = 12, paginationAction = {
25666
25475
  kind: "loadMore",
25667
25476
  label: "Load more events"
25668
- }, startOfWeek = "monday", calendarTabViews = "both", defaultCalendarView, showFilters, showCategoryFilter = "auto", showVenueFilter, showStaffFilter, eventKind = "all", eventSurface, filterEventPresets, scheduleScope, filterCategoryIds, filterStaffMemberId, filterVenueId, showVenue, showMap, showCapacity, buttonVariant = "primary", buttonText = "Book", emptyMessage = "No upcoming events scheduled.", className }) => {
25477
+ }, startOfWeek = "monday", calendarTabViews = "both", defaultCalendarView, showFilters, showCategoryFilter = "auto", showVenueFilter, showStaffFilter, eventSurface, filterEventPresets, scheduleScope, filterCategoryIds, filterStaffMemberId, filterVenueId, showVenue, showMap, showCapacity, buttonVariant = "primary", buttonText = "Book", emptyMessage = "No upcoming events scheduled.", className }) => {
25669
25478
  const fetchInitialEventsOnMount = initialEvents == null;
25670
25479
  const resolvedShowFilters = showFilters ?? true;
25671
25480
  const resolvedShowVenueFilter = showVenueFilter ?? false;
@@ -25686,20 +25495,18 @@ const EventCombinedClient = ({ events: initialEvents, siteId, stage, listLayout
25686
25495
  setCalendarView(initialCalendarView);
25687
25496
  }, [initialCalendarView]);
25688
25497
  const filtersIdBase = useId();
25689
- const { categories, venues, staffMembers, selectedKind, selectedCategoryId, selectedStaffMemberId, selectedVenueId, loading: filtersLoading, shouldShowCategoryFilter, shouldShowVenueFilter, shouldShowStaffFilter, showCourseOption, courseOptionLabel, hasActiveFilters, setSelectedKind, setSelectedCategoryId, setSelectedStaffMemberId, setSelectedVenueId, resetFilters, getFilterParams } = useEventFilters({
25498
+ const { categories, venues, staffMembers, selectedCategoryId, selectedStaffMemberId, selectedVenueId, loading: filtersLoading, shouldShowCategoryFilter, shouldShowVenueFilter, shouldShowStaffFilter, hasActiveFilters, setSelectedCategoryId, setSelectedStaffMemberId, setSelectedVenueId, resetFilters, getFilterParams } = useEventFilters({
25690
25499
  showCategoryFilter: resolvedShowFilters ? showCategoryFilter : "never",
25691
25500
  showVenueFilter: resolvedShowFilters ? resolvedShowVenueFilter : false,
25692
25501
  showStaffFilter: resolvedShowFilters ? resolvedShowStaffFilter : false,
25693
25502
  preFilterCategoryIds: filterCategoryIds,
25694
25503
  preFilterStaffMemberId: filterStaffMemberId,
25695
25504
  preFilterVenueId: filterVenueId,
25696
- preFilterKind: eventKind,
25697
25505
  preFilterEventSurface: resolvedEventSurface,
25698
25506
  preFilterEventPresets: filterEventPresets,
25699
25507
  preFilterScheduleScope: resolvedScheduleScope
25700
25508
  });
25701
25509
  const initialListFilters = useMemo(() => buildEventRuntimeFilters({
25702
- eventKind,
25703
25510
  eventSurface: resolvedEventSurface,
25704
25511
  filterEventPresets,
25705
25512
  scheduleScope: resolvedScheduleScope,
@@ -25707,7 +25514,6 @@ const EventCombinedClient = ({ events: initialEvents, siteId, stage, listLayout
25707
25514
  filterStaffMemberId,
25708
25515
  filterVenueId
25709
25516
  }), [
25710
- eventKind,
25711
25517
  resolvedEventSurface,
25712
25518
  filterCategoryIds,
25713
25519
  filterEventPresets,
@@ -25784,16 +25590,12 @@ const EventCombinedClient = ({ events: initialEvents, siteId, stage, listLayout
25784
25590
  categories,
25785
25591
  venues,
25786
25592
  staffMembers,
25787
- selectedKind,
25788
25593
  selectedCategoryId,
25789
25594
  selectedStaffMemberId,
25790
25595
  selectedVenueId,
25791
25596
  showCategoryFilter: shouldShowCategoryFilter,
25792
25597
  showVenueFilter: shouldShowVenueFilter,
25793
25598
  showStaffFilter: shouldShowStaffFilter,
25794
- showCourseOption,
25795
- courseOptionLabel,
25796
- onKindChange: setSelectedKind,
25797
25599
  onCategoryChange: setSelectedCategoryId,
25798
25600
  onStaffMemberChange: setSelectedStaffMemberId,
25799
25601
  onVenueChange: setSelectedVenueId,
@@ -26077,7 +25879,6 @@ const EventCalendarClient = ({ render }) => {
26077
25879
  showCategoryFilter: display.showCategoryFilter,
26078
25880
  showVenueFilter: display.showVenueFilter,
26079
25881
  showStaffFilter: display.showStaffFilter,
26080
- eventKind: display.eventKind,
26081
25882
  eventSurface: display.eventSurface,
26082
25883
  filterEventPresets: display.filterEventPresets,
26083
25884
  scheduleScope: display.scheduleScope,
@@ -26218,7 +26019,6 @@ function useEventCalendarFilterState(display) {
26218
26019
  preFilterCategoryIds: display.filterCategoryIds,
26219
26020
  preFilterStaffMemberId: display.filterStaffMemberId,
26220
26021
  preFilterVenueId: display.filterVenueId,
26221
- preFilterKind: display.eventKind,
26222
26022
  preFilterEventSurface: display.eventSurface,
26223
26023
  preFilterEventPresets: display.filterEventPresets,
26224
26024
  preFilterScheduleScope: display.scheduleScope
@@ -26230,16 +26030,12 @@ function useEventCalendarFilterState(display) {
26230
26030
  categories: filterState.categories,
26231
26031
  venues: filterState.venues,
26232
26032
  staffMembers: filterState.staffMembers,
26233
- selectedKind: filterState.selectedKind,
26234
26033
  selectedCategoryId: filterState.selectedCategoryId,
26235
26034
  selectedStaffMemberId: filterState.selectedStaffMemberId,
26236
26035
  selectedVenueId: filterState.selectedVenueId,
26237
26036
  showCategoryFilter: filterState.shouldShowCategoryFilter,
26238
26037
  showVenueFilter: filterState.shouldShowVenueFilter,
26239
26038
  showStaffFilter: filterState.shouldShowStaffFilter,
26240
- showCourseOption: filterState.showCourseOption,
26241
- courseOptionLabel: filterState.courseOptionLabel,
26242
- onKindChange: filterState.setSelectedKind,
26243
26039
  onCategoryChange: filterState.setSelectedCategoryId,
26244
26040
  onStaffMemberChange: filterState.setSelectedStaffMemberId,
26245
26041
  onVenueChange: filterState.setSelectedVenueId,
@@ -26250,7 +26046,6 @@ function useEventCalendarFilterState(display) {
26250
26046
  }
26251
26047
  function usePrefetchedCalendarEvents(display, listFilters) {
26252
26048
  const initialFilters = useMemo(() => buildDisplayFilterParams(display), [
26253
- display.eventKind,
26254
26049
  display.eventSurface,
26255
26050
  display.filterCategoryIds,
26256
26051
  display.filterEventPresets,
@@ -26268,7 +26063,6 @@ function usePrefetchedCalendarEvents(display, listFilters) {
26268
26063
  }
26269
26064
  function buildDisplayFilterParams(display) {
26270
26065
  return buildEventRuntimeFilters({
26271
- eventKind: display.eventKind,
26272
26066
  eventSurface: display.eventSurface,
26273
26067
  filterEventPresets: display.filterEventPresets,
26274
26068
  scheduleScope: display.scheduleScope,
@@ -36850,10 +36644,10 @@ function LinkedEntryEditEventBridge() {
36850
36644
  //#region ../preview-next/src/client/preview/PreviewShellLayout.tsx
36851
36645
  const previewContainerResponsiveEnabled = process.env.NEXT_PUBLIC_ENABLE_PREVIEW_CONTAINER_RESPONSIVE !== "false";
36852
36646
  const PreviewEditorSidebar = React.lazy(async () => {
36853
- return { default: (await import("./PreviewEditorSidebar-DvJFmC29.mjs")).PreviewEditorSidebar };
36647
+ return { default: (await import("./PreviewEditorSidebar-BezDOtQ7.mjs")).PreviewEditorSidebar };
36854
36648
  });
36855
36649
  const PreviewEditorUI = React.lazy(async () => {
36856
- return { default: (await import("./PreviewEditorUI-DVHP4bCo.mjs")).PreviewEditorUI };
36650
+ return { default: (await import("./PreviewEditorUI-CgSqmfo2.mjs")).PreviewEditorUI };
36857
36651
  });
36858
36652
  const previewPaneContainmentStyle = {
36859
36653
  contain: "layout paint",
@@ -39343,7 +39137,7 @@ async function callDirectLoaderApiEndpoint(dashboardApiClient, endpoint, params)
39343
39137
  }
39344
39138
  }
39345
39139
  function isBatchableEndpoint(endpoint) {
39346
- return endpoint === "listPublicEvents" || endpoint === "getPublicEventDetails" || endpoint === "listPublicCourses" || endpoint === "listPublicRouteCandidates" || endpoint === "listPublicTeamMembers" || endpoint === "listPublicProducts" || endpoint === "getPublicBookingServices" || endpoint === "getPublicWeeklySlotAvailability" || endpoint === "getPublicFormById";
39140
+ return endpoint === "listPublicEvents" || endpoint === "getPublicEventDetails" || endpoint === "listPublicWholeSeriesOfferings" || endpoint === "listPublicRouteCandidates" || endpoint === "listPublicTeamMembers" || endpoint === "listPublicProducts" || endpoint === "getPublicBookingServices" || endpoint === "getPublicWeeklySlotAvailability" || endpoint === "getPublicFormById";
39347
39141
  }
39348
39142
  function buildBatchLoaderRequest(id, endpoint, params) {
39349
39143
  switch (endpoint) {
@@ -39369,7 +39163,7 @@ function buildBatchLoaderRequest(id, endpoint, params) {
39369
39163
  endpoint
39370
39164
  };
39371
39165
  }
39372
- case "listPublicCourses": {
39166
+ case "listPublicWholeSeriesOfferings": {
39373
39167
  const typedParams = params;
39374
39168
  return typedParams ? {
39375
39169
  id,
@@ -39475,7 +39269,7 @@ function toBatchParams(endpoint, params) {
39475
39269
  });
39476
39270
  return Object.keys(p).length ? p : void 0;
39477
39271
  }
39478
- if (endpoint === "listPublicCourses") {
39272
+ if (endpoint === "listPublicWholeSeriesOfferings") {
39479
39273
  const p = stripUndefined({ limit: params.limit || void 0 });
39480
39274
  return Object.keys(p).length ? p : void 0;
39481
39275
  }