@riverbankcms/sdk 0.88.0 → 0.90.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 (198) hide show
  1. package/README.md +27 -4
  2. package/dist/{PreviewEditorSidebar-EVRS3C7T.mjs → PreviewEditorSidebar-KVXNF3VW.mjs} +3 -3
  3. package/dist/{PreviewEditorUI-54WD4IGE.mjs → PreviewEditorUI-J3JN5Z7T.mjs} +3 -3
  4. package/dist/SdkPreviewModeRuntime-UBL6MSNP.mjs +8 -0
  5. package/dist/_dts/ai/src/contracts/proposals.d.ts +216 -0
  6. package/dist/_dts/altcha/src/AltchaWidget.d.ts +1 -1
  7. package/dist/_dts/api/src/accessAdmin.d.ts +7 -0
  8. package/dist/_dts/api/src/bookingOperations.d.ts +2 -0
  9. package/dist/_dts/api/src/bookingRecords.d.ts +4 -2
  10. package/dist/_dts/api/src/bookings.d.ts +3 -1
  11. package/dist/_dts/api/src/endpoints.d.ts +8 -0
  12. package/dist/_dts/api/src/index.d.ts +7 -6
  13. package/dist/_dts/api/src/publicExperienceEndpoints.d.ts +15 -5
  14. package/dist/_dts/api/src/request.d.ts +21 -0
  15. package/dist/_dts/api/src/sdk-event-upsert.d.ts +3 -1
  16. package/dist/_dts/api/src/sdkContracts.d.ts +2 -0
  17. package/dist/_dts/api/src/siteManagementEndpoints.d.ts +5 -1
  18. package/dist/_dts/api/src/siteMembers.d.ts +6 -1
  19. package/dist/_dts/api/src/types.d.ts +4 -2
  20. package/dist/_dts/api/src/url.d.ts +6 -3
  21. package/dist/_dts/block-form/src/utils/visibleWhen.d.ts +1 -0
  22. package/dist/_dts/block-form/src/widgets/RepeaterField/components/RepeaterThumbnailCard.d.ts +5 -1
  23. package/dist/_dts/block-form/src/widgets/RepeaterField/components/RepeaterThumbnailGrid.d.ts +9 -1
  24. package/dist/_dts/block-form/src/widgets/RepeaterField/components/index.d.ts +1 -0
  25. package/dist/_dts/blocks/src/contracts/non-block-islands.d.ts +7 -11
  26. package/dist/_dts/blocks/src/contracts/proof-block-islands.d.ts +6 -0
  27. package/dist/_dts/blocks/src/index.d.ts +2 -1
  28. package/dist/_dts/blocks/src/system/blocks/events/event-calendar.d.ts +14 -6
  29. package/dist/_dts/blocks/src/system/blocks/events/shared/types.d.ts +4 -4
  30. package/dist/_dts/blocks/src/system/blocks/hero.d.ts +0 -2
  31. package/dist/_dts/blocks/src/system/blocks/shop.d.ts +3 -3
  32. package/dist/_dts/blocks/src/system/blocks/shop.shared.d.ts +8 -0
  33. package/dist/_dts/blocks/src/system/constants/events.d.ts +4 -1
  34. package/dist/_dts/blocks/src/system/icons/cta.d.ts +3 -3
  35. package/dist/_dts/blocks/src/system/icons/index.d.ts +1 -0
  36. package/dist/_dts/blocks/src/system/icons/registry.d.ts +2 -2
  37. package/dist/_dts/blocks/src/system/icons/semantic.d.ts +3 -3
  38. package/dist/_dts/blocks/src/system/icons/svg.d.ts +72 -0
  39. package/dist/_dts/blocks/src/system/manifest/schema.d.ts +3 -1
  40. package/dist/_dts/blocks/src/system/runtime/api/index.d.ts +1 -0
  41. package/dist/_dts/blocks/src/system/runtime/api/types.d.ts +18 -5
  42. package/dist/_dts/blocks/src/system/runtime/components/registry.client.d.ts +51 -6
  43. package/dist/_dts/blocks/src/system/runtime/components/runtime-backed-blocks.d.ts +24 -0
  44. package/dist/_dts/blocks/src/system/runtime/hooks/loadStateError.d.ts +1 -0
  45. package/dist/_dts/blocks/src/system/runtime/hooks/useAvailableDates.d.ts +1 -1
  46. package/dist/_dts/blocks/src/system/runtime/hooks/useAvailableDates.state.d.ts +55 -0
  47. package/dist/_dts/blocks/src/system/runtime/hooks/useAvailableSlots.state.d.ts +39 -0
  48. package/dist/_dts/blocks/src/system/runtime/hooks/useBookingFormConfig.d.ts +4 -27
  49. package/dist/_dts/blocks/src/system/runtime/hooks/useBookingFormConfig.state.d.ts +40 -0
  50. package/dist/_dts/blocks/src/system/runtime/hooks/useCalendarEvents.state.d.ts +20 -0
  51. package/dist/_dts/blocks/src/system/runtime/hooks/useEventFilters.state.d.ts +31 -0
  52. package/dist/_dts/blocks/src/system/runtime/hooks/useEventPagination.d.ts +3 -3
  53. package/dist/_dts/blocks/src/system/runtime/hooks/useEventPagination.state.d.ts +39 -0
  54. package/dist/_dts/blocks/src/system/runtime/nodes/course-registration/useCourseRegistrationWizard.d.ts +2 -2
  55. package/dist/_dts/blocks/src/system/runtime/nodes/event-details/logic.d.ts +1 -17
  56. package/dist/_dts/blocks/src/system/runtime/nodes/event-details.client.d.ts +5 -9
  57. package/dist/_dts/blocks/src/system/runtime/nodes/event-details.server.d.ts +5 -9
  58. package/dist/_dts/blocks/src/system/runtime/nodes/event-registration/event-registration.headless.contract.d.ts +2 -1
  59. package/dist/_dts/blocks/src/system/runtime/nodes/event-registration/eventPaymentOptions.d.ts +24 -0
  60. package/dist/_dts/blocks/src/system/runtime/nodes/event-registration/types.d.ts +5 -0
  61. package/dist/_dts/blocks/src/system/runtime/nodes/event-registration/useDiscountCodeUi.d.ts +4 -4
  62. package/dist/_dts/blocks/src/system/runtime/nodes/event-registration/useDiscountCodeUi.state.d.ts +50 -0
  63. package/dist/_dts/blocks/src/system/runtime/nodes/event-registration/useEventRegistrationWizard.d.ts +2 -2
  64. package/dist/_dts/blocks/src/system/runtime/nodes/event-registration.interactive.d.ts +21 -0
  65. package/dist/_dts/blocks/src/system/runtime/nodes/event-registration.server.d.ts +1 -1
  66. package/dist/_dts/blocks/src/system/runtime/nodes/events/EventCalendar.interactive.d.ts +11 -1
  67. package/dist/_dts/blocks/src/system/runtime/nodes/events/EventCombined.client.d.ts +2 -1
  68. package/dist/_dts/blocks/src/system/runtime/nodes/events/EventCombined.interactive.d.ts +11 -1
  69. package/dist/_dts/blocks/src/system/runtime/nodes/events/shared/EventPaginatedListView.client.d.ts +1 -1
  70. package/dist/_dts/blocks/src/system/runtime/nodes/events/shared/calendarViewOptions.d.ts +10 -0
  71. package/dist/_dts/blocks/src/system/runtime/nodes/events/shared/eventProductEligibility.d.ts +24 -0
  72. package/dist/_dts/blocks/src/system/runtime/nodes/newsletter-form.client.state.d.ts +24 -2
  73. package/dist/_dts/blocks/src/system/runtime/nodes/shared/MagicLinkForm.state.d.ts +24 -0
  74. package/dist/_dts/blocks/src/system/runtime/nodes/shared/contract-schemas.d.ts +5 -2
  75. package/dist/_dts/blocks/src/system/runtime/nodes/shop-checkout-form.d.ts +2 -2
  76. package/dist/_dts/blocks/src/system/runtime/shared/useWaitlistClaim.state.d.ts +35 -0
  77. package/dist/_dts/content-model/src/entry-slots/index.d.ts +1 -0
  78. package/dist/_dts/content-model/src/entry-slots/sdkBlocks.d.ts +21 -0
  79. package/dist/_dts/content-model/src/entry-slots/types.d.ts +61 -0
  80. package/dist/_dts/core/src/branded.d.ts +7 -0
  81. package/dist/_dts/core/src/index.d.ts +1 -0
  82. package/dist/_dts/core/src/money-input.d.ts +18 -0
  83. package/dist/_dts/core/src/site-route-target.d.ts +40 -0
  84. package/dist/_dts/db/src/generated/supabase/database.types.d.ts +209 -2
  85. package/dist/_dts/media-core/src/fileDomain.d.ts +4 -0
  86. package/dist/_dts/media-editor/src/MediaEditor.d.ts +2 -1
  87. package/dist/_dts/media-editor/src/fieldUi.d.ts +6 -0
  88. package/dist/_dts/media-editor/src/index.d.ts +1 -1
  89. package/dist/_dts/preview-next/src/client/index.d.ts +1 -0
  90. package/dist/_dts/preview-next/src/client/preview/PreviewShell.d.ts +3 -2
  91. package/dist/_dts/preview-next/src/client/preview/PreviewShellLayout.d.ts +3 -2
  92. package/dist/_dts/preview-next/src/client/preview/PreviewThemedSiteDocument.d.ts +3 -2
  93. package/dist/_dts/preview-next/src/client/preview/SiteChromeEditableSurface.d.ts +2 -2
  94. package/dist/_dts/preview-next/src/client/preview/themeRuntime.d.ts +6 -0
  95. package/dist/_dts/preview-next/src/client/sdk/SdkPreviewMode.d.ts +2 -1
  96. package/dist/_dts/sdk/src/cli/commands/pull-dated-offering-scope.d.ts +10 -0
  97. package/dist/_dts/sdk/src/cli/content/reader.d.ts +12 -5
  98. package/dist/_dts/sdk/src/client/management/types.d.ts +6 -55
  99. package/dist/_dts/sdk/src/client/runtimeCachePolicy.d.ts +160 -0
  100. package/dist/_dts/sdk/src/client/types.d.ts +26 -1
  101. package/dist/_dts/sdk/src/components.d.ts +1 -0
  102. package/dist/_dts/sdk/src/config/field-definitions.d.ts +3 -1
  103. package/dist/_dts/sdk/src/contracts/system-block-content.d.ts +3 -1
  104. package/dist/_dts/sdk/src/index.d.ts +3 -1
  105. package/dist/_dts/sdk/src/next/types.d.ts +8 -11
  106. package/dist/_dts/sdk/src/preview-next/client/index.d.ts +1 -1
  107. package/dist/_dts/sdk/src/rendering/blocks-theme-scope.d.ts +2 -1
  108. package/dist/_dts/sdk/src/rendering/components/Layout.d.ts +8 -7
  109. package/dist/_dts/sdk/src/rendering/components/pageShared.d.ts +5 -6
  110. package/dist/_dts/sdk/src/rendering/index.d.ts +1 -0
  111. package/dist/_dts/sdk/src/rendering/server.d.ts +1 -0
  112. package/dist/_dts/sdk/src/rendering/themeRuntime.d.ts +26 -0
  113. package/dist/_dts/sdk/src/version.d.ts +1 -1
  114. package/dist/_dts/site-commands/src/commands.d.ts +18 -0
  115. package/dist/_dts/theme-core/src/ResponsiveScope.d.ts +12 -0
  116. package/dist/_dts/theme-core/src/accordions/types.d.ts +1 -1
  117. package/dist/_dts/theme-core/src/buttons/personalities/types.d.ts +2 -2
  118. package/dist/_dts/theme-core/src/buttons/types.d.ts +5 -5
  119. package/dist/_dts/theme-core/src/cards/types.d.ts +2 -2
  120. package/dist/_dts/theme-core/src/generated/containerResponsiveThemeCss.d.ts +1 -1
  121. package/dist/_dts/theme-core/src/index.d.ts +2 -0
  122. package/dist/_dts/theme-core/src/mock-themes/all.d.ts +21 -21
  123. package/dist/_dts/theme-core/src/schema.d.ts +18 -18
  124. package/dist/_dts/theme-core/src/site-styles/designState.d.ts +2 -2
  125. package/dist/_dts/theme-core/src/site-styles/generatedSchemas.d.ts +2 -2
  126. package/dist/_dts/theme-core/src/site-styles/logoBranding.d.ts +4 -4
  127. package/dist/_dts/theme-core/src/themeRuntime.d.ts +11 -0
  128. package/dist/{chunk-ER4UIW4X.mjs → chunk-AEOYWPE4.mjs} +91 -55
  129. package/dist/{chunk-O4LVYUVH.mjs → chunk-BOQXMCSP.mjs} +147 -101
  130. package/dist/{chunk-HVOBXA3Y.mjs → chunk-GSPFFUVB.mjs} +2 -2
  131. package/dist/{chunk-7KOO7RPP.mjs → chunk-PMBB6MQ7.mjs} +2273 -1113
  132. package/dist/{chunk-K3JWH6HE.mjs → chunk-RQ3XZ4SJ.mjs} +9 -1
  133. package/dist/{chunk-YDMBIIS5.mjs → chunk-UG7I7S7W.mjs} +1 -1
  134. package/dist/cli/index.mjs +1564 -546
  135. package/dist/cli/init-docs/content/cli-reference.md +6 -1
  136. package/dist/cli/init-docs/content/content-management.md +27 -0
  137. package/dist/client/{accordion-PT5CGW5N.mjs → accordion-GXQNWQ6O.mjs} +2 -2
  138. package/dist/client/{bookingForm-2HLRTEYS.mjs → bookingForm-STLUJ36H.mjs} +206 -335
  139. package/dist/client/bookings.mjs +821 -413
  140. package/dist/client/{carousel-Z2LKYSWA.mjs → carousel-CVRN6EPP.mjs} +4 -3
  141. package/dist/client/{cart-ND5IK4A6.mjs → cart-IYIBA5CL.mjs} +8 -8
  142. package/dist/client/{checkout-EYUSGAY7.mjs → checkout-O3BGM4GS.mjs} +8 -8
  143. package/dist/client/chunk-4RTFGHZN.mjs +433 -0
  144. package/dist/client/{chunk-DIRW2LNG.mjs → chunk-6DPXDOIL.mjs} +336 -225
  145. package/dist/client/chunk-6N7YRNYU.mjs +183 -0
  146. package/dist/client/{chunk-O5JNI3E4.mjs → chunk-7DH35FGA.mjs} +2 -2
  147. package/dist/client/{chunk-S4G65LGR.mjs → chunk-D3ETC2SU.mjs} +1 -1
  148. package/dist/client/{chunk-BAWHZ5GM.mjs → chunk-DAS5CIER.mjs} +460 -157
  149. package/dist/client/{chunk-6DVPO44G.mjs → chunk-FHU6PFPM.mjs} +1 -1
  150. package/dist/client/{chunk-SDIYSQAY.mjs → chunk-HIHOQGIP.mjs} +2 -3
  151. package/dist/client/{chunk-BL66UWGD.mjs → chunk-MFPKS6QS.mjs} +13 -16
  152. package/dist/client/{chunk-X7GVFB7Y.mjs → chunk-NBFRJ5NB.mjs} +157 -5
  153. package/dist/client/{chunk-WCVK4MBJ.mjs → chunk-VFHZLZAC.mjs} +1 -1
  154. package/dist/client/{chunk-GOFO7HRH.mjs → chunk-WHZQDPBZ.mjs} +19 -1
  155. package/dist/client/{chunk-MHBEWDT7.mjs → chunk-Z62JYS5O.mjs} +122 -50
  156. package/dist/client/client.mjs +5979 -5198
  157. package/dist/client/{courseRegistration-H3AZBUEG.mjs → courseRegistration-2D3ACMJR.mjs} +20 -58
  158. package/dist/client/{eventCalendar-FPKJGLGS.mjs → eventCalendar-QY4UZUFF.mjs} +11 -11
  159. package/dist/client/{eventCombined-QCGIZBUY.mjs → eventCombined-RRCDKJC2.mjs} +11 -11
  160. package/dist/client/{eventDetails-HIT3BJWU.mjs → eventDetails-YO335BUT.mjs} +11 -11
  161. package/dist/client/{eventListing-R4HNWJDN.mjs → eventListing-PXA6GFQ3.mjs} +11 -11
  162. package/dist/client/{eventRegistration-Q7BYY5HF.mjs → eventRegistration-2ZHEDDXO.mjs} +11 -11
  163. package/dist/client/{form-NI6YOG6S.mjs → form-ZS6KX4U2.mjs} +7 -7
  164. package/dist/client/{headerSection-SDYGII36.mjs → headerSection-QK5SLIIB.mjs} +3 -3
  165. package/dist/client/hooks.mjs +1102 -1029
  166. package/dist/client/{locationMap-BDETEUQD.mjs → locationMap-GFNIUD2X.mjs} +3 -3
  167. package/dist/client/{newsletterForm-EKYIU67X.mjs → newsletterForm-PGLTTCUG.mjs} +61 -25
  168. package/dist/client/{productDetail-5UTGNN76.mjs → productDetail-OPBE5ZPI.mjs} +8 -8
  169. package/dist/client/{productList-7YA5KXZQ.mjs → productList-NI72Q62Z.mjs} +8 -8
  170. package/dist/client/rendering/client.mjs +4390 -4245
  171. package/dist/client/rendering/islands.mjs +19 -19
  172. package/dist/client/rendering.mjs +3327 -3181
  173. package/dist/client/{shop-AIMUMZYC.mjs → shop-3ZQPEWYI.mjs} +8 -8
  174. package/dist/client/spam-protection.mjs +4 -5
  175. package/dist/preview-next/before-render.mjs +20 -2
  176. package/dist/preview-next/client/runtime.mjs +5 -5
  177. package/dist/preview-next/middleware.mjs +18 -0
  178. package/dist/{sdk-runtime-NW472WNT.mjs → sdk-runtime-FSHXCWDS.mjs} +6 -6
  179. package/dist/server/components.mjs +2580 -2783
  180. package/dist/server/config-validation.mjs +1334 -1261
  181. package/dist/server/config.mjs +1334 -1261
  182. package/dist/server/data.mjs +1102 -1029
  183. package/dist/server/index.mjs +1097 -476
  184. package/dist/server/navigation.mjs +20 -30
  185. package/dist/server/next.mjs +3282 -2847
  186. package/dist/server/page-converter.mjs +1009 -946
  187. package/dist/server/prebuild.mjs +1 -1
  188. package/dist/server/rendering/server.mjs +2580 -2783
  189. package/dist/server/rendering.mjs +2586 -2789
  190. package/dist/server/routing.mjs +1440 -1053
  191. package/dist/server/server.mjs +1886 -1153
  192. package/dist/server/theme-bridge.mjs +34 -5
  193. package/dist/styles/index.css +26 -0
  194. package/package.json +3 -2
  195. package/dist/SdkPreviewModeRuntime-ZALZDJEK.mjs +0 -8
  196. package/dist/client/chunk-H4MHEXYS.mjs +0 -184
  197. package/dist/client/chunk-ZFHRN6W2.mjs +0 -66
  198. /package/dist/client/{chunk-LI2C6M5O.mjs → chunk-25W2EQUN.mjs} +0 -0
