@riverbankcms/sdk 0.138.0 → 0.140.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 (293) hide show
  1. package/README.md +12 -16
  2. package/dist/{PreviewEditorSidebar-BVPur_CU.mjs → PreviewEditorSidebar-CUyTzd5z.mjs} +4 -4
  3. package/dist/{PreviewEditorUI-DLhWX8oh.mjs → PreviewEditorUI-Agkw4v5i.mjs} +3 -3
  4. package/dist/{PreviewQueryProvider-BguJY1SW.mjs → PreviewQueryProvider-CN0ewic5.mjs} +1 -1
  5. package/dist/{SdkPreviewModeRuntime-Tda6qw4z.mjs → SdkPreviewModeRuntime-DdbeAdS8.mjs} +62 -28
  6. package/dist/{SiteChromeCustomizeContext-BHFgMjde.mjs → SiteChromeCustomizeContext-CqGOz-Kv.mjs} +8467 -5616
  7. package/dist/_dts/ai/src/contracts/proposals.d.ts +264 -495
  8. package/dist/_dts/ai/src/contracts/siteStyleProposalSchemas.d.ts +221 -242
  9. package/dist/_dts/api/src/accessAdmin.d.ts +74 -104
  10. package/dist/_dts/api/src/aiEndpoints.d.ts +5 -1
  11. package/dist/_dts/api/src/authSubmission.d.ts +46 -0
  12. package/dist/_dts/api/src/billing.d.ts +18 -7
  13. package/dist/_dts/api/src/billingEndpointDefinitions.d.ts +23 -0
  14. package/dist/_dts/api/src/billingEndpointTypes.d.ts +26 -0
  15. package/dist/_dts/api/src/blocks.d.ts +2 -0
  16. package/dist/_dts/api/src/bookingRecords.d.ts +1 -2
  17. package/dist/_dts/api/src/commercePortalEndpoints.d.ts +8 -1
  18. package/dist/_dts/api/src/communications.d.ts +0 -1
  19. package/dist/_dts/api/src/contentRuntime.d.ts +16 -4
  20. package/dist/_dts/api/src/endpoints.d.ts +275 -167
  21. package/dist/_dts/api/src/event-destination-policy.d.ts +2 -1
  22. package/dist/_dts/api/src/footerSettings.d.ts +10 -10
  23. package/dist/_dts/api/src/index.d.ts +11 -10
  24. package/dist/_dts/api/src/indexCoreTypes.d.ts +1 -1
  25. package/dist/_dts/api/src/indexExtendedTypes.d.ts +1 -1
  26. package/dist/_dts/api/src/mailchimpIntegration.d.ts +2 -59
  27. package/dist/_dts/api/src/mailingListIntegration.d.ts +123 -0
  28. package/dist/_dts/api/src/navigation/dashboardSettingsNav.d.ts +1 -1
  29. package/dist/_dts/api/src/navigation/locations.d.ts +1 -0
  30. package/dist/_dts/api/src/navigation/types.d.ts +1 -1
  31. package/dist/_dts/api/src/navigation.d.ts +1 -26
  32. package/dist/_dts/api/src/newsletterEndpointDefinitions.d.ts +109 -2
  33. package/dist/_dts/api/src/onboarding/confirmationResend.d.ts +25 -0
  34. package/dist/_dts/api/src/onboarding/surfaceData.d.ts +185 -0
  35. package/dist/_dts/api/src/privacyPolicy.d.ts +74 -2
  36. package/dist/_dts/api/src/publicBookingAvailabilityEndpointDefinitions.d.ts +14 -6
  37. package/dist/_dts/api/src/publicEventEndpointDefinitions.d.ts +1 -1
  38. package/dist/_dts/api/src/publicExperience/commerceEndpoints.d.ts +1 -0
  39. package/dist/_dts/api/src/publicExperience/eventEndpoints.d.ts +11 -3
  40. package/dist/_dts/api/src/publicExperience/newsletterEndpoints.d.ts +2 -4
  41. package/dist/_dts/api/src/publicExperience/sharedTypes.d.ts +9 -49
  42. package/dist/_dts/api/src/publicOnboardingAttemptEndpointDefinitions.d.ts +65 -0
  43. package/dist/_dts/api/src/publicReadEndpointDefinitions.d.ts +73 -0
  44. package/dist/_dts/api/src/saveOutcome.d.ts +20 -0
  45. package/dist/_dts/api/src/schemas/site-api-keys.d.ts +1 -1
  46. package/dist/_dts/api/src/sdkContracts.d.ts +5 -32
  47. package/dist/_dts/api/src/sdkPushContracts.d.ts +18 -0
  48. package/dist/_dts/api/src/sdkThemeWire.d.ts +46 -46
  49. package/dist/_dts/api/src/settings/permissions.d.ts +12 -0
  50. package/dist/_dts/api/src/siteManagementEndpoints.d.ts +9 -34
  51. package/dist/_dts/api/src/siteOnboarding.d.ts +84 -228
  52. package/dist/_dts/api/src/sitePlatformEndpoints.d.ts +3 -13
  53. package/dist/_dts/api/src/siteRuntimeEndpoints.d.ts +3 -1
  54. package/dist/_dts/api/src/siteSettings.d.ts +38 -6
  55. package/dist/_dts/api/src/types.d.ts +78 -77
  56. package/dist/_dts/api/src/wholeSeriesRuns.d.ts +2 -37
  57. package/dist/_dts/billing/src/membership/index.d.ts +17 -7
  58. package/dist/_dts/billing/src/plans/display.d.ts +15 -0
  59. package/dist/_dts/billing/src/plans/registry.d.ts +2 -0
  60. package/dist/_dts/billing/src/plans/standing.d.ts +19 -0
  61. package/dist/_dts/billing/src/plans/types.d.ts +4 -7
  62. package/dist/_dts/billing/src/site-arrangements.d.ts +14 -3
  63. package/dist/_dts/billing/src/subscriptions/evidence.d.ts +12 -0
  64. package/dist/_dts/billing/src/subscriptions/standingEvidence.d.ts +31 -0
  65. package/dist/_dts/billing/src/subscriptions/store.d.ts +23 -5
  66. package/dist/_dts/blocks/src/PageRenderer.d.ts +6 -15
  67. package/dist/_dts/blocks/src/client.d.ts +1 -1
  68. package/dist/_dts/blocks/src/contracts/proof-block-islands.d.ts +48 -20
  69. package/dist/_dts/blocks/src/pageRenderAdmission.d.ts +2 -0
  70. package/dist/_dts/blocks/src/pageRendererContracts.d.ts +9 -0
  71. package/dist/_dts/blocks/src/pageRenderingMode.d.ts +12 -6
  72. package/dist/_dts/blocks/src/portal/types.d.ts +2 -4
  73. package/dist/_dts/blocks/src/portal/waitlist-types.d.ts +35 -0
  74. package/dist/_dts/blocks/src/system/blocks/appointment-services.d.ts +11 -0
  75. package/dist/_dts/blocks/src/system/blocks/contact-newsletter.d.ts +39 -66
  76. package/dist/_dts/blocks/src/system/blocks/event-registration.d.ts +2 -0
  77. package/dist/_dts/blocks/src/system/blocks/events/shared/schemas.d.ts +42 -0
  78. package/dist/_dts/blocks/src/system/blocks/events/shared/types.d.ts +4 -0
  79. package/dist/_dts/blocks/src/system/blocks/newsletter-signup.d.ts +39 -114
  80. package/dist/_dts/blocks/src/system/blocks/offerings-preview/catalogue.d.ts +18 -0
  81. package/dist/_dts/blocks/src/system/blocks/offerings-preview/fields.d.ts +2 -0
  82. package/dist/_dts/blocks/src/system/blocks/offerings-preview/index.d.ts +4 -0
  83. package/dist/_dts/blocks/src/system/blocks/site-footer-runtime.d.ts +7 -13
  84. package/dist/_dts/blocks/src/system/constants/blockKinds.d.ts +1 -1
  85. package/dist/_dts/blocks/src/system/data/index.d.ts +4 -4
  86. package/dist/_dts/blocks/src/system/data/loaderEndpoints.d.ts +1 -1
  87. package/dist/_dts/blocks/src/system/data/prefetchBlockData.d.ts +2 -1
  88. package/dist/_dts/blocks/src/system/data/publicLoaderCachePolicy.d.ts +2 -74
  89. package/dist/_dts/blocks/src/system/data/types.d.ts +9 -0
  90. package/dist/_dts/blocks/src/system/fragments/library/newsletterForm.d.ts +33 -100
  91. package/dist/_dts/blocks/src/system/registry.d.ts +1 -0
  92. package/dist/_dts/blocks/src/system/runtime/api/client.d.ts +0 -28
  93. package/dist/_dts/blocks/src/system/runtime/api/index.d.ts +1 -1
  94. package/dist/_dts/blocks/src/system/runtime/api/types/events.d.ts +7 -3
  95. package/dist/_dts/blocks/src/system/runtime/api/types/newsletter.d.ts +5 -15
  96. package/dist/_dts/blocks/src/system/runtime/api/types/portal.d.ts +1 -1
  97. package/dist/_dts/blocks/src/system/runtime/api/types/waitlist-claims.d.ts +7 -2
  98. package/dist/_dts/blocks/src/system/runtime/components/registry.client.d.ts +78 -30
  99. package/dist/_dts/blocks/src/system/runtime/components/runtime-backed-blocks.d.ts +39 -15
  100. package/dist/_dts/blocks/src/system/runtime/hooks/useCalendarEvents.d.ts +3 -0
  101. package/dist/_dts/blocks/src/system/runtime/hooks/useCalendarEvents.state.d.ts +1 -1
  102. package/dist/_dts/blocks/src/system/runtime/hooks/useCalendarToday.d.ts +22 -0
  103. package/dist/_dts/blocks/src/system/runtime/nodes/appointment-services.d.ts +94 -0
  104. package/dist/_dts/blocks/src/system/runtime/nodes/event-registration/EventRegistrationSurface.d.ts +1 -2
  105. package/dist/_dts/blocks/src/system/runtime/nodes/event-registration/TicketSelectionStep.d.ts +2 -0
  106. package/dist/_dts/blocks/src/system/runtime/nodes/event-registration/checkoutRecovery.d.ts +14 -0
  107. package/dist/_dts/blocks/src/system/runtime/nodes/event-registration/eventSourceRecovery.d.ts +56 -0
  108. package/dist/_dts/blocks/src/system/runtime/nodes/event-registration/types.d.ts +6 -8
  109. package/dist/_dts/blocks/src/system/runtime/nodes/event-registration/useCheckoutRecovery.d.ts +8 -0
  110. package/dist/_dts/blocks/src/system/runtime/nodes/event-registration/useEventRegistrationSubmit.d.ts +8 -7
  111. package/dist/_dts/blocks/src/system/runtime/nodes/event-registration/useEventRegistrationWizard.d.ts +12 -2
  112. package/dist/_dts/blocks/src/system/runtime/nodes/event-registration/useEventSourceRecovery.d.ts +18 -0
  113. package/dist/_dts/blocks/src/system/runtime/nodes/event-registration.client.d.ts +1 -1
  114. package/dist/_dts/blocks/src/system/runtime/nodes/event-registration.interactive.d.ts +24 -7
  115. package/dist/_dts/blocks/src/system/runtime/nodes/event-registration.server.d.ts +4 -2
  116. package/dist/_dts/blocks/src/system/runtime/nodes/events/EventCombined.client.d.ts +28 -0
  117. package/dist/_dts/blocks/src/system/runtime/nodes/events/domain/bookability.d.ts +9 -0
  118. package/dist/_dts/blocks/src/system/runtime/nodes/events/domain/dates.d.ts +14 -0
  119. package/dist/_dts/blocks/src/system/runtime/nodes/events/domain/duration.d.ts +2 -0
  120. package/dist/_dts/blocks/src/system/runtime/nodes/events/domain/index.d.ts +4 -0
  121. package/dist/_dts/blocks/src/system/runtime/nodes/events/domain/location.d.ts +2 -0
  122. package/dist/_dts/blocks/src/system/runtime/nodes/events/domain/quickDates.d.ts +16 -0
  123. package/dist/_dts/blocks/src/system/runtime/nodes/events/shared/AgendaEventCard.d.ts +9 -1
  124. package/dist/_dts/blocks/src/system/runtime/nodes/events/shared/CalendarDayCell.d.ts +2 -0
  125. package/dist/_dts/blocks/src/system/runtime/nodes/events/shared/CalendarDayHeaders.d.ts +4 -0
  126. package/dist/_dts/blocks/src/system/runtime/nodes/events/shared/DayEventsModal.d.ts +2 -1
  127. package/dist/_dts/blocks/src/system/runtime/nodes/events/shared/EventCard.d.ts +5 -0
  128. package/dist/_dts/blocks/src/system/runtime/nodes/events/shared/EventModals.d.ts +2 -1
  129. package/dist/_dts/blocks/src/system/runtime/nodes/events/shared/EventQuickDates.d.ts +15 -0
  130. package/dist/_dts/blocks/src/system/runtime/nodes/events/shared/WeekAgendaView.d.ts +7 -3
  131. package/dist/_dts/blocks/src/system/runtime/nodes/events/shared/WeekTimetableView.d.ts +1 -0
  132. package/dist/_dts/blocks/src/system/runtime/nodes/events/shared/index.d.ts +2 -0
  133. package/dist/_dts/blocks/src/system/runtime/nodes/events/shared/timetableModel.d.ts +1 -0
  134. package/dist/_dts/blocks/src/system/runtime/nodes/events/shared/useHydrationReady.d.ts +6 -0
  135. package/dist/_dts/blocks/src/system/runtime/nodes/newsletter-form.client.state.d.ts +3 -0
  136. package/dist/_dts/blocks/src/system/runtime/nodes/newsletter-form.interactive.d.ts +62 -33
  137. package/dist/_dts/blocks/src/system/runtime/nodes/newsletter-form.submission.d.ts +3 -3
  138. package/dist/_dts/blocks/src/system/runtime/nodes/newsletter-form.types.d.ts +14 -31
  139. package/dist/_dts/blocks/src/system/runtime/nodes/offerings-preview-catalogue.d.ts +14 -0
  140. package/dist/_dts/blocks/src/system/runtime/nodes/offerings-preview-content.d.ts +23 -0
  141. package/dist/_dts/blocks/src/system/runtime/nodes/offerings-preview.d.ts +4 -2
  142. package/dist/_dts/blocks/src/system/runtime/resolver.d.ts +1 -0
  143. package/dist/_dts/blocks/src/system/runtime/shared/components/index.d.ts +2 -6
  144. package/dist/_dts/blocks/src/system/runtime/shared/index.d.ts +2 -2
  145. package/dist/_dts/blocks/src/system/runtime/shared/useWaitlistClaim.d.ts +2 -0
  146. package/dist/_dts/blocks/src/system/transforms/registry/formatting.d.ts +5 -0
  147. package/dist/_dts/commerce/src/purchase/event-registration-errors.d.ts +4 -0
  148. package/dist/_dts/commerce/src/purchase/index.d.ts +1 -0
  149. package/dist/_dts/commerce/src/purchase/orderItemMetadata.d.ts +32 -16
  150. package/dist/_dts/commerce/src/purchase/stripeCommissionMetadata.d.ts +34 -0
  151. package/dist/_dts/content-editor/src/controller/EntryControllerProvider.d.ts +2 -1
  152. package/dist/_dts/content-editor/src/footerEngagementDraft.d.ts +6 -24
  153. package/dist/_dts/content-editor/src/hooks/useBlockAutosave.d.ts +3 -1
  154. package/dist/_dts/content-editor/src/useFooterComposerState.d.ts +4 -2
  155. package/dist/_dts/core/src/branded.d.ts +0 -8
  156. package/dist/_dts/core/src/footer-engagement.d.ts +2 -6
  157. package/dist/_dts/core/src/index.d.ts +10 -1
  158. package/dist/_dts/core/src/mailing-list-identifiers.d.ts +21 -0
  159. package/dist/_dts/core/src/mailing-list-runtime.d.ts +42 -0
  160. package/dist/_dts/core/src/mailing-list-setup-parser.d.ts +14 -0
  161. package/dist/_dts/core/src/mailing-list-setup.d.ts +142 -0
  162. package/dist/_dts/core/src/mailing-list-submission.d.ts +224 -0
  163. package/dist/_dts/core/src/mailing-list-targeting-parser.d.ts +12 -0
  164. package/dist/_dts/core/src/mailing-list-targeting.d.ts +93 -0
  165. package/dist/_dts/core/src/navigation-locations.d.ts +28 -0
  166. package/dist/_dts/core/src/participants.d.ts +2 -29
  167. package/dist/_dts/core/src/public-experience.d.ts +4 -0
  168. package/dist/_dts/core/src/public-profile.d.ts +35 -1
  169. package/dist/_dts/core/src/public-read-cache-contract.d.ts +45 -0
  170. package/dist/_dts/core/src/site-route-target.d.ts +9 -2
  171. package/dist/_dts/db/src/generated/supabase/database.types.d.ts +797 -954
  172. package/dist/_dts/editor-blocks/src/widgets/index.d.ts +1 -0
  173. package/dist/_dts/editor-blocks/src/widgets/mailing-list-targeting/MailingListGlobalSettingsSummary.d.ts +10 -0
  174. package/dist/_dts/editor-blocks/src/widgets/mailing-list-targeting/MailingListTargetingField.d.ts +12 -0
  175. package/dist/_dts/editor-blocks/src/widgets/mailing-list-targeting/context.d.ts +14 -0
  176. package/dist/_dts/editor-blocks/src/widgets/mailing-list-targeting/index.d.ts +3 -0
  177. package/dist/_dts/editor-blocks/src/widgets/mailing-list-targeting/loaders.d.ts +7 -0
  178. package/dist/_dts/editor-blocks/src/widgets/mailing-list-targeting/targetingState.d.ts +19 -0
  179. package/dist/_dts/preview-next/src/client/widgets/widgetOverrides.d.ts +1 -0
  180. package/dist/_dts/sdk/src/client/publicAppointmentReadOperations.d.ts +12 -0
  181. package/dist/_dts/sdk/src/client/publicEventReadOperations.d.ts +2 -1
  182. package/dist/_dts/sdk/src/client/publicLoaderCacheAccess.d.ts +11 -4
  183. package/dist/_dts/sdk/src/config/content-types.d.ts +3 -13
  184. package/dist/_dts/sdk/src/config/content-validation.d.ts +5 -8
  185. package/dist/_dts/sdk/src/constants.d.ts +3 -3
  186. package/dist/_dts/sdk/src/contracts/index.d.ts +1 -1
  187. package/dist/_dts/sdk/src/contracts/system-block-content.d.ts +12 -31
  188. package/dist/_dts/sdk/src/navigation/index.d.ts +11 -29
  189. package/dist/_dts/sdk/src/next/index.d.ts +4 -4
  190. package/dist/_dts/sdk/src/prebuild/types.d.ts +1 -5
  191. package/dist/_dts/sdk/src/public-api/contracts.d.ts +44 -33
  192. package/dist/_dts/sdk/src/rendering/blocks-page-renderer.d.ts +5 -0
  193. package/dist/_dts/sdk/src/rendering/client.d.ts +3 -20
  194. package/dist/_dts/sdk/src/rendering/components/pageShared.d.ts +5 -0
  195. package/dist/_dts/sdk/src/rendering/helpers/loadContent.d.ts +4 -0
  196. package/dist/_dts/sdk/src/rendering/helpers/pageRuntimeSupport.d.ts +8 -1
  197. package/dist/_dts/sdk/src/rendering/helpers/templateContent.d.ts +1 -0
  198. package/dist/_dts/sdk/src/rendering/index.d.ts +1 -1
  199. package/dist/_dts/sdk/src/types/block-kinds.d.ts +1 -1
  200. package/dist/_dts/sdk/src/version.d.ts +1 -1
  201. package/dist/_dts/theme-core/src/accordions/types.d.ts +3 -3
  202. package/dist/_dts/theme-core/src/cards/types.d.ts +21 -21
  203. package/dist/_dts/theme-core/src/generated/containerResponsiveThemeCss.d.ts +1 -1
  204. package/dist/_dts/theme-core/src/header/interactionPalette.d.ts +8 -2
  205. package/dist/_dts/theme-core/src/header/legacyHeaderVariant.d.ts +2 -2
  206. package/dist/_dts/theme-core/src/hosted-booking-appearance.d.ts +41 -0
  207. package/dist/_dts/theme-core/src/index.d.ts +1 -0
  208. package/dist/_dts/theme-core/src/inputs/types.d.ts +2 -2
  209. package/dist/_dts/theme-core/src/mock-themes/all.d.ts +54 -54
  210. package/dist/_dts/theme-core/src/runtime/buildThemeRuntime.d.ts +0 -1
  211. package/dist/_dts/theme-core/src/runtime/buildThemeRuntimeFromBridge.d.ts +1 -4
  212. package/dist/_dts/theme-core/src/schema.d.ts +84 -84
  213. package/dist/_dts/theme-core/src/shared/componentStyles.d.ts +1 -1
  214. package/dist/_dts/theme-core/src/site-styles/backgroundAppearance.d.ts +2 -2
  215. package/dist/_dts/theme-core/src/surfaces/foregroundInteraction.d.ts +77 -0
  216. package/dist/_dts/theme-core/src/surfaces/index.d.ts +1 -0
  217. package/dist/_dts/theme-core/src/tokens/tokens.d.ts +7 -0
  218. package/dist/_dts/theme-core/src/typography/generateTypographyCss.d.ts +2 -2
  219. package/dist/_dts/ui/src/badge.d.ts +1 -1
  220. package/dist/_dts/ui/src/callout.d.ts +1 -1
  221. package/dist/_dts/ui/src/lib/use-delayed-flag.d.ts +9 -0
  222. package/dist/_dts/ui/src/pending-button.d.ts +10 -0
  223. package/dist/client/{BookingConsentAgreement-DQUik1Mx.mjs → BookingConsentAgreement-CuKa82V4.mjs} +4 -4
  224. package/dist/client/{DiscountCodeDisclosure-CU67Q4vH.mjs → DiscountCodeDisclosure-BbYieKWB.mjs} +1 -1
  225. package/dist/client/{EventCombined.client-a02TXUgg.mjs → EventCombined.client-LTfR1Aby.mjs} +444 -200
  226. package/dist/client/{EventListing.client-99qx7jFl.mjs → EventListing.client-DUHpYSuo.mjs} +2 -2
  227. package/dist/client/{LeafletStaticMap-CWzcq73L.mjs → LeafletStaticMap-CHRupL6m.mjs} +1 -1
  228. package/dist/client/{accordion-D1nb3-Oj.mjs → accordion-6HiIFxNL.mjs} +1 -1
  229. package/dist/client/{bookingForm-BGrmLhaO.mjs → bookingForm-Dlmid43H.mjs} +7 -7
  230. package/dist/client/bookings.mjs +368 -142
  231. package/dist/client/{carousel-DSmOx3ad.mjs → carousel-DmkZRRq_.mjs} +2 -2
  232. package/dist/client/{carousel.client-59G_WMr4.mjs → carousel.client-DQTjCVQT.mjs} +1 -1
  233. package/dist/client/{cart-COWeOIUk.mjs → cart-CIC24330.mjs} +3 -3
  234. package/dist/client/{checkout-CeysaIJK.mjs → checkout-D1Zw9imo.mjs} +3 -3
  235. package/dist/client/{checkoutUrls-BuseL0dw.mjs → checkoutUrls-FL6lRkrt.mjs} +1 -1
  236. package/dist/client/client.mjs +5017 -2258
  237. package/dist/client/{colorStyles-CrxJrPjJ.mjs → colorStyles-3013aRAY.mjs} +3 -1
  238. package/dist/client/{context-DBzX85Xc.mjs → context-Cy1OayHx.mjs} +9 -21
  239. package/dist/client/{dates-DCYhZBlW.mjs → dates-aDcfoLHr.mjs} +21 -3
  240. package/dist/client/{eventCalendar-BgsN73Ul.mjs → eventCalendar-FQxMPAjf.mjs} +81 -79
  241. package/dist/client/{eventCombined-DcZQAMQP.mjs → eventCombined-Dr3ac6Hb.mjs} +3 -3
  242. package/dist/client/{eventDetails-BWwGJ54l.mjs → eventDetails-D-AzUHFQ.mjs} +4 -4
  243. package/dist/client/{eventListing-DqYqV8vp.mjs → eventListing-B3XxBf3i.mjs} +3 -3
  244. package/dist/client/{eventRegistration-DQGDgu_e.mjs → eventRegistration-I6EaokFD.mjs} +543 -155
  245. package/dist/client/{form-ClfpasVT.mjs → form-BbWckVWY.mjs} +3 -3
  246. package/dist/client/{headerSection-BuOMe98N.mjs → headerSection-C9qU4Y7x.mjs} +2 -2
  247. package/dist/client/hooks.mjs +1685 -716
  248. package/dist/client/{locationMap-CEqu_sfa.mjs → locationMap-CLCShvlG.mjs} +3 -3
  249. package/dist/client/{media-BOHuueS5.mjs → media-DHpfFwd3.mjs} +1 -1
  250. package/dist/client/newsletterForm-Briukxzi.mjs +444 -0
  251. package/dist/client/{pricing-xj7MPZlK.mjs → pricing-Copadu-2.mjs} +1 -1
  252. package/dist/client/{productDetail-vxqTt5Xj.mjs → productDetail-oujlRd-r.mjs} +3 -3
  253. package/dist/client/{productList-OTdZu8sb.mjs → productList-BRiIRUcd.mjs} +3 -3
  254. package/dist/client/{propsDecoder-CY9gGEF7.mjs → propsDecoder-CB2KS_ko.mjs} +706 -160
  255. package/dist/client/rendering/client.mjs +3161 -1226
  256. package/dist/client/rendering/islands.mjs +19 -19
  257. package/dist/client/rendering.mjs +4864 -1914
  258. package/dist/client/{scrollToBlock--BFV6kl-.mjs → scrollToBlock-B1IS1_ua.mjs} +1 -1
  259. package/dist/client/{shop-CP4YbDL9.mjs → shop-Vn6yNFED.mjs} +6 -6
  260. package/dist/client/{shop-commerce-APs4XBXE.mjs → shop-commerce-BVTqipYp.mjs} +7 -7
  261. package/dist/client/{shop-commerce-store-CAVLxLFr.mjs → shop-commerce-store-BVnJVy7v.mjs} +1 -1
  262. package/dist/client/{shopShared-BnSRrwXI.mjs → shopShared-COIeK77T.mjs} +4 -4
  263. package/dist/client/{useEventFilters-1a1by4c8.mjs → useEventFilters-DzIUcS9n.mjs} +58 -11
  264. package/dist/preview-next/before-render.mjs +357 -175
  265. package/dist/preview-next/client/runtime.mjs +4 -4
  266. package/dist/preview-next/keepAlive.mjs +357 -175
  267. package/dist/preview-next/middleware.mjs +357 -175
  268. package/dist/{previewAuthStore-BkEgnYPP.mjs → previewAuthStore-Gjb6r6vz.mjs} +357 -175
  269. package/dist/{sdk-runtime-DwGfsT0S.mjs → sdk-runtime-CnCLvZRv.mjs} +2 -2
  270. package/dist/{separator-BeqDLneQ.mjs → separator-DKDRJ1oH.mjs} +1 -1
  271. package/dist/server/components.mjs +3389 -1251
  272. package/dist/server/config-validation.mjs +2737 -1784
  273. package/dist/server/config.mjs +2742 -1788
  274. package/dist/server/data.mjs +1586 -615
  275. package/dist/server/index.mjs +496 -352
  276. package/dist/server/navigation.mjs +16 -47
  277. package/dist/server/next.mjs +3978 -2007
  278. package/dist/server/page-converter.mjs +1109 -553
  279. package/dist/server/prebuild.mjs +2 -3
  280. package/dist/server/rendering/server.mjs +4101 -1951
  281. package/dist/server/rendering.mjs +3416 -1259
  282. package/dist/server/routing.mjs +1869 -786
  283. package/dist/server/server.mjs +3260 -2482
  284. package/dist/server/theme-bridge.mjs +725 -124
  285. package/dist/server/theme.mjs +8 -2
  286. package/dist/styles/index.css +526 -68
  287. package/package.json +1 -1
  288. package/dist/_dts/api/src/navigation/identity.d.ts +0 -59
  289. package/dist/_dts/blocks/src/system/blocks/newsletter-signup-destination.d.ts +0 -291
  290. package/dist/_dts/blocks/src/system/runtime/shared/components/BookingOptionCompactRow.d.ts +0 -29
  291. package/dist/_dts/blocks/src/system/runtime/shared/components/BookingOptionList.d.ts +0 -13
  292. package/dist/_dts/core/src/newsletter-signup-destination.d.ts +0 -38
  293. package/dist/client/newsletterForm-IbrHjMxy.mjs +0 -322
