@riverbankcms/sdk 0.91.0 → 0.92.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 (104) hide show
  1. package/dist/{PreviewEditorSidebar-3TT47WCF.mjs → PreviewEditorSidebar-3CI5MKV3.mjs} +2 -2
  2. package/dist/{PreviewEditorUI-ORCLLUNZ.mjs → PreviewEditorUI-DKEP636I.mjs} +2 -2
  3. package/dist/SdkPreviewModeRuntime-BRGRDQFH.mjs +8 -0
  4. package/dist/_dts/api/src/bookingConfig.d.ts +13 -1
  5. package/dist/_dts/api/src/bookingOperations.d.ts +1 -0
  6. package/dist/_dts/api/src/bookingRefundOutcomes.d.ts +6 -6
  7. package/dist/_dts/api/src/customerMembershipOutcomes.d.ts +4 -4
  8. package/dist/_dts/api/src/publicExperienceEndpoints.d.ts +6 -0
  9. package/dist/_dts/blocks/src/contracts/proof-block-islands.d.ts +32 -0
  10. package/dist/_dts/blocks/src/system/blocks/courses/shared/pricing.d.ts +12 -1
  11. package/dist/_dts/blocks/src/system/blocks/courses/shared/schemas.d.ts +12 -0
  12. package/dist/_dts/blocks/src/system/blocks/courses/shared/types.d.ts +4 -1
  13. package/dist/_dts/blocks/src/system/blocks/events/shared/schemas.d.ts +44 -0
  14. package/dist/_dts/blocks/src/system/manifest/fieldValidation/index.d.ts +7 -0
  15. package/dist/_dts/blocks/src/system/runtime/api/types.d.ts +8 -1
  16. package/dist/_dts/blocks/src/system/runtime/hooks/useHeadlessBookingFlow.d.ts +8 -1
  17. package/dist/_dts/blocks/src/system/runtime/hooks/useHeadlessBookingFlow.state.d.ts +1 -0
  18. package/dist/_dts/blocks/src/system/runtime/nodes/booking-form.headless.state.d.ts +4 -0
  19. package/dist/_dts/blocks/src/system/runtime/nodes/booking-form.interactive.d.ts +40 -0
  20. package/dist/_dts/blocks/src/system/runtime/nodes/booking-form.reserved-fields.d.ts +1 -1
  21. package/dist/_dts/blocks/src/system/runtime/nodes/booking-form.state.d.ts +29 -0
  22. package/dist/_dts/blocks/src/system/runtime/nodes/booking-runtime-sources.d.ts +1 -0
  23. package/dist/_dts/blocks/src/system/runtime/nodes/course-registration/components.d.ts +6 -0
  24. package/dist/_dts/blocks/src/system/runtime/nodes/course-registration/useCourseRegistrationWizard.d.ts +8 -0
  25. package/dist/_dts/blocks/src/system/runtime/nodes/event-registration/TicketSelectionStep.d.ts +8 -0
  26. package/dist/_dts/blocks/src/system/runtime/nodes/event-registration/hooks.d.ts +1 -0
  27. package/dist/_dts/blocks/src/system/runtime/nodes/event-registration/types.d.ts +1 -1
  28. package/dist/_dts/blocks/src/system/runtime/nodes/event-registration/useEventRegistrationSubmit.d.ts +1 -0
  29. package/dist/_dts/blocks/src/system/runtime/nodes/event-registration/useEventRegistrationWizard.d.ts +9 -0
  30. package/dist/_dts/content-model/src/entry-slots/types.d.ts +110 -2
  31. package/dist/_dts/core/src/branded.d.ts +3 -0
  32. package/dist/_dts/core/src/event-pricing.d.ts +18 -1
  33. package/dist/_dts/core/src/money-input.d.ts +34 -4
  34. package/dist/_dts/db/src/generated/supabase/database.types.d.ts +70 -0
  35. package/dist/_dts/media-core/src/fileAssetCompatibility.d.ts +1 -1
  36. package/dist/_dts/media-core/src/filePersistence.d.ts +5 -1
  37. package/dist/_dts/media-core/src/fileStorage.d.ts +1 -0
  38. package/dist/_dts/media-core/src/videoPrep.d.ts +15 -6
  39. package/dist/_dts/media-core/src/videoSlotPolicy.d.ts +5 -5
  40. package/dist/_dts/sdk/src/cli/commands/push/execute/diff.d.ts +2 -0
  41. package/dist/_dts/sdk/src/cli/commands/push/execute/localMediaReporting.d.ts +23 -0
  42. package/dist/_dts/sdk/src/cli/commands/push/scopes/commandBackedDatedOfferingScope.d.ts +54 -0
  43. package/dist/_dts/sdk/src/cli/commands/push/scopes/mediaPrep.d.ts +7 -2
  44. package/dist/_dts/sdk/src/cli/commands/push/scopes/types.d.ts +6 -0
  45. package/dist/_dts/sdk/src/cli/media/local-sync.d.ts +35 -0
  46. package/dist/_dts/sdk/src/rendering/islands/types.d.ts +23 -1
  47. package/dist/_dts/sdk/src/version.d.ts +1 -1
  48. package/dist/{chunk-AFPMCLS7.mjs → chunk-6D7PLF4M.mjs} +1 -1
  49. package/dist/{chunk-RQUZYSES.mjs → chunk-I6EOKV6B.mjs} +520 -40
  50. package/dist/{chunk-S3YHJWEU.mjs → chunk-LERKJM3E.mjs} +5 -5
  51. package/dist/{chunk-GDT2QGIL.mjs → chunk-UOMTCHZD.mjs} +1 -1
  52. package/dist/cli/index.mjs +552 -80
  53. package/dist/client/{accordion-AFX37652.mjs → accordion-BUDH2G3S.mjs} +2 -2
  54. package/dist/client/{bookingForm-32V5QCOW.mjs → bookingForm-NQMCELVB.mjs} +89 -14
  55. package/dist/client/bookings.mjs +243 -17
  56. package/dist/client/{carousel-TJGQJ7ER.mjs → carousel-ONCEW6IJ.mjs} +3 -3
  57. package/dist/client/{cart-JUU2JEW4.mjs → cart-V2TCK2GI.mjs} +7 -7
  58. package/dist/client/{checkout-RD6BTFX4.mjs → checkout-ZI7SWNCS.mjs} +7 -7
  59. package/dist/client/{chunk-FMZZHAIR.mjs → chunk-AUMRQ242.mjs} +52 -5
  60. package/dist/client/{chunk-PMNAV6LO.mjs → chunk-B5UC2D6X.mjs} +7 -6
  61. package/dist/client/{chunk-6RN62XBV.mjs → chunk-ERQDHUS2.mjs} +1 -1
  62. package/dist/client/{chunk-RWYFG625.mjs → chunk-GH6IIOOE.mjs} +30 -2
  63. package/dist/client/{chunk-C4LP6BPG.mjs → chunk-HQWIJLYN.mjs} +1 -1
  64. package/dist/client/{chunk-RMOFBBNA.mjs → chunk-JXY6NHG6.mjs} +6 -6
  65. package/dist/client/{chunk-6QZIBNGV.mjs → chunk-KXYEKEV6.mjs} +154 -16
  66. package/dist/client/{chunk-E6VIWZUG.mjs → chunk-N2WJPTF7.mjs} +3 -3
  67. package/dist/client/{chunk-ISAUXU5R.mjs → chunk-QQNVQ62W.mjs} +1 -1
  68. package/dist/client/{chunk-MLBNVN4H.mjs → chunk-R3CZQLXF.mjs} +67 -4
  69. package/dist/client/{chunk-WHZQDPBZ.mjs → chunk-TNGL2WJF.mjs} +1 -0
  70. package/dist/client/{chunk-CKXEUWWA.mjs → chunk-ZJDBOLX7.mjs} +3 -3
  71. package/dist/client/client.mjs +515 -38
  72. package/dist/client/{courseRegistration-X63QAIVV.mjs → courseRegistration-JPWAQ6KM.mjs} +111 -11
  73. package/dist/client/{eventCalendar-5T24GCZL.mjs → eventCalendar-QDOCHBBV.mjs} +9 -9
  74. package/dist/client/{eventCombined-AZVTF22X.mjs → eventCombined-ZS2CXSIE.mjs} +9 -9
  75. package/dist/client/{eventDetails-7GPFNLGF.mjs → eventDetails-5LOBMPLN.mjs} +9 -9
  76. package/dist/client/{eventListing-QEUMTMUM.mjs → eventListing-SBGY4I3L.mjs} +9 -9
  77. package/dist/client/{eventRegistration-P2EDKCQZ.mjs → eventRegistration-XGPIU3Z2.mjs} +9 -9
  78. package/dist/client/{form-NUJ7H4IN.mjs → form-R7D4LZWW.mjs} +3 -3
  79. package/dist/client/{headerSection-JB7LECPL.mjs → headerSection-RRLYUCGC.mjs} +3 -3
  80. package/dist/client/hooks.mjs +22 -2
  81. package/dist/client/{locationMap-UEYWUCSW.mjs → locationMap-35ZJMRBZ.mjs} +3 -3
  82. package/dist/client/{newsletterForm-S2YZQ2X7.mjs → newsletterForm-MJ2VCFUT.mjs} +3 -3
  83. package/dist/client/{productDetail-H5MADGG7.mjs → productDetail-2O7YQNBX.mjs} +7 -7
  84. package/dist/client/{productList-DK7YON7H.mjs → productList-FDP5BH7W.mjs} +7 -7
  85. package/dist/client/rendering/client.mjs +495 -36
  86. package/dist/client/rendering/islands.mjs +19 -19
  87. package/dist/client/rendering.mjs +514 -37
  88. package/dist/client/{shop-6PA7RDRJ.mjs → shop-BGYJ3LDT.mjs} +7 -7
  89. package/dist/preview-next/client/runtime.mjs +3 -3
  90. package/dist/{sdk-runtime-JP5347OB.mjs → sdk-runtime-B3TFXRXZ.mjs} +4 -4
  91. package/dist/server/components.mjs +166 -7
  92. package/dist/server/config-validation.mjs +23 -2
  93. package/dist/server/config.mjs +23 -2
  94. package/dist/server/data.mjs +22 -2
  95. package/dist/server/index.mjs +1 -1
  96. package/dist/server/next.mjs +167 -8
  97. package/dist/server/page-converter.mjs +19 -2
  98. package/dist/server/prebuild.mjs +1 -1
  99. package/dist/server/rendering/server.mjs +166 -7
  100. package/dist/server/rendering.mjs +166 -7
  101. package/dist/server/routing.mjs +29 -5
  102. package/dist/server/server.mjs +23 -3
  103. package/package.json +1 -1
  104. package/dist/SdkPreviewModeRuntime-GMCDQPZZ.mjs +0 -8