@@ -1,4 +1,4 @@
1
- import { clsx_default } from './chunk-LI2C6M5O.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,6 +1,5 @@
1
1
  "use client";
2
- import { useRef, useEffect } from 'react';
3
- import { jsx } from 'react/jsx-runtime';
2
+ import { useRef, useEffect, createElement } from 'react';
4
3
 
5
4
  // ../altcha/src/AltchaWidget.tsx
6
5
  function AltchaWidget({
@@ -46,7 +45,7 @@ function AltchaWidget({
46
45
  }
47
46
  };
48
47
  }, [challengeUrl, auto, hidelogo, className, onSolutionChange]);
49
- return /* @__PURE__ */ jsx("div", { ref: containerRef });
48
+ return createElement("div", { ref: containerRef });
50
49
  }
51
50
 
52
51
  // ../altcha/src/client.ts
@@ -1,14 +1,13 @@
1
1
  "use client";
2
- import { addPassToCommerceCart, useCommerceCart } from './chunk-WCVK4MBJ.mjs';
3
- import { CarouselNodeClient } from './chunk-O5JNI3E4.mjs';
4
- import { useDiscountCodeUi } from './chunk-ZFHRN6W2.mjs';
2
+ import { addPassToCommerceCart, useCommerceCart } from './chunk-VFHZLZAC.mjs';
3
+ import { CarouselNodeClient } from './chunk-7DH35FGA.mjs';
5
4
  import { buildRouteIslandApiConfig } from './chunk-L4J5Y62O.mjs';
