@riverbankcms/sdk 0.85.0 → 0.89.1

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 (166) hide show
  1. package/dist/{PreviewEditorSidebar-4PH35ZIE.mjs → PreviewEditorSidebar-JDR64FEC.mjs} +3 -3
  2. package/dist/{PreviewEditorUI-WHMCRJGM.mjs → PreviewEditorUI-67TMJMAF.mjs} +3 -3
  3. package/dist/SdkPreviewModeRuntime-ZBEMRV7N.mjs +8 -0
  4. package/dist/_dts/api/src/accessAdmin.d.ts +7 -0
  5. package/dist/_dts/api/src/endpoints.d.ts +66 -14
  6. package/dist/_dts/api/src/index.d.ts +5 -2
  7. package/dist/_dts/api/src/launchReadiness.d.ts +3 -3
  8. package/dist/_dts/api/src/mailchimpIntegration.d.ts +215 -0
  9. package/dist/_dts/api/src/publicExperienceEndpoints.d.ts +35 -15
  10. package/dist/_dts/api/src/siteInfrastructure.d.ts +0 -14
  11. package/dist/_dts/api/src/siteManagementEndpoints.d.ts +5 -1
  12. package/dist/_dts/api/src/siteMembers.d.ts +6 -1
  13. package/dist/_dts/api/src/siteRuntimeEndpoints.d.ts +1 -13
  14. package/dist/_dts/api/src/types.d.ts +7 -4
  15. package/dist/_dts/blocks/src/PageRenderer.d.ts +1 -0
  16. package/dist/_dts/blocks/src/contracts/proof-block-islands.d.ts +4 -0
  17. package/dist/_dts/blocks/src/index.d.ts +2 -1
  18. package/dist/_dts/blocks/src/system/blocks/appointment-booking.d.ts +288 -288
  19. package/dist/_dts/blocks/src/system/blocks/blog-listing.d.ts +288 -288
  20. package/dist/_dts/blocks/src/system/blocks/cart.d.ts +288 -288
  21. package/dist/_dts/blocks/src/system/blocks/checkout.d.ts +288 -288
  22. package/dist/_dts/blocks/src/system/blocks/collection.d.ts +288 -288
  23. package/dist/_dts/blocks/src/system/blocks/events/shared/schemas.d.ts +42 -0
  24. package/dist/_dts/blocks/src/system/blocks/events/shared/types.d.ts +4 -0
  25. package/dist/_dts/blocks/src/system/blocks/faq.d.ts +288 -288
  26. package/dist/_dts/blocks/src/system/blocks/gifting.d.ts +288 -288
  27. package/dist/_dts/blocks/src/system/blocks/location-map.d.ts +1 -1
  28. package/dist/_dts/blocks/src/system/blocks/media-text.d.ts +42 -42
  29. package/dist/_dts/blocks/src/system/blocks/newsletter-signup-destination.d.ts +300 -0
  30. package/dist/_dts/blocks/src/system/blocks/newsletter-signup.d.ts +63 -3
  31. package/dist/_dts/blocks/src/system/blocks/product-detail.d.ts +288 -288
  32. package/dist/_dts/blocks/src/system/blocks/product-list.d.ts +288 -288
  33. package/dist/_dts/blocks/src/system/blocks/shop.d.ts +288 -288
  34. package/dist/_dts/blocks/src/system/fragments/library/newsletterForm.d.ts +53 -1
  35. package/dist/_dts/blocks/src/system/icons/cta.d.ts +3 -3
  36. package/dist/_dts/blocks/src/system/icons/index.d.ts +1 -0
  37. package/dist/_dts/blocks/src/system/icons/registry.d.ts +2 -2
  38. package/dist/_dts/blocks/src/system/icons/semantic.d.ts +3 -3
  39. package/dist/_dts/blocks/src/system/icons/svg.d.ts +72 -0
  40. package/dist/_dts/blocks/src/system/manifest/richTextSchema.d.ts +27 -0
  41. package/dist/_dts/blocks/src/system/manifest/schema.d.ts +23 -23
  42. package/dist/_dts/blocks/src/system/runtime/api/types.d.ts +11 -2
  43. package/dist/_dts/blocks/src/system/runtime/components/registry.client.d.ts +24 -0
  44. package/dist/_dts/blocks/src/system/runtime/components/runtime-backed-blocks.d.ts +12 -0
  45. package/dist/_dts/blocks/src/system/runtime/hooks/loadStateError.d.ts +1 -0
  46. package/dist/_dts/blocks/src/system/runtime/hooks/useAvailableDates.d.ts +1 -1
  47. package/dist/_dts/blocks/src/system/runtime/hooks/useAvailableDates.state.d.ts +55 -0
  48. package/dist/_dts/blocks/src/system/runtime/hooks/useAvailableSlots.state.d.ts +39 -0
  49. package/dist/_dts/blocks/src/system/runtime/hooks/useBookingFormConfig.d.ts +4 -27
  50. package/dist/_dts/blocks/src/system/runtime/hooks/useBookingFormConfig.state.d.ts +40 -0
  51. package/dist/_dts/blocks/src/system/runtime/hooks/useCalendarEvents.state.d.ts +20 -0
  52. package/dist/_dts/blocks/src/system/runtime/hooks/useEventFilters.state.d.ts +31 -0
  53. package/dist/_dts/blocks/src/system/runtime/hooks/useEventPagination.d.ts +3 -3
  54. package/dist/_dts/blocks/src/system/runtime/hooks/useEventPagination.state.d.ts +39 -0
  55. package/dist/_dts/blocks/src/system/runtime/nodes/event-registration/types.d.ts +1 -0
  56. package/dist/_dts/blocks/src/system/runtime/nodes/event-registration.interactive.d.ts +4 -0
  57. package/dist/_dts/blocks/src/system/runtime/nodes/event-registration.server.d.ts +1 -1
  58. package/dist/_dts/blocks/src/system/runtime/nodes/events/shared/EventPaginatedListView.client.d.ts +1 -1
  59. package/dist/_dts/blocks/src/system/runtime/nodes/events/shared/utils.d.ts +11 -1
  60. package/dist/_dts/blocks/src/system/runtime/nodes/newsletter-form.client.state.d.ts +24 -2
  61. package/dist/_dts/blocks/src/system/runtime/nodes/newsletter-form.interactive.d.ts +15 -0
  62. package/dist/_dts/blocks/src/system/runtime/nodes/newsletter-form.server.d.ts +1 -1
  63. package/dist/_dts/blocks/src/system/runtime/nodes/newsletter-form.submission.d.ts +32 -0
  64. package/dist/_dts/blocks/src/system/runtime/nodes/newsletter-form.types.d.ts +5 -1
  65. package/dist/_dts/blocks/src/system/runtime/nodes/shared/MagicLinkForm.state.d.ts +24 -0
  66. package/dist/_dts/blocks/src/system/runtime/shared/components/ModalShell.d.ts +5 -1
  67. package/dist/_dts/blocks/src/system/runtime/shared/useWaitlistClaim.state.d.ts +35 -0
  68. package/dist/_dts/blocks/src/system/runtime/shared/utils/formatting.d.ts +1 -1
  69. package/dist/_dts/content-model/src/entry-slots/types.d.ts +54 -0
  70. package/dist/_dts/content-model/src/referenceFields.d.ts +1 -1
  71. package/dist/_dts/core/src/branded.d.ts +7 -0
  72. package/dist/_dts/core/src/currency-format.d.ts +37 -2
  73. package/dist/_dts/core/src/event-pricing.d.ts +24 -0
  74. package/dist/_dts/core/src/index.d.ts +1 -0
  75. package/dist/_dts/core/src/site-route-target.d.ts +40 -0
  76. package/dist/_dts/db/src/generated/supabase/database.types.d.ts +705 -17
  77. package/dist/_dts/editor-blocks/src/widgets/reference/loaders.d.ts +3 -1
  78. package/dist/_dts/media-core/src/fileDomain.d.ts +4 -0
  79. package/dist/_dts/sdk/src/client/runtimeCachePolicy.d.ts +160 -0
  80. package/dist/_dts/sdk/src/client/types.d.ts +35 -1
  81. package/dist/_dts/sdk/src/config/validation.d.ts +3 -0
  82. package/dist/_dts/sdk/src/contracts/system-block-content.d.ts +3 -0
  83. package/dist/_dts/sdk/src/data/prefetchBlockData.d.ts +3 -9
  84. package/dist/_dts/sdk/src/index.d.ts +3 -1
  85. package/dist/_dts/sdk/src/manifest/passes/pass1-fields.d.ts +1 -1
  86. package/dist/_dts/sdk/src/manifest/three-pass-converter.d.ts +7 -18
  87. package/dist/_dts/sdk/src/rendering/blocks-page-renderer.d.ts +2 -0
  88. package/dist/_dts/sdk/src/rendering/components/pageShared.d.ts +3 -1
  89. package/dist/_dts/sdk/src/rendering/helpers/loadContent.d.ts +7 -3
  90. package/dist/_dts/sdk/src/rendering/helpers/loadPage.d.ts +4 -24
  91. package/dist/_dts/sdk/src/rendering/helpers/pageRuntimeSupport.d.ts +45 -0
  92. package/dist/_dts/sdk/src/version.d.ts +1 -1
  93. package/dist/_dts/theme-core/src/generated/containerResponsiveThemeCss.d.ts +1 -1
  94. package/dist/_dts/theme-core/src/mock-themes/all.d.ts +9 -9
  95. package/dist/_dts/theme-core/src/schema.d.ts +11 -11
  96. package/dist/{chunk-PYDHOMEO.mjs → chunk-7N46MZHI.mjs} +1 -1
  97. package/dist/{chunk-ZR2GQK2A.mjs → chunk-7YUAXONX.mjs} +1880 -588
  98. package/dist/{chunk-4QNLOTES.mjs → chunk-F645A5UV.mjs} +76 -14
  99. package/dist/{chunk-OCGTXHSO.mjs → chunk-HKJQERFR.mjs} +7 -7
  100. package/dist/{chunk-NFWGLRZZ.mjs → chunk-TGBJWKMP.mjs} +37 -3
  101. package/dist/{chunk-WFPYN7KA.mjs → chunk-ZQRBLCW5.mjs} +2 -2
  102. package/dist/cli/index.mjs +1075 -126
  103. package/dist/client/{accordion-2UZPBMYM.mjs → accordion-MUCVNGQ7.mjs} +2 -2
  104. package/dist/client/{bookingForm-36CWQUMV.mjs → bookingForm-PKD6EFIE.mjs} +193 -77
  105. package/dist/client/bookings.mjs +487 -197
  106. package/dist/client/{carousel-QH77HR6X.mjs → carousel-3TKQSNJC.mjs} +4 -3
  107. package/dist/client/cart-6XHSZK23.mjs +19 -0
  108. package/dist/client/checkout-FVSPM6FI.mjs +19 -0
  109. package/dist/client/{chunk-ZE5G642V.mjs → chunk-25W2EQUN.mjs} +75 -1
  110. package/dist/client/chunk-6N7YRNYU.mjs +183 -0
  111. package/dist/client/{chunk-4OXKTA3D.mjs → chunk-7DH35FGA.mjs} +2 -2
  112. package/dist/client/{chunk-3C2VTPWI.mjs → chunk-CQKKFEQD.mjs} +363 -66
  113. package/dist/client/{chunk-7UCLJ5SP.mjs → chunk-EY42X22F.mjs} +4 -7
  114. package/dist/client/{chunk-SYIJ5JO2.mjs → chunk-FHU6PFPM.mjs} +1 -1
  115. package/dist/client/{chunk-ZKUO52W3.mjs → chunk-LQFDYWPJ.mjs} +1 -1
  116. package/dist/client/chunk-RSQWWUAD.mjs +390 -0
  117. package/dist/client/{chunk-UDNSI5PY.mjs → chunk-STJ2NCQM.mjs} +2 -3
  118. package/dist/client/{chunk-VGDBVNOO.mjs → chunk-UQFY4AHX.mjs} +511 -406
  119. package/dist/client/{chunk-F5VRX5Y6.mjs → chunk-VGLXACVK.mjs} +1 -1
  120. package/dist/client/{chunk-DVNUDUVT.mjs → chunk-WBQG7VJA.mjs} +4 -1
  121. package/dist/client/{chunk-52CGCQ7B.mjs → chunk-ZJZZA5EP.mjs} +10 -80
  122. package/dist/client/{chunk-XSV6KW4D.mjs → chunk-ZT5XE7FK.mjs} +1 -1
  123. package/dist/client/client.mjs +5820 -4782
  124. package/dist/client/{courseRegistration-TMKU6ABO.mjs → courseRegistration-ATZSYDHM.mjs} +7 -7
  125. package/dist/client/{eventCalendar-G6TI32X6.mjs → eventCalendar-6T2UGKKP.mjs} +11 -11
  126. package/dist/client/{eventCombined-SCKEMNAR.mjs → eventCombined-Q4VANXVF.mjs} +11 -11
  127. package/dist/client/{eventDetails-XPIFXXPK.mjs → eventDetails-DW37E7VW.mjs} +11 -11
  128. package/dist/client/{eventListing-7QFMEMGT.mjs → eventListing-XURTSAUW.mjs} +11 -11
  129. package/dist/client/{eventRegistration-TOODSZUI.mjs → eventRegistration-MRKEVAXW.mjs} +11 -11
  130. package/dist/client/{form-MTCMVCZT.mjs → form-WZZFFGMU.mjs} +3 -3
  131. package/dist/client/{headerSection-Y5TMR3TW.mjs → headerSection-EQYVQBLM.mjs} +4 -4
  132. package/dist/client/hooks.mjs +1700 -1412
  133. package/dist/client/{locationMap-RH2LG7FZ.mjs → locationMap-MFF5VAZR.mjs} +3 -4
  134. package/dist/client/{newsletterForm-PCAIPFMA.mjs → newsletterForm-JQ77UYIE.mjs} +127 -43
  135. package/dist/client/{productDetail-OIGDR4YE.mjs → productDetail-25LMT3IZ.mjs} +9 -9
  136. package/dist/client/{productList-4MA5S2CX.mjs → productList-5ABEMKUG.mjs} +9 -9
  137. package/dist/client/rendering/client.mjs +3884 -3722
  138. package/dist/client/rendering/islands.mjs +19 -19
  139. package/dist/client/rendering.mjs +6774 -6331
  140. package/dist/client/shop-OMMQZ6YO.mjs +21 -0
  141. package/dist/preview-next/before-render.mjs +76 -14
  142. package/dist/preview-next/client/runtime.mjs +5 -5
  143. package/dist/preview-next/editor-chrome.css +56 -9
  144. package/dist/preview-next/middleware.mjs +76 -14
  145. package/dist/{sdk-runtime-QLOCYKVU.mjs → sdk-runtime-WNLBZ3ZH.mjs} +6 -6
  146. package/dist/server/components.mjs +2579 -2548
  147. package/dist/server/config-validation.mjs +1737 -1461
  148. package/dist/server/config.mjs +1737 -1461
  149. package/dist/server/data.mjs +1701 -1413
  150. package/dist/server/index.mjs +1048 -400
  151. package/dist/server/next.mjs +3602 -2858
  152. package/dist/server/page-converter.mjs +2193 -1169
  153. package/dist/server/prebuild.mjs +1 -1
  154. package/dist/server/rendering/server.mjs +2770 -2742
  155. package/dist/server/rendering.mjs +2961 -2886
  156. package/dist/server/routing.mjs +2186 -1508
  157. package/dist/server/server.mjs +2237 -1287
  158. package/dist/server/theme-bridge.mjs +260 -0
  159. package/dist/styles/index.css +258 -0
  160. package/package.json +2 -1
  161. package/dist/SdkPreviewModeRuntime-4FGSVUYI.mjs +0 -8
  162. package/dist/client/cart-X4YK4FTW.mjs +0 -19
  163. package/dist/client/checkout-OM2BEPWD.mjs +0 -19
  164. package/dist/client/chunk-3DTWLTXM.mjs +0 -204
  165. package/dist/client/chunk-I2MMZO53.mjs +0 -6
  166. package/dist/client/shop-WXSYV5QO.mjs +0 -21
