@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
@@ -3139,6 +3139,8 @@ function publicEventPricingType(pricing) {
3139
3139
  case "ticket_types":
3140
3140
  case "course":
3141
3141
  return isFreePublicEventPriceDisplay(pricing.display) ? "free" : "paid";
3142
+ case "external":
3143
+ return "external";
3142
3144
  }
3143
3145
  }
3144
3146
  function publicEventPricingCurrency(pricing) {
@@ -3150,6 +3152,8 @@ function publicEventPricingCurrency(pricing) {
3150
3152
  return pricing.currency;
3151
3153
  case "course":
3152
3154
  return pricing.display.display.currency;
3155
+ case "external":
3156
+ return null;
3153
3157
  }
3154
3158
  }
3155
3159
  function publicEventScalarPrice(pricing) {
@@ -3164,6 +3168,7 @@ function publicEventPricingMode(pricing) {
3164
3168
  return "ticket_types";
3165
3169
  case "drop_in":
3166
3170
  case "course":
3171
+ case "external":
3167
3172
  return void 0;
3168
3173
  }
3169
3174
  }
@@ -3181,6 +3186,7 @@ function isFreePublicEventPriceDisplay(display) {
3181
3186
  case "range":
3182
3187
  case "mixed":
3183
3188
  case "unavailable":
3189
+ case "external":
3184
3190
  return false;
3185
3191
  }
3186
3192
  }