6
- import { createBodyThemePortalRoot, consumeSearchParams, scrollToBlock, TerminalPanel, StateIcon, CheckIcon, CrossIcon, ActionRow, DiscountCodeDisclosure, consumeSearchParam, buildCheckoutReturnUrls } from './chunk-X7GVFB7Y.mjs';
5
+ import { useDiscountCodeUi, createBodyThemePortalRoot, consumeSearchParams, scrollToBlock, TerminalPanel, StateIcon, CheckIcon, CrossIcon, ActionRow, DiscountCodeDisclosure, consumeSearchParam, buildCheckoutReturnUrls } from './chunk-NBFRJ5NB.mjs';
7
6
  import { ModalShell, resolveDedicatedCheckoutPath } from './chunk-WBQG7VJA.mjs';
8
- import { useBlockApi, FeedbackMessage, BlockApiProvider } from './chunk-GOFO7HRH.mjs';
7
+ import { useBlockApi, FeedbackMessage, BlockApiProvider, discountAvailabilityHasDiscounts, discountAvailabilityAllowsManualEntry, getAutoAppliedDiscountPreview } from './chunk-WHZQDPBZ.mjs';
9
8
  import { mountReactIsland } from './chunk-N7PBWBWQ.mjs';
10
- import { themeButtonClassName, formatCommercePrice, formatInterval, getShopDisplayForItems, deriveCommerceCheckoutState, buildProductDetailDisplay, productItemKey, buildProductCartItem, buildProductCardDisplay, assertNever11, reportWorkflowError, clearWorkflowFeedback, unwrapRichTextRoot, createRichTextDocFromMarkdown, isRecord } from './chunk-DIRW2LNG.mjs';
11
- import { assertNever, ok, err, getCurrentResolveImageUrlContext, resolveImageUrlWithContext, ImagePresets } from './chunk-LI2C6M5O.mjs';
9
+ import { themeButtonClassName, formatCommercePrice, formatInterval, getShopDisplayForItems, deriveCommerceCheckoutState, buildProductDetailDisplay, productItemKey, buildProductCartItem, buildProductCardDisplay, assertNever as assertNever$1, reportWorkflowError, clearWorkflowFeedback, unwrapRichTextRoot, createRichTextDocFromMarkdown, isRecord } from './chunk-6DPXDOIL.mjs';
10
+ import { assertNever, ok, err, getCurrentResolveImageUrlContext, resolveImageUrlWithContext, ImagePresets } from './chunk-25W2EQUN.mjs';
12
11
  import * as React3 from 'react';
