@riverbankcms/sdk 0.85.0 → 0.88.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 (135) hide show
  1. package/dist/{PreviewEditorSidebar-4PH35ZIE.mjs → PreviewEditorSidebar-EVRS3C7T.mjs} +3 -3
  2. package/dist/{PreviewEditorUI-WHMCRJGM.mjs → PreviewEditorUI-54WD4IGE.mjs} +3 -3
  3. package/dist/SdkPreviewModeRuntime-ZALZDJEK.mjs +8 -0
  4. package/dist/_dts/api/src/endpoints.d.ts +58 -14
  5. package/dist/_dts/api/src/index.d.ts +3 -0
  6. package/dist/_dts/api/src/launchReadiness.d.ts +3 -3
  7. package/dist/_dts/api/src/mailchimpIntegration.d.ts +215 -0
  8. package/dist/_dts/api/src/publicExperienceEndpoints.d.ts +35 -15
  9. package/dist/_dts/api/src/siteInfrastructure.d.ts +0 -14
  10. package/dist/_dts/api/src/siteRuntimeEndpoints.d.ts +1 -13
  11. package/dist/_dts/api/src/types.d.ts +6 -3
  12. package/dist/_dts/blocks/src/PageRenderer.d.ts +1 -0
  13. package/dist/_dts/blocks/src/contracts/proof-block-islands.d.ts +4 -0
  14. package/dist/_dts/blocks/src/index.d.ts +2 -1
  15. package/dist/_dts/blocks/src/system/blocks/appointment-booking.d.ts +288 -288
  16. package/dist/_dts/blocks/src/system/blocks/blog-listing.d.ts +288 -288
  17. package/dist/_dts/blocks/src/system/blocks/cart.d.ts +288 -288
  18. package/dist/_dts/blocks/src/system/blocks/checkout.d.ts +288 -288
  19. package/dist/_dts/blocks/src/system/blocks/collection.d.ts +288 -288
  20. package/dist/_dts/blocks/src/system/blocks/events/shared/schemas.d.ts +42 -0
  21. package/dist/_dts/blocks/src/system/blocks/events/shared/types.d.ts +4 -0
  22. package/dist/_dts/blocks/src/system/blocks/faq.d.ts +288 -288
  23. package/dist/_dts/blocks/src/system/blocks/gifting.d.ts +288 -288
  24. package/dist/_dts/blocks/src/system/blocks/location-map.d.ts +1 -1
  25. package/dist/_dts/blocks/src/system/blocks/media-text.d.ts +42 -42
  26. package/dist/_dts/blocks/src/system/blocks/newsletter-signup-destination.d.ts +300 -0
  27. package/dist/_dts/blocks/src/system/blocks/newsletter-signup.d.ts +63 -3
  28. package/dist/_dts/blocks/src/system/blocks/product-detail.d.ts +288 -288
  29. package/dist/_dts/blocks/src/system/blocks/product-list.d.ts +288 -288
  30. package/dist/_dts/blocks/src/system/blocks/shop.d.ts +288 -288
  31. package/dist/_dts/blocks/src/system/fragments/library/newsletterForm.d.ts +53 -1
  32. package/dist/_dts/blocks/src/system/manifest/richTextSchema.d.ts +27 -0
  33. package/dist/_dts/blocks/src/system/manifest/schema.d.ts +23 -23
  34. package/dist/_dts/blocks/src/system/runtime/api/types.d.ts +10 -2
  35. package/dist/_dts/blocks/src/system/runtime/components/registry.client.d.ts +24 -0
  36. package/dist/_dts/blocks/src/system/runtime/components/runtime-backed-blocks.d.ts +12 -0
  37. package/dist/_dts/blocks/src/system/runtime/nodes/event-registration/types.d.ts +1 -0
  38. package/dist/_dts/blocks/src/system/runtime/nodes/event-registration.interactive.d.ts +4 -0
  39. package/dist/_dts/blocks/src/system/runtime/nodes/event-registration.server.d.ts +1 -1
  40. package/dist/_dts/blocks/src/system/runtime/nodes/events/shared/utils.d.ts +11 -1
  41. package/dist/_dts/blocks/src/system/runtime/nodes/newsletter-form.interactive.d.ts +15 -0
  42. package/dist/_dts/blocks/src/system/runtime/nodes/newsletter-form.server.d.ts +1 -1
  43. package/dist/_dts/blocks/src/system/runtime/nodes/newsletter-form.submission.d.ts +32 -0
  44. package/dist/_dts/blocks/src/system/runtime/nodes/newsletter-form.types.d.ts +5 -1
  45. package/dist/_dts/blocks/src/system/runtime/shared/components/ModalShell.d.ts +5 -1
  46. package/dist/_dts/blocks/src/system/runtime/shared/utils/formatting.d.ts +1 -1
  47. package/dist/_dts/content-model/src/referenceFields.d.ts +1 -1
  48. package/dist/_dts/core/src/currency-format.d.ts +37 -2
  49. package/dist/_dts/core/src/event-pricing.d.ts +24 -0
  50. package/dist/_dts/db/src/generated/supabase/database.types.d.ts +549 -18
  51. package/dist/_dts/editor-blocks/src/widgets/reference/loaders.d.ts +3 -1
  52. package/dist/_dts/sdk/src/client/types.d.ts +9 -0
  53. package/dist/_dts/sdk/src/config/validation.d.ts +3 -0
  54. package/dist/_dts/sdk/src/contracts/system-block-content.d.ts +3 -0
  55. package/dist/_dts/sdk/src/data/prefetchBlockData.d.ts +3 -9
  56. package/dist/_dts/sdk/src/manifest/passes/pass1-fields.d.ts +1 -1
  57. package/dist/_dts/sdk/src/manifest/three-pass-converter.d.ts +7 -18
  58. package/dist/_dts/sdk/src/rendering/blocks-page-renderer.d.ts +2 -0
  59. package/dist/_dts/sdk/src/rendering/components/pageShared.d.ts +3 -1
  60. package/dist/_dts/sdk/src/rendering/helpers/loadContent.d.ts +7 -3
  61. package/dist/_dts/sdk/src/rendering/helpers/loadPage.d.ts +4 -24
  62. package/dist/_dts/sdk/src/rendering/helpers/pageRuntimeSupport.d.ts +45 -0
  63. package/dist/_dts/sdk/src/version.d.ts +1 -1
  64. package/dist/_dts/theme-core/src/generated/containerResponsiveThemeCss.d.ts +1 -1
  65. package/dist/_dts/theme-core/src/mock-themes/all.d.ts +9 -9
  66. package/dist/_dts/theme-core/src/schema.d.ts +11 -11
  67. package/dist/{chunk-ZR2GQK2A.mjs → chunk-7KOO7RPP.mjs} +953 -315
  68. package/dist/{chunk-OCGTXHSO.mjs → chunk-ER4UIW4X.mjs} +7 -7
  69. package/dist/{chunk-WFPYN7KA.mjs → chunk-HVOBXA3Y.mjs} +2 -2
  70. package/dist/{chunk-NFWGLRZZ.mjs → chunk-K3JWH6HE.mjs} +37 -3
  71. package/dist/{chunk-4QNLOTES.mjs → chunk-O4LVYUVH.mjs} +58 -14
  72. package/dist/{chunk-PYDHOMEO.mjs → chunk-YDMBIIS5.mjs} +1 -1
  73. package/dist/cli/index.mjs +408 -109
  74. package/dist/client/{accordion-2UZPBMYM.mjs → accordion-PT5CGW5N.mjs} +2 -2
  75. package/dist/client/{bookingForm-36CWQUMV.mjs → bookingForm-2HLRTEYS.mjs} +7 -7
  76. package/dist/client/bookings.mjs +51 -6
  77. package/dist/client/{carousel-QH77HR6X.mjs → carousel-Z2LKYSWA.mjs} +3 -3
  78. package/dist/client/cart-ND5IK4A6.mjs +18 -0
  79. package/dist/client/checkout-EYUSGAY7.mjs +18 -0
  80. package/dist/client/{chunk-SYIJ5JO2.mjs → chunk-6DVPO44G.mjs} +1 -1
  81. package/dist/client/{chunk-3C2VTPWI.mjs → chunk-BAWHZ5GM.mjs} +176 -13
  82. package/dist/client/{chunk-52CGCQ7B.mjs → chunk-BL66UWGD.mjs} +10 -80
  83. package/dist/client/{chunk-VGDBVNOO.mjs → chunk-DIRW2LNG.mjs} +241 -210
  84. package/dist/client/{chunk-UDNSI5PY.mjs → chunk-GOFO7HRH.mjs} +1 -2
  85. package/dist/client/{chunk-ZKUO52W3.mjs → chunk-H4MHEXYS.mjs} +1 -1
  86. package/dist/client/{chunk-ZE5G642V.mjs → chunk-LI2C6M5O.mjs} +75 -1
  87. package/dist/client/{chunk-3DTWLTXM.mjs → chunk-MHBEWDT7.mjs} +117 -3
  88. package/dist/client/{chunk-4OXKTA3D.mjs → chunk-O5JNI3E4.mjs} +2 -2
  89. package/dist/client/{chunk-XSV6KW4D.mjs → chunk-S4G65LGR.mjs} +1 -1
  90. package/dist/client/{chunk-DVNUDUVT.mjs → chunk-WBQG7VJA.mjs} +4 -1
  91. package/dist/client/{chunk-F5VRX5Y6.mjs → chunk-WCVK4MBJ.mjs} +1 -1
  92. package/dist/client/{chunk-7UCLJ5SP.mjs → chunk-X7GVFB7Y.mjs} +4 -7
  93. package/dist/client/client.mjs +2125 -1403
  94. package/dist/client/{courseRegistration-TMKU6ABO.mjs → courseRegistration-H3AZBUEG.mjs} +7 -7
  95. package/dist/client/{eventCalendar-G6TI32X6.mjs → eventCalendar-FPKJGLGS.mjs} +10 -11
  96. package/dist/client/{eventCombined-SCKEMNAR.mjs → eventCombined-QCGIZBUY.mjs} +10 -11
  97. package/dist/client/{eventDetails-XPIFXXPK.mjs → eventDetails-HIT3BJWU.mjs} +10 -11
  98. package/dist/client/{eventListing-7QFMEMGT.mjs → eventListing-R4HNWJDN.mjs} +10 -11
  99. package/dist/client/{eventRegistration-TOODSZUI.mjs → eventRegistration-Q7BYY5HF.mjs} +10 -11
  100. package/dist/client/{form-MTCMVCZT.mjs → form-NI6YOG6S.mjs} +3 -3
  101. package/dist/client/{headerSection-Y5TMR3TW.mjs → headerSection-SDYGII36.mjs} +4 -4
  102. package/dist/client/hooks.mjs +1682 -1412
  103. package/dist/client/{locationMap-RH2LG7FZ.mjs → locationMap-BDETEUQD.mjs} +3 -4
  104. package/dist/client/{newsletterForm-PCAIPFMA.mjs → newsletterForm-EKYIU67X.mjs} +70 -22
  105. package/dist/client/{productDetail-OIGDR4YE.mjs → productDetail-5UTGNN76.mjs} +8 -9
  106. package/dist/client/{productList-4MA5S2CX.mjs → productList-7YA5KXZQ.mjs} +8 -9
  107. package/dist/client/rendering/client.mjs +753 -329
  108. package/dist/client/rendering/islands.mjs +19 -19
  109. package/dist/client/rendering.mjs +3786 -3034
  110. package/dist/client/shop-AIMUMZYC.mjs +20 -0
  111. package/dist/preview-next/before-render.mjs +58 -14
  112. package/dist/preview-next/client/runtime.mjs +5 -5
  113. package/dist/preview-next/editor-chrome.css +56 -9
  114. package/dist/preview-next/middleware.mjs +58 -14
  115. package/dist/{sdk-runtime-QLOCYKVU.mjs → sdk-runtime-NW472WNT.mjs} +6 -6
  116. package/dist/server/components.mjs +1518 -1015
  117. package/dist/server/config-validation.mjs +1719 -1461
  118. package/dist/server/config.mjs +1719 -1461
  119. package/dist/server/data.mjs +1683 -1413
  120. package/dist/server/index.mjs +79 -17
  121. package/dist/server/next.mjs +1902 -1311
  122. package/dist/server/page-converter.mjs +2193 -1169
  123. package/dist/server/prebuild.mjs +1 -1
  124. package/dist/server/rendering/server.mjs +1709 -1209
  125. package/dist/server/rendering.mjs +1894 -1347
  126. package/dist/server/routing.mjs +1872 -1499
  127. package/dist/server/server.mjs +1571 -1264
  128. package/dist/server/theme-bridge.mjs +234 -0
  129. package/dist/styles/index.css +232 -0
  130. package/package.json +1 -1
  131. package/dist/SdkPreviewModeRuntime-4FGSVUYI.mjs +0 -8
  132. package/dist/client/cart-X4YK4FTW.mjs +0 -19
  133. package/dist/client/checkout-OM2BEPWD.mjs +0 -19
  134. package/dist/client/chunk-I2MMZO53.mjs +0 -6
  135. package/dist/client/shop-WXSYV5QO.mjs +0 -21
