@riverbankcms/sdk 0.90.0 → 0.90.1

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 (80) hide show
  1. package/dist/{PreviewEditorSidebar-KVXNF3VW.mjs → PreviewEditorSidebar-FNFRVSIM.mjs} +2 -2
  2. package/dist/{PreviewEditorUI-J3JN5Z7T.mjs → PreviewEditorUI-3WXJFQXG.mjs} +2 -2
  3. package/dist/SdkPreviewModeRuntime-2UCIMKUB.mjs +8 -0
  4. package/dist/_dts/api/src/bookingConfig.d.ts +3 -0
  5. package/dist/_dts/api/src/event-listing-destination.d.ts +59 -0
  6. package/dist/_dts/api/src/index.d.ts +4 -0
  7. package/dist/_dts/api/src/navigation/dashboardSettingsNav.d.ts +0 -1
  8. package/dist/_dts/api/src/navigation.d.ts +2 -0
  9. package/dist/_dts/api/src/publicExperienceEndpoints.d.ts +3 -1
  10. package/dist/_dts/api/src/settings/permissions.d.ts +273 -0
  11. package/dist/_dts/api/src/types.d.ts +1 -0
  12. package/dist/_dts/blocks/src/system/blocks/events/shared/schemas.d.ts +60 -2
  13. package/dist/_dts/blocks/src/system/blocks/events/shared/types.d.ts +12 -1
  14. package/dist/_dts/blocks/src/system/blocks/media-text.d.ts +9 -9
  15. package/dist/_dts/blocks/src/system/blocks/team-members.d.ts +1 -1
  16. package/dist/_dts/blocks/src/system/runtime/nodes/event-registration/event-registration.headless.contract.d.ts +5 -0
  17. package/dist/_dts/blocks/src/system/runtime/nodes/event-registration/eventPaymentOptions.d.ts +24 -0
  18. package/dist/_dts/blocks/src/system/runtime/nodes/events/shared/destination.d.ts +8 -0
  19. package/dist/_dts/blocks/src/system/runtime/nodes/events/shared/pricing.d.ts +3 -0
  20. package/dist/_dts/blocks/src/system/runtime/nodes/events/shared/utils.d.ts +7 -0
  21. package/dist/_dts/core/src/event-pricing.d.ts +12 -2
  22. package/dist/_dts/sdk/src/public-api/contracts.d.ts +11 -1
  23. package/dist/_dts/sdk/src/rendering/islands/types.d.ts +11 -1
  24. package/dist/_dts/sdk/src/version.d.ts +1 -1
  25. package/dist/{chunk-PMBB6MQ7.mjs → chunk-CR2VX432.mjs} +297 -117
  26. package/dist/{chunk-AEOYWPE4.mjs → chunk-FA6LVZ7C.mjs} +5 -5
  27. package/dist/{chunk-RQ3XZ4SJ.mjs → chunk-H6TT5ZXI.mjs} +1 -1
  28. package/dist/{chunk-GSPFFUVB.mjs → chunk-SYYJZPKU.mjs} +1 -1
  29. package/dist/cli/index.mjs +160 -103
  30. package/dist/client/{accordion-GXQNWQ6O.mjs → accordion-4K7VGZ3I.mjs} +2 -2
  31. package/dist/client/{bookingForm-STLUJ36H.mjs → bookingForm-3QXA3CIS.mjs} +5 -5
  32. package/dist/client/bookings.mjs +1154 -556
  33. package/dist/client/{carousel-CVRN6EPP.mjs → carousel-BEJKNGQ7.mjs} +3 -3
  34. package/dist/client/{cart-IYIBA5CL.mjs → cart-44BBM6XG.mjs} +6 -6
  35. package/dist/client/{checkout-O3BGM4GS.mjs → checkout-THMHEYKF.mjs} +6 -6
  36. package/dist/client/{chunk-25W2EQUN.mjs → chunk-3H5CLFKT.mjs} +8 -0
  37. package/dist/client/{chunk-MFPKS6QS.mjs → chunk-4COPESPO.mjs} +5 -5
  38. package/dist/client/{chunk-4RTFGHZN.mjs → chunk-5AJIMWKS.mjs} +6 -3
  39. package/dist/client/{chunk-6DPXDOIL.mjs → chunk-B4H6QMPY.mjs} +93 -22
  40. package/dist/client/{chunk-VFHZLZAC.mjs → chunk-DQIRKNZE.mjs} +1 -1
  41. package/dist/client/{chunk-7DH35FGA.mjs → chunk-EJBHK74Y.mjs} +1 -1
  42. package/dist/client/{chunk-DAS5CIER.mjs → chunk-JV7ZNAOU.mjs} +118 -20
  43. package/dist/client/{chunk-FHU6PFPM.mjs → chunk-KNTLBQ3N.mjs} +1 -1
  44. package/dist/client/{chunk-Z62JYS5O.mjs → chunk-PEDNDLPB.mjs} +2 -2
  45. package/dist/client/{chunk-NBFRJ5NB.mjs → chunk-SLY6UDAS.mjs} +2 -2
  46. package/dist/client/{chunk-D3ETC2SU.mjs → chunk-ZIAF2DA4.mjs} +1 -1
  47. package/dist/client/client.mjs +272 -83
  48. package/dist/client/{courseRegistration-2D3ACMJR.mjs → courseRegistration-URX7RCCK.mjs} +5 -5
  49. package/dist/client/{eventCalendar-QY4UZUFF.mjs → eventCalendar-GTENOQCE.mjs} +8 -8
  50. package/dist/client/{eventCombined-RRCDKJC2.mjs → eventCombined-EZVB72MF.mjs} +8 -8
  51. package/dist/client/{eventDetails-YO335BUT.mjs → eventDetails-CH4BJR5Z.mjs} +8 -8
  52. package/dist/client/{eventListing-PXA6GFQ3.mjs → eventListing-4BVOI5HS.mjs} +8 -8
  53. package/dist/client/{eventRegistration-2ZHEDDXO.mjs → eventRegistration-37LPIKIE.mjs} +8 -8
  54. package/dist/client/{form-ZS6KX4U2.mjs → form-FX3Y54YK.mjs} +2 -2
  55. package/dist/client/{headerSection-QK5SLIIB.mjs → headerSection-UOZZGVYL.mjs} +3 -3
  56. package/dist/client/hooks.mjs +86 -35
  57. package/dist/client/{locationMap-GFNIUD2X.mjs → locationMap-VSIPKV35.mjs} +3 -3
  58. package/dist/client/{newsletterForm-PGLTTCUG.mjs → newsletterForm-6FRJKNAF.mjs} +2 -2
  59. package/dist/client/{productDetail-OPBE5ZPI.mjs → productDetail-6AHMLXCO.mjs} +6 -6
  60. package/dist/client/{productList-NI72Q62Z.mjs → productList-M2CYIZVH.mjs} +6 -6
  61. package/dist/client/rendering/client.mjs +231 -42
  62. package/dist/client/rendering/islands.mjs +19 -19
  63. package/dist/client/rendering.mjs +273 -84
  64. package/dist/client/{shop-3ZQPEWYI.mjs → shop-AUOT6GEX.mjs} +6 -6
  65. package/dist/preview-next/client/runtime.mjs +3 -3
  66. package/dist/{sdk-runtime-FSHXCWDS.mjs → sdk-runtime-6GPJNLU6.mjs} +4 -4
  67. package/dist/server/components.mjs +136 -58
  68. package/dist/server/config-validation.mjs +78 -27
  69. package/dist/server/config.mjs +78 -27
  70. package/dist/server/data.mjs +86 -35
  71. package/dist/server/index.mjs +1 -1
  72. package/dist/server/next.mjs +157 -79
  73. package/dist/server/page-converter.mjs +72 -21
  74. package/dist/server/prebuild.mjs +1 -1
  75. package/dist/server/rendering/server.mjs +148 -70
  76. package/dist/server/rendering.mjs +152 -74
  77. package/dist/server/routing.mjs +121 -44
  78. package/dist/server/server.mjs +95 -44
  79. package/package.json +2 -2
  80. package/dist/SdkPreviewModeRuntime-UBL6MSNP.mjs +0 -8