13
12
  import React3__default, { useState, useRef, useCallback, useEffect } from 'react';
14
13
  import { jsx, jsxs, Fragment } from 'react/jsx-runtime';
@@ -443,7 +442,7 @@ function shopCheckoutReducer(state, action) {
443
442
  notice: action.notice
444
443
  };
445
444
  default:
446
- return assertNever11(action);
445
+ return assertNever$1(action);
447
446
  }
448
447
  }
449
448
 
@@ -574,15 +573,13 @@ function planCartDiscountAvailabilityRequests(checkout) {
574
573
  }));
575
574
  }
576
575
  function aggregateCartDiscountUiState(availability) {
577
- if (!availability.some((item) => item.hasDiscounts)) {
576
+ if (!availability.some(discountAvailabilityHasDiscounts)) {
578
577
  return { type: "unavailable" };
579
578
  }
580
- if (availability.some((item) => item.manualCodeEntryAllowed)) {
579
+ if (availability.some(discountAvailabilityAllowsManualEntry)) {
581
580
  return { type: "manual-allowed" };
582
581
  }
583
- const autoAppliedDiscount = availability.find(
584
- (item) => item.autoAppliedDiscount
585
- )?.autoAppliedDiscount ?? null;
582
+ const autoAppliedDiscount = availability.map(getAutoAppliedDiscountPreview).find((discount) => discount !== null) ?? null;
586
583
  return {
587
584
  type: "auto-only",
588
585
  autoAppliedDiscount
@@ -681,7 +678,7 @@ function discountApplyReducer(state, action) {
681
678
  status: { type: "idle" }
682
679
  };
683
680
  default:
684
- return assertNever11(action);
681
+ return assertNever$1(action);
685
682
  }
686
683
  }
687
684
  function getAppliedDiscountCode(state) {
@@ -712,7 +709,7 @@ function getDiscountApplyFeedback(status, formatPrice) {
712
709
  message: status.message
713
710
  };
714
711
  default:
715
- return assertNever11(status);
712
+ return assertNever$1(status);
716
713
  }
717
714
  }
718
715
  var DISCOUNT_APPLY_MESSAGES = {
@@ -1283,7 +1280,7 @@ function shopPassesMembershipsReducer(state, action) {
1283
1280
  returnNotice: null
1284
1281
  };
1285
1282
  default:
1286
- return assertNever11(action);
1283
+ return assertNever$1(action);
1287
1284
  }
1288
1285
  }
