@riverbankcms/sdk 0.127.0 → 0.129.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 (178) hide show
  1. package/README.md +33 -0
  2. package/dist/{PreviewEditorSidebar-BXtfF7tp.mjs → PreviewEditorSidebar-B43CJ0g_.mjs} +9 -33
  3. package/dist/{PreviewEditorUI-Dou73Q0K.mjs → PreviewEditorUI-DHirVkeM.mjs} +3 -3
  4. package/dist/{PreviewQueryProvider-DgFDIwvK.mjs → PreviewQueryProvider-B1kbhaJD.mjs} +1 -1
  5. package/dist/SdkPreviewModeRuntime-BJumZy1B.mjs +11209 -0
  6. package/dist/{SiteChromeCustomizeContext-DZiDBAYu.mjs → SiteChromeCustomizeContext-D9SlpwEj.mjs} +31757 -1621
  7. package/dist/_dts/ai/src/contracts/proposals.d.ts +288 -36
  8. package/dist/_dts/api/src/bookingClosures.d.ts +19 -3
  9. package/dist/_dts/api/src/bookingManagementEndpoints.d.ts +4 -3
  10. package/dist/_dts/api/src/bookingRecords.d.ts +0 -13
  11. package/dist/_dts/api/src/commercePortalEndpoints.d.ts +2 -2
  12. package/dist/_dts/api/src/communications.d.ts +2 -1
  13. package/dist/_dts/api/src/contactFormSummary.d.ts +15 -0
  14. package/dist/_dts/api/src/contentRuntime.d.ts +2 -5
  15. package/dist/_dts/api/src/endpoints.d.ts +1 -1
  16. package/dist/_dts/api/src/footerSettings.d.ts +11 -0
  17. package/dist/_dts/api/src/index.d.ts +2 -1
  18. package/dist/_dts/api/src/occurrenceScheduling.d.ts +48 -0
  19. package/dist/_dts/api/src/participantMessaging.d.ts +5 -3
  20. package/dist/_dts/api/src/publicExperience/siteEndpoints.d.ts +7 -0
  21. package/dist/_dts/api/src/sdkContracts.d.ts +7 -5
  22. package/dist/_dts/api/src/siteOperations.d.ts +12 -3
  23. package/dist/_dts/api/src/sitePlatformEndpoints.d.ts +3 -2
  24. package/dist/_dts/blocks/src/PageRenderer.d.ts +20 -10
  25. package/dist/_dts/blocks/src/client/form.d.ts +1 -0
  26. package/dist/_dts/blocks/src/client/newsletter-form.d.ts +1 -0
  27. package/dist/_dts/blocks/src/client/site-chrome.d.ts +1 -0
  28. package/dist/_dts/blocks/src/contracts/proof-block-islands.d.ts +4 -8
  29. package/dist/_dts/blocks/src/index.d.ts +2 -1
  30. package/dist/_dts/blocks/src/pageRendererBoundaries.d.ts +30 -0
  31. package/dist/_dts/blocks/src/pageRenderingMode.d.ts +37 -0
  32. package/dist/_dts/blocks/src/rendering/server.d.ts +1 -1
  33. package/dist/_dts/blocks/src/server.d.ts +1 -1
  34. package/dist/_dts/blocks/src/system/blocks/event-registration.d.ts +41 -0
  35. package/dist/_dts/blocks/src/system/blocks/newsletter-signup-destination.d.ts +14 -23
  36. package/dist/_dts/blocks/src/system/blocks/newsletter-signup.d.ts +1 -1
  37. package/dist/_dts/blocks/src/system/blocks/site-footer-runtime.d.ts +109 -23
  38. package/dist/_dts/blocks/src/system/data/loaderEndpoints.d.ts +1 -1
  39. package/dist/_dts/blocks/src/system/runtime/components/registry.client.d.ts +42 -108
  40. package/dist/_dts/blocks/src/system/runtime/components/runtime-backed-blocks.d.ts +21 -54
  41. package/dist/_dts/blocks/src/system/runtime/nodes/event-details/logic.d.ts +1 -1
  42. package/dist/_dts/blocks/src/system/runtime/nodes/event-registration/registrationSurface.d.ts +26 -0
  43. package/dist/_dts/blocks/src/system/runtime/nodes/event-registration/types.d.ts +8 -0
  44. package/dist/_dts/blocks/src/system/runtime/nodes/event-registration.interactive.d.ts +21 -0
  45. package/dist/_dts/blocks/src/system/runtime/nodes/newsletter-form.interactive.d.ts +29 -78
  46. package/dist/_dts/blocks/src/system/runtime/nodes/newsletter-form.server.d.ts +1 -1
  47. package/dist/_dts/blocks/src/system/runtime/nodes/newsletter-form.submission.d.ts +3 -6
  48. package/dist/_dts/blocks/src/system/runtime/nodes/newsletter-form.types.d.ts +27 -8
  49. package/dist/_dts/content-editor/src/FooterComposerOverview.d.ts +21 -0
  50. package/dist/_dts/content-editor/src/FooterComposerPanel.d.ts +3 -1
  51. package/dist/_dts/content-editor/src/FooterEngagementEditorFields.d.ts +31 -0
  52. package/dist/_dts/content-editor/src/FooterEngagementEditorPanel.d.ts +17 -0
  53. package/dist/_dts/content-editor/src/footerComposer.d.ts +3 -0
  54. package/dist/_dts/content-editor/src/footerEngagementDraft.d.ts +57 -0
  55. package/dist/_dts/content-editor/src/footerEngagementEditor.d.ts +11 -0
  56. package/dist/_dts/content-editor/src/footerPreviewRuntime.d.ts +13 -0
  57. package/dist/_dts/content-editor/src/index.d.ts +1 -0
  58. package/dist/_dts/content-editor/src/useFooterComposerState.d.ts +35 -0
  59. package/dist/_dts/core/src/footer-arrangement.d.ts +2 -0
  60. package/dist/_dts/core/src/footer-composition-types.d.ts +118 -0
  61. package/dist/_dts/core/src/footer-composition.d.ts +7 -116
  62. package/dist/_dts/core/src/footer-engagement.d.ts +30 -0
  63. package/dist/_dts/core/src/index.d.ts +4 -0
  64. package/dist/_dts/core/src/newsletter-signup-destination.d.ts +38 -0
  65. package/dist/_dts/db/src/generated/supabase/database.types.d.ts +73 -6
  66. package/dist/_dts/db/src/index.d.ts +1 -0
  67. package/dist/_dts/db/src/schemas/forms.d.ts +72 -2
  68. package/dist/_dts/db/src/schemas/standard-contact.d.ts +114 -0
  69. package/dist/_dts/preview-next/src/client/blocks/pageDesignRuntimePreview.d.ts +2 -0
  70. package/dist/_dts/preview-next/src/client/blocks/previewBatchLoaderParams.d.ts +6 -0
  71. package/dist/_dts/preview-next/src/client/index.d.ts +47 -47
  72. package/dist/_dts/preview-next/src/client/preview/EntryEditorPanel.d.ts +2 -5
  73. package/dist/_dts/preview-next/src/client/preview/EntrySlotBlockEditorPanel.d.ts +2 -5
  74. package/dist/_dts/preview-next/src/client/preview/PageBlockEditorPanel.d.ts +2 -5
  75. package/dist/_dts/preview-next/src/client/preview/PreviewEditorSidebar.d.ts +2 -4
  76. package/dist/_dts/preview-next/src/client/preview/PreviewShell.d.ts +19 -7
  77. package/dist/_dts/preview-next/src/client/preview/PreviewShellLayout.d.ts +30 -23
  78. package/dist/_dts/preview-next/src/client/preview/PreviewThemedSiteDocument.d.ts +18 -5
  79. package/dist/_dts/preview-next/src/client/preview/themeRuntime.d.ts +9 -0
  80. package/dist/_dts/preview-next/src/client/sdk/SdkPreviewMode.d.ts +21 -6
  81. package/dist/_dts/preview-next/src/client/sdk-runtime.d.ts +8 -8
  82. package/dist/_dts/preview-next/src/client/widgets/widgetOverrides.d.ts +6 -5
  83. package/dist/_dts/sdk/src/cli/commands/push/execute/footer.d.ts +9 -0
  84. package/dist/_dts/sdk/src/cli/content/footerFile.d.ts +10 -0
  85. package/dist/_dts/sdk/src/cli/content/reader.d.ts +3 -5
  86. package/dist/_dts/sdk/src/cli/site-commands/footerCommands.d.ts +15 -3
  87. package/dist/_dts/sdk/src/client/combineAbortSignals.d.ts +2 -0
  88. package/dist/_dts/sdk/src/client/management/types.d.ts +6 -15
  89. package/dist/_dts/sdk/src/client/types.d.ts +10 -2
  90. package/dist/_dts/sdk/src/client/wholeSeriesReadOperations.d.ts +11 -0
  91. package/dist/_dts/sdk/src/config/types.d.ts +1 -1
  92. package/dist/_dts/sdk/src/config/validation.d.ts +3 -0
  93. package/dist/_dts/sdk/src/contracts/event-registration-content.d.ts +16 -0
  94. package/dist/_dts/sdk/src/contracts/system-block-content.d.ts +4 -15
  95. package/dist/_dts/sdk/src/next/catch-all.d.ts +6 -0
  96. package/dist/_dts/sdk/src/next/index.d.ts +2 -1
  97. package/dist/_dts/sdk/src/next/renderSdkContent.d.ts +33 -0
  98. package/dist/_dts/sdk/src/next/types.d.ts +23 -9
  99. package/dist/_dts/sdk/src/preview-next/before-render.d.ts +4 -6
  100. package/dist/_dts/sdk/src/preview-next/client/index.d.ts +3 -3
  101. package/dist/_dts/sdk/src/preview-next/client/runtime.d.ts +1 -1
  102. package/dist/_dts/sdk/src/public-api/contracts.d.ts +4 -18
  103. package/dist/_dts/sdk/src/public-api/teamMemberContracts.d.ts +17 -0
  104. package/dist/_dts/sdk/src/public-api/wholeSeriesContracts.d.ts +2 -0
  105. package/dist/_dts/sdk/src/rendering/blocks-page-renderer.d.ts +32 -3
  106. package/dist/_dts/sdk/src/rendering/components/Block.shared.d.ts +13 -2
  107. package/dist/_dts/sdk/src/rendering/components/Layout.d.ts +31 -18
  108. package/dist/_dts/sdk/src/rendering/components/pageShared.d.ts +20 -9
  109. package/dist/_dts/sdk/src/rendering/index.d.ts +8 -4
  110. package/dist/_dts/sdk/src/rendering/mediaAssets.d.ts +8 -2
  111. package/dist/_dts/sdk/src/rendering/renderingMode.d.ts +23 -0
  112. package/dist/_dts/sdk/src/rendering/server.d.ts +5 -3
  113. package/dist/_dts/sdk/src/rendering/themeRuntime.d.ts +6 -0
  114. package/dist/_dts/sdk/src/version.d.ts +1 -1
  115. package/dist/_dts/site-commands/src/commandContract.d.ts +8 -1
  116. package/dist/_dts/site-commands/src/commands.d.ts +16 -2
  117. package/dist/_dts/theme-core/src/header/paintTargets.d.ts +10 -4
  118. package/dist/_dts/theme-core/src/header/surfaceRules.d.ts +2 -3
  119. package/dist/cli/index.mjs +5535 -4835
  120. package/dist/cli/init-docs/content/workflow-preview-mode.md +24 -11
  121. package/dist/client/{courseRegistration-DTEYWL6Z.mjs → CourseRegistrationWizard-xRmA7REV.mjs} +329 -49
  122. package/dist/client/{DiscountCodeDisclosure-BDFRp8Y7.mjs → DiscountCodeDisclosure-B9vriL5C.mjs} +1 -1
  123. package/dist/client/{EventCombined.client-DJgF1_lf.mjs → EventCombined.client-BgVnVTlz.mjs} +2 -2
  124. package/dist/client/{EventListing.client-CnWGNjOr.mjs → EventListing.client-CqdsO7jO.mjs} +2 -2
  125. package/dist/client/{LeafletStaticMap-BISs9Bl7.mjs → LeafletStaticMap-CKPxot9M.mjs} +1 -1
  126. package/dist/client/{StepIndicator-D8gVYkK-.mjs → StepIndicator-DGCYuBJ1.mjs} +2 -2
  127. package/dist/client/{accordion-DFDajgDz.mjs → accordion-BfN5Eqd-.mjs} +1 -1
  128. package/dist/client/{bookingForm-Bdqj9-52.mjs → bookingForm-DOvCpBFP.mjs} +5 -5
  129. package/dist/client/{carousel-Cvqf-kN8.mjs → carousel-DPNmiH0f.mjs} +1 -1
  130. package/dist/client/{cart-CuH2TJXP.mjs → cart--egVXlrR.mjs} +3 -3
  131. package/dist/client/{checkout-CMNPpejZ.mjs → checkout-DywWtMcq.mjs} +3 -3
  132. package/dist/client/client.mjs +5324 -4942
  133. package/dist/client/courseRegistration-Dk9qFVwt.mjs +46 -0
  134. package/dist/client/{eventCalendar-BW-XoxZ0.mjs → eventCalendar-Bkz2HjlS.mjs} +4 -4
  135. package/dist/client/{eventCombined-Bpn7s0y9.mjs → eventCombined-D4kipYWg.mjs} +2 -2
  136. package/dist/client/{eventDetails-D2uUSTMH.mjs → eventDetails-Dz_5ix2Q.mjs} +56 -35
  137. package/dist/client/{eventListing-CVr1c094.mjs → eventListing-D0vm-zST.mjs} +2 -2
  138. package/dist/client/{eventRegistration-Dv4AvkMw.mjs → eventRegistration-Cw1E4Q4p.mjs} +58 -6
  139. package/dist/client/{form-DxdKf9fs.mjs → form-C2Zf1n3K.mjs} +1 -1
  140. package/dist/client/{headerSection-BaXI5Sro.mjs → headerSection-CP05gzdc.mjs} +2 -2
  141. package/dist/client/hooks.mjs +212 -61
  142. package/dist/client/{locationMap-BEtW2fKz.mjs → locationMap-Cl3x9PYJ.mjs} +2 -2
  143. package/dist/client/{newsletterForm-BKKs0S4R.mjs → newsletterForm-DyEJoClm.mjs} +26 -20
  144. package/dist/client/{pricing-ClkqcElA.mjs → pricing-DGuNR1W4.mjs} +1 -1
  145. package/dist/client/{productDetail-H-ru8dyy.mjs → productDetail-Cq-HrGew.mjs} +3 -3
  146. package/dist/client/{productList-Buyi5c0C.mjs → productList-DbB3jwqd.mjs} +3 -3
  147. package/dist/client/{propsDecoder-BF7i6Ijg.mjs → propsDecoder-CiTuhUwY.mjs} +130 -87
  148. package/dist/client/rendering/client.mjs +416 -208
  149. package/dist/client/rendering/islands.mjs +18 -18
  150. package/dist/client/rendering.mjs +6026 -5596
  151. package/dist/client/{scrollToBlock-D_7t8yWb.mjs → scrollToBlock-CShkRqab.mjs} +1 -1
  152. package/dist/client/{shop-CF7SZQNX.mjs → shop-Cu4Ib-ZA.mjs} +5 -5
  153. package/dist/client/{shop-commerce-DA7_Rq5p.mjs → shop-commerce-BzpsOdh7.mjs} +4 -4
  154. package/dist/client/{shop-commerce-store-BmLqW7Gh.mjs → shop-commerce-store-DaE7Fhj8.mjs} +1 -1
  155. package/dist/client/{shopShared-WL-E1znM.mjs → shopShared-cF0c20vB.mjs} +2 -2
  156. package/dist/client/{useEventFilters-rc8VLeLV.mjs → useEventFilters-QZ3HMgaJ.mjs} +2 -2
  157. package/dist/client/{usePolling-1ncrfd4S.mjs → usePolling-BKf0GcE-.mjs} +2 -2
  158. package/dist/preview-next/before-render.mjs +11 -4
  159. package/dist/preview-next/client/runtime.mjs +4 -4
  160. package/dist/preview-next/middleware.mjs +1 -1
  161. package/dist/{previewAuthStore-Dev9CdG9.mjs → previewAuthStore-BesgU5Xu.mjs} +1 -1
  162. package/dist/{sdk-runtime-BnrCCFJq.mjs → sdk-runtime-CfZd5pAm.mjs} +2 -2
  163. package/dist/{separator-CFvBx2yl.mjs → separator-DkTe68HE.mjs} +1 -1
  164. package/dist/server/components.mjs +950 -639
  165. package/dist/server/config-validation.mjs +209 -61
  166. package/dist/server/config.mjs +209 -61
  167. package/dist/server/data.mjs +212 -61
  168. package/dist/server/index.mjs +40 -16
  169. package/dist/server/next.mjs +1181 -835
  170. package/dist/server/page-converter.mjs +211 -64
  171. package/dist/server/prebuild.mjs +1 -1
  172. package/dist/server/rendering/server.mjs +974 -637
  173. package/dist/server/rendering.mjs +980 -644
  174. package/dist/server/routing.mjs +254 -80
  175. package/dist/server/server.mjs +252 -77
  176. package/package.json +1 -1
  177. package/dist/SdkPreviewModeRuntime-B0HPXr-l.mjs +0 -39546
  178. package/dist/client/MagicLinkForm-b5E_HoG9.mjs +0 -327