@@ -1,16 +1,16 @@
1
1
  "use client";
2
- import { LeafletStaticMap } from './chunk-D3ETC2SU.mjs';
3
- import { resolveCoursePricingState, useWaitlistClaim, MagicLinkForm, formatCoursePriceAmount, formatCoursePriceDisplay } from './chunk-Z62JYS5O.mjs';
2
+ import { LeafletStaticMap } from './chunk-ZIAF2DA4.mjs';
3
+ import { resolveCoursePricingState, useWaitlistClaim, MagicLinkForm, formatCoursePriceAmount, formatCoursePriceDisplay } from './chunk-PEDNDLPB.mjs';
4
4
  import { CreditCard, Ticket, Star, Sparkles } from './chunk-6N7YRNYU.mjs';
5
- import { usePolling, buildBookingPaymentSelectionViewModel } from './chunk-4RTFGHZN.mjs';
6
- import { SpinnerNode } from './chunk-FHU6PFPM.mjs';
7
- import { createBodyThemePortalRoot, TabBarFragment, useDiscountCodeUi, logoutPortal, consumeSearchParam, StepIndicator, DiscountCodeDisclosure, TerminalPanel, StateIcon, formatPrice, CrossIcon, ClockIcon, LoggedInAsUser, CheckIcon } from './chunk-NBFRJ5NB.mjs';
5
+ import { usePolling, buildBookingPaymentSelectionViewModel } from './chunk-5AJIMWKS.mjs';
6
+ import { SpinnerNode } from './chunk-KNTLBQ3N.mjs';
7
+ import { createBodyThemePortalRoot, TabBarFragment, useDiscountCodeUi, logoutPortal, consumeSearchParam, StepIndicator, DiscountCodeDisclosure, TerminalPanel, StateIcon, formatPrice, CrossIcon, ClockIcon, LoggedInAsUser, CheckIcon } from './chunk-SLY6UDAS.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-HIHOQGIP.mjs';
11
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, DateTimeTile, assertNever, EventCard, buildCalendarViewport, shiftCalendarAnchorDate, addMonths, getThreeMonthRange, buildTimetableModel, formatDate, MONTH_NAMES, getEventAvailability, formatEventTeacherLine, toRegistrationEvents, isEventContentType, findPreSelectedEvent, resolveRegistrationTarget, findEventByOccurrenceId, resolveEventRequiresPayment, resolveDiscountContext } from './chunk-6DPXDOIL.mjs';
13
- import { publicEventPricingType, getBookingLocalDateKey, toScheduledBookingDateTime, toBookingTimeZone, publicEventPricingCurrency, formatBookingDateTime, publicEventPricingMode, publicEventScalarPrice, publicEventTicketTypes, formatCurrencyAmount, formatBookingDate, formatBookingTime } from './chunk-25W2EQUN.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-B4H6QMPY.mjs';
13
+ import { publicEventPricingType, getBookingLocalDateKey, toScheduledBookingDateTime, toBookingTimeZone, publicEventPricingCurrency, formatBookingDateTime, publicEventPricingMode, publicEventScalarPrice, publicEventTicketTypes, formatCurrencyAmount, formatBookingDate, formatBookingTime } from './chunk-3H5CLFKT.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';
@@ -1405,6 +1405,33 @@ function toEventDirectPaymentOption(option, mode) {
1405
1405
  );