1289
1286
  function getOpenCheckout(state) {
@@ -1,9 +1,161 @@
1
- import { FeedbackMessage } from './chunk-GOFO7HRH.mjs';
2
- import { themeButtonClassName } from './chunk-DIRW2LNG.mjs';
3
- import { formatCurrencyAmount, clsx_default } from './chunk-LI2C6M5O.mjs';
4
- import { useId } from 'react';
1
+ "use client";
2
+ import { FeedbackMessage, discountAvailabilityHasDiscounts, getAutoAppliedDiscountPreview, discountAvailabilityAllowsManualEntry } from './chunk-WHZQDPBZ.mjs';
3
+ import { themeButtonClassName } from './chunk-6DPXDOIL.mjs';
4
+ import { formatCurrencyAmount, clsx_default } from './chunk-25W2EQUN.mjs';
5
+ import { useReducer, useEffect, useId, useRef } from 'react';
5
6
  import { jsx, jsxs, Fragment } from 'react/jsx-runtime';
6
7
 
8
+ // ../blocks/src/system/runtime/nodes/event-registration/useDiscountCodeUi.state.ts
9
+ var initialDiscountCodeUiState = {
10
+ discountUiOpen: false,
11
+ discountCode: "",
12
+ availability: { tag: "disabled" }
13
+ };
14
+ function getDiscountContextKey(context) {
15
+ if (!context) return "disabled";
16
+ switch (context.type) {
17
+ case "event":
18
+ return [
19
+ context.type,
20
+ context.eventSeriesId,
21
+ context.eventCategoryId ?? "",
22
+ context.ticketsCount ?? ""
23
+ ].join(":");
24
+ case "appointment":
25
+ return [context.type, context.serviceId].join(":");
26
+ case "course":
27
+ return [context.type, context.courseId].join(":");
28
+ case "pass":
29
+ return [context.type, context.passId].join(":");
30
+ case "membership":
31
+ return [context.type, context.membershipId].join(":");
32
+ case "product":
33
+ return [context.type, context.productId, context.productCategoryId ?? ""].join(":");
34
+ }
35
+ }
36
+ function buildDiscountAvailabilityRequestPlan(options) {
37
+ if (!options.discountContext) {
38
+ return { ok: false, key: "disabled" };
39
+ }
40
+ const subtotalCents = options.subtotalCents;
41
+ const key = [
42
+ getDiscountContextKey(options.discountContext),
43
+ subtotalCents ?? ""
44
+ ].join("|");
45
+ return {
46
+ ok: true,
47
+ key,
48
+ request: {
49
+ context: options.discountContext,
50
+ ...subtotalCents !== void 0 ? { subtotalCents } : {}
51
+ }
52
+ };
53
+ }
54
+ function discountAvailabilityStateFromResponse(response) {
55
+ if (!discountAvailabilityHasDiscounts(response)) {
56
+ return { tag: "unavailable" };
57
+ }
58
+ return {
59
+ tag: "available",
60
+ manualCodeEntryAllowed: discountAvailabilityAllowsManualEntry(response),
61
+ autoAppliedDiscount: getAutoAppliedDiscountPreview(response)
62
+ };
63
+ }
64
+ function discountCodeUiReducer(state, event) {
65
+ switch (event.type) {
66
+ case "availability-disabled":
67
+ return initialDiscountCodeUiState;
68
+ case "availability-loading":
69
+ return {
70
+ ...state,
71
+ availability: { tag: "loading" }
72
+ };
73
+ case "availability-loaded": {
74
+ const availability = discountAvailabilityStateFromResponse(event.response);
75
+ if (availability.tag !== "available" || !availability.manualCodeEntryAllowed) {
76
+ return {
77
+ ...state,
78
+ discountUiOpen: false,
79
+ discountCode: "",
80
+ availability
81
+ };
82
+ }
83
+ return {
84
+ ...state,
85
+ availability
86
+ };
87
+ }
88
+ case "availability-failed":
89
+ return {
90
+ ...state,
91
+ discountUiOpen: false,
92
+ discountCode: "",
93
+ availability: { tag: "error" }
94
+ };
95
+ case "discount-code-changed":
96
+ return {
97
+ ...state,
98
+ discountCode: event.code
99
+ };
100
+ case "discount-ui-open-changed":
101
+ return {
102
+ ...state,
103
+ discountUiOpen: event.isOpen
104
+ };
105
+ }
106
+ }
107
+
108
+ // ../blocks/src/system/runtime/nodes/event-registration/useDiscountCodeUi.ts
109
+ function useStableDiscountAvailabilityRequestPlan(options) {
110
+ const nextPlan = buildDiscountAvailabilityRequestPlan(options);
111
+ const planRef = useRef(nextPlan);
112
+ if (planRef.current.key !== nextPlan.key) {
113
+ planRef.current = nextPlan;
114
+ }
115
+ return planRef.current;
116
+ }
117
+ function useDiscountCodeUi(options) {
118
+ const [state, dispatch] = useReducer(
119
+ discountCodeUiReducer,
120
+ initialDiscountCodeUiState
121
+ );
122
+ const requestPlan = useStableDiscountAvailabilityRequestPlan(options);
123
+ useEffect(() => {
124
+ let cancelled = false;
125
+ async function checkDiscountAvailability() {
126
+ if (!requestPlan.ok) {
127
+ dispatch({ type: "availability-disabled" });
128
+ return;
129
+ }
130
+ dispatch({ type: "availability-loading" });
131
+ try {
132
+ const res = await options.api.getDiscountsAvailable(requestPlan.request);
133
+ if (cancelled) return;
134
+ dispatch({ type: "availability-loaded", response: res });
135
+ } catch {
136
+ if (cancelled) return;
137
+ dispatch({ type: "availability-failed" });
138
+ }
139
+ }
140
+ void checkDiscountAvailability();
141
+ return () => {
142
+ cancelled = true;
143
+ };
144
+ }, [options.api, requestPlan]);
145
+ const availability = state.availability;
146
+ const isAvailable = availability.tag === "available";
147
+ const manualCodeEntryAllowed = isAvailable ? availability.manualCodeEntryAllowed : false;
148
+ return {
149
+ discountUiOpen: state.discountUiOpen,
150
+ setDiscountUiOpen: (isOpen) => dispatch({ type: "discount-ui-open-changed", isOpen }),
151
+ discountCode: state.discountCode,
152
+ setDiscountCode: (code) => dispatch({ type: "discount-code-changed", code }),
153
+ discountsAvailable: isAvailable,
154
+ manualCodeEntryAllowed,
155
+ autoAppliedDiscount: isAvailable ? availability.autoAppliedDiscount : null,
156
+ discountsAvailableLoading: availability.tag === "loading"
157
+ };
158
+ }
7
159
  var BLOCK_DISCOUNT_CODE_DISCLOSURE_CLASSES = {
8
160
  "course-registration": {
9
161
  root: "cr-discount",
@@ -504,4 +656,4 @@ function StepIndicator({
504
656
  }) }) });