@@ -915,9 +915,8 @@ function createBlockApi(config) {
915
915
  name: data.name,
916
916
  company: data.company,
917
917
  phone: data.phone,
918
- listId: data.listId,
918
+ target: data.target,
919
919
  tags: data.tags,
920
- blockId: data.blockId,
921
920
  meta: data.meta
922
921
  }
923
922
  });
@@ -1,5 +1,5 @@
1
1
  "use client";
2
- import { assertNever11 } from './chunk-VGDBVNOO.mjs';
2
+ import { assertNever11 } from './chunk-DIRW2LNG.mjs';
3
3
  import { useReducer, useRef, useCallback, useEffect } from 'react';
4
4
 
5
5
  // ../blocks/src/system/runtime/hooks/usePolling.state.ts
@@ -38,6 +38,43 @@ function subtractDaysFromIso(isoString, dayCount) {
38
38
  return addDaysToIso(isoString, -dayCount);
39
39
  }
40
40
 
41
+ // ../core/src/currency-format.ts
42
+ var CURRENCY_LOCALE_BY_CODE = {
43
+ USD: "en-US",
44
+ GBP: "en-GB",
45
+ EUR: "de-DE",
46
+ AUD: "en-AU",
47
+ CAD: "en-CA",
48
+ NZD: "en-NZ",
49
+ JPY: "ja-JP",
50
+ CNY: "zh-CN",
51
+ CHF: "de-CH"
52
+ };
53
+ function resolveCurrencyLocale(currencyCode, override) {
54
+ return override ?? CURRENCY_LOCALE_BY_CODE[currencyCode] ?? "en";
55
+ }
56
+ function formatCurrencyAmount(amountCents, currency, options) {
57
+ const currencyCode = currency.toUpperCase();
58
+ const locale = resolveCurrencyLocale(currencyCode, options?.locale);
59
+ try {
60
+ const exactFormatter = new Intl.NumberFormat(locale, {
61
+ style: "currency",
62
+ currency: currencyCode
63
+ });
64
+ const fractionDigits = options?.decimals === "auto" ? {
65
+ minimumFractionDigits: 0,
66
+ maximumFractionDigits: exactFormatter.resolvedOptions().maximumFractionDigits
67
+ } : {};
68
+ return new Intl.NumberFormat(locale, {
69
+ style: "currency",
70
+ currency: currencyCode,
71
+ ...fractionDigits
72
+ }).format(amountCents / 100);
73
+ } catch {
74
+ return `${(amountCents / 100).toFixed(2)} ${currencyCode}`;
75
+ }
76
+ }
77
+
41
78
  // ../core/src/event-pricing.ts
