@riverbankcms/sdk 0.123.0 → 0.124.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 (259) hide show
  1. package/README.md +14 -9
  2. package/dist/{PreviewEditorSidebar-DvJFmC29.mjs → PreviewEditorSidebar-DBmAJJkQ.mjs} +22 -39
  3. package/dist/{PreviewEditorUI-DVHP4bCo.mjs → PreviewEditorUI-CfGaz9cY.mjs} +3 -3
  4. package/dist/{PreviewQueryProvider-07EE4uWL.mjs → PreviewQueryProvider-BH-3-jSj.mjs} +1 -1
  5. package/dist/{SdkPreviewModeRuntime-BE5eFayo.mjs → SdkPreviewModeRuntime-BW9Z8j8T.mjs} +1020 -1234
  6. package/dist/{SiteChromeCustomizeContext-4hn4A0HX.mjs → SiteChromeCustomizeContext-2z8moxYf.mjs} +1900 -1959
  7. package/dist/_dts/ai/src/contracts/proposals.d.ts +1236 -4152
  8. package/dist/_dts/api/src/appointmentEndpointDefinitions.d.ts +435 -0
  9. package/dist/_dts/api/src/bookingClosures.d.ts +3 -3
  10. package/dist/_dts/api/src/bookingConfig.d.ts +72 -73
  11. package/dist/_dts/api/src/bookingManagementEndpoints.d.ts +26 -35
  12. package/dist/_dts/api/src/bookingRecords.d.ts +4 -15
  13. package/dist/_dts/api/src/bookingVerticalCatalog.d.ts +746 -0
  14. package/dist/_dts/api/src/bookingVerticalPreset.d.ts +38 -0
  15. package/dist/_dts/api/src/bookingVerticals.d.ts +11 -652
  16. package/dist/_dts/api/src/bookings.d.ts +11 -9
  17. package/dist/_dts/api/src/cache-tags.d.ts +2 -2
  18. package/dist/_dts/api/src/commercePortalEndpoints.d.ts +10 -10
  19. package/dist/_dts/api/src/common/envelope.d.ts +2 -0
  20. package/dist/_dts/api/src/contentRuntime.d.ts +0 -17
  21. package/dist/_dts/api/src/courseEndpointDefinitions.d.ts +99 -0
  22. package/dist/_dts/api/src/courses.d.ts +22 -33
  23. package/dist/_dts/api/src/defineEndpointDefinitions.d.ts +14 -0
  24. package/dist/_dts/api/src/demoMutationPolicies.d.ts +4 -0
  25. package/dist/_dts/api/src/endpoints.d.ts +3740 -3733
  26. package/dist/_dts/api/src/event-destination-policy.d.ts +1 -1
  27. package/dist/_dts/api/src/event-presentation.d.ts +4 -9
  28. package/dist/_dts/api/src/index.d.ts +9 -11
  29. package/dist/_dts/api/src/newsletterEndpointDefinitions.d.ts +376 -0
  30. package/dist/_dts/api/src/participantMessaging.d.ts +2 -2
  31. package/dist/_dts/api/src/public/endpoints.d.ts +1 -1
  32. package/dist/_dts/api/src/publicExperience/commerceEndpoints.d.ts +272 -0
  33. package/dist/_dts/api/src/publicExperience/eventEndpoints.d.ts +274 -0
  34. package/dist/_dts/api/src/publicExperience/newsletterEndpoints.d.ts +31 -0
  35. package/dist/_dts/api/src/publicExperience/sharedTypes.d.ts +152 -0
  36. package/dist/_dts/api/src/publicExperience/siteEndpoints.d.ts +95 -0
  37. package/dist/_dts/api/src/publicExperience/wholeSeriesEndpoints.d.ts +154 -0
  38. package/dist/_dts/api/src/publicExperienceEndpoints.d.ts +10 -962
  39. package/dist/_dts/api/src/publicWholeSeriesEndpointDefinitions.d.ts +52 -0
  40. package/dist/_dts/api/src/sdkContracts.d.ts +0 -51
  41. package/dist/_dts/api/src/sdkEntryReadEndpoints.d.ts +23 -0
  42. package/dist/_dts/api/src/sitePlatformEndpoints.d.ts +1 -38
  43. package/dist/_dts/api/src/siteRuntimeEndpoints.d.ts +3 -4
  44. package/dist/_dts/blocks/src/PageRenderer.d.ts +4 -15
  45. package/dist/_dts/blocks/src/contracts/index.d.ts +1 -1
  46. package/dist/_dts/blocks/src/contracts/non-block-islands.d.ts +0 -16
  47. package/dist/_dts/blocks/src/contracts/proof-block-islands.d.ts +6 -222
  48. package/dist/_dts/blocks/src/portal/types.d.ts +3 -3
  49. package/dist/_dts/blocks/src/subroutes/fold.d.ts +1 -14
  50. package/dist/_dts/blocks/src/subroutes/index.d.ts +1 -1
  51. package/dist/_dts/blocks/src/subroutes/kinds.d.ts +3 -3
  52. package/dist/_dts/blocks/src/system/blocks/course-details.d.ts +0 -11
  53. package/dist/_dts/blocks/src/system/blocks/course-registration.d.ts +3 -4
  54. package/dist/_dts/blocks/src/system/blocks/courses/shared/pricing.d.ts +1 -1
  55. package/dist/_dts/blocks/src/system/blocks/courses/shared/schemas.d.ts +401 -12
  56. package/dist/_dts/blocks/src/system/blocks/courses/shared/types.d.ts +9 -10
  57. package/dist/_dts/blocks/src/system/blocks/events/event-calendar.d.ts +14 -13
  58. package/dist/_dts/blocks/src/system/blocks/events/event-listing.d.ts +1 -2
  59. package/dist/_dts/blocks/src/system/blocks/events/shared/filtering.d.ts +1 -4
  60. package/dist/_dts/blocks/src/system/blocks/events/shared/schemas.d.ts +19 -18
  61. package/dist/_dts/blocks/src/system/blocks/events/shared/types.d.ts +9 -11
  62. package/dist/_dts/blocks/src/system/blocks/offerings-preview/model.d.ts +2 -2
  63. package/dist/_dts/blocks/src/system/data/loaderEndpoints.d.ts +1 -1
  64. package/dist/_dts/blocks/src/system/runtime/api/client.d.ts +10 -10
  65. package/dist/_dts/blocks/src/system/runtime/api/endpoints.d.ts +10 -10
  66. package/dist/_dts/blocks/src/system/runtime/api/index.d.ts +1 -1
  67. package/dist/_dts/blocks/src/system/runtime/api/types/appointments.d.ts +162 -0
  68. package/dist/_dts/blocks/src/system/runtime/api/types/core.d.ts +59 -0
  69. package/dist/_dts/blocks/src/system/runtime/api/types/courses.d.ts +134 -0
  70. package/dist/_dts/blocks/src/system/runtime/api/types/discounts.d.ts +85 -0
  71. package/dist/_dts/blocks/src/system/runtime/api/types/events.d.ts +241 -0
  72. package/dist/_dts/blocks/src/system/runtime/api/types/forms.d.ts +53 -0
  73. package/dist/_dts/blocks/src/system/runtime/api/types/newsletter.d.ts +32 -0
  74. package/dist/_dts/blocks/src/system/runtime/api/types/portal.d.ts +220 -0
  75. package/dist/_dts/blocks/src/system/runtime/api/types/shop.d.ts +176 -0
  76. package/dist/_dts/blocks/src/system/runtime/api/types.d.ts +12 -1121
  77. package/dist/_dts/blocks/src/system/runtime/components/registry.client.d.ts +19 -583
  78. package/dist/_dts/blocks/src/system/runtime/components/runtime-backed-blocks.d.ts +9 -276
  79. package/dist/_dts/blocks/src/system/runtime/hooks/useEventFilters.d.ts +1 -12
  80. package/dist/_dts/blocks/src/system/runtime/hooks/useHeadlessEventRegistrationFlow.d.ts +0 -1
  81. package/dist/_dts/blocks/src/system/runtime/hooks/useHeadlessWholeSeriesRegistrationFlow.d.ts +0 -1
  82. package/dist/_dts/blocks/src/system/runtime/nodes/booking-runtime-sources.d.ts +2 -3
  83. package/dist/_dts/blocks/src/system/runtime/nodes/course-details/logic.d.ts +1 -18
  84. package/dist/_dts/blocks/src/system/runtime/nodes/course-details/runs.d.ts +0 -2
  85. package/dist/_dts/blocks/src/system/runtime/nodes/course-details.server.d.ts +1 -5
  86. package/dist/_dts/blocks/src/system/runtime/nodes/course-registration/courseRegistrationViewState.d.ts +21 -0
  87. package/dist/_dts/blocks/src/system/runtime/nodes/course-registration/index.d.ts +1 -1
  88. package/dist/_dts/blocks/src/system/runtime/nodes/course-registration/pricing.d.ts +14 -0
  89. package/dist/_dts/blocks/src/system/runtime/nodes/course-registration/types.d.ts +0 -25
  90. package/dist/_dts/blocks/src/system/runtime/nodes/course-registration/useCourseEligibility.d.ts +24 -0
  91. package/dist/_dts/blocks/src/system/runtime/nodes/course-registration/useCoursePaymentVerification.d.ts +9 -0
  92. package/dist/_dts/blocks/src/system/runtime/nodes/course-registration/useCourseRegistrationActions.d.ts +35 -0
  93. package/dist/_dts/blocks/src/system/runtime/nodes/course-registration/useCourseRegistrationPortal.d.ts +7 -0
  94. package/dist/_dts/blocks/src/system/runtime/nodes/course-registration/useCourseRegistrationSelection.d.ts +31 -0
  95. package/dist/_dts/blocks/src/system/runtime/nodes/course-registration/useCourseRegistrationWizard.d.ts +80 -55
  96. package/dist/_dts/blocks/src/system/runtime/nodes/course-registration/useCourseWaitlistSelection.d.ts +14 -0
  97. package/dist/_dts/blocks/src/system/runtime/nodes/course-registration/whole-series-registration.headless.contract.d.ts +4 -5
  98. package/dist/_dts/blocks/src/system/runtime/nodes/course-registration.interactive.d.ts +0 -38
  99. package/dist/_dts/blocks/src/system/runtime/nodes/course-registration.server.d.ts +1 -1
  100. package/dist/_dts/blocks/src/system/runtime/nodes/event-details.client.d.ts +1 -2
  101. package/dist/_dts/blocks/src/system/runtime/nodes/event-details.server.d.ts +0 -1
  102. package/dist/_dts/blocks/src/system/runtime/nodes/event-registration/EventRegistrationWizardActions.d.ts +12 -0
  103. package/dist/_dts/blocks/src/system/runtime/nodes/event-registration/event-registration.headless.contract.d.ts +0 -4
  104. package/dist/_dts/blocks/src/system/runtime/nodes/event-registration/eventScope.d.ts +0 -9
  105. package/dist/_dts/blocks/src/system/runtime/nodes/event-registration/types.d.ts +0 -5
  106. package/dist/_dts/blocks/src/system/runtime/nodes/event-registration/useEventRegistrationWizard.d.ts +0 -11
  107. package/dist/_dts/blocks/src/system/runtime/nodes/event-registration/utils.d.ts +13 -0
  108. package/dist/_dts/blocks/src/system/runtime/nodes/event-registration.interactive.d.ts +0 -21
  109. package/dist/_dts/blocks/src/system/runtime/nodes/event-registration.server.d.ts +1 -1
  110. package/dist/_dts/blocks/src/system/runtime/nodes/events/EventCalendar.interactive.d.ts +24 -433
  111. package/dist/_dts/blocks/src/system/runtime/nodes/events/EventCombined.client.d.ts +1 -2
  112. package/dist/_dts/blocks/src/system/runtime/nodes/events/EventCombined.interactive.d.ts +52 -266
  113. package/dist/_dts/blocks/src/system/runtime/nodes/events/EventListing.interactive.d.ts +5 -15
  114. package/dist/_dts/blocks/src/system/runtime/nodes/events/shared/EventFilters.d.ts +0 -8
  115. package/dist/_dts/blocks/src/system/runtime/nodes/events/shared/eventCollectionContract.d.ts +1573 -0
  116. package/dist/_dts/blocks/src/system/runtime/nodes/events/shared/listOptions.d.ts +1 -3
  117. package/dist/_dts/content-editor/src/ui/editorSnapshot.d.ts +2 -3
  118. package/dist/_dts/content-editor/src/ui/editorUiStore.d.ts +2 -2
  119. package/dist/_dts/content-model/src/content-types/builtin-schemas.d.ts +0 -5
  120. package/dist/_dts/content-model/src/content-types/builtins.d.ts +0 -5
  121. package/dist/_dts/content-model/src/templates/defaults.d.ts +6 -3
  122. package/dist/_dts/core/src/editor-state.d.ts +1 -13
  123. package/dist/_dts/db/src/generated/supabase/database.types.d.ts +1580 -120
  124. package/dist/_dts/preview-next/src/client/preview/siteChromeBrandPreferences.d.ts +6 -6
  125. package/dist/_dts/preview-next/src/client/preview/siteChromeSavePlan.d.ts +6 -1
  126. package/dist/_dts/preview-next/src/client/preview/siteStylePreviewPlanner.d.ts +27 -4
  127. package/dist/_dts/sdk/src/cli/commands/audit.d.ts +1 -2
  128. package/dist/_dts/sdk/src/cli/commands/pull-dated-offering-scope.d.ts +1 -1
  129. package/dist/_dts/sdk/src/cli/commands/pull-dry-run.d.ts +4 -6
  130. package/dist/_dts/sdk/src/cli/commands/push/consts.d.ts +1 -1
  131. package/dist/_dts/sdk/src/cli/commands/push/options.d.ts +1 -1
  132. package/dist/_dts/sdk/src/cli/commands/push/pushAllExtras.d.ts +0 -1
  133. package/dist/_dts/sdk/src/cli/commands/push/verification.d.ts +1 -1
  134. package/dist/_dts/sdk/src/cli/content/collectionWriters.d.ts +23 -0
  135. package/dist/_dts/sdk/src/cli/content/metadataAfterPush.d.ts +25 -0
  136. package/dist/_dts/sdk/src/cli/content/reader.d.ts +0 -52
  137. package/dist/_dts/sdk/src/cli/content/writer.d.ts +3 -81
  138. package/dist/_dts/sdk/src/cli/site-commands/datedOfferingCommands.d.ts +6 -9
  139. package/dist/_dts/sdk/src/client/contentReadOperations.d.ts +40 -0
  140. package/dist/_dts/sdk/src/client/management/index.d.ts +1 -3
  141. package/dist/_dts/sdk/src/client/management/types.d.ts +3 -91
  142. package/dist/_dts/sdk/src/client/runtimeCacheKeys.d.ts +72 -0
  143. package/dist/_dts/sdk/src/client/runtimeCachePolicy.d.ts +10 -75
  144. package/dist/_dts/sdk/src/client/types.d.ts +7 -33
  145. package/dist/_dts/sdk/src/components.d.ts +1 -1
  146. package/dist/_dts/sdk/src/config/types.d.ts +1 -1
  147. package/dist/_dts/sdk/src/config/validation.d.ts +3 -6
  148. package/dist/_dts/sdk/src/contracts/index.d.ts +1 -1
  149. package/dist/_dts/sdk/src/contracts/page.d.ts +0 -8
  150. package/dist/_dts/sdk/src/contracts/system-block-content.d.ts +1 -34
  151. package/dist/_dts/sdk/src/data/prefetchBlockData.d.ts +4 -3
  152. package/dist/_dts/sdk/src/next/catch-all-utils.d.ts +0 -11
  153. package/dist/_dts/sdk/src/next/catch-all.d.ts +1 -76
  154. package/dist/_dts/sdk/src/next/types.d.ts +0 -19
  155. package/dist/_dts/sdk/src/public-api/contracts.d.ts +7 -207
  156. package/dist/_dts/sdk/src/public-api/runtime.d.ts +1 -1
  157. package/dist/_dts/sdk/src/rendering/blocks-page-renderer.d.ts +2 -1
  158. package/dist/_dts/sdk/src/rendering/components/pageShared.d.ts +2 -2
  159. package/dist/_dts/sdk/src/rendering/helpers/loadContent.d.ts +0 -7
  160. package/dist/_dts/sdk/src/rendering/helpers/templateContent.d.ts +81 -0
  161. package/dist/_dts/sdk/src/rendering/index.d.ts +1 -1
  162. package/dist/_dts/sdk/src/rendering/islands/types.d.ts +1 -51
  163. package/dist/_dts/sdk/src/rendering/overrides.d.ts +2 -1
  164. package/dist/_dts/sdk/src/routing/entrySubroutes.d.ts +6 -6
  165. package/dist/_dts/sdk/src/routing/index.d.ts +0 -2
  166. package/dist/_dts/sdk/src/routing/resolveOccurrence.d.ts +3 -3
  167. package/dist/_dts/sdk/src/routing/resolvePageContent.d.ts +10 -39
  168. package/dist/_dts/sdk/src/types/block-kinds.d.ts +1 -1
  169. package/dist/_dts/sdk/src/version.d.ts +1 -1
  170. package/dist/_dts/site-commands/src/adapter.d.ts +1 -1
  171. package/dist/_dts/site-commands/src/appointmentCommandSchemas.d.ts +100 -0
  172. package/dist/_dts/site-commands/src/capabilityGaps.d.ts +2 -2
  173. package/dist/_dts/site-commands/src/commandContract.d.ts +1242 -0
  174. package/dist/_dts/site-commands/src/commandDomain.d.ts +20 -0
  175. package/dist/_dts/site-commands/src/commandIdentifiers.d.ts +7 -0
  176. package/dist/_dts/site-commands/src/commandValidation.d.ts +10 -0
  177. package/dist/_dts/site-commands/src/commands.d.ts +729 -2659
  178. package/dist/_dts/site-commands/src/domain.d.ts +1 -1
  179. package/dist/_dts/site-commands/src/eventCommandContent.d.ts +11 -0
  180. package/dist/_dts/site-commands/src/exposure.d.ts +1 -1
  181. package/dist/_dts/site-commands/src/index.d.ts +6 -0
  182. package/dist/_dts/site-commands/src/metadata.d.ts +1 -27
  183. package/dist/_dts/site-commands/src/planner.d.ts +1 -1
  184. package/dist/_dts/site-commands/src/refContributions.d.ts +1 -1
  185. package/dist/_dts/site-commands/src/refs.d.ts +1 -4
  186. package/dist/_dts/site-commands/src/siteStyleCommandSchema.d.ts +378 -0
  187. package/dist/_dts/site-commands/src/siteStyleSelectionSchemaBuilder.d.ts +46 -0
  188. package/dist/_dts/site-commands/src/staticExecutionGaps.d.ts +2 -2
  189. package/dist/_dts/site-commands/src/venueCommandMapping.d.ts +21 -0
  190. package/dist/_dts/theme-core/src/site-styles/compilationPlan.d.ts +58 -0
  191. package/dist/_dts/theme-core/src/site-styles/headerLooks.d.ts +1 -0
  192. package/dist/_dts/theme-core/src/site-styles/index.d.ts +1 -0
  193. package/dist/_dts/theme-core/src/site-styles/previewCompiler.d.ts +47 -24
  194. package/dist/cli/index.mjs +7250 -8478
  195. package/dist/cli/init-docs/content/cli-reference.md +5 -21
  196. package/dist/cli/init-docs/content/content-management.md +4 -5
  197. package/dist/client/{DiscountCodeDisclosure-DIWj-P9v.mjs → DiscountCodeDisclosure-DxvjKvck.mjs} +2 -2
  198. package/dist/client/{EventCombined.client-De8YWBSr.mjs → EventCombined.client-BydMGc4c.mjs} +5 -16
  199. package/dist/client/{EventListing.client-seHTjimY.mjs → EventListing.client-vpzhhysN.mjs} +3 -10
  200. package/dist/client/{LeafletStaticMap-BmQxFcJW.mjs → LeafletStaticMap-CB07rpf8.mjs} +1 -1
  201. package/dist/client/{MagicLinkForm-OoJAIUIj.mjs → MagicLinkForm-BzyRJ8VF.mjs} +2 -2
  202. package/dist/client/{StepIndicator-CiZ8kdPk.mjs → StepIndicator-CTcGf8Be.mjs} +2 -2
  203. package/dist/client/{accordion-6lnN__XJ.mjs → accordion-B-DUDLRD.mjs} +1 -1
  204. package/dist/client/{bookingForm-5uyqhONU.mjs → bookingForm-DSbClLcZ.mjs} +6 -6
  205. package/dist/client/bookings.mjs +753 -818
  206. package/dist/client/{carousel-Dtnifil_.mjs → carousel-B6Ccdx8M.mjs} +1 -1
  207. package/dist/client/{cart-5Tc5S7NV.mjs → cart-BZh8G8wM.mjs} +3 -3
  208. package/dist/client/{checkout-CYKKN5Hr.mjs → checkout-o6zaC-kM.mjs} +3 -3
  209. package/dist/client/client.mjs +6859 -7149
  210. package/dist/client/{context-BGZNlGXB.mjs → context-CJz1Vlsz.mjs} +40 -43
  211. package/dist/client/{courseRegistration-CxCBybB4.mjs → courseRegistration-Cf11pNDs.mjs} +606 -621
  212. package/dist/client/{eventCalendar-Xj2jZS9X.mjs → eventCalendar-BeXrdsSE.mjs} +5 -13
  213. package/dist/client/{eventCombined-CgcMoOgM.mjs → eventCombined-DA76PZgG.mjs} +3 -3
  214. package/dist/client/{eventDetails-CEAH8Edc.mjs → eventDetails-BLxg0rok.mjs} +140 -116
  215. package/dist/client/{eventListing-qyPVQ0wP.mjs → eventListing-tO9LheBX.mjs} +3 -3
  216. package/dist/client/{eventRegistration-DDu79CtL.mjs → eventRegistration-Cnene9D9.mjs} +165 -68
  217. package/dist/client/{form-Bc7JKI7I.mjs → form-DZf72CHB.mjs} +2 -2
  218. package/dist/client/{headerSection-vTku_LEl.mjs → headerSection-Hioja5Cr.mjs} +2 -2
  219. package/dist/client/hooks.mjs +3452 -2365
  220. package/dist/client/{locationMap-Bg7X4Jna.mjs → locationMap-DwhUXEix.mjs} +2 -2
  221. package/dist/client/{newsletterForm-lpylVdp5.mjs → newsletterForm-C350bEQf.mjs} +2 -2
  222. package/dist/client/{pricing-DE8fjJiT.mjs → pricing-BYWN_ATa.mjs} +3 -19
  223. package/dist/client/{productDetail-D7Bo2RMH.mjs → productDetail-CCqCyXgU.mjs} +3 -3
  224. package/dist/client/{productList-VjnZqiqN.mjs → productList-BAiNJrOU.mjs} +3 -3
  225. package/dist/client/{propsDecoder-DreFXjNP.mjs → propsDecoder-DeunRj6m.mjs} +210 -378
  226. package/dist/client/rendering/client.mjs +2541 -2813
  227. package/dist/client/rendering/islands.mjs +18 -18
  228. package/dist/client/rendering.mjs +5622 -4734
  229. package/dist/client/{shop-IRsHHbf7.mjs → shop-DUmCdBtw.mjs} +6 -6
  230. package/dist/client/{shop-commerce-gnI8PieZ.mjs → shop-commerce-CY27mEUr.mjs} +5 -5
  231. package/dist/client/{shop-commerce-store-BTbrhObn.mjs → shop-commerce-store-ChXPbWfa.mjs} +1 -1
  232. package/dist/client/{shopShared-D6KS2_qk.mjs → shopShared-q0kin1cv.mjs} +3 -3
  233. package/dist/client/{useDiscountCodeUi-DCccGCxV.mjs → useDiscountCodeUi-I-92-x2V.mjs} +2 -2
  234. package/dist/client/{useEventFilters-eGs3rPZQ.mjs → useEventFilters-DlcVluZh.mjs} +59 -124
  235. package/dist/client/{usePolling-CvSU2sur.mjs → usePolling-Bz7GFV_a.mjs} +2 -2
  236. package/dist/preview-next/before-render.mjs +1115 -1044
  237. package/dist/preview-next/client/runtime.mjs +4 -4
  238. package/dist/preview-next/middleware.mjs +1118 -1047
  239. package/dist/{previewAuthStore-ShY26RNz.mjs → previewAuthStore-CJX21dGi.mjs} +1121 -1047
  240. package/dist/{sdk-runtime-CJxkFq2B.mjs → sdk-runtime-OnPM8Z69.mjs} +2 -2
  241. package/dist/{separator-CoFmo8uA.mjs → separator-CPtfzHqA.mjs} +1 -1
  242. package/dist/server/components.mjs +4560 -3672
  243. package/dist/server/config-validation.mjs +3454 -2356
  244. package/dist/server/config.mjs +3454 -2356
  245. package/dist/server/data.mjs +3452 -2367
  246. package/dist/server/index.mjs +1501 -1491
  247. package/dist/server/next.mjs +7524 -8067
  248. package/dist/server/page-converter.mjs +1898 -2040
  249. package/dist/server/prebuild.mjs +1 -1
  250. package/dist/server/rendering/server.mjs +4258 -3373
  251. package/dist/server/rendering.mjs +6228 -5393
  252. package/dist/server/routing.mjs +3614 -2509
  253. package/dist/server/server.mjs +3298 -3479
  254. package/package.json +1 -1
  255. package/dist/_dts/api/src/previewContentContract.d.ts +0 -4
  256. package/dist/_dts/sdk/src/cli/commands/course.d.ts +0 -6
  257. package/dist/_dts/sdk/src/cli/commands/push/scopes/courses.d.ts +0 -4
  258. package/dist/_dts/sdk/src/client/management/courses.d.ts +0 -10
  259. 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 getLocalDateKey, $c as toScheduledBookingDateTime, $n as layoutTransforms, $o as renderAudio, $r as parseStoredCommerceCartState, $t as redoHistory, Aa as el, Ac as createCollection, Ai as componentRuntimeRulesForTheme, An as DEFAULT_LAUNCH_READINESS_INPUT, Ao as isInlineTextEmpty, Ar as giftingBlockDefinition, As as mergeStyles, At as MediaField, Ba as formatEventCompactDateRail, Bc as parseFooterModuleId, Bi as parseGradientPresetId, Bl as GripVertical, Bn as escapeStyleContent, Bo as ClockIcon$1, Br as buildProductDetailInteractiveIslandProps, Bs as unmapValueFromSelect, C as usePreviewThemeOverlay, Ca as eventCollectionHydrationSchema, Ci as resolveBackgroundColorValue, Cl as Ticket, Cn as MediaEditorContextProvider, Co as parseGeneratedIconSetId, Cr as findPreSelectedEvent, Cs as pageDesignEditorBackgroundOverrideOwner, Ct as InlineTextField, Da as normalizeCsvIds, Di as retargetCompiledBoundaryRuntimeForContentAdjacency, Dn as getPageDesignEditorState, Do as logger, Dr as WIZARD_STEPS$1, Ds as normalizeBoxStylesCardVariant, Dt as ButtonVariantField, Ea as getEventRuntimeFiltersKey, Ei as compileEditorModelRuntime, El as Sparkles, En as applyPageDesignEditorAction, Eo as isRecord$20, Er as resolveRegistrationTarget, Es as ICON_CONFIG, Et as EntryPickerWidgetProvider, Fa as eventCalendarListLayoutOptions, Fc as Button, Fn as containerResponsiveThemeCss, Fo as ArrowDownIcon, Fr as resolveEventRegistrationScopedEvents, Fs as SdkConfigProvider, Ft as RichTextWidgetProvider, Ga as formatTime$3, Gc as formatBookingDateTime, Gl as CircleMinus, Gn as siteFooterManifest, Go as FileTextIcon, Gr as buildProductCardDisplay, Ha as formatEventPrice, Hc as unsafeAsEditorBlockValues, Hi as sectionTransitionFamilies, Hn as generateDefaultAccordionSystem, Ho as FileArchiveIcon, Hr as buildShopInteractiveIslandProps, Hs as useField, Ht as prepareBlockEditorManifest, Ia as buildGoogleMapsDirectionsUrl, Ii as gradientToCss, Il as Minus, In as createCustomBlockRegistry, Io as ArrowRightIcon, Ir as checkoutBlockDefinition, Is as useSdkConfig, It as EditorProvider, Ja as groupEventsByDate, Jc as formatLocalScheduleDate, Ji as backgroundAppearanceColorTokenNames, Jl as ChevronDown, Jn as SITE_OVERLAY_HEADER_CLEARANCE_CSS_VAR, Jo as ImagePresets, Jr as formatInterval, Js as SelectItem, Jt as useOptionalEditorUiStoreInstance, Ka as getCardOrientation, Kc as formatBookingInstant, Kl as ChevronRight, Kn as siteHeaderManifest, Ko as MinusIcon, Kr as buildProductDetailDisplay, Ks as Select, Kt as useEditorUiStore, La as normalizeLocationMapProps, Lc as useComposedRefs, Li as GRADIENT_PRESETS, Ln as buildThemeRuntime, Lo as ChevronDownIcon, Lr as cartBlockDefinition, Ls as hasEmptyOption, Lt as useEditor, Ma as bindingSchema, Mc as createContextScope, Mi as designRuntimeRulesForTheme, Mn as AMBIENT_BACKGROUND_ROLES, Mo as canonicalizePersistedBlockButtonRole, Mr as courseRegistrationBlockDefinition, Ms as textColorStyle, Mt as ReferenceWidgetProvider, Na as previewStageSchema, Nc as composeEventHandlers, Nn as isSupportedLoaderEndpoint, No as isBlockButtonRole, Nr as buildCourseRegistrationInteractiveIslandProps, Ns as getFieldIntent, Nt as useRichTextImagePicker, Oa as normalizeCsvString, Oc as useId$1, Oi as retargetCompiledRuntimeFieldsForContentAdjacency, Oo as coerceInlineTextWithFallback, Or as getStepNumber$1, Os as normalizeCardVariantRole, Ot as ButtonWidgetProvider, Pa as eventCalendarListLayoutCompatibleDisplayModeValues, Pc as Primitive, Pi as surfaceResolutionContextFromTheme, Pn as ThemeScope, Po as getIconComponent, Pr as normalizeEventRegistrationPageSurfaceSubject, Ps as isHeaderField, Pt as RichTextField, Qa as getEventAvailabilityStatus, Qc as toBookingTimeZone, Qi as defaultThemeTokens, Qn as mediaTransforms, Qo as getCurrentResolveImageUrlContext, Qr as deriveCommerceCheckoutState, Qt as pushHistoryEntry, Ra as toLocationMapHydrationProps, Rc as cn, Ri as GRADIENT_PRESET_IDS, Rn as DEFAULT_THEME_RESPONSIVE_MODE, Ro as CircleMinusIcon, Rr as buildCartInteractiveIslandProps, Rs as mapCurrentValueForSelect, Rt as LinkField, S as PreviewThemeOverlayProvider, Sa as eventCollectionDisplaySchemaShape, Si as resolveSurfaceForegroundStyles, Sn as MediaEditor, So as parseGeneratedIconAssetId, Sr as findEventByOccurrenceId, Ss as isThemeV2NormalEditorRawStyleFieldName, St as OfferingsPreviewWidgetProvider, Ta as buildEventRuntimeFilters, Ti as applyCompiledRuntimeFieldsToContent, Tl as Star, Tn as useApiMediaUploader, To as isObjectRecord, Tr as resolveEventRequiresPayment, Ts as assertNever$6, Tt as EntryPickerField, Ua as formatEventPriceDisplay, Uc as addLocalScheduleDays, Ui as sectionTransitionFamilyForBoundaryOptionId, Ul as CreditCard, Un as getBlockDefinition, Uo as FileAudioIcon, Ur as getShopDisplayForItems, Ut as stripTopLevelRoutingUi, Va as formatEventDateParts, Vc as unsafeAsEditorBlockId, Vi as defaultSectionTransitionVariantForFamily, Vn as mergeContentWithBlockStyleOverrides, Vo as DownloadIcon, Vr as buildProductListInteractiveIslandProps, Vs as FieldFrame, Vt as hideThemeV2RawStyleFields, Wa as formatEventTeacherLine, Wc as formatBookingDate, Wi as sectionTransitionVariantForBoundaryOptionId, Wl as CirclePlus, Wn as projectRecurringSchedule, Wo as FileSpreadsheetIcon, Wr as buildCartDisplay, Wt as getBlockManifestFromSdkConfig, Xa as resolveEventLinkProps, Xc as parseBookingLocalDate, Xi as foregroundTokenForBackgroundAppearanceColorToken, Xl as ArrowDown, Xn as visibleHeaderClearancePx, Xo as buildResolveImageUrlContext, Xr as buildPassCartItem, Xs as SelectValue, Xt as canUndoHistory, Ya as resolveEventCta, Yc as getBookingLocalDateKey, Yi as backgroundAppearanceQuickColorTokenNames, Yn as planSiteOverlayHeaderClearance, Yo as MediaPlaceholder, Yr as EMPTY_COMMERCE_CART_STATE, Ys as SelectTrigger, Yt as canRedoHistory, Za as getEventAvailability, Zc as resolveBookingTimeZoneId, Zi as parseBackgroundAppearanceColorToken, Zl as __exportAll, Zn as contentTransforms, Zo as computeMediaTransformStyle, Zr as buildProductCartItem, Zt as createHistoryState, _a as isSemanticSpacing, _c as Content, _i as bodyCopyFragment, _l as err$2, _n as createManifestFormAdapter, _o as resolveFeatureCardGeneratedIconSizePx, _r as formBlockDefinition, _s as parseThemeForPersistence, _t as createSiteOptionApiLoader, aa as createTransformRegistry, ac as TabsContent, ai as faqAccordionFragment, 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 buildEventCollectionHydration, bc as createCollapsibleScope, bi as getAnchorClasses, bl as Upload, bn as evaluateVisibility, bo as parseBlockIconValue, br as buildEventRegistrationInteractiveIslandProps, bs as resolveOnColorForThemeToken, bt as SiteOptionWidgetProvider, cc as Dialog, ci as singleButtonFragment, cl as assertNever$5, co as defineProgressiveBlockRuntime, cr as productDetailBlockDefinition, cs as siblingPath, ct as PreviewRichTextEditor, da as OFFERINGS_PREVIEW_EVENT_PRESET_DEFINITIONS, dc as DialogFooter, di as testimonialsCarouselFragment, dl as parseSiteId, do as markEditableSurfaceForwarding, dr as eventListingBlockDefinition, ei as productItemKey, el as parseEventPageSurfaceSubject, en as undoHistory, eo as getLocalMinuteOfDay, er as uiTransforms, es as renderVideo, et as confirmAutosaveBatch, f as PREVIEW_DESIGN_SAVE_ERROR_MESSAGE, fa as buildOfferingsPreviewRenderStates, fc as DialogHeader, fi as testimonialsHeadingFragment, fl as unsafeAsAppointmentResourceId, fo as splitPositioningClasses, fr as buildEventListingInteractiveIslandProps, ft as useUISelector, ga as resolveOfferingsPreviewGroups, gi as heroCopyFragment, gl as unsafeAsPassId, go as FEATURE_CARD_ICON_TREATMENTS, gr as buildEventCalendarListingRender, gs as themeButtonClassName, gt as useEntryEditorController, ha as resolveOfferingsPreviewGroupCta, hi as ctaRowFragment, hl as unsafeAsFormId, hn as validateBlockManifestIssues, ho as mediaSchema, hr as buildEventCalendarListingDisplay, hs as parseThemeButtonVariantId, i as usePreviewDesignHistoryOrder, ic as Tabs, ii as cardFragment, il as publicEventPricingType, in as useDebouncedLatestSave, io as createInteractiveIslandCodec, ir as useImageResolveContextOptional, is as setContextResolveImageUrlContext, it as rejectAutosaveBatch, ja as when, jc as useControllableState, jl as Plus, jn as deriveLaunchReadiness, jo as parseInlineTextFromUnknown, jr as buildGiftingInteractiveIslandProps, js as rgbColorValue, jt as ReferenceField, ka as normalizeOptionalId, kc as useDirection, ki as planPageDesignLayoutLookCompatibility, kl as RotateCcw, kn as decodePublicProductCategorySelectorQuery, ko as inlineTextToPlainText, kr as getWizardStepsForContext$1, ks as backgroundColorStyle, kt as FileField, lc as DialogContent, li as formEmbedFragment, ll as expectParsedBrandedId, ln as parseReferenceKind, lr as newsletterSignupBlockDefinition, lt as PreviewInlineTextEditor, ma as resolveOfferingsPreviewCoursePath, mi as heroCtaRowFragment, 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 richTextFragment, nl as publicEventPricingCurrency, nn as recordsEqual, no as blockBookingPaymentTermsSchema, nr as createManifestValidator, ns as resolveMediaNodeResponsiveImage, nt as enqueueTransaction, oa as runTransforms, oc as TabsList, oi as faqHeadingFragment, ol as publicEventTicketTypes, on as createSnapshotFromPageRecord, oo as createZodCodec, or as shopBlockDefinition, os as attachRenderableMediaAssetFields, ot as resolvePreviewSidebarTab, p as reportPreviewDesignError, pa as normalizeOfferingsPreviewItemLimit, pc as DialogTitle, pi as ctaCopyFragment, pl as unsafeAsAppointmentServiceId, pn as PaletteProvider, po as planSiteChromePlacement, pr as eventCalendarBlockDefinition, pt as EditableBlockProvider, qa as getContainerClass, qc as formatBookingTime, qi as BACKGROUND_BODY_TEXT_MIN_CONTRAST_RATIO, ql as ChevronLeft, qn as SITE_CHROME_VISIBLE_HEADER_SELECTOR, qo as PlusIcon, qr as formatCommercePrice, qs as SelectContent, qt as useEditorUiStoreInstance, r as PreviewDesignHistoryOrderProvider, ri as headingFragment, rl as publicEventPricingMode, ro as buildInteractiveIslandProps, rr as ImageResolveContextProvider, rs as resolveMediaStorageUrl, rt as idleEditorTransactionQueueState, sa as ctaButton, sc as TabsTrigger, si as blogFeaturedPostFragment, sl as formatCurrencyAmount, sn as BUILT_IN_REFERENCE_KINDS, so as defineClientOwnedBlockRuntime, sr as productListBlockDefinition, ss as getAtPath, t as SiteChromeCustomizeProvider, ti as reduceCommerceCart, tl as formatBookingPriceDisplay, tn as unsafeAsLinkedContentEntryId, to as resolveRuntimeEventPricing, tr as formattingTransforms, ts as resolveImageUrlWithContext, tt as deriveTransactionCapabilities, u as PREVIEW_DESIGN_LOAD_ERROR_MESSAGE, uc as DialogDescription, ui as formCopyFragment, ul as parseMediaAssetId, uo as composeHeaderSectionWrapperClassName, ur as buildNewsletterFormInteractiveIslandProps, ut as PreviewTextEditor, va as resolveSpacing, vc as Root, vi as defineFragment, vl as ok$3, vo as shouldReserveFeatureCardIconZone, vr as buildFormInteractiveIslandProps, vs as getTextColorForBackground, vt as createSiteOptionWidgetAdapters, wa as eventCollectionSourceSchemaShape, wi as formatSiteChromeBackgroundTokenLabel, wn as useMediaEditorOptional, wo as RichTextDocSchema, wr as resolveDiscountContext, ws as asDesignBlockId, wt as IconPickerField, xa as buildEventCollectionListingDisplay, xi as boxStylesTransforms, xn as createStoreBackend, xo as resolveBlockIconRenderValue, xr as toRegistrationEvents, xs as resolveTokenOrCssColorValue, xt as OfferingsPreviewGroupOrderField, ya as buildEventCollectionDisplay, yc as Trigger, yi as BACKGROUND_POSITION_PRESET_VALUES, yl as X, yn as FormRenderer, yo as buildGeneratedBlockIconRenderAssetLookupFromUnknown, yr as eventRegistrationBlockDefinition, ys as isCssColorLiteral, yt as SiteOptionPickerField, za as formatDate$3, zc as clsx, zi as getGradientPreset, zl as Image, zn as getResponsiveScopeSpec, zo as CirclePlusIcon, zr as buildCheckoutInteractiveIslandProps, zs as mapOptionValueForSelect, zt as LinkWidgetProvider } from "./SiteChromeCustomizeContext-2z8moxYf.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;