505
657
  }
506
658
 
507
- export { ActionRow, CheckIcon, ClockIcon, CrossIcon, DiscountCodeDisclosure, LoggedInAsUser, MembershipHero, StateIcon, StepIndicator, TabBarFragment, TerminalPanel, buildCheckoutReturnUrls, consumeSearchParam, consumeSearchParams, createBodyThemePortalRoot, formatPrice, getStepNumber, logoutPortal, scrollToBlock, validateFormData };
659
+ export { ActionRow, CheckIcon, ClockIcon, CrossIcon, DiscountCodeDisclosure, LoggedInAsUser, MembershipHero, StateIcon, StepIndicator, TabBarFragment, TerminalPanel, buildCheckoutReturnUrls, consumeSearchParam, consumeSearchParams, createBodyThemePortalRoot, formatPrice, getStepNumber, logoutPortal, scrollToBlock, useDiscountCodeUi, validateFormData };
@@ -1,4 +1,4 @@
1
- import { EMPTY_COMMERCE_CART_STATE, parseStoredCommerceCartState, reduceCommerceCart, buildPassCartItem } from './chunk-DIRW2LNG.mjs';
1
+ import { EMPTY_COMMERCE_CART_STATE, parseStoredCommerceCartState, reduceCommerceCart, buildPassCartItem } from './chunk-6DPXDOIL.mjs';
2
2
  import * as React from 'react';
3
3
 
4
4
  var EMPTY_STATE = EMPTY_COMMERCE_CART_STATE;
@@ -1159,6 +1159,24 @@ function useBlockApi() {
1159
1159
  }
1160
1160
  return client;
1161
1161
  }