42
79
  function publicEventPricingDisplay(pricing) {
43
80
  return pricing.display;
@@ -90,11 +127,48 @@ function isFreePublicEventPriceDisplay(display) {
90
127
  return display.display.kind === "free";
91
128
  case "exact":
92
129
  case "from":
130
+ case "range":
93
131
  case "mixed":
94
132
  case "unavailable":
95
133
  return false;
96
134
  }
97
135
  }
136
+ function formatCoursePriceDisplayLabel(display, options) {
137
+ switch (display.kind) {
138
+ case "free":
139
+ case "unavailable":
140
+ return "Course";
141
+ case "exact":
142
+ return `Course (${formatCurrencyAmount(display.amount, display.currency, options)})`;
143
+ case "from":
144
+ return `Course (From ${formatCurrencyAmount(display.amount, display.currency, options)})`;
145
+ default:
146
+ return assertNever(display);
147
+ }
148
+ }
149
+ function formatBookingPriceDisplay(display, options = {}) {
150
+ switch (display.kind) {
151
+ case "free":
152
+ return "Free";
153
+ case "exact":
154
+ return formatCurrencyAmount(display.amount, display.currency, options);
155
+ case "from":
156
+ return `From ${formatCurrencyAmount(display.amount, display.currency, options)}`;
157
+ case "range":
158
+ return `${formatCurrencyAmount(display.minAmount, display.currency, options)} - ${formatCurrencyAmount(display.maxAmount, display.currency, options)}`;
159
+ case "mixed":
160
+ return display.paidToAmount > display.paidFromAmount ? `Free / ${formatCurrencyAmount(display.paidFromAmount, display.currency, options)} - ${formatCurrencyAmount(display.paidToAmount, display.currency, options)}` : `Free / ${formatCurrencyAmount(display.paidFromAmount, display.currency, options)}`;
161
+ case "unavailable":
162
+ return "Pricing unavailable";
163
+ case "course":
164
+ return formatCoursePriceDisplayLabel(display.display, options);
165
+ default:
166
+ return assertNever(display);
167
+ }
168
+ }
169
+ function formatEventPricing(pricing, options = {}) {
170
+ return formatBookingPriceDisplay(publicEventPricingDisplay(pricing), options);
171
+ }
98
172
 