@@ -1,17 +1,19 @@
1
1
  "use client";
2
- import { LeafletStaticMap } from './chunk-XSV6KW4D.mjs';
3
- import { MagicLinkForm, useWaitlistClaim } from './chunk-3DTWLTXM.mjs';
4
- import { usePolling } from './chunk-ZKUO52W3.mjs';
5
- import { SpinnerNode } from './chunk-SYIJ5JO2.mjs';
2
+ import { LeafletStaticMap } from './chunk-ZT5XE7FK.mjs';
3
+ import { resolveCoursePricingState, useWaitlistClaim, MagicLinkForm, formatCoursePriceAmount, formatCoursePriceDisplay } from './chunk-RSQWWUAD.mjs';
4
+ import { CreditCard, Ticket, Star, Sparkles } from './chunk-6N7YRNYU.mjs';
5
+ import { usePolling } from './chunk-LQFDYWPJ.mjs';
6
+ import { SpinnerNode } from './chunk-FHU6PFPM.mjs';
6
7
  import { useDiscountCodeUi } from './chunk-ZFHRN6W2.mjs';
7
- import { createBodyThemePortalRoot, TabBarFragment, logoutPortal, StepIndicator, DiscountCodeDisclosure, TerminalPanel, StateIcon, formatPrice, CrossIcon, ClockIcon, consumeSearchParam, LoggedInAsUser, CheckIcon } from './chunk-7UCLJ5SP.mjs';
8
+ import { createBodyThemePortalRoot, TabBarFragment, logoutPortal, consumeSearchParam, StepIndicator, DiscountCodeDisclosure, TerminalPanel, StateIcon, formatPrice, CrossIcon, ClockIcon, LoggedInAsUser, CheckIcon } from './chunk-EY42X22F.mjs';
8
9
  import { getFieldValidationControlProps, FieldValidationMessage } from './chunk-3DCJ45Z2.mjs';
