@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,5 +1,5 @@
1
- import { defineIslandPropsDecoder } from './chunk-MLBNVN4H.mjs';
2
- import './chunk-RWYFG625.mjs';
1
+ import { defineIslandPropsDecoder } from './chunk-R3CZQLXF.mjs';
2
+ import './chunk-GH6IIOOE.mjs';
3
3
 
4
4
  // src/rendering/islands/enhancers/accordion.ts
5
5
  var decode = defineIslandPropsDecoder("accordion");
@@ -1,15 +1,15 @@
1
1
  "use client";
2
- import { buildBookingPaymentSelectionViewModel, usePolling } from './chunk-E6VIWZUG.mjs';
3
- import { SpinnerNode } from './chunk-ISAUXU5R.mjs';
2
+ import { buildBookingPaymentSelectionViewModel, usePolling } from './chunk-N2WJPTF7.mjs';
3
+ import { SpinnerNode } from './chunk-QQNVQ62W.mjs';
4
4
  import { buildRouteIslandApiConfig } from './chunk-L4J5Y62O.mjs';
5
- import { scrollToBlock, useDiscountCodeUi, buildCheckoutReturnUrls, DiscountCodeDisclosure } from './chunk-CKXEUWWA.mjs';
5
+ import { scrollToBlock, useDiscountCodeUi, buildCheckoutReturnUrls, DiscountCodeDisclosure } from './chunk-ZJDBOLX7.mjs';
6
6
  import { FieldValidationMessage, getFieldValidationControlProps } from './chunk-3DCJ45Z2.mjs';
7
7
  import './chunk-WBQG7VJA.mjs';
8
8
  import { isSpamProtectionEnabled, getChallengeUrl, AltchaWidget } from './chunk-LJCX6V7Q.mjs';
9
- import { BlockApiProvider, useBlockApi, FeedbackMessage } from './chunk-WHZQDPBZ.mjs';
9
+ import { BlockApiProvider, useBlockApi, FeedbackMessage } from './chunk-TNGL2WJF.mjs';
10
10
  import { mountReactIsland } from './chunk-N7PBWBWQ.mjs';
11
- import { defineIslandPropsDecoder, resolveBookingSiteId, resolveDefaultBookingServiceId, getBookingRedirectStateFromLocation, deriveBookingFormViewState, logger, getBookingSuccessMessage, resolveAppointmentCheckoutVerificationState, themeButtonClassName, toSelectedCollectionOptionKind, assertNever, prepareBookingSubmission, formatBookingSubmissionPreparationError, resolveBookingPaymentStep, BOOKING_FORM_DATA_RESERVED_KEYS, clearWorkflowFeedback, reportWorkflowError, reportWorkflowSuccess, okWith, err } from './chunk-MLBNVN4H.mjs';
12
- import { resolveBookingTimeZoneId, DEFAULT_BOOKING_TIME_ZONE, unsafeAsFormId, unsafeAsAppointmentResourceId, unsafeAsCustomerPassId, unsafeAsAppointmentServiceId, formatLocalScheduleDate, addLocalScheduleDays, parseBookingLocalDate, unsafeAsPassId, formatBookingInstant } from './chunk-RWYFG625.mjs';
11
+ import { defineIslandPropsDecoder, resolveBookingSiteId, resolveDefaultBookingServiceId, getBookingRedirectStateFromLocation, deriveBookingFormViewState, logger, getBookingSuccessMessage, getBookingServiceSlidingScale, formatBookingCentsAsCurrencyInput, parseBookingCurrencyInputToCents, resolveAppointmentCheckoutVerificationState, themeButtonClassName, toSelectedCollectionOptionKind, assertNever, prepareBookingSubmission, formatBookingSubmissionPreparationError, resolveBookingPaymentStep, BOOKING_FORM_DATA_RESERVED_KEYS, isBookingServiceSlidingAmountInRange, clearWorkflowFeedback, reportWorkflowError, reportWorkflowSuccess, okWith, err } from './chunk-R3CZQLXF.mjs';
12
+ import { resolveBookingTimeZoneId, DEFAULT_BOOKING_TIME_ZONE, unsafeAsFormId, unsafeAsAppointmentResourceId, unsafeAsCustomerPassId, unsafeAsAppointmentServiceId, formatLocalScheduleDate, addLocalScheduleDays, parseBookingLocalDate, unsafeAsPassId, formatCurrencyAmount, formatBookingInstant } from './chunk-GH6IIOOE.mjs';
13
13
  import React2, { useRef, useState, useMemo, useReducer, useEffect, useCallback, useLayoutEffect } from 'react';
14
14
  import { jsx, jsxs, Fragment } from 'react/jsx-runtime';
15
15
 