99
173
  // ../core/src/booking-flexible-balance.ts
100
174
  function clampFlexibleBalanceConfiguredAmount(amountCents, totalAmountCents) {
@@ -2104,4 +2178,4 @@ function scaleCssLengthToken(token, factor) {
2104
2178
  return `${rounded}${unit}`;
2105
2179
  }
2106
2180
 
2107
- export { DEFAULT_BOOKING_TIME_ZONE, ImagePresets, MediaPlaceholder, addIntervalPreservingMonthAnchor, addLocalScheduleDays, assertNever, backgroundColorStyle, borderColorStyle, buildResolveImageUrlContext, clampConfiguredAmount, clsx_default, computeMediaTransformStyle, err, formatBookingDate, formatBookingDateParts, formatBookingDateTime, formatBookingInstant, formatBookingTime, formatLocalScheduleDate, getBookingInstalmentDepositRefundability, getBookingInstalmentPlanIntervalCount, getBookingLocalDateKey, getCurrentResolveImageUrlContext, mergeStyles, normalizeLocationAddressText, ok, omitZeroAmountFutureRows, parseAspectRatioValue, parseBookingLocalDate, parseColorTokenParts, publicEventPricingCurrency, publicEventPricingDisplay, publicEventPricingMode, publicEventPricingType, publicEventScalarPrice, publicEventTicketTypes, renderAudio, renderVideo, resolveBookingTimeZoneId, resolveFlexibleBalanceDueAt, resolveFlexibleBalanceInitialPaymentCents, resolveImageUrlWithContext, resolveMediaNodeResponsiveImage, resolvePlanningDateInput, rgbColorValue, setContextResolveImageUrlContext, splitAmountWithRemainderInFirst, textColorStyle, toBookingTimeZone, toLocationCoordinates, toScheduledBookingDateRange, toScheduledBookingDateTime, unsafeAsAppointmentResourceId, unsafeAsAppointmentServiceId, unsafeAsCustomerPassId, unsafeAsFormId, unsafeAsMediaAssetId, unsafeAsPassId };
2181
+ export { DEFAULT_BOOKING_TIME_ZONE, ImagePresets, MediaPlaceholder, addIntervalPreservingMonthAnchor, addLocalScheduleDays, assertNever, backgroundColorStyle, borderColorStyle, buildResolveImageUrlContext, clampConfiguredAmount, clsx_default, computeMediaTransformStyle, err, formatBookingDate, formatBookingDateParts, formatBookingDateTime, formatBookingInstant, formatBookingPriceDisplay, formatBookingTime, formatCurrencyAmount, formatEventPricing, formatLocalScheduleDate, getBookingInstalmentDepositRefundability, getBookingInstalmentPlanIntervalCount, getBookingLocalDateKey, getCurrentResolveImageUrlContext, mergeStyles, normalizeLocationAddressText, ok, omitZeroAmountFutureRows, parseAspectRatioValue, parseBookingLocalDate, parseColorTokenParts, publicEventPricingCurrency, publicEventPricingMode, publicEventPricingType, publicEventScalarPrice, publicEventTicketTypes, renderAudio, renderVideo, resolveBookingTimeZoneId, resolveFlexibleBalanceDueAt, resolveFlexibleBalanceInitialPaymentCents, resolveImageUrlWithContext, resolveMediaNodeResponsiveImage, resolvePlanningDateInput, rgbColorValue, setContextResolveImageUrlContext, splitAmountWithRemainderInFirst, textColorStyle, toBookingTimeZone, toLocationCoordinates, toScheduledBookingDateRange, toScheduledBookingDateTime, unsafeAsAppointmentResourceId, unsafeAsAppointmentServiceId, unsafeAsCustomerPassId, unsafeAsFormId, unsafeAsMediaAssetId, unsafeAsPassId };
@@ -1,6 +1,7 @@
1
1
  "use client";
2
- import { useBlockApi, BlockApiError } from './chunk-UDNSI5PY.mjs';
3
- import { themeButtonClassName } from './chunk-VGDBVNOO.mjs';
2
+ import { useBlockApi, BlockApiError } from './chunk-GOFO7HRH.mjs';
3
+ import { themeButtonClassName } from './chunk-DIRW2LNG.mjs';
4
+ import { resolvePlanningDateInput, formatBookingPriceDisplay } from './chunk-LI2C6M5O.mjs';
4
5
  import { useState, useSyncExternalStore, useEffect } from 'react';
5
6
  import { jsxs, jsx } from 'react/jsx-runtime';
6
7
 
@@ -87,6 +88,119 @@ function MagicLinkForm({
87
88
  )
88
89
  ] });
