@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
@@ -179,6 +179,8 @@ function publicEventPricingType(pricing) {
179
179
  case "ticket_types":
180
180
  case "course":
181
181
  return isFreePublicEventPriceDisplay(pricing.display) ? "free" : "paid";
182
+ case "external":
183
+ return "external";
182
184
  }
183
185
  }
184
186
  function publicEventPricingCurrency(pricing) {
@@ -190,6 +192,8 @@ function publicEventPricingCurrency(pricing) {
190
192
  return pricing.currency;
191
193
  case "course":
192
194
  return pricing.display.display.currency;
195
+ case "external":
196
+ return null;
193
197
  }
194
198
  }
195
199
  function isFreePublicEventPriceDisplay(display) {
@@ -203,6 +207,7 @@ function isFreePublicEventPriceDisplay(display) {
203
207
  case "range":
204
208
  case "mixed":
205
209
  case "unavailable":
210
+ case "external":
206
211
  return false;
207
212
  }
208
213
  }
@@ -233,6 +238,8 @@ function formatBookingPriceDisplay(display, options = {}) {
233
238
  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)}`;
234
239
  case "unavailable":
235
240
  return "Pricing unavailable";
241
+ case "external":
242
+ return display.label;
236
243
  case "course":
237
244
  return formatCoursePriceDisplayLabel(display.display, options);
238
245
  default:
@@ -26350,6 +26357,18 @@ var publicCoursesArraySchema = z43.array(publicCourseSchema);
26350
26357
  var eventPresetSchema = z44.enum(["event", "class", "workshop", "retreat", "performance"]);
26351
26358
  var eventScheduleScopeSchema = z44.enum(["recurring", "oneOff"]);
26352
26359
  var eventDestinationModeSchema = z44.enum(["cms-managed", "system-managed"]);
26360
+ var publicEventDestinationSchema = z44.discriminatedUnion("kind", [
26361
+ z44.object({
26362
+ kind: z44.literal("native"),
26363
+ mode: eventDestinationModeSchema,
26364
+ path: z44.string()
26365
+ }),
26366
+ z44.object({
26367
+ kind: z44.literal("external"),
26368
+ url: z44.string(),
26369
+ label: z44.string()
26370
+ })
26371
+ ]);
26353
26372
  var eventVenueSchema = z44.object({
26354
26373
  id: z44.string(),
26355
26374
  name: z44.string(),
@@ -26364,7 +26383,7 @@ var eventCategorySchema = z44.object({
26364
26383
  name: z44.string(),
26365
26384
  color: z44.string().nullable()
26366
26385
  });
26367
- var pricingTypeSchema = z44.enum(["free", "paid"]);
26386
+ var pricingTypeSchema = z44.enum(["free", "paid", "external"]);
26368
26387
  var accessRestrictionSchema = z44.enum(["none", "category"]);
26369
26388
  var eventPricingModeSchema = z44.enum(["single", "ticket_types"]);
26370
26389
  var publicCoursePriceDisplaySchema = z44.discriminatedUnion("kind", [
@@ -26385,6 +26404,7 @@ var publicEventPriceDisplaySchema = z44.discriminatedUnion("kind", [
26385
26404
  currency: z44.string()
26386
26405
  }),
26387
26406
  z44.object({ kind: z44.literal("unavailable"), currency: z44.string() }),
26407
+ z44.object({ kind: z44.literal("external"), label: z44.string() }),
26388
26408
  z44.object({ kind: z44.literal("course"), display: publicCoursePriceDisplaySchema })
26389
26409
  ]);
26390
26410
  var publicEventTicketTypePriceDisplaySchema = z44.union([
@@ -26463,6 +26483,10 @@ var publicEventPricingSchema = z44.discriminatedUnion("kind", [
26463
26483
  z44.object({
26464
26484
  kind: z44.literal("course"),
26465
26485
  display: z44.object({ kind: z44.literal("course"), display: publicCoursePriceDisplaySchema })
26486
+ }),
26487
+ z44.object({
26488
+ kind: z44.literal("external"),
26489
+ display: z44.object({ kind: z44.literal("external"), label: z44.string() })
26466
26490
  })
26467
26491
  ]);
26468
26492
  var publicTeamMemberSummarySchema = z44.object({
@@ -26491,7 +26515,8 @@ var publicEventSchema = z44.object({
26491
26515
  image: mediaSchema2.nullable().optional()
26492
26516
  }).optional(),
26493
26517
  slug: z44.string(),
26494
- path: z44.string(),
26518
+ path: z44.string().nullable(),
26519
+ destination: publicEventDestinationSchema,
26495
26520
  requiresRegistration: z44.boolean(),
26496
26521
  deliveryMode: z44.enum(["in_person", "online", "hybrid"]),
26497
26522
  attendanceModes: z44.array(publicEventAttendanceModeAvailabilitySchema),
@@ -26795,12 +26820,41 @@ function isEventContentType(slug) {
26795
26820
  return EVENT_CONTENT_TYPE_SLUGS.includes(slug);
26796
26821
  }
26797
26822
 
26823
+ // ../blocks/src/system/runtime/nodes/events/shared/destination.ts
26824
+ function isRecord5(value) {
26825
+ return typeof value === "object" && value !== null && !Array.isArray(value);
26826
+ }
26827
+ function isRuntimeEventDestination(value) {
26828
+ if (!isRecord5(value) || typeof value.kind !== "string") return false;
26829
+ if (value.kind === "native") {
26830
+ return (value.mode === "cms-managed" || value.mode === "system-managed") && typeof value.path === "string";
26831
+ }
26832
+ return value.kind === "external" && typeof value.url === "string" && typeof value.label === "string";
26833
+ }
26834
+ function resolveRuntimeEventDestination(event) {
26835
+ if (isRuntimeEventDestination(event.destination)) {
26836
+ return event.destination;
26837
+ }
26838
+ return {
26839
+ kind: "native",
26840
+ mode: event.eventDestinationMode === "system-managed" ? "system-managed" : "cms-managed",
26841
+ path: typeof event.path === "string" ? event.path : ""
26842
+ };
26843
+ }
26844
+
26798
26845
  // ../blocks/src/system/runtime/nodes/events/shared/pricing.ts
26799
26846
  var DEFAULT_EVENT_CURRENCY = "USD";
26800
26847
  function resolveRuntimeEventPricing(event) {
26801
26848
  if (isPublicEventPricing(event.pricing)) {
26802
26849
  return event.pricing;
26803
26850
  }
26851
+ const destination = resolveRuntimeEventDestination(event);
26852
+ if (destination.kind === "external") {
26853
+ return {
26854
+ kind: "external",
26855
+ display: { kind: "external", label: "External registration" }
26856
+ };
26857
+ }
26804
26858
  const legacy = event;
26805
26859
  const currency = readCurrency(legacy.currency);
26806
26860
  if (event.requiresRegistration === false) {
@@ -26837,22 +26891,22 @@ function resolveRuntimeEventPricing(event) {
26837
26891
  function readCurrency(value) {
26838
26892
  return typeof value === "string" && value.trim().length > 0 ? value : DEFAULT_EVENT_CURRENCY;
26839
26893
  }
26840
- function isRecord5(value) {
26894
+ function isRecord6(value) {
26841
26895
  return typeof value === "object" && value !== null && !Array.isArray(value);
26842
26896
  }
26843
26897
  function isPublicEventPricing(value) {
26844
- if (!isRecord5(value) || typeof value.kind !== "string") return false;
26845
- return value.kind === "drop_in" || value.kind === "free_registration" || value.kind === "single_paid" || value.kind === "ticket_types" || value.kind === "course";
26898
+ if (!isRecord6(value) || typeof value.kind !== "string") return false;
26899
+ return value.kind === "drop_in" || value.kind === "free_registration" || value.kind === "single_paid" || value.kind === "ticket_types" || value.kind === "course" || value.kind === "external";
26846
26900
  }
26847
26901
  function isPublicEventTicketType(value) {
26848
- return isRecord5(value) && typeof value.id === "string";
26902
+ return isRecord6(value) && typeof value.id === "string";
26849
26903
  }
26850
26904
  function readTicketTypePriceDisplay(value, currency) {
26851
26905
  const display = readLegacyPriceDisplay(value, currency);
26852
- return display.kind === "course" ? { kind: "unavailable", currency } : display;
26906
+ return display.kind === "course" || display.kind === "external" ? { kind: "unavailable", currency } : display;
26853
26907
  }
26854
26908
  function readLegacyPriceDisplay(value, currency) {
26855
- if (!isRecord5(value) || typeof value.kind !== "string") {
26909
+ if (!isRecord6(value) || typeof value.kind !== "string") {
26856
26910
  return { kind: "unavailable", currency };
26857
26911
  }
26858
26912
  const displayCurrency = readCurrency(value.currency);
@@ -26891,7 +26945,7 @@ function readLegacyPriceDisplay(value, currency) {
26891
26945
  case "unavailable":
26892
26946
  return { kind: "unavailable", currency: displayCurrency };
26893
26947
  case "course":
26894
- return isRecord5(value.display) ? {
26948
+ return isRecord6(value.display) ? {
26895
26949
  kind: "course",
26896
26950
  display: readCoursePriceDisplay(value.display, displayCurrency)
26897
26951
  } : {
@@ -26978,7 +27032,7 @@ function resolveEventRequiresPayment(input) {
26978
27032
  if (!input.event) {
26979
27033
  return false;
26980
27034
  }
26981
- return publicEventPricingType(resolveRuntimeEventPricing(input.event)) !== "free";
27035
+ return publicEventPricingType(resolveRuntimeEventPricing(input.event)) === "paid";
26982
27036
  }
26983
27037
 
26984
27038
  // ../blocks/src/system/runtime/nodes/event-registration/registrationEventAdapter.ts
@@ -27175,15 +27229,16 @@ var eventRegistrationBlockRuntime = defineClientOwnedBlockRuntime({
27175
27229
  })
27176
27230
  });
27177
27231
  function normalizeEventRegistrationEventInput(value) {
27178
- if (!isRecord6(value)) {
27232
+ if (!isRecord7(value)) {
27179
27233
  return value;
27180
27234
  }
27181
27235
  return {
27182
27236
  ...value,
27237
+ destination: resolveRuntimeEventDestination(value),
27183
27238
  pricing: resolveRuntimeEventPricing(value)
27184
27239
  };
27185
27240
  }
27186
- function isRecord6(value) {
27241
+ function isRecord7(value) {
27187
27242
  return typeof value === "object" && value !== null && !Array.isArray(value);
27188
27243
  }
27189
27244
  var eventRegistrationInteractiveIslandPropsCodec = createInteractiveIslandCodec({
@@ -28976,16 +29031,28 @@ function groupEventsByDate(events) {
28976
29031
  function formatEventPrice(event) {
28977
29032
  return formatEventPricing(resolveRuntimeEventPricing(event), { decimals: "auto" });
28978
29033
  }
29034
+ function resolveEventHref(event) {
29035
+ const destination = resolveRuntimeEventDestination(event);
29036
+ return destination.kind === "external" ? destination.url : destination.path;
29037
+ }
29038
+ function resolveEventLinkProps(event) {
29039
+ const href = resolveEventHref(event);
29040
+ const destination = resolveRuntimeEventDestination(event);
29041
+ return destination.kind === "external" ? { href, target: "_blank", rel: "noopener noreferrer" } : { href };
29042
+ }
28979
29043
  function resolveEventCta(event, buttonText) {
28980
29044
  const { isFull: isSoldOut } = getEventAvailability(event);
28981
- const defaultButtonText = event.kind === "course_session" ? "Book course" : "Book";
29045
+ const destination = resolveRuntimeEventDestination(event);
29046
+ const isExternal = destination.kind === "external";
29047
+ const defaultButtonText = isExternal ? destination.label : event.kind === "course_session" ? "Book course" : "Book";
28982
29048
  const effectiveButtonText = buttonText ?? defaultButtonText;
28983
- if (isSoldOut) {
28984
- return { label: "Sold out", href: event.path, hidden: true };
29049
+ const href = resolveEventHref(event);
29050
+ if (!isExternal && isSoldOut) {
29051
+ return { label: "Sold out", href, external: false, hidden: true };
28985
29052
  }
28986
29053
  const enrollmentOpen = event.kind === "course_session" ? event.course?.enrollmentOpen !== false : true;
28987
29054
  const label = !enrollmentOpen ? "Registration closed" : effectiveButtonText;
28988
- return { label, href: event.path, hidden: false };
29055
+ return { label, href, external: isExternal, hidden: false };
28989
29056
  }
28990
29057
 
28991
29058
  // ../../node_modules/.pnpm/clsx@2.1.1/node_modules/clsx/dist/clsx.mjs
@@ -30420,6 +30487,8 @@ var EventCard = ({
30420
30487
  "a",
30421
30488
  {
30422
30489
  href: cta.href,
30490
+ target: cta.external ? "_blank" : void 0,
30491
+ rel: cta.external ? "noopener noreferrer" : void 0,
30423
30492
  className: `${buttonClass} event-card-cta`,
30424
30493
  children: cta.label
30425
30494
  }
@@ -30509,10 +30578,19 @@ var EventCompactRow = ({
30509
30578
  formattedTime,
30510
30579
  /* @__PURE__ */ jsx8("span", { className: "event-compact-row-action-price", children: price })
30511
30580
  ] }),
30512
- 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: [
30513
- /* @__PURE__ */ jsx8("span", { children: cta.label }),
30514
- /* @__PURE__ */ jsx8(ArrowRightIcon, { "aria-hidden": "true" })
30515
- ] })
30581
+ cta.hidden ? /* @__PURE__ */ jsx8("span", { className: "event-compact-row-status", children: cta.label }) : /* @__PURE__ */ jsxs6(
30582
+ "a",
30583
+ {
30584
+ href: cta.href,
30585
+ target: cta.external ? "_blank" : void 0,
30586
+ rel: cta.external ? "noopener noreferrer" : void 0,
30587
+ className: `${buttonClass} event-compact-row-cta`,
30588
+ children: [
30589
+ /* @__PURE__ */ jsx8("span", { children: cta.label }),
30590
+ /* @__PURE__ */ jsx8(ArrowRightIcon, { "aria-hidden": "true" })
30591
+ ]
30592
+ }
30593
+ )
30516
30594
  ] })
30517
30595
  ] })
30518
30596
  ] });
@@ -32102,7 +32180,7 @@ function inferLegacyOfferingsPreviewGroupOrder(overrides) {
32102
32180
  return keys.length >= 2 ? keys : [];
32103
32181
  }
32104
32182
  function normalizeOfferingsPreviewContentForWrite(value) {
32105
- if (!isRecord7(value)) return null;
32183
+ if (!isRecord8(value)) return null;
32106
32184
  const groupOrderValue = value.groupOrder;
32107
32185
  if (Array.isArray(groupOrderValue)) {
32108
32186
  const normalized = normalizeOfferingsPreviewGroupOrder(groupOrderValue);
@@ -32115,7 +32193,7 @@ function normalizeOfferingsPreviewContentForWrite(value) {
32115
32193
  return { ...value, groupOrder: [] };
32116
32194
  }
32117
32195
  const legacyOrder = inferLegacyOfferingsPreviewGroupOrder(
32118
- Array.isArray(value.groupOverrides) ? value.groupOverrides.filter(isRecord7) : []
32196
+ Array.isArray(value.groupOverrides) ? value.groupOverrides.filter(isRecord8) : []
32119
32197
  );
32120
32198
  return legacyOrder.length > 0 ? { ...value, groupOrder: legacyOrder } : value;
32121
32199
  }
@@ -32169,7 +32247,7 @@ function uniqueOfferingsPreviewSourceKeys(values) {
32169
32247
  }
32170
32248
  return keys;
32171
32249
  }
32172
- function isRecord7(value) {
32250
+ function isRecord8(value) {
32173
32251
  return typeof value === "object" && value !== null && !Array.isArray(value);
32174
32252
  }
32175
32253
  function mergeOrderedKeysWithDefaults(orderedKeys, defaultKeys) {
@@ -32631,7 +32709,7 @@ function isOfferingsPreviewItemLimit(value) {
32631
32709
  return value === "1" || value === "2" || value === "3" || value === "4" || value === "5" || value === "6" || value === null;
32632
32710
  }
32633
32711
  function normalizeOfferingsPreviewGroupOverride(value) {
32634
- if (!isRecord8(value)) return [];
32712
+ if (!isRecord9(value)) return [];
32635
32713
  const override = {};
32636
32714
  if (isOfferingsPreviewSourceKey(value.sourceKey) || value.sourceKey === null) {
32637
32715
  override.sourceKey = value.sourceKey;
@@ -32663,12 +32741,12 @@ function isButtonVariant(value) {
32663
32741
  return value === "primary" || value === "secondary" || value === "outline" || value === "link" || value === null;
32664
32742
  }
32665
32743
  function normalizeCardStylesContent(value) {
32666
- return isRecord8(value) || value === null ? value : void 0;
32744
+ return isRecord9(value) || value === null ? value : void 0;
32667
32745
  }
32668
32746
  function normalizeSectionStylesContent(value) {
32669
- return isRecord8(value) || value === null ? value : void 0;
32747
+ return isRecord9(value) || value === null ? value : void 0;
32670
32748
  }
32671
- function isRecord8(value) {
32749
+ function isRecord9(value) {
32672
32750
  return typeof value === "object" && value !== null && !Array.isArray(value);
32673
32751
  }
32674
32752
 
@@ -38036,7 +38114,7 @@ import React4 from "react";
38036
38114
  // ../blocks/src/system/data/linkedContentEntries.ts
38037
38115
  var LINKED_CONTENT_ENTRY_META_KEY = "__rbLinkedContentEntry";
38038
38116
  function coerceLinkedContentEntriesPayload(payload) {
38039
- if (!isRecord9(payload)) return payload;
38117
+ if (!isRecord10(payload)) return payload;
38040
38118
  const response = payload;
38041
38119
  if (!Array.isArray(response.entries)) return payload;
38042
38120
  const contentType = parsePublicContentTypeMeta(response.contentType);
@@ -38044,16 +38122,16 @@ function coerceLinkedContentEntriesPayload(payload) {
38044
38122
  return response.entries.map((entry) => enrichLinkedContentEntry(entry, contentType));
38045
38123
  }
38046
38124
  function getLinkedContentEntryMeta(value) {
38047
- if (!isRecord9(value)) return null;
38125
+ if (!isRecord10(value)) return null;
38048
38126
  const candidate = value[LINKED_CONTENT_ENTRY_META_KEY];
38049
38127
  return isLinkedContentEntryMeta(candidate) ? candidate : null;
38050
38128
  }
38051
38129
  function buildLinkedContentEditTarget(input) {
38052
38130
  const { entry, sourceBlockId, sourceBlockKind, itemIndex } = input;
38053
- if (!isRecord9(entry)) return null;
38131
+ if (!isRecord10(entry)) return null;
38054
38132
  const meta = getLinkedContentEntryMeta(entry);
38055
38133
  if (!meta || meta.support.kind !== "supported") return null;
38056
- const content = isRecord9(entry.content) ? entry.content : {};
38134
+ const content = isRecord10(entry.content) ? entry.content : {};
38057
38135
  return {
38058
38136
  kind: "linked-content-entry",
38059
38137
  entryId: meta.entryId,
@@ -38103,12 +38181,12 @@ function resolveLinkedEntryInlineFieldEligibility(input) {
38103
38181
  };
38104
38182
  }
38105
38183
  function enrichLinkedContentEntry(entry, contentType) {
38106
- if (!isRecord9(entry)) return entry;
38184
+ if (!isRecord10(entry)) return entry;
38107
38185
  const entryId = typeof entry.id === "string" ? entry.id : null;
38108
38186
  if (!entryId) return entry;
38109
38187
  const title = typeof entry.title === "string" && entry.title.trim().length > 0 ? entry.title : entryId;
38110
38188
  const optimisticHash = typeof entry.optimisticHash === "string" && entry.optimisticHash.length > 0 ? entry.optimisticHash : null;
38111
- const content = isRecord9(entry.content) ? entry.content : {};
38189
+ const content = isRecord10(entry.content) ? entry.content : {};
38112
38190
  const meta = {
38113
38191
  kind: "linked-content-entry",
38114
38192
  entryId,
@@ -38204,7 +38282,7 @@ function capitalize(value) {
38204
38282
  return value.charAt(0).toUpperCase() + value.slice(1).toLowerCase();
38205
38283
  }
38206
38284
  function parsePublicContentTypeMeta(value) {
38207
- if (!isRecord9(value)) return null;
38285
+ if (!isRecord10(value)) return null;
38208
38286
  if (typeof value.key !== "string" || value.key.trim().length === 0) return null;
38209
38287
  return {
38210
38288
  key: value.key,
@@ -38214,7 +38292,7 @@ function parsePublicContentTypeMeta(value) {
38214
38292
  };
38215
38293
  }
38216
38294
  function parsePublicContentTypeLinkedEntryEditing(value) {
38217
- if (!isRecord9(value) || typeof value.kind !== "string") return null;
38295
+ if (!isRecord10(value) || typeof value.kind !== "string") return null;
38218
38296
  switch (value.kind) {
38219
38297
  case "generic":
38220
38298
  return { kind: "generic" };
@@ -38228,7 +38306,7 @@ function parsePublicContentTypeLinkedEntryEditing(value) {
38228
38306
  }
38229
38307
  }
38230
38308
  function parsePublicContentTypeFieldMeta(value) {
38231
- if (!isRecord9(value)) return [];
38309
+ if (!isRecord10(value)) return [];
38232
38310
  if (typeof value.id !== "string" || typeof value.type !== "string") return [];
38233
38311
  return [{
38234
38312
  id: value.id,
@@ -38243,14 +38321,14 @@ function parseStringArray(value) {
38243
38321
  return value.filter((item) => typeof item === "string");
38244
38322
  }
38245
38323
  function isLinkedContentEntryMeta(value) {
38246
- if (!isRecord9(value)) return false;
38324
+ if (!isRecord10(value)) return false;
38247
38325
  if (value.kind !== "linked-content-entry") return false;
38248
38326
  if (typeof value.entryId !== "string") return false;
38249
38327
  if (typeof value.contentTypeKey !== "string") return false;
38250
38328
  if (typeof value.contentTypeLabel !== "string") return false;
38251
38329
  if (typeof value.title !== "string") return false;
38252
38330
  if (!(value.optimisticHash === null || typeof value.optimisticHash === "string")) return false;
38253
- if (!isRecord9(value.contentType)) return false;
38331
+ if (!isRecord10(value.contentType)) return false;
38254
38332
  if (!isLinkedEntryFieldSourceArray(value.fieldSources)) return false;
38255
38333
  return isLinkedContentEditSupport(value.support);
38256
38334
  }
@@ -38258,7 +38336,7 @@ function isLinkedEntryFieldSourceArray(value) {
38258
38336
  return Array.isArray(value) && value.every(isLinkedEntryFieldSource);
38259
38337
  }
38260
38338
  function isLinkedEntryFieldSource(value) {
38261
- if (!isRecord9(value)) return false;
38339
+ if (!isRecord10(value)) return false;
38262
38340
  if (typeof value.displayPath !== "string") return false;
38263
38341
  switch (value.kind) {
38264
38342
  case "content-field":
@@ -38284,7 +38362,7 @@ function isLinkedEntryInlineFieldReadOnlyReason(value) {
38284
38362
  }
38285
38363
  }
38286
38364
  function isLinkedContentEditSupport(value) {
38287
- if (!isRecord9(value) || typeof value.kind !== "string") return false;
38365
+ if (!isRecord10(value) || typeof value.kind !== "string") return false;
38288
38366
  switch (value.kind) {
38289
38367
  case "supported":
38290
38368
  return true;
@@ -38296,7 +38374,7 @@ function isLinkedContentEditSupport(value) {
38296
38374
  return false;
38297
38375
  }
38298
38376
  }
38299
- function isRecord9(value) {
38377
+ function isRecord10(value) {
38300
38378
  return typeof value === "object" && value !== null && !Array.isArray(value);
38301
38379
  }
38302
38380
 
@@ -39752,12 +39830,12 @@ function toTrimmedString(value) {
39752
39830
  return trimmed ? trimmed : void 0;
39753
39831
  }
39754
39832
  function normalizeBookingFormConfig(form2) {
39755
- if (!isRecord10(form2)) return null;
39833
+ if (!isRecord11(form2)) return null;
39756
39834
  const id = readNonEmptyString(form2.id);
39757
39835
  const name = readNonEmptyString(form2.name);
39758
39836
  if (!id || !name) return null;
39759
- const schemaSource = isRecord10(form2.schema) ? form2.schema : isRecord10(form2.schemaJson) ? form2.schemaJson : null;
39760
- const settingsSource = isRecord10(form2.settings) ? form2.settings : isRecord10(form2.settingsJson) ? form2.settingsJson : null;
39837
+ const schemaSource = isRecord11(form2.schema) ? form2.schema : isRecord11(form2.schemaJson) ? form2.schemaJson : null;
39838
+ const settingsSource = isRecord11(form2.settings) ? form2.settings : isRecord11(form2.settingsJson) ? form2.settingsJson : null;
39761
39839
  return {
39762
39840
  id,
39763
39841
  name,
@@ -39781,10 +39859,10 @@ function normalizeBookingServices(services) {
39781
39859
  if (Array.isArray(services)) {
39782
39860
  return services.filter(isBookingFormService).map(normalizeService);
39783
39861
  }
39784
- if (isRecord10(services) && "services" in services) {
39862
+ if (isRecord11(services) && "services" in services) {
39785
39863
  return Array.isArray(services.services) ? services.services.filter(isBookingFormService).map(normalizeService) : [];
39786
39864
  }
39787
- return isRecord10(services) ? Object.values(services).filter(isBookingFormService).map(normalizeService) : [];
39865
+ return isRecord11(services) ? Object.values(services).filter(isBookingFormService).map(normalizeService) : [];
39788
39866
  }
39789
39867
  function normalizeBookingSchema(value) {
39790
39868
  if (!value) return void 0;
@@ -39796,7 +39874,7 @@ function normalizeBookingSchema(value) {
39796
39874
  };
39797
39875
  }
39798
39876
  function readBookingFormField(value) {
39799
- if (!isRecord10(value)) return null;
39877
+ if (!isRecord11(value)) return null;
39800
39878
  const id = readNonEmptyString(value.id);
39801
39879
  const label = readNonEmptyString(value.label);
39802
39880
  const type = readBookingFieldType(value.type);
@@ -39842,7 +39920,7 @@ function readBookingFieldOptions(value) {
39842
39920
  return options.length > 0 ? options : void 0;
39843
39921
  }
39844
39922
  function readBookingFieldOption(value) {
39845
- if (!isRecord10(value)) return null;
39923
+ if (!isRecord11(value)) return null;
39846
39924
  const optionValue = readNonEmptyString(value.value);
39847
39925
  const label = readNonEmptyString(value.label);
39848
39926
  return optionValue && label ? { value: optionValue, label } : null;
@@ -39859,7 +39937,7 @@ function normalizeBookingSettings(value) {
39859
39937
  };
39860
39938
  }
39861
39939
  function isBookingFormService(value) {
39862
- return isRecord10(value) && typeof value.id === "string" && typeof value.siteId === "string" && typeof value.title === "string";
39940
+ return isRecord11(value) && typeof value.id === "string" && typeof value.siteId === "string" && typeof value.title === "string";
39863
39941
  }
39864
39942
  function readNonEmptyString(value) {
39865
39943
  if (typeof value !== "string") return null;
@@ -39877,7 +39955,7 @@ function readStringArray(value) {
39877
39955
  const strings = value.filter((item) => typeof item === "string");
39878
39956
  return strings.length > 0 ? strings : void 0;
39879
39957
  }
39880
- function isRecord10(value) {
39958
+ function isRecord11(value) {
39881
39959
  return typeof value === "object" && value !== null;
39882
39960
  }
39883
39961
 
@@ -40435,7 +40513,7 @@ function EventDetailsView({
40435
40513
  "a",
40436
40514
  {
40437
40515
  className: "rb-tile rb-tile--interactive",
40438
- href: e.path,
40516
+ ...resolveEventLinkProps(e),
40439
40517
  children: /* @__PURE__ */ jsx30(
40440
40518
  DateTimeTile,
40441
40519
  {
@@ -42119,7 +42197,7 @@ var AgendaEventCard = ({
42119
42197
  showCapacity,
42120
42198
  onClick
42121
42199
  }) => {
42122
- const eventUrl = event.path;
42200
+ const eventLinkProps = resolveEventLinkProps(event);
42123
42201
  const categoryColor = event.eventCategory?.color || "rgb(var(--tb-accent))";
42124
42202
  const price = formatEventPrice(event);
42125
42203
  const { available, isFull } = getEventAvailability(event);
@@ -42180,7 +42258,7 @@ var AgendaEventCard = ({
42180
42258
  }
42181
42259
  );
42182
42260
  }
42183
- return /* @__PURE__ */ jsx47("a", { href: eventUrl, className: "event-agenda-card", children: cardContent });
42261
+ return /* @__PURE__ */ jsx47("a", { ...eventLinkProps, className: "event-agenda-card", children: cardContent });
42184
42262
  };
42185
42263
 
42186
42264
  // ../blocks/src/system/runtime/nodes/events/shared/WeekAgendaView.tsx
@@ -42423,7 +42501,7 @@ function renderCalendarSsr(display) {
42423
42501
  dayEvents.slice(0, MAX_EVENTS_PER_DAY).map((event) => /* @__PURE__ */ jsxs35(
42424
42502
  "a",
42425
42503
  {
42426
- href: event.path,
42504
+ ...resolveEventLinkProps(event),
42427
42505
  className: "event-calendar-event",
42428
42506
  title: `${event.title} at ${formatTime(event.startsAt, { timeZone: getEventTimeZone(event) })}`,
42429
42507
  children: [
@@ -42551,7 +42629,7 @@ function renderTimetableSsr(display) {
42551
42629
  day.events.length === 0 ? /* @__PURE__ */ jsx49("p", { className: "event-timetable-day-empty", children: "No classes" }) : day.events.map((cell) => /* @__PURE__ */ jsxs35(
42552
42630
  "a",
42553
42631
  {
42554
- href: cell.event.path,
42632
+ ...resolveEventLinkProps(cell.event),
42555
42633
  className: "event-timetable-event",
42556
42634
  title: `${cell.event.title}, ${cell.timeLabel}`,
42557
42635
  style: {
@@ -43358,14 +43436,14 @@ function isDecoratedHeadingBlockKind(blockKind) {
43358
43436
  return blockKind === "block.intro" || blockKind === "block.feature-cards" || blockKind === "block.testimonials" || blockKind === "block.faq";
43359
43437
  }
43360
43438
  function readVariant(blockContent) {
43361
- if (!isRecord11(blockContent)) return void 0;
43439
+ if (!isRecord12(blockContent)) return void 0;
43362
43440
  const variant = blockContent.variant;
43363
43441
  return typeof variant === "string" ? variant : void 0;
43364
43442
  }
43365
43443
  function isFaqDecoratedVariant(variant) {
43366
43444
  return variant === "default" || variant === "question-columns";
43367
43445
  }
43368
- function isRecord11(value) {
43446
+ function isRecord12(value) {
43369
43447
  return typeof value === "object" && value !== null && !Array.isArray(value);
43370
43448
  }
43371
43449
  function buildHeadingDecorationWrapperClassName(className) {
@@ -68378,7 +68456,7 @@ function preset(id, verticalId, canonicalBehaviour, label, pluralLabel, descript
68378
68456
  }
68379
68457
 
68380
68458
  // ../api/src/utils/isRecord.ts
68381
- function isRecord12(value) {
68459
+ function isRecord13(value) {
68382
68460
  return typeof value === "object" && value !== null && !Array.isArray(value);
68383
68461
  }
68384
68462
 
@@ -68685,7 +68763,7 @@ function sanitizeMarks(marks) {
68685
68763
  if (mark.type === "bold" || mark.type === "strong" || mark.type === "italic" || mark.type === "em") {
68686
68764
  return [{ type: mark.type }];
68687
68765
  }
68688
- if (mark.type === "link" && isRecord12(mark.attrs) && typeof mark.attrs.href === "string") {
68766
+ if (mark.type === "link" && isRecord13(mark.attrs) && typeof mark.attrs.href === "string") {
68689
68767
  const attrs = { href: mark.attrs.href };
68690
68768
  if (typeof mark.attrs.target === "string" && mark.attrs.target.trim().length > 0) {
68691
68769
  attrs.target = mark.attrs.target;
@@ -68700,10 +68778,10 @@ function sanitizeMarks(marks) {
68700
68778
  return sanitized.length > 0 ? sanitized : void 0;
68701
68779
  }
68702
68780
  function unwrapRichTextValue(value) {
68703
- if (isRecord12(value) && isRecord12(value.doc)) {
68781
+ if (isRecord13(value) && isRecord13(value.doc)) {
68704
68782
  return unwrapRichTextValue(value.doc);
68705
68783
  }
68706
- if (isRecord12(value) && value.type === "doc") {
68784
+ if (isRecord13(value) && value.type === "doc") {
68707
68785
  return {
68708
68786
  type: "doc",
68709
68787
  content: Array.isArray(value.content) ? value.content.filter(isTipTapNodeLike).map(coerceTipTapNode) : []
@@ -68712,7 +68790,7 @@ function unwrapRichTextValue(value) {
68712
68790
  return EMPTY_SITE_BANNER_BODY;
68713
68791
  }
68714
68792
  function isTipTapNodeLike(value) {
68715
- return isRecord12(value) && typeof value.type === "string";
68793
+ return isRecord13(value) && typeof value.type === "string";
68716
68794
  }
68717
68795
  function coerceTipTapNode(value) {
68718
68796
  return {
@@ -68720,9 +68798,9 @@ function coerceTipTapNode(value) {
68720
68798
  ...Array.isArray(value.content) ? { content: value.content.filter(isTipTapNodeLike).map(coerceTipTapNode) } : {},
68721
68799
  ...typeof value.text === "string" ? { text: value.text } : {},
68722
68800
  ...Array.isArray(value.marks) ? {
68723
- marks: value.marks.filter((mark) => isRecord12(mark) && typeof mark.type === "string").map((mark) => ({
68801
+ marks: value.marks.filter((mark) => isRecord13(mark) && typeof mark.type === "string").map((mark) => ({
68724
68802
  type: mark.type,
68725
- ...isRecord12(mark.attrs) ? { attrs: mark.attrs } : {}
68803
+ ...isRecord13(mark.attrs) ? { attrs: mark.attrs } : {}
68726
68804
  }))
68727
68805
  } : {}
68728
68806
  };
@@ -68892,7 +68970,7 @@ var ENTRY_REF_KEYS = [
68892
68970
  "entryId",
68893
68971
  "slug"
68894
68972
  ];
68895
- function isRecord13(value) {
68973
+ function isRecord14(value) {
68896
68974
  return Boolean(value) && typeof value === "object" && !Array.isArray(value);
68897
68975
  }
68898
68976
  function extractManualEntryRef(item) {
@@ -68900,7 +68978,7 @@ function extractManualEntryRef(item) {
68900
68978
  const trimmed = item.trim();
68901
68979
  return trimmed.length > 0 ? trimmed : null;
68902
68980
  }
68903
- if (!isRecord13(item)) return null;
68981
+ if (!isRecord14(item)) return null;
68904
68982
  for (const key of ENTRY_REF_KEYS) {
68905
68983
  const raw = item[key];
68906
68984
  if (typeof raw === "string" && raw.trim().length > 0) {
@@ -69346,15 +69424,15 @@ function defineBlockOverrideRegistrations(registrations) {
69346
69424
  }
69347
69425
 
69348
69426
  // src/rendering/overrideResolution.ts
69349
- function isRecord14(value) {
69427
+ function isRecord15(value) {
69350
69428
  return typeof value === "object" && value !== null;
69351
69429
  }
69352
69430
  function isBlockOutlineLike(value) {
69353
69431
  const id = value.id;
69354
- return typeof value.kind === "string" && (typeof id === "string" || id === null) && (typeof value.purpose === "string" || isRecord14(value.content) || isRecord14(value.draftContent) || isRecord14(value.bindings));
69432
+ return typeof value.kind === "string" && (typeof id === "string" || id === null) && (typeof value.purpose === "string" || isRecord15(value.content) || isRecord15(value.draftContent) || isRecord15(value.bindings));
69355
69433
  }
69356
69434
  function collectBlockKindsFromValue(value, usedKinds, seen) {
69357
- if (!isRecord14(value)) return;
69435
+ if (!isRecord15(value)) return;
69358
69436
  if (seen.has(value)) return;
69359
69437
  seen.add(value);
69360
69438
  if (isBlockOutlineLike(value)) {
@@ -69403,7 +69481,7 @@ function selectOverrideKeysForUsedKinds(usedKinds, entries) {
69403
69481
  return selectedKeys;
69404
69482
  }
69405
69483
  function isLazyRegistration(registration) {
69406
- return isRecord14(registration) && registration[lazyBlockOverrideSymbol] === true;
69484
+ return isRecord15(registration) && registration[lazyBlockOverrideSymbol] === true;
69407
69485
  }
69408
69486
  async function resolveOverrideComponent(registration) {
69409
69487
  if (isLazyRegistration(registration)) {