1162
+
1163
+ // ../blocks/src/system/runtime/api/types.ts
1164
+ function discountAvailabilityHasDiscounts(availability) {
1165
+ return availability.type !== "none";
1166
+ }
1167
+ function discountAvailabilityAllowsManualEntry(availability) {
1168
+ return "manualCodeEntryAllowed" in availability && availability.manualCodeEntryAllowed;
1169
+ }
1170
+ function getAutoAppliedDiscountPreview(availability) {
1171
+ switch (availability.type) {
1172
+ case "none":
1173
+ case "manual":
1174
+ return null;
1175
+ case "auto":
1176
+ case "auto_and_manual":
1177
+ return availability.autoAppliedDiscount;
1178
+ }
1179
+ }
1162
1180
  function joinClasses(...parts) {
1163
1181
  return parts.filter((part) => typeof part === "string" && part.length > 0).join(" ");
1164
1182
  }
@@ -1189,4 +1207,4 @@ function FeedbackMessage({
1189
1207
  );
1190
1208
  }
1191
1209
 
1192
- export { BlockApiError, BlockApiProvider, FeedbackMessage, useBlockApi };
1210
+ export { BlockApiProvider, FeedbackMessage, discountAvailabilityAllowsManualEntry, discountAvailabilityHasDiscounts, getAutoAppliedDiscountPreview, useBlockApi };
@@ -1,10 +1,46 @@
1
1
  "use client";
2
- import { useBlockApi, BlockApiError } from './chunk-GOFO7HRH.mjs';
3
- import { themeButtonClassName } from './chunk-DIRW2LNG.mjs';
4
- import { resolvePlanningDateInput, formatBookingPriceDisplay } from './chunk-LI2C6M5O.mjs';
5
- import { useState, useSyncExternalStore, useEffect } from 'react';
2
+ import { useBlockApi } from './chunk-WHZQDPBZ.mjs';
3
+ import { themeButtonClassName, assertNever } from './chunk-6DPXDOIL.mjs';
4
+ import { resolvePlanningDateInput, formatBookingPriceDisplay } from './chunk-25W2EQUN.mjs';
5
+ import { useState, useReducer, useSyncExternalStore, useEffect } from 'react';
6
6
  import { jsxs, jsx } from 'react/jsx-runtime';
7
7
 