@@ -2523,6 +2523,11 @@ function assertNever$3(value, message = "Unexpected variant") {
2523
2523
  }
2524
2524
  //#endregion
2525
2525
  //#region ../core/src/currency-format.ts
2526
+ const CURRENCY_CODE_INPUT_PATTERN = /^[A-Za-z]{3}$/;
2527
+ /** Parse + normalize a currency code, or return null if it isn't a 3-letter code. */
2528
+ function parseCurrencyCode(value) {
2529
+ return CURRENCY_CODE_INPUT_PATTERN.test(value) ? value.toUpperCase() : null;
2530
+ }
2526
2531
  const CURRENCY_LOCALE_BY_CODE = {
2527
2532
  USD: "en-US",
2528
2533
  GBP: "en-GB",
@@ -6873,8 +6878,14 @@ const headerInteractionPillPaletteValues = [
6873
6878
  "accent"
6874
6879
  ];
6875
6880
  /**
6876
- * "No pill": the nav link keeps whatever hover treatment its recipe compiled,
6877
- * and the palette step writes nothing at all (#1318 Phase 4c decision 2).
6881
+ * "No pill": a colour change on hover rather than a filled background.
6882
+ *
6883
+ * The palette step writes nothing (#1318 Phase 4c decision 2), but on a
6884
+ * foreground-adaptive style that is not the end of the story: the hover colour
6885
+ * is derived from the resolved opening foreground at render time, paired with
6886
+ * the resting colour, so `quiet` resolves to a definite colour rather than to
6887
+ * whatever brand token the recipe happened to name. See
6888
+ * `applyOpeningForeground`.
6878
6889
  *
6879
6890
  * It exists because "a colour change on hover, no filled background" was not
6880
6891
  * expressible in the vocabulary, and it is what
@@ -7856,6 +7867,28 @@ const bookingRequirementConsentFieldSchema = z.object({
7856
7867
  z.union([blockBookingConsentSchema, bookingRequirementConsentFieldSchema]);
7857
7868
  //#endregion
7858
7869
  //#region ../blocks/src/system/blocks/events/shared/schemas.ts
7870
+ const publicEventLoaderQuerySchemaShape = {
7871
+ limit: z.string().optional(),
7872
+ from: z.string().optional(),
7873
+ to: z.string().optional(),
7874
+ afterStartsAt: z.string().optional(),
7875
+ afterId: z.string().optional(),
7876
+ categoryIds: z.string().optional(),
7877
+ venueId: z.string().optional(),
7878
+ staffMemberId: z.string().optional(),
7879
+ eventSurface: z.string().optional(),
7880
+ eventPresets: z.string().optional(),
7881
+ scheduleScope: z.string().optional(),
7882
+ seriesId: z.string().optional(),
7883
+ seriesIds: z.string().optional(),
7884
+ runSeriesId: z.string().optional(),
7885
+ seriesSlug: z.string().optional(),
7886
+ includeOccurrenceId: z.string().optional(),
7887
+ readIntent: z.string().optional(),
7888
+ detailLevel: z.string().optional(),
7889
+ readProfile: z.string().optional()
7890
+ };
7891
+ z.object(publicEventLoaderQuerySchemaShape);
7859
7892
  const eventPresetSchema = z.enum([
7860
7893
  "event",
7861
7894
  "class",
@@ -8722,6 +8755,9 @@ function isApiSuccessResponse(json) {
8722
8755
  * });
8723
8756
  * ```
8724
8757
  */
8758
+ function publicEventsQuery(params) {
8759
+ return { ...params ?? {} };
8760
+ }
8725
8761
  function createBlockApi(config) {
8726
8762
  const { baseUrl, auth, authOverrides, siteId, isPreview } = config;
8727
8763
  const dedup = createDeduplicationCache({ ttl: 100 });
@@ -8874,23 +8910,7 @@ function createBlockApi(config) {
8874
8910
  const path = buildPath(EVENTS.list.path, { siteId: sid });
8875
8911
  return request(EVENTS.list, {
8876
8912
  path,
8877
- query: {
8878
- from: params?.from,
8879
- to: params?.to,
8880
- afterStartsAt: params?.afterStartsAt,
8881
- afterId: params?.afterId,
8882
- limit: params?.limit,
8883
- stage: params?.stage,
8884
- eventSurface: params?.eventSurface,
8885
- eventPresets: params?.eventPresets,
8886
- scheduleScope: params?.scheduleScope,
8887
- categoryIds: params?.categoryIds,
8888
- venueId: params?.venueId,
8889
- staffMemberId: params?.staffMemberId,
8890
- seriesId: params?.seriesId,
8891
- includeOccurrenceId: params?.includeOccurrenceId,
8892
- detailLevel: params?.detailLevel
8893
- }
8913
+ query: publicEventsQuery(params)
8894
8914
  });
8895
8915
  },
8896
8916
  async getEventFilters(params) {
@@ -8954,7 +8974,7 @@ function createBlockApi(config) {
8954
8974
  const path = buildPath(WHOLE_SERIES.waitlistClaimResolve.path, { siteId: sid });
8955
8975
  return request(WHOLE_SERIES.waitlistClaimResolve, {
8956
8976
  path,
8957
- body: { claimToken: data.claimToken }
8977
+ body: data
8958
8978
  });
8959
8979
  },
8960
8980
  async getDiscountsAvailable(data) {
@@ -9043,8 +9063,9 @@ function createBlockApi(config) {
9043
9063
  name: data.name,
9044
9064
  company: data.company,
9045
9065
  phone: data.phone,
9046
- target: data.target,
9047
- tags: data.tags,
9066
+ sourceRef: data.sourceRef,
9067
+ setupRevision: data.setupRevision,
9068
+ visitorSelection: data.visitorSelection,
9048
9069
  meta: data.meta
9049
9070
  }
9050
9071
  });
@@ -14861,61 +14882,6 @@ const BookingFormClient$1 = ({ siteId: siteIdProp, render }) => {
14861
14882
  });
14862
14883
  };