@@ -514,6 +514,7 @@ function useBookingSubmission(_siteId) {
514
514
  customFields: data.customFields,
515
515
  timezone: data.timezone,
516
516
  discountCode: data.discountCode,
517
+ selectedSlidingAmount: data.selectedSlidingAmount,
517
518
  selectedCollectionOptionKind: data.selectedCollectionOptionKind,
518
519
  altchaSolution: data.altchaSolution ?? null,
519
520
  successUrl: data.successUrl,
@@ -583,6 +584,9 @@ function createInitialBookingFlowReducerState(input) {
583
584
  fieldValues: collectInitialFieldValues(initialData),
584
585
  touchedFields: {},
585
586
  discountCode: toOptionalString(initialData.discountCode) ?? "",
587
+ selectedSlidingAmountInput: toOptionalString(
588
+ initialData.selectedSlidingAmountInput
589
+ ) ?? "",
586
590
  selectedCollectionOptionKind: toSelectedCollectionOptionKind(
587
591
  initialData.selectedCollectionOptionKind
588
592
  ),
@@ -635,6 +639,7 @@ function bookingFlowReducer(state, event) {
635
639
  selectedDate: void 0,
636
640
  selectedSlot: null,
637
641
  selectedAppointmentPackageId: void 0,
642
+ selectedSlidingAmountInput: "",
638
643
  selectedCollectionOptionKind: void 0,
639
644
  validationErrors: clearBookingFormError(state.validationErrors)
640
645
  };
@@ -688,6 +693,13 @@ function bookingFlowReducer(state, event) {
688
693
  selectedAppointmentPackageId: void 0,
689
694
  validationErrors: clearBookingFormError(state.validationErrors)
690
695
  };
696
+ case "sliding-amount-changed":
697
+ return {
698
+ ...state,
699
+ selectedSlidingAmountInput: event.value,
700
+ selectedAppointmentPackageId: void 0,
701
+ validationErrors: clearBookingFormError(state.validationErrors)
702
+ };
691
703
  case "appointment-package-selected":
692
704
  return {
693
705
  ...state,
@@ -790,6 +802,7 @@ function toBookingFormData(state) {
790
802
  selectedDate: state.selectedDate,
791
803
  selectedSlot: state.selectedSlot?.startAt,
792
804
  discountCode: state.discountCode || void 0,
805
+ selectedSlidingAmountInput: state.selectedSlidingAmountInput || void 0,
793
806
  selectedCollectionOptionKind: state.selectedCollectionOptionKind,
794
807
  selectedAppointmentPackageId: state.selectedAppointmentPackageId
795
808
  };
@@ -807,7 +820,8 @@ function buildBookingStepResolution(input) {
807
820
  input.form.settings?.serviceIds && input.form.settings.serviceIds.length > 1
808
821
  );
809
822
  const selectedService = paymentResolution.service;
810
- const needsPayment = paymentResolution.mode !== "hidden" || Boolean(
823
+ const selectedServiceSlidingScale = getBookingServiceSlidingScale(selectedService);
824
+ const needsPayment = Boolean(selectedServiceSlidingScale) || paymentResolution.mode !== "hidden" || Boolean(
811
825
  input.enableAppointmentPackages && selectedService && (selectedService.priceAmount ?? 0) > 0
812
826
  );
813
827
  const hasFields = Boolean(input.form.schema?.fields.length);
@@ -851,6 +865,18 @@ function validateBookingStep(input) {
851
865
  services: input.services,
852
866
  defaultServiceId: input.defaultServiceId
853
867
  });
868
+ const slidingScale = getBookingServiceSlidingScale(resolution.service);
869
+ if (slidingScale && !isBookingServiceSlidingAmountInRange(
870
+ slidingScale,
871
+ parseBookingCurrencyInputToCents(input.data.selectedSlidingAmountInput)
872
+ )) {
873
+ return {
874
+ ok: false,
875
+ errors: createFormBookingValidationError(
876
+ "Please choose an amount within the sliding scale"
877
+ )
878
+ };
879
+ }
854
880
  if (resolution.mode === "hidden" || resolution.mode === "disclosure_only") {
855
881
  return { ok: true };
856
882
  }
@@ -1260,11 +1286,27 @@ function useHeadlessBookingFlow(options) {
1260
1286
  const selectedServiceId = state.selectedServiceId ?? defaultServiceId;
1261
1287
  const selectedResourceId = state.selectedResourceId ?? defaultResourceId;
1262
1288
  const selectedService = options.services.find((service) => service.id === selectedServiceId) ?? null;
1289
+ const lastSlidingServiceIdRef = useRef(null);
1290
+ useEffect(() => {
1291
+ const selectedId = selectedService?.id ?? null;
1292
+ if (lastSlidingServiceIdRef.current === selectedId) return;
1293
+ lastSlidingServiceIdRef.current = selectedId;
1294
+ const slidingScale = getBookingServiceSlidingScale(selectedService);
1295
+ dispatch({
1296
+ type: "sliding-amount-changed",
1297
+ value: slidingScale?.suggestedAmount !== null && slidingScale?.suggestedAmount !== void 0 ? formatBookingCentsAsCurrencyInput(slidingScale.suggestedAmount) : ""
1298
+ });
1299
+ }, [selectedService]);
1263
1300
  const hasPortalBearerAuth = (api.config.authOverrides?.portal ?? api.config.auth).type === "bearer";
1301
+ const selectedServiceSlidingScale = getBookingServiceSlidingScale(selectedService);
1302
+ const selectedSlidingAmount = parseBookingCurrencyInputToCents(
1303
+ state.selectedSlidingAmountInput
1304
+ );
1305
+ const selectedAppointmentPriceAmount = selectedServiceSlidingScale && selectedSlidingAmount !== null ? selectedSlidingAmount : selectedService?.priceAmount ?? 0;
1264
1306
  const canLoadAppointmentPackages = Boolean(
1265
- options.enableAppointmentPackages && hasPortalBearerAuth && selectedService && (selectedService.priceAmount ?? 0) > 0
1307
+ options.enableAppointmentPackages && hasPortalBearerAuth && selectedService && !selectedServiceSlidingScale && (selectedService.priceAmount ?? 0) > 0
1266
1308
  );
1267
- const appointmentPackagesUnavailableReason = !options.enableAppointmentPackages ? "disabled" : !selectedService || (selectedService.priceAmount ?? 0) <= 0 ? "missing-priced-service" : !hasPortalBearerAuth ? "missing-portal-auth" : null;
1309
+ const appointmentPackagesUnavailableReason = !options.enableAppointmentPackages ? "disabled" : !selectedService || selectedServiceSlidingScale || (selectedService.priceAmount ?? 0) <= 0 ? "missing-priced-service" : !hasPortalBearerAuth ? "missing-portal-auth" : null;
1268
1310
  const data = useMemo(() => toBookingFormData(state), [state]);
1269
1311
  const availabilityDatesQuery = useMemo(
1270
1312
  () => buildBookingAvailabilityQuery({
@@ -1494,13 +1536,13 @@ function useHeadlessBookingFlow(options) {
1494
1536
  state.selectedSlot
1495
1537
  ]);
1496
1538
  const appointmentDiscountContext = useMemo(
1497
- () => selectedService && (selectedService.priceAmount ?? 0) > 0 ? { type: "appointment", serviceId: selectedService.id } : null,
1498
- [selectedService?.id, selectedService?.priceAmount]
1539
+ () => selectedService && selectedAppointmentPriceAmount > 0 ? { type: "appointment", serviceId: selectedService.id } : null,
1540
+ [selectedAppointmentPriceAmount, selectedService?.id]
1499
1541
  );
1500
1542
  const discountUi = useDiscountCodeUi({
1501
1543
  api,
1502
1544
  discountContext: appointmentDiscountContext,
1503
- subtotalCents: selectedService?.priceAmount ?? 0
1545
+ subtotalCents: selectedAppointmentPriceAmount
1504
1546
  });
1505
1547
  const { submit, clearFeedback } = useBookingSubmission(options.siteId);
1506
1548
  const submittingRef = useRef(false);
@@ -1643,6 +1685,7 @@ function useHeadlessBookingFlow(options) {
1643
1685
  type: "appointment-package-selected",
1644
1686
  packageId: packageId ? unsafeAsCustomerPassId(packageId) : null
1645
1687
  }),
1688
+ setSlidingAmountInput: (value) => dispatch({ type: "sliding-amount-changed", value }),
1646
1689
  setDiscountCode: (code) => {
1647
1690
  dispatch({ type: "discount-code-changed", code });
1648
1691
  latestRef.current.setDiscountCode(code);
@@ -1713,11 +1756,11 @@ function useHeadlessBookingFlow(options) {
1713
1756
  () => selectedService && paymentResolution.mode !== "unsupported" ? buildBookingPaymentSelectionViewModel({
1714
1757
  serviceTitle: selectedService.title,
1715
1758
  paymentTerms: selectedService.paymentTerms,
1716
- priceAmount: selectedService.priceAmount,
1759
+ priceAmount: selectedAppointmentPriceAmount,
1717
1760
  priceCurrency: selectedService.priceCurrency,
1718
1761
  bookingStartAt: state.selectedSlot?.startAt
1719
1762
  }) : null,
1720
- [paymentResolution.mode, selectedService, state.selectedSlot?.startAt]
1763
+ [paymentResolution.mode, selectedAppointmentPriceAmount, selectedService, state.selectedSlot?.startAt]
1721
1764
  );
1722
1765
  const appointmentPackageItems = appointmentPackages.tag === "loaded" ? appointmentPackages.value : [];
1723
1766
  const selectedAppointmentPackage = appointmentPackageItems.find(
@@ -1746,6 +1789,9 @@ function useHeadlessBookingFlow(options) {
1746
1789
  selection: null,
1747
1790
  selectedCollectionOptionKind: state.selectedCollectionOptionKind,
1748
1791
  selectedAppointmentPackageId: state.selectedAppointmentPackageId,
1792
+ selectedSlidingAmountInput: state.selectedSlidingAmountInput,
1793
+ selectedSlidingAmount,
1794
+ slidingScale: selectedServiceSlidingScale,
1749
1795
  appointmentPackages: appointmentPackagesModel,
1750
1796
  errorMessage: paymentResolution.errorMessage ?? "This service cannot be booked right now."
1751
1797
  } : {
@@ -1754,6 +1800,9 @@ function useHeadlessBookingFlow(options) {
1754
1800
  selection: paymentSelection,
1755
1801
  selectedCollectionOptionKind: state.selectedCollectionOptionKind,
1756
1802
  selectedAppointmentPackageId: state.selectedAppointmentPackageId,
1803
+ selectedSlidingAmountInput: state.selectedSlidingAmountInput,
1804
+ selectedSlidingAmount,
1805
+ slidingScale: selectedServiceSlidingScale,
1757
1806
  appointmentPackages: appointmentPackagesModel
1758
1807
  };
1759
1808
  return {
@@ -1959,6 +2008,9 @@ var paymentOptionLayoutStyle = {
1959
2008
  var summaryStackStyle = {
1960
2009
  gap: "0.125rem"
1961
2010
  };
2011
+ function formatBookingAmount(amount, currency) {
2012
+ return formatCurrencyAmount(amount, currency, { decimals: "auto" });
2013
+ }
1962
2014
  function HeadlessBookingDefaultForm({
1963
2015
  booking,
1964
2016
  onSubmit
@@ -2235,6 +2287,7 @@ function HeadlessBookingPaymentSelectionStep({
2235
2287
  }
2236
2288
  const packageOptions = booking.payment.appointmentPackages.items;
2237
2289
  const hasPackageOptions = packageOptions.length > 0;
2290
+ const slidingScale = booking.payment.slidingScale;
2238
2291
  return /* @__PURE__ */ jsxs("div", { className: "ab-stack", children: [
2239
2292
  /* @__PURE__ */ jsxs("div", { className: "ab-info-box", children: [
2240
2293
  /* @__PURE__ */ jsx("h3", { className: "ab-subtitle", children: viewModel.sectionTitle }),
@@ -2245,6 +2298,28 @@ function HeadlessBookingPaymentSelectionStep({
2245
2298
  booking.payment.appointmentPackages.state.message,
2246
2299
  " You can continue with the normal payment option."
2247
2300
  ] }) : null,
2301
+ slidingScale ? /* @__PURE__ */ jsxs("div", { className: "rb-space-y-2", children: [
2302
+ /* @__PURE__ */ jsx("label", { htmlFor: "appointment-sliding-amount", className: "form-label", children: "Choose your price" }),
2303
+ /* @__PURE__ */ jsxs("p", { className: "rb-caption status-muted", children: [
2304
+ formatBookingAmount(slidingScale.minAmount, slidingScale.currency),
2305
+ " to ",
2306
+ formatBookingAmount(slidingScale.maxAmount, slidingScale.currency),
2307
+ slidingScale.suggestedAmount !== null ? `, suggested ${formatBookingAmount(slidingScale.suggestedAmount, slidingScale.currency)}` : ""
2308
+ ] }),
2309
+ /* @__PURE__ */ jsx(
2310
+ "input",
2311
+ {
2312
+ id: "appointment-sliding-amount",
2313
+ type: "number",
2314
+ className: "form-input",
2315
+ min: slidingScale.minAmount / 100,
2316
+ max: slidingScale.maxAmount / 100,
2317
+ step: "0.01",
2318
+ value: booking.payment.selectedSlidingAmountInput,
2319
+ onChange: (event) => booking.actions.setSlidingAmountInput(event.target.value)
2320
+ }
2321
+ )
2322
+ ] }) : null,
2248
2323
  /* @__PURE__ */ jsxs("div", { className: "ab-stack", role: "list", "aria-label": "Payment options", children: [
2249
2324
  packageOptions.map((appointmentPackage) => {
2250
2325
  const isSelected = booking.payment.selectedAppointmentPackageId === appointmentPackage.customerPassId;