89
90
  }
91
+
92
+ // ../blocks/src/system/blocks/courses/shared/pricing.ts
93
+ function isSaleWindowOpen(option, now) {
94
+ if (!option.isActive) {
95
+ return false;
96
+ }
97
+ if (option.saleStartsAt && new Date(option.saleStartsAt) > now) {
98
+ return false;
99
+ }
100
+ if (option.saleEndsAt && new Date(option.saleEndsAt) < now) {
101
+ return false;
102
+ }
103
+ return true;
104
+ }
105
+ function toExactOrFreeDisplay(amount, currency) {
106
+ if (amount <= 0) {
107
+ return { kind: "free", currency };
108
+ }
109
+ return { kind: "exact", amount, currency };
110
+ }
111
+ function getSelectableCoursePricingOptionsForNow(course, now) {
112
+ if (!course.pricing || course.pricing.pricingStrategy !== "tiered") {
113
+ return [];
114
+ }
115
+ return [...course.pricing.options].filter((option) => isSaleWindowOpen(option, now)).sort((left, right) => {
116
+ if (left.sortOrder !== right.sortOrder) {
117
+ return left.sortOrder - right.sortOrder;
118
+ }
119
+ if (left.priceAmount !== right.priceAmount) {
120
+ return left.priceAmount - right.priceAmount;
121
+ }
122
+ return left.name.localeCompare(right.name);
123
+ });
124
+ }
125
+ function resolveCoursePricingState(course, selectedPricingOptionId, nowInput = {}) {
126
+ const currency = course.pricing?.currency ?? course.currency;
127
+ if (!course.pricing) {
128
+ const legacyAmount = course.priceCents ?? 0;
129
+ return {
130
+ currency,
131
+ display: toExactOrFreeDisplay(legacyAmount, currency),
132
+ selectableOptions: [],
133
+ requiresSelection: false,
134
+ selectedOption: null,
135
+ selectedPriceAmount: legacyAmount,
136
+ selectedRequiresPayment: legacyAmount > 0,
137
+ hasPaidSelection: legacyAmount > 0,
138
+ hasFreeSelection: legacyAmount <= 0
139
+ };
140
+ }
141
+ switch (course.pricing.pricingStrategy) {
142
+ case "free":
143
+ return {
144
+ currency,
145
+ display: { kind: "free", currency },
146
+ selectableOptions: [],
147
+ requiresSelection: false,
148
+ selectedOption: null,
149
+ selectedPriceAmount: 0,
150
+ selectedRequiresPayment: false,
151
+ hasPaidSelection: false,
152
+ hasFreeSelection: true
153
+ };
154
+ case "single": {
155
+ const amount = course.pricing.singlePriceAmount ?? 0;
156
+ return {
157
+ currency,
158
+ display: toExactOrFreeDisplay(amount, currency),
159
+ selectableOptions: [],
160
+ requiresSelection: false,
161
+ selectedOption: null,
162
+ selectedPriceAmount: amount,
163
+ selectedRequiresPayment: amount > 0,
164
+ hasPaidSelection: amount > 0,
165
+ hasFreeSelection: amount <= 0
166
+ };
167
+ }
168
+ case "tiered": {
169
+ const selectableOptions = getSelectableCoursePricingOptionsForNow(
170
+ course,
171
+ resolvePlanningDateInput(nowInput)
172
+ );
173
+ const selectedOption = (selectedPricingOptionId ? selectableOptions.find((option) => option.id === selectedPricingOptionId) : null) ?? (selectableOptions.length === 1 ? selectableOptions[0] ?? null : null);
174
+ const lowestAmount = selectableOptions.reduce((lowest, option) => {
175
+ if (lowest === null || option.priceAmount < lowest) {
176
+ return option.priceAmount;
177
+ }
178
+ return lowest;
179
+ }, null);
180
+ const display = lowestAmount === null ? { kind: "unavailable", currency } : selectableOptions.length > 1 && lowestAmount > 0 ? { kind: "from", amount: lowestAmount, currency } : toExactOrFreeDisplay(lowestAmount, currency);
181
+ return {
182
+ currency,
183
+ display,
184
+ selectableOptions,
185
+ requiresSelection: selectableOptions.length > 1,
186
+ selectedOption,
187
+ selectedPriceAmount: selectedOption?.priceAmount ?? null,
188
+ selectedRequiresPayment: (selectedOption?.priceAmount ?? 0) > 0,
189
+ hasPaidSelection: selectableOptions.some((option) => option.priceAmount > 0),
190
+ hasFreeSelection: selectableOptions.some((option) => option.priceAmount === 0)
191
+ };
192
+ }
193
+ }
194
+ }
195
+ function formatCoursePriceDisplay(display, locale) {
196
+ return formatBookingPriceDisplay(display, { decimals: "exact", locale });
197
+ }
198
+ function formatCoursePriceAmount(amount, currency, locale) {
199
+ return formatCoursePriceDisplay(
200
+ amount > 0 ? { kind: "exact", amount, currency } : { kind: "free", currency },
201
+ locale
202
+ );
203
+ }
90
204
  var WAITLIST_CLAIM_LOCATION_EVENT = "riverbank:waitlist-claim-location-change";