14863
14884
  //#endregion
14864
- //#region ../blocks/src/system/runtime/nodes/event-registration/registrationErrorRecovery.ts
14865
- function resolveRegistrationRecoveryAction(step, action) {
14866
- if (step === "payment-failed") return "payment-options";
14867
- if (step === "verifying-payment" || step === "verifying-timeout" || step === "redirecting") return "payment-status";
14868
- return action;
14869
- }
14870
- function canRecoverToWaitlist(eligibility) {
14871
- return Boolean(eligibility?.isFull && eligibility.canJoinWaitlist);
14872
- }
14873
- function shouldRefreshAfterRegistrationError(step, action, enabled) {
14874
- return enabled || step === "error" && action === "places";
14875
- }
14876
- function resetRegistrationAfterExpiry(input) {
14877
- input.dispatchFlow({
14878
- type: "reset",
14879
- hasPreSelectedContext: input.hasPreSelectedContext
14880
- });
14881
- input.setSelectedTicketLines([]);
14882
- input.setSelectedSlidingAmountInput("");
14883
- const mode = input.preSelectedEvent?.deliveryMode;
14884
- input.setSelectedAttendanceMode(mode === "online" || mode === "in_person" ? mode : null);
14885
- input.setErrorMessage("");
14886
- input.setPendingRegistrationReference(null);
14887
- }
14888
- /** Recovery never starts another payment. Unknown payment outcomes go to the portal. */
14889
- function recoverRegistrationError(action, handlers) {
14890
- switch (action) {
14891
- case "none": return;
14892
- case "portal":
14893
- case "payment-status":
14894
- window.location.assign("/portal");
14895
- return;
14896
- case "event":
14897
- window.location.assign(window.location.pathname);
14898
- return;
14899
- case "retry":
14900
- window.location.reload();
14901
- return;
14902
- case "details":
14903
- handlers.clearError();
14904
- handlers.setStep("enter-details");
14905
- return;
14906
- case "payment-options":
14907
- case "places":
14908
- handlers.refreshOptions();
14909
- handlers.clearError();
14910
- handlers.setStep(action === "places" ? handlers.canJoinWaitlist ? "enter-details" : "select-tickets" : "select-payment");
14911
- return;
14912
- case "start":
14913
- handlers.refreshOptions();
14914
- handlers.reset();
14915
- return;
14916
- }
14917
- }
14918
- //#endregion
14919
14885
  //#region ../blocks/src/system/runtime/nodes/events/domain/capacity.ts
