@riverbankcms/sdk 0.90.0 → 0.91.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 (90) hide show
  1. package/dist/{PreviewEditorSidebar-KVXNF3VW.mjs → PreviewEditorSidebar-3TT47WCF.mjs} +3 -3
  2. package/dist/{PreviewEditorUI-J3JN5Z7T.mjs → PreviewEditorUI-ORCLLUNZ.mjs} +3 -3
  3. package/dist/SdkPreviewModeRuntime-GMCDQPZZ.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/manifest/fieldValidation/index.d.ts +17 -0
  17. package/dist/_dts/blocks/src/system/runtime/nodes/event-registration/event-registration.headless.contract.d.ts +5 -0
  18. package/dist/_dts/blocks/src/system/runtime/nodes/event-registration/eventPaymentOptions.d.ts +24 -0
  19. package/dist/_dts/blocks/src/system/runtime/nodes/events/shared/destination.d.ts +8 -0
  20. package/dist/_dts/blocks/src/system/runtime/nodes/events/shared/pricing.d.ts +3 -0
  21. package/dist/_dts/blocks/src/system/runtime/nodes/events/shared/utils.d.ts +7 -0
  22. package/dist/_dts/core/src/event-pricing.d.ts +12 -2
  23. package/dist/_dts/core/src/string.d.ts +12 -0
  24. package/dist/_dts/sdk/src/cli/sync/validation.d.ts +2 -2
  25. package/dist/_dts/sdk/src/public-api/contracts.d.ts +11 -1
  26. package/dist/_dts/sdk/src/rendering/islands/types.d.ts +11 -1
  27. package/dist/_dts/sdk/src/version.d.ts +1 -1
  28. package/dist/{chunk-GSPFFUVB.mjs → chunk-AFPMCLS7.mjs} +2 -2
  29. package/dist/{chunk-RQ3XZ4SJ.mjs → chunk-GDT2QGIL.mjs} +1 -1
  30. package/dist/{chunk-PMBB6MQ7.mjs → chunk-RQUZYSES.mjs} +345 -153
  31. package/dist/{chunk-AEOYWPE4.mjs → chunk-S3YHJWEU.mjs} +7 -7
  32. package/dist/{chunk-UG7I7S7W.mjs → chunk-U5YM4AWE.mjs} +1 -1
  33. package/dist/{chunk-BOQXMCSP.mjs → chunk-ZA2S7H34.mjs} +3 -3
  34. package/dist/cli/index.mjs +363 -437
  35. package/dist/cli/init-docs/content/workflow-add-block.md +48 -0
  36. package/dist/cli/init-docs/content/workflow-custom-block.md +10 -0
  37. package/dist/client/{accordion-GXQNWQ6O.mjs → accordion-AFX37652.mjs} +2 -2
  38. package/dist/client/{bookingForm-STLUJ36H.mjs → bookingForm-32V5QCOW.mjs} +6 -6
  39. package/dist/client/bookings.mjs +1170 -571
  40. package/dist/client/{carousel-CVRN6EPP.mjs → carousel-TJGQJ7ER.mjs} +3 -3
  41. package/dist/client/{cart-IYIBA5CL.mjs → cart-JUU2JEW4.mjs} +6 -6
  42. package/dist/client/{checkout-O3BGM4GS.mjs → checkout-RD6BTFX4.mjs} +6 -6
  43. package/dist/client/{chunk-DAS5CIER.mjs → chunk-6QZIBNGV.mjs} +119 -21
  44. package/dist/client/{chunk-VFHZLZAC.mjs → chunk-6RN62XBV.mjs} +1 -1
  45. package/dist/client/{chunk-D3ETC2SU.mjs → chunk-C4LP6BPG.mjs} +1 -1
  46. package/dist/client/{chunk-NBFRJ5NB.mjs → chunk-CKXEUWWA.mjs} +2 -2
  47. package/dist/client/{chunk-4RTFGHZN.mjs → chunk-E6VIWZUG.mjs} +6 -3
  48. package/dist/client/{chunk-Z62JYS5O.mjs → chunk-FMZZHAIR.mjs} +2 -2
  49. package/dist/client/{chunk-FHU6PFPM.mjs → chunk-ISAUXU5R.mjs} +1 -1
  50. package/dist/client/{chunk-HIHOQGIP.mjs → chunk-LJCX6V7Q.mjs} +9 -9
  51. package/dist/client/{chunk-6DPXDOIL.mjs → chunk-MLBNVN4H.mjs} +99 -26
  52. package/dist/client/{chunk-7DH35FGA.mjs → chunk-PMNAV6LO.mjs} +1 -1
  53. package/dist/client/{chunk-MFPKS6QS.mjs → chunk-RMOFBBNA.mjs} +5 -5
  54. package/dist/client/{chunk-25W2EQUN.mjs → chunk-RWYFG625.mjs} +17 -8
  55. package/dist/client/client.mjs +305 -113
  56. package/dist/client/{courseRegistration-2D3ACMJR.mjs → courseRegistration-X63QAIVV.mjs} +6 -6
  57. package/dist/client/{eventCalendar-QY4UZUFF.mjs → eventCalendar-5T24GCZL.mjs} +9 -9
  58. package/dist/client/{eventCombined-RRCDKJC2.mjs → eventCombined-AZVTF22X.mjs} +9 -9
  59. package/dist/client/{eventDetails-YO335BUT.mjs → eventDetails-7GPFNLGF.mjs} +9 -9
  60. package/dist/client/{eventListing-PXA6GFQ3.mjs → eventListing-QEUMTMUM.mjs} +9 -9
  61. package/dist/client/{eventRegistration-2ZHEDDXO.mjs → eventRegistration-P2EDKCQZ.mjs} +9 -9
  62. package/dist/client/{form-ZS6KX4U2.mjs → form-NUJ7H4IN.mjs} +3 -3
  63. package/dist/client/{headerSection-QK5SLIIB.mjs → headerSection-JB7LECPL.mjs} +3 -3
  64. package/dist/client/hooks.mjs +93 -42
  65. package/dist/client/{locationMap-GFNIUD2X.mjs → locationMap-UEYWUCSW.mjs} +3 -3
  66. package/dist/client/{newsletterForm-PGLTTCUG.mjs → newsletterForm-S2YZQ2X7.mjs} +3 -3
  67. package/dist/client/{productDetail-OPBE5ZPI.mjs → productDetail-H5MADGG7.mjs} +6 -6
  68. package/dist/client/{productList-NI72Q62Z.mjs → productList-DK7YON7H.mjs} +6 -6
  69. package/dist/client/rendering/client.mjs +262 -70
  70. package/dist/client/rendering/islands.mjs +19 -19
  71. package/dist/client/rendering.mjs +306 -114
  72. package/dist/client/{shop-3ZQPEWYI.mjs → shop-6PA7RDRJ.mjs} +6 -6
  73. package/dist/client/spam-protection.mjs +10 -10
  74. package/dist/preview-next/client/runtime.mjs +5 -5
  75. package/dist/{sdk-runtime-FSHXCWDS.mjs → sdk-runtime-JP5347OB.mjs} +6 -6
  76. package/dist/server/components.mjs +149 -69
  77. package/dist/server/config-validation.mjs +85 -34
  78. package/dist/server/config.mjs +85 -34
  79. package/dist/server/data.mjs +93 -42
  80. package/dist/server/index.mjs +1 -1
  81. package/dist/server/navigation.mjs +2 -2
  82. package/dist/server/next.mjs +170 -90
  83. package/dist/server/page-converter.mjs +77 -26
  84. package/dist/server/prebuild.mjs +1 -1
  85. package/dist/server/rendering/server.mjs +161 -81
  86. package/dist/server/rendering.mjs +165 -85
  87. package/dist/server/routing.mjs +135 -58
  88. package/dist/server/server.mjs +102 -51
  89. package/package.json +2 -2
  90. package/dist/SdkPreviewModeRuntime-UBL6MSNP.mjs +0 -8