91
205
  var historyPatched = false;
92
206
  function emitWaitlistClaimLocationChange() {
@@ -201,4 +315,4 @@ function useWaitlistClaim() {
201
315
  };
202
316
  }
203
317
 
204
- export { MagicLinkForm, useWaitlistClaim };
318
+ export { MagicLinkForm, formatCoursePriceAmount, formatCoursePriceDisplay, resolveCoursePricingState, useWaitlistClaim };
@@ -1,6 +1,6 @@
1
1
  "use client";
2
- import { ChevronLeft, ChevronRight } from './chunk-VGDBVNOO.mjs';
3
- import { clsx_default } from './chunk-ZE5G642V.mjs';
2
+ import { ChevronLeft, ChevronRight } from './chunk-DIRW2LNG.mjs';
3
+ import { clsx_default } from './chunk-LI2C6M5O.mjs';
4
4
  import React, { useRef, useState, useCallback, useEffect } from 'react';
5
5
  import { jsxs, Fragment, jsx } from 'react/jsx-runtime';
6
6
 
@@ -1,5 +1,5 @@
1
1
  "use client";
2
- import { isRecord } from './chunk-I2MMZO53.mjs';
2
+ import { isRecord } from './chunk-DIRW2LNG.mjs';
3
3
  import { useRef, useState, useEffect } from 'react';