@@ -3742,7 +3739,7 @@ function toExactOrFreeDisplay(amount, currency) {
3742
3739
  };
3743
3740
  }
3744
3741
  function getSelectableCoursePricingOptionsForNow(course, now) {
3745
- if (!course.pricing || course.pricing.pricingStrategy !== "tiered") return [];
3742
+ if (course.pricing.pricingStrategy !== "tiered") return [];
3746
3743
  return [...course.pricing.options].filter((option) => isSaleWindowOpen(option, now)).sort((left, right) => {
3747
3744
  if (left.sortOrder !== right.sortOrder) return left.sortOrder - right.sortOrder;
3748
3745
  if (left.priceAmount !== right.priceAmount) return left.priceAmount - right.priceAmount;
@@ -3752,23 +3749,7 @@ function getSelectableCoursePricingOptionsForNow(course, now) {
3752
3749
  function resolveCoursePricingState(course, selectedPricingOptionId, selectedSlidingAmountOrNowInput, nowInput = {}) {
3753
3750
  const selectedSlidingAmount = typeof selectedSlidingAmountOrNowInput === "number" || selectedSlidingAmountOrNowInput === null ? selectedSlidingAmountOrNowInput : null;
3754
3751
  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
- }
3752
+ const currency = course.pricing.currency;
3772
3753
  switch (course.pricing.pricingStrategy) {
3773
3754
  case "free": return {
3774
3755
  currency,
@@ -4461,6 +4442,123 @@ function TicketTypePriceList({ ticketTypes, currency }) {
4461
4442
  }, ticketType.id))
4462
4443
  });
4463
4444
  }
4445
+ function EventPricingDetails({ isDropIn, coursePricing, acceptedItems, eventCostLabel, eventPricingCurrency, ticketTypes, autoApplyDiscount }) {
4446
+ if (isDropIn) return /* @__PURE__ */ jsxs("div", {
4447
+ className: "rb-mt-6",
4448
+ children: [/* @__PURE__ */ jsx("div", {
4449
+ className: "rb-label rb-mb-2",
4450
+ children: "Registration"
4451
+ }), /* @__PURE__ */ jsx("p", {
4452
+ className: "rb-caption status-muted",
4453
+ children: "No registration required - just show up"
4454
+ })]
4455
+ });
4456
+ if (coursePricing) return /* @__PURE__ */ jsx(CoursePricingDisplay, {
4457
+ pricing: coursePricing,
4458
+ acceptedItems: [...acceptedItems]
4459
+ });
4460
+ if (eventCostLabel) return /* @__PURE__ */ jsxs("div", {
4461
+ className: "rb-mt-6",
4462
+ children: [
4463
+ /* @__PURE__ */ jsx("div", {
4464
+ className: "rb-label rb-mb-2",
4465
+ children: "Cost"
4466
+ }),
4467
+ /* @__PURE__ */ jsx("p", { children: /* @__PURE__ */ jsx("strong", { children: eventCostLabel }) }),
4468
+ autoApplyDiscount ? /* @__PURE__ */ jsx("p", {
4469
+ className: "rb-caption rb-mt-1",
4470
+ children: formatAutoApplyDiscountLine(autoApplyDiscount, eventPricingCurrency)
4471
+ }) : null,
4472
+ /* @__PURE__ */ jsx(TicketTypePriceList, {
4473
+ ticketTypes,
4474
+ currency: eventPricingCurrency
4475
+ }),
4476
+ acceptedItems.length > 0 ? /* @__PURE__ */ jsxs("p", {
4477
+ className: "rb-caption rb-mt-1",
4478
+ children: ["You can also attend with: ", acceptedItems.join(", ")]
4479
+ }) : null
4480
+ ]
4481
+ });
4482
+ return acceptedItems.length > 0 ? /* @__PURE__ */ jsx("div", {
4483
+ className: "rb-mt-6",
4484
+ children: /* @__PURE__ */ jsxs("p", {
4485
+ className: "rb-caption",
4486
+ children: ["You can also attend with: ", acceptedItems.join(", ")]
4487
+ })
4488
+ }) : null;
4489
+ }
4490
+ function EventFacts({ selection, selected, venue, teamMembers, pricing }) {
4491
+ const { date, timeRange } = formatEventDateParts({
4492
+ startsAt: selected.startsAt,
4493
+ endsAt: selected.endsAt,
4494
+ timeZone: selection.timeZone
4495
+ });
4496
+ return /* @__PURE__ */ jsxs("div", {
4497
+ className: "rb-flex rb-flex-col rb-gap-4",
4498
+ children: [
4499
+ /* @__PURE__ */ jsxs("div", { children: [
4500
+ /* @__PURE__ */ jsx("div", {
4501
+ className: "rb-label rb-mb-2",
4502
+ children: selection.mode === "next" ? "Next date" : "Date"
4503
+ }),
4504
+ /* @__PURE__ */ jsx("p", { children: /* @__PURE__ */ jsx("strong", { children: date }) }),
4505
+ /* @__PURE__ */ jsx("p", {
4506
+ className: "rb-caption",
4507
+ children: timeRange
4508
+ })
4509
+ ] }),
4510
+ venue ? /* @__PURE__ */ jsxs("div", {
4511
+ className: "rb-mt-6",
4512
+ children: [
4513
+ /* @__PURE__ */ jsx("div", {
4514
+ className: "rb-label rb-mb-2",
4515
+ children: "Venue"
4516
+ }),
4517
+ /* @__PURE__ */ jsx("p", { children: /* @__PURE__ */ jsx("strong", { children: venue.name }) }),
4518
+ venue.address ? /* @__PURE__ */ jsx("p", {
4519
+ className: "rb-caption",
4520
+ children: venue.address
4521
+ }) : null
4522
+ ]
4523
+ }) : null,
4524
+ teamMembers.length > 0 ? /* @__PURE__ */ jsxs("div", {
4525
+ className: "rb-mt-6",
4526
+ children: [/* @__PURE__ */ jsx("div", {
4527
+ className: "rb-label rb-mb-2",
4528
+ children: "With"
4529
+ }), /* @__PURE__ */ jsx("div", {
4530
+ className: "rb-flex rb-flex-col rb-gap-3",
4531
+ children: teamMembers.map((member) => /* @__PURE__ */ jsxs("div", { children: [/* @__PURE__ */ jsx("p", { children: /* @__PURE__ */ jsx(TeamMemberName$1, {
4532
+ name: member.name,
4533
+ profilePath: member.profilePath
4534
+ }) }), member.summary ? /* @__PURE__ */ jsx("p", {
4535
+ className: "rb-caption status-muted",
4536
+ children: member.summary
4537
+ }) : null] }, member.id))
4538
+ })]
4539
+ }) : null,
4540
+ pricing
4541
+ ]
4542
+ });
4543
+ }
4544
+ function OtherEventDates({ selection }) {
4545
+ if (selection.otherDates.length === 0) return null;
4546
+ return /* @__PURE__ */ jsxs("div", { children: [/* @__PURE__ */ jsx("div", {
4547
+ className: "rb-label",
4548
+ children: "Other dates"
4549
+ }), /* @__PURE__ */ jsx("div", {
4550
+ className: "rb-mt-2 rb-tiles-grid",
4551
+ children: selection.otherDates.map((event) => /* @__PURE__ */ jsx("a", {
4552
+ className: "rb-tile rb-tile--interactive",
4553
+ ...resolveEventLinkProps(event),
4554
+ children: /* @__PURE__ */ jsx(DateTimeTile, {
4555
+ startsAt: event.startsAt,
4556
+ endsAt: event.endsAt,
4557
+ timeZone: selection.timeZone
4558
+ })
4559
+ }, event.occurrenceId || event.id))
4560
+ })] });
4561
+ }
4464
4562
  function EventDetailsView({ selection, showVenue, showMap, showOtherDates, showCost = true, showAcceptedPasses = true, showAcceptedMemberships = true, applicablePasses = [], applicableMemberships = [], autoApplyDiscount = null, mapHeight = 200, mapClassName = "event-details-map", renderVenueMap }) {
4465
4563
  const selected = selection.selected;
4466
4564
  if (!selected) return /* @__PURE__ */ jsx("p", {
@@ -4468,138 +4566,46 @@ function EventDetailsView({ selection, showVenue, showMap, showOtherDates, showC
4468
4566
  children: "No upcoming dates scheduled."
4469
4567
  });
4470
4568
  const venue = showVenue ? selected.venue : void 0;
4471
- const isDropIn = selected.kind !== "course_session" && selected.requiresRegistration === false;
4569
+ const isDropIn = selected.bookingScope === "single_occurrence" && selected.requiresRegistration === false;
4472
4570
  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
4571
+ const coursePricing = selected.bookingScope === "whole_series" && selected.wholeSeries ? resolveCoursePricingState({
4572
+ pricing: selected.wholeSeries.pricing,
4573
+ currency: selected.wholeSeries.currency
4477
4574
  }) : null;
4478
4575
  const eventPricing = resolveRuntimeEventPricing(selected);
4479
4576
  const eventPricingType = publicEventPricingType(eventPricing);
4480
4577
  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;
4578
+ const shouldShowEventCost = showCost && eventPricingType === "paid" && !isDropIn && coursePricing === null;
4484
4579
  const eventCostLabel = shouldShowEventCost ? formatEventPrice(selected) : null;
4485
4580
  const ticketTypes = shouldShowEventCost ? getActiveTicketTypes$1(selected) : [];
4486
4581
  const acceptedItems = [];
4487
4582
  if (showAcceptedPasses) acceptedItems.push(...applicablePasses.map((p) => p.name));
4488
4583
  if (showAcceptedMemberships) acceptedItems.push(...applicableMemberships.map((m) => m.name));
4489
- const hasAcceptedItems = acceptedItems.length > 0;
4490
4584
  return /* @__PURE__ */ jsxs("div", {
4491
4585
  className: "rb-flex rb-flex-col rb-gap-6 rb-text-left",
4492
4586
  children: [/* @__PURE__ */ jsxs("div", {
4493
4587
  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
- ]
4588
+ children: [/* @__PURE__ */ jsx(EventFacts, {
4589
+ selection,
4590
+ selected,
4591
+ venue,
4592
+ teamMembers,
4593
+ pricing: /* @__PURE__ */ jsx(EventPricingDetails, {
4594
+ isDropIn,
4595
+ coursePricing: showCost ? coursePricing : null,
4596
+ acceptedItems,
4597
+ eventCostLabel,
4598
+ eventPricingCurrency,
4599
+ ticketTypes,
4600
+ autoApplyDiscount
4601
+ })
4582
4602
  }), showMap && renderVenueMap && venue?.location ? /* @__PURE__ */ jsx(Fragment$1, { children: renderVenueMap({
4583
4603
  venueName: venue.name,
4584
4604
  location: venue.location,
4585
4605
  className: mapClassName,
4586
4606
  height: mapHeight
4587
4607
  }) }) : 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]
4608
+ }), showOtherDates ? /* @__PURE__ */ jsx(OtherEventDates, { selection }) : null]
4603
4609
  });
4604
4610
  }
4605
4611
  //#endregion
@@ -4763,7 +4769,7 @@ function resolveCoursePageSurfaceScope(courses, subjectValue) {
4763
4769
  return {
4764
4770
  kind: "scoped",
4765
4771
  subject: parsed.value,
4766
- courses: courses.filter((course) => allowedSeriesIds.has(course.seriesId))
4772
+ courses: courses.filter((course) => allowedSeriesIds.has(course.eventSeriesId))
4767
4773
  };
4768
4774
  }
4769
4775
  function eventSeriesIdsForSubject(subject) {
@@ -4775,43 +4781,8 @@ function eventSeriesIdsForSubject(subject) {
4775
4781
  }
4776
4782
  //#endregion
4777
4783
  //#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
4784
  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);
4785
+ const pageSurfaceScope = resolveCoursePageSurfaceScope((args.courses ?? []).filter(Boolean), args.subject);
4815
4786
  if (pageSurfaceScope.kind === "unsupported") return {
4816
4787
  mode: "unsupportedPageSurfaceSubject",
4817
4788
  selected: null,
@@ -4825,42 +4796,8 @@ function selectCourseDetails(args) {
4825
4796
  scoped
4826
4797
  };
4827
4798
  }
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
4799
  return {
4863
- mode: "none",
4800
+ mode: "unsupportedPageSurfaceSubject",
4864
4801
  selected: null,
4865
4802
  scoped: []
4866
4803
  };
@@ -4872,12 +4809,6 @@ function toValidDate(value) {
4872
4809
  const date = new Date(value);
4873
4810
  return Number.isNaN(date.getTime()) ? null : date;
4874
4811
  }
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
4812
  function getCourseDateRange(course) {
4882
4813
  const datedSessions = (course.sessions ?? []).map((session) => ({
4883
4814
  session,
@@ -5055,17 +4986,13 @@ function CourseDetailsView(props) {
5055
4986
  }
5056
4987
  //#endregion
5057
4988
  //#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 }) {
4989
+ function CourseDetailsSSR({ courses, subject, showTitle, showDescription, showSessions, sessionsLimit, showVenue, showPrice, showCapacity, showEnrollmentStatus, showMembershipNote, className, children }) {
5059
4990
  const selection = selectCourseDetails({
5060
4991
  courses: courses ?? null,
5061
- contentEntry,
5062
- entrySubrouteContext,
5063
- subject,
5064
- courseSlug
4992
+ subject
5065
4993
  });
5066
4994
  const parsedSubject = parseEventPageSurfaceSubject(subject);
5067
4995
  const awaitingOfferingRuns = parsedSubject.ok && parsedSubject.value.kind === "eventOffering" && parsedSubject.value.availableEventSeriesIds.length === 0;
5068
- const basePath = getEntryBasePath(contentEntry);
5069
4996
  const now = /* @__PURE__ */ new Date();
5070
4997
  const scopedWithRange = selection.scoped.map((c) => ({
5071
4998
  course: c,
@@ -5106,7 +5033,6 @@ function CourseDetailsSSR({ courses, contentEntry, entrySubrouteContext, subject
5106
5033
  const start = range.start;
5107
5034
  const end = range.end;
5108
5035
  const isInProgress = Boolean(start && end && start <= now && end > now);
5109
- const href = basePath ? `${basePath.replace(/\/$/, "")}/${course.slug}` : null;
5110
5036
  return /* @__PURE__ */ jsx("li", {
5111
5037
  className: "rb-rounded-md rb-border rb-p-3",
5112
5038
  children: /* @__PURE__ */ jsx("div", {
@@ -5115,11 +5041,7 @@ function CourseDetailsSSR({ courses, contentEntry, entrySubrouteContext, subject
5115
5041
  className: "rb-flex rb-items-center rb-justify-between rb-gap-3",
5116
5042
  children: [/* @__PURE__ */ jsxs("div", {
5117
5043
  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", {
5044
+ children: [/* @__PURE__ */ jsx("div", {
5123
5045
  className: "rb-truncate",
5124
5046
  children: /* @__PURE__ */ jsx("strong", { children: course.title })
5125
5047
  }), /* @__PURE__ */ jsx("div", {
@@ -5132,7 +5054,7 @@ function CourseDetailsSSR({ courses, contentEntry, entrySubrouteContext, subject
5132
5054
  })]
5133
5055
  })
5134
5056
  })
5135
- }, course.id);
5057
+ }, course.eventSeriesId);
5136
5058
  })
5137
5059
  }) : /* @__PURE__ */ jsx("p", {
5138
5060
  className: "rb-caption status-muted",
@@ -5524,80 +5446,13 @@ const EventSpotlight = ({ events, layout = "grid", columns = "3", cardVariant =
5524
5446
  };
5525
5447
  //#endregion
5526
5448
  //#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
- });
5449
+ const eventCombinedSourceSchema = z$1.object({ ...eventCollectionSourceSchemaShape });
5563
5450
  const eventCombinedDisplaySchema = z$1.object({
5564
5451
  kind: z$1.literal("event-combined"),
5565
5452
  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
5453
+ ...eventCollectionDisplaySchemaShape
5600
5454
  });
5455
+ const eventCombinedHydrationSchema = eventCollectionHydrationSchema;
5601
5456
  const eventCombinedRenderSchema = z$1.object({
5602
5457
  display: eventCombinedDisplaySchema,
5603
5458
  hydration: eventCombinedHydrationSchema
@@ -5609,62 +5464,14 @@ const eventCombinedIslandMetaCodec = createZodCodec(z$1.object({
5609
5464
  }));
5610
5465
  const eventCombinedIslandMetaKeys = defineInteractiveIslandMetaKeys("siteId", "apiBaseUrl", "stage");
5611
5466
  function buildEventCombinedDisplay(source) {
5612
- const listLayout = source.listLayout ?? "stack";
5613
5467
  return {
5468
+ ...buildEventCollectionDisplay(source),
5614
5469
  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."
5470
+ className: source.className ?? null
5645
5471
  };
5646
5472
  }
5647
5473
  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
- };
5474
+ return buildEventCollectionListingDisplay(render.display, render.hydration.prefetchedEvents, className);
5668
5475
  }
5669
5476
  const eventCombinedBlockRuntime = defineProgressiveBlockRuntime({
5670
5477
  kind: "progressive",
@@ -5674,15 +5481,7 @@ const eventCombinedBlockRuntime = defineProgressiveBlockRuntime({
5674
5481
  },
5675
5482
  buildRender: (source) => ({
5676
5483
  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
- }
5484
+ hydration: buildEventCollectionHydration(source)
5686
5485
  })
5687
5486
  });
5688
5487
  createInteractiveIslandCodec({
@@ -6112,7 +5911,7 @@ function renderOfferingCompactItem(item, options) {
6112
5911
  case "course": return /* @__PURE__ */ jsx(CourseCompactRow, {
6113
5912
  course: item.course,
6114
5913
  path: item.path
6115
- }, item.course.id);
5914
+ }, item.course.eventSeriesId);
6116
5915
  }
6117
5916
  }
6118
5917
  function renderSingleOfferingCard(item, options) {
@@ -6130,7 +5929,7 @@ function renderSingleOfferingCard(item, options) {
6130
5929
  path: item.path,
6131
5930
  buttonVariant: options.buttonVariant,
6132
5931
  buttonText: options.buttonText
6133
- }, item.course.id);
5932
+ }, item.course.eventSeriesId);
6134
5933
  }
6135
5934
  }
6136
5935
  function CourseCompactRow({ course, path }) {
@@ -7098,13 +6897,11 @@ function CheckoutSSR({ blockId, siteId, apiBaseUrl, stage, children, ...rest })
7098
6897
  * Server-safe placeholder for course registration.
7099
6898
  * Provides a static container for island hydration without importing client hooks.
7100
6899
  */
7101
- function CourseRegistrationSSR({ blockId, siteId, apiBaseUrl, portalToken, contentEntry, entrySubrouteContext, subject, courses, className, showSessions, showPrice, showCapacity, showVenue, successMessage, waitlistMessage, membershipMessage, buttonText, buttonVariant, stage, children }) {
6900
+ function CourseRegistrationSSR({ blockId, siteId, apiBaseUrl, portalToken, subject, courses, className, showSessions, showPrice, showCapacity, showVenue, successMessage, waitlistMessage, membershipMessage, buttonText, buttonVariant, stage, children }) {
7102
6901
  const islandProps = buildCourseRegistrationInteractiveIslandProps({
7103
6902
  siteId,
7104
6903
  apiBaseUrl,
7105
6904
  portalToken,
7106
- contentEntry,
7107
- entrySubrouteContext,
7108
6905
  subject,
7109
6906
  courses,
7110
6907
  className,
@@ -8072,14 +7869,13 @@ function cx(...classes) {
8072
7869
  * Server-safe placeholder for event registration.
8073
7870
  * Provides a static container for island hydration without importing client hooks.
8074
7871
  */
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 }) {
7872
+ 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
7873
  const islandProps = buildEventRegistrationInteractiveIslandProps({
8077
7874
  siteId,
8078
7875
  apiBaseUrl,
8079
7876
  portalToken,
8080
7877
  previewToken,
8081
7878
  occurrenceContext,
8082
- contentEntry,
8083
7879
  subject: normalizeEventRegistrationPageSurfaceSubject(subject),
8084
7880
  events,
8085
7881
  className,
@@ -9440,7 +9236,7 @@ function useBookingSubmission(_siteId) {
9440
9236
  };
9441
9237
  }
9442
9238
  //#endregion
9443
- //#region ../blocks/src/system/runtime/api/types.ts
9239
+ //#region ../blocks/src/system/runtime/api/types/discounts.ts
9444
9240
  function discountAvailabilityHasDiscounts(availability) {
9445
9241
  return availability.type !== "none";
9446
9242
  }
@@ -9472,7 +9268,7 @@ function getDiscountContextKey(context) {
9472
9268
  context.ticketsCount ?? ""
9473
9269
  ].join(":");
9474
9270
  case "appointment": return [context.type, context.serviceId].join(":");
9475
- case "course": return [context.type, context.courseId].join(":");
9271
+ case "whole_series": return [context.type, context.eventSeriesId].join(":");
9476
9272
  case "pass": return [context.type, context.passId].join(":");
9477
9273
  case "membership": return [context.type, context.membershipId].join(":");
9478
9274
  case "product": return [
@@ -13270,6 +13066,23 @@ function areEntitlementsDisabledForTicketCount(ticketsCount) {
13270
13066
  return ticketsCount > 1;
13271
13067
  }
13272
13068
  /**
13069
+ * Describe what redeeming a pass costs the customer.
13070
+ *
13071
+ * The balance is what they hold *before* this booking, so "1 of 5" means four
13072
+ * are left afterwards. Spelling out the balance is what stops people missing
13073
+ * that a credit is being spent at all.
13074
+ *
13075
+ * Always one credit: passes are only redeemable for single-ticket bookings,
13076
+ * per {@link areEntitlementsDisabledForTicketCount}.
13077
+ *
13078
+ * @param creditsRemaining - Credits on the pass before this booking, if known
13079
+ */
13080
+ function formatPassCreditUsageLabel(creditsRemaining) {
13081
+ if (typeof creditsRemaining !== "number" || creditsRemaining <= 0) return "Uses 1 pass credit";
13082
+ if (creditsRemaining === 1) return "Uses your last credit";
13083
+ return `Uses 1 of ${creditsRemaining} credits`;
13084
+ }
13085
+ /**
13273
13086
  * Transform API eligibility response to internal eligibility data.
13274
13087
  *
13275
13088
  * @param response - The raw API response from checkEligibility
@@ -14240,6 +14053,23 @@ function isDirectPaymentOptionSelected(option, selectionState) {
14240
14053
  return selectionState.kind === "valid" && selectionState.selection.collectionOptionKind === option.kind;
14241
14054
  }
14242
14055
  /**
14056
+ * Label for the button that acts on the chosen payment method.
14057
+ *
14058
+ * A pass redemption spends a credit the moment it is pressed, so the label
14059
+ * names the pass instead of describing the step.
14060
+ */
14061
+ function resolvePaymentButtonText(method) {
14062
+ switch (method) {
14063
+ case "stripe": return "Continue to Payment";
14064
+ case "pass": return "Book using class pass";
14065
+ case "pass_bundle":
14066
+ case "membership_bundle": return "Purchase & Register";
14067
+ case "free":
14068
+ case "membership":
14069
+ case null: return "Complete Registration";
14070
+ }
14071
+ }
14072
+ /**
14243
14073
  * Payment Selection Step
14244
14074
  *
14245
14075
  * Shows payment options based on event pricing type and user eligibility.
@@ -14279,11 +14109,7 @@ const PaymentSelectionStep = ({ event, occurrenceContext, ticketsCount, email, i
14279
14109
  collectionOptionKind: directPaymentFallbackKind
14280
14110
  });
14281
14111
  }, [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]);
14112
+ const getButtonText = useCallback(() => resolvePaymentButtonText(selectedMethod), [selectedMethod]);
14287
14113
  useEffect(() => {
14288
14114
  if (!onStateChange) return;
14289
14115
  let status = "ready";
@@ -14830,6 +14656,21 @@ function EventRegistrationWizardContent(props) {
14830
14656
  }
14831
14657
  //#endregion
14832
14658
  //#region ../blocks/src/system/runtime/nodes/event-registration/EventRegistrationWizardActions.tsx
14659
+ /**
14660
+ * Label for the button that submits the details step.
14661
+ *
14662
+ * When a pass covers the booking there is no payment step to follow, so this
14663
+ * button is the last thing read before a credit is spent — it names the pass
14664
+ * rather than leaving that to the summary above it.
14665
+ */
14666
+ function resolveDetailsButtonText(input) {
14667
+ const { wizard } = input;
14668
+ if (wizard.eligibility?.canJoinWaitlist) return "Join Waitlist";
14669
+ if (!input.hasWaitlistClaim && wizard.eligibility?.isFull) return "Sold out";
14670
+ if (wizard.paymentSelection.method === "pass") return "Book using class pass";
14671
+ if (wizard.paymentSelection.method === "membership") return input.fallbackText;
14672
+ return wizard.eventRequiresPayment ? "Continue to Payment" : input.fallbackText;
14673
+ }
14833
14674
  function EventRegistrationWizardActions(props) {
14834
14675
  const { wizard } = props;
14835
14676
  const nextStepAfterTickets = "enter-details";
@@ -14837,12 +14678,11 @@ function EventRegistrationWizardActions(props) {
14837
14678
  const hasWaitlistClaim = wizard.waitlistClaim.claim !== null;
14838
14679
  const currentEvent = wizard.selectedEvent ?? wizard.preSelectedEvent;
14839
14680
  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
- };
14681
+ const getDetailsButtonText = () => resolveDetailsButtonText({
14682
+ wizard,
14683
+ hasWaitlistClaim,
14684
+ fallbackText: props.buttonText
14685
+ });
14846
14686
  switch (wizard.step) {
14847
14687
  case "error":
14848
14688
  case "success":
@@ -14938,6 +14778,41 @@ function isProductMethod(method) {
14938
14778
  "membership_bundle"
14939
14779
  ].includes(method);
14940
14780
  }
14781
+ /** Credits held on the pass the customer is about to redeem, before this booking. */
14782
+ function getSelectedPassCreditsRemaining(wizard) {
14783
+ const { method, passId } = wizard.paymentSelection;
14784
+ if (method !== "pass" || !passId) return null;
14785
+ return (wizard.eligibility?.eligiblePasses ?? []).find((candidate) => candidate.id === passId)?.creditsRemaining ?? null;
14786
+ }
14787
+ /**
14788
+ * Copy describing how a pass or membership covers the booking.
14789
+ *
14790
+ * Pass redemptions spend something, so they say so and name the balance;
14791
+ * memberships already include the class, so "Included" stays accurate.
14792
+ */
14793
+ function resolveEntitlementSummaryCopy(method, passCreditsRemaining) {
14794
+ switch (method) {
14795
+ case "pass": return {
14796
+ productPrice: "1 credit",
14797
+ pricingNote: formatPassCreditUsageLabel(passCreditsRemaining)
14798
+ };
14799
+ case "pass_bundle": return {
14800
+ productPrice: null,
14801
+ pricingNote: "1 pass credit"
14802
+ };
14803
+ case "membership": return {
14804
+ productPrice: "Included",
14805
+ pricingNote: "Included in membership"
14806
+ };
14807
+ case "membership_bundle":
14808
+ case "free":
14809
+ case "stripe":
14810
+ case null: return {
14811
+ productPrice: null,
14812
+ pricingNote: "Included in membership"
14813
+ };
14814
+ }
14815
+ }
14941
14816
  function getSummaryRow(option, label) {
14942
14817
  return option.summaryRows.find((row) => row.label === label)?.value ?? null;
14943
14818
  }
@@ -14954,6 +14829,35 @@ function getSelectedDirectPaymentOption(input) {
14954
14829
  const requestedKind = input.wizard.paymentSelection.collectionOptionKind ?? "upfront";
14955
14830
  return options.find((option) => option.kind === requestedKind) ?? options.find((option) => option.kind === "upfront") ?? options[0] ?? null;
14956
14831
  }
14832
+ /** Product row naming the pass or membership that covers this booking. */
14833
+ function EntitlementSummaryRow(props) {
14834
+ const { paymentSelection } = props.wizard;
14835
+ return /* @__PURE__ */ jsxs("div", {
14836
+ className: "er-summary-bar-product",
14837
+ children: [/* @__PURE__ */ jsxs("div", { children: [
14838
+ /* @__PURE__ */ jsx("div", {
14839
+ className: "er-summary-bar-product-name",
14840
+ children: paymentSelection.productName
14841
+ }),
14842
+ props.showPassEscape && /* @__PURE__ */ jsx("button", {
14843
+ type: "button",
14844
+ className: "er-summary-bar-pass-escape",
14845
+ onClick: props.wizard.handleUseCardInsteadOfPass,
14846
+ children: "Pay by card instead"
14847
+ }),
14848
+ paymentSelection.productInterval && /* @__PURE__ */ jsx("div", {
14849
+ className: "er-summary-bar-product-detail",
14850
+ children: paymentSelection.productInterval
14851
+ })
14852
+ ] }), /* @__PURE__ */ jsx("div", {
14853
+ className: "er-summary-bar-product-price",
14854
+ children: props.copy.productPrice ? /* @__PURE__ */ jsx("span", {
14855
+ className: "er-summary-bar-included",
14856
+ children: props.copy.productPrice
14857
+ }) : paymentSelection.productPrice ? formatPrice(paymentSelection.productPrice, paymentSelection.productCurrency ?? "usd") : null
14858
+ })]
14859
+ });
14860
+ }
14957
14861
  function EventRegistrationSummaryBar(props) {
14958
14862
  const { wizard } = props;
14959
14863
  const summaryEvent = wizard.selectedEvent ?? wizard.preSelectedEvent;
@@ -14981,30 +14885,13 @@ function EventRegistrationSummaryBar(props) {
14981
14885
  } : null;
14982
14886
  if (!summaryTitle) return null;
14983
14887
  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
- })]
14888
+ const isPassRedemption = wizard.paymentSelection.method === "pass";
14889
+ const entitlementCopy = resolveEntitlementSummaryCopy(wizard.paymentSelection.method, getSelectedPassCreditsRemaining(wizard));
14890
+ const showPassEscape = isPassRedemption && (wizard.step === "enter-details" || wizard.step === "select-tickets");
14891
+ return /* @__PURE__ */ jsxs(Fragment$1, { children: [productMethod && wizard.paymentSelection.productName && /* @__PURE__ */ jsx(EntitlementSummaryRow, {
14892
+ wizard,
14893
+ copy: entitlementCopy,
14894
+ showPassEscape
15008
14895
  }), /* @__PURE__ */ jsxs("div", {
15009
14896
  className: "er-summary-bar",
15010
14897
  children: [/* @__PURE__ */ jsxs("div", {
@@ -15035,7 +14922,7 @@ function EventRegistrationSummaryBar(props) {
15035
14922
  children: formatPrice(subtotalCents, summaryCurrency)
15036
14923
  }), /* @__PURE__ */ jsx("div", {
15037
14924
  className: "er-summary-bar-included",
15038
- children: wizard.paymentSelection.method === "pass" || wizard.paymentSelection.method === "pass_bundle" ? "1 pass credit" : "Included in membership"
14925
+ children: entitlementCopy.pricingNote
15039
14926
  })] }) : flexibleBalanceSummary ? /* @__PURE__ */ jsxs(Fragment$1, { children: [
15040
14927
  flexibleBalanceSummary.total ? /* @__PURE__ */ jsxs("div", {
15041
14928
  className: "er-summary-bar-product-detail",
@@ -15781,6 +15668,33 @@ const eventRegistrationSubmitDeps = { savePendingRegistration };
15781
15668
  function useEventRegistrationSubmit(options) {
15782
15669
  return useEventRegistrationSubmitWithDeps(options, eventRegistrationSubmitDeps);
15783
15670
  }
15671
+ /**
15672
+ * Describe a completed registration to the success step.
15673
+ *
15674
+ * Only pass redemptions adopt the server's message: it names the credits spent
15675
+ * and the balance left, which the block's copy cannot. Every other method keeps
15676
+ * whatever success message the site configured.
15677
+ */
15678
+ function toRegistrationResult(result) {
15679
+ if (result.alreadyRegistered) {
15680
+ const waitlisted = result.status === "waitlist";
15681
+ return {
15682
+ status: result.status,
15683
+ variant: "info",
15684
+ title: waitlisted ? "Already waitlisted" : "Already registered",
15685
+ message: result.message ?? (waitlisted ? "You are already on the waitlist for this event." : "You are already registered for this event.")
15686
+ };
15687
+ }
15688
+ if (result.status === "waitlist") return {
15689
+ status: "waitlist",
15690
+ title: "Added to waitlist",
15691
+ message: result.message ?? (typeof result.waitlistPosition === "number" ? `You've been added to the waitlist (position ${result.waitlistPosition}).` : "You've been added to the waitlist.")
15692
+ };
15693
+ return {
15694
+ status: result.status,
15695
+ message: result.paymentMethod === "pass" ? result.message : void 0
15696
+ };
15697
+ }
15784
15698
  function useEventRegistrationSubmitWithDeps(options, deps) {
15785
15699
  return async (method, passId, membershipId, selection, submitOptions) => {
15786
15700
  const submitOccurrenceId = options.registrationTarget?.occurrenceId;
@@ -15890,23 +15804,7 @@ function useEventRegistrationSubmitWithDeps(options, deps) {
15890
15804
  }
15891
15805
  };
15892
15806
  }
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 });
15807
+ options.setRegistrationResult(toRegistrationResult(result));
15910
15808
  options.setStep("success");
15911
15809
  return {
15912
15810
  ok: true,
@@ -15969,16 +15867,13 @@ function useEventRegistrationWizardWithDeps(options, deps) {
15969
15867
  const scopedEvents = useMemo(() => {
15970
15868
  return resolveEventRegistrationScopedEvents(registrationEvents, {
15971
15869
  occurrenceContext: options.occurrenceContext,
15972
- subject: options.subject,
15973
- contentEntry: options.contentEntry
15870
+ subject: options.subject
15974
15871
  });
15975
15872
  }, [
15976
15873
  registrationEvents,
15977
15874
  options.occurrenceContext?.seriesId,
15978
15875
  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
15876
+ options.subject?.kind === "eventSeries" ? options.subject.eventSeriesId : options.subject?.kind === "eventOffering" ? `${options.subject.eventOfferingId}:${options.subject.availableEventSeriesIds.join(",")}` : options.subject?.reason
15982
15877
  ]);
15983
15878
  const preSelectedEvent = useMemo(() => findPreSelectedEvent({
15984
15879
  scopedEvents,
@@ -16518,7 +16413,6 @@ function useEventRegistrationWizardWithDeps(options, deps) {
16518
16413
  anchorId: options.anchorId,
16519
16414
  occurrenceContext: options.occurrenceContext,
16520
16415
  registrationTarget,
16521
- contentEntry: options.contentEntry,
16522
16416
  subject: options.subject,
16523
16417
  events: options.events,
16524
16418
  maxTicketsNum: waitlistClaim.claim ? 1 : options.maxTicketsNum,
@@ -16862,7 +16756,7 @@ function formatTicketTypePrice(ticketType, currency) {
16862
16756
  return formatCurrencyAmount(ticketType.priceAmount, currency, { decimals: "auto" });
16863
16757
  }
16864
16758
  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;
16759
+ 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
16760
  const maxTicketsNum = normalizeEventRegistrationMaxTickets(maxTickets);
16867
16761
  const showSpamProtection = spamProtectionEnabled ?? isSpamProtectionEnabled();
16868
16762
  const buttonClass = themeButtonClassName({
@@ -16874,7 +16768,6 @@ function EventRegistrationWizard(props) {
16874
16768
  const wizard = useEventRegistrationWizard({
16875
16769
  anchorId: EVENT_REGISTRATION_ANCHOR_ID,
16876
16770
  occurrenceContext: occurrenceContext ?? null,
16877
- contentEntry: contentEntry ?? null,
16878
16771
  subject: subject ?? null,
16879
16772
  events: events ?? [],
16880
16773
  maxTicketsNum
@@ -17626,6 +17519,37 @@ function EnrollmentForm({ formData, errors, onChange, isEmailLocked, isLoading,
17626
17519
  ] });
17627
17520
  }
17628
17521
  //#endregion
17522
+ //#region ../blocks/src/system/runtime/nodes/course-registration/pricing.ts
17523
+ function parseCurrencyInputToCents(value) {
17524
+ const trimmed = value.trim();
17525
+ if (!trimmed) return null;
17526
+ const amount = Number(trimmed);
17527
+ if (!Number.isFinite(amount) || amount < 0) return null;
17528
+ return Math.round(amount * 100);
17529
+ }
17530
+ function formatCentsAsCurrencyInput(amount) {
17531
+ const major = amount / 100;
17532
+ return Number.isInteger(major) ? String(major) : major.toFixed(2);
17533
+ }
17534
+ function getMissingCoursePricingSelectionMessage(pricing) {
17535
+ if (pricing?.requiresSelection && !pricing.selectedOption) return pricing.slidingScale ? "Choose an amount to continue." : "Choose a pricing option to continue.";
17536
+ const selectedAmount = pricing?.selectedSlidingAmount;
17537
+ const scale = pricing?.slidingScale;
17538
+ if (scale && selectedAmount !== null && selectedAmount !== void 0 && (selectedAmount < scale.minAmount || selectedAmount > scale.maxAmount)) return "Choose an amount within the sliding scale.";
17539
+ return null;
17540
+ }
17541
+ function buildCoursePricingOptionPayload(pricing) {
17542
+ if (pricing?.selectedOption) return { pricingOptionId: pricing.selectedOption.id };
17543
+ if (pricing?.slidingScale && pricing.selectedSlidingAmount !== null) return { selectedSlidingAmount: pricing.selectedSlidingAmount };
17544
+ return {};
17545
+ }
17546
+ function defaultCoursePricingSelection(pricing, previousOptionId) {
17547
+ return {
17548
+ pricingOptionId: previousOptionId && pricing.selectableOptions.some((option) => option.id === previousOptionId) ? previousOptionId : pricing.selectedOption?.id ?? null,
17549
+ slidingAmountInput: pricing.slidingScale?.suggestedAmount !== null && pricing.slidingScale?.suggestedAmount !== void 0 ? formatCentsAsCurrencyInput(pricing.slidingScale.suggestedAmount) : ""
17550
+ };
17551
+ }
17552
+ //#endregion
17629
17553
  //#region ../blocks/src/system/runtime/nodes/course-registration/wizardSteps.ts
17630
17554
  /**
17631
17555
  * Steps that are part of the main wizard and should show the step indicator.
@@ -17698,654 +17622,608 @@ function getStepLabels(steps) {
17698
17622
  return steps.map((step) => STEP_LABELS[step] ?? step);
17699
17623
  }
17700
17624
  //#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);
17625
+ //#region ../blocks/src/system/runtime/nodes/course-registration/courseRegistrationViewState.ts
17626
+ function deriveCourseRegistrationViewState(input) {
17627
+ const hasCoursePayment = resolveCoursePaymentRequirement(input.pricing);
17628
+ const canUseMembership = hasCoursePayment && input.selectedCourse?.acceptsMemberships === true && input.portalAuthState === "authenticated" && input.eligibleMembershipCount > 0;
17629
+ const hasPreSelectedCourse = input.scopedCourses.length === 1;
17630
+ const fastTrack = canUseMembership && input.eligibleMembershipCount === 1 && input.bookingMode === "membership";
17631
+ const wizardSteps = getWizardStepsForContext(hasPreSelectedCourse, hasCoursePayment, canUseMembership, input.bookingMode, fastTrack);
17632
+ const showPortalAuthSidebar = shouldShowPortalAuthSidebar({
17633
+ ...input,
17634
+ hasCoursePayment
17635
+ });
17636
+ return {
17637
+ hasCoursePayment,
17638
+ canUseMembership,
17639
+ hasPreSelectedCourse,
17640
+ wizardSteps,
17641
+ currentStepNumber: getStepNumber(input.step, wizardSteps),
17642
+ totalSteps: wizardSteps.length,
17643
+ stepLabels: getStepLabels(wizardSteps),
17644
+ showPortalAuthSidebar
17645
+ };
17708
17646
  }
17709
- function formatCentsAsCurrencyInput(amount) {
17710
- const major = amount / 100;
17711
- return Number.isInteger(major) ? String(major) : major.toFixed(2);
17647
+ function resolveCoursePaymentRequirement(pricing) {
17648
+ if (!pricing) return false;
17649
+ return pricing.selectedOption ? pricing.selectedRequiresPayment : pricing.hasPaidSelection;
17712
17650
  }
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;
17651
+ function shouldShowPortalAuthSidebar(input) {
17652
+ if (input.portalAuthState !== "unauthenticated") return false;
17653
+ if (input.step === "success" || input.step === "waitlist" || input.step === "error") return false;
17654
+ return input.waitlistRequiresPortalLogin || input.hasCoursePayment && input.selectedCourse?.acceptsMemberships === true && input.step !== "select-course";
17719
17655
  }
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() {
17656
+ //#endregion
17657
+ //#region ../blocks/src/system/runtime/nodes/course-registration/useCourseEligibility.ts
17658
+ function shouldFetchEligibility(input) {
17659
+ if (!input.course || input.portalAuthState === "checking" || input.hasWaitlistClaimToken) return false;
17660
+ const membershipCheck = input.portalAuthState === "authenticated" && input.hasPaidSelection && input.course.acceptsMemberships;
17661
+ const capacityCheck = input.course.availableSpots !== null && input.course.availableSpots <= 0;
17662
+ return membershipCheck || capacityCheck;
17663
+ }
17664
+ function useCourseEligibility(input) {
17665
+ const [loading, setLoading] = useState(false);
17666
+ const [error, setError] = useState(null);
17667
+ const [eligibility, setEligibility] = useState(null);
17668
+ const [memberships, setMemberships] = useState([]);
17669
+ const [paymentChoice, setPaymentChoice] = useState("checkout");
17670
+ const [selectedMembershipId, setSelectedMembershipId] = useState(null);
17671
+ const choosePaymentChoice = useCallback((choice) => {
17672
+ setPaymentChoice(choice);
17673
+ }, []);
17674
+ const chooseMembership = useCallback((membershipId) => {
17675
+ setSelectedMembershipId(membershipId);
17676
+ }, []);
17677
+ useEffect(() => {
17678
+ let cancelled = false;
17679
+ setEligibility(null);
17680
+ setMemberships([]);
17681
+ setSelectedMembershipId(null);
17682
+ setError(null);
17683
+ setPaymentChoice("checkout");
17684
+ const eligibilityInput = {
17685
+ course: input.selectedCourse,
17686
+ hasPaidSelection: input.hasPaidSelection,
17687
+ portalAuthState: input.portalAuthState,
17688
+ hasWaitlistClaimToken: input.waitlistClaimToken !== null
17689
+ };
17690
+ if (!shouldFetchEligibility(eligibilityInput)) return;
17691
+ const course = eligibilityInput.course;
17692
+ setLoading(true);
17693
+ input.api.checkWholeSeriesEligibility({ eventSeriesId: course.eventSeriesId }).then((result) => {
17694
+ if (cancelled) return;
17695
+ const eligibleMemberships = result.eligibleMemberships ?? [];
17696
+ setEligibility(result);
17697
+ setMemberships(eligibleMemberships);
17698
+ if (input.portalAuthState === "authenticated" && eligibleMemberships.length > 0) {
17699
+ setPaymentChoice("membership");
17700
+ if (eligibleMemberships.length === 1) setSelectedMembershipId(eligibleMemberships[0]?.customerMembershipId ?? null);
17701
+ }
17702
+ }).catch((cause) => {
17703
+ if (!cancelled) setError(cause instanceof Error ? cause.message : "Failed to check membership eligibility");
17704
+ }).finally(() => {
17705
+ if (!cancelled) setLoading(false);
17706
+ });
17707
+ return () => {
17708
+ cancelled = true;
17709
+ };
17710
+ }, [
17711
+ input.api,
17712
+ input.hasPaidSelection,
17713
+ input.portalAuthState,
17714
+ input.selectedCourse,
17715
+ input.waitlistClaimToken
17716
+ ]);
17717
+ return {
17718
+ eligibilityLoading: loading,
17719
+ eligibilityError: error,
17720
+ courseEligibility: eligibility,
17721
+ eligibleMemberships: memberships,
17722
+ paymentChoice,
17723
+ choosePaymentChoice,
17724
+ selectedMembershipId,
17725
+ chooseMembership
17726
+ };
17727
+ }
17728
+ //#endregion
17729
+ //#region ../blocks/src/system/runtime/nodes/course-registration/useCourseRegistrationSelection.ts
17730
+ function selectScopedCourses(props) {
17731
+ const surfaceScope = resolveCoursePageSurfaceScope(props.courses ?? [], props.subject);
17732
+ if (surfaceScope.kind === "unsupported") return [];
17733
+ if (surfaceScope.kind === "scoped") return surfaceScope.courses;
17734
+ return [];
17735
+ }
17736
+ function getCourseCheckoutSessionId() {
17731
17737
  const fromSearch = new URLSearchParams(window.location.search).get("session_id");
17732
17738
  if (fromSearch) return fromSearch;
17733
17739
  return window.location.hash.match(/[?&]session_id=([^&]+)/)?.[1] ?? null;
17734
17740
  }
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;
17741
+ function initialStep(courses) {
17742
+ if (new URLSearchParams(window.location.search).get("enrollment") === "success" && getCourseCheckoutSessionId()) return "verifying-payment";
17743
+ return courses.length === 1 ? "enter-details" : "select-course";
17753
17744
  }
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
- });
17745
+ function useCourseRegistrationSelection(props) {
17746
+ const scopedCourses = useMemo(() => selectScopedCourses(props), [props.courses, props.subject]);
17747
+ const [step, setStep] = useState(() => initialStep(scopedCourses));
17788
17748
  const [selectedCourse, setSelectedCourse] = useState(scopedCourses.length === 1 ? scopedCourses[0] ?? null : null);
17789
17749
  const [selectedPricingOptionId, setSelectedPricingOptionId] = useState(null);
17790
17750
  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();
17751
+ const goToStep = useCallback((nextStep) => {
17752
+ setStep(nextStep);
17753
+ }, []);
17754
+ const chooseCourse = useCallback((course) => {
17755
+ setSelectedCourse(course);
17756
+ }, []);
17757
+ const choosePricingOption = useCallback((pricingOptionId) => {
17758
+ setSelectedPricingOptionId(pricingOptionId);
17759
+ }, []);
17760
+ const changeSlidingAmount = useCallback((amount) => {
17761
+ setSelectedSlidingAmountInput(amount);
17762
+ }, []);
17811
17763
  const selectedCoursePricing = useMemo(() => selectedCourse ? resolveCoursePricingState(selectedCourse, selectedPricingOptionId, parseCurrencyInputToCents(selectedSlidingAmountInput)) : null, [
17812
17764
  selectedCourse,
17813
17765
  selectedPricingOptionId,
17814
17766
  selectedSlidingAmountInput
17815
17767
  ]);
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
17768
  useEffect(() => {
17882
17769
  if (!selectedCourse) {
17883
17770
  setSelectedPricingOptionId(null);
17884
17771
  setSelectedSlidingAmountInput("");
17885
17772
  return;
17886
17773
  }
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
- });
17774
+ const selection = defaultCoursePricingSelection(resolveCoursePricingState(selectedCourse, null), selectedPricingOptionId);
17775
+ setSelectedPricingOptionId(selection.pricingOptionId);
17776
+ setSelectedSlidingAmountInput(selection.slidingAmountInput);
17893
17777
  }, [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);
17778
+ return {
17779
+ scopedCourses,
17780
+ step,
17781
+ goToStep,
17782
+ selectedCourse,
17783
+ chooseCourse,
17784
+ selectedPricingOptionId,
17785
+ choosePricingOption,
17786
+ selectedSlidingAmountInput,
17787
+ changeSlidingAmount,
17788
+ selectedCoursePricing
17789
+ };
17790
+ }
17791
+ //#endregion
17792
+ //#region ../blocks/src/system/runtime/nodes/course-registration/useCoursePaymentVerification.ts
17793
+ function applyTerminalStatus(status, setters) {
17794
+ if (status === "enrolled" || status === "completed") {
17795
+ setters.setEnrollmentResult({
17796
+ status: "enrolled",
17797
+ usedMembership: false
17798
+ });
17799
+ setters.setStep("success");
17800
+ return true;
17801
+ }
17802
+ if (status === "waitlist") {
17803
+ setters.setEnrollmentResult({
17804
+ status: "waitlist",
17805
+ usedMembership: false
17806
+ });
17807
+ setters.setStep("waitlist");
17808
+ return true;
17809
+ }
17810
+ setters.setErrorMessage("Payment did not complete. Please try again.");
17811
+ setters.setStep("error");
17812
+ return true;
17813
+ }
17814
+ async function pollCourseRegistrationStatus(api, sessionId, setters, isCancelled) {
17815
+ const startedAt = Date.now();
17816
+ while (!isCancelled()) {
17817
+ try {
17818
+ const result = await api.getWholeSeriesRegistrationStatus({ sessionId });
17819
+ if (isCancelled()) return;
17820
+ if (result.status !== "pending_payment") {
17821
+ applyTerminalStatus(result.status, setters);
17822
+ return;
17921
17823
  }
17824
+ } catch (cause) {
17825
+ setters.setErrorMessage(cause instanceof Error ? cause.message : "Failed to verify payment");
17922
17826
  }
17923
- fetchEligibility();
17924
- return () => {
17925
- cancelled = true;
17926
- };
17927
- }, [
17928
- api,
17929
- selectedCourse,
17930
- selectedCoursePricing?.hasPaidSelection,
17931
- portalAuthState,
17932
- waitlistClaim.token
17933
- ]);
17827
+ if (Date.now() - startedAt > 3e4) {
17828
+ setters.setErrorMessage("Payment is still processing. Please check your email for confirmation.");
17829
+ setters.setStep("error");
17830
+ return;
17831
+ }
17832
+ await new Promise((resolve) => setTimeout(resolve, 1500));
17833
+ }
17834
+ }
17835
+ function useCoursePaymentVerification(api, setters) {
17934
17836
  useEffect(() => {
17935
17837
  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;
17838
+ const enrollment = new URLSearchParams(window.location.search).get("enrollment");
17839
+ const sessionId = getCourseCheckoutSessionId();
17840
+ if (enrollment === "cancelled") {
17946
17841
  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
- }
17842
+ setters.setErrorMessage("Payment was cancelled. You can try again.");
17843
+ setters.setStep("error");
17844
+ return;
17985
17845
  }
17986
- verifyAfterCheckout();
17846
+ if (enrollment !== "success" || !sessionId) return;
17847
+ scrollToBlock(COURSE_REGISTRATION_ANCHOR_ID);
17848
+ setters.setStep("verifying-payment");
17849
+ pollCourseRegistrationStatus(api, sessionId, setters, () => cancelled);
17987
17850
  return () => {
17988
17851
  cancelled = true;
17989
17852
  };
17990
- }, [api]);
17991
- const handleValidateForm = () => {
17992
- const newErrors = validateFormData$1(formData);
17993
- setErrors(newErrors);
17994
- return Object.keys(newErrors).length === 0;
17853
+ }, [
17854
+ api,
17855
+ setters.setEnrollmentResult,
17856
+ setters.setErrorMessage,
17857
+ setters.setStep
17858
+ ]);
17859
+ }
17860
+ //#endregion
17861
+ //#region ../blocks/src/system/runtime/nodes/course-registration/useCourseRegistrationActions.ts
17862
+ function blocked(message, setters) {
17863
+ setters.setErrorMessage(message);
17864
+ setters.setStep("error");
17865
+ return {
17866
+ kind: "blocked",
17867
+ message
17995
17868
  };
17996
- const handleCourseSelect = (course) => {
17997
- setSelectedCourse(course);
17998
- setStep("enter-details");
17869
+ }
17870
+ function validateSubmission(state, setters) {
17871
+ if (!state.selectedCourse) return {
17872
+ kind: "blocked",
17873
+ message: "Choose an available set of dates to continue."
17874
+ };
17875
+ const errors = validateFormData$1(state.formData);
17876
+ setters.setErrors(errors);
17877
+ if (Object.keys(errors).length > 0) return { kind: "validation-failed" };
17878
+ const pricingMessage = getMissingCoursePricingSelectionMessage(state.pricing);
17879
+ if (pricingMessage) return blocked(pricingMessage, setters);
17880
+ if (!state.hasClaim && state.eligibility?.isFull && !state.eligibility.canJoinWaitlist) return blocked(state.eligibility.reason ?? "This course is fully booked.", setters);
17881
+ if (isSpamProtectionEnabled() && !state.altchaSolution) return blocked("Please complete the verification check.", setters);
17882
+ return null;
17883
+ }
17884
+ function enrollmentPayload(state, payment) {
17885
+ return {
17886
+ ...registrantPayload(state),
17887
+ paymentMethod: payment.method,
17888
+ ...payment.method === "membership" ? { customerMembershipId: payment.membershipId } : {}
17999
17889
  };
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."
17890
+ }
17891
+ function registrantPayload(state) {
17892
+ return {
17893
+ eventSeriesId: state.selectedCourse.eventSeriesId,
17894
+ ...buildCoursePricingOptionPayload(state.pricing),
17895
+ email: state.formData.email.trim().toLowerCase(),
17896
+ name: state.formData.name.trim(),
17897
+ phone: state.formData.phone.trim() || void 0,
17898
+ formData: { notes: state.formData.notes.trim() || void 0 },
17899
+ altchaSolution: state.altchaSolution,
17900
+ claimToken: state.claimToken ?? void 0
17901
+ };
17902
+ }
17903
+ async function enroll(state, setters, payment) {
17904
+ setters.setStep("submitting");
17905
+ try {
17906
+ const result = await state.api.registerForWholeSeries(enrollmentPayload(state, payment));
17907
+ setters.setEnrollmentResult({
17908
+ status: result.status,
17909
+ waitlistPosition: result.waitlistPosition ?? void 0,
17910
+ usedMembership: payment.method === "membership"
17911
+ });
17912
+ setters.setStep(result.status === "waitlist" ? "waitlist" : "success");
17913
+ return { kind: "state-updated" };
17914
+ } catch (cause) {
17915
+ const message = cause instanceof Error ? cause.message : "Booking failed";
17916
+ setters.setErrorMessage(message);
17917
+ setters.setStep("error");
17918
+ return {
17919
+ kind: "failed",
17920
+ message
18028
17921
  };
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"
17922
+ }
17923
+ }
17924
+ async function checkout(state, setters) {
17925
+ setters.setStep("submitting");
17926
+ try {
17927
+ const urls = buildCheckoutReturnUrls("enrollment", COURSE_REGISTRATION_ANCHOR_ID);
17928
+ const result = await state.api.createWholeSeriesCheckout({
17929
+ ...registrantPayload(state),
17930
+ discountCode: state.discountCode.trim() || void 0,
17931
+ successUrl: urls.successUrl,
17932
+ cancelUrl: urls.cancelUrl
17933
+ });
17934
+ if (result.bypassed) {
17935
+ setters.setEnrollmentResult({
17936
+ status: "enrolled",
17937
+ usedMembership: false
18125
17938
  });
18126
- setStep(result.status === "waitlist" ? "waitlist" : "success");
17939
+ setters.setStep("success");
18127
17940
  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
17941
  }
18137
- };
18138
- const handlePaymentContinue = async () => {
18139
- if (!selectedCourse) return {
18140
- kind: "blocked",
18141
- message: "Choose an available set of dates to continue."
17942
+ if (!result.checkoutUrl) throw new Error("Checkout URL missing");
17943
+ setters.setStep("redirecting");
17944
+ if (state.options.onCheckoutRedirect) state.options.onCheckoutRedirect(result.checkoutUrl);
17945
+ else window.location.href = result.checkoutUrl;
17946
+ return {
17947
+ kind: "checkout-redirect",
17948
+ checkoutUrl: result.checkoutUrl
18142
17949
  };
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."
17950
+ } catch (cause) {
17951
+ const message = cause instanceof Error ? cause.message : "Checkout failed";
17952
+ setters.setErrorMessage(message);
17953
+ setters.setStep("error");
17954
+ return {
17955
+ kind: "failed",
17956
+ message
18156
17957
  };
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
- }
17958
+ }
17959
+ }
17960
+ async function submitDetails(state, setters) {
17961
+ const invalid = validateSubmission(state, setters);
17962
+ if (invalid || !state.selectedCourse) return invalid ?? { kind: "validation-failed" };
17963
+ if (state.eligibility?.canJoinWaitlist) return enroll(state, setters, { method: "free" });
17964
+ const requiresPayment = state.pricing?.selectedRequiresPayment ?? false;
17965
+ const canUseMembership = requiresPayment && state.selectedCourse.acceptsMemberships && state.portalAuthState === "authenticated" && state.eligibleMemberships.length > 0;
17966
+ if (requiresPayment && canUseMembership) {
17967
+ setters.setStep("select-payment");
17968
+ return { kind: "state-updated" };
17969
+ }
17970
+ if (requiresPayment) return checkout(state, setters);
17971
+ return enroll(state, setters, { method: "free" });
17972
+ }
17973
+ async function continuePayment(state, setters) {
17974
+ const invalid = validateSubmission(state, setters);
17975
+ if (invalid || !state.selectedCourse) return invalid ?? { kind: "validation-failed" };
17976
+ if (!state.pricing?.selectedRequiresPayment) {
17977
+ setters.setStep("enter-details");
17978
+ return { kind: "state-updated" };
17979
+ }
17980
+ const selectedState = state;
17981
+ if (state.paymentChoice === "membership") {
17982
+ if (!state.selectedMembershipId) return blocked("Select a membership to sign up.", setters);
17983
+ return enroll(selectedState, setters, {
17984
+ method: "membership",
17985
+ membershipId: state.selectedMembershipId
17986
+ });
17987
+ }
17988
+ return checkout(selectedState, setters);
17989
+ }
17990
+ function useCourseRegistrationActions(state, setStep) {
17991
+ const [errors, setErrors] = useState({});
17992
+ const [enrollmentResult, setEnrollmentResult] = useState(null);
17993
+ const [errorMessage, setErrorMessage] = useState("");
17994
+ const reportError = useCallback((message) => {
17995
+ setErrorMessage(message);
17996
+ }, []);
17997
+ const recordEnrollmentResult = useCallback((result) => {
17998
+ setEnrollmentResult(result);
17999
+ }, []);
18000
+ const setters = {
18001
+ setStep,
18002
+ setErrors,
18003
+ setEnrollmentResult,
18004
+ setErrorMessage
18253
18005
  };
18254
- const handleRetry = () => {
18255
- setStep(scopedCourses.length === 1 ? "enter-details" : "select-course");
18256
- setErrorMessage("");
18006
+ return {
18007
+ errors,
18008
+ enrollmentResult,
18009
+ errorMessage,
18010
+ reportError,
18011
+ recordEnrollmentResult,
18012
+ handleSubmit: () => submitDetails(state, setters),
18013
+ handlePaymentContinue: () => continuePayment(state, setters)
18257
18014
  };
18258
- const handleBookingModeChange = (mode) => {
18259
- setBookingMode(mode);
18260
- if (mode === "membership") setPaymentChoice("membership");
18261
- else setPaymentChoice("checkout");
18015
+ }
18016
+ //#endregion
18017
+ //#region ../blocks/src/system/runtime/nodes/course-registration/useCourseRegistrationPortal.ts
18018
+ const EMPTY_FORM$1 = {
18019
+ name: "",
18020
+ email: "",
18021
+ phone: "",
18022
+ notes: ""
18023
+ };
18024
+ function useCourseRegistrationPortal(api) {
18025
+ const [formData, setFormData] = useState(EMPTY_FORM$1);
18026
+ const [portalAuthState, setPortalAuthState] = useState("checking");
18027
+ const updateFormData = useCallback((updater) => {
18028
+ setFormData(updater);
18029
+ }, []);
18030
+ useEffect(() => {
18031
+ let cancelled = false;
18032
+ if (!(api.config.auth.type === "bearer" || api.config.authOverrides?.portal?.type === "bearer")) {
18033
+ setPortalAuthState("unauthenticated");
18034
+ return;
18035
+ }
18036
+ setPortalAuthState("checking");
18037
+ api.getPortalProfile().then((result) => {
18038
+ if (cancelled) return;
18039
+ setPortalAuthState("authenticated");
18040
+ setFormData((current) => ({
18041
+ ...current,
18042
+ email: result.profile.email,
18043
+ name: current.name || result.profile.name,
18044
+ phone: current.phone || result.profile.phone || ""
18045
+ }));
18046
+ }).catch(() => {
18047
+ if (!cancelled) setPortalAuthState("unauthenticated");
18048
+ });
18049
+ return () => {
18050
+ cancelled = true;
18051
+ };
18052
+ }, [api]);
18053
+ return {
18054
+ formData,
18055
+ updateFormData,
18056
+ portalAuthState
18262
18057
  };
18058
+ }
18059
+ //#endregion
18060
+ //#region ../blocks/src/system/runtime/nodes/course-registration/useCourseWaitlistSelection.ts
18061
+ function useCourseWaitlistSelection(input) {
18062
+ useEffect(() => {
18063
+ const claim = input.waitlistClaim.claim;
18064
+ if (!claim || claim.subject.kind !== "whole_series") return;
18065
+ const eventSeriesId = claim.subject.eventSeriesId;
18066
+ const course = input.scopedCourses.find((candidate) => candidate.eventSeriesId === eventSeriesId);
18067
+ if (!course) {
18068
+ input.reportError("This waitlist claim is for a different course.");
18069
+ input.goToStep("error");
18070
+ return;
18071
+ }
18072
+ input.chooseCourse(course);
18073
+ input.updateFormData((current) => ({
18074
+ ...current,
18075
+ email: claim.prefill.email,
18076
+ name: claim.prefill.name,
18077
+ phone: claim.prefill.phone ?? "",
18078
+ notes: claim.prefill.notes ?? ""
18079
+ }));
18080
+ if (input.step === "select-course") input.goToStep("enter-details");
18081
+ }, [
18082
+ input.chooseCourse,
18083
+ input.goToStep,
18084
+ input.reportError,
18085
+ input.scopedCourses,
18086
+ input.step,
18087
+ input.updateFormData,
18088
+ input.waitlistClaim.claim
18089
+ ]);
18090
+ useEffect(() => {
18091
+ if (input.waitlistClaim.requiresPortalLogin || !input.waitlistClaim.error) return;
18092
+ input.reportError(input.waitlistClaim.error);
18093
+ input.goToStep("error");
18094
+ }, [
18095
+ input.goToStep,
18096
+ input.reportError,
18097
+ input.waitlistClaim.error,
18098
+ input.waitlistClaim.requiresPortalLogin
18099
+ ]);
18100
+ }
18101
+ //#endregion
18102
+ //#region ../blocks/src/system/runtime/nodes/course-registration/useCourseRegistrationWizard.ts
18103
+ function useCourseRegistrationWizard(props, options = {}) {
18104
+ const api = useBlockApi();
18105
+ const selection = useCourseRegistrationSelection(props);
18106
+ const portal = useCourseRegistrationPortal(api);
18107
+ const waitlistClaim = useWaitlistClaim();
18108
+ const [bookingMode, setBookingMode] = useState(null);
18109
+ const [altchaSolution, setAltchaSolution] = useState(null);
18110
+ const eligibility = useCourseEligibility({
18111
+ api,
18112
+ selectedCourse: selection.selectedCourse,
18113
+ hasPaidSelection: selection.selectedCoursePricing?.hasPaidSelection ?? false,
18114
+ portalAuthState: portal.portalAuthState,
18115
+ waitlistClaimToken: waitlistClaim.token
18116
+ });
18263
18117
  const discountUi = useDiscountCodeUi({
18264
18118
  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
18119
+ discountContext: useMemo(() => selection.selectedCourse && selection.selectedCoursePricing?.selectedRequiresPayment && eligibility.paymentChoice === "checkout" ? {
18120
+ type: "whole_series",
18121
+ eventSeriesId: selection.selectedCourse.eventSeriesId
18122
+ } : null, [
18123
+ eligibility.paymentChoice,
18124
+ selection.selectedCourse,
18125
+ selection.selectedCoursePricing?.selectedRequiresPayment
18277
18126
  ]),
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 {
18127
+ subtotalCents: selection.selectedCoursePricing?.selectedPriceAmount ?? void 0
18128
+ });
18129
+ const actions = useCourseRegistrationActions({
18298
18130
  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,
18131
+ selectedCourse: selection.selectedCourse,
18132
+ pricing: selection.selectedCoursePricing,
18133
+ formData: portal.formData,
18134
+ portalAuthState: portal.portalAuthState,
18135
+ eligibility: eligibility.courseEligibility,
18136
+ eligibleMemberships: eligibility.eligibleMemberships,
18137
+ paymentChoice: eligibility.paymentChoice,
18138
+ selectedMembershipId: eligibility.selectedMembershipId,
18139
+ claimToken: waitlistClaim.token,
18140
+ hasClaim: waitlistClaim.claim !== null,
18316
18141
  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
18142
  discountCode: discountUi.discountCode,
18330
- setDiscountCode: discountUi.setDiscountCode,
18331
- discountsAvailable: discountUi.discountsAvailable,
18332
- manualCodeEntryAllowed: discountUi.manualCodeEntryAllowed,
18333
- discountsAvailableLoading: discountUi.discountsAvailableLoading,
18334
- canUseMembership,
18143
+ options
18144
+ }, selection.goToStep);
18145
+ useCourseRegistrationEffects({
18146
+ api,
18147
+ actions,
18148
+ portal,
18149
+ selection,
18150
+ waitlistClaim
18151
+ });
18152
+ return buildCourseRegistrationWizardResult({
18153
+ api,
18154
+ selection,
18155
+ portal,
18156
+ eligibility,
18157
+ actions,
18158
+ discountUi,
18335
18159
  waitlistClaim,
18160
+ view: deriveCourseRegistrationViewState({
18161
+ scopedCourses: selection.scopedCourses,
18162
+ selectedCourse: selection.selectedCourse,
18163
+ pricing: selection.selectedCoursePricing,
18164
+ portalAuthState: portal.portalAuthState,
18165
+ eligibleMembershipCount: eligibility.eligibleMemberships.length,
18166
+ bookingMode,
18167
+ step: selection.step,
18168
+ waitlistRequiresPortalLogin: waitlistClaim.requiresPortalLogin
18169
+ }),
18336
18170
  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
18171
+ setBookingMode,
18172
+ altchaSolution,
18173
+ setAltchaSolution
18174
+ });
18175
+ }
18176
+ function useCourseRegistrationEffects(input) {
18177
+ useCoursePaymentVerification(input.api, {
18178
+ setStep: input.selection.goToStep,
18179
+ setErrorMessage: input.actions.reportError,
18180
+ setEnrollmentResult: input.actions.recordEnrollmentResult
18181
+ });
18182
+ useCourseWaitlistSelection({
18183
+ waitlistClaim: input.waitlistClaim,
18184
+ scopedCourses: input.selection.scopedCourses,
18185
+ step: input.selection.step,
18186
+ goToStep: input.selection.goToStep,
18187
+ chooseCourse: input.selection.chooseCourse,
18188
+ updateFormData: input.portal.updateFormData,
18189
+ reportError: input.actions.reportError
18190
+ });
18191
+ }
18192
+ function buildCourseRegistrationWizardResult(parts) {
18193
+ const handleBookingModeChange = (mode) => {
18194
+ parts.setBookingMode(mode);
18195
+ parts.eligibility.choosePaymentChoice(mode === "membership" ? "membership" : "checkout");
18196
+ };
18197
+ return {
18198
+ api: parts.api,
18199
+ ...parts.selection,
18200
+ ...parts.portal,
18201
+ ...parts.eligibility,
18202
+ ...parts.actions,
18203
+ waitlistClaim: parts.waitlistClaim,
18204
+ bookingMode: parts.bookingMode,
18205
+ altchaSolution: parts.altchaSolution,
18206
+ setAltchaSolution: parts.setAltchaSolution,
18207
+ showSpamProtection: isSpamProtectionEnabled(),
18208
+ discountUiOpen: parts.discountUi.discountUiOpen,
18209
+ setDiscountUiOpen: parts.discountUi.setDiscountUiOpen,
18210
+ discountCode: parts.discountUi.discountCode,
18211
+ setDiscountCode: parts.discountUi.setDiscountCode,
18212
+ discountsAvailable: parts.discountUi.discountsAvailable,
18213
+ manualCodeEntryAllowed: parts.discountUi.manualCodeEntryAllowed,
18214
+ discountsAvailableLoading: parts.discountUi.discountsAvailableLoading,
18215
+ ...parts.view,
18216
+ handleCourseSelect: (course) => {
18217
+ parts.selection.chooseCourse(course);
18218
+ parts.selection.goToStep("enter-details");
18219
+ },
18220
+ handleRetry: () => {
18221
+ parts.selection.goToStep(parts.selection.scopedCourses.length === 1 ? "enter-details" : "select-course");
18222
+ parts.actions.reportError("");
18223
+ },
18224
+ handleBookingModeChange,
18225
+ handleLogout: parts.portal.portalAuthState === "authenticated" ? () => logoutPortal(COURSE_REGISTRATION_ANCHOR_ID) : void 0,
18226
+ selectedCoursePricingPayload: buildCoursePricingOptionPayload(parts.selection.selectedCoursePricing)
18349
18227
  };
18350
18228
  }
18351
18229
  //#endregion
@@ -18761,7 +18639,7 @@ function getCourseSlidingScaleMessage(pricing) {
18761
18639
  }
18762
18640
  function CourseRegistrationWizard(props) {
18763
18641
  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);
18642
+ 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
18643
  const buttonClass = themeButtonClassName({
18766
18644
  variant: buttonVariant,
18767
18645
  size: "md"
@@ -18826,13 +18704,13 @@ function CourseRegistrationWizard(props) {
18826
18704
  className: "cr-course-list",
18827
18705
  children: scopedCourses.map((course) => /* @__PURE__ */ jsx(CourseCard, {
18828
18706
  course,
18829
- isSelected: selectedCourse?.id === course.id,
18707
+ isSelected: selectedCourse?.eventSeriesId === course.eventSeriesId,
18830
18708
  onSelect: () => handleCourseSelect(course),
18831
18709
  showSessions,
18832
18710
  showPrice,
18833
18711
  showCapacity,
18834
18712
  showVenue
18835
- }, course.id))
18713
+ }, course.eventSeriesId))
18836
18714
  }),
18837
18715
  step === "enter-details" && selectedCourseWithPricing && /* @__PURE__ */ jsxs("div", {
18838
18716
  className: "cr-details",
@@ -18849,7 +18727,7 @@ function CourseRegistrationWizard(props) {
18849
18727
  className: "cr-actions",
18850
18728
  children: /* @__PURE__ */ jsx("button", {
18851
18729
  type: "button",
18852
- onClick: () => setStep("select-course"),
18730
+ onClick: () => goToStep("select-course"),
18853
18731
  className: "cr-back-btn",
18854
18732
  children: "← Back"
18855
18733
  })
@@ -18868,7 +18746,7 @@ function CourseRegistrationWizard(props) {
18868
18746
  /* @__PURE__ */ jsx(EnrollmentForm, {
18869
18747
  formData,
18870
18748
  errors,
18871
- onChange: setFormData,
18749
+ onChange: updateFormData,
18872
18750
  isEmailLocked: portalAuthState === "authenticated" || waitlistClaim.claim !== null,
18873
18751
  isLoading: portalAuthState === "checking" || waitlistClaim.isLoading,
18874
18752
  onLogout: handleLogout
@@ -18876,12 +18754,12 @@ function CourseRegistrationWizard(props) {
18876
18754
  /* @__PURE__ */ jsx(CoursePricingSelector, {
18877
18755
  pricing: selectedCourseWithPricing.pricing,
18878
18756
  selectedPricingOptionId,
18879
- onSelect: setSelectedPricingOptionId
18757
+ onSelect: choosePricingOption
18880
18758
  }),
18881
18759
  /* @__PURE__ */ jsx(CourseSlidingScaleInput, {
18882
18760
  pricing: selectedCourseWithPricing.pricing,
18883
18761
  value: selectedSlidingAmountInput,
18884
- onChange: setSelectedSlidingAmountInput
18762
+ onChange: changeSlidingAmount
18885
18763
  }),
18886
18764
  showSpamProtection && /* @__PURE__ */ jsx("div", {
18887
18765
  className: "cr-altcha",
@@ -18906,7 +18784,7 @@ function CourseRegistrationWizard(props) {
18906
18784
  className: "cr-actions",
18907
18785
  children: [scopedCourses.length > 1 && /* @__PURE__ */ jsx("button", {
18908
18786
  type: "button",
18909
- onClick: () => setStep("select-course"),
18787
+ onClick: () => goToStep("select-course"),
18910
18788
  className: "cr-back-btn",
18911
18789
  children: "← Back"
18912
18790
  }), /* @__PURE__ */ jsx("button", {
@@ -18956,7 +18834,7 @@ function CourseRegistrationWizard(props) {
18956
18834
  onBookingModeChange: handleBookingModeChange,
18957
18835
  eligibleMemberships,
18958
18836
  selectedMembershipId,
18959
- onMembershipSelect: setSelectedMembershipId,
18837
+ onMembershipSelect: chooseMembership,
18960
18838
  priceCents: selectedCoursePricing?.selectedPriceAmount ?? null,
18961
18839
  currency: selectedCourseWithPricing.course.currency ?? "GBP"
18962
18840
  }),
@@ -18964,7 +18842,7 @@ function CourseRegistrationWizard(props) {
18964
18842
  className: "cr-actions",
18965
18843
  children: [/* @__PURE__ */ jsx("button", {
18966
18844
  type: "button",
18967
- onClick: () => setStep("enter-details"),
18845
+ onClick: () => goToStep("enter-details"),
18968
18846
  className: "cr-back-btn",
18969
18847
  children: "← Back"
18970
18848
  }), /* @__PURE__ */ jsx("button", {
@@ -19003,7 +18881,7 @@ function CourseRegistrationWizard(props) {
19003
18881
  type: "radio",
19004
18882
  name: "paymentChoice",
19005
18883
  checked: paymentChoice === "membership",
19006
- onChange: () => setPaymentChoice("membership")
18884
+ onChange: () => choosePaymentChoice("membership")
19007
18885
  }), /* @__PURE__ */ jsx("span", { children: "Use a membership (free)" })]
19008
18886
  }),
19009
18887
  paymentChoice === "membership" && eligibleMemberships.length > 1 && /* @__PURE__ */ jsxs("div", {
@@ -19016,7 +18894,7 @@ function CourseRegistrationWizard(props) {
19016
18894
  id: "cr-membership",
19017
18895
  className: "cr-form__input",
19018
18896
  value: selectedMembershipId ?? "",
19019
- onChange: (e) => setSelectedMembershipId(e.target.value || null),
18897
+ onChange: (e) => chooseMembership(e.target.value || null),
19020
18898
  children: [/* @__PURE__ */ jsx("option", {
19021
18899
  value: "",
19022
18900
  disabled: true,
@@ -19033,7 +18911,7 @@ function CourseRegistrationWizard(props) {
19033
18911
  type: "radio",
19034
18912
  name: "paymentChoice",
19035
18913
  checked: paymentChoice === "checkout",
19036
- onChange: () => setPaymentChoice("checkout")
18914
+ onChange: () => choosePaymentChoice("checkout")
19037
18915
  }), /* @__PURE__ */ jsx("span", { children: "Pay by card" })]
19038
18916
  })
19039
18917
  ]
@@ -19055,7 +18933,7 @@ function CourseRegistrationWizard(props) {
19055
18933
  className: "cr-actions",
19056
18934
  children: [/* @__PURE__ */ jsx("button", {
19057
18935
  type: "button",
19058
- onClick: () => setStep("enter-details"),
18936
+ onClick: () => goToStep("enter-details"),
19059
18937
  className: "cr-back-btn",
19060
18938
  children: "← Back"
19061
18939
  }), /* @__PURE__ */ jsx("button", {
@@ -19287,7 +19165,6 @@ const LeafletStaticMap = ({ location, label, className = "", height = 200, zoom
19287
19165
  function toEventDetailsClientProps(props) {
19288
19166
  return {
19289
19167
  occurrenceContext: props.occurrenceContext,
19290
- contentEntry: props.contentEntry,
19291
19168
  events: props.events ? [...props.events] : props.events,
19292
19169
  showVenue: props.showVenue,
19293
19170
  showMap: props.showMap,
@@ -24186,7 +24063,7 @@ var header_section_client_default = markEditableSurfaceForwarding(HeaderSectionN
24186
24063
  * Renders category filter buttons and venue dropdown for event lists.
24187
24064
  * Uses semantic CSS classes for styling.
24188
24065
  */
24189
- const EventFilters = ({ categories, venues, staffMembers, selectedKind, selectedCategoryId, selectedStaffMemberId, selectedVenueId, showCategoryFilter, showVenueFilter, showStaffFilter, showCourseOption, courseOptionLabel, onCategoryChange, onKindChange, onStaffMemberChange, onVenueChange, loading, idBase, className }) => {
24066
+ const EventFilters = ({ categories, venues, staffMembers, selectedCategoryId, selectedStaffMemberId, selectedVenueId, showCategoryFilter, showVenueFilter, showStaffFilter, onCategoryChange, onStaffMemberChange, onVenueChange, loading, idBase, className }) => {
24190
24067
  const reactId = useId();
24191
24068
  const baseId = idBase ?? reactId;
24192
24069
  const staffSelectId = `${baseId}-event-staff-filter`;
@@ -24204,29 +24081,19 @@ const EventFilters = ({ categories, venues, staffMembers, selectedKind, selected
24204
24081
  className: "event-category-buttons",
24205
24082
  role: "group",
24206
24083
  "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
- ]
24084
+ children: [/* @__PURE__ */ jsx("button", {
24085
+ type: "button",
24086
+ className: `event-category-btn ${selectedCategoryId === "all" ? "event-category-btn--active" : ""}`,
24087
+ onClick: () => onCategoryChange("all"),
24088
+ disabled: loading,
24089
+ children: "All"
24090
+ }), categories.map((category) => /* @__PURE__ */ jsx("button", {
24091
+ type: "button",
24092
+ className: `event-category-btn ${selectedCategoryId === category.id ? "event-category-btn--active" : ""}`,
24093
+ onClick: () => onCategoryChange(category.id),
24094
+ disabled: loading,
24095
+ children: category.name
24096
+ }, category.id))]
24230
24097
  })]
24231
24098
  }),
24232
24099
  showStaffFilter && /* @__PURE__ */ jsxs("div", {
@@ -24482,7 +24349,6 @@ function useEventPagination({ siteId: _siteId, initialEvents = [], fetchInitialO
24482
24349
  const normalizedCategoryIds = normalizeCsvString(filters?.categoryIds);
24483
24350
  const normalizedStaffMemberId = normalizeOptionalId(filters?.staffMemberId);
24484
24351
  const normalizedVenueId = normalizeOptionalId(filters?.venueId);
24485
- const kind = filters?.kind;
24486
24352
  const eventSurface = filters?.eventSurface;
24487
24353
  const eventPresets = normalizeCsvString(filters?.eventPresets);
24488
24354
  const scheduleScope = filters?.scheduleScope;
@@ -24518,7 +24384,6 @@ function useEventPagination({ siteId: _siteId, initialEvents = [], fetchInitialO
24518
24384
  limit: pageSize,
24519
24385
  stage,
24520
24386
  detailLevel: "listing",
24521
- kind,
24522
24387
  eventSurface,
24523
24388
  eventPresets: eventPresets ?? void 0,
24524
24389
  scheduleScope,
@@ -24549,7 +24414,6 @@ function useEventPagination({ siteId: _siteId, initialEvents = [], fetchInitialO
24549
24414
  getPublicEvents,
24550
24415
  pageSize,
24551
24416
  stage,
24552
- kind,
24553
24417
  eventSurface,
24554
24418
  eventPresets,
24555
24419
  scheduleScope,
@@ -24629,8 +24493,7 @@ function useEventPagination({ siteId: _siteId, initialEvents = [], fetchInitialO
24629
24493
  const EMPTY_EVENT_FILTERS = Object.freeze({
24630
24494
  categories: [],
24631
24495
  venues: [],
24632
- staffMembers: [],
24633
- labels: Object.freeze({ courseOption: "Course" })
24496
+ staffMembers: []
24634
24497
  });
24635
24498
  function createInitialEventFiltersLoadState() {
24636
24499
  return {
@@ -24701,13 +24564,12 @@ function getEventFiltersError(state) {
24701
24564
  * const events = await api.getPublicEvents(params);
24702
24565
  * ```
24703
24566
  */
24704
- function useEventFilters({ showCategoryFilter = "auto", showVenueFilter = false, showStaffFilter = false, preFilterCategoryIds, preFilterStaffMemberId, preFilterVenueId, preFilterKind, preFilterEventSurface, preFilterEventPresets, preFilterScheduleScope } = {}) {
24567
+ function useEventFilters({ showCategoryFilter = "auto", showVenueFilter = false, showStaffFilter = false, preFilterCategoryIds, preFilterStaffMemberId, preFilterVenueId, preFilterEventSurface, preFilterEventPresets, preFilterScheduleScope } = {}) {
24705
24568
  const api = useBlockApi();
24706
24569
  const [loadState, dispatchLoadState] = useReducer(eventFiltersLoadReducer, void 0, createInitialEventFiltersLoadState);
24707
24570
  const filters = getEventFiltersData(loadState);
24708
24571
  const loading = isEventFiltersLoading(loadState);
24709
24572
  const error = getEventFiltersError(loadState);
24710
- const [selectedKind, setSelectedKindState] = useState("all");
24711
24573
  const [selectedCategoryId, setSelectedCategoryId] = useState("all");
24712
24574
  const [selectedStaffMemberId, setSelectedStaffMemberId] = useState("all");
24713
24575
  const [selectedVenueId, setSelectedVenueId] = useState("all");
@@ -24715,21 +24577,19 @@ function useEventFilters({ showCategoryFilter = "auto", showVenueFilter = false,
24715
24577
  const allowedCategorySet = useMemo(() => new Set(allowedCategoryIds), [allowedCategoryIds.join(",")]);
24716
24578
  const fixedVenueId = useMemo(() => normalizeOptionalId(preFilterVenueId), [preFilterVenueId]);
24717
24579
  const fixedStaffMemberId = useMemo(() => normalizeOptionalId(preFilterStaffMemberId), [preFilterStaffMemberId]);
24718
- const fixedKind = useMemo(() => normalizeEventBlockKind(preFilterKind), [preFilterKind]);
24719
24580
  const fixedEventSurface = preFilterEventSurface && preFilterEventSurface !== "all" ? preFilterEventSurface : void 0;
24720
24581
  const fixedEventPresets = preFilterEventPresets?.trim() || void 0;
24721
24582
  const fixedScheduleScope = preFilterScheduleScope && preFilterScheduleScope !== "any" ? preFilterScheduleScope : void 0;
24722
24583
  const hasFetchedRef = useRef(false);
24723
24584
  useEffect(() => {
24724
24585
  if (hasFetchedRef.current) return;
24725
- if (!(showCategoryFilter !== "never" && fixedKind !== "courses" || showVenueFilter || showStaffFilter)) return;
24586
+ if (!(showCategoryFilter !== "never" || showVenueFilter || showStaffFilter)) return;
24726
24587
  hasFetchedRef.current = true;
24727
24588
  dispatchLoadState({ type: "started" });
24728
24589
  api.getEventFilters({
24729
24590
  categoryIds: allowedCategoryIds.length > 0 ? allowedCategoryIds.join(",") : void 0,
24730
24591
  venueId: fixedVenueId ?? void 0,
24731
24592
  staffMemberId: fixedStaffMemberId ?? void 0,
24732
- kind: fixedKind === "all" ? void 0 : fixedKind,
24733
24593
  eventSurface: fixedEventSurface,
24734
24594
  eventPresets: fixedEventPresets,
24735
24595
  scheduleScope: fixedScheduleScope
@@ -24749,7 +24609,6 @@ function useEventFilters({ showCategoryFilter = "auto", showVenueFilter = false,
24749
24609
  api,
24750
24610
  fixedEventPresets,
24751
24611
  fixedEventSurface,
24752
- fixedKind,
24753
24612
  fixedScheduleScope,
24754
24613
  fixedStaffMemberId,
24755
24614
  fixedVenueId,
@@ -24777,23 +24636,10 @@ function useEventFilters({ showCategoryFilter = "auto", showVenueFilter = false,
24777
24636
  return available.filter((staffMember) => staffMember.id === fixedStaffMemberId);
24778
24637
  }, [filters.staffMembers, fixedStaffMemberId]);
24779
24638
  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
24639
  if (selectedCategoryId !== "all") {
24789
24640
  if (!categoriesForSelect.some((c) => c.id === selectedCategoryId)) setSelectedCategoryId("all");
24790
24641
  }
24791
- }, [
24792
- categoriesForSelect,
24793
- fixedKind,
24794
- selectedCategoryId,
24795
- selectedKind
24796
- ]);
24642
+ }, [categoriesForSelect, selectedCategoryId]);
24797
24643
  useEffect(() => {
24798
24644
  if (fixedVenueId) {
24799
24645
  setSelectedVenueId("all");
@@ -24822,12 +24668,10 @@ function useEventFilters({ showCategoryFilter = "auto", showVenueFilter = false,
24822
24668
  ]);
24823
24669
  const shouldShowCategoryFilter = (() => {
24824
24670
  if (showCategoryFilter === "never") return false;
24825
- if (fixedKind === "courses") return false;
24826
24671
  if (allowedCategoryIds.length > 0 && allowedCategoryIds.length <= 1) return false;
24827
24672
  if (showCategoryFilter === "always") return categoriesForSelect.length > 0;
24828
24673
  return categoriesForSelect.length > 1;
24829
24674
  })();
24830
- const showCourseOption = fixedKind === "all" && !Boolean(fixedEventSurface || fixedEventPresets || fixedScheduleScope);
24831
24675
  const shouldShowVenueFilter = (() => {
24832
24676
  if (!showVenueFilter) return false;
24833
24677
  if (fixedVenueId) return false;
@@ -24838,76 +24682,13 @@ function useEventFilters({ showCategoryFilter = "auto", showVenueFilter = false,
24838
24682
  if (fixedStaffMemberId) return false;
24839
24683
  return staffMembersForSelect.length > 1;
24840
24684
  })();
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
24685
  const setSelectedCategory = useCallback((id) => {
24848
- if (fixedKind === "courses") return;
24849
24686
  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
- ]);
24687
+ }, []);
24906
24688
  return {
24907
24689
  categories: categoriesForSelect,
24908
24690
  venues: venuesForSelect,
24909
24691
  staffMembers: staffMembersForSelect,
24910
- selectedKind,
24911
24692
  selectedCategoryId,
24912
24693
  selectedStaffMemberId,
24913
24694
  selectedVenueId,
@@ -24916,15 +24697,46 @@ function useEventFilters({ showCategoryFilter = "auto", showVenueFilter = false,
24916
24697
  shouldShowCategoryFilter,
24917
24698
  shouldShowVenueFilter,
24918
24699
  shouldShowStaffFilter,
24919
- showCourseOption,
24920
- courseOptionLabel: filters.labels.courseOption,
24921
- hasActiveFilters,
24922
- setSelectedKind,
24700
+ hasActiveFilters: useMemo(() => {
24701
+ return selectedCategoryId !== "all" || selectedStaffMemberId !== "all" || selectedVenueId !== "all";
24702
+ }, [
24703
+ selectedCategoryId,
24704
+ selectedStaffMemberId,
24705
+ selectedVenueId
24706
+ ]),
24923
24707
  setSelectedCategoryId: setSelectedCategory,
24924
24708
  setSelectedStaffMemberId,
24925
24709
  setSelectedVenueId,
24926
- resetFilters,
24927
- getFilterParams
24710
+ resetFilters: useCallback(() => {
24711
+ setSelectedCategoryId("all");
24712
+ setSelectedStaffMemberId("all");
24713
+ setSelectedVenueId("all");
24714
+ }, []),
24715
+ getFilterParams: useCallback(() => {
24716
+ const params = {};
24717
+ if (fixedEventSurface) params.eventSurface = fixedEventSurface;
24718
+ if (fixedEventPresets) params.eventPresets = fixedEventPresets;
24719
+ if (fixedScheduleScope) params.scheduleScope = fixedScheduleScope;
24720
+ if (allowedCategoryIds.length > 0) params.categoryIds = allowedCategoryIds.join(",");
24721
+ if (selectedCategoryId !== "all") {
24722
+ if (allowedCategoryIds.length === 0 || allowedCategorySet.has(selectedCategoryId)) params.categoryIds = selectedCategoryId;
24723
+ }
24724
+ if (fixedVenueId) params.venueId = fixedVenueId;
24725
+ if (selectedVenueId !== "all") params.venueId = selectedVenueId;
24726
+ params.staffMemberId = fixedStaffMemberId ?? (selectedStaffMemberId !== "all" ? selectedStaffMemberId : void 0);
24727
+ return params;
24728
+ }, [
24729
+ allowedCategoryIds,
24730
+ allowedCategorySet,
24731
+ fixedEventPresets,
24732
+ fixedEventSurface,
24733
+ fixedScheduleScope,
24734
+ fixedStaffMemberId,
24735
+ fixedVenueId,
24736
+ selectedCategoryId,
24737
+ selectedStaffMemberId,
24738
+ selectedVenueId
24739
+ ])
24928
24740
  };
24929
24741
  }
24930
24742
  //#endregion
@@ -24938,7 +24750,6 @@ const EventListingController = ({ render }) => {
24938
24750
  const filtersIdBase = useId();
24939
24751
  const initialListEvents = useMemo(() => [...display.events], [display.events]);
24940
24752
  const initialListFilters = useMemo(() => buildEventRuntimeFilters({
24941
- eventKind: hydration.eventKind,
24942
24753
  eventSurface: hydration.eventSurface,
24943
24754
  filterEventPresets: hydration.filterEventPresets,
24944
24755
  scheduleScope: hydration.scheduleScope,
@@ -24946,7 +24757,6 @@ const EventListingController = ({ render }) => {
24946
24757
  filterStaffMemberId: hydration.filterStaffMemberId,
24947
24758
  filterVenueId: hydration.filterVenueId
24948
24759
  }), [
24949
- hydration.eventKind,
24950
24760
  hydration.eventSurface,
24951
24761
  hydration.filterEventPresets,
24952
24762
  hydration.scheduleScope,
@@ -24954,14 +24764,13 @@ const EventListingController = ({ render }) => {
24954
24764
  hydration.filterStaffMemberId,
24955
24765
  hydration.filterVenueId
24956
24766
  ]);
24957
- const { categories, venues, staffMembers, selectedKind, selectedCategoryId, selectedStaffMemberId, selectedVenueId, loading: filtersLoading, shouldShowCategoryFilter, shouldShowVenueFilter, shouldShowStaffFilter, showCourseOption, courseOptionLabel, hasActiveFilters, setSelectedKind, setSelectedCategoryId, setSelectedStaffMemberId, setSelectedVenueId, resetFilters, getFilterParams } = useEventFilters({
24767
+ const { categories, venues, staffMembers, selectedCategoryId, selectedStaffMemberId, selectedVenueId, loading: filtersLoading, shouldShowCategoryFilter, shouldShowVenueFilter, shouldShowStaffFilter, hasActiveFilters, setSelectedCategoryId, setSelectedStaffMemberId, setSelectedVenueId, resetFilters, getFilterParams } = useEventFilters({
24958
24768
  showCategoryFilter: hydration.showFilters ? hydration.showCategoryFilter : "never",
24959
24769
  showVenueFilter: hydration.showFilters ? hydration.showVenueFilter : false,
24960
24770
  showStaffFilter: hydration.showFilters ? hydration.showStaffFilter : false,
24961
24771
  preFilterCategoryIds: hydration.filterCategoryIds ?? void 0,
24962
24772
  preFilterStaffMemberId: hydration.filterStaffMemberId ?? void 0,
24963
24773
  preFilterVenueId: hydration.filterVenueId ?? void 0,
24964
- preFilterKind: hydration.eventKind,
24965
24774
  preFilterEventSurface: hydration.eventSurface,
24966
24775
  preFilterEventPresets: hydration.filterEventPresets,
24967
24776
  preFilterScheduleScope: hydration.scheduleScope
@@ -24982,16 +24791,12 @@ const EventListingController = ({ render }) => {
24982
24791
  categories,
24983
24792
  venues,
24984
24793
  staffMembers,
24985
- selectedKind,
24986
24794
  selectedCategoryId,
24987
24795
  selectedStaffMemberId,
24988
24796
  selectedVenueId,
24989
24797
  showCategoryFilter: shouldShowCategoryFilter,
24990
24798
  showVenueFilter: shouldShowVenueFilter,
24991
24799
  showStaffFilter: shouldShowStaffFilter,
24992
- showCourseOption,
24993
- courseOptionLabel,
24994
- onKindChange: setSelectedKind,
24995
24800
  onCategoryChange: setSelectedCategoryId,
24996
24801
  onStaffMemberChange: setSelectedStaffMemberId,
24997
24802
  onVenueChange: setSelectedVenueId,
@@ -25161,7 +24966,6 @@ function useCalendarEventCache({ viewDate, initialEvents = [], preloadMonths = 1
25161
24966
  filters?.categoryIds,
25162
24967
  filters?.eventPresets,
25163
24968
  filters?.eventSurface,
25164
- filters?.kind,
25165
24969
  filters?.scheduleScope,
25166
24970
  filters?.staffMemberId,
25167
24971
  filters?.venueId
@@ -25198,7 +25002,6 @@ function useCalendarEventCache({ viewDate, initialEvents = [], preloadMonths = 1
25198
25002
  limit: CALENDAR_FETCH_LIMIT,
25199
25003
  stage,
25200
25004
  detailLevel: "listing",
25201
- kind: filters?.kind,
25202
25005
  eventSurface: filters?.eventSurface,
25203
25006
  eventPresets: filters?.eventPresets,
25204
25007
  scheduleScope: filters?.scheduleScope,
@@ -25232,7 +25035,6 @@ function useCalendarEventCache({ viewDate, initialEvents = [], preloadMonths = 1
25232
25035
  filters?.categoryIds,
25233
25036
  filters?.eventPresets,
25234
25037
  filters?.eventSurface,
25235
- filters?.kind,
25236
25038
  filters?.scheduleScope,
25237
25039
  filters?.staffMemberId,
25238
25040
  filters?.venueId,
@@ -25640,7 +25442,6 @@ function toEventCombinedControllerProps(props) {
25640
25442
  showCategoryFilter: props.render.display.showCategoryFilter,
25641
25443
  showVenueFilter: props.render.display.showVenueFilter,
25642
25444
  showStaffFilter: props.render.display.showStaffFilter,
25643
- eventKind: props.render.display.eventKind,
25644
25445
  eventSurface: props.render.display.eventSurface,
25645
25446
  filterEventPresets: props.render.display.filterEventPresets,
25646
25447
  scheduleScope: props.render.display.scheduleScope,
@@ -25665,7 +25466,7 @@ function toEventCombinedControllerProps(props) {
25665
25466
  const EventCombinedClient = ({ events: initialEvents, siteId, stage, listLayout = "stack", listColumns = "3", eventsPerPage = 12, paginationAction = {
25666
25467
  kind: "loadMore",
25667
25468
  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 }) => {
25469
+ }, 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
25470
  const fetchInitialEventsOnMount = initialEvents == null;
25670
25471
  const resolvedShowFilters = showFilters ?? true;
25671
25472
  const resolvedShowVenueFilter = showVenueFilter ?? false;
@@ -25686,20 +25487,18 @@ const EventCombinedClient = ({ events: initialEvents, siteId, stage, listLayout
25686
25487
  setCalendarView(initialCalendarView);
25687
25488
  }, [initialCalendarView]);
25688
25489
  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({
25490
+ const { categories, venues, staffMembers, selectedCategoryId, selectedStaffMemberId, selectedVenueId, loading: filtersLoading, shouldShowCategoryFilter, shouldShowVenueFilter, shouldShowStaffFilter, hasActiveFilters, setSelectedCategoryId, setSelectedStaffMemberId, setSelectedVenueId, resetFilters, getFilterParams } = useEventFilters({
25690
25491
  showCategoryFilter: resolvedShowFilters ? showCategoryFilter : "never",
25691
25492
  showVenueFilter: resolvedShowFilters ? resolvedShowVenueFilter : false,
25692
25493
  showStaffFilter: resolvedShowFilters ? resolvedShowStaffFilter : false,
25693
25494
  preFilterCategoryIds: filterCategoryIds,
25694
25495
  preFilterStaffMemberId: filterStaffMemberId,
25695
25496
  preFilterVenueId: filterVenueId,
25696
- preFilterKind: eventKind,
25697
25497
  preFilterEventSurface: resolvedEventSurface,
25698
25498
  preFilterEventPresets: filterEventPresets,
25699
25499
  preFilterScheduleScope: resolvedScheduleScope
25700
25500
  });
25701
25501
  const initialListFilters = useMemo(() => buildEventRuntimeFilters({
25702
- eventKind,
25703
25502
  eventSurface: resolvedEventSurface,
25704
25503
  filterEventPresets,
25705
25504
  scheduleScope: resolvedScheduleScope,
@@ -25707,7 +25506,6 @@ const EventCombinedClient = ({ events: initialEvents, siteId, stage, listLayout
25707
25506
  filterStaffMemberId,
25708
25507
  filterVenueId
25709
25508
  }), [
25710
- eventKind,
25711
25509
  resolvedEventSurface,
25712
25510
  filterCategoryIds,
25713
25511
  filterEventPresets,
@@ -25784,16 +25582,12 @@ const EventCombinedClient = ({ events: initialEvents, siteId, stage, listLayout
25784
25582
  categories,
25785
25583
  venues,
25786
25584
  staffMembers,
25787
- selectedKind,
25788
25585
  selectedCategoryId,
25789
25586
  selectedStaffMemberId,
25790
25587
  selectedVenueId,
25791
25588
  showCategoryFilter: shouldShowCategoryFilter,
25792
25589
  showVenueFilter: shouldShowVenueFilter,
25793
25590
  showStaffFilter: shouldShowStaffFilter,
25794
- showCourseOption,
25795
- courseOptionLabel,
25796
- onKindChange: setSelectedKind,
25797
25591
  onCategoryChange: setSelectedCategoryId,
25798
25592
  onStaffMemberChange: setSelectedStaffMemberId,
25799
25593
  onVenueChange: setSelectedVenueId,
@@ -26077,7 +25871,6 @@ const EventCalendarClient = ({ render }) => {
26077
25871
  showCategoryFilter: display.showCategoryFilter,
26078
25872
  showVenueFilter: display.showVenueFilter,
26079
25873
  showStaffFilter: display.showStaffFilter,
26080
- eventKind: display.eventKind,
26081
25874
  eventSurface: display.eventSurface,
26082
25875
  filterEventPresets: display.filterEventPresets,
26083
25876
  scheduleScope: display.scheduleScope,
@@ -26218,7 +26011,6 @@ function useEventCalendarFilterState(display) {
26218
26011
  preFilterCategoryIds: display.filterCategoryIds,
26219
26012
  preFilterStaffMemberId: display.filterStaffMemberId,
26220
26013
  preFilterVenueId: display.filterVenueId,
26221
- preFilterKind: display.eventKind,
26222
26014
  preFilterEventSurface: display.eventSurface,
26223
26015
  preFilterEventPresets: display.filterEventPresets,
26224
26016
  preFilterScheduleScope: display.scheduleScope
@@ -26230,16 +26022,12 @@ function useEventCalendarFilterState(display) {
26230
26022
  categories: filterState.categories,
26231
26023
  venues: filterState.venues,
26232
26024
  staffMembers: filterState.staffMembers,
26233
- selectedKind: filterState.selectedKind,
26234
26025
  selectedCategoryId: filterState.selectedCategoryId,
26235
26026
  selectedStaffMemberId: filterState.selectedStaffMemberId,
26236
26027
  selectedVenueId: filterState.selectedVenueId,
26237
26028
  showCategoryFilter: filterState.shouldShowCategoryFilter,
26238
26029
  showVenueFilter: filterState.shouldShowVenueFilter,
26239
26030
  showStaffFilter: filterState.shouldShowStaffFilter,
26240
- showCourseOption: filterState.showCourseOption,
26241
- courseOptionLabel: filterState.courseOptionLabel,
26242
- onKindChange: filterState.setSelectedKind,
26243
26031
  onCategoryChange: filterState.setSelectedCategoryId,
26244
26032
  onStaffMemberChange: filterState.setSelectedStaffMemberId,
26245
26033
  onVenueChange: filterState.setSelectedVenueId,
@@ -26250,7 +26038,6 @@ function useEventCalendarFilterState(display) {
26250
26038
  }
26251
26039
  function usePrefetchedCalendarEvents(display, listFilters) {
26252
26040
  const initialFilters = useMemo(() => buildDisplayFilterParams(display), [
26253
- display.eventKind,
26254
26041
  display.eventSurface,
26255
26042
  display.filterCategoryIds,
26256
26043
  display.filterEventPresets,
@@ -26268,7 +26055,6 @@ function usePrefetchedCalendarEvents(display, listFilters) {
26268
26055
  }
26269
26056
  function buildDisplayFilterParams(display) {
26270
26057
  return buildEventRuntimeFilters({
26271
- eventKind: display.eventKind,
26272
26058
  eventSurface: display.eventSurface,
26273
26059
  filterEventPresets: display.filterEventPresets,
26274
26060
  scheduleScope: display.scheduleScope,
@@ -36850,10 +36636,10 @@ function LinkedEntryEditEventBridge() {
36850
36636
  //#region ../preview-next/src/client/preview/PreviewShellLayout.tsx
36851
36637
  const previewContainerResponsiveEnabled = process.env.NEXT_PUBLIC_ENABLE_PREVIEW_CONTAINER_RESPONSIVE !== "false";
36852
36638
  const PreviewEditorSidebar = React.lazy(async () => {
36853
- return { default: (await import("./PreviewEditorSidebar-DvJFmC29.mjs")).PreviewEditorSidebar };
36639
+ return { default: (await import("./PreviewEditorSidebar-DBmAJJkQ.mjs")).PreviewEditorSidebar };
36854
36640
  });
36855
36641
  const PreviewEditorUI = React.lazy(async () => {
36856
- return { default: (await import("./PreviewEditorUI-DVHP4bCo.mjs")).PreviewEditorUI };
36642
+ return { default: (await import("./PreviewEditorUI-CfGaz9cY.mjs")).PreviewEditorUI };
36857
36643
  });
36858
36644
  const previewPaneContainmentStyle = {
36859
36645
  contain: "layout paint",
@@ -39343,7 +39129,7 @@ async function callDirectLoaderApiEndpoint(dashboardApiClient, endpoint, params)
39343
39129
  }
39344
39130
  }
39345
39131
  function isBatchableEndpoint(endpoint) {
39346
- return endpoint === "listPublicEvents" || endpoint === "getPublicEventDetails" || endpoint === "listPublicCourses" || endpoint === "listPublicRouteCandidates" || endpoint === "listPublicTeamMembers" || endpoint === "listPublicProducts" || endpoint === "getPublicBookingServices" || endpoint === "getPublicWeeklySlotAvailability" || endpoint === "getPublicFormById";
39132
+ return endpoint === "listPublicEvents" || endpoint === "getPublicEventDetails" || endpoint === "listPublicWholeSeriesOfferings" || endpoint === "listPublicRouteCandidates" || endpoint === "listPublicTeamMembers" || endpoint === "listPublicProducts" || endpoint === "getPublicBookingServices" || endpoint === "getPublicWeeklySlotAvailability" || endpoint === "getPublicFormById";
39347
39133
  }
39348
39134
  function buildBatchLoaderRequest(id, endpoint, params) {
39349
39135
  switch (endpoint) {
@@ -39369,7 +39155,7 @@ function buildBatchLoaderRequest(id, endpoint, params) {
39369
39155
  endpoint
39370
39156
  };
39371
39157
  }
39372
- case "listPublicCourses": {
39158
+ case "listPublicWholeSeriesOfferings": {
39373
39159
  const typedParams = params;
39374
39160
  return typedParams ? {
39375
39161
  id,
@@ -39475,7 +39261,7 @@ function toBatchParams(endpoint, params) {
39475
39261
  });
39476
39262
  return Object.keys(p).length ? p : void 0;
39477
39263
  }
39478
- if (endpoint === "listPublicCourses") {
39264
+ if (endpoint === "listPublicWholeSeriesOfferings") {
39479
39265
  const p = stripUndefined({ limit: params.limit || void 0 });
39480
39266
  return Object.keys(p).length ? p : void 0;
39481
39267
  }