8
+ // ../blocks/src/system/runtime/nodes/shared/MagicLinkForm.state.ts
9
+ var initialMagicLinkSubmissionState = Object.freeze({
10
+ tag: "idle"
11
+ });
12
+ function magicLinkSubmissionReducer(state, action) {
13
+ switch (action.type) {
14
+ case "submit-started":
15
+ if (state.tag === "submitting") {
16
+ return state;
17
+ }
18
+ return { tag: "submitting" };
19
+ case "submit-succeeded":
20
+ if (state.tag !== "submitting") {
21
+ return state;
22
+ }
23
+ return { tag: "success" };
24
+ case "submit-failed":
25
+ if (state.tag !== "submitting") {
26
+ return state;
27
+ }
28
+ return {
29
+ tag: "error",
30
+ message: action.message
31
+ };
32
+ case "reset":
33
+ return initialMagicLinkSubmissionState;
34
+ default:
35
+ return assertNever(action);
36
+ }
37
+ }
38
+ function isMagicLinkSubmitting(state) {
39
+ return state.tag === "submitting";
40
+ }
41
+ function getMagicLinkError(state) {
42
+ return state.tag === "error" ? state.message : null;
43
+ }
8
44
  function MagicLinkForm({
9
45
  initialEmail = "",
10
46
  title,
@@ -17,36 +53,38 @@ function MagicLinkForm({
17
53
  }) {
18
54
  const api = useBlockApi();
19
55
  const [email, setEmail] = useState(initialEmail);
20
- const [loading, setLoading] = useState(false);
21
- const [success, setSuccess] = useState(false);
22
- const [error, setError] = useState(null);
56
+ const [submissionState, dispatchSubmission] = useReducer(
57
+ magicLinkSubmissionReducer,
58
+ initialMagicLinkSubmissionState
59
+ );
60
+ const loading = isMagicLinkSubmitting(submissionState);
61
+ const error = getMagicLinkError(submissionState);
23
62
  const handleSubmit = async (e) => {
24
63
  e.preventDefault();
25
64
  const normalizedEmail = email.trim().toLowerCase();
26
65
  if (!normalizedEmail || loading) return;
27
- setLoading(true);
28
- setError(null);
66
+ dispatchSubmission({ type: "submit-started" });
29
67
  try {
30
68
  const redirectTo = `${window.location.pathname}${window.location.search}${window.location.hash}`;
31
69
  await api.sendMagicLink({
32
70
  email: normalizedEmail,
33
71
  redirectUrl: `${window.location.origin}/api/portal/callback?redirect_to=${encodeURIComponent(redirectTo)}`
34
72
  });
35
- setSuccess(true);
73
+ dispatchSubmission({ type: "submit-succeeded" });
36
74
  onSuccess?.();
37
75
  } catch (err) {
38
76
  console.error("Magic link error:", err);
39
- setError(err instanceof Error ? err.message : "Failed to send. Please try again.");
40
- } finally {
41
- setLoading(false);
77
+ dispatchSubmission({
78
+ type: "submit-failed",
79
+ message: getMagicLinkErrorMessage(err)
80
+ });
42
81
  }
43
82
  };
44
83
  const handleReset = () => {
45
- setSuccess(false);
46
84
  setEmail("");
47
- setError(null);
85
+ dispatchSubmission({ type: "reset" });
48
86
  };
49
- if (success) {
87
+ if (submissionState.tag === "success") {
50
88
  return /* @__PURE__ */ jsxs("div", { className: `${classPrefix}-magic-link-success`, children: [
51
89
  /* @__PURE__ */ jsx("p", { className: `${classPrefix}-portal-auth-text ${classPrefix}-portal-auth-text--success`, children: successMessage }),
52
90
  !compact && /* @__PURE__ */ jsx(
@@ -88,6 +126,9 @@ function MagicLinkForm({
88
126
  )
89
127
  ] });
90
128
  }
129
+ function getMagicLinkErrorMessage(error) {
130
+ return error instanceof Error ? error.message : "Failed to send. Please try again.";
131
+ }
91
132
 
92
133
  // ../blocks/src/system/blocks/courses/shared/pricing.ts
93
134
  function isSaleWindowOpen(option, now) {
@@ -201,6 +242,54 @@ function formatCoursePriceAmount(amount, currency, locale) {
201
242
  locale
202
243
  );
203
244
  }
245
+
246
+ // ../blocks/src/system/runtime/shared/useWaitlistClaim.state.ts
247
+ var DEFAULT_WAITLIST_CLAIM_ERROR = "Failed to resolve waitlist claim";
248
+ function createInitialWaitlistClaimState(hasToken) {
249
+ return hasToken ? { kind: "resolving" } : { kind: "idle" };
250
+ }
251
+ function waitlistClaimReducer(_state, action) {
252
+ switch (action.type) {
253
+ case "cleared":
254
+ return { kind: "idle" };
255
+ case "started":
256
+ return { kind: "resolving" };
257
+ case "resolved":
258
+ return { kind: "resolved", claim: action.claim };
259
+ case "failed":
260
+ return action.failure;
261
+ }
262
+ }
263
+ function toWaitlistClaimResolveFailure(error) {
264
+ const message = error instanceof Error ? error.message : DEFAULT_WAITLIST_CLAIM_ERROR;
265
+ if (isUnauthorizedBlockApiError(error)) {
266
+ return { kind: "portal-login-required", message };
267
+ }
268
+ return { kind: "error", message };
269
+ }
270
+ function isUnauthorizedBlockApiError(error) {
271
+ return error instanceof Error && error.name === "BlockApiError" && hasStatus(error) && error.status === 401;
272
+ }
273
+ function hasStatus(value) {
274
+ return typeof value === "object" && value !== null && "status" in value;
275
+ }
276
+ function getWaitlistClaim(state) {
277
+ return state.kind === "resolved" ? state.claim : null;
278
+ }
279
+ function getWaitlistClaimError(state) {
280
+ return state.kind === "error" ? state.message : null;
281
+ }
282
+ function getWaitlistClaimLoginMessage(state) {
283
+ return state.kind === "portal-login-required" ? state.message : null;
284
+ }
285
+ function requiresWaitlistClaimPortalLogin(state) {
286
+ return state.kind === "portal-login-required";
287
+ }
288
+ function isWaitlistClaimLoading(state) {
289
+ return state.kind === "resolving";
290
+ }
291
+
292
+ // ../blocks/src/system/runtime/shared/useWaitlistClaim.ts
204
293
  var WAITLIST_CLAIM_LOCATION_EVENT = "riverbank:waitlist-claim-location-change";
205
294
  var historyPatched = false;
206
295
  function emitWaitlistClaimLocationChange() {
@@ -258,46 +347,29 @@ function useWaitlistClaim() {
258
347
  getWaitlistClaimTokenSnapshot,
259
348
  () => null
260
349
  );
261
- const [claim, setClaim] = useState(null);
262
- const [error, setError] = useState(null);
263
- const [loginMessage, setLoginMessage] = useState(null);
264
- const [requiresPortalLogin, setRequiresPortalLogin] = useState(false);
265
- const [isLoading, setIsLoading] = useState(() => Boolean(token));
350
+ const [state, dispatch] = useReducer(
351
+ waitlistClaimReducer,
352
+ Boolean(token),
353
+ createInitialWaitlistClaimState
354
+ );
266
355
  useEffect(() => {
267
356
  let cancelled = false;
268
357
  async function resolveClaim() {
269
358
  if (!token) {
270
- setClaim(null);
271
- setError(null);
272
- setLoginMessage(null);
273
- setRequiresPortalLogin(false);
274
- setIsLoading(false);
359
+ dispatch({ type: "cleared" });
275
360
  return;
276
361
  }
277
- setIsLoading(true);
278
- setClaim(null);
279
- setError(null);
280
- setLoginMessage(null);
281
- setRequiresPortalLogin(false);
362
+ dispatch({ type: "started" });
282
363
  try {
283
364
  const result = await api.resolveWaitlistClaim({ claimToken: token });
284
365
  if (cancelled) return;
285
- setClaim(result);
366
+ dispatch({ type: "resolved", claim: result });
286
367
  } catch (claimError) {
287
368
  if (cancelled) return;
288
- const message = claimError instanceof Error ? claimError.message : "Failed to resolve waitlist claim";
289
- setClaim(null);
290
- if (claimError instanceof BlockApiError && claimError.status === 401) {
291
- setRequiresPortalLogin(true);
292
- setLoginMessage(message);
293
- setError(null);
294
- } else {
295
- setError(message);
296
- }
297
- } finally {
298
- if (!cancelled) {
299
- setIsLoading(false);
300
- }
369
+ dispatch({
370
+ type: "failed",
371
+ failure: toWaitlistClaimResolveFailure(claimError)
372
+ });
301
373
  }
302
374
  }
303
375
  void resolveClaim();
@@ -307,11 +379,11 @@ function useWaitlistClaim() {
307
379
  }, [api, token]);
308
380
  return {
309
381
  token,
310
- claim,
311
- error,
312
- loginMessage,
313
- requiresPortalLogin,
314
- isLoading
382
+ claim: getWaitlistClaim(state),
383
+ error: getWaitlistClaimError(state),
384
+ loginMessage: getWaitlistClaimLoginMessage(state),
385
+ requiresPortalLogin: requiresWaitlistClaimPortalLogin(state),
386
+ isLoading: isWaitlistClaimLoading(state)
315
387
  };
316
388
  }
317
389