14920
14886
  /**
14921
14887
  * Compute remaining spots for an event from `availableSpots` with a fallback
@@ -14985,6 +14951,166 @@ function resolveRuntimeEventDestination(event) {
14985
14951
  };
14986
14952
  }
14987
14953
  //#endregion
14954
+ //#region ../blocks/src/system/runtime/nodes/event-registration/checkoutRecovery.ts
14955
+ /** Recovery may select held places; checkout still owns admission and payment validation. */
14956
+ function checkoutRecoveryOptionAvailability(availability) {
14957
+ if (availability.kind === "available" || availability.reason === "sold_out" || availability.reason === "overallCapacityUnavailable") return {
14958
+ kind: "available",
14959
+ remainingPlaces: null
14960
+ };
14961
+ return availability;
14962
+ }
14963
+ /**
14964
+ * A form-only projection for the explicit existing-checkout path. It permits
14965
+ * collecting the original selection without claiming a new place is available.
14966
+ * The public checkout service identifies the customer and remains the admission
14967
+ * authority; no reservation/customer data is exposed through this projection.
14968
+ */
14969
+ function getCheckoutRecoveryFormEligibility(eligibility) {
14970
+ if (!eligibility || eligibility.registration.kind !== "none" && eligibility.registration.kind !== "pending_payment" || eligibility.availability.kind === "unavailable" && eligibility.availability.reason !== "full" && eligibility.availability.reason !== "selectionRequired") return eligibility;
14971
+ const amountCents = eligibility.price ?? 0;
14972
+ if (amountCents <= 0 || !eligibility.currency || eligibility.availability.kind === "unavailable" && eligibility.availability.reason === "selectionRequired") return eligibility.registration.kind === "pending_payment" ? {
14973
+ ...eligibility,
14974
+ registration: { kind: "none" },
14975
+ ticketTypes: eligibility.ticketTypes.map((option) => ({
14976
+ ...option,
14977
+ availability: checkoutRecoveryOptionAvailability(option.availability)
14978
+ }))
14979
+ } : eligibility;
14980
+ const currency = eligibility.currency;
14981
+ const paymentOptions = eligibility.paymentTerms.allowedOptions.map((option) => {
14982
+ switch (option.kind) {
14983
+ case "upfront": return {
14984
+ kind: "payInFull",
14985
+ amountCents,
14986
+ currency
14987
+ };
14988
+ case "deferred_manual": return {
14989
+ kind: "deferredManual",
14990
+ amountCents,
14991
+ currency
14992
+ };
14993
+ case "instalment_plan": return {
14994
+ kind: "instalmentPlan",
14995
+ amountCents,
14996
+ currency
14997
+ };
14998
+ case "flexible_balance": return {
14999
+ kind: "flexibleBalance",
15000
+ amountCents,
15001
+ currency
15002
+ };
15003
+ }
15004
+ });
15005
+ return {
15006
+ ...eligibility,
15007
+ registration: { kind: "none" },
15008
+ availability: {
15009
+ kind: "available",
15010
+ remainingPlaces: null,
15011
+ waitlistEnabled: eligibility.waitlistEnabled
15012
+ },
15013
+ eligible: paymentOptions.length > 0,
15014
+ isFull: false,
15015
+ canJoinWaitlist: false,
15016
+ isFree: false,
15017
+ requiresPayment: true,
15018
+ canPayDirectly: paymentOptions.length > 0,
15019
+ paymentOptions,
15020
+ eligiblePasses: [],
15021
+ eligibleMemberships: [],
15022
+ ticketTypes: eligibility.ticketTypes.map((option) => ({
15023
+ ...option,
15024
+ availability: checkoutRecoveryOptionAvailability(option.availability)
15025
+ }))
15026
+ };
15027
+ }
15028
+ function canJoinWaitlistOutsideRecovery(event, attendanceMode, checkoutRecovery) {
15029
+ return !checkoutRecovery && event !== null && canJoinEventWaitlist(event, { attendanceMode });
15030
+ }
15031
+ //#endregion
15032
+ //#region ../blocks/src/system/runtime/nodes/event-registration/useCheckoutRecovery.ts
15033
+ /** Recovery belongs to the selected booking subject; changing events resets its scope. */
15034
+ function useCheckoutRecovery(event, setStep) {
15035
+ const [recoveryEventId, setRecoveryEventId] = useState(null);
15036
+ return {
15037
+ checkoutRecovery: event !== null && recoveryEventId === event.selectionId,
15038
+ startCheckoutRecovery: useCallback(() => {
15039
+ if (!event) return;
15040
+ setRecoveryEventId(event.selectionId);
15041
+ setStep("select-tickets");
15042
+ }, [event, setStep])
15043
+ };
15044
+ }
15045
+ /** Authenticated pending bookings enter the same form-only recovery path as guests. */
15046
+ function useCheckoutRecoveryEligibility(eligibility, step, checkoutRecovery, startCheckoutRecovery) {
15047
+ const registrationKind = eligibility?.registration.kind;
15048
+ useEffect(() => {
15049
+ if ((step === "select-event" || step === "select-tickets" || step === "enter-details" || step === "select-payment") && registrationKind === "pending_payment" && !checkoutRecovery) startCheckoutRecovery();
15050
+ }, [
15051
+ registrationKind,
15052
+ step,
15053
+ checkoutRecovery,
15054
+ startCheckoutRecovery
15055
+ ]);
15056
+ return useMemo(() => checkoutRecovery ? getCheckoutRecoveryFormEligibility(eligibility) : eligibility, [checkoutRecovery, eligibility]);
15057
+ }
15058
+ //#endregion
15059
+ //#region ../blocks/src/system/runtime/nodes/event-registration/registrationErrorRecovery.ts
15060
+ function resolveRegistrationRecoveryAction(step, action) {
15061
+ if (step === "payment-failed") return "payment-options";
15062
+ if (step === "verifying-payment" || step === "verifying-timeout" || step === "redirecting") return "payment-status";
15063
+ return action;
15064
+ }
15065
+ function canRecoverToWaitlist(eligibility) {
15066
+ return Boolean(eligibility?.isFull && eligibility.canJoinWaitlist);
15067
+ }
15068
+ function shouldRefreshAfterRegistrationError(step, action, enabled) {
15069
+ return enabled || step === "error" && action === "places";
15070
+ }
15071
+ function resetRegistrationAfterExpiry(input) {
15072
+ input.dispatchFlow({
15073
+ type: "reset",
15074
+ hasPreSelectedContext: input.hasPreSelectedContext
15075
+ });
15076
+ input.setSelectedTicketLines([]);
15077
+ input.setSelectedSlidingAmountInput("");
15078
+ const mode = input.preSelectedEvent?.deliveryMode;
15079
+ input.setSelectedAttendanceMode(mode === "online" || mode === "in_person" ? mode : null);
15080
+ input.setErrorMessage("");
15081
+ input.setPendingRegistrationReference(null);
15082
+ }
15083
+ /** Recovery never starts another payment. Unknown payment outcomes go to the portal. */
15084
+ function recoverRegistrationError(action, handlers) {
15085
+ switch (action) {
15086
+ case "none": return;
15087
+ case "portal":
15088
+ case "payment-status":
15089
+ window.location.assign("/portal");
15090
+ return;
15091
+ case "event":
15092
+ window.location.assign(window.location.pathname);
15093
+ return;
15094
+ case "retry":
15095
+ window.location.reload();
15096
+ return;
15097
+ case "details":
15098
+ handlers.clearError();
15099
+ handlers.setStep("enter-details");
15100
+ return;
15101
+ case "payment-options":
15102
+ case "places":
15103
+ handlers.refreshOptions();
15104
+ handlers.clearError();
15105
+ handlers.setStep(action === "places" ? handlers.canJoinWaitlist ? "enter-details" : "select-tickets" : "select-payment");
15106
+ return;
15107
+ case "start":
15108
+ handlers.refreshOptions();
15109
+ handlers.reset();
15110
+ return;
15111
+ }
15112
+ }
15113
+ //#endregion
14988
15114
  //#region ../blocks/src/system/runtime/nodes/event-registration/validation.ts
