@riverbankcms/sdk 0.84.2 → 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 (143) 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/ai/src/contracts/proposals.d.ts +684 -0
  5. package/dist/_dts/api/src/endpoints.d.ts +58 -14
  6. package/dist/_dts/api/src/index.d.ts +4 -1
  7. package/dist/_dts/api/src/launchReadiness.d.ts +3 -3
  8. package/dist/_dts/api/src/mailchimpIntegration.d.ts +215 -0
  9. package/dist/_dts/api/src/publicExperienceEndpoints.d.ts +35 -15
  10. package/dist/_dts/api/src/siteInfrastructure.d.ts +0 -14
  11. package/dist/_dts/api/src/siteRuntimeEndpoints.d.ts +1 -13
  12. package/dist/_dts/api/src/types.d.ts +6 -3
  13. package/dist/_dts/blocks/src/PageRenderer.d.ts +1 -0
  14. package/dist/_dts/blocks/src/contracts/proof-block-islands.d.ts +4 -0
  15. package/dist/_dts/blocks/src/index.d.ts +2 -1
  16. package/dist/_dts/blocks/src/system/blocks/appointment-booking.d.ts +288 -288
  17. package/dist/_dts/blocks/src/system/blocks/blog-listing.d.ts +288 -288
  18. package/dist/_dts/blocks/src/system/blocks/cart.d.ts +288 -288
  19. package/dist/_dts/blocks/src/system/blocks/checkout.d.ts +288 -288
  20. package/dist/_dts/blocks/src/system/blocks/collection.d.ts +288 -288
  21. package/dist/_dts/blocks/src/system/blocks/events/shared/schemas.d.ts +42 -0
  22. package/dist/_dts/blocks/src/system/blocks/events/shared/types.d.ts +4 -0
  23. package/dist/_dts/blocks/src/system/blocks/faq.d.ts +288 -288
  24. package/dist/_dts/blocks/src/system/blocks/gifting.d.ts +288 -288
  25. package/dist/_dts/blocks/src/system/blocks/location-map.d.ts +1 -1
  26. package/dist/_dts/blocks/src/system/blocks/media-text.d.ts +42 -42
  27. package/dist/_dts/blocks/src/system/blocks/newsletter-signup-destination.d.ts +300 -0
  28. package/dist/_dts/blocks/src/system/blocks/newsletter-signup.d.ts +63 -3
  29. package/dist/_dts/blocks/src/system/blocks/product-detail.d.ts +288 -288
  30. package/dist/_dts/blocks/src/system/blocks/product-list.d.ts +288 -288
  31. package/dist/_dts/blocks/src/system/blocks/shop.d.ts +288 -288
  32. package/dist/_dts/blocks/src/system/fragments/library/newsletterForm.d.ts +53 -1
  33. package/dist/_dts/blocks/src/system/manifest/richTextSchema.d.ts +27 -0
  34. package/dist/_dts/blocks/src/system/manifest/schema.d.ts +23 -23
  35. package/dist/_dts/blocks/src/system/runtime/api/types.d.ts +10 -2
  36. package/dist/_dts/blocks/src/system/runtime/components/registry.client.d.ts +24 -0
  37. package/dist/_dts/blocks/src/system/runtime/components/runtime-backed-blocks.d.ts +12 -0
  38. package/dist/_dts/blocks/src/system/runtime/nodes/event-registration/types.d.ts +1 -0
  39. package/dist/_dts/blocks/src/system/runtime/nodes/event-registration.interactive.d.ts +4 -0
  40. package/dist/_dts/blocks/src/system/runtime/nodes/event-registration.server.d.ts +1 -1
  41. package/dist/_dts/blocks/src/system/runtime/nodes/events/shared/utils.d.ts +11 -1
  42. package/dist/_dts/blocks/src/system/runtime/nodes/newsletter-form.interactive.d.ts +15 -0
  43. package/dist/_dts/blocks/src/system/runtime/nodes/newsletter-form.server.d.ts +1 -1
  44. package/dist/_dts/blocks/src/system/runtime/nodes/newsletter-form.submission.d.ts +32 -0
  45. package/dist/_dts/blocks/src/system/runtime/nodes/newsletter-form.types.d.ts +5 -1
  46. package/dist/_dts/blocks/src/system/runtime/shared/components/ModalShell.d.ts +5 -1
  47. package/dist/_dts/blocks/src/system/runtime/shared/utils/formatting.d.ts +1 -1
  48. package/dist/_dts/content-model/src/referenceFields.d.ts +1 -1
  49. package/dist/_dts/core/src/currency-format.d.ts +37 -2
  50. package/dist/_dts/core/src/event-pricing.d.ts +24 -0
  51. package/dist/_dts/db/src/generated/supabase/database.types.d.ts +551 -20
  52. package/dist/_dts/editor-blocks/src/widgets/reference/loaders.d.ts +3 -1
  53. package/dist/_dts/sdk/src/cli/canonical-entry-policy.d.ts +53 -0
  54. package/dist/_dts/sdk/src/cli/commands/migrate.d.ts +1 -0
  55. package/dist/_dts/sdk/src/cli/commands/pull.d.ts +7 -1
  56. package/dist/_dts/sdk/src/cli/content/reader.d.ts +2 -0
  57. package/dist/_dts/sdk/src/cli/migrations/events.d.ts +73 -0
  58. package/dist/_dts/sdk/src/client/types.d.ts +9 -0
  59. package/dist/_dts/sdk/src/config/validation.d.ts +3 -0
  60. package/dist/_dts/sdk/src/contracts/system-block-content.d.ts +3 -0
  61. package/dist/_dts/sdk/src/data/prefetchBlockData.d.ts +3 -9
  62. package/dist/_dts/sdk/src/manifest/passes/pass1-fields.d.ts +1 -1
  63. package/dist/_dts/sdk/src/manifest/three-pass-converter.d.ts +7 -18
  64. package/dist/_dts/sdk/src/rendering/blocks-page-renderer.d.ts +2 -0
  65. package/dist/_dts/sdk/src/rendering/components/pageShared.d.ts +3 -1
  66. package/dist/_dts/sdk/src/rendering/helpers/loadContent.d.ts +7 -3
  67. package/dist/_dts/sdk/src/rendering/helpers/loadPage.d.ts +4 -24
  68. package/dist/_dts/sdk/src/rendering/helpers/pageRuntimeSupport.d.ts +45 -0
  69. package/dist/_dts/sdk/src/version.d.ts +1 -1
  70. package/dist/_dts/site-commands/src/commands.d.ts +57 -0
  71. package/dist/_dts/surfaces/src/index.d.ts +12 -0
  72. package/dist/_dts/theme-core/src/generated/containerResponsiveThemeCss.d.ts +1 -1
  73. package/dist/_dts/theme-core/src/mock-themes/all.d.ts +9 -9
  74. package/dist/_dts/theme-core/src/schema.d.ts +11 -11
  75. package/dist/{chunk-ZR2GQK2A.mjs → chunk-7KOO7RPP.mjs} +953 -315
  76. package/dist/{chunk-OCGTXHSO.mjs → chunk-ER4UIW4X.mjs} +7 -7
  77. package/dist/{chunk-WFPYN7KA.mjs → chunk-HVOBXA3Y.mjs} +2 -2
  78. package/dist/{chunk-NFWGLRZZ.mjs → chunk-K3JWH6HE.mjs} +37 -3
  79. package/dist/{chunk-4QNLOTES.mjs → chunk-O4LVYUVH.mjs} +58 -14
  80. package/dist/{chunk-PYDHOMEO.mjs → chunk-YDMBIIS5.mjs} +1 -1
  81. package/dist/cli/index.mjs +1858 -512
  82. package/dist/client/{accordion-2UZPBMYM.mjs → accordion-PT5CGW5N.mjs} +2 -2
  83. package/dist/client/{bookingForm-36CWQUMV.mjs → bookingForm-2HLRTEYS.mjs} +7 -7
  84. package/dist/client/bookings.mjs +51 -6
  85. package/dist/client/{carousel-QH77HR6X.mjs → carousel-Z2LKYSWA.mjs} +3 -3
  86. package/dist/client/cart-ND5IK4A6.mjs +18 -0
  87. package/dist/client/checkout-EYUSGAY7.mjs +18 -0
  88. package/dist/client/{chunk-SYIJ5JO2.mjs → chunk-6DVPO44G.mjs} +1 -1
  89. package/dist/client/{chunk-3C2VTPWI.mjs → chunk-BAWHZ5GM.mjs} +176 -13
  90. package/dist/client/{chunk-52CGCQ7B.mjs → chunk-BL66UWGD.mjs} +10 -80
  91. package/dist/client/{chunk-VGDBVNOO.mjs → chunk-DIRW2LNG.mjs} +241 -210
  92. package/dist/client/{chunk-UDNSI5PY.mjs → chunk-GOFO7HRH.mjs} +1 -2
  93. package/dist/client/{chunk-ZKUO52W3.mjs → chunk-H4MHEXYS.mjs} +1 -1
  94. package/dist/client/{chunk-ZE5G642V.mjs → chunk-LI2C6M5O.mjs} +75 -1
  95. package/dist/client/{chunk-3DTWLTXM.mjs → chunk-MHBEWDT7.mjs} +117 -3
  96. package/dist/client/{chunk-4OXKTA3D.mjs → chunk-O5JNI3E4.mjs} +2 -2
  97. package/dist/client/{chunk-XSV6KW4D.mjs → chunk-S4G65LGR.mjs} +1 -1
  98. package/dist/client/{chunk-DVNUDUVT.mjs → chunk-WBQG7VJA.mjs} +4 -1
  99. package/dist/client/{chunk-F5VRX5Y6.mjs → chunk-WCVK4MBJ.mjs} +1 -1
  100. package/dist/client/{chunk-7UCLJ5SP.mjs → chunk-X7GVFB7Y.mjs} +4 -7
  101. package/dist/client/client.mjs +2125 -1403
  102. package/dist/client/{courseRegistration-TMKU6ABO.mjs → courseRegistration-H3AZBUEG.mjs} +7 -7
  103. package/dist/client/{eventCalendar-G6TI32X6.mjs → eventCalendar-FPKJGLGS.mjs} +10 -11
  104. package/dist/client/{eventCombined-SCKEMNAR.mjs → eventCombined-QCGIZBUY.mjs} +10 -11
  105. package/dist/client/{eventDetails-XPIFXXPK.mjs → eventDetails-HIT3BJWU.mjs} +10 -11
  106. package/dist/client/{eventListing-7QFMEMGT.mjs → eventListing-R4HNWJDN.mjs} +10 -11
  107. package/dist/client/{eventRegistration-TOODSZUI.mjs → eventRegistration-Q7BYY5HF.mjs} +10 -11
  108. package/dist/client/{form-MTCMVCZT.mjs → form-NI6YOG6S.mjs} +3 -3
  109. package/dist/client/{headerSection-Y5TMR3TW.mjs → headerSection-SDYGII36.mjs} +4 -4
  110. package/dist/client/hooks.mjs +1682 -1412
  111. package/dist/client/{locationMap-RH2LG7FZ.mjs → locationMap-BDETEUQD.mjs} +3 -4
  112. package/dist/client/{newsletterForm-PCAIPFMA.mjs → newsletterForm-EKYIU67X.mjs} +70 -22
  113. package/dist/client/{productDetail-OIGDR4YE.mjs → productDetail-5UTGNN76.mjs} +8 -9
  114. package/dist/client/{productList-4MA5S2CX.mjs → productList-7YA5KXZQ.mjs} +8 -9
  115. package/dist/client/rendering/client.mjs +753 -329
  116. package/dist/client/rendering/islands.mjs +19 -19
  117. package/dist/client/rendering.mjs +3786 -3034
  118. package/dist/client/shop-AIMUMZYC.mjs +20 -0
  119. package/dist/preview-next/before-render.mjs +58 -14
  120. package/dist/preview-next/client/runtime.mjs +5 -5
  121. package/dist/preview-next/editor-chrome.css +56 -9
  122. package/dist/preview-next/middleware.mjs +58 -14
  123. package/dist/{sdk-runtime-QLOCYKVU.mjs → sdk-runtime-NW472WNT.mjs} +6 -6
  124. package/dist/server/components.mjs +1518 -1015
  125. package/dist/server/config-validation.mjs +1719 -1461
  126. package/dist/server/config.mjs +1719 -1461
  127. package/dist/server/data.mjs +1683 -1413
  128. package/dist/server/index.mjs +79 -17
  129. package/dist/server/next.mjs +1902 -1311
  130. package/dist/server/page-converter.mjs +2193 -1169
  131. package/dist/server/prebuild.mjs +1 -1
  132. package/dist/server/rendering/server.mjs +1709 -1209
  133. package/dist/server/rendering.mjs +1894 -1347
  134. package/dist/server/routing.mjs +1872 -1499
  135. package/dist/server/server.mjs +1571 -1264
  136. package/dist/server/theme-bridge.mjs +234 -0
  137. package/dist/styles/index.css +232 -0
  138. package/package.json +1 -1
  139. package/dist/SdkPreviewModeRuntime-4FGSVUYI.mjs +0 -8
  140. package/dist/client/cart-X4YK4FTW.mjs +0 -19
  141. package/dist/client/checkout-OM2BEPWD.mjs +0 -19
  142. package/dist/client/chunk-I2MMZO53.mjs +0 -6
  143. 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