@@ -3211,6 +3217,8 @@ function formatBookingPriceDisplay(display, options = {}) {
3211
3217
  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)}`;
3212
3218
  case "unavailable":
3213
3219
  return "Pricing unavailable";
3220
+ case "external":
3221
+ return display.label;
3214
3222
  case "course":
3215
3223
  return formatCoursePriceDisplayLabel(display.display, options);
3216
3224
  default:
@@ -8268,11 +8276,45 @@ var init_shared = __esm({
8268
8276
  }
8269
8277
  });
8270
8278
 
8279
+ // ../blocks/src/system/runtime/nodes/events/shared/destination.ts
8280
+ function isRecord6(value) {
8281
+ return typeof value === "object" && value !== null && !Array.isArray(value);
8282
+ }
8283
+ function isRuntimeEventDestination(value) {
8284
+ if (!isRecord6(value) || typeof value.kind !== "string") return false;
8285
+ if (value.kind === "native") {
8286
+ return (value.mode === "cms-managed" || value.mode === "system-managed") && typeof value.path === "string";
8287
+ }
8288
+ return value.kind === "external" && typeof value.url === "string" && typeof value.label === "string";
8289
+ }
8290
+ function resolveRuntimeEventDestination(event) {
8291
+ if (isRuntimeEventDestination(event.destination)) {
8292
+ return event.destination;
8293
+ }
8294
+ return {
8295
+ kind: "native",
8296
+ mode: event.eventDestinationMode === "system-managed" ? "system-managed" : "cms-managed",
8297
+ path: typeof event.path === "string" ? event.path : ""
8298
+ };
8299
+ }
8300
+ var init_destination = __esm({
8301
+ "../blocks/src/system/runtime/nodes/events/shared/destination.ts"() {
8302
+ "use strict";
8303
+ }
8304
+ });
8305
+
8271
8306
  // ../blocks/src/system/runtime/nodes/events/shared/pricing.ts
8272
8307
  function resolveRuntimeEventPricing(event) {
8273
8308
  if (isPublicEventPricing(event.pricing)) {
8274
8309
  return event.pricing;
8275
8310
  }
8311
+ const destination = resolveRuntimeEventDestination(event);
8312
+ if (destination.kind === "external") {
8313
+ return {
8314
+ kind: "external",
8315
+ display: { kind: "external", label: "External registration" }
8316
+ };
8317
+ }
8276
8318
  const legacy = event;
8277
8319
  const currency = readCurrency(legacy.currency);
8278
8320
  if (event.requiresRegistration === false) {
@@ -8309,22 +8351,22 @@ function resolveRuntimeEventPricing(event) {
8309
8351
  function readCurrency(value) {
8310
8352
  return typeof value === "string" && value.trim().length > 0 ? value : DEFAULT_EVENT_CURRENCY;
8311
8353
  }
8312
- function isRecord6(value) {
8354
+ function isRecord7(value) {
8313
8355
  return typeof value === "object" && value !== null && !Array.isArray(value);
8314
8356
  }
8315
8357
  function isPublicEventPricing(value) {
8316
- if (!isRecord6(value) || typeof value.kind !== "string") return false;
8317
- return value.kind === "drop_in" || value.kind === "free_registration" || value.kind === "single_paid" || value.kind === "ticket_types" || value.kind === "course";
8358
+ if (!isRecord7(value) || typeof value.kind !== "string") return false;
8359
+ return value.kind === "drop_in" || value.kind === "free_registration" || value.kind === "single_paid" || value.kind === "ticket_types" || value.kind === "course" || value.kind === "external";
8318
8360
  }
8319
8361
  function isPublicEventTicketType(value) {
8320
- return isRecord6(value) && typeof value.id === "string";
8362
+ return isRecord7(value) && typeof value.id === "string";
8321
8363
  }
8322
8364
  function readTicketTypePriceDisplay(value, currency) {
8323
8365
  const display = readLegacyPriceDisplay(value, currency);
8324
- return display.kind === "course" ? { kind: "unavailable", currency } : display;
8366
+ return display.kind === "course" || display.kind === "external" ? { kind: "unavailable", currency } : display;
8325
8367
  }
8326
8368
  function readLegacyPriceDisplay(value, currency) {
8327
- if (!isRecord6(value) || typeof value.kind !== "string") {
8369
+ if (!isRecord7(value) || typeof value.kind !== "string") {
8328
8370
  return { kind: "unavailable", currency };
8329
8371
  }
8330
8372
  const displayCurrency = readCurrency(value.currency);
@@ -8363,7 +8405,7 @@ function readLegacyPriceDisplay(value, currency) {
8363
8405
  case "unavailable":
8364
8406
  return { kind: "unavailable", currency: displayCurrency };
8365
8407
  case "course":
8366
- return isRecord6(value.display) ? {
8408
+ return isRecord7(value.display) ? {
8367
8409
  kind: "course",
8368
8410
  display: readCoursePriceDisplay(value.display, displayCurrency)
8369
8411
  } : {
@@ -8401,6 +8443,7 @@ var DEFAULT_EVENT_CURRENCY;
8401
8443
  var init_pricing2 = __esm({
8402
8444
  "../blocks/src/system/runtime/nodes/events/shared/pricing.ts"() {
8403
8445
  "use strict";
8446
+ init_destination();
8404
8447
  DEFAULT_EVENT_CURRENCY = "USD";
8405
8448
  }
8406
8449
  });
@@ -9091,16 +9134,28 @@ function formatEventPrice(event) {
9091
9134
  function formatEventPriceDisplay(pricing) {
9092
9135
  return formatEventPricing(pricing, { decimals: "auto" });
9093
9136
  }
9137
+ function resolveEventHref(event) {
9138
+ const destination = resolveRuntimeEventDestination(event);
9139
+ return destination.kind === "external" ? destination.url : destination.path;
9140
+ }
9141
+ function resolveEventLinkProps(event) {
9142
+ const href = resolveEventHref(event);
9143
+ const destination = resolveRuntimeEventDestination(event);
9144
+ return destination.kind === "external" ? { href, target: "_blank", rel: "noopener noreferrer" } : { href };
9145
+ }
9094
9146
  function resolveEventCta(event, buttonText) {
9095
9147
  const { isFull: isSoldOut } = getEventAvailability(event);
9096
- const defaultButtonText = event.kind === "course_session" ? "Book course" : "Book";
9148
+ const destination = resolveRuntimeEventDestination(event);
9149
+ const isExternal = destination.kind === "external";
9150
+ const defaultButtonText = isExternal ? destination.label : event.kind === "course_session" ? "Book course" : "Book";
9097
9151
  const effectiveButtonText = buttonText ?? defaultButtonText;
9098
- if (isSoldOut) {
9099
- return { label: "Sold out", href: event.path, hidden: true };
9152
+ const href = resolveEventHref(event);
9153
+ if (!isExternal && isSoldOut) {
9154
+ return { label: "Sold out", href, external: false, hidden: true };
9100
9155
  }
9101
9156
  const enrollmentOpen = event.kind === "course_session" ? event.course?.enrollmentOpen !== false : true;
9102
9157
  const label = !enrollmentOpen ? "Registration closed" : effectiveButtonText;
9103
- return { label, href: event.path, hidden: false };
9158
+ return { label, href, external: isExternal, hidden: false };
9104
9159
  }
9105
9160
  var COLUMN_CLASSES;
9106
9161
  var init_utils = __esm({
@@ -9109,6 +9164,7 @@ var init_utils = __esm({
9109
9164
  init_src();
9110
9165
  init_src3();
9111
9166
  init_eventCapacity();
9167
+ init_destination();
9112
9168
  init_pricing2();
9113
9169
  init_src3();
9114
9170
  init_src3();
@@ -9313,7 +9369,7 @@ function EventDetailsView({
9313
9369
  "a",
9314
9370
  {
9315
9371
  className: "rb-tile rb-tile--interactive",
9316
- href: e.path,
9372
+ ...resolveEventLinkProps(e),
9317
9373
  children: /* @__PURE__ */ jsx25(
9318
9374
  DateTimeTile,
9319
9375
  {
@@ -10074,6 +10130,8 @@ var init_EventCard = __esm({
10074
10130
  "a",
10075
10131
  {
10076
10132
  href: cta.href,
10133
+ target: cta.external ? "_blank" : void 0,
10134
+ rel: cta.external ? "noopener noreferrer" : void 0,
10077
10135
  className: `${buttonClass} event-card-cta`,
10078
10136
  children: cta.label
10079
10137
  }
@@ -10131,10 +10189,19 @@ var init_EventCompactRow = __esm({
10131
10189
  formattedTime,
10132
10190
  /* @__PURE__ */ jsx33("span", { className: "event-compact-row-action-price", children: price })
10133
10191
  ] }),
10134
- cta.hidden ? /* @__PURE__ */ jsx33("span", { className: "event-compact-row-status", children: cta.label }) : /* @__PURE__ */ jsxs19("a", { href: cta.href, className: `${buttonClass} event-compact-row-cta`, children: [
10135
- /* @__PURE__ */ jsx33("span", { children: cta.label }),
10136
- /* @__PURE__ */ jsx33(ArrowRightIcon, { "aria-hidden": "true" })
10137
- ] })
10192
+ cta.hidden ? /* @__PURE__ */ jsx33("span", { className: "event-compact-row-status", children: cta.label }) : /* @__PURE__ */ jsxs19(
10193
+ "a",
10194
+ {
10195
+ href: cta.href,
10196
+ target: cta.external ? "_blank" : void 0,
10197
+ rel: cta.external ? "noopener noreferrer" : void 0,
10198
+ className: `${buttonClass} event-compact-row-cta`,
10199
+ children: [
10200
+ /* @__PURE__ */ jsx33("span", { children: cta.label }),
10201
+ /* @__PURE__ */ jsx33(ArrowRightIcon, { "aria-hidden": "true" })
10202
+ ]
10203
+ }
10204
+ )
10138
10205
  ] })
10139
10206
  ] })
10140
10207
  ] });
@@ -10184,7 +10251,7 @@ var init_shared2 = __esm({
10184
10251
 
10185
10252
  // ../blocks/src/system/blocks/events/shared/schemas.ts
10186
10253
  import { z as z14 } from "zod";
10187
- var eventPresetSchema, eventScheduleScopeSchema, eventDestinationModeSchema, eventVenueSchema, eventCategorySchema, pricingTypeSchema, accessRestrictionSchema, eventPricingModeSchema, publicCoursePriceDisplaySchema, publicEventPriceDisplaySchema, publicEventTicketTypePriceDisplaySchema, publicEventAttendanceModeSchema, publicEventAttendanceModeAvailabilitySchema, publicEventTicketTypeAvailabilitySchema, publicEventTicketTypeSchema, publicEventPricingSchema, publicTeamMemberSummarySchema, publicEventSchema, publicEventsArraySchema;
10254
+ var eventPresetSchema, eventScheduleScopeSchema, eventDestinationModeSchema, publicEventDestinationSchema, eventVenueSchema, eventCategorySchema, pricingTypeSchema, accessRestrictionSchema, eventPricingModeSchema, publicCoursePriceDisplaySchema, publicEventPriceDisplaySchema, publicEventTicketTypePriceDisplaySchema, publicEventAttendanceModeSchema, publicEventAttendanceModeAvailabilitySchema, publicEventTicketTypeAvailabilitySchema, publicEventTicketTypeSchema, publicEventPricingSchema, publicTeamMemberSummarySchema, publicEventSchema, publicEventsArraySchema;
10188
10255
  var init_schemas2 = __esm({
10189
10256
  "../blocks/src/system/blocks/events/shared/schemas.ts"() {
10190
10257
  "use strict";
@@ -10195,6 +10262,18 @@ var init_schemas2 = __esm({
10195
10262
  eventPresetSchema = z14.enum(["event", "class", "workshop", "retreat", "performance"]);
10196
10263
  eventScheduleScopeSchema = z14.enum(["recurring", "oneOff"]);
10197
10264
  eventDestinationModeSchema = z14.enum(["cms-managed", "system-managed"]);
10265
+ publicEventDestinationSchema = z14.discriminatedUnion("kind", [
10266
+ z14.object({
10267
+ kind: z14.literal("native"),
10268
+ mode: eventDestinationModeSchema,
10269
+ path: z14.string()
10270
+ }),
10271
+ z14.object({
10272
+ kind: z14.literal("external"),
10273
+ url: z14.string(),
10274
+ label: z14.string()
10275
+ })
10276
+ ]);
10198
10277
  eventVenueSchema = z14.object({
10199
10278
  id: z14.string(),
10200
10279
  name: z14.string(),
@@ -10209,7 +10288,7 @@ var init_schemas2 = __esm({
10209
10288
  name: z14.string(),
10210
10289
  color: z14.string().nullable()
10211
10290
  });
10212
- pricingTypeSchema = z14.enum(["free", "paid"]);
10291
+ pricingTypeSchema = z14.enum(["free", "paid", "external"]);
10213
10292
  accessRestrictionSchema = z14.enum(["none", "category"]);
10214
10293
  eventPricingModeSchema = z14.enum(["single", "ticket_types"]);
10215
10294
  publicCoursePriceDisplaySchema = z14.discriminatedUnion("kind", [
@@ -10230,6 +10309,7 @@ var init_schemas2 = __esm({
10230
10309
  currency: z14.string()
10231
10310
  }),
10232
10311
  z14.object({ kind: z14.literal("unavailable"), currency: z14.string() }),
10312
+ z14.object({ kind: z14.literal("external"), label: z14.string() }),
10233
10313
  z14.object({ kind: z14.literal("course"), display: publicCoursePriceDisplaySchema })
10234
10314
  ]);
10235
10315
  publicEventTicketTypePriceDisplaySchema = z14.union([
@@ -10308,6 +10388,10 @@ var init_schemas2 = __esm({
10308
10388
  z14.object({
10309
10389
  kind: z14.literal("course"),
10310
10390
  display: z14.object({ kind: z14.literal("course"), display: publicCoursePriceDisplaySchema })
10391
+ }),
10392
+ z14.object({
10393
+ kind: z14.literal("external"),
10394
+ display: z14.object({ kind: z14.literal("external"), label: z14.string() })
10311
10395
  })
10312
10396
  ]);
10313
10397
  publicTeamMemberSummarySchema = z14.object({
@@ -10336,7 +10420,8 @@ var init_schemas2 = __esm({
10336
10420
  image: mediaSchema.nullable().optional()
10337
10421
  }).optional(),
10338
10422
  slug: z14.string(),
10339
- path: z14.string(),
10423
+ path: z14.string().nullable(),
10424
+ destination: publicEventDestinationSchema,
10340
10425
  requiresRegistration: z14.boolean(),
10341
10426
  deliveryMode: z14.enum(["in_person", "online", "hybrid"]),
10342
10427
  attendanceModes: z14.array(publicEventAttendanceModeAvailabilitySchema),
@@ -23184,7 +23269,7 @@ function resolveEventRequiresPayment(input) {
23184
23269
  if (!input.event) {
23185
23270
  return false;
23186
23271
  }
23187
- return publicEventPricingType(resolveRuntimeEventPricing(input.event)) !== "free";
23272
+ return publicEventPricingType(resolveRuntimeEventPricing(input.event)) === "paid";
23188
23273
  }
23189
23274
  function resolveDiscountContext(input) {
23190
23275
  const selection = input.paymentSelection.method ? input.paymentSelection : null;
@@ -23316,15 +23401,16 @@ function buildEventRegistrationShellBodyText(stepLabels) {
23316
23401
  return "Preparing dates, tickets, and booking details.";
23317
23402
  }
23318
23403
  function normalizeEventRegistrationEventInput(value) {
23319
- if (!isRecord7(value)) {
23404
+ if (!isRecord8(value)) {
23320
23405
  return value;
23321
23406
  }
23322
23407
  return {
23323
23408
  ...value,
23409
+ destination: resolveRuntimeEventDestination(value),
23324
23410
  pricing: resolveRuntimeEventPricing(value)
23325
23411
  };
23326
23412
  }
23327
- function isRecord7(value) {
23413
+ function isRecord8(value) {
23328
23414
  return typeof value === "object" && value !== null && !Array.isArray(value);
23329
23415
  }
23330
23416
  function buildEventRegistrationInteractiveIslandProps(props2) {
@@ -23350,6 +23436,7 @@ var init_event_registration_interactive = __esm({
23350
23436
  init_event_registration_shared();
23351
23437
  init_events();
23352
23438
  init_pricing2();
23439
+ init_destination();
23353
23440
  init_islands();
23354
23441
  init_runtime();
23355
23442
  init_contract_schemas();
@@ -24562,7 +24649,7 @@ var init_AgendaEventCard = __esm({
24562
24649
  showCapacity,
24563
24650
  onClick
24564
24651
  }) => {
24565
- const eventUrl = event.path;
24652
+ const eventLinkProps = resolveEventLinkProps(event);
24566
24653
  const categoryColor = event.eventCategory?.color || "rgb(var(--tb-accent))";
24567
24654
  const price = formatEventPrice(event);
24568
24655
  const { available, isFull } = getEventAvailability(event);
@@ -24623,7 +24710,7 @@ var init_AgendaEventCard = __esm({
24623
24710
  }
24624
24711
  );
24625
24712
  }
24626
- return /* @__PURE__ */ jsx46("a", { href: eventUrl, className: "event-agenda-card", children: cardContent });
24713
+ return /* @__PURE__ */ jsx46("a", { ...eventLinkProps, className: "event-agenda-card", children: cardContent });
24627
24714
  };
24628
24715
  }
24629
24716
  });
@@ -28613,8 +28700,10 @@ function buildBookingPaymentOptionViewModel(input) {
28613
28700
  totalAmountCents: input.totalCents,
28614
28701
  config: input.option.config
28615
28702
  });
28703
+ const remainingBalance = Math.max(0, input.totalCents - dueToday);
28616
28704
  const formattedTotal = formatPrice(input.totalCents, input.currency, input.locale);
28617
28705
  const formattedDueToday = formatPrice(dueToday, input.currency, input.locale);
28706
+ const formattedRemainingBalance = formatPrice(remainingBalance, input.currency, input.locale);
28618
28707
  const dueAt = resolveFlexibleBalanceDueAt({
28619
28708
  bookingStartAt: input.bookingStartAt ?? (/* @__PURE__ */ new Date()).toISOString(),
28620
28709
  dueDateRule: input.option.config.dueDateRule
@@ -28631,6 +28720,7 @@ function buildBookingPaymentOptionViewModel(input) {
28631
28720
  summaryRows: [
28632
28721
  { label: "Total", value: formattedTotal },
28633
28722
  { label: "Due today", value: formattedDueToday },
28723
+ { label: "Remaining balance", value: formattedRemainingBalance },
28634
28724
  { label: "Balance due by", value: formatScheduleDate(dueAt, input.locale) },
28635
28725
  {
28636
28726
  label: "Deposit policy",
@@ -34132,6 +34222,33 @@ function toEventDirectPaymentOption(option, mode) {
34132
34222
  );
34133
34223
  }
34134
34224
  }
34225
+ function resolveEventRegistrationDirectPaymentSelection(input) {
34226
+ if (input.selection.method !== "stripe") {
34227
+ return { kind: "not-stripe" };
34228
+ }
34229
+ const fallbackOption = input.options[0];
34230
+ if (!fallbackOption) {
34231
+ return { kind: "unavailable" };
34232
+ }
34233
+ const requestedKind = input.selection.collectionOptionKind;
34234
+ const selectedOption = requestedKind == null ? input.options.find((option) => option.kind === "upfront") : input.options.find((option) => option.kind === requestedKind);
34235
+ if (selectedOption) {
34236
+ return {
34237
+ kind: "valid",
34238
+ selection: {
34239
+ method: "stripe",
34240
+ collectionOptionKind: selectedOption.kind
34241
+ }
34242
+ };
34243
+ }
34244
+ return {
34245
+ kind: "invalid",
34246
+ fallbackSelection: {
34247
+ method: "stripe",
34248
+ collectionOptionKind: fallbackOption.kind
34249
+ }
34250
+ };
34251
+ }
34135
34252
  var DEFAULT_EVENT_DIRECT_PAYMENT_OPTION;
34136
34253
  var init_eventPaymentOptions = __esm({
34137
34254
  "../blocks/src/system/runtime/nodes/event-registration/eventPaymentOptions.ts"() {
@@ -34191,6 +34308,9 @@ function formatDirectPaymentOptionDetail(option) {
34191
34308
  balanceDueBy ? `Balance due by: ${balanceDueBy.value}` : null
34192
34309
  ].filter((part) => Boolean(part)).join(" \xB7 ");
34193
34310
  }
34311
+ function isDirectPaymentOptionSelected(option, selectionState) {
34312
+ return selectionState.kind === "valid" && selectionState.selection.collectionOptionKind === option.kind;
34313
+ }
34194
34314
  var PaymentSelectionStep;
34195
34315
  var init_PaymentSelectionStep = __esm({
34196
34316
  "../blocks/src/system/runtime/nodes/event-registration/PaymentSelectionStep.tsx"() {
@@ -34219,8 +34339,28 @@ var init_PaymentSelectionStep = __esm({
34219
34339
  }) => {
34220
34340
  const occurrenceId = occurrenceContext?.id ?? event?.registrationOccurrenceId;
34221
34341
  const selectedMethod = selectedSelection.method;
34342
+ const totalPrice = eligibility?.price ? eligibility.price * ticketsCount : 0;
34343
+ const canShowDirectPaymentOptions = Boolean(
34344
+ eligibility?.eligible && eligibility.canPayDirectly && eligibility.price
34345
+ );
34346
+ const directPaymentOptions = eligibility && canShowDirectPaymentOptions ? buildEventRegistrationPaymentOptionsViewModel({
34347
+ eventTitle: event?.title ?? "Event",
34348
+ paymentTerms: event?.paymentTerms,
34349
+ totalPriceCents: totalPrice,
34350
+ currency: eligibility.currency,
34351
+ startsAt: occurrenceContext?.startsAt ?? event?.startsAt
34352
+ }).options : [];
34353
+ const directPaymentSelectionState = resolveEventRegistrationDirectPaymentSelection({
34354
+ options: directPaymentOptions,
34355
+ selection: selectedSelection
34356
+ });
34357
+ const directPaymentFallbackSelection = directPaymentSelectionState.kind === "invalid" ? directPaymentSelectionState.fallbackSelection : null;
34358
+ const directPaymentFallbackKind = directPaymentFallbackSelection?.collectionOptionKind;
34222
34359
  const canContinue = (() => {
34223
34360
  if (!selectedMethod) return false;
34361
+ if (selectedMethod === "stripe") {
34362
+ return directPaymentSelectionState.kind === "valid";
34363
+ }
34224
34364
  if (selectedMethod === "pass") return Boolean(selectedSelection.passId);
34225
34365
  if (selectedMethod === "membership")
34226
34366
  return Boolean(selectedSelection.membershipId);
@@ -34230,6 +34370,13 @@ var init_PaymentSelectionStep = __esm({
34230
34370
  return Boolean(selectedSelection.bundleMembershipId);
34231
34371
  return true;
34232
34372
  })();
34373
+ useEffect11(() => {
34374
+ if (!directPaymentFallbackKind) return;
34375
+ onSelectionChange({
34376
+ method: "stripe",
34377
+ collectionOptionKind: directPaymentFallbackKind
34378
+ });
34379
+ }, [directPaymentFallbackKind, onSelectionChange]);
34233
34380
  const getButtonText = useCallback6(() => {
34234
34381
  if (selectedMethod === "stripe") return "Continue to Payment";
34235
34382
  if (selectedMethod === "pass_bundle" || selectedMethod === "membership_bundle") {
@@ -34329,25 +34476,20 @@ var init_PaymentSelectionStep = __esm({
34329
34476
  ] }) })
34330
34477
  ] });
34331
34478
  }
34332
- const totalPrice = eligibility.price ? eligibility.price * ticketsCount : 0;
34333
- const directPaymentOptions = buildEventRegistrationPaymentOptionsViewModel({
34334
- eventTitle: event?.title ?? "Event",
34335
- paymentTerms: event?.paymentTerms,
34336
- totalPriceCents: totalPrice,
34337
- currency: eligibility.currency,
34338
- startsAt: occurrenceContext?.startsAt ?? event?.startsAt
34339
- }).options;
34340
34479
  const isMultiTicket = areEntitlementsDisabledForTicketCount(ticketsCount);
34341
34480
  return /* @__PURE__ */ jsxs59("div", { className: "er-stack", children: [
34342
34481
  /* @__PURE__ */ jsx82("h3", { className: "er-title", children: "Payment Options" }),
34343
34482
  /* @__PURE__ */ jsxs59("div", { className: "er-payment-tiles", children: [
34344
- eligibility.canPayDirectly && eligibility.price && /* @__PURE__ */ jsx82(Fragment13, { children: directPaymentOptions.map((option) => /* @__PURE__ */ jsx82(
34483
+ canShowDirectPaymentOptions && /* @__PURE__ */ jsx82(Fragment13, { children: directPaymentOptions.map((option) => /* @__PURE__ */ jsx82(
34345
34484
  PaymentTile,
34346
34485
  {
34347
34486
  icon: /* @__PURE__ */ jsx82(CreditCard, { size: 24, "aria-hidden": "true" }),
34348
34487
  label: option.label,
34349
34488
  detail: formatDirectPaymentOptionDetail(option),
34350
- selected: selectedMethod === "stripe" && (selectedSelection.collectionOptionKind ?? "upfront") === option.kind,
34489
+ selected: isDirectPaymentOptionSelected(
34490
+ option,
34491
+ directPaymentSelectionState
34492
+ ),
34351
34493
  onClick: () => onSelectionChange({
34352
34494
  method: "stripe",
34353
34495
  collectionOptionKind: option.kind
@@ -34872,6 +35014,24 @@ import { Fragment as Fragment16, jsx as jsx90, jsxs as jsxs65 } from "react/jsx-
34872
35014
  function isProductMethod(method) {
34873
35015
  return method !== null && ["pass", "membership", "pass_bundle", "membership_bundle"].includes(method);
34874
35016
  }
35017
+ function getSummaryRow(option, label) {
35018
+ return option.summaryRows.find((row) => row.label === label)?.value ?? null;
35019
+ }
35020
+ function getSelectedDirectPaymentOption(input) {
35021
+ const summaryEvent = input.wizard.selectedEvent ?? input.wizard.preSelectedEvent;
35022
+ if (!summaryEvent || input.wizard.paymentSelection.method !== "stripe") {
35023
+ return null;
35024
+ }
35025
+ const options = buildEventRegistrationPaymentOptionsViewModel({
35026
+ eventTitle: summaryEvent.title,
35027
+ paymentTerms: summaryEvent.paymentTerms,
35028
+ totalPriceCents: input.totalCents,
35029
+ currency: input.currency,
35030
+ startsAt: input.wizard.occurrenceContext?.startsAt ?? summaryEvent.startsAt
35031
+ }).options;
35032
+ const requestedKind = input.wizard.paymentSelection.collectionOptionKind ?? "upfront";
35033
+ return options.find((option) => option.kind === requestedKind) ?? options.find((option) => option.kind === "upfront") ?? options[0] ?? null;
35034
+ }
34875
35035
  function EventRegistrationSummaryBar(props2) {
34876
35036
  const { wizard } = props2;
34877
35037
  const summaryEvent = wizard.selectedEvent ?? wizard.preSelectedEvent;
@@ -34886,6 +35046,18 @@ function EventRegistrationSummaryBar(props2) {
34886
35046
  const autoAppliedDiscount = wizard.discountCode.trim().length > 0 ? null : wizard.autoAppliedDiscount;
34887
35047
  const autoAppliedDiscountCents = Math.max(0, autoAppliedDiscount?.computedAmountCents ?? 0);
34888
35048
  const discountedTotalCents = Math.max(0, subtotalCents - autoAppliedDiscountCents);
35049
+ const selectedDirectPaymentOption = getSelectedDirectPaymentOption({
35050
+ wizard,
35051
+ totalCents: discountedTotalCents,
35052
+ currency: summaryCurrency
35053
+ });
35054
+ const flexibleBalanceSummary = selectedDirectPaymentOption?.kind === "flexible_balance" ? {
35055
+ total: getSummaryRow(selectedDirectPaymentOption, "Total"),
35056
+ dueToday: getSummaryRow(selectedDirectPaymentOption, "Due today"),
35057
+ remainingBalance: getSummaryRow(selectedDirectPaymentOption, "Remaining balance"),
35058
+ balanceDueBy: getSummaryRow(selectedDirectPaymentOption, "Balance due by"),
35059
+ depositPolicy: getSummaryRow(selectedDirectPaymentOption, "Deposit policy")
35060
+ } : null;
34889
35061
  if (!summaryTitle) return null;
34890
35062
  const productMethod = isProductMethod(wizard.paymentSelection.method);
34891
35063
  return /* @__PURE__ */ jsxs65(Fragment16, { children: [
@@ -34929,6 +35101,22 @@ function EventRegistrationSummaryBar(props2) {
34929
35101
  summaryPrice > 0 && /* @__PURE__ */ jsx90("div", { className: "er-summary-bar-pricing", children: productMethod ? /* @__PURE__ */ jsxs65(Fragment16, { children: [
34930
35102
  /* @__PURE__ */ jsx90("span", { className: "er-summary-bar-price er-summary-bar-price--struck", children: formatPrice(summaryPrice * wizard.ticketsCount, summaryCurrency) }),
34931
35103
  /* @__PURE__ */ jsx90("div", { className: "er-summary-bar-included", children: wizard.paymentSelection.method === "pass" || wizard.paymentSelection.method === "pass_bundle" ? "1 pass credit" : "Included in membership" })
35104
+ ] }) : flexibleBalanceSummary ? /* @__PURE__ */ jsxs65(Fragment16, { children: [
35105
+ flexibleBalanceSummary.total ? /* @__PURE__ */ jsxs65("div", { className: "er-summary-bar-product-detail", children: [
35106
+ "Total: ",
35107
+ flexibleBalanceSummary.total
35108
+ ] }) : null,
35109
+ /* @__PURE__ */ jsx90("div", { className: "er-summary-bar-price", children: flexibleBalanceSummary.dueToday ?? formatPrice(discountedTotalCents, summaryCurrency) }),
35110
+ /* @__PURE__ */ jsx90("div", { className: "er-summary-bar-included", children: "Payable now" }),
35111
+ flexibleBalanceSummary.remainingBalance ? /* @__PURE__ */ jsxs65("div", { className: "er-summary-bar-product-detail", children: [
35112
+ "Remaining balance: ",
35113
+ flexibleBalanceSummary.remainingBalance,
35114
+ flexibleBalanceSummary.balanceDueBy ? ` due by ${flexibleBalanceSummary.balanceDueBy}` : ""
35115
+ ] }) : null,
35116
+ flexibleBalanceSummary.depositPolicy ? /* @__PURE__ */ jsxs65("div", { className: "er-summary-bar-product-detail", children: [
35117
+ "Deposit: ",
35118
+ flexibleBalanceSummary.depositPolicy
35119
+ ] }) : null
34932
35120
  ] }) : autoAppliedDiscount && autoAppliedDiscountCents > 0 ? /* @__PURE__ */ jsxs65(Fragment16, { children: [
34933
35121
  /* @__PURE__ */ jsx90("span", { className: "er-summary-bar-price er-summary-bar-price--struck", children: formatPrice(subtotalCents, summaryCurrency) }),
34934
35122
  /* @__PURE__ */ jsx90("div", { className: "er-summary-bar-price", children: formatPrice(discountedTotalCents, summaryCurrency) }),
@@ -34947,6 +35135,7 @@ var init_EventRegistrationSummaryBar = __esm({
34947
35135
  "use client";
34948
35136
  init_src();
34949
35137
  init_utils3();
35138
+ init_eventPaymentOptions();
34950
35139
  }
34951
35140
  });
34952
35141
 
@@ -39911,7 +40100,7 @@ var init_embla_carousel_autoplay_esm = __esm({
39911
40100
  function isObject(subject) {
39912
40101
  return Object.prototype.toString.call(subject) === "[object Object]";
39913
40102
  }
39914
- function isRecord8(subject) {
40103
+ function isRecord9(subject) {
39915
40104
  return isObject(subject) || Array.isArray(subject);
39916
40105
  }
39917
40106
  function canUseDOM() {
@@ -39928,7 +40117,7 @@ function areOptionsEqual(optionsA, optionsB) {
39928
40117
  const valueA = optionsA[key];
39929
40118
  const valueB = optionsB[key];
39930
40119
  if (typeof valueA === "function") return `${valueA}` === `${valueB}`;
39931
- if (!isRecord8(valueA) || !isRecord8(valueB)) return valueA === valueB;
40120
+ if (!isRecord9(valueA) || !isRecord9(valueB)) return valueA === valueB;
39932
40121
  return areOptionsEqual(valueA, valueB);
39933
40122
  });
39934
40123
  }
@@ -53705,7 +53894,7 @@ function renderCalendarSsr(display) {
53705
53894
  dayEvents.slice(0, MAX_EVENTS_PER_DAY).map((event) => /* @__PURE__ */ jsxs33(
53706
53895
  "a",
53707
53896
  {
53708
- href: event.path,
53897
+ ...resolveEventLinkProps(event),
53709
53898
  className: "event-calendar-event",
53710
53899
  title: `${event.title} at ${formatTime(event.startsAt, { timeZone: getEventTimeZone(event) })}`,
53711
53900
  children: [
@@ -53833,7 +54022,7 @@ function renderTimetableSsr(display) {
53833
54022
  day.events.length === 0 ? /* @__PURE__ */ jsx48("p", { className: "event-timetable-day-empty", children: "No classes" }) : day.events.map((cell) => /* @__PURE__ */ jsxs33(
53834
54023
  "a",
53835
54024
  {
53836
- href: cell.event.path,
54025
+ ...resolveEventLinkProps(cell.event),
53837
54026
  className: "event-timetable-event",
53838
54027
  title: `${cell.event.title}, ${cell.timeLabel}`,
53839
54028
  style: {
@@ -56315,7 +56504,7 @@ var MediaNode = ({
56315
56504
 
56316
56505
  // ../blocks/src/system/runtime/components/registry.client.tsx
56317
56506
  init_newsletter_form_client();
56318
- function isRecord9(value) {
56507
+ function isRecord10(value) {
56319
56508
  return typeof value === "object" && value !== null;
56320
56509
  }
56321
56510
  function buildRenderFromLooseProps(runtime, mode, props2) {
@@ -56335,14 +56524,14 @@ function withRuntimeBackedEnvelope(source, runtime, render) {
56335
56524
  function normalizeLegacyInteractiveRenderProps(runtime, mode, props2) {
56336
56525
  const source = props2;
56337
56526
  const render = props2["render"];
56338
- if (!isRecord9(render)) {
56527
+ if (!isRecord10(render)) {
56339
56528
  return withRuntimeBackedEnvelope(
56340
56529
  source,
56341
56530
  runtime,
56342
56531
  buildRenderFromLooseProps(runtime, mode, props2)
56343
56532
  );
56344
56533
  }
56345
- if (isRecord9(render["hydration"])) {
56534
+ if (isRecord10(render["hydration"])) {
56346
56535
  return withRuntimeBackedEnvelope(
56347
56536
  source,
56348
56537
  runtime,
@@ -56352,7 +56541,7 @@ function normalizeLegacyInteractiveRenderProps(runtime, mode, props2) {
56352
56541
  }
56353
56542
  );
56354
56543
  }
56355
- if (!isRecord9(render["display"])) {
56544
+ if (!isRecord10(render["display"])) {
56356
56545
  return withRuntimeBackedEnvelope(
56357
56546
  source,
56358
56547
  runtime,
@@ -1,5 +1,5 @@
1
1
  "use client";
2
- import { buildResolveImageUrlContext, setContextResolveImageUrlContext, unsafeAsMediaAssetId } from '../chunk-25W2EQUN.mjs';
2
+ import { buildResolveImageUrlContext, setContextResolveImageUrlContext, unsafeAsMediaAssetId } from '../chunk-3H5CLFKT.mjs';
3
3
  import { useEffect } from 'react';
4
4
 
5
5
  // src/rendering/islands/deferredVideoEmbeds.ts
@@ -80,24 +80,24 @@ function isSafeHttpsUrl(value) {
80
80
 
81
81
  // src/rendering/islands/hydrateBlocksIslands.ts
82
82
  var defaultEnhancerLoaders = {
83
- accordion: () => import('../accordion-GXQNWQ6O.mjs'),
84
- headerSection: () => import('../headerSection-QK5SLIIB.mjs'),
85
- carousel: () => import('../carousel-CVRN6EPP.mjs'),
86
- form: () => import('../form-ZS6KX4U2.mjs'),
87
- "booking-form": () => import('../bookingForm-STLUJ36H.mjs'),
88
- "event-registration": () => import('../eventRegistration-2ZHEDDXO.mjs'),
89
- "event-details": () => import('../eventDetails-YO335BUT.mjs'),
90
- "location-map": () => import('../locationMap-GFNIUD2X.mjs'),
91
- "course-registration": () => import('../courseRegistration-2D3ACMJR.mjs'),
92
- "event-listing": () => import('../eventListing-PXA6GFQ3.mjs'),
93
- "event-calendar": () => import('../eventCalendar-QY4UZUFF.mjs'),
94
- "event-combined": () => import('../eventCombined-RRCDKJC2.mjs'),
95
- "product-list": () => import('../productList-NI72Q62Z.mjs'),
96
- "product-detail": () => import('../productDetail-OPBE5ZPI.mjs'),
97
- "cart": () => import('../cart-IYIBA5CL.mjs'),
98
- "checkout": () => import('../checkout-O3BGM4GS.mjs'),
99
- shop: () => import('../shop-3ZQPEWYI.mjs'),
100
- "newsletter-form": () => import('../newsletterForm-PGLTTCUG.mjs')
83
+ accordion: () => import('../accordion-4K7VGZ3I.mjs'),
84
+ headerSection: () => import('../headerSection-UOZZGVYL.mjs'),
85
+ carousel: () => import('../carousel-BEJKNGQ7.mjs'),
86
+ form: () => import('../form-FX3Y54YK.mjs'),
87
+ "booking-form": () => import('../bookingForm-3QXA3CIS.mjs'),
88
+ "event-registration": () => import('../eventRegistration-37LPIKIE.mjs'),
89
+ "event-details": () => import('../eventDetails-CH4BJR5Z.mjs'),
90
+ "location-map": () => import('../locationMap-VSIPKV35.mjs'),
91
+ "course-registration": () => import('../courseRegistration-URX7RCCK.mjs'),
92
+ "event-listing": () => import('../eventListing-4BVOI5HS.mjs'),
93
+ "event-calendar": () => import('../eventCalendar-GTENOQCE.mjs'),
94
+ "event-combined": () => import('../eventCombined-EZVB72MF.mjs'),
95
+ "product-list": () => import('../productList-M2CYIZVH.mjs'),
96
+ "product-detail": () => import('../productDetail-6AHMLXCO.mjs'),
97
+ "cart": () => import('../cart-44BBM6XG.mjs'),
98
+ "checkout": () => import('../checkout-THMHEYKF.mjs'),
99
+ shop: () => import('../shop-AUOT6GEX.mjs'),
100
+ "newsletter-form": () => import('../newsletterForm-6FRJKNAF.mjs')
101
101
  };
102
102
  var DEFAULT_MAX_RETRIES = 2;
103
103
  var RETRY_DELAYS_MS = [250, 1e3];