1406
1406
  }
1407
1407
  }
1408
+ function resolveEventRegistrationDirectPaymentSelection(input) {
1409
+ if (input.selection.method !== "stripe") {
1410
+ return { kind: "not-stripe" };
1411
+ }
1412
+ const fallbackOption = input.options[0];
1413
+ if (!fallbackOption) {
1414
+ return { kind: "unavailable" };
1415
+ }
1416
+ const requestedKind = input.selection.collectionOptionKind;
1417
+ const selectedOption = requestedKind == null ? input.options.find((option) => option.kind === "upfront") : input.options.find((option) => option.kind === requestedKind);
1418
+ if (selectedOption) {
1419
+ return {
1420
+ kind: "valid",
1421
+ selection: {
1422
+ method: "stripe",
1423
+ collectionOptionKind: selectedOption.kind
1424
+ }
1425
+ };
1426
+ }
1427
+ return {
1428
+ kind: "invalid",
1429
+ fallbackSelection: {
1430
+ method: "stripe",
1431
+ collectionOptionKind: fallbackOption.kind
1432
+ }
1433
+ };
1434
+ }
1408
1435
  function PaymentCheckIcon() {
1409
1436
  return /* @__PURE__ */ jsx("div", { className: "er-check", children: /* @__PURE__ */ jsx(CheckIcon, {}) });
1410
1437
  }