9
- import { ModalShell } from './chunk-DVNUDUVT.mjs';
10
+ import { ModalShell } from './chunk-WBQG7VJA.mjs';
10
11
  import { isSpamProtectionEnabled, AltchaWidget, getChallengeUrl } from './chunk-SDIYSQAY.mjs';
11
- import { useBlockApi, FeedbackMessage } from './chunk-UDNSI5PY.mjs';
12
- import { buildEventRuntimeFilters, buildEventCalendarListingRender, groupEventsByDate, getOrderedDayNames, formatDateKey, getEventRuntimeFiltersKey, themeButtonClassName, normalizeCsvIds, normalizeOptionalId, normalizeEventBlockKind, normalizeCsvString, EventCompactRow, EmptyState, getContainerClass, getCardOrientation, isToday, MAX_EVENTS_PER_DAY, formatTime, WIZARD_STEPS, getWizardStepsForContext, getStepNumber, resolveCoursePricingState, resolveRuntimeEventPricing, formatEventPrice, formatEventDateParts, DateTimeTile, EventCard, buildCalendarViewport, shiftCalendarAnchorDate, addMonths, getThreeMonthRange, buildTimetableModel, formatDate, toRegistrationEvents, isEventContentType, findPreSelectedEvent, resolveRegistrationTarget, findEventByOccurrenceId, resolveEventRequiresPayment, resolveDiscountContext, formatCoursePriceAmount, formatCoursePriceDisplay, MONTH_NAMES, getEventAvailability, formatEventTeacherLine, CreditCard, Ticket, Star, Sparkles, assertNever11 } from './chunk-VGDBVNOO.mjs';
13
- import { publicEventPricingType, getBookingLocalDateKey, toScheduledBookingDateTime, toBookingTimeZone, publicEventPricingCurrency, formatBookingDateTime, publicEventPricingMode, publicEventScalarPrice, publicEventTicketTypes, formatBookingDate, formatBookingTime } from './chunk-ZE5G642V.mjs';
14
- import React9, { createContext, useId, useMemo, useState, useRef, useEffect, useCallback, useContext, useReducer } from 'react';
12
+ import { useBlockApi, FeedbackMessage } from './chunk-STJ2NCQM.mjs';
13
+ import { buildEventRuntimeFilters, buildEventCalendarListingRender, groupEventsByDate, getOrderedDayNames, formatDateKey, getEventRuntimeFiltersKey, themeButtonClassName, normalizeCsvIds, normalizeOptionalId, normalizeEventBlockKind, normalizeCsvString, EventCompactRow, EmptyState, getContainerClass, getCardOrientation, isToday, MAX_EVENTS_PER_DAY, formatTime, WIZARD_STEPS, getWizardStepsForContext, getStepNumber, formatEventPriceDisplay, resolveRuntimeEventPricing, formatEventPrice, formatEventDateParts, DateTimeTile, assertNever11, EventCard, buildCalendarViewport, shiftCalendarAnchorDate, addMonths, getThreeMonthRange, buildTimetableModel, formatDate, toRegistrationEvents, isEventContentType, findPreSelectedEvent, resolveRegistrationTarget, findEventByOccurrenceId, resolveEventRequiresPayment, resolveDiscountContext, MONTH_NAMES, getEventAvailability, formatEventTeacherLine } from './chunk-UQFY4AHX.mjs';
14
+ import { publicEventPricingType, getBookingLocalDateKey, toScheduledBookingDateTime, toBookingTimeZone, publicEventPricingCurrency, formatBookingDateTime, publicEventPricingMode, publicEventScalarPrice, publicEventTicketTypes, formatCurrencyAmount, formatBookingDate, formatBookingTime } from './chunk-25W2EQUN.mjs';
15
+ import React9, { createContext, useId, useMemo, useReducer, useState, useRef, useEffect, useCallback, useContext } from 'react';
16
+ import { createPortal } from 'react-dom';
15
17
  import { jsx, jsxs, Fragment } from 'react/jsx-runtime';