@@ -61,7 +61,9 @@ export async function proxy(request: NextRequest) {
61
61
  }
62
62
 
63
63
  export const config = {
64
- matcher: ['/((?!_next/static|_next/image|api|favicon.ico|robots.txt|sitemap.xml).*)'],
64
+ matcher: [
65
+ '/((?!_next/static|_next/image|api|favicon.ico|robots.txt|sitemap.xml).*)',
66
+ ],
65
67
  }
66
68
  ```
67
69
 
@@ -102,13 +104,17 @@ Create `src/components/preview/SdkPreviewModeClient.tsx`:
102
104
  ```tsx
103
105
  'use client'
104
106
 
105
- import { PreviewQueryProvider, SdkPreviewMode, type SdkPreviewModeProps } from '@riverbankcms/sdk/preview-next/client'
107
+ import {
108
+ PreviewQueryProvider,
109
+ SdkPreviewMode,
110
+ type SdkPreviewModePropsWithoutBlockOverrides,
111
+ } from '@riverbankcms/sdk/preview-next/client'
106
112
 
107
113
  import { blockOverrides } from '@/lib/block-overrides'
108
114
 
109
- type SdkPreviewModeClientProps = Omit<SdkPreviewModeProps, 'blockOverrides'>
110
-
111
- export function SdkPreviewModeClient(props: SdkPreviewModeClientProps) {
115
+ export function SdkPreviewModeClient(
116
+ props: SdkPreviewModePropsWithoutBlockOverrides
117
+ ) {
112
118
  return (
113
119
  <PreviewQueryProvider>
114
120
  <SdkPreviewMode {...props} blockOverrides={blockOverrides} />
@@ -168,7 +174,11 @@ function SiteFooter() {
168
174
  return <footer>{/* your site footer */}</footer>
169
175
  }
170
176
 
171
- export default async function RootLayout({ children }: { children: ReactNode }) {
177
+ export default async function RootLayout({
178
+ children,
179
+ }: {
180
+ children: ReactNode
181
+ }) {
172
182
  const session = await getPreviewSession()
173
183
  const hasEditablePreviewSession = Boolean(session?.canEdit && session?.token)
174
184
  const headerNode = <SiteHeader />
@@ -178,7 +188,10 @@ export default async function RootLayout({ children }: { children: ReactNode })
178
188
  <html lang="en">
179
189
  <body>
180
190
  {hasEditablePreviewSession ? (
181
- <PreviewLayoutProvider headerNode={headerNode} footerNode={footerNode}>
191
+ <PreviewLayoutProvider
192
+ headerNode={headerNode}
193
+ footerNode={footerNode}
194
+ >
182
195
  {children}
183
196
  </PreviewLayoutProvider>
184
197
  ) : (
@@ -204,15 +217,15 @@ If your custom chrome needs CMS navigation data, build the `headerNode` and `foo
204
217
  For Tailwind sites, add this to `src/app/globals.css`:
205
218
 
206
219
  ```css
207
- @import "tailwindcss";
208
- @import "@riverbankcms/sdk/preview-next/tailwind-sources.css";
209
- @import "@riverbankcms/sdk/preview-next/chrome.css";
220
+ @import 'tailwindcss';
221
+ @import '@riverbankcms/sdk/preview-next/tailwind-sources.css';
222
+ @import '@riverbankcms/sdk/preview-next/chrome.css';
210
223
  ```
211
224
 
212
225
  For non-Tailwind sites, use the legacy single import:
213
226
 
214
227
  ```css
215
- @import "@riverbankcms/sdk/preview-next/styles.css";
228
+ @import '@riverbankcms/sdk/preview-next/styles.css';
216
229
  ```
217
230
 
218
231
  ## Environment Variables
@@ -1,20 +1,17 @@
1
1
  "use client";
2
- import { At as formatBookingTime, Dt as formatBookingDate, Ft as toBookingTimeZone, Gt as assertNever, It as toScheduledBookingDateTime, Lt as parseEventPageSurfaceSubject, X as themeButtonClassName, t as defineIslandPropsDecoder } from "./propsDecoder-BF7i6Ijg.mjs";
3
- import { n as formatCoursePriceDisplay, r as resolveCoursePricingState, t as formatCoursePriceAmount } from "./pricing-ClkqcElA.mjs";
4
- import { n as useBlockApi, t as BlockApiProvider } from "./context-CJz1Vlsz.mjs";
2
+ import { At as formatBookingTime, Dt as formatBookingDate, Ft as toBookingTimeZone, Gt as assertNever, It as toScheduledBookingDateTime, Lt as parseEventPageSurfaceSubject, X as themeButtonClassName, yt as assertNever$1 } from "./propsDecoder-CiTuhUwY.mjs";
3
+ import { n as formatCoursePriceDisplay, r as resolveCoursePricingState, t as formatCoursePriceAmount } from "./pricing-DGuNR1W4.mjs";
4
+ import { n as useBlockApi } from "./context-CJz1Vlsz.mjs";
5
5
  import { n as isSpamProtectionEnabled, r as AltchaWidget, t as getChallengeUrl } from "./src-B833rYRr.mjs";
6
- import { a as CheckIcon, i as StateIcon, n as useDiscountCodeUi, r as TerminalPanel, t as scrollToBlock } from "./scrollToBlock-D_7t8yWb.mjs";
7
- import { t as DiscountCodeDisclosure } from "./DiscountCodeDisclosure-BDFRp8Y7.mjs";
8
- import { n as SpinnerNode, r as formatPrice, t as StepIndicator$1 } from "./StepIndicator-D8gVYkK-.mjs";
6
+ import { a as CheckIcon, i as StateIcon, n as useDiscountCodeUi, r as TerminalPanel, t as scrollToBlock } from "./scrollToBlock-CShkRqab.mjs";
7
+ import { t as DiscountCodeDisclosure } from "./DiscountCodeDisclosure-B9vriL5C.mjs";
8
+ import { n as SpinnerNode, r as formatPrice, t as StepIndicator$1 } from "./StepIndicator-DGCYuBJ1.mjs";
9
9
  import { t as FeedbackMessage } from "./FeedbackMessage-ByMrs3cr.mjs";
10
10
  import { n as getFieldValidationControlProps, t as FieldValidationMessage } from "./FieldValidationMessage-AYanWFb-.mjs";
11
11
  import { t as buildCheckoutReturnUrls } from "./checkoutUrls-Ct8Mxna3.mjs";
12
- import { a as ClockIcon, i as LoggedInAsUser, n as logoutPortal, r as useWaitlistClaim, t as MagicLinkForm } from "./MagicLinkForm-b5E_HoG9.mjs";
13
12
  import { t as CrossIcon } from "./CrossIcon-Dn1KRKW5.mjs";
14
- import { t as mountReactIsland } from "./reactMount-SY8AVRof.mjs";
15
- import { t as buildRouteIslandApiConfig } from "./routeIslandApiConfig-UNsfPcYq.mjs";
16
13
  import { t as ModalShell } from "./ModalShell-CqkBvBIC.mjs";
17
- import React, { Component, useCallback, useEffect, useMemo, useState } from "react";
14
+ import React, { Component, useCallback, useEffect, useMemo, useReducer, useState, useSyncExternalStore } from "react";
18
15
  import { Fragment, jsx, jsxs } from "react/jsx-runtime";
19
16
  //#region ../blocks/src/system/runtime/shared/utils/validation.ts
20
17
  const EMAIL_REGEX = /^[^\s@]+@[^\s@]+\.[^\s@]+$/;
@@ -53,6 +50,23 @@ function getStepNumber(step, wizardSteps) {
53
50
  return index >= 0 ? index + 1 : 1;
54
51
  }
55
52
  //#endregion
53
+ //#region ../blocks/src/system/runtime/shared/components/ClockIcon.tsx
54
+ function ClockIcon({ className, strokeWidth = 2 }) {
55
+ return /* @__PURE__ */ jsx("svg", {
56
+ fill: "none",
57
+ strokeLinecap: "round",
58
+ strokeLinejoin: "round",
59
+ strokeWidth,
60
+ viewBox: "0 0 24 24",
61
+ stroke: "currentColor",
62
+ className,
63
+ width: "1em",
64
+ height: "1em",
65
+ "aria-hidden": "true",
66
+ children: /* @__PURE__ */ jsx("path", { d: "M12 8v4l3 3m6-3a9 9 0 11-18 0 9 9 0 0118 0z" })
67
+ });
68
+ }
69
+ //#endregion
56
70
  //#region ../blocks/src/system/runtime/shared/components/MembershipHero.tsx
57
71
  /**
58
72
  * Celebratory UI shown when user's membership covers the course/event.
@@ -181,6 +195,29 @@ var CourseRegistrationErrorBoundary = class extends Component {
181
195
  }
182
196
  };
183
197
  //#endregion
198
+ //#region ../blocks/src/system/runtime/shared/components/LoggedInAsUser.tsx
199
+ /**
200
+ * Displays the logged-in user's email with an optional logout link.
201
+ *
202
+ * Used in registration forms when the email field is locked due to portal authentication.
203
+ * Shows: "Logged in as {email} — Not you? Log out"
204
+ */
205
+ function LoggedInAsUser({ email, onLogout, classPrefix }) {
206
+ return /* @__PURE__ */ jsxs("p", {
207
+ className: `${classPrefix}-logged-in-hint`,
208
+ children: [
209
+ "Logged in as ",
210
+ email,
211
+ onLogout && /* @__PURE__ */ jsxs(Fragment, { children: [" — ", /* @__PURE__ */ jsx("button", {
212
+ type: "button",
213
+ className: `${classPrefix}-link`,
214
+ onClick: onLogout,
215
+ children: "Not you? Log out"
216
+ })] })
217
+ ]
218
+ });
219
+ }
220
+ //#endregion
184
221
  //#region ../blocks/src/system/runtime/nodes/course-registration/components.tsx
185
222
  function TeamMemberInlineList({ teamMembers }) {
186
223
  return /* @__PURE__ */ jsx(Fragment, { children: teamMembers.map((teamMember, index) => /* @__PURE__ */ jsxs(React.Fragment, { children: [index > 0 ? ", " : "", teamMember.profilePath ? /* @__PURE__ */ jsx("a", {
@@ -490,6 +527,167 @@ function EnrollmentForm({ formData, errors, onChange, isEmailLocked, isLoading,
490
527
  ] });
491
528
  }
492
529
  //#endregion
530
+ //#region ../blocks/src/system/runtime/shared/useWaitlistClaim.state.ts
531
+ const DEFAULT_WAITLIST_CLAIM_ERROR = "Failed to resolve waitlist claim";
532
+ function createInitialWaitlistClaimState(hasToken) {
533
+ return hasToken ? { kind: "resolving" } : { kind: "idle" };
534
+ }
535
+ function waitlistClaimReducer(_state, action) {
536
+ switch (action.type) {
537
+ case "cleared": return { kind: "idle" };
538
+ case "started": return { kind: "resolving" };
539
+ case "resolved": return {
540
+ kind: "resolved",
541
+ claim: action.claim
542
+ };
543
+ case "failed": return action.failure;
544
+ }
545
+ }
546
+ function toWaitlistClaimResolveFailure(error) {
547
+ const message = error instanceof Error ? error.message : DEFAULT_WAITLIST_CLAIM_ERROR;
548
+ if (isUnauthorizedBlockApiError(error)) return {
549
+ kind: "portal-login-required",
550
+ message
551
+ };
552
+ return {
553
+ kind: "error",
554
+ message
555
+ };
556
+ }
557
+ function isUnauthorizedBlockApiError(error) {
558
+ return error instanceof Error && error.name === "BlockApiError" && hasStatus(error) && error.status === 401;
559
+ }
560
+ function hasStatus(value) {
561
+ return typeof value === "object" && value !== null && "status" in value;
562
+ }
563
+ function getWaitlistClaim(state) {
564
+ return state.kind === "resolved" ? state.claim : null;
565
+ }
566
+ function getWaitlistClaimError(state) {
567
+ return state.kind === "error" ? state.message : null;
568
+ }
569
+ function getWaitlistClaimLoginMessage(state) {
570
+ return state.kind === "portal-login-required" ? state.message : null;
571
+ }
572
+ function requiresWaitlistClaimPortalLogin(state) {
573
+ return state.kind === "portal-login-required";
574
+ }
575
+ function isWaitlistClaimLoading(state) {
576
+ return state.kind === "resolving";
577
+ }
578
+ //#endregion
579
+ //#region ../blocks/src/system/runtime/shared/useWaitlistClaim.ts
580
+ const WAITLIST_CLAIM_LOCATION_EVENT = "riverbank:waitlist-claim-location-change";
581
+ let historyPatched = false;
582
+ function emitWaitlistClaimLocationChange() {
583
+ if (typeof window === "undefined") return;
584
+ window.dispatchEvent(new Event(WAITLIST_CLAIM_LOCATION_EVENT));
585
+ }
586
+ function ensureWaitlistClaimLocationTracking() {
587
+ if (typeof window === "undefined" || historyPatched) return;
588
+ historyPatched = true;
589
+ const history = window.history;
590
+ if (history.__riverbankWaitlistClaimPatched__) return;
591
+ const wrapHistoryMethod = (method) => {
592
+ return function patched(...args) {
593
+ method.apply(this, args);
594
+ emitWaitlistClaimLocationChange();
595
+ };
596
+ };
597
+ try {
598
+ history.pushState = wrapHistoryMethod(history.pushState);
599
+ history.replaceState = wrapHistoryMethod(history.replaceState);
600
+ history.__riverbankWaitlistClaimPatched__ = true;
601
+ } catch {}
602
+ window.addEventListener("popstate", emitWaitlistClaimLocationChange);
603
+ }
604
+ function getWaitlistClaimTokenFromUrl() {
605
+ if (typeof window === "undefined") return null;
606
+ const token = new URLSearchParams(window.location.search).get("waitlist_claim")?.trim() ?? "";
607
+ return token.length > 0 ? token : null;
608
+ }
609
+ const useWaitlistClaimDeps = { useBlockApi };
610
+ function subscribeToWaitlistClaimToken(callback) {
611
+ if (typeof window === "undefined") return () => {};
612
+ ensureWaitlistClaimLocationTracking();
613
+ window.addEventListener(WAITLIST_CLAIM_LOCATION_EVENT, callback);
614
+ return () => {
615
+ window.removeEventListener(WAITLIST_CLAIM_LOCATION_EVENT, callback);
616
+ };
617
+ }
618
+ function getWaitlistClaimTokenSnapshot() {
619
+ return getWaitlistClaimTokenFromUrl();
620
+ }
621
+ function useWaitlistClaim() {
622
+ return useWaitlistClaimWithDeps(useWaitlistClaimDeps);
623
+ }
624
+ function useWaitlistClaimWithDeps(deps) {
625
+ const api = deps.useBlockApi();
626
+ const token = useSyncExternalStore(subscribeToWaitlistClaimToken, getWaitlistClaimTokenSnapshot, () => null);
627
+ const [state, dispatch] = useReducer(waitlistClaimReducer, Boolean(token), createInitialWaitlistClaimState);
628
+ useEffect(() => {
629
+ let cancelled = false;
630
+ async function resolveClaim() {
631
+ if (!token) {
632
+ dispatch({ type: "cleared" });
633
+ return;
634
+ }
635
+ dispatch({ type: "started" });
636
+ try {
637
+ const result = await api.resolveWaitlistClaim({ claimToken: token });
638
+ if (cancelled) return;
639
+ dispatch({
640
+ type: "resolved",
641
+ claim: result
642
+ });
643
+ } catch (claimError) {
644
+ if (cancelled) return;
645
+ dispatch({
646
+ type: "failed",
647
+ failure: toWaitlistClaimResolveFailure(claimError)
648
+ });
649
+ }
650
+ }
651
+ resolveClaim();
652
+ return () => {
653
+ cancelled = true;
654
+ };
655
+ }, [api, token]);
656
+ return {
657
+ token,
658
+ claim: getWaitlistClaim(state),
659
+ error: getWaitlistClaimError(state),
660
+ loginMessage: getWaitlistClaimLoginMessage(state),
661
+ requiresPortalLogin: requiresWaitlistClaimPortalLogin(state),
662
+ isLoading: isWaitlistClaimLoading(state)
663
+ };
664
+ }
665
+ //#endregion
666
+ //#region ../blocks/src/system/runtime/shared/utils/portalLogout.ts
667
+ /**
668
+ * Portal Logout Utility
669
+ *
670
+ * Logout from the customer portal by POSTing to the logout endpoint.
671
+ * Uses a hidden form because the httpOnly cookie can only be cleared server-side.
672
+ */
673
+ /**
674
+ * Logout from the customer portal.
675
+ *
676
+ * @param anchorId - The anchor ID to redirect back to after logout
677
+ */
678
+ function logoutPortal(anchorId) {
679
+ const form = document.createElement("form");
680
+ form.method = "POST";
681
+ form.action = "/api/portal/logout";
682
+ const redirectInput = document.createElement("input");
683
+ redirectInput.type = "hidden";
684
+ redirectInput.name = "redirect_to";
685
+ redirectInput.value = `${window.location.pathname}#${anchorId}`;
686
+ form.appendChild(redirectInput);
687
+ document.body.appendChild(form);
688
+ form.submit();
689
+ }
690
+ //#endregion
493
691
  //#region ../blocks/src/system/runtime/nodes/course-registration/pricing.ts
494
692
  function parseCurrencyInputToCents(value) {
495
693
  const trimmed = value.trim();
@@ -1373,6 +1571,126 @@ function BookingModeStep({ bookingMode, onBookingModeChange, eligibleMemberships
1373
1571
  });
1374
1572
  }
1375
1573
  //#endregion
1574
+ //#region ../blocks/src/system/runtime/nodes/shared/MagicLinkForm.state.ts
1575
+ const initialMagicLinkSubmissionState = Object.freeze({ tag: "idle" });
1576
+ function magicLinkSubmissionReducer(state, action) {
1577
+ switch (action.type) {
1578
+ case "submit-started":
1579
+ if (state.tag === "submitting") return state;
1580
+ return { tag: "submitting" };
1581
+ case "submit-succeeded":
1582
+ if (state.tag !== "submitting") return state;
1583
+ return { tag: "success" };
1584
+ case "submit-failed":
1585
+ if (state.tag !== "submitting") return state;
1586
+ return {
1587
+ tag: "error",
1588
+ message: action.message
1589
+ };
1590
+ case "reset": return initialMagicLinkSubmissionState;
1591
+ default: return assertNever$1(action);
1592
+ }
1593
+ }
1594
+ function isMagicLinkSubmitting(state) {
1595
+ return state.tag === "submitting";
1596
+ }
1597
+ function getMagicLinkError(state) {
1598
+ return state.tag === "error" ? state.message : null;
1599
+ }
1600
+ //#endregion
1601
+ //#region ../blocks/src/system/runtime/nodes/shared/MagicLinkForm.tsx
1602
+ /**
1603
+ * Reusable magic link login form.
1604
+ * Used by Customer Portal and Event Registration blocks.
1605
+ */
1606
+ function MagicLinkForm({ initialEmail = "", title, subtitle, buttonText = "Send login link", successMessage = "Check your email for a login link to sign in.", onSuccess, classPrefix = "er", compact = false }) {
1607
+ const api = useBlockApi();
1608
+ const [email, setEmail] = useState(initialEmail);
1609
+ const [submissionState, dispatchSubmission] = useReducer(magicLinkSubmissionReducer, initialMagicLinkSubmissionState);
1610
+ const loading = isMagicLinkSubmitting(submissionState);
1611
+ const error = getMagicLinkError(submissionState);
1612
+ const handleSubmit = async (e) => {
1613
+ e.preventDefault();
1614
+ const normalizedEmail = email.trim().toLowerCase();
1615
+ if (!normalizedEmail || loading) return;
1616
+ dispatchSubmission({ type: "submit-started" });
1617
+ try {
1618
+ const redirectTo = `${window.location.pathname}${window.location.search}${window.location.hash}`;
1619
+ await api.sendMagicLink({
1620
+ email: normalizedEmail,
1621
+ redirectUrl: `${window.location.origin}/api/portal/callback?redirect_to=${encodeURIComponent(redirectTo)}`
1622
+ });
1623
+ dispatchSubmission({ type: "submit-succeeded" });
1624
+ onSuccess?.();
1625
+ } catch (err) {
1626
+ console.error("Magic link error:", err);
1627
+ dispatchSubmission({
1628
+ type: "submit-failed",
1629
+ message: getMagicLinkErrorMessage(err)
1630
+ });
1631
+ }
1632
+ };
1633
+ const handleReset = () => {
1634
+ setEmail("");
1635
+ dispatchSubmission({ type: "reset" });
1636
+ };
1637
+ if (submissionState.tag === "success") return /* @__PURE__ */ jsxs("div", {
1638
+ className: `${classPrefix}-magic-link-success`,
1639
+ children: [/* @__PURE__ */ jsx("p", {
1640
+ className: `${classPrefix}-portal-auth-text ${classPrefix}-portal-auth-text--success`,
1641
+ children: successMessage
1642
+ }), !compact && /* @__PURE__ */ jsx("button", {
1643
+ type: "button",
1644
+ className: classPrefix === "cp" ? themeButtonClassName({
1645
+ variant: "secondary",
1646
+ size: "md"
1647
+ }) : `${classPrefix}-modal-btn ${classPrefix}-modal-btn--secondary`,
1648
+ onClick: handleReset,
1649
+ children: "Try a different email"
1650
+ })]
1651
+ });
1652
+ return /* @__PURE__ */ jsxs("form", {
1653
+ onSubmit: handleSubmit,
1654
+ className: `${classPrefix}-magic-link-form`,
1655
+ children: [
1656
+ title && /* @__PURE__ */ jsx("h3", {
1657
+ className: `${classPrefix}-magic-link-title`,
1658
+ children: title
1659
+ }),
1660
+ subtitle && /* @__PURE__ */ jsx("p", {
1661
+ className: `${classPrefix}-portal-auth-text`,
1662
+ children: subtitle
1663
+ }),
1664
+ /* @__PURE__ */ jsx("input", {
1665
+ type: "email",
1666
+ className: classPrefix === "cp" ? "cp-input" : `${classPrefix}-form__input`,
1667
+ placeholder: "your@email.com",
1668
+ value: email,
1669
+ onChange: (e) => setEmail(e.target.value),
1670
+ autoFocus: !compact,
1671
+ required: true,
1672
+ disabled: loading
1673
+ }),
1674
+ error && /* @__PURE__ */ jsx("p", {
1675
+ className: `${classPrefix}-portal-auth-text ${classPrefix}-portal-auth-text--error`,
1676
+ children: error
1677
+ }),
1678
+ /* @__PURE__ */ jsx("button", {
1679
+ type: "submit",
1680
+ className: classPrefix === "cp" ? themeButtonClassName({
1681
+ variant: "primary",
1682
+ size: "md"
1683
+ }) : `${classPrefix}-modal-btn`,
1684
+ disabled: !email.trim() || loading,
1685
+ children: loading ? "Sending..." : buttonText
1686
+ })
1687
+ ]
1688
+ });
1689
+ }
1690
+ function getMagicLinkErrorMessage(error) {
1691
+ return error instanceof Error ? error.message : "Failed to send. Please try again.";
1692
+ }
1693
+ //#endregion
1376
1694
  //#region ../blocks/src/system/runtime/nodes/course-registration/PortalAuthSidebar.tsx
1377
1695
  /**
1378
1696
  * Portal authentication sidebar.
@@ -2012,42 +2330,4 @@ function CourseRegistrationWizard(props) {
2012
2330
  });
2013
2331
  }
2014
2332
  //#endregion
2015
- //#region ../blocks/src/system/runtime/nodes/course-registration.client.tsx
2016
- function toCourseRegistrationClientProps(props) {
2017
- return {
2018
- ...props.render.hydration,
2019
- buttonText: props.render.display.summaryButtonText,
2020
- className: props.render.display.className ?? void 0
2021
- };
2022
- }
2023
- function CourseRegistrationClient(props) {
2024
- return /* @__PURE__ */ jsx(CourseRegistrationErrorBoundary, {
2025
- className: props.className,
2026
- children: /* @__PURE__ */ jsx(CourseRegistrationWizard, { ...props })
2027
- });
2028
- }
2029
- function CourseRegistrationIslandClient(props) {
2030
- return /* @__PURE__ */ jsx(CourseRegistrationClient, { ...toCourseRegistrationClientProps(props) });
2031
- }
2032
- //#endregion
2033
- //#region src/rendering/islands/enhancers/courseRegistration.tsx
2034
- const decode = defineIslandPropsDecoder("course-registration");
2035
- const enhance = (root, props) => {
2036
- const { siteId, apiBaseUrl, stage, portalToken } = props;
2037
- if (!siteId) throw new Error("[sdk:islands] course-registration requires siteId");
2038
- if (!apiBaseUrl) throw new Error("[sdk:islands] course-registration requires apiBaseUrl");
2039
- const apiConfig = buildRouteIslandApiConfig({
2040
- apiBaseUrl,
2041
- portalToken,
2042
- siteId,
2043
- stage
2044
- });
2045
- return mountReactIsland(root, ({ root: reactRoot }) => {
2046
- reactRoot.render(/* @__PURE__ */ jsx(BlockApiProvider, {
2047
- config: apiConfig,
2048
- children: /* @__PURE__ */ jsx(CourseRegistrationIslandClient, { ...props })
2049
- }));
2050
- });
2051
- };
2052
- //#endregion
2053
- export { decode, enhance };
2333
+ export { LoggedInAsUser as a, useWaitlistClaim as i, MagicLinkForm as n, CourseRegistrationErrorBoundary as o, logoutPortal as r, ClockIcon as s, CourseRegistrationWizard as t };
@@ -1,5 +1,5 @@
1
1
  "use client";
2
- import { X as themeButtonClassName } from "./propsDecoder-BF7i6Ijg.mjs";
2
+ import { X as themeButtonClassName } from "./propsDecoder-CiTuhUwY.mjs";
3
3
  import { useId } from "react";
4
4
  import { jsx, jsxs } from "react/jsx-runtime";
5
5
  //#region ../blocks/src/system/runtime/api/types/discounts.ts
@@ -1,7 +1,7 @@
1
1
  "use client";
2
2
  import { t as clsx } from "./clsx-DgIEfj3H.mjs";
3
- import { A as formatDate, E as getEventRuntimeFiltersKey, F as formatEventTeacherLine, I as formatTime, L as getCardOrientation, N as formatEventPrice, R as getContainerClass, T as buildEventRuntimeFilters, U as getEventAvailability, V as resolveEventLinkProps, X as themeButtonClassName, yt as assertNever, z as groupEventsByDate } from "./propsDecoder-BF7i6Ijg.mjs";
4
- import { a as EventCardClient, i as EventPaginatedListView, n as useEventPagination, o as EventFilters, r as toError, t as useEventFilters } from "./useEventFilters-rc8VLeLV.mjs";
3
+ import { A as formatDate, E as getEventRuntimeFiltersKey, F as formatEventTeacherLine, I as formatTime, L as getCardOrientation, N as formatEventPrice, R as getContainerClass, T as buildEventRuntimeFilters, U as getEventAvailability, V as resolveEventLinkProps, X as themeButtonClassName, yt as assertNever, z as groupEventsByDate } from "./propsDecoder-CiTuhUwY.mjs";
4
+ import { a as EventCardClient, i as EventPaginatedListView, n as useEventPagination, o as EventFilters, r as toError, t as useEventFilters } from "./useEventFilters-QZ3HMgaJ.mjs";
5
5
  import { n as useBlockApi } from "./context-CJz1Vlsz.mjs";
6
6
  import { t as createBodyThemePortalRoot } from "./themePortalRoot-AGs4cE7t.mjs";
7
7
  import { t as ModalShell } from "./ModalShell-CqkBvBIC.mjs";
@@ -1,6 +1,6 @@
1
1
  "use client";
2
- import { T as buildEventRuntimeFilters } from "./propsDecoder-BF7i6Ijg.mjs";
3
- import { i as EventPaginatedListView, n as useEventPagination, o as EventFilters, t as useEventFilters } from "./useEventFilters-rc8VLeLV.mjs";
2
+ import { T as buildEventRuntimeFilters } from "./propsDecoder-CiTuhUwY.mjs";
3
+ import { i as EventPaginatedListView, n as useEventPagination, o as EventFilters, t as useEventFilters } from "./useEventFilters-QZ3HMgaJ.mjs";
4
4
  import { useId, useMemo } from "react";
5
5
  import { jsx } from "react/jsx-runtime";
6
6
  //#region ../blocks/src/system/runtime/nodes/events/EventListing.client.tsx
@@ -1,5 +1,5 @@
1
1
  "use client";
2
- import { J as isRecord } from "./propsDecoder-BF7i6Ijg.mjs";
2
+ import { J as isRecord } from "./propsDecoder-CiTuhUwY.mjs";
3
3
  import { useEffect, useRef, useState } from "react";
4
4
  import { jsx } from "react/jsx-runtime";
5
5
  //#region ../blocks/src/system/runtime/nodes/shared/LeafletStaticMap.tsx
@@ -1,6 +1,6 @@
1
1
  import { t as clsx } from "./clsx-DgIEfj3H.mjs";
2
- import { Wt as formatCurrencyAmount } from "./propsDecoder-BF7i6Ijg.mjs";
3
- import { a as CheckIcon } from "./scrollToBlock-D_7t8yWb.mjs";
2
+ import { Wt as formatCurrencyAmount } from "./propsDecoder-CiTuhUwY.mjs";
3
+ import { a as CheckIcon } from "./scrollToBlock-CShkRqab.mjs";
4
4
  import "react";
5
5
  import { jsx, jsxs } from "react/jsx-runtime";
6
6
  //#region ../blocks/src/system/runtime/shared/utils/formatting.ts
@@ -1,4 +1,4 @@
1
- import { t as defineIslandPropsDecoder } from "./propsDecoder-BF7i6Ijg.mjs";
1
+ import { t as defineIslandPropsDecoder } from "./propsDecoder-CiTuhUwY.mjs";
2
2
  //#region src/rendering/islands/enhancers/accordion.ts
3
3
  const decode = defineIslandPropsDecoder("accordion");
4
4
  function parseDefaultValues(value) {
@@ -1,12 +1,12 @@
1
1
  "use client";
2
2
  import { d as unsafeAsAppointmentResourceId, f as unsafeAsAppointmentServiceId, g as unsafeAsPassId, m as unsafeAsFormId, p as unsafeAsCustomerPassId } from "./colorStyles-BWpj_h4C.mjs";
3
- import { n as buildBookingPaymentSelectionViewModel, t as usePolling } from "./usePolling-1ncrfd4S.mjs";
4
- import { Ct as okWith, Et as addLocalScheduleDays, Nt as parseBookingLocalDate, Pt as resolveBookingTimeZoneId, Tt as reportWorkflowSuccess, Wt as formatCurrencyAmount, X as themeButtonClassName, _t as toSelectedCollectionOptionKind, at as formatBookingCentsAsCurrencyInput, bt as clearWorkflowFeedback, ct as getBookingServiceSlidingScale, dt as parseBookingCurrencyInputToCents, ft as prepareBookingSubmission, gt as resolveDefaultBookingServiceId, ht as resolveBookingSiteId, it as deriveBookingFormViewState, jt as formatLocalScheduleDate, kt as formatBookingInstant, lt as getBookingSuccessMessage, mt as resolveBookingPaymentStep, ot as formatBookingSubmissionPreparationError, pt as resolveAppointmentCheckoutVerificationState, rt as logger, st as getBookingRedirectStateFromLocation, t as defineIslandPropsDecoder, ut as isBookingServiceSlidingAmountInRange, vt as BOOKING_FORM_DATA_RESERVED_KEYS, wt as reportWorkflowError, xt as err, yt as assertNever } from "./propsDecoder-BF7i6Ijg.mjs";
3
+ import { n as buildBookingPaymentSelectionViewModel, t as usePolling } from "./usePolling-BKf0GcE-.mjs";
4
+ import { Ct as okWith, Et as addLocalScheduleDays, Nt as parseBookingLocalDate, Pt as resolveBookingTimeZoneId, Tt as reportWorkflowSuccess, Wt as formatCurrencyAmount, X as themeButtonClassName, _t as toSelectedCollectionOptionKind, at as formatBookingCentsAsCurrencyInput, bt as clearWorkflowFeedback, ct as getBookingServiceSlidingScale, dt as parseBookingCurrencyInputToCents, ft as prepareBookingSubmission, gt as resolveDefaultBookingServiceId, ht as resolveBookingSiteId, it as deriveBookingFormViewState, jt as formatLocalScheduleDate, kt as formatBookingInstant, lt as getBookingSuccessMessage, mt as resolveBookingPaymentStep, ot as formatBookingSubmissionPreparationError, pt as resolveAppointmentCheckoutVerificationState, rt as logger, st as getBookingRedirectStateFromLocation, t as defineIslandPropsDecoder, ut as isBookingServiceSlidingAmountInRange, vt as BOOKING_FORM_DATA_RESERVED_KEYS, wt as reportWorkflowError, xt as err, yt as assertNever } from "./propsDecoder-CiTuhUwY.mjs";
5
5
  import { n as useBlockApi, t as BlockApiProvider } from "./context-CJz1Vlsz.mjs";
6
6
  import { n as isSpamProtectionEnabled, r as AltchaWidget, t as getChallengeUrl } from "./src-B833rYRr.mjs";
7
- import { a as CheckIcon, i as StateIcon, n as useDiscountCodeUi, r as TerminalPanel, t as scrollToBlock } from "./scrollToBlock-D_7t8yWb.mjs";
8
- import { t as DiscountCodeDisclosure } from "./DiscountCodeDisclosure-BDFRp8Y7.mjs";
9
- import { n as SpinnerNode, t as StepIndicator } from "./StepIndicator-D8gVYkK-.mjs";
7
+ import { a as CheckIcon, i as StateIcon, n as useDiscountCodeUi, r as TerminalPanel, t as scrollToBlock } from "./scrollToBlock-CShkRqab.mjs";
8
+ import { t as DiscountCodeDisclosure } from "./DiscountCodeDisclosure-B9vriL5C.mjs";
9
+ import { n as SpinnerNode, t as StepIndicator } from "./StepIndicator-DGCYuBJ1.mjs";
10
10
  import { t as FeedbackMessage } from "./FeedbackMessage-ByMrs3cr.mjs";
11
11
  import { n as getFieldValidationControlProps, t as FieldValidationMessage } from "./FieldValidationMessage-AYanWFb-.mjs";
12
12
  import { t as buildCheckoutReturnUrls } from "./checkoutUrls-Ct8Mxna3.mjs";
@@ -1,4 +1,4 @@
1
- import { t as defineIslandPropsDecoder } from "./propsDecoder-BF7i6Ijg.mjs";
1
+ import { t as defineIslandPropsDecoder } from "./propsDecoder-CiTuhUwY.mjs";
2
2
  import { t as mountReactIsland } from "./reactMount-SY8AVRof.mjs";
3
3
  import { n as normalizeCarouselProps, t as CarouselNodeClient } from "./carousel.client-CpwTUhIo.mjs";
4
4
  import "react";
@@ -1,6 +1,6 @@
1
- import { t as defineIslandPropsDecoder } from "./propsDecoder-BF7i6Ijg.mjs";
2
- import { t as CartController } from "./shop-commerce-DA7_Rq5p.mjs";
3
- import { t as mountShopBlockIsland } from "./shopShared-WL-E1znM.mjs";
1
+ import { t as defineIslandPropsDecoder } from "./propsDecoder-CiTuhUwY.mjs";
2
+ import { t as CartController } from "./shop-commerce-BzpsOdh7.mjs";
3
+ import { t as mountShopBlockIsland } from "./shopShared-cF0c20vB.mjs";
4
4
  import "react";
5
5
  import { jsx } from "react/jsx-runtime";
6
6
  //#region ../blocks/src/system/runtime/nodes/cart.client.tsx
@@ -1,6 +1,6 @@
1
- import { t as defineIslandPropsDecoder } from "./propsDecoder-BF7i6Ijg.mjs";
2
- import { n as CheckoutController } from "./shop-commerce-DA7_Rq5p.mjs";
3
- import { t as mountShopBlockIsland } from "./shopShared-WL-E1znM.mjs";
1
+ import { t as defineIslandPropsDecoder } from "./propsDecoder-CiTuhUwY.mjs";
2
+ import { n as CheckoutController } from "./shop-commerce-BzpsOdh7.mjs";
3
+ import { t as mountShopBlockIsland } from "./shopShared-cF0c20vB.mjs";
4
4
  import "react";
5
5
  import { jsx } from "react/jsx-runtime";
6
6
  //#region ../blocks/src/system/runtime/nodes/checkout.client.tsx