@@ -6537,6 +6537,8 @@ function publicEventPricingType(pricing) {
6537
6537
  case "ticket_types":
6538
6538
  case "course":
6539
6539
  return isFreePublicEventPriceDisplay(pricing.display) ? "free" : "paid";
6540
+ case "external":
6541
+ return "external";
6540
6542
  }
6541
6543
  }
6542
6544
  function publicEventPricingCurrency(pricing) {
@@ -6548,6 +6550,8 @@ function publicEventPricingCurrency(pricing) {
6548
6550
  return pricing.currency;
6549
6551
  case "course":
6550
6552
  return pricing.display.display.currency;
6553
+ case "external":
6554
+ return null;
6551
6555
  }
6552
6556
  }
6553
6557
  function isFreePublicEventPriceDisplay(display) {
@@ -6561,6 +6565,7 @@ function isFreePublicEventPriceDisplay(display) {
6561
6565
  case "range":
6562
6566
  case "mixed":
6563
6567
  case "unavailable":
6568
+ case "external":
6564
6569
  return false;
6565
6570
  }
6566
6571
  }
@@ -6591,6 +6596,8 @@ function formatBookingPriceDisplay(display, options = {}) {
6591
6596
  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)}`;
6592
6597
  case "unavailable":
6593
6598
  return "Pricing unavailable";
6599
+ case "external":
6600
+ return display.label;
6594
6601
  case "course":
6595
6602
  return formatCoursePriceDisplayLabel(display.display, options);
6596
6603
  default:
@@ -6614,11 +6621,11 @@ function isValidTimeZone(timeZone) {
6614
6621
  }
6615
6622
  function getSafeTimeZone(timeZone) {
6616
6623
  const normalized = typeof timeZone === "string" ? timeZone.trim() : "";
6617
- return normalized && isValidTimeZone(normalized) ? normalized : FALLBACK_TIMEZONE;
6624
+ return normalized.length > 0 && isValidTimeZone(normalized) ? normalized : FALLBACK_TIMEZONE;
6618
6625
  }
6619
6626
  function parseStrictBookingTimeZone(timeZone) {
6620
6627
  const normalized = timeZone.trim();
6621
- if (!normalized || !isValidTimeZone(normalized)) {
6628
+ if (normalized.length === 0 || !isValidTimeZone(normalized)) {
6622
6629
  return null;
6623
6630
  }
6624
6631
  return normalized;
@@ -6695,7 +6702,7 @@ function parseScheduledBookingDateTime(input) {
6695
6702
  try {
6696
6703
  const startsAt = toUtcIsoDateTimeString(input.startsAt);
6697
6704
  const timeZone = parseStrictBookingTimeZone(input.timeZone);
6698
- if (!timeZone) {
6705
+ if (timeZone === null) {
6699
6706
  return {
6700
6707
  ok: false,
6701
6708
  field: "timeZone",
@@ -6830,10 +6837,10 @@ function normalizeLocationAddressText(value) {
6830
6837
  return null;
6831
6838
  }
6832
6839
  const trimmed = value.trim();
6833
- return trimmed ? trimmed : null;
6840
+ return trimmed.length > 0 ? trimmed : null;
6834
6841
  }
6835
6842
  function hasLocationCoordinates(value) {
6836
- return typeof value?.lat === "number" && typeof value?.lng === "number";
6843
+ return value != null && typeof value.lat === "number" && typeof value.lng === "number";
6837
6844
  }
6838
6845
  function toLocationCoordinates(value) {
6839
6846
  if (!hasLocationCoordinates(value)) {
@@ -32926,6 +32933,18 @@ var publicCoursesArraySchema = z45.array(publicCourseSchema);
32926
32933
  var eventPresetSchema = z46.enum(["event", "class", "workshop", "retreat", "performance"]);
32927
32934
  var eventScheduleScopeSchema = z46.enum(["recurring", "oneOff"]);
32928
32935
  var eventDestinationModeSchema = z46.enum(["cms-managed", "system-managed"]);
32936
+ var publicEventDestinationSchema = z46.discriminatedUnion("kind", [
32937
+ z46.object({
32938
+ kind: z46.literal("native"),
32939
+ mode: eventDestinationModeSchema,
32940
+ path: z46.string()
32941
+ }),
32942
+ z46.object({
32943
+ kind: z46.literal("external"),
32944
+ url: z46.string(),
32945
+ label: z46.string()
32946
+ })
32947
+ ]);
32929
32948
  var eventVenueSchema = z46.object({
32930
32949
  id: z46.string(),
32931
32950
  name: z46.string(),
@@ -32940,7 +32959,7 @@ var eventCategorySchema = z46.object({
32940
32959
  name: z46.string(),
32941
32960
  color: z46.string().nullable()
32942
32961
  });
32943
- var pricingTypeSchema = z46.enum(["free", "paid"]);
32962
+ var pricingTypeSchema = z46.enum(["free", "paid", "external"]);
32944
32963
  var accessRestrictionSchema = z46.enum(["none", "category"]);
32945
32964
  var eventPricingModeSchema = z46.enum(["single", "ticket_types"]);
32946
32965
  var publicCoursePriceDisplaySchema = z46.discriminatedUnion("kind", [
@@ -32961,6 +32980,7 @@ var publicEventPriceDisplaySchema = z46.discriminatedUnion("kind", [
32961
32980
  currency: z46.string()
32962
32981
  }),
32963
32982
  z46.object({ kind: z46.literal("unavailable"), currency: z46.string() }),
32983
+ z46.object({ kind: z46.literal("external"), label: z46.string() }),
32964
32984
  z46.object({ kind: z46.literal("course"), display: publicCoursePriceDisplaySchema })
32965
32985
  ]);
32966
32986
  var publicEventTicketTypePriceDisplaySchema = z46.union([
@@ -33039,6 +33059,10 @@ var publicEventPricingSchema = z46.discriminatedUnion("kind", [
33039
33059
  z46.object({
33040
33060
  kind: z46.literal("course"),
33041
33061
  display: z46.object({ kind: z46.literal("course"), display: publicCoursePriceDisplaySchema })
33062
+ }),
33063
+ z46.object({
33064
+ kind: z46.literal("external"),
33065
+ display: z46.object({ kind: z46.literal("external"), label: z46.string() })
33042
33066
  })
33043
33067
  ]);
33044
33068
  var publicTeamMemberSummarySchema = z46.object({
@@ -33067,7 +33091,8 @@ var publicEventSchema = z46.object({
33067
33091
  image: mediaSchema2.nullable().optional()
33068
33092
  }).optional(),
33069
33093
  slug: z46.string(),
33070
- path: z46.string(),
33094
+ path: z46.string().nullable(),
33095
+ destination: publicEventDestinationSchema,
33071
33096
  requiresRegistration: z46.boolean(),
33072
33097
  deliveryMode: z46.enum(["in_person", "online", "hybrid"]),
33073
33098
  attendanceModes: z46.array(publicEventAttendanceModeAvailabilitySchema),
@@ -33371,12 +33396,41 @@ function isEventContentType(slug) {
33371
33396
  return EVENT_CONTENT_TYPE_SLUGS.includes(slug);
33372
33397
  }
33373
33398
 
33399
+ // ../blocks/src/system/runtime/nodes/events/shared/destination.ts
33400
+ function isRecord5(value) {
33401
+ return typeof value === "object" && value !== null && !Array.isArray(value);
33402
+ }
33403
+ function isRuntimeEventDestination(value) {
33404
+ if (!isRecord5(value) || typeof value.kind !== "string") return false;
33405
+ if (value.kind === "native") {
33406
+ return (value.mode === "cms-managed" || value.mode === "system-managed") && typeof value.path === "string";
33407
+ }
33408
+ return value.kind === "external" && typeof value.url === "string" && typeof value.label === "string";
33409
+ }
33410
+ function resolveRuntimeEventDestination(event) {
33411
+ if (isRuntimeEventDestination(event.destination)) {
33412
+ return event.destination;
33413
+ }
33414
+ return {
33415
+ kind: "native",
33416
+ mode: event.eventDestinationMode === "system-managed" ? "system-managed" : "cms-managed",
33417
+ path: typeof event.path === "string" ? event.path : ""
33418
+ };
33419
+ }
33420
+
33374
33421
  // ../blocks/src/system/runtime/nodes/events/shared/pricing.ts
33375
33422
  var DEFAULT_EVENT_CURRENCY = "USD";
33376
33423
  function resolveRuntimeEventPricing(event) {
33377
33424
  if (isPublicEventPricing(event.pricing)) {
33378
33425
  return event.pricing;
33379
33426
  }
33427
+ const destination = resolveRuntimeEventDestination(event);
33428
+ if (destination.kind === "external") {
33429
+ return {
33430
+ kind: "external",
33431
+ display: { kind: "external", label: "External registration" }
33432
+ };
33433
+ }
33380
33434
  const legacy = event;
33381
33435
  const currency = readCurrency(legacy.currency);
33382
33436
  if (event.requiresRegistration === false) {
@@ -33413,22 +33467,22 @@ function resolveRuntimeEventPricing(event) {
33413
33467
  function readCurrency(value) {
33414
33468
  return typeof value === "string" && value.trim().length > 0 ? value : DEFAULT_EVENT_CURRENCY;
33415
33469
  }
33416
- function isRecord5(value) {
33470
+ function isRecord6(value) {
33417
33471
  return typeof value === "object" && value !== null && !Array.isArray(value);
33418
33472
  }
33419
33473
  function isPublicEventPricing(value) {
33420
- if (!isRecord5(value) || typeof value.kind !== "string") return false;
33421
- return value.kind === "drop_in" || value.kind === "free_registration" || value.kind === "single_paid" || value.kind === "ticket_types" || value.kind === "course";
33474
+ if (!isRecord6(value) || typeof value.kind !== "string") return false;
33475
+ return value.kind === "drop_in" || value.kind === "free_registration" || value.kind === "single_paid" || value.kind === "ticket_types" || value.kind === "course" || value.kind === "external";
33422
33476
  }
33423
33477
  function isPublicEventTicketType(value) {
33424
- return isRecord5(value) && typeof value.id === "string";
33478
+ return isRecord6(value) && typeof value.id === "string";
33425
33479
  }
33426
33480
  function readTicketTypePriceDisplay(value, currency) {
33427
33481
  const display = readLegacyPriceDisplay(value, currency);
33428
- return display.kind === "course" ? { kind: "unavailable", currency } : display;
33482
+ return display.kind === "course" || display.kind === "external" ? { kind: "unavailable", currency } : display;
33429
33483
  }
33430
33484
  function readLegacyPriceDisplay(value, currency) {
33431
- if (!isRecord5(value) || typeof value.kind !== "string") {
33485
+ if (!isRecord6(value) || typeof value.kind !== "string") {
33432
33486
  return { kind: "unavailable", currency };
33433
33487
  }
33434
33488
  const displayCurrency = readCurrency(value.currency);
@@ -33467,7 +33521,7 @@ function readLegacyPriceDisplay(value, currency) {
33467
33521
  case "unavailable":
33468
33522
  return { kind: "unavailable", currency: displayCurrency };
33469
33523
  case "course":
33470
- return isRecord5(value.display) ? {
33524
+ return isRecord6(value.display) ? {
33471
33525
  kind: "course",
33472
33526
  display: readCoursePriceDisplay(value.display, displayCurrency)
33473
33527
  } : {
@@ -33554,7 +33608,7 @@ function resolveEventRequiresPayment(input) {
33554
33608
  if (!input.event) {
33555
33609
  return false;
33556
33610
  }
33557
- return publicEventPricingType(resolveRuntimeEventPricing(input.event)) !== "free";
33611
+ return publicEventPricingType(resolveRuntimeEventPricing(input.event)) === "paid";
33558
33612
  }
33559
33613
 
33560
33614
  // ../blocks/src/system/runtime/nodes/event-registration/registrationEventAdapter.ts
@@ -33751,15 +33805,16 @@ var eventRegistrationBlockRuntime = defineClientOwnedBlockRuntime({
33751
33805
  })
33752
33806
  });
33753
33807
  function normalizeEventRegistrationEventInput(value) {
33754
- if (!isRecord6(value)) {
33808
+ if (!isRecord7(value)) {
33755
33809
  return value;
33756
33810
  }
33757
33811
  return {
33758
33812
  ...value,
33813
+ destination: resolveRuntimeEventDestination(value),
33759
33814
  pricing: resolveRuntimeEventPricing(value)
33760
33815
  };
33761
33816
  }
33762
- function isRecord6(value) {
33817
+ function isRecord7(value) {
33763
33818
  return typeof value === "object" && value !== null && !Array.isArray(value);
33764
33819
  }
33765
33820
  var eventRegistrationInteractiveIslandPropsCodec = createInteractiveIslandCodec({
@@ -35028,7 +35083,7 @@ function formatCalendarTitle(viewDate, view, days, monthNames = MONTH_NAMES) {
35028
35083
  if (view === "week") {
35029
35084
  const weekStart = days[0];
35030
35085
  const weekEnd = days[6];
35031
- if (!weekStart || !weekEnd) {
35086
+ if (weekStart === void 0 || weekEnd === void 0) {
35032
35087
  return `${monthNames[viewDate.getMonth()] ?? ""} ${viewDate.getFullYear()}`;
35033
35088
  }
35034
35089
  const startMonth = monthNames[weekStart.getMonth()] ?? "";
@@ -35134,7 +35189,9 @@ function getLocalDateKey(isoTimestamp, timeZone) {
35134
35189
  const year = parts.find((part) => part.type === "year")?.value;
35135
35190
  const month = parts.find((part) => part.type === "month")?.value;
35136
35191
  const day = parts.find((part) => part.type === "day")?.value;
35137
- if (!year || !month || !day) return null;
35192
+ if (year === void 0 || year.length === 0) return null;
35193
+ if (month === void 0 || month.length === 0) return null;
35194
+ if (day === void 0 || day.length === 0) return null;
35138
35195
  return `${year}-${month}-${day}`;
35139
35196
  }
35140
35197
  var validTimeZoneCache = /* @__PURE__ */ new Map();
@@ -35391,7 +35448,7 @@ function enumerateDateKeys(startDateKey, endDateKey) {
35391
35448
  }
35392
35449
  function parseDateKey(dateKey) {
35393
35450
  const match = /^(\d{4})-(\d{2})-(\d{2})$/.exec(dateKey);
35394
- if (!match) {
35451
+ if (match === null) {
35395
35452
  throw new Error(`Invalid timetable date key: ${dateKey}`);
35396
35453
  }
35397
35454
  const [, year, month, day] = match;
@@ -35411,7 +35468,7 @@ function groupItemsByDate(items, accessors) {
35411
35468
  const dateKey = getLocalDateKey(startsAt, timeZone);
35412
35469
  if (dateKey == null) continue;
35413
35470
  const existing = grouped.get(dateKey);
35414
- if (existing) {
35471
+ if (existing !== void 0) {
35415
35472
  existing.push(item);
35416
35473
  } else {
35417
35474
  grouped.set(dateKey, [item]);
@@ -35552,16 +35609,28 @@ function groupEventsByDate(events) {
35552
35609
  function formatEventPrice(event) {
35553
35610
  return formatEventPricing(resolveRuntimeEventPricing(event), { decimals: "auto" });
35554
35611
  }
35612
+ function resolveEventHref(event) {
35613
+ const destination = resolveRuntimeEventDestination(event);
35614
+ return destination.kind === "external" ? destination.url : destination.path;
35615
+ }
35616
+ function resolveEventLinkProps(event) {
35617
+ const href = resolveEventHref(event);
35618
+ const destination = resolveRuntimeEventDestination(event);
35619
+ return destination.kind === "external" ? { href, target: "_blank", rel: "noopener noreferrer" } : { href };
35620
+ }
35555
35621
  function resolveEventCta(event, buttonText) {
35556
35622
  const { isFull: isSoldOut } = getEventAvailability(event);
35557
- const defaultButtonText = event.kind === "course_session" ? "Book course" : "Book";
35623
+ const destination = resolveRuntimeEventDestination(event);
35624
+ const isExternal = destination.kind === "external";
35625
+ const defaultButtonText = isExternal ? destination.label : event.kind === "course_session" ? "Book course" : "Book";
35558
35626
  const effectiveButtonText = buttonText ?? defaultButtonText;
35559
- if (isSoldOut) {
35560
- return { label: "Sold out", href: event.path, hidden: true };
35627
+ const href = resolveEventHref(event);
35628
+ if (!isExternal && isSoldOut) {
35629
+ return { label: "Sold out", href, external: false, hidden: true };
35561
35630
  }
35562
35631
  const enrollmentOpen = event.kind === "course_session" ? event.course?.enrollmentOpen !== false : true;
35563
35632
  const label = !enrollmentOpen ? "Registration closed" : effectiveButtonText;
35564
- return { label, href: event.path, hidden: false };
35633
+ return { label, href, external: isExternal, hidden: false };
35565
35634
  }
35566
35635
 
35567
35636
  // ../../node_modules/.pnpm/clsx@2.1.1/node_modules/clsx/dist/clsx.mjs
@@ -36996,6 +37065,8 @@ var EventCard = ({
36996
37065
  "a",
36997
37066
  {
36998
37067
  href: cta.href,
37068
+ target: cta.external ? "_blank" : void 0,
37069
+ rel: cta.external ? "noopener noreferrer" : void 0,
36999
37070
  className: `${buttonClass} event-card-cta`,
37000
37071
  children: cta.label
37001
37072
  }
@@ -37085,10 +37156,19 @@ var EventCompactRow = ({
37085
37156
  formattedTime,
37086
37157
  /* @__PURE__ */ jsx8("span", { className: "event-compact-row-action-price", children: price })
37087
37158
  ] }),
37088
- cta.hidden ? /* @__PURE__ */ jsx8("span", { className: "event-compact-row-status", children: cta.label }) : /* @__PURE__ */ jsxs6("a", { href: cta.href, className: `${buttonClass} event-compact-row-cta`, children: [
37089
- /* @__PURE__ */ jsx8("span", { children: cta.label }),
37090
- /* @__PURE__ */ jsx8(ArrowRightIcon, { "aria-hidden": "true" })
37091
- ] })
37159
+ cta.hidden ? /* @__PURE__ */ jsx8("span", { className: "event-compact-row-status", children: cta.label }) : /* @__PURE__ */ jsxs6(
37160
+ "a",
37161
+ {
37162
+ href: cta.href,
37163
+ target: cta.external ? "_blank" : void 0,
37164
+ rel: cta.external ? "noopener noreferrer" : void 0,
37165
+ className: `${buttonClass} event-compact-row-cta`,
37166
+ children: [
37167
+ /* @__PURE__ */ jsx8("span", { children: cta.label }),
37168
+ /* @__PURE__ */ jsx8(ArrowRightIcon, { "aria-hidden": "true" })
37169
+ ]
37170
+ }
37171
+ )
37092
37172
  ] })
37093
37173
  ] })
37094
37174
  ] });
@@ -38678,7 +38758,7 @@ function inferLegacyOfferingsPreviewGroupOrder(overrides) {
38678
38758
  return keys.length >= 2 ? keys : [];
38679
38759
  }
38680
38760
  function normalizeOfferingsPreviewContentForWrite(value) {
38681
- if (!isRecord7(value)) return null;
38761
+ if (!isRecord8(value)) return null;
38682
38762
  const groupOrderValue = value.groupOrder;
38683
38763
  if (Array.isArray(groupOrderValue)) {
38684
38764
  const normalized = normalizeOfferingsPreviewGroupOrder(groupOrderValue);
@@ -38691,7 +38771,7 @@ function normalizeOfferingsPreviewContentForWrite(value) {
38691
38771
  return { ...value, groupOrder: [] };
38692
38772
  }
38693
38773
  const legacyOrder = inferLegacyOfferingsPreviewGroupOrder(
38694
- Array.isArray(value.groupOverrides) ? value.groupOverrides.filter(isRecord7) : []
38774
+ Array.isArray(value.groupOverrides) ? value.groupOverrides.filter(isRecord8) : []
38695
38775
  );
38696
38776
  return legacyOrder.length > 0 ? { ...value, groupOrder: legacyOrder } : value;
38697
38777
  }
@@ -38745,7 +38825,7 @@ function uniqueOfferingsPreviewSourceKeys(values) {
38745
38825
  }
38746
38826
  return keys;
38747
38827
  }
38748
- function isRecord7(value) {
38828
+ function isRecord8(value) {
38749
38829
  return typeof value === "object" && value !== null && !Array.isArray(value);
38750
38830
  }
38751
38831
  function mergeOrderedKeysWithDefaults(orderedKeys, defaultKeys) {
@@ -39207,7 +39287,7 @@ function isOfferingsPreviewItemLimit(value) {
39207
39287
  return value === "1" || value === "2" || value === "3" || value === "4" || value === "5" || value === "6" || value === null;
39208
39288
  }
39209
39289
  function normalizeOfferingsPreviewGroupOverride(value) {
39210
- if (!isRecord8(value)) return [];
39290
+ if (!isRecord9(value)) return [];
39211
39291
  const override = {};
39212
39292
  if (isOfferingsPreviewSourceKey(value.sourceKey) || value.sourceKey === null) {
39213
39293
  override.sourceKey = value.sourceKey;
@@ -39239,12 +39319,12 @@ function isButtonVariant(value) {
39239
39319
  return value === "primary" || value === "secondary" || value === "outline" || value === "link" || value === null;
39240
39320
  }
39241
39321
  function normalizeCardStylesContent(value) {
39242
- return isRecord8(value) || value === null ? value : void 0;
39322
+ return isRecord9(value) || value === null ? value : void 0;
39243
39323
  }
39244
39324
  function normalizeSectionStylesContent(value) {
39245
- return isRecord8(value) || value === null ? value : void 0;
39325
+ return isRecord9(value) || value === null ? value : void 0;
39246
39326
  }
39247
- function isRecord8(value) {
39327
+ function isRecord9(value) {
39248
39328
  return typeof value === "object" && value !== null && !Array.isArray(value);
39249
39329
  }
39250
39330
 
@@ -42410,7 +42490,7 @@ function deriveNewsletterSignupRuntimeSource(values) {
42410
42490
  };
42411
42491
  }
42412
42492
  function sanitizeNewsletterSignupPublicContent(content) {
42413
- if (!isRecord9(content)) return content;
42493
+ if (!isRecord10(content)) return content;
42414
42494
  const provider = parseNewsletterSignupDestinationProvider(content.destinationProvider) ?? getProviderFromExplicitDestination(content.destination);
42415
42495
  const {
42416
42496
  destination: _destination,
@@ -42429,7 +42509,7 @@ function sanitizeNewsletterSignupPublicContent(content) {
42429
42509
  return mutablePublicContent;
42430
42510
  }
42431
42511
  function getProviderFromExplicitDestination(destination) {
42432
- if (!isRecord9(destination) || typeof destination.tag !== "string") return null;
42512
+ if (!isRecord10(destination) || typeof destination.tag !== "string") return null;
42433
42513
  if (destination.tag === "riverbank_list") return "riverbank";
42434
42514
  if (destination.tag === "mailchimp_audience") return "mailchimp";
42435
42515
  return null;
@@ -42441,7 +42521,7 @@ function parseTrimmedString(value) {
42441
42521
  const trimmed = value.trim();
42442
42522
  return trimmed.length > 0 ? trimmed : null;
42443
42523
  }
42444
- function isRecord9(value) {
42524
+ function isRecord10(value) {
42445
42525
  return typeof value === "object" && value !== null;
42446
42526
  }
42447
42527
 
@@ -44484,11 +44564,11 @@ function extractRouteUpdatedAt(candidate) {
44484
44564
  }
44485
44565
  function resolveRouteTargetForStage(routeIdValue, routes, stageInput) {
44486
44566
  const routeId = typeof routeIdValue === "string" ? routeIdValue : null;
44487
- if (!routeId || !routes) return null;
44567
+ if (routeId === null || routeId.length === 0 || routes === void 0) return null;
44488
44568
  const routeEntry = routes[routeId];
44489
44569
  if (!isRouteVisibleInStage(routeEntry, stageInput)) return null;
44490
44570
  const href = extractRouteHref(routeEntry, stageInput);
44491
- if (!href) return null;
44571
+ if (href === null) return null;
44492
44572
  return {
44493
44573
  routeId,
44494
44574
  href,
@@ -44637,7 +44717,7 @@ import React4 from "react";
44637
44717
  // ../blocks/src/system/data/linkedContentEntries.ts
44638
44718
  var LINKED_CONTENT_ENTRY_META_KEY = "__rbLinkedContentEntry";
44639
44719
  function coerceLinkedContentEntriesPayload(payload) {
44640
- if (!isRecord10(payload)) return payload;
44720
+ if (!isRecord11(payload)) return payload;
44641
44721
  const response = payload;
44642
44722
  if (!Array.isArray(response.entries)) return payload;
44643
44723
  const contentType = parsePublicContentTypeMeta(response.contentType);
@@ -44645,16 +44725,16 @@ function coerceLinkedContentEntriesPayload(payload) {
44645
44725
  return response.entries.map((entry) => enrichLinkedContentEntry(entry, contentType));
44646
44726
  }
44647
44727
  function getLinkedContentEntryMeta(value) {
44648
- if (!isRecord10(value)) return null;
44728
+ if (!isRecord11(value)) return null;
44649
44729
  const candidate = value[LINKED_CONTENT_ENTRY_META_KEY];
44650
44730
  return isLinkedContentEntryMeta(candidate) ? candidate : null;
44651
44731
  }
44652
44732
  function buildLinkedContentEditTarget(input) {
44653
44733
  const { entry, sourceBlockId, sourceBlockKind, itemIndex } = input;
44654
- if (!isRecord10(entry)) return null;
44734
+ if (!isRecord11(entry)) return null;
44655
44735
  const meta = getLinkedContentEntryMeta(entry);
44656
44736
  if (!meta || meta.support.kind !== "supported") return null;
44657
- const content = isRecord10(entry.content) ? entry.content : {};
44737
+ const content = isRecord11(entry.content) ? entry.content : {};
44658
44738
  return {
44659
44739
  kind: "linked-content-entry",
44660
44740
  entryId: meta.entryId,
@@ -44704,12 +44784,12 @@ function resolveLinkedEntryInlineFieldEligibility(input) {
44704
44784
  };
44705
44785
  }
44706
44786
  function enrichLinkedContentEntry(entry, contentType) {
44707
- if (!isRecord10(entry)) return entry;
44787
+ if (!isRecord11(entry)) return entry;
44708
44788
  const entryId = typeof entry.id === "string" ? entry.id : null;
44709
44789
  if (!entryId) return entry;
44710
44790
  const title = typeof entry.title === "string" && entry.title.trim().length > 0 ? entry.title : entryId;
44711
44791
  const optimisticHash = typeof entry.optimisticHash === "string" && entry.optimisticHash.length > 0 ? entry.optimisticHash : null;
44712
- const content = isRecord10(entry.content) ? entry.content : {};
44792
+ const content = isRecord11(entry.content) ? entry.content : {};
44713
44793
  const meta = {
44714
44794
  kind: "linked-content-entry",
44715
44795
  entryId,
@@ -44805,7 +44885,7 @@ function capitalize(value) {
44805
44885
  return value.charAt(0).toUpperCase() + value.slice(1).toLowerCase();
44806
44886
  }
44807
44887
  function parsePublicContentTypeMeta(value) {
44808
- if (!isRecord10(value)) return null;
44888
+ if (!isRecord11(value)) return null;
44809
44889
  if (typeof value.key !== "string" || value.key.trim().length === 0) return null;
44810
44890
  return {
44811
44891
  key: value.key,
@@ -44815,7 +44895,7 @@ function parsePublicContentTypeMeta(value) {
44815
44895
  };
44816
44896
  }
44817
44897
  function parsePublicContentTypeLinkedEntryEditing(value) {
44818
- if (!isRecord10(value) || typeof value.kind !== "string") return null;
44898
+ if (!isRecord11(value) || typeof value.kind !== "string") return null;
44819
44899
  switch (value.kind) {
44820
44900
  case "generic":
44821
44901
  return { kind: "generic" };
@@ -44829,7 +44909,7 @@ function parsePublicContentTypeLinkedEntryEditing(value) {
44829
44909
  }
44830
44910
  }
44831
44911
  function parsePublicContentTypeFieldMeta(value) {
44832
- if (!isRecord10(value)) return [];
44912
+ if (!isRecord11(value)) return [];
44833
44913
  if (typeof value.id !== "string" || typeof value.type !== "string") return [];
44834
44914
  return [{
44835
44915
  id: value.id,
@@ -44844,14 +44924,14 @@ function parseStringArray(value) {
44844
44924
  return value.filter((item) => typeof item === "string");
44845
44925
  }
44846
44926
  function isLinkedContentEntryMeta(value) {
44847
- if (!isRecord10(value)) return false;
44927
+ if (!isRecord11(value)) return false;
44848
44928
  if (value.kind !== "linked-content-entry") return false;
44849
44929
  if (typeof value.entryId !== "string") return false;
44850
44930
  if (typeof value.contentTypeKey !== "string") return false;
44851
44931
  if (typeof value.contentTypeLabel !== "string") return false;
44852
44932
  if (typeof value.title !== "string") return false;
44853
44933
  if (!(value.optimisticHash === null || typeof value.optimisticHash === "string")) return false;
44854
- if (!isRecord10(value.contentType)) return false;
44934
+ if (!isRecord11(value.contentType)) return false;
44855
44935
  if (!isLinkedEntryFieldSourceArray(value.fieldSources)) return false;
44856
44936
  return isLinkedContentEditSupport(value.support);
44857
44937
  }
@@ -44859,7 +44939,7 @@ function isLinkedEntryFieldSourceArray(value) {
44859
44939
  return Array.isArray(value) && value.every(isLinkedEntryFieldSource);
44860
44940
  }
44861
44941
  function isLinkedEntryFieldSource(value) {
44862
- if (!isRecord10(value)) return false;
44942
+ if (!isRecord11(value)) return false;
44863
44943
  if (typeof value.displayPath !== "string") return false;
44864
44944
  switch (value.kind) {
44865
44945
  case "content-field":
@@ -44885,7 +44965,7 @@ function isLinkedEntryInlineFieldReadOnlyReason(value) {
44885
44965
  }
44886
44966
  }
44887
44967
  function isLinkedContentEditSupport(value) {
44888
- if (!isRecord10(value) || typeof value.kind !== "string") return false;
44968
+ if (!isRecord11(value) || typeof value.kind !== "string") return false;
44889
44969
  switch (value.kind) {
44890
44970
  case "supported":
44891
44971
  return true;
@@ -44897,7 +44977,7 @@ function isLinkedContentEditSupport(value) {
44897
44977
  return false;
44898
44978
  }
44899
44979
  }
44900
- function isRecord10(value) {
44980
+ function isRecord11(value) {
44901
44981
  return typeof value === "object" && value !== null && !Array.isArray(value);
44902
44982
  }
44903
44983
 
@@ -46353,12 +46433,12 @@ function toTrimmedString(value) {
46353
46433
  return trimmed ? trimmed : void 0;
46354
46434
  }
46355
46435
  function normalizeBookingFormConfig(form2) {
46356
- if (!isRecord11(form2)) return null;
46436
+ if (!isRecord12(form2)) return null;
46357
46437
  const id = readNonEmptyString(form2.id);
46358
46438
  const name = readNonEmptyString(form2.name);
46359
46439
  if (!id || !name) return null;
46360
- const schemaSource = isRecord11(form2.schema) ? form2.schema : isRecord11(form2.schemaJson) ? form2.schemaJson : null;
46361
- const settingsSource = isRecord11(form2.settings) ? form2.settings : isRecord11(form2.settingsJson) ? form2.settingsJson : null;
46440
+ const schemaSource = isRecord12(form2.schema) ? form2.schema : isRecord12(form2.schemaJson) ? form2.schemaJson : null;
46441
+ const settingsSource = isRecord12(form2.settings) ? form2.settings : isRecord12(form2.settingsJson) ? form2.settingsJson : null;
46362
46442
  return {
46363
46443
  id,
46364
46444
  name,
@@ -46382,10 +46462,10 @@ function normalizeBookingServices(services) {
46382
46462
  if (Array.isArray(services)) {
46383
46463
  return services.filter(isBookingFormService).map(normalizeService);
46384
46464
  }
46385
- if (isRecord11(services) && "services" in services) {
46465
+ if (isRecord12(services) && "services" in services) {
46386
46466
  return Array.isArray(services.services) ? services.services.filter(isBookingFormService).map(normalizeService) : [];
46387
46467
  }
46388
- return isRecord11(services) ? Object.values(services).filter(isBookingFormService).map(normalizeService) : [];
46468
+ return isRecord12(services) ? Object.values(services).filter(isBookingFormService).map(normalizeService) : [];
46389
46469
  }
46390
46470
  function normalizeBookingSchema(value) {
46391
46471
  if (!value) return void 0;
@@ -46397,7 +46477,7 @@ function normalizeBookingSchema(value) {
46397
46477
  };
46398
46478
  }
46399
46479
  function readBookingFormField(value) {
46400
- if (!isRecord11(value)) return null;
46480
+ if (!isRecord12(value)) return null;
46401
46481
  const id = readNonEmptyString(value.id);
46402
46482
  const label = readNonEmptyString(value.label);
46403
46483
  const type = readBookingFieldType(value.type);
@@ -46443,7 +46523,7 @@ function readBookingFieldOptions(value) {
46443
46523
  return options.length > 0 ? options : void 0;
46444
46524
  }
46445
46525
  function readBookingFieldOption(value) {
46446
- if (!isRecord11(value)) return null;
46526
+ if (!isRecord12(value)) return null;
46447
46527
  const optionValue = readNonEmptyString(value.value);
46448
46528
  const label = readNonEmptyString(value.label);
46449
46529
  return optionValue && label ? { value: optionValue, label } : null;
@@ -46460,7 +46540,7 @@ function normalizeBookingSettings(value) {
46460
46540
  };
46461
46541
  }
46462
46542
  function isBookingFormService(value) {
46463
- return isRecord11(value) && typeof value.id === "string" && typeof value.siteId === "string" && typeof value.title === "string";
46543
+ return isRecord12(value) && typeof value.id === "string" && typeof value.siteId === "string" && typeof value.title === "string";
46464
46544
  }
46465
46545
  function readNonEmptyString(value) {
46466
46546
  if (typeof value !== "string") return null;
@@ -46478,7 +46558,7 @@ function readStringArray(value) {
46478
46558
  const strings = value.filter((item) => typeof item === "string");
46479
46559
  return strings.length > 0 ? strings : void 0;
46480
46560
  }
46481
- function isRecord11(value) {
46561
+ function isRecord12(value) {
46482
46562
  return typeof value === "object" && value !== null;
46483
46563
  }
46484
46564
 
@@ -47036,7 +47116,7 @@ function EventDetailsView({
47036
47116
  "a",
47037
47117
  {
47038
47118
  className: "rb-tile rb-tile--interactive",
47039
- href: e.path,
47119
+ ...resolveEventLinkProps(e),
47040
47120
  children: /* @__PURE__ */ jsx30(
47041
47121
  DateTimeTile,
47042
47122
  {
@@ -48720,7 +48800,7 @@ var AgendaEventCard = ({
48720
48800
  showCapacity,
48721
48801
  onClick
48722
48802
  }) => {
48723
- const eventUrl = event.path;
48803
+ const eventLinkProps = resolveEventLinkProps(event);
48724
48804
  const categoryColor = event.eventCategory?.color || "rgb(var(--tb-accent))";
48725
48805
  const price = formatEventPrice(event);
48726
48806
  const { available, isFull } = getEventAvailability(event);
@@ -48781,7 +48861,7 @@ var AgendaEventCard = ({
48781
48861
  }
48782
48862
  );
48783
48863
  }
48784
- return /* @__PURE__ */ jsx47("a", { href: eventUrl, className: "event-agenda-card", children: cardContent });
48864
+ return /* @__PURE__ */ jsx47("a", { ...eventLinkProps, className: "event-agenda-card", children: cardContent });
48785
48865
  };
48786
48866
 
48787
48867
  // ../blocks/src/system/runtime/nodes/events/shared/WeekAgendaView.tsx
@@ -49024,7 +49104,7 @@ function renderCalendarSsr(display) {
49024
49104
  dayEvents.slice(0, MAX_EVENTS_PER_DAY).map((event) => /* @__PURE__ */ jsxs35(
49025
49105
  "a",
49026
49106
  {
49027
- href: event.path,
49107
+ ...resolveEventLinkProps(event),
49028
49108
  className: "event-calendar-event",
49029
49109
  title: `${event.title} at ${formatTime(event.startsAt, { timeZone: getEventTimeZone(event) })}`,
49030
49110
  children: [
@@ -49152,7 +49232,7 @@ function renderTimetableSsr(display) {
49152
49232
  day.events.length === 0 ? /* @__PURE__ */ jsx49("p", { className: "event-timetable-day-empty", children: "No classes" }) : day.events.map((cell) => /* @__PURE__ */ jsxs35(
49153
49233
  "a",
49154
49234
  {
49155
- href: cell.event.path,
49235
+ ...resolveEventLinkProps(cell.event),
49156
49236
  className: "event-timetable-event",
49157
49237
  title: `${cell.event.title}, ${cell.timeLabel}`,
49158
49238
  style: {
@@ -49959,14 +50039,14 @@ function isDecoratedHeadingBlockKind(blockKind) {
49959
50039
  return blockKind === "block.intro" || blockKind === "block.feature-cards" || blockKind === "block.testimonials" || blockKind === "block.faq";
49960
50040
  }
49961
50041
  function readVariant(blockContent) {
49962
- if (!isRecord12(blockContent)) return void 0;
50042
+ if (!isRecord13(blockContent)) return void 0;
49963
50043
  const variant = blockContent.variant;
49964
50044
  return typeof variant === "string" ? variant : void 0;
49965
50045
  }
49966
50046
  function isFaqDecoratedVariant(variant) {
49967
50047
  return variant === "default" || variant === "question-columns";
49968
50048
  }
49969
- function isRecord12(value) {
50049
+ function isRecord13(value) {
49970
50050
  return typeof value === "object" && value !== null && !Array.isArray(value);
49971
50051
  }
49972
50052
  function buildHeadingDecorationWrapperClassName(className) {
@@ -68012,7 +68092,7 @@ function preset(id, verticalId, canonicalBehaviour, label, pluralLabel, descript
68012
68092
  }
68013
68093
 
68014
68094
  // ../api/src/utils/isRecord.ts
68015
- function isRecord13(value) {
68095
+ function isRecord14(value) {
68016
68096
  return typeof value === "object" && value !== null && !Array.isArray(value);
68017
68097
  }
68018
68098
 
@@ -68319,7 +68399,7 @@ function sanitizeMarks(marks) {
68319
68399
  if (mark.type === "bold" || mark.type === "strong" || mark.type === "italic" || mark.type === "em") {
68320
68400
  return [{ type: mark.type }];
68321
68401
  }
68322
- if (mark.type === "link" && isRecord13(mark.attrs) && typeof mark.attrs.href === "string") {
68402
+ if (mark.type === "link" && isRecord14(mark.attrs) && typeof mark.attrs.href === "string") {
68323
68403
  const attrs = { href: mark.attrs.href };
68324
68404
  if (typeof mark.attrs.target === "string" && mark.attrs.target.trim().length > 0) {
68325
68405
  attrs.target = mark.attrs.target;
@@ -68334,10 +68414,10 @@ function sanitizeMarks(marks) {
68334
68414
  return sanitized.length > 0 ? sanitized : void 0;
68335
68415
  }
68336
68416
  function unwrapRichTextValue(value) {
68337
- if (isRecord13(value) && isRecord13(value.doc)) {
68417
+ if (isRecord14(value) && isRecord14(value.doc)) {
68338
68418
  return unwrapRichTextValue(value.doc);
68339
68419
  }
68340
- if (isRecord13(value) && value.type === "doc") {
68420
+ if (isRecord14(value) && value.type === "doc") {
68341
68421
  return {
68342
68422
  type: "doc",
68343
68423
  content: Array.isArray(value.content) ? value.content.filter(isTipTapNodeLike).map(coerceTipTapNode) : []
@@ -68346,7 +68426,7 @@ function unwrapRichTextValue(value) {
68346
68426
  return EMPTY_SITE_BANNER_BODY;
68347
68427
  }
68348
68428
  function isTipTapNodeLike(value) {
68349
- return isRecord13(value) && typeof value.type === "string";
68429
+ return isRecord14(value) && typeof value.type === "string";
68350
68430
  }
68351
68431
  function coerceTipTapNode(value) {
68352
68432
  return {
@@ -68354,9 +68434,9 @@ function coerceTipTapNode(value) {
68354
68434
  ...Array.isArray(value.content) ? { content: value.content.filter(isTipTapNodeLike).map(coerceTipTapNode) } : {},
68355
68435
  ...typeof value.text === "string" ? { text: value.text } : {},
68356
68436
  ...Array.isArray(value.marks) ? {
68357
- marks: value.marks.filter((mark) => isRecord13(mark) && typeof mark.type === "string").map((mark) => ({
68437
+ marks: value.marks.filter((mark) => isRecord14(mark) && typeof mark.type === "string").map((mark) => ({
68358
68438
  type: mark.type,
68359
- ...isRecord13(mark.attrs) ? { attrs: mark.attrs } : {}
68439
+ ...isRecord14(mark.attrs) ? { attrs: mark.attrs } : {}
68360
68440
  }))
68361
68441
  } : {}
68362
68442
  };
@@ -68546,7 +68626,7 @@ var ENTRY_REF_KEYS = [
68546
68626
  "entryId",
68547
68627
  "slug"
68548
68628
  ];
68549
- function isRecord14(value) {
68629
+ function isRecord15(value) {
68550
68630
  return Boolean(value) && typeof value === "object" && !Array.isArray(value);
68551
68631
  }
68552
68632
  function extractManualEntryRef(item) {
@@ -68554,7 +68634,7 @@ function extractManualEntryRef(item) {
68554
68634
  const trimmed = item.trim();
68555
68635
  return trimmed.length > 0 ? trimmed : null;
68556
68636
  }
68557
- if (!isRecord14(item)) return null;
68637
+ if (!isRecord15(item)) return null;
68558
68638
  for (const key of ENTRY_REF_KEYS) {
68559
68639
  const raw = item[key];
68560
68640
  if (typeof raw === "string" && raw.trim().length > 0) {
@@ -69079,7 +69159,7 @@ function collectMediaAssetSidecar(mediaAssets) {
69079
69159
  return Array.isArray(mediaAssets) && mediaAssets.length > 0 ? mediaAssets : void 0;
69080
69160
  }
69081
69161
  function convertPageResponseBlock(block) {
69082
- if (!isRecord15(block)) {
69162
+ if (!isRecord16(block)) {
69083
69163
  throw new Error("Invalid block format in page API response");
69084
69164
  }
69085
69165
  if (typeof block.id !== "string" && block.id !== null) {
@@ -69110,20 +69190,20 @@ function buildPageOutline(input) {
69110
69190
  blocks: input.blocks.map(convertPageResponseBlock)
69111
69191
  };
69112
69192
  }
69113
- function isRecord15(value) {
69193
+ function isRecord16(value) {
69114
69194
  return Boolean(value) && typeof value === "object" && !Array.isArray(value);
69115
69195
  }
69116
69196
  function readContentRecord(value) {
69117
- return isRecord15(value) ? value : void 0;
69197
+ return isRecord16(value) ? value : void 0;
69118
69198
  }
69119
69199
  function readNestedContentRecord(value) {
69120
- if (!isRecord15(value)) return null;
69200
+ if (!isRecord16(value)) return null;
69121
69201
  return readContentRecord(value.data) ?? null;
69122
69202
  }
69123
69203
  function sanitizeSdkRuntimeBlockContent(blockKind, content) {
69124
69204
  if (blockKind !== "block.newsletter-signup") return content;
69125
69205
  const sanitized = sanitizeNewsletterSignupPublicContent(content);
69126
- return isRecord15(sanitized) ? sanitized : {};
69206
+ return isRecord16(sanitized) ? sanitized : {};
69127
69207
  }
69128
69208
  function sanitizeNullableSdkRuntimeBlockContent(blockKind, content) {
69129
69209
  return content ? sanitizeSdkRuntimeBlockContent(blockKind, content) : null;
@@ -69740,15 +69820,15 @@ function Page(props2) {
69740
69820
  var lazyBlockOverrideSymbol = /* @__PURE__ */ Symbol.for("riverbankcms.sdk.lazyBlockOverride");
69741
69821
 
69742
69822
  // src/rendering/overrideResolution.ts
69743
- function isRecord16(value) {
69823
+ function isRecord17(value) {
69744
69824
  return typeof value === "object" && value !== null;
69745
69825
  }
69746
69826
  function isBlockOutlineLike(value) {
69747
69827
  const id = value.id;
69748
- return typeof value.kind === "string" && (typeof id === "string" || id === null) && (typeof value.purpose === "string" || isRecord16(value.content) || isRecord16(value.draftContent) || isRecord16(value.bindings));
69828
+ return typeof value.kind === "string" && (typeof id === "string" || id === null) && (typeof value.purpose === "string" || isRecord17(value.content) || isRecord17(value.draftContent) || isRecord17(value.bindings));
69749
69829
  }
69750
69830
  function collectBlockKindsFromValue(value, usedKinds, seen) {
69751
- if (!isRecord16(value)) return;
69831
+ if (!isRecord17(value)) return;
69752
69832
  if (seen.has(value)) return;
69753
69833
  seen.add(value);
69754
69834
  if (isBlockOutlineLike(value)) {
@@ -69797,7 +69877,7 @@ function selectOverrideKeysForUsedKinds(usedKinds, entries) {
69797
69877
  return selectedKeys;
69798
69878
  }
69799
69879
  function isLazyRegistration(registration) {
69800
- return isRecord16(registration) && registration[lazyBlockOverrideSymbol] === true;
69880
+ return isRecord17(registration) && registration[lazyBlockOverrideSymbol] === true;
69801
69881
  }
69802
69882
  async function resolveOverrideComponent(registration) {
69803
69883
  if (isLazyRegistration(registration)) {
@@ -70799,7 +70879,7 @@ var CircuitOpenError = class extends Error {
70799
70879
  };
70800
70880
 
70801
70881
  // src/version.ts
70802
- var SDK_VERSION = "0.90.0";
70882
+ var SDK_VERSION = "0.91.0";
70803
70883
 
70804
70884
  // src/next/content-load-failure.ts
70805
70885
  var SdkContentLoadError = RiverbankContentLoadError;