16
18
 
17
19
  function StepIndicator2(props) {
@@ -2744,6 +2746,12 @@ function EventPortalAuthPrompt(props) {
2744
2746
  /* @__PURE__ */ jsx("button", { type: "button", className: "er-portal-auth-link", onClick: props.onRequestLogin, children: props.copy.buttonText })
2745
2747
  ] });
2746
2748
  }
2749
+ function getActiveTicketTypes(event) {
2750
+ return event?.pricing.kind === "ticket_types" ? event.pricing.ticketTypes.filter((ticketType) => ticketType.isActive).sort((left, right) => left.sortOrder - right.sortOrder) : [];
2751
+ }
2752
+ function formatTicketTypePrice(ticketType, currency) {
2753
+ return formatCurrencyAmount(ticketType.priceAmount, currency, { decimals: "auto" });
2754
+ }
2747
2755
  function EventRegistrationWizard(props) {
2748
2756
  const {
2749
2757
  occurrenceContext,
@@ -2763,6 +2771,8 @@ function EventRegistrationWizard(props) {
2763
2771
  const maxTicketsNum = normalizeEventRegistrationMaxTickets(maxTickets);
2764
2772
  const showSpamProtection = spamProtectionEnabled ?? isSpamProtectionEnabled();
2765
2773
  const buttonClass = themeButtonClassName({ variant: buttonVariant, size: "md" });
2774
+ const registrationRootClassName = `event-registration ${className || ""}`;
2775
+ const registrationRootRef = React9.useRef(null);
2766
2776
  const wizard = useEventRegistrationWizard({
2767
2777
  anchorId: EVENT_REGISTRATION_ANCHOR_ID,
2768
2778
  occurrenceContext: occurrenceContext ?? null,
@@ -2770,13 +2780,44 @@ function EventRegistrationWizard(props) {
2770
2780
  events: events ?? [],
2771
2781
  maxTicketsNum
2772
2782
  });
2783
+ const [bookingOverlayOpen, setBookingOverlayOpen] = useState(false);
2784
+ const [floatingPortalRoot, setFloatingPortalRoot] = useState(null);
2785
+ useEffect(() => {
2786
+ const sourceEl = registrationRootRef.current;
2787
+ if (!sourceEl) return;
2788
+ const portal = createBodyThemePortalRoot(sourceEl);
2789
+ if (!portal) return;
2790
+ setFloatingPortalRoot(portal.root);
2791
+ return () => {
2792
+ setFloatingPortalRoot(null);
2793
+ portal.cleanup();
2794
+ };
2795
+ }, []);
2773
2796
  if (wizard.scopedEvents.length === 0 && !wizard.occurrenceContext) {
2774
- return /* @__PURE__ */ jsx("div", { id: EVENT_REGISTRATION_ANCHOR_ID, className: `event-registration ${className || ""}`, "data-block": "event-registration", children: /* @__PURE__ */ jsx("div", { className: "er-empty", children: /* @__PURE__ */ jsx("p", { className: "er-empty__text", children: "No events available for registration." }) }) });
2797
+ return /* @__PURE__ */ jsx(
2798
+ "div",
2799
+ {
2800
+ ref: registrationRootRef,
2801
+ id: EVENT_REGISTRATION_ANCHOR_ID,
2802
+ className: registrationRootClassName,
2803
+ "data-block": "event-registration",
2804
+ children: /* @__PURE__ */ jsx("div", { className: "er-empty", children: /* @__PURE__ */ jsx("p", { className: "er-empty__text", children: "No events available for registration." }) })
2805
+ }
2806
+ );
2775
2807
  }
2776
2808
  const allowedStatuses = getRegistrableStatuses(wizard.api.config.isPreview);
2777
2809
  const hasRegistrableEvents = wizard.scopedEvents.some((event) => !event.status || allowedStatuses.includes(event.status));
2778
2810
  if (!hasRegistrableEvents && !wizard.occurrenceContext) {
2779
- return /* @__PURE__ */ jsx("div", { id: EVENT_REGISTRATION_ANCHOR_ID, className: `event-registration ${className || ""}`, "data-block": "event-registration", children: /* @__PURE__ */ jsx("div", { className: "er-empty", children: /* @__PURE__ */ jsx("p", { className: "er-empty__text", children: "Registration is not currently available for this event." }) }) });
2811
+ return /* @__PURE__ */ jsx(
2812
+ "div",
2813
+ {
2814
+ ref: registrationRootRef,
2815
+ id: EVENT_REGISTRATION_ANCHOR_ID,
2816
+ className: registrationRootClassName,
2817
+ "data-block": "event-registration",
2818
+ children: /* @__PURE__ */ jsx("div", { className: "er-empty", children: /* @__PURE__ */ jsx("p", { className: "er-empty__text", children: "Registration is not currently available for this event." }) })
2819
+ }
2820
+ );
2780
2821
  }
2781
2822
  const isWizardStep = WIZARD_STEPS.includes(wizard.step);
2782
2823
  const activeWizardSteps = useMemo(
@@ -2818,13 +2859,15 @@ function EventRegistrationWizard(props) {
2818
2859
  const currentStepNumber = getStepNumber(wizard.step, activeWizardSteps);
2819
2860
  const summaryEvent = wizard.selectedEvent ?? wizard.preSelectedEvent;
2820
2861
  const summaryEventPricingType = summaryEvent ? publicEventPricingType(summaryEvent.pricing) : "free";
2862
+ const summaryPriceLabel = summaryEvent ? formatEventPriceDisplay(summaryEvent.pricing) : null;
2863
+ const summaryAvailabilityLabel = summaryEvent?.availableSpots === null || summaryEvent?.availableSpots === void 0 ? null : summaryEvent.availableSpots > 0 ? `${summaryEvent.availableSpots} spots left` : summaryEvent.waitlistEnabled ? "Waitlist available" : "Fully booked";
2821
2864
  const waitlistClaimRequiresPortalLogin = wizard.waitlistClaim.requiresPortalLogin && wizard.portalAuthState !== "authenticated" && wizard.portalAuthState !== "checking";
2822
2865
  const portalAuthCopy = waitlistClaimRequiresPortalLogin ? {
2823
2866
  ...EVENT_PORTAL_AUTH_COPY["waitlist-claim"],
2824
2867
  description: wizard.waitlistClaim.loginMessage ?? "Log in to continue with your waitlist claim."
2825
2868
  } : EVENT_PORTAL_AUTH_COPY.membership;
2826
2869
  const showPortalAuthPrompt = waitlistClaimRequiresPortalLogin || wizard.step === "select-tickets" && wizard.portalAuthState !== "authenticated" && wizard.portalAuthState !== "checking" && summaryEventPricingType !== "free";
2827
- return /* @__PURE__ */ jsx("div", { id: EVENT_REGISTRATION_ANCHOR_ID, className: `event-registration ${className || ""}`, "data-block": "event-registration", children: /* @__PURE__ */ jsxs("div", { className: "er-container", children: [
2870
+ const renderRegistrationSurface = (variant) => /* @__PURE__ */ jsxs("div", { className: `er-container${variant === "overlay" ? " er-container--overlay" : ""}`, children: [
2828
2871
  isWizardStep && /* @__PURE__ */ jsxs("div", { className: "er-payment-layout er-payment-layout--no-sidebar", children: [
2829
2872
  /* @__PURE__ */ jsxs("div", { className: "er-payment-layout-main", children: [
2830
2873
  totalSteps > 1 && /* @__PURE__ */ jsx(StepIndicator2, { currentStep: currentStepNumber, totalSteps, stepLabels }),
@@ -2892,7 +2935,100 @@ function EventRegistrationWizard(props) {
2892
2935
  }
2893
2936
  ),
2894
2937
  wizard.step === "error" && /* @__PURE__ */ jsx(ErrorStep, { message: wizard.errorMessage, onRetry: wizard.handleRetry })
2895
- ] }) });
2938
+ ] });
2939
+ const isEmbedded = (className ?? "").includes("event-registration--embedded");
2940
+ const overlayEnabled = props.overlayEnabled === true;
2941
+ if (isEmbedded || !overlayEnabled) {
2942
+ return /* @__PURE__ */ jsx(
2943
+ "div",
2944
+ {
2945
+ ref: registrationRootRef,
2946
+ id: EVENT_REGISTRATION_ANCHOR_ID,
2947
+ className: registrationRootClassName,
2948
+ "data-block": "event-registration",
2949
+ children: renderRegistrationSurface("inline")
2950
+ }
2951
+ );
2952
+ }
2953
+ const bookingSummaryMeta = [summaryPriceLabel, summaryAvailabilityLabel].filter(Boolean).join(" \xB7 ");
2954
+ const bookingTicketTypes = getActiveTicketTypes(summaryEvent);
2955
+ const bookingTicketTypesCurrency = summaryEvent?.pricing.kind === "ticket_types" ? summaryEvent.pricing.currency : null;
2956
+ const renderBookingEntry = (base) => /* @__PURE__ */ jsxs(Fragment, { children: [
2957
+ /* @__PURE__ */ jsxs("div", { className: `${base}__info`, children: [
2958
+ /* @__PURE__ */ jsx("span", { className: `${base}__title`, children: "Book this event" }),
2959
+ bookingSummaryMeta && /* @__PURE__ */ jsx("span", { className: `${base}__meta`, children: bookingSummaryMeta }),
2960
+ base === "er-booking-teaser" && bookingTicketTypesCurrency && bookingTicketTypes.length > 0 ? /* @__PURE__ */ jsx("div", { className: "er-booking-teaser__tickets", children: bookingTicketTypes.map((ticketType) => /* @__PURE__ */ jsxs("div", { className: "er-booking-teaser__ticket", children: [
2961
+ /* @__PURE__ */ jsx("span", { className: "er-booking-teaser__ticket-name", children: ticketType.name }),
2962
+ /* @__PURE__ */ jsx("strong", { children: formatTicketTypePrice(ticketType, bookingTicketTypesCurrency) })
2963
+ ] }, ticketType.id)) }) : null
2964
+ ] }),
2965
+ /* @__PURE__ */ jsx(
2966
+ "button",
2967
+ {
2968
+ type: "button",
2969
+ className: `${base}__cta ${buttonClass}`,
2970
+ onClick: () => setBookingOverlayOpen(true),
2971
+ children: "Book now"
2972
+ }
2973
+ )
2974
+ ] });
2975
+ const floatingBookingUi = !bookingOverlayOpen && isWizardStep ? /* @__PURE__ */ jsx("div", { className: "er-booking-bar", children: /* @__PURE__ */ jsx("div", { className: "er-booking-bar__inner", children: renderBookingEntry("er-booking-bar") }) }) : null;
2976
+ const floatingBookingLayer = floatingPortalRoot ? createPortal(
2977
+ /* @__PURE__ */ jsx("div", { className: registrationRootClassName, "data-block": "event-registration", children: floatingBookingUi }),
2978
+ floatingPortalRoot
2979
+ ) : floatingBookingUi;
2980
+ const bookingOverlayLayer = bookingOverlayOpen ? /* @__PURE__ */ jsx(
2981
+ ModalShell,
2982
+ {
2983
+ title: "Book this event",
2984
+ titleId: "event-registration-booking-title",
2985
+ onClose: () => setBookingOverlayOpen(false),
2986
+ portal: floatingPortalRoot != null,
2987
+ portalRoot: floatingPortalRoot,
2988
+ portalWrapperClassName: registrationRootClassName,
2989
+ portalWrapperProps: { "data-block": "event-registration" },
2990
+ overlayClassName: "er-booking-overlay",
2991
+ modalClassName: "er-booking-overlay__panel",
2992
+ renderHeader: ({ closeButtonRef, onClose, title, titleId }) => /* @__PURE__ */ jsxs("div", { className: "er-booking-overlay__header", children: [
2993
+ /* @__PURE__ */ jsx("h2", { className: "er-booking-overlay__title", id: titleId, children: title }),
2994
+ /* @__PURE__ */ jsx(
2995
+ "button",
2996
+ {
2997
+ ref: closeButtonRef,
2998
+ type: "button",
2999
+ className: "er-booking-overlay__close",
3000
+ onClick: onClose,
3001
+ "aria-label": "Close booking",
3002
+ children: "\xD7"
3003
+ }
3004
+ )
3005
+ ] }),
3006
+ children: renderRegistrationSurface("overlay")
3007
+ }
3008
+ ) : null;
3009
+ return /* @__PURE__ */ jsxs(
3010
+ "div",
3011
+ {
3012
+ ref: registrationRootRef,
3013
+ id: EVENT_REGISTRATION_ANCHOR_ID,
3014
+ className: registrationRootClassName,
3015
+ "data-block": "event-registration",
3016
+ children: [
3017
+ isWizardStep ? (
3018
+ // In-flow: a lightweight teaser at the block's position. The full wizard
3019
+ // lives in the sheet, so there is only ever one form surface mounted.
3020
+ /* @__PURE__ */ jsx("div", { className: "er-booking-teaser", children: renderBookingEntry("er-booking-teaser") })
3021
+ ) : (
3022
+ // Terminal states (success, error, payment verification on redirect
3023
+ // return) render in the page where the visitor lands, unless the sheet is
3024
+ // open and already showing them.
3025
+ !bookingOverlayOpen && renderRegistrationSurface("inline")
3026
+ ),
3027
+ floatingBookingLayer,
3028
+ bookingOverlayLayer
3029
+ ]
3030
+ }
3031
+ );
2896
3032
  }
2897
3033
  function isPastOccurrence(startsAt) {
2898
3034
  if (!startsAt) return false;
@@ -3081,6 +3217,32 @@ function TeamMemberName({
3081
3217
  }) {
3082
3218
  return profilePath ? /* @__PURE__ */ jsx("a", { href: profilePath, className: "rb-hover-opacity-80", children: /* @__PURE__ */ jsx("strong", { children: name }) }) : /* @__PURE__ */ jsx("strong", { children: name });
3083
3219
  }
3220
+ function formatTicketTypePrice2(ticketType, currency) {
3221
+ return formatCurrencyAmount(ticketType.priceAmount, currency, { decimals: "auto" });
3222
+ }
3223
+ function getActiveTicketTypes2(event) {
3224
+ return event.pricing.kind === "ticket_types" ? event.pricing.ticketTypes.filter((ticketType) => ticketType.isActive).sort((left, right) => left.sortOrder - right.sortOrder) : [];
3225
+ }
3226
+ function TicketTypePriceList({
3227
+ ticketTypes,
3228
+ currency
3229
+ }) {
3230
+ if (ticketTypes.length === 0) return null;
3231
+ return /* @__PURE__ */ jsx("div", { className: "rb-mt-3 rb-flex rb-flex-col rb-gap-2", children: ticketTypes.map((ticketType) => /* @__PURE__ */ jsxs(
3232
+ "div",
3233
+ {
3234
+ className: "rb-flex rb-items-start rb-justify-between rb-gap-4",
3235
+ children: [
3236
+ /* @__PURE__ */ jsxs("div", { children: [
3237
+ /* @__PURE__ */ jsx("p", { children: ticketType.name }),
3238
+ ticketType.description ? /* @__PURE__ */ jsx("p", { className: "rb-caption status-muted", children: ticketType.description }) : null
3239
+ ] }),
3240
+ /* @__PURE__ */ jsx("p", { children: /* @__PURE__ */ jsx("strong", { children: formatTicketTypePrice2(ticketType, currency) }) })
3241
+ ]
3242
+ },
3243
+ ticketType.id
3244
+ )) });
3245
+ }
3084
3246
  function EventDetailsView({
3085
3247
  selection,
3086
3248
  showVenue,
@@ -3115,6 +3277,7 @@ function EventDetailsView({
3115
3277
  const shouldShowCoursePricing = showCost && !isDropIn && coursePricing !== null;
3116
3278
  const shouldShowEventCost = showCost && isPaid && !isDropIn && coursePricing === null;
3117
3279
  const eventCostLabel = shouldShowEventCost ? formatEventPrice(selected) : null;
3280
+ const ticketTypes = shouldShowEventCost ? getActiveTicketTypes2(selected) : [];
3118
3281
  const acceptedItems = [];
3119
3282
  if (showAcceptedPasses) {
3120
3283
  acceptedItems.push(...applicablePasses.map((p) => p.name));
@@ -3171,6 +3334,7 @@ function EventDetailsView({
3171
3334
  /* @__PURE__ */ jsx("div", { className: "rb-label rb-mb-2", children: "Cost" }),
3172
3335
  /* @__PURE__ */ jsx("p", { children: /* @__PURE__ */ jsx("strong", { children: eventCostLabel }) }),
3173
3336
  autoApplyDiscount ? /* @__PURE__ */ jsx("p", { className: "rb-caption rb-mt-1", children: formatAutoApplyDiscountLine(autoApplyDiscount, eventPricingCurrency) }) : null,
3337
+ /* @__PURE__ */ jsx(TicketTypePriceList, { ticketTypes, currency: eventPricingCurrency }),
3174
3338
  hasAcceptedItems ? /* @__PURE__ */ jsxs("p", { className: "rb-caption rb-mt-1", children: [
3175
3339
  "You can also attend with: ",
3176
3340
  acceptedItems.join(", ")
@@ -3534,9 +3698,74 @@ var EventPaginatedListView = ({
3534
3698
  }
3535
3699
  );
3536
3700
  };
3701
+
3702
+ // ../blocks/src/system/runtime/hooks/loadStateError.ts
3703
+ function toError(error, fallbackMessage) {
3704
+ return error instanceof Error ? error : new Error(fallbackMessage);
3705
+ }
3706
+
3707
+ // ../blocks/src/system/runtime/hooks/useEventPagination.state.ts
3708
+ function createInitialEventPaginationLoadState(events, pageSize) {
3709
+ return {
3710
+ kind: "ready",
3711
+ events,
3712
+ hasMore: hasMoreEventPages(events, pageSize)
3713
+ };
3714
+ }
3715
+ function eventPaginationLoadReducer(state, action) {
3716
+ switch (action.type) {
3717
+ case "started":
3718
+ return {
3719
+ kind: "loading",
3720
+ events: state.events,
3721
+ hasMore: action.reset ? true : state.hasMore
3722
+ };
3723
+ case "succeeded":
3724
+ return {
3725
+ kind: "ready",
3726
+ events: action.events,
3727
+ hasMore: action.hasMore
3728
+ };
3729
+ case "failed":
3730
+ return {
3731
+ kind: "error",
3732
+ events: state.events,
3733
+ hasMore: state.hasMore,
3734
+ error: action.error
3735
+ };
3736
+ case "synced":
3737
+ return createInitialEventPaginationLoadState(action.events, action.pageSize);
3738
+ default:
3739
+ return assertNever11(action);
3740
+ }
3741
+ }
3537
3742
  function getEventIdentity(event) {
3538
3743
  return event.occurrenceId || event.id;
3539
3744
  }
3745
+ function mergeEventPaginationEvents(existingEvents, newEvents) {
3746
+ const existingIds = new Set(existingEvents.map(getEventIdentity));
3747
+ const uniqueNew = newEvents.filter(
3748
+ (event) => !existingIds.has(getEventIdentity(event))
3749
+ );
3750
+ return [...existingEvents, ...uniqueNew];
3751
+ }
3752
+ function toEventPaginationLoadError(error) {
3753
+ return toError(error, "Unknown error");
3754
+ }
3755
+ function getEventPaginationEvents(state) {
3756
+ return state.events;
3757
+ }
3758
+ function isEventPaginationLoading(state) {
3759
+ return state.kind === "loading";
3760
+ }
3761
+ function getEventPaginationError(state) {
3762
+ return state.kind === "error" ? state.error : null;
3763
+ }
3764
+ function hasMoreEventPages(events, pageSize) {
3765
+ return events.length >= pageSize;
3766
+ }
3767
+
3768
+ // ../blocks/src/system/runtime/hooks/useEventPagination.ts
3540
3769
  function getEventsKey(events) {
3541
3770
  return events.map((e) => `${getEventIdentity(e)}:${e.startsAt}`).join("|");
3542
3771
  }
@@ -3559,10 +3788,15 @@ function useEventPagination({
3559
3788
  useEffect(() => {
3560
3789
  initialEventsRef.current = initialEvents;
3561
3790
  }, [initialEventsKey]);
3562
- const [events, setEvents] = useState(initialEvents);
3563
- const [loading, setLoading] = useState(false);
3564
- const [error, setError] = useState(null);
3565
- const [hasMore, setHasMore] = useState(initialEvents.length >= pageSize);
3791
+ const [loadState, dispatchLoadState] = useReducer(
3792
+ eventPaginationLoadReducer,
3793
+ { events: initialEvents, pageSize },
3794
+ ({ events: events2, pageSize: initialPageSize }) => createInitialEventPaginationLoadState(events2, initialPageSize)
3795
+ );
3796
+ const events = getEventPaginationEvents(loadState);
3797
+ const loading = isEventPaginationLoading(loadState);
3798
+ const error = getEventPaginationError(loadState);
3799
+ const hasMore = loadState.hasMore;
3566
3800
  const normalizedCategoryIds = normalizeCsvString(filters?.categoryIds);
3567
3801
  const normalizedStaffMemberId = normalizeOptionalId(filters?.staffMemberId);
3568
3802
  const normalizedVenueId = normalizeOptionalId(filters?.venueId);
@@ -3587,9 +3821,11 @@ function useEventPagination({
3587
3821
  if (loadingRef.current) return;
3588
3822
  if (!hasMoreRef.current && !options.reset) return;
3589
3823
  const currentRequestId = ++requestIdRef.current;
3590
- setLoading(true);
3824
+ dispatchLoadState({ type: "started", reset: options.reset });
3591
3825
  loadingRef.current = true;
3592
- setError(null);
3826
+ if (options.reset) {
3827
+ hasMoreRef.current = true;
3828
+ }
3593
3829
  try {
3594
3830
  const currentEvents = eventsRef.current;
3595
3831
  const lastEvent = options.reset ? void 0 : currentEvents[currentEvents.length - 1];
@@ -3610,29 +3846,25 @@ function useEventPagination({
3610
3846
  venueId: normalizedVenueId ?? void 0
3611
3847
  });
3612
3848
  if (currentRequestId === requestIdRef.current) {
3613
- if (options.reset) {
3614
- setEvents(newEvents);
3615
- eventsRef.current = newEvents;
3616
- } else {
3617
- setEvents((prev) => {
3618
- const existingIds = new Set(prev.map(getEventIdentity));
3619
- const uniqueNew = newEvents.filter((e) => !existingIds.has(getEventIdentity(e)));
3620
- const updated = [...prev, ...uniqueNew];
3621
- eventsRef.current = updated;
3622
- return updated;
3623
- });
3624
- }
3625
- const nextHasMore = newEvents.length >= pageSize;
3626
- setHasMore(nextHasMore);
3849
+ const nextEvents = options.reset ? newEvents : mergeEventPaginationEvents(eventsRef.current, newEvents);
3850
+ const nextHasMore = hasMoreEventPages(newEvents, pageSize);
3851
+ dispatchLoadState({
3852
+ type: "succeeded",
3853
+ events: nextEvents,
3854
+ hasMore: nextHasMore
3855
+ });
3856
+ eventsRef.current = [...nextEvents];
3627
3857
  hasMoreRef.current = nextHasMore;
3628
3858
  }
3629
3859
  } catch (err) {
3630
3860
  if (currentRequestId === requestIdRef.current) {
3631
- setError(err instanceof Error ? err : new Error("Unknown error"));
3861
+ dispatchLoadState({
3862
+ type: "failed",
3863
+ error: toEventPaginationLoadError(err)
3864
+ });
3632
3865
  }
3633
3866
  } finally {
3634
3867
  if (currentRequestId === requestIdRef.current) {
3635
- setLoading(false);
3636
3868
  loadingRef.current = false;
3637
3869
  }
3638
3870
  }
@@ -3674,19 +3906,20 @@ function useEventPagination({
3674
3906
  try {
3675
3907
  if (filtersMatchInitial) {
3676
3908
  if (!prevFiltersMatchInitial || prevInitialEventsKey !== initialEventsKey) {
3677
- setEvents(latestInitialEvents);
3909
+ dispatchLoadState({
3910
+ type: "synced",
3911
+ events: latestInitialEvents,
3912
+ pageSize
3913
+ });
3678
3914
  eventsRef.current = latestInitialEvents;
3679
3915
  }
3680
- const nextHasMore = latestInitialEvents.length >= pageSize;
3916
+ const nextHasMore = hasMoreEventPages(latestInitialEvents, pageSize);
3681
3917
  if (hasMoreRef.current !== nextHasMore) {
3682
- setHasMore(nextHasMore);
3683
3918
  hasMoreRef.current = nextHasMore;
3684
3919
  }
3685
- if (error !== null) setError(null);
3686
3920
  return;
3687
3921
  }
3688
3922
  if (prevFiltersMatchInitial || prevFiltersKey !== filtersKey) {
3689
- setHasMore(true);
3690
3923
  hasMoreRef.current = true;
3691
3924
  void fetchPage({ reset: true });
3692
3925
  }
@@ -3695,7 +3928,7 @@ function useEventPagination({
3695
3928
  prevInitialEventsKeyRef.current = initialEventsKey;
3696
3929
  prevFiltersKeyRef.current = filtersKey;
3697
3930
  }
3698
- }, [error, fetchPage, filtersKey, filtersMatchInitial, initialEventsKey, pageSize]);
3931
+ }, [fetchPage, filtersKey, filtersMatchInitial, initialEventsKey, pageSize]);
3699
3932
  return {
3700
3933
  events,
3701
3934
  loading,
@@ -3704,6 +3937,43 @@ function useEventPagination({
3704
3937
  loadMore
3705
3938
  };
3706
3939
  }
3940
+
3941
+ // ../blocks/src/system/runtime/hooks/useEventFilters.state.ts
3942
+ var EMPTY_EVENT_FILTERS = Object.freeze({
3943
+ categories: [],
3944
+ venues: [],
3945
+ staffMembers: [],
3946
+ labels: Object.freeze({ courseOption: "Course" })
3947
+ });
3948
+ function createInitialEventFiltersLoadState() {
3949
+ return { kind: "idle", filters: EMPTY_EVENT_FILTERS };
3950
+ }
3951
+ function eventFiltersLoadReducer(state, action) {
3952
+ switch (action.type) {
3953
+ case "started":
3954
+ return { kind: "loading", filters: state.filters };
3955
+ case "succeeded":
3956
+ return { kind: "loaded", filters: action.filters };
3957
+ case "failed":
3958
+ return { kind: "error", filters: state.filters, error: action.error };
3959
+ default:
3960
+ return assertNever11(action);
3961
+ }
3962
+ }
3963
+ function toEventFiltersLoadError(error) {
3964
+ return toError(error, "Failed to load filters");
3965
+ }
3966
+ function getEventFiltersData(state) {
3967
+ return state.filters;
3968
+ }
3969
+ function isEventFiltersLoading(state) {
3970
+ return state.kind === "loading";
3971
+ }
3972
+ function getEventFiltersError(state) {
3973
+ return state.kind === "error" ? state.error : null;
3974
+ }
3975
+
3976
+ // ../blocks/src/system/runtime/hooks/useEventFilters.ts
3707
3977
  function useEventFilters({
3708
3978
  showCategoryFilter = "auto",
3709
3979
  showVenueFilter = false,
@@ -3717,14 +3987,14 @@ function useEventFilters({
3717
3987
  preFilterScheduleScope
3718
3988
  } = {}) {
3719
3989
  const api = useBlockApi();
3720
- const [filters, setFilters] = useState({
3721
- categories: [],
3722
- venues: [],
3723
- staffMembers: [],
3724
- labels: { courseOption: "Course" }
3725
- });
3726
- const [loading, setLoading] = useState(false);
3727
- const [error, setError] = useState(null);
3990
+ const [loadState, dispatchLoadState] = useReducer(
3991
+ eventFiltersLoadReducer,
3992
+ void 0,
3993
+ createInitialEventFiltersLoadState
3994
+ );
3995
+ const filters = getEventFiltersData(loadState);
3996
+ const loading = isEventFiltersLoading(loadState);
3997
+ const error = getEventFiltersError(loadState);
3728
3998
  const [selectedKind, setSelectedKindState] = useState("all");
3729
3999
  const [selectedCategoryId, setSelectedCategoryId] = useState("all");
3730
4000
  const [selectedStaffMemberId, setSelectedStaffMemberId] = useState("all");
@@ -3759,7 +4029,7 @@ function useEventFilters({
3759
4029
  const needFilters = showCategoryFilter !== "never" && fixedKind !== "courses" || showVenueFilter || showStaffFilter;
3760
4030
  if (!needFilters) return;
3761
4031
  hasFetchedRef.current = true;
3762
- setLoading(true);
4032
+ dispatchLoadState({ type: "started" });
3763
4033
  api.getEventFilters({
3764
4034
  categoryIds: allowedCategoryIds.length > 0 ? allowedCategoryIds.join(",") : void 0,
3765
4035
  venueId: fixedVenueId ?? void 0,
@@ -3769,12 +4039,12 @@ function useEventFilters({
3769
4039
  eventPresets: fixedEventPresets,
3770
4040
  scheduleScope: fixedScheduleScope
3771
4041
  }).then((data) => {
3772
- setFilters(data);
3773
- setError(null);
4042
+ dispatchLoadState({ type: "succeeded", filters: data });
3774
4043
  }).catch((err) => {
3775
- setError(err instanceof Error ? err : new Error("Failed to load filters"));
3776
- }).finally(() => {
3777
- setLoading(false);
4044
+ dispatchLoadState({
4045
+ type: "failed",
4046
+ error: toEventFiltersLoadError(err)
4047
+ });
3778
4048
  });
3779
4049
  }, [
3780
4050
  allowedCategoryIds,
@@ -4106,6 +4376,31 @@ var TabBar = ({
4106
4376
  }
4107
4377
  );
4108
4378
  };
4379
+
4380
+ // ../blocks/src/system/runtime/hooks/useCalendarEvents.state.ts
4381
+ function calendarEventCacheLoadReducer(_state, action) {
4382
+ switch (action.type) {
4383
+ case "started":
4384
+ return { kind: "loading" };
4385
+ case "succeeded":
4386
+ return { kind: "idle" };
4387
+ case "failed":
4388
+ return { kind: "error", error: action.error };
4389
+ default:
4390
+ return assertNever11(action);
4391
+ }
4392
+ }
4393
+ function toCalendarEventCacheLoadError(error) {
4394
+ return toError(error, "Unknown error");
4395
+ }
4396
+ function isCalendarEventCacheLoading(state) {
4397
+ return state.kind === "loading";
4398
+ }
4399
+ function getCalendarEventCacheError(state) {
4400
+ return state.kind === "error" ? state.error : null;
4401
+ }
4402
+
4403
+ // ../blocks/src/system/runtime/hooks/useCalendarEvents.ts
4109
4404
  var CALENDAR_FETCH_LIMIT = 200;
4110
4405
  function getMonthKey(date) {
4111
4406
  return `${date.getFullYear()}-${String(date.getMonth() + 1).padStart(2, "0")}`;
@@ -4149,8 +4444,10 @@ function useCalendarEventCache({
4149
4444
  stage
4150
4445
  }) {
4151
4446
  const { getPublicEvents } = useBlockApi();
4152
- const [loading, setLoading] = useState(false);
4153
- const [error, setError] = useState(null);
4447
+ const [loadState, dispatchLoadState] = useReducer(
4448
+ calendarEventCacheLoadReducer,
4449
+ { kind: "idle" }
4450
+ );
4154
4451
  const [cacheVersion, setCacheVersion] = useState(0);
4155
4452
  const filtersKey = useMemo(
4156
4453
  () => getEventRuntimeFiltersKey(filters),
@@ -4195,8 +4492,7 @@ function useCalendarEventCache({
4195
4492
  if (monthsToFetch.length === 0) return;
4196
4493
  monthsToFetch.forEach((m) => fetchingRef.current.add(m));
4197
4494
  const currentRequestId = ++requestIdRef.current;
4198
- setLoading(true);
4199
- setError(null);
4495
+ dispatchLoadState({ type: "started" });
4200
4496
  try {
4201
4497
  const result = await getPublicEvents({
4202
4498
  from,
@@ -4228,16 +4524,17 @@ function useCalendarEventCache({
4228
4524
  }
4229
4525
  }
4230
4526
  setCacheVersion((v) => v + 1);
4527
+ dispatchLoadState({ type: "succeeded" });
4231
4528
  }
4232
4529
  } catch (err) {
4233
4530
  if (currentRequestId === requestIdRef.current) {
4234
- setError(err instanceof Error ? err : new Error("Unknown error"));
4531
+ dispatchLoadState({
4532
+ type: "failed",
4533
+ error: toCalendarEventCacheLoadError(err)
4534
+ });
4235
4535
  }
4236
4536
  } finally {
4237
4537
  monthsToFetch.forEach((m) => fetchingRef.current.delete(m));
4238
- if (currentRequestId === requestIdRef.current) {
4239
- setLoading(false);
4240
- }
4241
4538
  }
4242
4539
  }, [
4243
4540
  getPublicEvents,
@@ -4287,8 +4584,8 @@ function useCalendarEventCache({
4287
4584
  }, [viewDate, cacheVersion]);
4288
4585
  return {
4289
4586
  events,
4290
- loading,
4291
- error
4587
+ loading: isCalendarEventCacheLoading(loadState),
4588
+ error: getCalendarEventCacheError(loadState)
4292
4589
  };
4293
4590
  }
4294
4591
  function useCalendarEvents({
@@ -1,6 +1,6 @@
1
- import { FeedbackMessage } from './chunk-UDNSI5PY.mjs';
2
- import { themeButtonClassName } from './chunk-VGDBVNOO.mjs';
3
- import { clsx_default } from './chunk-ZE5G642V.mjs';
1
+ import { FeedbackMessage } from './chunk-STJ2NCQM.mjs';
2
+ import { themeButtonClassName } from './chunk-UQFY4AHX.mjs';
3
+ import { formatCurrencyAmount, clsx_default } from './chunk-25W2EQUN.mjs';
4
4
  import { useId } from 'react';
5
5
  import { jsx, jsxs, Fragment } from 'react/jsx-runtime';
6
6
 
@@ -213,10 +213,7 @@ var DEFAULT_CURRENCY = "GBP";
213
213
 
214
214
  // ../blocks/src/system/runtime/shared/utils/formatting.ts
215
215
  function formatPrice(cents, currency = DEFAULT_CURRENCY, locale) {
216
- return new Intl.NumberFormat(locale, {
217
- style: "currency",
218
- currency: currency.toUpperCase()
219
- }).format(cents / 100);
216
+ return formatCurrencyAmount(cents, currency, { locale });
220
217
  }
221
218
 
222
219
  // ../blocks/src/system/runtime/shared/utils/portalLogout.ts
@@ -1,4 +1,4 @@
1
- import { clsx_default } from './chunk-ZE5G642V.mjs';
1
+ import { clsx_default } from './chunk-25W2EQUN.mjs';
2
2
  import { jsxs, jsx } from 'react/jsx-runtime';
3
3
 
4
4
  function resolveColorStyle(color) {
@@ -1,5 +1,5 @@
1
1
  "use client";
2
- import { assertNever11 } from './chunk-VGDBVNOO.mjs';
2
+ import { assertNever11 } from './chunk-UQFY4AHX.mjs';
3
3
  import { useReducer, useRef, useCallback, useEffect } from 'react';
4
4
 
5
5
  // ../blocks/src/system/runtime/hooks/usePolling.state.ts