4
4
  import { jsx } from 'react/jsx-runtime';
5
5
 
@@ -32,6 +32,8 @@ function ModalShell({
32
32
  children,
33
33
  portalRoot,
34
34
  portal = false,
35
+ portalWrapperClassName,
36
+ portalWrapperProps,
35
37
  overlayClassName,
36
38
  modalClassName,
37
39
  renderSrOnlyTitle = false,
@@ -114,7 +116,8 @@ function ModalShell({
114
116
  if (!portalRoot) {
115
117
  return null;
116
118
  }
117
- return createPortal(modal, portalRoot);
119
+ const modalNode = portalWrapperClassName || portalWrapperProps ? /* @__PURE__ */ jsx("div", { ...portalWrapperProps, className: portalWrapperClassName, children: modal }) : modal;
120
+ return createPortal(modalNode, portalRoot);
118
121
  }
119
122
 
120
123
  // ../blocks/src/system/runtime/shared/utils/checkoutRoute.ts
@@ -1,4 +1,4 @@
1
- import { EMPTY_COMMERCE_CART_STATE, parseStoredCommerceCartState, reduceCommerceCart, buildPassCartItem } from './chunk-VGDBVNOO.mjs';
1
+ import { EMPTY_COMMERCE_CART_STATE, parseStoredCommerceCartState, reduceCommerceCart, buildPassCartItem } from './chunk-DIRW2LNG.mjs';
2
2
  import * as React from 'react';
3
3
 
4
4
  var EMPTY_STATE = EMPTY_COMMERCE_CART_STATE;
@@ -1,6 +1,6 @@
1
- import { FeedbackMessage } from './chunk-UDNSI5PY.mjs';
2
- import { themeButtonClassName } from './chunk-VGDBVNOO.mjs';
3
- import { clsx_default } from './chunk-ZE5G642V.mjs';
1
+ import { FeedbackMessage } from './chunk-GOFO7HRH.mjs';
2
+ import { themeButtonClassName } from './chunk-DIRW2LNG.mjs';
3
+ import { formatCurrencyAmount, clsx_default } from './chunk-LI2C6M5O.mjs';
4
4
  import { useId } from 'react';
5
5
  import { jsx, jsxs, Fragment } from 'react/jsx-runtime';
6
6
 
@@ -213,10 +213,7 @@ var DEFAULT_CURRENCY = "GBP";
213
213
 
214
214
  // ../blocks/src/system/runtime/shared/utils/formatting.ts
215
215
  function formatPrice(cents, currency = DEFAULT_CURRENCY, locale) {
216
- return new Intl.NumberFormat(locale, {
217
- style: "currency",
218
- currency: currency.toUpperCase()
219
- }).format(cents / 100);
216
+ return formatCurrencyAmount(cents, currency, { locale });
220
217
  }
221
218
 
222
219
  // ../blocks/src/system/runtime/shared/utils/portalLogout.ts