14989
15115
  function createInitialRegistrationFormData() {
14990
15116
  return {
@@ -15462,6 +15588,40 @@ const SharedDatedOfferingOrderCheckoutSessionMetadataSchema = z.object({
15462
15588
  ...datedOfferingSharedEngineMetadataShape
15463
15589
  });
15464
15590
  z.union([SharedDatedOfferingOrderCheckoutSessionMetadataSchema, LegacyOrderCheckoutSessionMetadataSchema]);
15591
+ //#endregion
15592
+ //#region ../commerce/src/purchase/stripeCommissionMetadata.ts
15593
+ /** Reasons are payment evidence, not an independent pricing policy. */
15594
+ const STRIPE_COMMISSION_FREE_REASONS = [
15595
+ "managed_billing",
15596
+ "no_commission_plan",
15597
+ "billing_evidence_invalid",
15598
+ "fee_rounds_to_zero",
15599
+ "non_commissionable_scope",
15600
+ "payment_not_stripe"
15601
+ ];
15602
+ const historicalContext = {
15603
+ currency: z.string().refine((value) => parseCurrencyCode(value) !== null).optional(),
15604
+ sourcePlanId: z.string().trim().min(1).optional()
15605
+ };
15606
+ const percentSchema = z.number().finite().min(0).max(100);
15607
+ z.discriminatedUnion("kind", [
15608
+ z.object({
15609
+ kind: z.literal("commission_free"),
15610
+ reason: z.enum(STRIPE_COMMISSION_FREE_REASONS),
15611
+ ...historicalContext
15612
+ }),
15613
+ z.object({
15614
+ kind: z.literal("application_fee_amount"),
15615
+ amountCents: z.number().int().nonnegative().max(Number.MAX_SAFE_INTEGER),
15616
+ percent: percentSchema,
15617
+ ...historicalContext
15618
+ }),
15619
+ z.object({
15620
+ kind: z.literal("application_fee_percent"),
15621
+ percent: percentSchema,
15622
+ ...historicalContext
15623
+ })
15624
+ ]);
15465
15625
  toNonNegativeCents(0);
15466
15626
  //#endregion
15467
15627
  //#region ../commerce/src/purchase/event-registration-errors.ts
@@ -15474,6 +15634,10 @@ const eventRegistrationErrors = {
15474
15634
  message: "We’re checking your booking and payment. Please don’t try to book again yet. If you’ve already paid, you don’t need to pay again.",
15475
15635
  action: "payment-status"
15476
15636
  },
15637
+ paymentProviderUnavailable: {
15638
+ message: "We couldn’t reach the payment provider. Please try again in a minute.",
15639
+ action: "retry"
15640
+ },
15477
15641
  paymentPageUnavailable: {
15478
15642
  message: "We couldn’t open the payment page. Please refresh this page and try again. If this keeps happening, contact the organiser for help.",
15479
15643
  action: "retry"
@@ -15596,11 +15760,6 @@ function ensureWaitlistClaimLocationTracking() {
15596
15760
  } catch {}
15597
15761
  window.addEventListener("popstate", emitWaitlistClaimLocationChange);
15598
15762
  }
15599
- function getWaitlistClaimTokenFromUrl() {
15600
- if (typeof window === "undefined") return null;
15601
- const token = new URLSearchParams(window.location.search).get("waitlist_claim")?.trim() ?? "";
15602
- return token.length > 0 ? token : null;
15603
- }
15604
15763
  const useWaitlistClaimDeps = { useBlockApi };
15605
15764
  function subscribeToWaitlistClaimToken(callback) {
15606
15765
  if (typeof window === "undefined") return () => {};
@@ -15610,28 +15769,42 @@ function subscribeToWaitlistClaimToken(callback) {
15610
15769
  window.removeEventListener(WAITLIST_CLAIM_LOCATION_EVENT, callback);
15611
15770
  };
15612
15771
  }
15613
- function getWaitlistClaimTokenSnapshot() {
15614
- return getWaitlistClaimTokenFromUrl();
15772
+ function getWaitlistClaimLocationSnapshot() {
15773
+ return typeof window === "undefined" ? "" : window.location.search;
15774
+ }
15775
+ function parseWaitlistClaimCredential(search) {
15776
+ const params = new URLSearchParams(search);
15777
+ const token = params.get("waitlist_claim")?.trim();
15778
+ if (token) return {
15779
+ kind: "emailedToken",
15780
+ token
15781
+ };
15782
+ const entryId = params.get("waitlistEntry")?.trim();
15783
+ return entryId ? {
15784
+ kind: "portalOwnedEntry",
15785
+ entryId
15786
+ } : null;
15615
15787
  }
15616
15788
  function useWaitlistClaim() {
15617
15789
  return useWaitlistClaimWithDeps(useWaitlistClaimDeps);
15618
15790
  }
15619
15791
  function useWaitlistClaimWithDeps(deps) {
15620
- return useResolvedWaitlistClaim(deps, useSyncExternalStore(subscribeToWaitlistClaimToken, getWaitlistClaimTokenSnapshot, () => null));
15792
+ const locationSearch = useSyncExternalStore(subscribeToWaitlistClaimToken, getWaitlistClaimLocationSnapshot, () => "");
15793
+ return useResolvedWaitlistClaim(deps, useMemo(() => parseWaitlistClaimCredential(locationSearch), [locationSearch]));
15621
15794
  }
15622
- function useResolvedWaitlistClaim(deps, token) {
15795
+ function useResolvedWaitlistClaim(deps, credential) {
15623
15796
  const api = deps.useBlockApi();
15624
- const [state, dispatch] = useReducer(waitlistClaimReducer, Boolean(token), createInitialWaitlistClaimState);
15797
+ const [state, dispatch] = useReducer(waitlistClaimReducer, Boolean(credential), createInitialWaitlistClaimState);
15625
15798
  useEffect(() => {
15626
15799
  let cancelled = false;
15627
15800
  async function resolveClaim() {
15628
- if (!token) {
15801
+ if (!credential) {
15629
15802
  dispatch({ type: "cleared" });
15630
15803
  return;
15631
15804
  }
15632
15805
  dispatch({ type: "started" });
15633
15806
  try {
15634
- const result = await api.resolveWaitlistClaim({ claimToken: token });
15807
+ const result = credential.kind === "portalOwnedEntry" ? await api.resolveWaitlistClaim({ waitlistEntryId: credential.entryId }) : await api.resolveWaitlistClaim({ claimToken: credential.token });
15635
15808
  if (cancelled) return;
15636
15809
  dispatch({
15637
15810
  type: "resolved",
@@ -15649,9 +15822,10 @@ function useResolvedWaitlistClaim(deps, token) {
15649
15822
  return () => {
15650
15823
  cancelled = true;
15651
15824
  };
15652
- }, [api, token]);
15825
+ }, [api, credential]);
15653
15826
  return {
15654
- token,
15827
+ token: credential?.kind === "emailedToken" ? credential.token : null,
15828
+ entryId: credential?.kind === "portalOwnedEntry" ? credential.entryId : null,
15655
15829
  claim: getWaitlistClaim(state),
15656
15830
  error: getWaitlistClaimError(state),
15657
15831
  loginMessage: getWaitlistClaimLoginMessage(state),
@@ -16133,15 +16307,12 @@ function useEventRegistrationSubmitWithDeps(options, deps) {
16133
16307
  * landed — a success, or a hand-off to checkout — because until then nobody
16134
16308
  * knows whether the first one committed.
16135
16309
  *
16136
- * Reusing it after a failure is safe even if the customer edits their
16137
- * details. The server consults the command record before it re-checks
16138
- * anything, so a submission that already booked is answered with the booking
16139
- * that exists — not refused for spending a credit or a claim that this very
16140
- * command already spent, and not treated as a second booking because a name
16141
- * or a note changed in between.
16310
+ * Identical retries retain the command after a lost response. Changed form
16311
+ * details get a new command so the server applies the new booking intent.
16142
16312
  */
16143
- const commandIdRef = useRef(null);
16144
- return async (method, passId, membershipId, selection, submitOptions) => {
16313
+ const commandRef = useRef(null);
16314
+ const inFlightRef = useRef(null);
16315
+ const submit = async (method, passId, membershipId, selection, submitOptions) => {
16145
16316
  const target = options.registrationTarget;
16146
16317
  if (!target) return {
16147
16318
  ok: false,
@@ -16149,44 +16320,34 @@ function useEventRegistrationSubmitWithDeps(options, deps) {
16149
16320
  message: "Select an event to continue."
16150
16321
  };
16151
16322
  options.setStep("submitting");
16152
- const registrationCommandId = commandIdRef.current ?? deps.createClientCommandId();
16153
- commandIdRef.current = registrationCommandId;
16323
+ const registrationCommandId = commandRef.current?.id ?? deps.createClientCommandId();
16154
16324
  try {
16155
- const prepared = prepareSubmitContext(options, registrationCommandId, target, method, passId, membershipId, selection);
16325
+ let prepared = prepareSubmitContext(options, registrationCommandId, target, method, passId, membershipId, selection);
16156
16326
  if (prepared.subject.kind === "wholeSeries" && method === "stripe") {
16157
- commandIdRef.current = null;
16327
+ commandRef.current = null;
16158
16328
  return await submitWholeSeriesCheckout(options, deps, {
16159
16329
  ...prepared,
16160
16330
  subject: prepared.subject
16161
16331
  }, submitOptions);
16162
16332
  }
16333
+ const request = buildOccurrenceRegistrationRequest(options, prepared, method, passId, membershipId);
16334
+ const intentKey = registrationRequestIntentKey(request);
16335
+ if (commandRef.current !== null && commandRef.current.intentKey !== intentKey) prepared = {
16336
+ ...prepared,
16337
+ registrationCommandId: deps.createClientCommandId()
16338
+ };
16339
+ commandRef.current = {
16340
+ id: prepared.registrationCommandId,
16341
+ intentKey
16342
+ };
16163
16343
  const result = await options.api.registerForEvent({
16164
- registrationCommandId: prepared.registrationCommandId,
16165
- subject: prepared.subject,
16166
- ticketSelections: toTicketSelectionRequests(prepared.ticketSelections),
16167
- selectedSlidingAmount: options.selectedSlidingAmount ?? void 0,
16168
- email: options.formData.email.trim().toLowerCase(),
16169
- name: options.formData.name.trim(),
16170
- phone: options.formData.phone.trim() || void 0,
16171
- notes: options.formData.notes.trim() || void 0,
16172
- consentAccepted: options.formData.consentAccepted,
16173
- altchaSolution: options.altchaSolution,
16174
- paymentMethod: method,
16175
- customerPassId: method === "pass" ? passId : void 0,
16176
- customerMembershipId: method === "membership" ? membershipId : void 0,
16177
- bundleProductId: prepared.bundleProductId,
16178
- claimToken: options.claimToken ?? void 0,
16179
- guests: prepared.guestsPayload
16344
+ ...request,
16345
+ registrationCommandId: prepared.registrationCommandId
16180
16346
  });
16181
- commandIdRef.current = null;
16182
- if (needsOccurrenceCheckout(result, method)) return await submitOccurrenceCheckout(options, deps, prepared, result, method, submitOptions);
16183
- options.setRegistrationResult(toRegistrationResult(result));
16184
- options.setStep("success");
16185
- return {
16186
- ok: true,
16187
- outcome: { kind: "completed" }
16188
- };
16347
+ commandRef.current = null;
16348
+ return await completeRegistrationSubmission(options, deps, prepared, result, method, submitOptions);
16189
16349
  } catch (error) {
16350
+ if (error instanceof BlockApiError && error.tag === "registrationPreparationChanged") commandRef.current = null;
16190
16351
  const { message, action } = registrationErrorPresentation(error);
16191
16352
  options.setErrorAction?.(action);
16192
16353
  options.setErrorMessage(message);
@@ -16198,6 +16359,24 @@ function useEventRegistrationSubmitWithDeps(options, deps) {
16198
16359
  };
16199
16360
  }
16200
16361
  };
16362
+ return (...args) => {
16363
+ if (inFlightRef.current) return inFlightRef.current;
16364
+ const pending = Promise.resolve().then(() => submit(...args));
16365
+ inFlightRef.current = pending;
16366
+ pending.finally(() => {
16367
+ if (inFlightRef.current === pending) inFlightRef.current = null;
16368
+ });
16369
+ return pending;
16370
+ };
16371
+ }
16372
+ async function completeRegistrationSubmission(options, deps, prepared, result, method, submitOptions) {
16373
+ if (needsOccurrenceCheckout(result, method)) return await submitOccurrenceCheckout(options, deps, prepared, result, method, submitOptions);
16374
+ options.setRegistrationResult(toRegistrationResult(result));
16375
+ options.setStep("success");
16376
+ return {
16377
+ ok: true,
16378
+ outcome: { kind: "completed" }
16379
+ };
16201
16380
  }
16202
16381
  function toTicketSelectionRequests(lines) {
16203
16382
  return lines.map((line) => ({
@@ -16272,6 +16451,7 @@ async function submitWholeSeriesCheckout(options, deps, prepared, submitOptions)
16272
16451
  altchaSolution: options.altchaSolution,
16273
16452
  guests: prepared.guestsPayload,
16274
16453
  claimToken: options.claimToken ?? void 0,
16454
+ waitlistEntryId: options.waitlistEntryId ?? void 0,
16275
16455
  discountCode: options.discountCode.trim() || void 0,
16276
16456
  collectionOptionKind: prepared.selectionSnapshot.collectionOptionKind,
16277
16457
  checkoutAttemptId,
@@ -16293,14 +16473,14 @@ async function submitWholeSeriesCheckout(options, deps, prepared, submitOptions)
16293
16473
  }
16294
16474
  if (result.bypassed) return completeBypassedCheckout(options);
16295
16475
  if (!result.checkoutUrl) throw new Error("Checkout URL missing");
16296
- savePendingCheckout(options, deps, prepared, checkoutAttemptId, {
16476
+ savePendingCheckout(options, deps, prepared, result.checkoutAttemptId, {
16297
16477
  scope: "wholeSeries",
16298
16478
  registrationId: result.registrationId
16299
16479
  });
16300
16480
  return redirectToCheckout(result.checkoutUrl, submitOptions);
16301
16481
  }
16302
16482
  function needsOccurrenceCheckout(result, method) {
16303
- return result.scope === "occurrence" && !result.alreadyRegistered && result.status === "confirmed" && result.pendingPayment && [
16483
+ return result.scope === "occurrence" && result.status === "confirmed" && result.pendingPayment && [
16304
16484
  "stripe",
16305
16485
  "pass_bundle",
16306
16486
  "membership_bundle"
@@ -16320,6 +16500,7 @@ async function submitOccurrenceCheckout(options, deps, prepared, registration, m
16320
16500
  kind: "occurrence",
16321
16501
  attendeeId: registration.attendeeId
16322
16502
  },
16503
+ registrationCommandId: prepared.registrationCommandId,
16323
16504
  checkoutType: method === "pass_bundle" ? "pass_bundle" : method === "membership_bundle" ? "membership_bundle" : "event",
16324
16505
  productId: prepared.bundleProductId,
16325
16506
  discountCode: options.discountCode.trim() || void 0,
@@ -16362,6 +16543,31 @@ function redirectToCheckout(checkoutUrl, submitOptions) {
16362
16543
  }
16363
16544
  };
16364
16545
  }
16546
+ function registrationRequestIntentKey(request) {
16547
+ const { registrationCommandId: _command, altchaSolution: _proof, ...intent } = request;
16548
+ return JSON.stringify(intent);
16549
+ }
16550
+ function buildOccurrenceRegistrationRequest(options, prepared, method, passId, membershipId) {
16551
+ return {
16552
+ registrationCommandId: prepared.registrationCommandId,
16553
+ subject: prepared.subject,
16554
+ ticketSelections: toTicketSelectionRequests(prepared.ticketSelections),
16555
+ selectedSlidingAmount: options.selectedSlidingAmount ?? void 0,
16556
+ email: options.formData.email.trim().toLowerCase(),
16557
+ name: options.formData.name.trim(),
16558
+ phone: options.formData.phone.trim() || void 0,
16559
+ notes: options.formData.notes.trim() || void 0,
16560
+ consentAccepted: options.formData.consentAccepted,
16561
+ altchaSolution: options.altchaSolution,
16562
+ paymentMethod: method,
16563
+ customerPassId: method === "pass" ? passId : void 0,
16564
+ customerMembershipId: method === "membership" ? membershipId : void 0,
16565
+ bundleProductId: prepared.bundleProductId,
16566
+ claimToken: options.claimToken ?? void 0,
16567
+ waitlistEntryId: options.waitlistEntryId ?? void 0,
16568
+ guests: prepared.guestsPayload
16569
+ };
16570
+ }
16365
16571
  //#endregion
16366
16572
  //#region ../blocks/src/system/runtime/nodes/event-registration/eventPaymentOptions.ts
16367
16573
  function getApprovedDirectPaymentCollectionOptionKinds(paymentOptions) {
@@ -17384,14 +17590,28 @@ function useEventRegistrationWizardWithDeps(options, deps) {
17384
17590
  }), [options.occurrenceContext, selectedEvent]);
17385
17591
  const registrationOccurrenceId = getRegistrationOccurrenceId(registrationTarget);
17386
17592
  const currentEvent = selectedEvent ?? preSelectedEvent;
17593
+ const setStep = useCallback((nextStep) => {
17594
+ dispatchFlow({
17595
+ type: "set-step",
17596
+ step: nextStep
17597
+ });
17598
+ }, []);
17599
+ const { checkoutRecovery, startCheckoutRecovery } = useCheckoutRecovery(currentEvent, setStep);
17387
17600
  const currentEventUsesTicketTypes = usesTieredPricing(currentEvent);
17388
- const currentCanJoinWaitlist = currentEvent ? canJoinEventWaitlist(currentEvent, { attendanceMode: selectedAttendanceMode }) : false;
17601
+ const currentCanJoinWaitlist = canJoinWaitlistOutsideRecovery(currentEvent, selectedAttendanceMode, checkoutRecovery);
17389
17602
  const usesTicketTypeSelections = currentEventUsesTicketTypes && !currentCanJoinWaitlist;
17390
17603
  const eventTicketTypesForSelection = useMemo(() => getVisibleTicketTypes({
17391
17604
  event: currentEvent,
17392
17605
  eligibility: null,
17393
17606
  selectedAttendanceMode
17394
- }), [currentEvent, selectedAttendanceMode]);
17607
+ }).map((option) => checkoutRecovery ? {
17608
+ ...option,
17609
+ availability: checkoutRecoveryOptionAvailability(option.availability)
17610
+ } : option), [
17611
+ currentEvent,
17612
+ selectedAttendanceMode,
17613
+ checkoutRecovery
17614
+ ]);
17395
17615
  const normalizedSelectedTicketLines = useMemo(() => normalizeTicketSelectionLines(selectedTicketLines), [selectedTicketLines]);
17396
17616
  const ticketTypeSelectionTotal = useMemo(() => getTicketSelectionTotal(normalizedSelectedTicketLines), [normalizedSelectedTicketLines]);
17397
17617
  const ticketsCount = usesTicketTypeSelections ? ticketTypeSelectionTotal : flowState.ticketsCount;
@@ -17429,17 +17649,11 @@ function useEventRegistrationWizardWithDeps(options, deps) {
17429
17649
  isAuthenticated: portalAuthState === "authenticated",
17430
17650
  occurrenceId: registrationOccurrenceId
17431
17651
  });
17432
- const eligibility = eligibilityResult.eligibility;
17652
+ const eligibility = useCheckoutRecoveryEligibility(eligibilityResult.eligibility, step, checkoutRecovery, startCheckoutRecovery);
17433
17653
  const eligibilityLoading = eligibilityResult.isLoading;
17434
17654
  const eligibilityError = eligibilityResult.error;
17435
17655
  const portalCreditState = eligibilityResult.creditState;
17436
17656
  const registrationState = eligibility?.registration ?? { kind: "none" };
17437
- const setStep = useCallback((nextStep) => {
17438
- dispatchFlow({
17439
- type: "set-step",
17440
- step: nextStep
17441
- });
17442
- }, []);
17443
17657
  const setTicketsCount = useCallback((nextTicketsCount) => {
17444
17658
  dispatchFlow({
17445
17659
  type: "set-tickets-count",
@@ -17547,10 +17761,14 @@ function useEventRegistrationWizardWithDeps(options, deps) {
17547
17761
  event: currentEvent,
17548
17762
  eligibility,
17549
17763
  selectedAttendanceMode
17550
- }), [
17764
+ }).map((option) => checkoutRecovery ? {
17765
+ ...option,
17766
+ availability: checkoutRecoveryOptionAvailability(option.availability)
17767
+ } : option), [
17551
17768
  currentEvent,
17552
17769
  selectedAttendanceMode,
17553
- eligibility
17770
+ eligibility,
17771
+ checkoutRecovery
17554
17772
  ]);
17555
17773
  const singleSelectedPricingOptionId = getSingleSelectedPricingOptionId(normalizedSelectedTicketLines);
17556
17774
  const selectedTicketType = useMemo(() => findSelectedTicketType({
@@ -17574,8 +17792,12 @@ function useEventRegistrationWizardWithDeps(options, deps) {
17574
17792
  const event = currentEvent;
17575
17793
  if (!usesTieredPricing(event)) return false;
17576
17794
  if ((event.deliveryMode ?? "in_person") === "hybrid" && !selectedAttendanceMode) return false;
17577
- return !canJoinEventWaitlist(event, { attendanceMode: selectedAttendanceMode });
17578
- }, [currentEvent, selectedAttendanceMode]);
17795
+ return checkoutRecovery || !canJoinEventWaitlist(event, { attendanceMode: selectedAttendanceMode });
17796
+ }, [
17797
+ currentEvent,
17798
+ selectedAttendanceMode,
17799
+ checkoutRecovery
17800
+ ]);
17579
17801
  const hasValidTicketSelection = hasValidPricingOptionSelection({
17580
17802
  selectionRequired: ticketTypeSelectionRequired,
17581
17803
  lines: normalizedSelectedTicketLines,
@@ -17779,6 +18001,7 @@ function useEventRegistrationWizardWithDeps(options, deps) {
17779
18001
  guests,
17780
18002
  discountCode: discountUi.discountCode,
17781
18003
  claimToken: waitlistClaim.token,
18004
+ waitlistEntryId: waitlistClaim.entryId,
17782
18005
  setPendingRegistrationReference,
17783
18006
  setStep,
17784
18007
  setRegistrationResult: (result) => setRegistrationResult(result),
@@ -17841,6 +18064,8 @@ function useEventRegistrationWizardWithDeps(options, deps) {
17841
18064
  scopedEvents,
17842
18065
  preSelectedEvent,
17843
18066
  hasPreSelectedContext,
18067
+ checkoutRecovery,
18068
+ startCheckoutRecovery,
17844
18069
  step,
17845
18070
  setStep,
17846
18071
  selectedEvent,
@@ -17893,6 +18118,7 @@ function useEventRegistrationWizardWithDeps(options, deps) {
17893
18118
  isMembershipFastTrack,
17894
18119
  waitlistClaim,
17895
18120
  eligibility,
18121
+ registrationOptionsState: eligibilityResult.state,
17896
18122
  eligibilityLoading,
17897
18123
  eligibilityError,
17898
18124
  existingRegistration: existingRegistrationResult.registration,