@@ -1450,6 +1477,9 @@ function formatDirectPaymentOptionDetail(option) {
1450
1477
  balanceDueBy ? `Balance due by: ${balanceDueBy.value}` : null
1451
1478
  ].filter((part) => Boolean(part)).join(" \xB7 ");
1452
1479
  }
1480
+ function isDirectPaymentOptionSelected(option, selectionState) {
1481
+ return selectionState.kind === "valid" && selectionState.selection.collectionOptionKind === option.kind;
1482
+ }
1453
1483
  var PaymentSelectionStep = ({
1454
1484
  event,
1455
1485
  occurrenceContext,
@@ -1466,8 +1496,28 @@ var PaymentSelectionStep = ({
1466
1496
  }) => {
1467
1497
  const occurrenceId = occurrenceContext?.id ?? event?.registrationOccurrenceId;
1468
1498
  const selectedMethod = selectedSelection.method;
1499
+ const totalPrice = eligibility?.price ? eligibility.price * ticketsCount : 0;
1500
+ const canShowDirectPaymentOptions = Boolean(
1501
+ eligibility?.eligible && eligibility.canPayDirectly && eligibility.price
1502
+ );
1503
+ const directPaymentOptions = eligibility && canShowDirectPaymentOptions ? buildEventRegistrationPaymentOptionsViewModel({
1504
+ eventTitle: event?.title ?? "Event",
1505
+ paymentTerms: event?.paymentTerms,
1506
+ totalPriceCents: totalPrice,
1507
+ currency: eligibility.currency,
1508
+ startsAt: occurrenceContext?.startsAt ?? event?.startsAt
1509
+ }).options : [];
1510
+ const directPaymentSelectionState = resolveEventRegistrationDirectPaymentSelection({
1511
+ options: directPaymentOptions,
1512
+ selection: selectedSelection
1513
+ });
1514
+ const directPaymentFallbackSelection = directPaymentSelectionState.kind === "invalid" ? directPaymentSelectionState.fallbackSelection : null;
1515
+ const directPaymentFallbackKind = directPaymentFallbackSelection?.collectionOptionKind;
1469
1516
  const canContinue = (() => {
1470
1517
  if (!selectedMethod) return false;
1518
+ if (selectedMethod === "stripe") {
1519
+ return directPaymentSelectionState.kind === "valid";
1520
+ }
1471
1521
  if (selectedMethod === "pass") return Boolean(selectedSelection.passId);
1472
1522
  if (selectedMethod === "membership")
1473
1523
  return Boolean(selectedSelection.membershipId);
@@ -1477,6 +1527,13 @@ var PaymentSelectionStep = ({
1477
1527
  return Boolean(selectedSelection.bundleMembershipId);
1478
1528
  return true;
1479
1529
  })();
1530
+ useEffect(() => {
1531
+ if (!directPaymentFallbackKind) return;
1532
+ onSelectionChange({
1533
+ method: "stripe",
1534
+ collectionOptionKind: directPaymentFallbackKind
1535
+ });
1536
+ }, [directPaymentFallbackKind, onSelectionChange]);
1480
1537
  const getButtonText = useCallback(() => {
1481
1538
  if (selectedMethod === "stripe") return "Continue to Payment";
1482
1539
  if (selectedMethod === "pass_bundle" || selectedMethod === "membership_bundle") {
@@ -1576,25 +1633,20 @@ var PaymentSelectionStep = ({
1576
1633
  ] }) })
1577
1634
  ] });
1578
1635
  }
1579
- const totalPrice = eligibility.price ? eligibility.price * ticketsCount : 0;
1580
- const directPaymentOptions = buildEventRegistrationPaymentOptionsViewModel({
1581
- eventTitle: event?.title ?? "Event",
1582
- paymentTerms: event?.paymentTerms,
1583
- totalPriceCents: totalPrice,
1584
- currency: eligibility.currency,
1585
- startsAt: occurrenceContext?.startsAt ?? event?.startsAt
1586
- }).options;
1587
1636
  const isMultiTicket = areEntitlementsDisabledForTicketCount(ticketsCount);
1588
1637
  return /* @__PURE__ */ jsxs("div", { className: "er-stack", children: [
1589
1638
  /* @__PURE__ */ jsx("h3", { className: "er-title", children: "Payment Options" }),
1590
1639
  /* @__PURE__ */ jsxs("div", { className: "er-payment-tiles", children: [
1591
- eligibility.canPayDirectly && eligibility.price && /* @__PURE__ */ jsx(Fragment, { children: directPaymentOptions.map((option) => /* @__PURE__ */ jsx(
1640
+ canShowDirectPaymentOptions && /* @__PURE__ */ jsx(Fragment, { children: directPaymentOptions.map((option) => /* @__PURE__ */ jsx(
1592
1641
  PaymentTile,
1593
1642
  {
1594
1643
  icon: /* @__PURE__ */ jsx(CreditCard, { size: 24, "aria-hidden": "true" }),
1595
1644
  label: option.label,
1596
1645
  detail: formatDirectPaymentOptionDetail(option),
1597
- selected: selectedMethod === "stripe" && (selectedSelection.collectionOptionKind ?? "upfront") === option.kind,
1646
+ selected: isDirectPaymentOptionSelected(
1647
+ option,
1648
+ directPaymentSelectionState
1649
+ ),
1598
1650
  onClick: () => onSelectionChange({
1599
1651
  method: "stripe",
1600
1652
  collectionOptionKind: option.kind
@@ -2014,6 +2066,24 @@ function EventRegistrationWizardActions(props) {
2014
2066
  function isProductMethod(method) {
2015
2067
  return method !== null && ["pass", "membership", "pass_bundle", "membership_bundle"].includes(method);
2016
2068
  }
2069
+ function getSummaryRow(option, label) {
2070
+ return option.summaryRows.find((row) => row.label === label)?.value ?? null;
2071
+ }
2072
+ function getSelectedDirectPaymentOption(input) {
2073
+ const summaryEvent = input.wizard.selectedEvent ?? input.wizard.preSelectedEvent;
2074
+ if (!summaryEvent || input.wizard.paymentSelection.method !== "stripe") {
2075
+ return null;
2076
+ }
2077
+ const options = buildEventRegistrationPaymentOptionsViewModel({
2078
+ eventTitle: summaryEvent.title,
2079
+ paymentTerms: summaryEvent.paymentTerms,
2080
+ totalPriceCents: input.totalCents,
2081
+ currency: input.currency,
2082
+ startsAt: input.wizard.occurrenceContext?.startsAt ?? summaryEvent.startsAt
2083
+ }).options;
2084
+ const requestedKind = input.wizard.paymentSelection.collectionOptionKind ?? "upfront";
2085
+ return options.find((option) => option.kind === requestedKind) ?? options.find((option) => option.kind === "upfront") ?? options[0] ?? null;
2086
+ }
2017
2087
  function EventRegistrationSummaryBar(props) {
2018
2088
  const { wizard } = props;
2019
2089
  const summaryEvent = wizard.selectedEvent ?? wizard.preSelectedEvent;
@@ -2028,6 +2098,18 @@ function EventRegistrationSummaryBar(props) {
2028
2098
  const autoAppliedDiscount = wizard.discountCode.trim().length > 0 ? null : wizard.autoAppliedDiscount;
2029
2099
  const autoAppliedDiscountCents = Math.max(0, autoAppliedDiscount?.computedAmountCents ?? 0);
2030
2100
  const discountedTotalCents = Math.max(0, subtotalCents - autoAppliedDiscountCents);
2101
+ const selectedDirectPaymentOption = getSelectedDirectPaymentOption({
2102
+ wizard,
2103
+ totalCents: discountedTotalCents,
2104
+ currency: summaryCurrency
2105
+ });
2106
+ const flexibleBalanceSummary = selectedDirectPaymentOption?.kind === "flexible_balance" ? {
2107
+ total: getSummaryRow(selectedDirectPaymentOption, "Total"),
2108
+ dueToday: getSummaryRow(selectedDirectPaymentOption, "Due today"),
2109
+ remainingBalance: getSummaryRow(selectedDirectPaymentOption, "Remaining balance"),
2110
+ balanceDueBy: getSummaryRow(selectedDirectPaymentOption, "Balance due by"),
2111
+ depositPolicy: getSummaryRow(selectedDirectPaymentOption, "Deposit policy")
2112
+ } : null;
2031
2113
  if (!summaryTitle) return null;
2032
2114
  const productMethod = isProductMethod(wizard.paymentSelection.method);
2033
2115
  return /* @__PURE__ */ jsxs(Fragment, { children: [
@@ -2071,6 +2153,22 @@ function EventRegistrationSummaryBar(props) {
2071
2153
  summaryPrice > 0 && /* @__PURE__ */ jsx("div", { className: "er-summary-bar-pricing", children: productMethod ? /* @__PURE__ */ jsxs(Fragment, { children: [
2072
2154
  /* @__PURE__ */ jsx("span", { className: "er-summary-bar-price er-summary-bar-price--struck", children: formatPrice(summaryPrice * wizard.ticketsCount, summaryCurrency) }),
2073
2155
  /* @__PURE__ */ jsx("div", { className: "er-summary-bar-included", children: wizard.paymentSelection.method === "pass" || wizard.paymentSelection.method === "pass_bundle" ? "1 pass credit" : "Included in membership" })
2156
+ ] }) : flexibleBalanceSummary ? /* @__PURE__ */ jsxs(Fragment, { children: [
2157
+ flexibleBalanceSummary.total ? /* @__PURE__ */ jsxs("div", { className: "er-summary-bar-product-detail", children: [
2158
+ "Total: ",
2159
+ flexibleBalanceSummary.total
2160
+ ] }) : null,
2161
+ /* @__PURE__ */ jsx("div", { className: "er-summary-bar-price", children: flexibleBalanceSummary.dueToday ?? formatPrice(discountedTotalCents, summaryCurrency) }),
2162
+ /* @__PURE__ */ jsx("div", { className: "er-summary-bar-included", children: "Payable now" }),
2163
+ flexibleBalanceSummary.remainingBalance ? /* @__PURE__ */ jsxs("div", { className: "er-summary-bar-product-detail", children: [
2164
+ "Remaining balance: ",
2165
+ flexibleBalanceSummary.remainingBalance,
2166
+ flexibleBalanceSummary.balanceDueBy ? ` due by ${flexibleBalanceSummary.balanceDueBy}` : ""
2167
+ ] }) : null,
2168
+ flexibleBalanceSummary.depositPolicy ? /* @__PURE__ */ jsxs("div", { className: "er-summary-bar-product-detail", children: [
2169
+ "Deposit: ",
2170
+ flexibleBalanceSummary.depositPolicy
2171
+ ] }) : null
2074
2172
  ] }) : autoAppliedDiscount && autoAppliedDiscountCents > 0 ? /* @__PURE__ */ jsxs(Fragment, { children: [
2075
2173
  /* @__PURE__ */ jsx("span", { className: "er-summary-bar-price er-summary-bar-price--struck", children: formatPrice(subtotalCents, summaryCurrency) }),
2076
2174
  /* @__PURE__ */ jsx("div", { className: "er-summary-bar-price", children: formatPrice(discountedTotalCents, summaryCurrency) }),
@@ -3491,7 +3589,7 @@ function EventDetailsView({
3491
3589
  "a",
3492
3590
  {
3493
3591
  className: "rb-tile rb-tile--interactive",
3494
- href: e.path,
3592
+ ...resolveEventLinkProps(e),
3495
3593
  children: /* @__PURE__ */ jsx(
3496
3594
  DateTimeTile,
3497
3595
  {
@@ -4848,7 +4946,7 @@ var AgendaEventCard = ({
4848
4946
  showCapacity,
4849
4947
  onClick
4850
4948
  }) => {
4851
- const eventUrl = event.path;
4949
+ const eventLinkProps = resolveEventLinkProps(event);
4852
4950
  const categoryColor = event.eventCategory?.color || "rgb(var(--tb-accent))";
4853
4951
  const price = formatEventPrice(event);
4854
4952
  const { available, isFull } = getEventAvailability(event);
@@ -4909,7 +5007,7 @@ var AgendaEventCard = ({
4909
5007
  }
4910
5008
  );
4911
5009
  }
4912
- return /* @__PURE__ */ jsx("a", { href: eventUrl, className: "event-agenda-card", children: cardContent });
5010
+ return /* @__PURE__ */ jsx("a", { ...eventLinkProps, className: "event-agenda-card", children: cardContent });
4913
5011
  };
4914
5012
  var FULL_DAY_NAMES = ["Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday"];
4915
5013
  function formatAgendaDayHeader(date) {
@@ -1,4 +1,4 @@
1
- import { clsx_default } from './chunk-25W2EQUN.mjs';
1
+ import { clsx_default } from './chunk-3H5CLFKT.mjs';
2
2
  import { jsxs, jsx } from 'react/jsx-runtime';
3
3
 
4
4
  function resolveColorStyle(color) {
@@ -1,7 +1,7 @@
1
1
  "use client";
2
2
  import { useBlockApi } from './chunk-WHZQDPBZ.mjs';
3
- import { themeButtonClassName, assertNever } from './chunk-6DPXDOIL.mjs';
4
- import { resolvePlanningDateInput, formatBookingPriceDisplay } from './chunk-25W2EQUN.mjs';
3
+ import { themeButtonClassName, assertNever } from './chunk-B4H6QMPY.mjs';
4
+ import { resolvePlanningDateInput, formatBookingPriceDisplay } from './chunk-3H5CLFKT.mjs';
5
5
  import { useState, useReducer, useSyncExternalStore, useEffect } from 'react';
6
6
  import { jsxs, jsx } from 'react/jsx-runtime';
7
7
 
@@ -1,7 +1,7 @@
1
1
  "use client";
2
2
  import { FeedbackMessage, discountAvailabilityHasDiscounts, getAutoAppliedDiscountPreview, discountAvailabilityAllowsManualEntry } from './chunk-WHZQDPBZ.mjs';
3
- import { themeButtonClassName } from './chunk-6DPXDOIL.mjs';
4
- import { formatCurrencyAmount, clsx_default } from './chunk-25W2EQUN.mjs';
3
+ import { themeButtonClassName } from './chunk-B4H6QMPY.mjs';
4
+ import { formatCurrencyAmount, clsx_default } from './chunk-3H5CLFKT.mjs';
5
5
  import { useReducer, useEffect, useId, useRef } from 'react';
6
6
  import { jsx, jsxs, Fragment } from 'react/jsx-runtime';
7
7
 
@@ -1,5 +1,5 @@
1
1
  "use client";
2
- import { isRecord } from './chunk-6DPXDOIL.mjs';
2
+ import { isRecord } from './chunk-B4H6QMPY.mjs';
3
3
  import { useRef, useState, useEffect } from 'react';
4
4
  import { jsx } from 'react/jsx-runtime';
5
5