@@ -1,7 +1,7 @@
1
1
  "use client";
2
- import { useBlockApi } from './chunk-WHZQDPBZ.mjs';
3
- import { themeButtonClassName, assertNever } from './chunk-MLBNVN4H.mjs';
4
- import { resolvePlanningDateInput, formatBookingPriceDisplay } from './chunk-RWYFG625.mjs';
2
+ import { useBlockApi } from './chunk-TNGL2WJF.mjs';
3
+ import { themeButtonClassName, assertNever } from './chunk-R3CZQLXF.mjs';
4
+ import { resolvePlanningDateInput, formatBookingPriceDisplay } from './chunk-GH6IIOOE.mjs';
5
5
  import { useState, useReducer, useSyncExternalStore, useEffect } from 'react';
6
6
  import { jsxs, jsx } from 'react/jsx-runtime';
7
7
 
@@ -163,7 +163,9 @@ function getSelectableCoursePricingOptionsForNow(course, now) {
163
163
  return left.name.localeCompare(right.name);
164
164
  });
165
165
  }
166
- function resolveCoursePricingState(course, selectedPricingOptionId, nowInput = {}) {
166
+ function resolveCoursePricingState(course, selectedPricingOptionId, selectedSlidingAmountOrNowInput, nowInput = {}) {
167
+ const selectedSlidingAmount = typeof selectedSlidingAmountOrNowInput === "number" || selectedSlidingAmountOrNowInput === null ? selectedSlidingAmountOrNowInput : null;
168
+ const effectiveNowInput = typeof selectedSlidingAmountOrNowInput === "object" && selectedSlidingAmountOrNowInput !== null ? selectedSlidingAmountOrNowInput : nowInput;
167
169
  const currency = course.pricing?.currency ?? course.currency;
168
170
  if (!course.pricing) {
169
171
  const legacyAmount = course.priceCents ?? 0;
@@ -173,6 +175,8 @@ function resolveCoursePricingState(course, selectedPricingOptionId, nowInput = {
173
175
  selectableOptions: [],
174
176
  requiresSelection: false,
175
177
  selectedOption: null,
178
+ slidingScale: null,
179
+ selectedSlidingAmount: null,
176
180
  selectedPriceAmount: legacyAmount,
177
181
  selectedRequiresPayment: legacyAmount > 0,
178
182
  hasPaidSelection: legacyAmount > 0,
@@ -187,6 +191,8 @@ function resolveCoursePricingState(course, selectedPricingOptionId, nowInput = {
187
191
  selectableOptions: [],
188
192
  requiresSelection: false,
189
193
  selectedOption: null,
194
+ slidingScale: null,
195
+ selectedSlidingAmount: null,
190
196
  selectedPriceAmount: 0,
191
197
  selectedRequiresPayment: false,
192
198
  hasPaidSelection: false,
@@ -200,6 +206,8 @@ function resolveCoursePricingState(course, selectedPricingOptionId, nowInput = {
200
206
  selectableOptions: [],
201
207
  requiresSelection: false,
202
208
  selectedOption: null,
209
+ slidingScale: null,
210
+ selectedSlidingAmount: null,
203
211
  selectedPriceAmount: amount,
204
212
  selectedRequiresPayment: amount > 0,
205
213
  hasPaidSelection: amount > 0,
@@ -209,7 +217,7 @@ function resolveCoursePricingState(course, selectedPricingOptionId, nowInput = {
209
217
  case "tiered": {
210
218
  const selectableOptions = getSelectableCoursePricingOptionsForNow(
211
219
  course,
212
- resolvePlanningDateInput(nowInput)
220
+ resolvePlanningDateInput(effectiveNowInput)
213
221
  );
214
222
  const selectedOption = (selectedPricingOptionId ? selectableOptions.find((option) => option.id === selectedPricingOptionId) : null) ?? (selectableOptions.length === 1 ? selectableOptions[0] ?? null : null);
215
223
  const lowestAmount = selectableOptions.reduce((lowest, option) => {
@@ -225,12 +233,51 @@ function resolveCoursePricingState(course, selectedPricingOptionId, nowInput = {
225
233
  selectableOptions,
226
234
  requiresSelection: selectableOptions.length > 1,
227
235
  selectedOption,
236
+ slidingScale: null,
237
+ selectedSlidingAmount: null,
228
238
  selectedPriceAmount: selectedOption?.priceAmount ?? null,
229
239
  selectedRequiresPayment: (selectedOption?.priceAmount ?? 0) > 0,
230
240
  hasPaidSelection: selectableOptions.some((option) => option.priceAmount > 0),
231
241
  hasFreeSelection: selectableOptions.some((option) => option.priceAmount === 0)
232
242
  };
233
243
  }
244
+ case "sliding_scale": {
245
+ const minAmount = course.pricing.slidingMinAmount ?? null;
246
+ const maxAmount = course.pricing.slidingMaxAmount ?? null;
247
+ if (minAmount === null || maxAmount === null || minAmount < 0 || maxAmount < minAmount) {
248
+ return {
249
+ currency,
250
+ display: { kind: "unavailable", currency },
251
+ selectableOptions: [],
252
+ requiresSelection: true,
253
+ selectedOption: null,
254
+ slidingScale: null,
255
+ selectedSlidingAmount: null,
256
+ selectedPriceAmount: null,
257
+ selectedRequiresPayment: false,
258
+ hasPaidSelection: false,
259
+ hasFreeSelection: false
260
+ };
261
+ }
262
+ const normalizedSelectedAmount = typeof selectedSlidingAmount === "number" && Number.isFinite(selectedSlidingAmount) ? selectedSlidingAmount : null;
263
+ return {
264
+ currency,
265
+ display: { kind: "range", minAmount, maxAmount, currency },
266
+ selectableOptions: [],
267
+ requiresSelection: normalizedSelectedAmount === null,
268
+ selectedOption: null,
269
+ slidingScale: {
270
+ minAmount,
271
+ maxAmount,
272
+ suggestedAmount: course.pricing.slidingSuggestedAmount ?? null
273
+ },
274
+ selectedSlidingAmount: normalizedSelectedAmount,
275
+ selectedPriceAmount: normalizedSelectedAmount,
276
+ selectedRequiresPayment: (normalizedSelectedAmount ?? 0) > 0,
277
+ hasPaidSelection: maxAmount > 0,
278
+ hasFreeSelection: minAmount === 0
279
+ };
280
+ }
234
281
  }
235
282
  }
236
283
  function formatCoursePriceDisplay(display, locale) {
@@ -1,6 +1,6 @@
1
1
  "use client";
2
2
  import { ChevronLeft, ChevronRight } from './chunk-6N7YRNYU.mjs';
3
- import { clsx_default } from './chunk-RWYFG625.mjs';
3
+ import { clsx_default } from './chunk-GH6IIOOE.mjs';
4
4
  import React, { useRef, useState, useCallback, useEffect } from 'react';
5
5
  import { jsxs, Fragment, jsx } from 'react/jsx-runtime';
6
6
 
@@ -1987,12 +1987,13 @@ var CarouselNodeClient = ({
1987
1987
  ]
1988
1988
  );
1989
1989
  const resolvedSlides = resolveSlidesToShowMobile(normalized.slidesToShow);
1990
+ const canAutoplay = normalized.autoplay && slides.length > 1;
1990
1991
  const cssVars = React.useMemo(
1991
1992
  () => getCarouselSlidesToShowCssVars(normalized.slidesToShow),
1992
1993
  [normalized.slidesToShow]
1993
1994
  );
1994
1995
  const plugins = React.useMemo(() => {
1995
- if (!normalized.autoplay) return void 0;
1996
+ if (!canAutoplay) return void 0;
1996
1997
  return [
1997
1998
  Autoplay({
1998
1999
  delay: normalized.autoplayDelay,
@@ -2002,7 +2003,7 @@ var CarouselNodeClient = ({
2002
2003
  // Continue after manual navigation
2003
2004
  })
2004
2005
  ];
2005
- }, [normalized.autoplay, normalized.autoplayDelay]);
2006
+ }, [canAutoplay, normalized.autoplayDelay]);
2006
2007
  const [viewportRef, api] = useEmblaCarousel(
2007
2008
  {
2008
2009
  align: "start",
@@ -2041,7 +2042,7 @@ var CarouselNodeClient = ({
2041
2042
  };
2042
2043
  }, [api]);
2043
2044
  React.useEffect(() => {
2044
- if (!api || !normalized.autoplay) return;
2045
+ if (!api || !canAutoplay) return;
2045
2046
  const autoplayPlugin = api.plugins()?.autoplay;
2046
2047
  if (!autoplayPlugin) return;
2047
2048
  const handleVisibility = () => {
@@ -2050,7 +2051,7 @@ var CarouselNodeClient = ({
2050
2051
  };
2051
2052
  document.addEventListener("visibilitychange", handleVisibility);
2052
2053
  return () => document.removeEventListener("visibilitychange", handleVisibility);
2053
- }, [api, normalized.autoplay]);
2054
+ }, [api, canAutoplay]);
2054
2055
  const inner = /* @__PURE__ */ jsxs(Fragment, { children: [
2055
2056
  /* @__PURE__ */ jsx("div", { className: "carousel-frame rb-overflow-hidden rb-w-full", children: /* @__PURE__ */ jsx(
2056
2057
  "div",
@@ -2101,7 +2102,7 @@ var CarouselNodeClient = ({
2101
2102
  "data-show-controls": normalized.showControls ? "true" : "false",
2102
2103
  "data-show-dots": normalized.showDots ? "true" : "false",
2103
2104
  "data-arrow-visibility": normalized.arrowVisibility,
2104
- "data-autoplay": normalized.autoplay ? "true" : "false",
2105
+ "data-autoplay": canAutoplay ? "true" : "false",
2105
2106
  "data-loop": normalized.loop ? "true" : "false",
2106
2107
  children: inner
2107
2108
  }
@@ -1,4 +1,4 @@
1
- import { EMPTY_COMMERCE_CART_STATE, parseStoredCommerceCartState, reduceCommerceCart, buildPassCartItem } from './chunk-MLBNVN4H.mjs';
1
+ import { EMPTY_COMMERCE_CART_STATE, parseStoredCommerceCartState, reduceCommerceCart, buildPassCartItem } from './chunk-R3CZQLXF.mjs';
2
2
  import * as React from 'react';
3
3
 
4
4
  var EMPTY_STATE = EMPTY_COMMERCE_CART_STATE;
@@ -15,6 +15,7 @@ function err(error) {
15
15
 
16
16
  // ../core/src/branded.ts
17
17
  var unsafeAsMediaAssetId = (id) => id;
18
+ var unsafeAsStoragePath = (value) => value;
18
19
  var unsafeAsFormId = (id) => id;
19
20
  var unsafeAsPassId = (id) => id;
20
21
  var unsafeAsCustomerPassId = (id) => id;
@@ -86,6 +87,7 @@ function publicEventPricingType(pricing) {
86
87
  return "free";
87
88
  case "single_paid":
88
89
  case "ticket_types":
90
+ case "sliding_scale":
89
91
  case "course":
90
92
  return isFreePublicEventPriceDisplay(pricing.display) ? "free" : "paid";
91
93
  case "external":
@@ -98,6 +100,7 @@ function publicEventPricingCurrency(pricing) {
98
100
  case "free_registration":
99
101
  case "single_paid":
100
102
  case "ticket_types":
103
+ case "sliding_scale":
101
104
  return pricing.currency;
102
105
  case "course":
103
106
  return pricing.display.display.currency;
@@ -115,6 +118,8 @@ function publicEventPricingMode(pricing) {
115
118
  return "single";
116
119
  case "ticket_types":
117
120
  return "ticket_types";
121
+ case "sliding_scale":
122
+ return "sliding_scale";
118
123
  case "drop_in":
119
124
  case "course":
120
125
  case "external":
@@ -148,6 +153,8 @@ function formatCoursePriceDisplayLabel(display, options) {
148
153
  return `Course (${formatCurrencyAmount(display.amount, display.currency, options)})`;
149
154
  case "from":
150
155
  return `Course (From ${formatCurrencyAmount(display.amount, display.currency, options)})`;
156
+ case "range":
157
+ return `Course (${formatCurrencyAmount(display.minAmount, display.currency, options)} - ${formatCurrencyAmount(display.maxAmount, display.currency, options)})`;
151
158
  default:
152
159
  return assertNever(display);
153
160
  }
@@ -623,6 +630,27 @@ function clsx() {
623
630
  }
624
631
  var clsx_default = clsx;
625
632
 
633
+ // ../media-core/src/fileSafety.ts
634
+ var CONTROL_CHARACTER_PATTERN = /[\u0000-\u001f\u007f]/u;
635
+ function containsUnsafePathSegmentCharacter(value) {
636
+ return value.includes("/") || value.includes("\\") || CONTROL_CHARACTER_PATTERN.test(value);
637
+ }
638
+ function isReservedPathSegment(value) {
639
+ return value === "." || value === "..";
640
+ }
641
+ function isUnsafePathSegment(segment) {
642
+ return segment.trim().length === 0 || segment !== segment.trim() || isReservedPathSegment(segment) || containsUnsafePathSegmentCharacter(segment);
643
+ }
644
+ function parseStoragePath(value) {
645
+ return joinStoragePathSegments(value.split("/"));
646
+ }
647
+ function joinStoragePathSegments(segments) {
648
+ if (segments.some(isUnsafePathSegment)) {
649
+ return err("unsafe-path-segment");
650
+ }
651
+ return ok(unsafeAsStoragePath(segments.join("/")));
652
+ }
653
+
626
654
  // ../media-core/src/typeGuards.ts
627
655
  function isRecord(value) {
628
656
  return Boolean(value) && typeof value === "object" && !Array.isArray(value);
@@ -639,10 +667,10 @@ var RELATIVE_STORAGE_PATH_PREFIXES = [
639
667
  "imports/"
640
668
  ];
641
669
  function isRelativeDirectImageStoragePath(storagePath) {
642
- return RELATIVE_STORAGE_PATH_PREFIXES.some((prefix) => storagePath.startsWith(prefix));
670
+ return RELATIVE_STORAGE_PATH_PREFIXES.some((prefix) => storagePath.startsWith(prefix)) && parseStoragePath(storagePath).ok;
643
671
  }
644
672
  function isSiteScopedDirectImageStoragePath(storagePath) {
645
- return storagePath.startsWith("sites/");
673
+ return storagePath.startsWith("sites/") && parseStoragePath(storagePath).ok;
646
674
  }
647
675
  function encodeStoragePath(storagePath) {
648
676
  return storagePath.split("/").map((segment) => encodeURIComponent(segment)).join("/");
@@ -1,5 +1,5 @@
1
1
  "use client";
2
- import { isRecord } from './chunk-MLBNVN4H.mjs';
2
+ import { isRecord } from './chunk-R3CZQLXF.mjs';
3
3
  import { useRef, useState, useEffect } from 'react';
4
4
  import { jsx } from 'react/jsx-runtime';
5
5
 
@@ -1,13 +1,13 @@
1
1
  "use client";
2
- import { addPassToCommerceCart, useCommerceCart } from './chunk-6RN62XBV.mjs';
3
- import { CarouselNodeClient } from './chunk-PMNAV6LO.mjs';
2
+ import { addPassToCommerceCart, useCommerceCart } from './chunk-ERQDHUS2.mjs';
3
+ import { CarouselNodeClient } from './chunk-B5UC2D6X.mjs';
4
4
  import { buildRouteIslandApiConfig } from './chunk-L4J5Y62O.mjs';
5
- import { useDiscountCodeUi, createBodyThemePortalRoot, consumeSearchParams, scrollToBlock, TerminalPanel, StateIcon, CheckIcon, CrossIcon, ActionRow, DiscountCodeDisclosure, consumeSearchParam, buildCheckoutReturnUrls } from './chunk-CKXEUWWA.mjs';
5
+ import { useDiscountCodeUi, createBodyThemePortalRoot, consumeSearchParams, scrollToBlock, TerminalPanel, StateIcon, CheckIcon, CrossIcon, ActionRow, DiscountCodeDisclosure, consumeSearchParam, buildCheckoutReturnUrls } from './chunk-ZJDBOLX7.mjs';
6
6
  import { ModalShell, resolveDedicatedCheckoutPath } from './chunk-WBQG7VJA.mjs';
7
- import { useBlockApi, FeedbackMessage, BlockApiProvider, discountAvailabilityHasDiscounts, discountAvailabilityAllowsManualEntry, getAutoAppliedDiscountPreview } from './chunk-WHZQDPBZ.mjs';
7
+ import { useBlockApi, FeedbackMessage, BlockApiProvider, discountAvailabilityHasDiscounts, discountAvailabilityAllowsManualEntry, getAutoAppliedDiscountPreview } from './chunk-TNGL2WJF.mjs';
8
8
  import { mountReactIsland } from './chunk-N7PBWBWQ.mjs';
9
- import { themeButtonClassName, formatCommercePrice, formatInterval, getShopDisplayForItems, deriveCommerceCheckoutState, buildProductDetailDisplay, productItemKey, buildProductCartItem, buildProductCardDisplay, assertNever as assertNever$1, reportWorkflowError, clearWorkflowFeedback, unwrapRichTextRoot, createRichTextDocFromMarkdown, isRecord } from './chunk-MLBNVN4H.mjs';
10
- import { assertNever, ok, err, getCurrentResolveImageUrlContext, resolveImageUrlWithContext, ImagePresets } from './chunk-RWYFG625.mjs';
9
+ import { themeButtonClassName, formatCommercePrice, formatInterval, getShopDisplayForItems, deriveCommerceCheckoutState, buildProductDetailDisplay, productItemKey, buildProductCartItem, buildProductCardDisplay, assertNever as assertNever$1, reportWorkflowError, clearWorkflowFeedback, unwrapRichTextRoot, createRichTextDocFromMarkdown, isRecord } from './chunk-R3CZQLXF.mjs';
10
+ import { assertNever, ok, err, getCurrentResolveImageUrlContext, resolveImageUrlWithContext, ImagePresets } from './chunk-GH6IIOOE.mjs';
11
11
  import * as React3 from 'react';
12
12
  import React3__default, { useState, useRef, useCallback, useEffect } from 'react';
13
13
  import { jsx, jsxs, Fragment } from 'react/jsx-runtime';
@@ -1,16 +1,16 @@
1
1
  "use client";
2
- import { LeafletStaticMap } from './chunk-C4LP6BPG.mjs';
3
- import { resolveCoursePricingState, useWaitlistClaim, MagicLinkForm, formatCoursePriceAmount, formatCoursePriceDisplay } from './chunk-FMZZHAIR.mjs';
2
+ import { LeafletStaticMap } from './chunk-HQWIJLYN.mjs';
3
+ import { resolveCoursePricingState, useWaitlistClaim, MagicLinkForm, formatCoursePriceAmount, formatCoursePriceDisplay } from './chunk-AUMRQ242.mjs';
4
4
  import { CreditCard, Ticket, Star, Sparkles } from './chunk-6N7YRNYU.mjs';
5
- import { usePolling, buildBookingPaymentSelectionViewModel } from './chunk-E6VIWZUG.mjs';
6
- import { SpinnerNode } from './chunk-ISAUXU5R.mjs';
7
- import { createBodyThemePortalRoot, TabBarFragment, useDiscountCodeUi, logoutPortal, consumeSearchParam, StepIndicator, DiscountCodeDisclosure, TerminalPanel, StateIcon, formatPrice, CrossIcon, ClockIcon, LoggedInAsUser, CheckIcon } from './chunk-CKXEUWWA.mjs';
5
+ import { usePolling, buildBookingPaymentSelectionViewModel } from './chunk-N2WJPTF7.mjs';
6
+ import { SpinnerNode } from './chunk-QQNVQ62W.mjs';
7
+ import { createBodyThemePortalRoot, TabBarFragment, useDiscountCodeUi, logoutPortal, consumeSearchParam, StepIndicator, DiscountCodeDisclosure, TerminalPanel, StateIcon, formatPrice, CrossIcon, ClockIcon, LoggedInAsUser, CheckIcon } from './chunk-ZJDBOLX7.mjs';
8
8
  import { getFieldValidationControlProps, FieldValidationMessage } from './chunk-3DCJ45Z2.mjs';
9
9
  import { ModalShell } from './chunk-WBQG7VJA.mjs';
10
10
  import { isSpamProtectionEnabled, AltchaWidget, getChallengeUrl } from './chunk-LJCX6V7Q.mjs';
11
- import { useBlockApi, FeedbackMessage } from './chunk-WHZQDPBZ.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, formatEventPriceDisplay, resolveRuntimeEventPricing, formatEventPrice, formatEventDateParts, resolveEventLinkProps, DateTimeTile, assertNever, EventCard, buildCalendarViewport, shiftCalendarAnchorDate, addMonths, getThreeMonthRange, buildTimetableModel, formatDate, MONTH_NAMES, getEventAvailability, formatEventTeacherLine, toRegistrationEvents, isEventContentType, findPreSelectedEvent, resolveRegistrationTarget, findEventByOccurrenceId, resolveEventRequiresPayment, resolveDiscountContext } from './chunk-MLBNVN4H.mjs';
13
- import { publicEventPricingType, getBookingLocalDateKey, toScheduledBookingDateTime, toBookingTimeZone, publicEventPricingCurrency, formatBookingDateTime, publicEventPricingMode, publicEventScalarPrice, publicEventTicketTypes, formatCurrencyAmount, formatBookingDate, formatBookingTime } from './chunk-RWYFG625.mjs';
11
+ import { useBlockApi, FeedbackMessage } from './chunk-TNGL2WJF.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, formatEventPriceDisplay, resolveRuntimeEventPricing, formatEventPrice, formatEventDateParts, resolveEventLinkProps, DateTimeTile, assertNever, EventCard, buildCalendarViewport, shiftCalendarAnchorDate, addMonths, getThreeMonthRange, buildTimetableModel, formatDate, MONTH_NAMES, getEventAvailability, formatEventTeacherLine, toRegistrationEvents, isEventContentType, findPreSelectedEvent, resolveRegistrationTarget, findEventByOccurrenceId, resolveEventRequiresPayment, resolveDiscountContext } from './chunk-R3CZQLXF.mjs';
13
+ import { publicEventPricingType, getBookingLocalDateKey, toScheduledBookingDateTime, toBookingTimeZone, publicEventPricingCurrency, formatBookingDateTime, publicEventPricingMode, publicEventScalarPrice, publicEventTicketTypes, formatCurrencyAmount, formatBookingDate, formatBookingTime } from './chunk-GH6IIOOE.mjs';
14
14
  import React9, { createContext, useId, useMemo, useReducer, useState, useRef, useEffect, useCallback, useContext } from 'react';
15
15
  import { createPortal } from 'react-dom';
16
16
  import { jsx, jsxs, Fragment } from 'react/jsx-runtime';
@@ -525,6 +525,7 @@ function useEligibility(params) {
525
525
  occurrenceId: params.occurrenceId,
526
526
  attendanceMode: params.attendanceMode ?? void 0,
527
527
  ticketTypeId: params.ticketTypeId ?? void 0,
528
+ selectedSlidingAmount: params.selectedSlidingAmount ?? void 0,
528
529
  email: params.email.trim().toLowerCase(),
529
530
  ticketsCount: params.ticketsCount
530
531
  });
@@ -545,7 +546,7 @@ function useEligibility(params) {
545
546
  return () => {
546
547
  cancelled = true;
547
548
  };
548
- }, [api, params.enabled, params.occurrenceId, params.attendanceMode, params.ticketTypeId, params.email, params.ticketsCount]);
549
+ }, [api, params.enabled, params.occurrenceId, params.attendanceMode, params.ticketTypeId, params.selectedSlidingAmount, params.email, params.ticketsCount]);
549
550
  return {
550
551
  state,
551
552
  eligibility: state.eligibility,
@@ -868,6 +869,41 @@ function TicketCounterLimit(props) {
868
869
  ] }) : null
869
870
  ] });
870
871
  }
872
+ function formatCurrencyInputAmount(amount) {
873
+ const major = amount / 100;
874
+ return Number.isInteger(major) ? String(major) : major.toFixed(2);
875
+ }
876
+ function SlidingScaleAmountField(props) {
877
+ const minLabel = formatPrice(props.slidingScale.minAmount, props.currency);
878
+ const maxLabel = formatPrice(props.slidingScale.maxAmount, props.currency);
879
+ const suggestedLabel = props.slidingScale.suggestedAmount !== null ? formatPrice(props.slidingScale.suggestedAmount, props.currency) : null;
880
+ return /* @__PURE__ */ jsxs("div", { className: "er-field", children: [
881
+ /* @__PURE__ */ jsx("label", { htmlFor: "er-sliding-amount", className: "er-label", children: "Amount" }),
882
+ /* @__PURE__ */ jsx(
883
+ "input",
884
+ {
885
+ id: "er-sliding-amount",
886
+ type: "number",
887
+ min: formatCurrencyInputAmount(props.slidingScale.minAmount),
888
+ max: formatCurrencyInputAmount(props.slidingScale.maxAmount),
889
+ step: "0.01",
890
+ inputMode: "decimal",
891
+ className: "er-input",
892
+ value: props.value,
893
+ onChange: (event) => props.onChange?.(event.target.value)
894
+ }
895
+ ),
896
+ /* @__PURE__ */ jsxs("p", { className: "er-text er-text--muted", children: [
897
+ "Choose between ",
898
+ minLabel,
899
+ " and ",
900
+ maxLabel,
901
+ suggestedLabel ? `; suggested ${suggestedLabel}` : "",
902
+ "."
903
+ ] }),
904
+ props.message ? /* @__PURE__ */ jsx("p", { className: "er-text er-text--muted", children: props.message }) : null
905
+ ] });
906
+ }
871
907
  function getTicketTypeCounterAvailabilityLabel(input) {
872
908
  if (input.selectedRemainingCapacity !== null) {
873
909
  return `${input.selectedRemainingCapacity} remaining for this ticket type`;
@@ -931,6 +967,10 @@ var TicketSelectionStep = ({
931
967
  maxTickets,
932
968
  selectedTicketTypeId = null,
933
969
  onTicketTypeChange,
970
+ slidingScale = null,
971
+ selectedSlidingAmountInput = "",
972
+ slidingScaleSelectionMessage = null,
973
+ onSlidingAmountChange,
934
974
  onTicketsChange
935
975
  }) => {
936
976
  const deliveryMode = event?.deliveryMode ?? "in_person";
@@ -1046,6 +1086,16 @@ var TicketSelectionStep = ({
1046
1086
  ] })
1047
1087
  ] })
1048
1088
  ] }) : /* @__PURE__ */ jsxs(Fragment, { children: [
1089
+ slidingScale ? /* @__PURE__ */ jsx(
1090
+ SlidingScaleAmountField,
1091
+ {
1092
+ slidingScale,
1093
+ currency: eventPricingCurrency ?? DEFAULT_EVENT_CURRENCY,
1094
+ value: selectedSlidingAmountInput,
1095
+ message: slidingScaleSelectionMessage,
1096
+ onChange: onSlidingAmountChange
1097
+ }
1098
+ ) : null,
1049
1099
  /* @__PURE__ */ jsx("h3", { className: "er-title", children: canJoinWaitlist ? "How many waitlist spots?" : "How many tickets?" }),
1050
1100
  /* @__PURE__ */ jsxs("div", { className: "er-ticket-counter-group", children: [
1051
1101
  /* @__PURE__ */ jsx(
@@ -1898,6 +1948,10 @@ function EventRegistrationWizardContent(props) {
1898
1948
  maxTickets: wizard.maxTicketsNum,
1899
1949
  selectedTicketTypeId: wizard.selectedTicketTypeId,
1900
1950
  onTicketTypeChange: wizard.setSelectedTicketTypeId,
1951
+ slidingScale: wizard.selectedEventSlidingScale,
1952
+ selectedSlidingAmountInput: wizard.selectedSlidingAmountInput,
1953
+ slidingScaleSelectionMessage: wizard.slidingScaleSelectionMessage,
1954
+ onSlidingAmountChange: wizard.setSelectedSlidingAmountInput,
1901
1955
  onTicketsChange: wizard.setTicketsCount
1902
1956
  }
1903
1957
  )
@@ -2091,7 +2145,7 @@ function EventRegistrationSummaryBar(props) {
2091
2145
  const summaryTimeZone = wizard.occurrenceContext?.timeZone ?? summaryEvent?.timeZone ?? null;
2092
2146
  const occurrenceOverrideTitle = wizard.occurrenceContext?.overrides?.title;
2093
2147
  const summaryTitle = occurrenceOverrideTitle ?? summaryEvent?.title ?? "";
2094
- const summaryPrice = wizard.selectedTicketType?.priceAmount ?? wizard.eligibility?.price ?? (summaryEvent ? publicEventScalarPrice(summaryEvent.pricing) : null) ?? 0;
2148
+ const summaryPrice = wizard.selectedTicketType?.priceAmount ?? wizard.eligibility?.price ?? (wizard.selectedEventSlidingScale ? wizard.selectedSlidingAmount : null) ?? (summaryEvent ? publicEventScalarPrice(summaryEvent.pricing) : null) ?? 0;
2095
2149
  const summaryCurrency = (summaryEvent ? publicEventPricingCurrency(summaryEvent.pricing) : null) ?? DEFAULT_EVENT_CURRENCY;
2096
2150
  const teamMemberNames = (summaryEvent?.teamMembers ?? []).map((teamMember) => teamMember.name).filter(Boolean);
2097
2151
  const subtotalCents = Math.max(0, summaryPrice * wizard.ticketsCount);
@@ -2347,6 +2401,7 @@ function useEventRegistrationSubmit(options) {
2347
2401
  occurrenceId: submitOccurrenceId,
2348
2402
  attendanceMode: options.selectedAttendanceMode ?? void 0,
2349
2403
  ticketTypeId: options.selectedTicketTypeId ?? void 0,
2404
+ selectedSlidingAmount: options.selectedSlidingAmount ?? void 0,
2350
2405
  email: options.formData.email.trim().toLowerCase(),
2351
2406
  name: options.formData.name.trim(),
2352
2407
  ticketsCount: options.ticketsCount,
@@ -2448,6 +2503,35 @@ function useEventRegistrationSubmit(options) {
2448
2503
  }
2449
2504
 
2450
2505
  // ../blocks/src/system/runtime/nodes/event-registration/useEventRegistrationWizard.ts
2506
+ function parseCurrencyInputToCents(value) {
2507
+ const trimmed = value.trim();
2508
+ if (!trimmed) return null;
2509
+ const amount = Number(trimmed);
2510
+ if (!Number.isFinite(amount) || amount < 0) return null;
2511
+ return Math.round(amount * 100);
2512
+ }
2513
+ function formatCentsAsCurrencyInput(amount) {
2514
+ const major = amount / 100;
2515
+ return Number.isInteger(major) ? String(major) : major.toFixed(2);
2516
+ }
2517
+ function getSlidingScaleForEvent(event) {
2518
+ const pricing = event ? resolveRuntimeEventPricing(event) : null;
2519
+ return pricing?.kind === "sliding_scale" ? {
2520
+ minAmount: pricing.minAmount,
2521
+ maxAmount: pricing.maxAmount,
2522
+ suggestedAmount: pricing.suggestedAmount
2523
+ } : null;
2524
+ }
2525
+ function getSlidingScaleSelectionMessage(input) {
2526
+ if (!input.slidingScale) return null;
2527
+ if (input.selectedAmount === null) {
2528
+ return "Choose an amount to continue.";
2529
+ }
2530
+ if (input.selectedAmount < input.slidingScale.minAmount || input.selectedAmount > input.slidingScale.maxAmount) {
2531
+ return "Choose an amount within the sliding scale.";
2532
+ }
2533
+ return null;
2534
+ }
2451
2535
  function useEventRegistrationWizard(options) {
2452
2536
  const api = useBlockApi();
2453
2537
  const registrationEvents = useMemo(
@@ -2492,6 +2576,10 @@ function useEventRegistrationWizard(options) {
2492
2576
  preSelectedEvent?.deliveryMode === "online" ? "online" : preSelectedEvent?.deliveryMode === "in_person" ? "in_person" : null
2493
2577
  );
2494
2578
  const [selectedTicketTypeId, setSelectedTicketTypeId] = useState(null);
2579
+ const [selectedSlidingAmountInput, setSelectedSlidingAmountInput] = useState(() => {
2580
+ const slidingScale = getSlidingScaleForEvent(preSelectedEvent ?? null);
2581
+ return slidingScale?.suggestedAmount !== null && slidingScale?.suggestedAmount !== void 0 ? formatCentsAsCurrencyInput(slidingScale.suggestedAmount) : "";
2582
+ });
2495
2583
  const [registrationResult, setRegistrationResult] = useState(null);
2496
2584
  const [errorMessage, setErrorMessage] = useState("");
2497
2585
  const [altchaSolution, setAltchaSolution] = useState(null);
@@ -2528,6 +2616,7 @@ function useEventRegistrationWizard(options) {
2528
2616
  occurrenceId,
2529
2617
  attendanceMode: selectedAttendanceMode,
2530
2618
  ticketTypeId: selectedTicketTypeId,
2619
+ selectedSlidingAmount: parseCurrencyInputToCents(selectedSlidingAmountInput),
2531
2620
  email: formData.email,
2532
2621
  ticketsCount
2533
2622
  });
@@ -2663,6 +2752,18 @@ function useEventRegistrationWizard(options) {
2663
2752
  }),
2664
2753
  [selectedAttendanceMode, selectedEvent, preSelectedEvent, eligibility, selectedTicketTypeId]
2665
2754
  );
2755
+ const selectedSlidingAmount = useMemo(
2756
+ () => parseCurrencyInputToCents(selectedSlidingAmountInput),
2757
+ [selectedSlidingAmountInput]
2758
+ );
2759
+ const selectedEventSlidingScale = useMemo(
2760
+ () => getSlidingScaleForEvent(selectedEvent ?? preSelectedEvent),
2761
+ [selectedEvent, preSelectedEvent]
2762
+ );
2763
+ const slidingScaleSelectionMessage = getSlidingScaleSelectionMessage({
2764
+ slidingScale: selectedEventSlidingScale,
2765
+ selectedAmount: selectedSlidingAmount
2766
+ });
2666
2767
  const ticketTypeSelectionRequired = useMemo(() => {
2667
2768
  const event = selectedEvent ?? preSelectedEvent;
2668
2769
  if (!event || publicEventPricingMode(resolveRuntimeEventPricing(event)) !== "ticket_types") {
@@ -2731,12 +2832,24 @@ function useEventRegistrationWizard(options) {
2731
2832
  setGuestSectionShake(false);
2732
2833
  };
2733
2834
  const eventRequiresPayment = useMemo(
2734
- () => resolveEventRequiresPayment({
2835
+ () => {
2836
+ if (selectedEventSlidingScale) {
2837
+ return (selectedSlidingAmount ?? 0) > 0;
2838
+ }
2839
+ return resolveEventRequiresPayment({
2840
+ eligibility,
2841
+ selectedTicketType,
2842
+ event: selectedEvent ?? preSelectedEvent
2843
+ });
2844
+ },
2845
+ [
2735
2846
  eligibility,
2736
2847
  selectedTicketType,
2737
- event: selectedEvent ?? preSelectedEvent
2738
- }),
2739
- [eligibility, selectedTicketType, selectedEvent, preSelectedEvent]
2848
+ selectedEvent,
2849
+ preSelectedEvent,
2850
+ selectedEventSlidingScale,
2851
+ selectedSlidingAmount
2852
+ ]
2740
2853
  );
2741
2854
  const handleDetailsComplete = async () => {
2742
2855
  if (ticketTypeSelectionRequired && !hasValidSelectedTicketType) {
@@ -2745,6 +2858,11 @@ function useEventRegistrationWizard(options) {
2745
2858
  setStep("error");
2746
2859
  return { ok: false, reason: "blocked", message };
2747
2860
  }
2861
+ if (slidingScaleSelectionMessage) {
2862
+ setErrorMessage(slidingScaleSelectionMessage);
2863
+ setStep("error");
2864
+ return { ok: false, reason: "blocked", message: slidingScaleSelectionMessage };
2865
+ }
2748
2866
  if (!validateForm()) {
2749
2867
  setGuestSectionShake(true);
2750
2868
  return {
@@ -2829,9 +2947,18 @@ function useEventRegistrationWizard(options) {
2829
2947
  const discountSubtotalCents = useMemo(() => {
2830
2948
  if (discountContext?.type !== "event") return void 0;
2831
2949
  const event = selectedEvent ?? preSelectedEvent;
2832
- const eventPriceCents = selectedTicketType?.priceAmount ?? eligibility?.price ?? (event ? publicEventScalarPrice(resolveRuntimeEventPricing(event)) : null) ?? 0;
2950
+ const eventPriceCents = selectedTicketType?.priceAmount ?? eligibility?.price ?? (selectedEventSlidingScale ? selectedSlidingAmount : null) ?? (event ? publicEventScalarPrice(resolveRuntimeEventPricing(event)) : null) ?? 0;
2833
2951
  return Math.max(0, eventPriceCents * ticketsCount);
2834
- }, [discountContext, selectedTicketType, eligibility, selectedEvent, preSelectedEvent, ticketsCount]);
2952
+ }, [
2953
+ discountContext,
2954
+ selectedTicketType,
2955
+ eligibility,
2956
+ selectedEvent,
2957
+ preSelectedEvent,
2958
+ selectedEventSlidingScale,
2959
+ selectedSlidingAmount,
2960
+ ticketsCount
2961
+ ]);
2835
2962
  const discountUi = useDiscountCodeUi({ api, discountContext, subtotalCents: discountSubtotalCents });
2836
2963
  const selectionMethod = paymentSelection.method;
2837
2964
  const shouldShowDiscountToggle = discountContext !== null && discountUi.manualCodeEntryAllowed && (selectionMethod === "stripe" || selectionMethod === "pass_bundle" || selectionMethod === "membership_bundle");
@@ -2840,6 +2967,7 @@ function useEventRegistrationWizard(options) {
2840
2967
  registrationTarget,
2841
2968
  selectedAttendanceMode,
2842
2969
  selectedTicketTypeId,
2970
+ selectedSlidingAmount,
2843
2971
  ticketsCount,
2844
2972
  formData,
2845
2973
  altchaSolution,
@@ -2854,6 +2982,10 @@ function useEventRegistrationWizard(options) {
2854
2982
  });
2855
2983
  const handleEventSelect = (event) => {
2856
2984
  setSelectedEvent(event);
2985
+ const slidingScale = getSlidingScaleForEvent(event);
2986
+ setSelectedSlidingAmountInput(
2987
+ slidingScale?.suggestedAmount !== null && slidingScale?.suggestedAmount !== void 0 ? formatCentsAsCurrencyInput(slidingScale.suggestedAmount) : ""
2988
+ );
2857
2989
  setSelectedAttendanceMode(
2858
2990
  (event.deliveryMode ?? "in_person") === "hybrid" ? null : (event.deliveryMode ?? "in_person") === "online" ? "online" : "in_person"
2859
2991
  );
@@ -2863,6 +2995,7 @@ function useEventRegistrationWizard(options) {
2863
2995
  const handleRetry = () => {
2864
2996
  dispatchFlow({ type: "reset", hasPreSelectedContext });
2865
2997
  setSelectedTicketTypeId(null);
2998
+ setSelectedSlidingAmountInput("");
2866
2999
  setSelectedAttendanceMode(
2867
3000
  preSelectedEvent?.deliveryMode === "online" ? "online" : preSelectedEvent?.deliveryMode === "in_person" ? "in_person" : null
2868
3001
  );
@@ -2899,6 +3032,11 @@ function useEventRegistrationWizard(options) {
2899
3032
  setSelectedAttendanceMode,
2900
3033
  selectedTicketTypeId,
2901
3034
  setSelectedTicketTypeId,
3035
+ selectedSlidingAmountInput,
3036
+ setSelectedSlidingAmountInput,
3037
+ selectedSlidingAmount,
3038
+ selectedEventSlidingScale,
3039
+ slidingScaleSelectionMessage,
2902
3040
  selectedTicketType,
2903
3041
  visibleTicketTypes,
2904
3042
  ticketTypeSelectionRequired,
@@ -1,7 +1,7 @@
1
1
  "use client";
2
- import { formatPrice } from './chunk-CKXEUWWA.mjs';
3
- import { assertNever } from './chunk-MLBNVN4H.mjs';
4
- import { resolveFlexibleBalanceInitialPaymentCents, resolveFlexibleBalanceDueAt, getBookingInstalmentDepositRefundability, splitAmountWithRemainderInFirst, addIntervalPreservingMonthAnchor, clampConfiguredAmount, getBookingInstalmentPlanIntervalCount, omitZeroAmountFutureRows } from './chunk-RWYFG625.mjs';
2
+ import { formatPrice } from './chunk-ZJDBOLX7.mjs';
3
+ import { assertNever } from './chunk-R3CZQLXF.mjs';
4
+ import { resolveFlexibleBalanceInitialPaymentCents, resolveFlexibleBalanceDueAt, getBookingInstalmentDepositRefundability, splitAmountWithRemainderInFirst, addIntervalPreservingMonthAnchor, clampConfiguredAmount, getBookingInstalmentPlanIntervalCount, omitZeroAmountFutureRows } from './chunk-GH6IIOOE.mjs';
5
5
  import { useReducer, useRef, useCallback, useEffect } from 'react';
6
6
 
7
7
  // ../blocks/src/system/runtime/shared/bookingPaymentOptionCopy.ts
@@ -1,4 +1,4 @@
1
- import { clsx_default } from './chunk-RWYFG625.mjs';
1
+ import { clsx_default } from './chunk-GH6IIOOE.mjs';
2
2
  import { jsxs, jsx } from 'react/jsx-runtime';
3
3
 
4
4
  function resolveColorStyle(color) {