@riverbankcms/sdk 0.91.0 → 0.93.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 (118) hide show
  1. package/dist/{PreviewEditorSidebar-3TT47WCF.mjs → PreviewEditorSidebar-D3PAF7NW.mjs} +3 -3
  2. package/dist/{PreviewEditorUI-ORCLLUNZ.mjs → PreviewEditorUI-G5JVJEIJ.mjs} +3 -3
  3. package/dist/SdkPreviewModeRuntime-NHTLRNQD.mjs +8 -0
  4. package/dist/_dts/api/src/bookingConfig.d.ts +13 -1
  5. package/dist/_dts/api/src/bookingOperations.d.ts +1 -0
  6. package/dist/_dts/api/src/bookingRefundOutcomes.d.ts +6 -6
  7. package/dist/_dts/api/src/common/envelope.d.ts +10 -0
  8. package/dist/_dts/api/src/customerMembershipOutcomes.d.ts +4 -4
  9. package/dist/_dts/api/src/index.d.ts +2 -2
  10. package/dist/_dts/api/src/publicExperienceEndpoints.d.ts +6 -0
  11. package/dist/_dts/api/src/request.d.ts +1 -1
  12. package/dist/_dts/blocks/src/contracts/proof-block-islands.d.ts +32 -0
  13. package/dist/_dts/blocks/src/system/blocks/courses/shared/pricing.d.ts +12 -1
  14. package/dist/_dts/blocks/src/system/blocks/courses/shared/schemas.d.ts +12 -0
  15. package/dist/_dts/blocks/src/system/blocks/courses/shared/types.d.ts +4 -1
  16. package/dist/_dts/blocks/src/system/blocks/events/shared/schemas.d.ts +44 -0
  17. package/dist/_dts/blocks/src/system/manifest/fieldValidation/index.d.ts +8 -0
  18. package/dist/_dts/blocks/src/system/runtime/api/types.d.ts +8 -1
  19. package/dist/_dts/blocks/src/system/runtime/hooks/useHeadlessBookingFlow.d.ts +8 -1
  20. package/dist/_dts/blocks/src/system/runtime/hooks/useHeadlessBookingFlow.state.d.ts +1 -0
  21. package/dist/_dts/blocks/src/system/runtime/nodes/booking-form.headless.state.d.ts +4 -0
  22. package/dist/_dts/blocks/src/system/runtime/nodes/booking-form.interactive.d.ts +40 -0
  23. package/dist/_dts/blocks/src/system/runtime/nodes/booking-form.reserved-fields.d.ts +1 -1
  24. package/dist/_dts/blocks/src/system/runtime/nodes/booking-form.state.d.ts +29 -0
  25. package/dist/_dts/blocks/src/system/runtime/nodes/booking-runtime-sources.d.ts +1 -0
  26. package/dist/_dts/blocks/src/system/runtime/nodes/course-registration/components.d.ts +6 -0
  27. package/dist/_dts/blocks/src/system/runtime/nodes/course-registration/useCourseRegistrationWizard.d.ts +8 -0
  28. package/dist/_dts/blocks/src/system/runtime/nodes/event-registration/TicketSelectionStep.d.ts +8 -0
  29. package/dist/_dts/blocks/src/system/runtime/nodes/event-registration/hooks.d.ts +1 -0
  30. package/dist/_dts/blocks/src/system/runtime/nodes/event-registration/types.d.ts +1 -1
  31. package/dist/_dts/blocks/src/system/runtime/nodes/event-registration/useEventRegistrationSubmit.d.ts +1 -0
  32. package/dist/_dts/blocks/src/system/runtime/nodes/event-registration/useEventRegistrationWizard.d.ts +9 -0
  33. package/dist/_dts/content-editor/src/controller/EntryControllerProvider.d.ts +14 -14
  34. package/dist/_dts/content-editor/src/controller/useEntrySyncHelpers.d.ts +1 -1
  35. package/dist/_dts/content-editor/src/hooks/useEntryActions.d.ts +5 -15
  36. package/dist/_dts/content-editor/src/ui/editorSnapshot.d.ts +46 -0
  37. package/dist/_dts/content-editor/src/ui/editorUiStore.d.ts +43 -36
  38. package/dist/_dts/content-model/src/entry-slots/types.d.ts +110 -2
  39. package/dist/_dts/core/src/branded.d.ts +3 -0
  40. package/dist/_dts/core/src/event-pricing.d.ts +18 -1
  41. package/dist/_dts/core/src/money-input.d.ts +34 -4
  42. package/dist/_dts/db/src/generated/supabase/database.types.d.ts +70 -0
  43. package/dist/_dts/media-core/src/fileAssetCompatibility.d.ts +1 -1
  44. package/dist/_dts/media-core/src/filePersistence.d.ts +5 -1
  45. package/dist/_dts/media-core/src/fileStorage.d.ts +1 -0
  46. package/dist/_dts/media-core/src/fileUploadFinalization.d.ts +29 -1
  47. package/dist/_dts/media-core/src/index.d.ts +1 -0
  48. package/dist/_dts/media-core/src/legacyMediaValue.d.ts +11 -0
  49. package/dist/_dts/media-core/src/videoPrep.d.ts +15 -6
  50. package/dist/_dts/media-core/src/videoSlotPolicy.d.ts +5 -5
  51. package/dist/_dts/media-react/src/hooks/useApiMediaUploader.d.ts +2 -1
  52. package/dist/_dts/sdk/src/cli/commands/push/execute/diff.d.ts +2 -0
  53. package/dist/_dts/sdk/src/cli/commands/push/execute/localMediaReporting.d.ts +23 -0
  54. package/dist/_dts/sdk/src/cli/commands/push/scopes/commandBackedDatedOfferingScope.d.ts +54 -0
  55. package/dist/_dts/sdk/src/cli/commands/push/scopes/mediaPrep.d.ts +7 -2
  56. package/dist/_dts/sdk/src/cli/commands/push/scopes/types.d.ts +6 -0
  57. package/dist/_dts/sdk/src/cli/media/local-sync.d.ts +35 -0
  58. package/dist/_dts/sdk/src/rendering/islands/types.d.ts +23 -1
  59. package/dist/_dts/sdk/src/version.d.ts +1 -1
  60. package/dist/{chunk-GDT2QGIL.mjs → chunk-A63UXN3P.mjs} +21 -19
  61. package/dist/{chunk-U5YM4AWE.mjs → chunk-AJZGT6YG.mjs} +1 -1
  62. package/dist/{chunk-AFPMCLS7.mjs → chunk-AQ6RT6LZ.mjs} +2 -2
  63. package/dist/{chunk-ZA2S7H34.mjs → chunk-NT76QGIJ.mjs} +98 -1
  64. package/dist/{chunk-RQUZYSES.mjs → chunk-PCNCETBI.mjs} +1196 -426
  65. package/dist/{chunk-S3YHJWEU.mjs → chunk-XIK2HYI3.mjs} +7 -7
  66. package/dist/cli/index.mjs +749 -166
  67. package/dist/client/{accordion-AFX37652.mjs → accordion-RNQIPG55.mjs} +2 -2
  68. package/dist/client/{bookingForm-32V5QCOW.mjs → bookingForm-HYEEVRLP.mjs} +89 -14
  69. package/dist/client/bookings.mjs +243 -17
  70. package/dist/client/{carousel-TJGQJ7ER.mjs → carousel-W7DQ3YPU.mjs} +3 -3
  71. package/dist/client/{cart-JUU2JEW4.mjs → cart-PXJ3SXXO.mjs} +7 -7
  72. package/dist/client/{checkout-RD6BTFX4.mjs → checkout-X3JYSOXI.mjs} +7 -7
  73. package/dist/client/{chunk-MLBNVN4H.mjs → chunk-6SYGVVWA.mjs} +67 -4
  74. package/dist/client/{chunk-E6VIWZUG.mjs → chunk-DUOHLWLF.mjs} +3 -3
  75. package/dist/client/{chunk-6QZIBNGV.mjs → chunk-IXDSXF2D.mjs} +154 -16
  76. package/dist/client/{chunk-CKXEUWWA.mjs → chunk-J6TMMMXW.mjs} +3 -3
  77. package/dist/client/{chunk-PMNAV6LO.mjs → chunk-JNE6UI6U.mjs} +7 -6
  78. package/dist/client/{chunk-ISAUXU5R.mjs → chunk-OLAOAZEO.mjs} +1 -1
  79. package/dist/client/{chunk-RWYFG625.mjs → chunk-PCHACQEB.mjs} +30 -2
  80. package/dist/client/{chunk-FMZZHAIR.mjs → chunk-PICR3NTQ.mjs} +52 -5
  81. package/dist/client/{chunk-6RN62XBV.mjs → chunk-Q47XGAGS.mjs} +1 -1
  82. package/dist/client/{chunk-WHZQDPBZ.mjs → chunk-TNGL2WJF.mjs} +1 -0
  83. package/dist/client/{chunk-C4LP6BPG.mjs → chunk-WERRJXNJ.mjs} +1 -1
  84. package/dist/client/{chunk-RMOFBBNA.mjs → chunk-YYVGSYBO.mjs} +6 -6
  85. package/dist/client/client.mjs +641 -54
  86. package/dist/client/{courseRegistration-X63QAIVV.mjs → courseRegistration-QZ67PVHO.mjs} +111 -11
  87. package/dist/client/{eventCalendar-5T24GCZL.mjs → eventCalendar-V3BDHQNT.mjs} +9 -9
  88. package/dist/client/{eventCombined-AZVTF22X.mjs → eventCombined-XYFRN2RG.mjs} +9 -9
  89. package/dist/client/{eventDetails-7GPFNLGF.mjs → eventDetails-TFE5TWKV.mjs} +9 -9
  90. package/dist/client/{eventListing-QEUMTMUM.mjs → eventListing-IQ6AGWZ6.mjs} +9 -9
  91. package/dist/client/{eventRegistration-P2EDKCQZ.mjs → eventRegistration-WGJVFKQJ.mjs} +9 -9
  92. package/dist/client/{form-NUJ7H4IN.mjs → form-6UZY6RUA.mjs} +3 -3
  93. package/dist/client/{headerSection-JB7LECPL.mjs → headerSection-RSFXY6V3.mjs} +3 -3
  94. package/dist/client/hooks.mjs +57 -5
  95. package/dist/client/{locationMap-UEYWUCSW.mjs → locationMap-24FH67I4.mjs} +3 -3
  96. package/dist/client/{newsletterForm-S2YZQ2X7.mjs → newsletterForm-QVL3MLTN.mjs} +3 -3
  97. package/dist/client/{productDetail-H5MADGG7.mjs → productDetail-ZDYN3G4T.mjs} +7 -7
  98. package/dist/client/{productList-DK7YON7H.mjs → productList-4BMJLQHZ.mjs} +7 -7
  99. package/dist/client/rendering/client.mjs +503 -36
  100. package/dist/client/rendering/islands.mjs +19 -19
  101. package/dist/client/rendering.mjs +583 -39
  102. package/dist/client/{shop-6PA7RDRJ.mjs → shop-U5C634FF.mjs} +7 -7
  103. package/dist/preview-next/client/runtime.mjs +5 -5
  104. package/dist/{sdk-runtime-JP5347OB.mjs → sdk-runtime-VGV46WVB.mjs} +6 -6
  105. package/dist/server/components.mjs +287 -68
  106. package/dist/server/config-validation.mjs +58 -5
  107. package/dist/server/config.mjs +58 -5
  108. package/dist/server/data.mjs +57 -5
  109. package/dist/server/index.mjs +104 -29
  110. package/dist/server/next.mjs +347 -85
  111. package/dist/server/page-converter.mjs +22 -5
  112. package/dist/server/prebuild.mjs +1 -1
  113. package/dist/server/rendering/server.mjs +287 -68
  114. package/dist/server/rendering.mjs +287 -68
  115. package/dist/server/routing.mjs +131 -67
  116. package/dist/server/server.mjs +189 -94
  117. package/package.json +1 -1
  118. package/dist/SdkPreviewModeRuntime-GMCDQPZZ.mjs +0 -8
@@ -6481,6 +6481,8 @@ function err(error) {
6481
6481
 
6482
6482
  // ../core/src/branded.ts
6483
6483
  var unsafeAsMediaAssetId = (id) => id;
6484
+ var unsafeAsStorageBucketName = (value) => value;
6485
+ var unsafeAsStoragePath = (value) => value;
6484
6486
 
6485
6487
  // ../core/src/assert-never.ts
6486
6488
  function assertNever(value, message = "Unexpected variant") {
@@ -6535,6 +6537,7 @@ function publicEventPricingType(pricing) {
6535
6537
  return "free";
6536
6538
  case "single_paid":
6537
6539
  case "ticket_types":
6540
+ case "sliding_scale":
6538
6541
  case "course":
6539
6542
  return isFreePublicEventPriceDisplay(pricing.display) ? "free" : "paid";
6540
6543
  case "external":
@@ -6547,6 +6550,7 @@ function publicEventPricingCurrency(pricing) {
6547
6550
  case "free_registration":
6548
6551
  case "single_paid":
6549
6552
  case "ticket_types":
6553
+ case "sliding_scale":
6550
6554
  return pricing.currency;
6551
6555
  case "course":
6552
6556
  return pricing.display.display.currency;
@@ -6578,6 +6582,8 @@ function formatCoursePriceDisplayLabel(display, options) {
6578
6582
  return `Course (${formatCurrencyAmount(display.amount, display.currency, options)})`;
6579
6583
  case "from":
6580
6584
  return `Course (From ${formatCurrencyAmount(display.amount, display.currency, options)})`;
6585
+ case "range":
6586
+ return `Course (${formatCurrencyAmount(display.minAmount, display.currency, options)} - ${formatCurrencyAmount(display.maxAmount, display.currency, options)})`;
6581
6587
  default:
6582
6588
  return assertNever(display);
6583
6589
  }
@@ -7028,64 +7034,76 @@ function formatKeyAsLabel(key) {
7028
7034
  // ../blocks/src/system/manifest/fieldValidation/index.ts
7029
7035
  import { z as z6 } from "zod";
7030
7036
 
7031
- // ../blocks/src/system/types/link.ts
7032
- import { z as z3 } from "zod";
7033
- var nullableString = z3.union([z3.string().min(1), z3.null()]);
7034
- var resolvedInternalLinkKeys = ["entityId", "entityType", "href", "title", "typeLabel"];
7035
- var internalRouteOnlyLinkSchema = z3.object({
7036
- kind: z3.literal("internal"),
7037
- routeId: z3.string().min(1)
7038
- }).passthrough().superRefine((value, ctx) => {
7039
- const hasResolvedMetadata = resolvedInternalLinkKeys.some((key) => value[key] != null);
7040
- if (!hasResolvedMetadata) return;
7041
- ctx.addIssue({
7042
- code: "custom",
7043
- message: "Internal links with resolved metadata must include entityId, entityType, href, title, and typeLabel"
7044
- });
7045
- });
7046
- var internalResolvedLinkSchema = z3.object({
7047
- kind: z3.literal("internal"),
7048
- routeId: z3.string().min(1),
7049
- entityId: z3.string().min(1),
7050
- entityType: z3.enum(["page", "content"]),
7051
- href: z3.string().min(1),
7052
- title: z3.string().min(1),
7053
- typeLabel: z3.string().min(1),
7054
- contentTypeKey: nullableString.optional(),
7055
- contentTypeName: nullableString.optional(),
7056
- updatedAt: nullableString.optional()
7057
- }).passthrough();
7058
- var internalLinkSchema = z3.union([
7059
- internalResolvedLinkSchema,
7060
- internalRouteOnlyLinkSchema
7061
- ]);
7062
- var externalLinkSchema2 = z3.object({
7063
- kind: z3.literal("external"),
7064
- href: z3.string().min(1)
7065
- }).passthrough();
7066
- var customLinkSchema2 = z3.object({
7067
- kind: z3.literal("url"),
7068
- href: z3.string().min(1)
7069
- }).passthrough();
7070
- var pageLinkSchema2 = z3.object({
7071
- kind: z3.literal("page"),
7072
- identifier: z3.string().min(1)
7073
- }).passthrough();
7074
- var entryLinkSchema2 = z3.object({
7075
- kind: z3.literal("entry"),
7076
- contentType: z3.string().min(1),
7077
- identifier: z3.string().min(1)
7078
- }).passthrough();
7079
- var linkSchema = z3.union([
7080
- internalLinkSchema,
7081
- externalLinkSchema2,
7082
- customLinkSchema2,
7083
- pageLinkSchema2,
7084
- entryLinkSchema2
7085
- ]);
7037
+ // ../media-core/src/fileSafety.ts
7038
+ var CONTROL_CHARACTER_PATTERN = /[\u0000-\u001f\u007f]/u;
7039
+ function containsUnsafePathSegmentCharacter(value) {
7040
+ return value.includes("/") || value.includes("\\") || CONTROL_CHARACTER_PATTERN.test(value);
7041
+ }
7042
+ function isReservedPathSegment(value) {
7043
+ return value === "." || value === "..";
7044
+ }
7045
+ function isUnsafePathSegment(segment) {
7046
+ return segment.trim().length === 0 || segment !== segment.trim() || isReservedPathSegment(segment) || containsUnsafePathSegmentCharacter(segment);
7047
+ }
7086
7048
 
7087
- // ../blocks/src/system/manifest/schema.ts
7088
- import { z as z5 } from "zod";
7049
+ // ../media-core/src/fileStorage.ts
7050
+ var FILE_STORAGE_BUCKETS = {
7051
+ publicSite: unsafeAsStorageBucketName("media"),
7052
+ privateSite: unsafeAsStorageBucketName("site-files-private"),
7053
+ temporary: unsafeAsStorageBucketName("temp-uploads")
7054
+ };
7055
+ var PUBLIC_SITE_FILE_STORAGE_BUCKETS = [
7056
+ FILE_STORAGE_BUCKETS.publicSite,
7057
+ // Existing site logo and font uploads predate the unified file buckets.
7058
+ unsafeAsStorageBucketName("site-assets"),
7059
+ unsafeAsStorageBucketName("site-fonts")
7060
+ ];
7061
+ var PRIVATE_SITE_FILE_BUCKET_MIME_TYPES = [
7062
+ "application/pdf",
7063
+ "application/vnd.openxmlformats-officedocument.wordprocessingml.document",
7064
+ "text/plain",
7065
+ "application/rtf",
7066
+ "text/rtf",
7067
+ "image/jpeg",
7068
+ "image/png",
7069
+ "image/webp",
7070
+ "image/gif",
7071
+ "image/avif",
7072
+ "image/heic",
7073
+ "image/heif",
7074
+ "image/svg+xml",
7075
+ "text/csv",
7076
+ "application/csv",
7077
+ "application/vnd.ms-excel",
7078
+ "application/zip",
7079
+ "application/x-zip-compressed",
7080
+ "audio/mpeg",
7081
+ "audio/mp4",
7082
+ "audio/wav",
7083
+ "audio/x-wav",
7084
+ "audio/ogg",
7085
+ "audio/webm",
7086
+ "audio/flac",
7087
+ "video/mp4",
7088
+ "video/webm",
7089
+ "video/quicktime"
7090
+ ];
7091
+ var TEMP_UPLOAD_BUCKET_MIME_TYPES = [
7092
+ ...PRIVATE_SITE_FILE_BUCKET_MIME_TYPES,
7093
+ "font/woff2",
7094
+ "application/font-woff2",
7095
+ "application/x-font-woff2",
7096
+ "application/octet-stream"
7097
+ ];
7098
+ function parseStoragePath(value) {
7099
+ return joinStoragePathSegments(value.split("/"));
7100
+ }
7101
+ function joinStoragePathSegments(segments) {
7102
+ if (segments.some(isUnsafePathSegment)) {
7103
+ return err("unsafe-path-segment");
7104
+ }
7105
+ return ok(unsafeAsStoragePath(segments.join("/")));
7106
+ }
7089
7107
 
7090
7108
  // ../media-core/src/typeGuards.ts
7091
7109
  function isRecord(value) {
@@ -7103,10 +7121,10 @@ var RELATIVE_STORAGE_PATH_PREFIXES = [
7103
7121
  "imports/"
7104
7122
  ];
7105
7123
  function isRelativeDirectImageStoragePath(storagePath) {
7106
- return RELATIVE_STORAGE_PATH_PREFIXES.some((prefix) => storagePath.startsWith(prefix));
7124
+ return RELATIVE_STORAGE_PATH_PREFIXES.some((prefix) => storagePath.startsWith(prefix)) && parseStoragePath(storagePath).ok;
7107
7125
  }
7108
7126
  function isSiteScopedDirectImageStoragePath(storagePath) {
7109
- return storagePath.startsWith("sites/");
7127
+ return storagePath.startsWith("sites/") && parseStoragePath(storagePath).ok;
7110
7128
  }
7111
7129
  function encodeStoragePath(storagePath) {
7112
7130
  return storagePath.split("/").map((segment) => encodeURIComponent(segment)).join("/");
@@ -7362,6 +7380,82 @@ function mediaIdentifierOrFallback(current, fallback2) {
7362
7380
  return fallback2 ?? (typeof current === "string" ? current : void 0);
7363
7381
  }
7364
7382
 
7383
+ // ../media-core/src/legacyMediaValue.ts
7384
+ function legacyStringMediaTypeForField(field) {
7385
+ if (field.type === "file") {
7386
+ return field.fileKinds?.[0] ?? "document";
7387
+ }
7388
+ return field.mediaKinds?.[0] ?? "image";
7389
+ }
7390
+ function normalizeLegacyStringMediaValueForField(value, field) {
7391
+ if (typeof value !== "string") return value;
7392
+ const src = value.trim();
7393
+ if (!src) return value;
7394
+ return {
7395
+ type: legacyStringMediaTypeForField(field),
7396
+ src
7397
+ };
7398
+ }
7399
+
7400
+ // ../blocks/src/system/types/link.ts
7401
+ import { z as z3 } from "zod";
7402
+ var nullableString = z3.union([z3.string().min(1), z3.null()]);
7403
+ var resolvedInternalLinkKeys = ["entityId", "entityType", "href", "title", "typeLabel"];
7404
+ var internalRouteOnlyLinkSchema = z3.object({
7405
+ kind: z3.literal("internal"),
7406
+ routeId: z3.string().min(1)
7407
+ }).passthrough().superRefine((value, ctx) => {
7408
+ const hasResolvedMetadata = resolvedInternalLinkKeys.some((key) => value[key] != null);
7409
+ if (!hasResolvedMetadata) return;
7410
+ ctx.addIssue({
7411
+ code: "custom",
7412
+ message: "Internal links with resolved metadata must include entityId, entityType, href, title, and typeLabel"
7413
+ });
7414
+ });
7415
+ var internalResolvedLinkSchema = z3.object({
7416
+ kind: z3.literal("internal"),
7417
+ routeId: z3.string().min(1),
7418
+ entityId: z3.string().min(1),
7419
+ entityType: z3.enum(["page", "content"]),
7420
+ href: z3.string().min(1),
7421
+ title: z3.string().min(1),
7422
+ typeLabel: z3.string().min(1),
7423
+ contentTypeKey: nullableString.optional(),
7424
+ contentTypeName: nullableString.optional(),
7425
+ updatedAt: nullableString.optional()
7426
+ }).passthrough();
7427
+ var internalLinkSchema = z3.union([
7428
+ internalResolvedLinkSchema,
7429
+ internalRouteOnlyLinkSchema
7430
+ ]);
7431
+ var externalLinkSchema2 = z3.object({
7432
+ kind: z3.literal("external"),
7433
+ href: z3.string().min(1)
7434
+ }).passthrough();
7435
+ var customLinkSchema2 = z3.object({
7436
+ kind: z3.literal("url"),
7437
+ href: z3.string().min(1)
7438
+ }).passthrough();
7439
+ var pageLinkSchema2 = z3.object({
7440
+ kind: z3.literal("page"),
7441
+ identifier: z3.string().min(1)
7442
+ }).passthrough();
7443
+ var entryLinkSchema2 = z3.object({
7444
+ kind: z3.literal("entry"),
7445
+ contentType: z3.string().min(1),
7446
+ identifier: z3.string().min(1)
7447
+ }).passthrough();
7448
+ var linkSchema = z3.union([
7449
+ internalLinkSchema,
7450
+ externalLinkSchema2,
7451
+ customLinkSchema2,
7452
+ pageLinkSchema2,
7453
+ entryLinkSchema2
7454
+ ]);
7455
+
7456
+ // ../blocks/src/system/manifest/schema.ts
7457
+ import { z as z5 } from "zod";
7458
+
7365
7459
  // ../blocks/src/system/node/schema.ts
7366
7460
  import { z as z4 } from "zod";
7367
7461
  var transformStepSchema = z4.object({
@@ -9122,7 +9216,10 @@ function deriveFieldValidationPlan(field, path = [field.id]) {
9122
9216
  return makePlan("richText", "object", field, path, required, commonConstraints(required, { kind: "richTextDoc" }));
9123
9217
  case "media":
9124
9218
  case "file":
9125
- return makePlan("media", "object", field, path, required, commonConstraints(required, { kind: "mediaObject" }));
9219
+ return {
9220
+ ...makePlan("media", "object", field, path, required, commonConstraints(required, { kind: "mediaObject" })),
9221
+ legacyStringType: legacyStringMediaTypeForField(field)
9222
+ };
9126
9223
  case "link":
9127
9224
  return makePlan("link", "object", field, path, required, commonConstraints(required, { kind: "linkObject" }));
9128
9225
  case "boolean":
@@ -9307,15 +9404,23 @@ function normalizeFieldValue(plan, value, ctx) {
9307
9404
  return normalizeRepeaterItems(plan, value, ctx);
9308
9405
  case "boolean":
9309
9406
  case "richText":
9310
- case "media":
9311
9407
  case "link":
9312
9408
  case "select":
9313
9409
  case "passthrough":
9314
9410
  return value;
9411
+ case "media":
9412
+ return normalizeMediaInput(plan, value);
9315
9413
  default:
9316
9414
  return assertNever2(plan);
9317
9415
  }
9318
9416
  }
9417
+ function normalizeMediaInput(plan, value) {
9418
+ return normalizeLegacyStringMediaValueForField(value, {
9419
+ type: plan.fieldType,
9420
+ mediaKinds: plan.fieldType === "media" ? [plan.legacyStringType] : void 0,
9421
+ fileKinds: plan.fieldType === "file" ? [plan.legacyStringType] : void 0
9422
+ });
9423
+ }
9319
9424
  function normalizeObjectChildren(children, value, ctx) {
9320
9425
  if (!value || typeof value !== "object" || Array.isArray(value)) return value;
9321
9426
  const normalized = {
@@ -9579,6 +9684,21 @@ function fieldPlanToZod(plan, options = {}) {
9579
9684
  }
9580
9685
  });
9581
9686
  }
9687
+ function fieldPresenceForPlan(plan) {
9688
+ return plan.required ? { kind: "required" } : { kind: "optional" };
9689
+ }
9690
+ function fieldPlanToObjectPropertyZod(plan, options = {}) {
9691
+ const schema = fieldPlanToZod(plan, options);
9692
+ const presence = fieldPresenceForPlan(plan);
9693
+ switch (presence.kind) {
9694
+ case "required":
9695
+ return schema;
9696
+ case "optional":
9697
+ return schema.optional();
9698
+ default:
9699
+ return assertNever2(presence);
9700
+ }
9701
+ }
9582
9702
  function addFieldIssueToZodContext(zodCtx, validationIssue, rootPath) {
9583
9703
  const message = fieldIssueToMessage(validationIssue);
9584
9704
  const path = relativeZodIssuePath(validationIssue.path, rootPath);
@@ -9791,7 +9911,7 @@ function createManifestValidator(manifestOrFields, options = {}) {
9791
9911
  function deriveContentZodFromPlans(plans, options) {
9792
9912
  const shape = {};
9793
9913
  for (const plan of plans) {
9794
- shape[plan.fieldId] = fieldPlanToZod(plan, options);
9914
+ shape[plan.fieldId] = fieldPlanToObjectPropertyZod(plan, options);
9795
9915
  }
9796
9916
  return z7.object(shape).catchall(z7.unknown()).passthrough();
9797
9917
  }
@@ -32900,9 +33020,12 @@ var coursePricingOptionSchema = z45.object({
32900
33020
  });
32901
33021
  var coursePricingSchema = z45.object({
32902
33022
  bookingRequirement: z45.enum(["none", "required"]),
32903
- pricingStrategy: z45.enum(["free", "single", "tiered"]),
33023
+ pricingStrategy: z45.enum(["free", "single", "tiered", "sliding_scale"]),
32904
33024
  currency: z45.string(),
32905
33025
  singlePriceAmount: z45.number().nullable(),
33026
+ slidingMinAmount: z45.number().nullable().optional(),
33027
+ slidingMaxAmount: z45.number().nullable().optional(),
33028
+ slidingSuggestedAmount: z45.number().nullable().optional(),
32906
33029
  paymentTerms: blockBookingPaymentTermsSchema,
32907
33030
  options: z45.array(coursePricingOptionSchema)
32908
33031
  });
@@ -33056,6 +33179,19 @@ var publicEventPricingSchema = z46.discriminatedUnion("kind", [
33056
33179
  ticketTypes: z46.array(publicEventTicketTypeSchema),
33057
33180
  display: publicEventTicketTypePriceDisplaySchema
33058
33181
  }),
33182
+ z46.object({
33183
+ kind: z46.literal("sliding_scale"),
33184
+ minAmount: z46.number(),
33185
+ maxAmount: z46.number(),
33186
+ suggestedAmount: z46.number().nullable(),
33187
+ currency: z46.string(),
33188
+ display: z46.object({
33189
+ kind: z46.literal("range"),
33190
+ minAmount: z46.number(),
33191
+ maxAmount: z46.number(),
33192
+ currency: z46.string()
33193
+ })
33194
+ }),
33059
33195
  z46.object({
33060
33196
  kind: z46.literal("course"),
33061
33197
  display: z46.object({ kind: z46.literal("course"), display: publicCoursePriceDisplaySchema })
@@ -33472,7 +33608,7 @@ function isRecord6(value) {
33472
33608
  }
33473
33609
  function isPublicEventPricing(value) {
33474
33610
  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";
33611
+ return value.kind === "drop_in" || value.kind === "free_registration" || value.kind === "single_paid" || value.kind === "sliding_scale" || value.kind === "ticket_types" || value.kind === "course" || value.kind === "external";
33476
33612
  }
33477
33613
  function isPublicEventTicketType(value) {
33478
33614
  return isRecord6(value) && typeof value.id === "string";
@@ -34089,7 +34225,9 @@ function getSelectableCoursePricingOptionsForNow(course, now) {
34089
34225
  return left.name.localeCompare(right.name);
34090
34226
  });
34091
34227
  }
34092
- function resolveCoursePricingState(course, selectedPricingOptionId, nowInput = {}) {
34228
+ function resolveCoursePricingState(course, selectedPricingOptionId, selectedSlidingAmountOrNowInput, nowInput = {}) {
34229
+ const selectedSlidingAmount = typeof selectedSlidingAmountOrNowInput === "number" || selectedSlidingAmountOrNowInput === null ? selectedSlidingAmountOrNowInput : null;
34230
+ const effectiveNowInput = typeof selectedSlidingAmountOrNowInput === "object" && selectedSlidingAmountOrNowInput !== null ? selectedSlidingAmountOrNowInput : nowInput;
34093
34231
  const currency = course.pricing?.currency ?? course.currency;
34094
34232
  if (!course.pricing) {
34095
34233
  const legacyAmount = course.priceCents ?? 0;
@@ -34099,6 +34237,8 @@ function resolveCoursePricingState(course, selectedPricingOptionId, nowInput = {
34099
34237
  selectableOptions: [],
34100
34238
  requiresSelection: false,
34101
34239
  selectedOption: null,
34240
+ slidingScale: null,
34241
+ selectedSlidingAmount: null,
34102
34242
  selectedPriceAmount: legacyAmount,
34103
34243
  selectedRequiresPayment: legacyAmount > 0,
34104
34244
  hasPaidSelection: legacyAmount > 0,
@@ -34113,6 +34253,8 @@ function resolveCoursePricingState(course, selectedPricingOptionId, nowInput = {
34113
34253
  selectableOptions: [],
34114
34254
  requiresSelection: false,
34115
34255
  selectedOption: null,
34256
+ slidingScale: null,
34257
+ selectedSlidingAmount: null,
34116
34258
  selectedPriceAmount: 0,
34117
34259
  selectedRequiresPayment: false,
34118
34260
  hasPaidSelection: false,
@@ -34126,6 +34268,8 @@ function resolveCoursePricingState(course, selectedPricingOptionId, nowInput = {
34126
34268
  selectableOptions: [],
34127
34269
  requiresSelection: false,
34128
34270
  selectedOption: null,
34271
+ slidingScale: null,
34272
+ selectedSlidingAmount: null,
34129
34273
  selectedPriceAmount: amount,
34130
34274
  selectedRequiresPayment: amount > 0,
34131
34275
  hasPaidSelection: amount > 0,
@@ -34135,7 +34279,7 @@ function resolveCoursePricingState(course, selectedPricingOptionId, nowInput = {
34135
34279
  case "tiered": {
34136
34280
  const selectableOptions = getSelectableCoursePricingOptionsForNow(
34137
34281
  course,
34138
- resolvePlanningDateInput(nowInput)
34282
+ resolvePlanningDateInput(effectiveNowInput)
34139
34283
  );
34140
34284
  const selectedOption = (selectedPricingOptionId ? selectableOptions.find((option) => option.id === selectedPricingOptionId) : null) ?? (selectableOptions.length === 1 ? selectableOptions[0] ?? null : null);
34141
34285
  const lowestAmount = selectableOptions.reduce((lowest, option) => {
@@ -34151,12 +34295,51 @@ function resolveCoursePricingState(course, selectedPricingOptionId, nowInput = {
34151
34295
  selectableOptions,
34152
34296
  requiresSelection: selectableOptions.length > 1,
34153
34297
  selectedOption,
34298
+ slidingScale: null,
34299
+ selectedSlidingAmount: null,
34154
34300
  selectedPriceAmount: selectedOption?.priceAmount ?? null,
34155
34301
  selectedRequiresPayment: (selectedOption?.priceAmount ?? 0) > 0,
34156
34302
  hasPaidSelection: selectableOptions.some((option) => option.priceAmount > 0),
34157
34303
  hasFreeSelection: selectableOptions.some((option) => option.priceAmount === 0)
34158
34304
  };
34159
34305
  }
34306
+ case "sliding_scale": {
34307
+ const minAmount = course.pricing.slidingMinAmount ?? null;
34308
+ const maxAmount = course.pricing.slidingMaxAmount ?? null;
34309
+ if (minAmount === null || maxAmount === null || minAmount < 0 || maxAmount < minAmount) {
34310
+ return {
34311
+ currency,
34312
+ display: { kind: "unavailable", currency },
34313
+ selectableOptions: [],
34314
+ requiresSelection: true,
34315
+ selectedOption: null,
34316
+ slidingScale: null,
34317
+ selectedSlidingAmount: null,
34318
+ selectedPriceAmount: null,
34319
+ selectedRequiresPayment: false,
34320
+ hasPaidSelection: false,
34321
+ hasFreeSelection: false
34322
+ };
34323
+ }
34324
+ const normalizedSelectedAmount = typeof selectedSlidingAmount === "number" && Number.isFinite(selectedSlidingAmount) ? selectedSlidingAmount : null;
34325
+ return {
34326
+ currency,
34327
+ display: { kind: "range", minAmount, maxAmount, currency },
34328
+ selectableOptions: [],
34329
+ requiresSelection: normalizedSelectedAmount === null,
34330
+ selectedOption: null,
34331
+ slidingScale: {
34332
+ minAmount,
34333
+ maxAmount,
34334
+ suggestedAmount: course.pricing.slidingSuggestedAmount ?? null
34335
+ },
34336
+ selectedSlidingAmount: normalizedSelectedAmount,
34337
+ selectedPriceAmount: normalizedSelectedAmount,
34338
+ selectedRequiresPayment: (normalizedSelectedAmount ?? 0) > 0,
34339
+ hasPaidSelection: maxAmount > 0,
34340
+ hasFreeSelection: minAmount === 0
34341
+ };
34342
+ }
34160
34343
  }
34161
34344
  }
34162
34345
  function formatCoursePriceDisplay(display, locale) {
@@ -46636,6 +46819,7 @@ var bookingServiceSchema = z66.object({
46636
46819
  title: z66.string(),
46637
46820
  description: z66.string().nullable().optional().transform((value) => value ?? void 0),
46638
46821
  durationMinutes: z66.number().optional(),
46822
+ pricing: z66.custom().optional(),
46639
46823
  priceAmount: z66.number().nullable().optional(),
46640
46824
  priceCurrency: z66.string().nullable().optional(),
46641
46825
  paymentTerms: blockBookingPaymentTermsSchema.optional(),
@@ -67366,12 +67550,85 @@ function resolveApiBaseUrl() {
67366
67550
  }
67367
67551
 
67368
67552
  // ../api/src/common/envelope.ts
67553
+ var API_ERROR_CODES = [
67554
+ "auth:unauthenticated",
67555
+ "auth:token_expired",
67556
+ "auth:token_invalid",
67557
+ "auth:forbidden",
67558
+ "auth:mfa_required",
67559
+ "auth:sudo_required",
67560
+ "auth:insufficient_permissions",
67561
+ "auth:impersonation_restricted",
67562
+ "validation:invalid_input",
67563
+ "validation:missing_field",
67564
+ "validation:invalid_format",
67565
+ "validation:payload_too_large",
67566
+ "resource:not_found",
67567
+ "resource:already_exists",
67568
+ "resource:conflict",
67569
+ "resource:gone",
67570
+ "rate_limit:exceeded",
67571
+ "billing:payment_required",
67572
+ "billing:plan_limit_exceeded",
67573
+ "billing:pass_redemption_failed",
67574
+ "server:internal_error",
67575
+ "server:unavailable",
67576
+ "external:service_error",
67577
+ "external:registrar_orphaned_contact_profile",
67578
+ "network:connection_error",
67579
+ "network:timeout",
67580
+ "network:dns_error"
67581
+ ];
67582
+ var API_ERROR_CODE_SET = new Set(API_ERROR_CODES);
67583
+ function isApiErrorCode(value) {
67584
+ return typeof value === "string" && API_ERROR_CODE_SET.has(value);
67585
+ }
67369
67586
  function isApiError(result) {
67370
67587
  return result.success === false;
67371
67588
  }
67372
67589
  function isApiSuccess(result) {
67373
67590
  return result.success === true;
67374
67591
  }
67592
+ function isRecord14(value) {
67593
+ return typeof value === "object" && value !== null && !Array.isArray(value);
67594
+ }
67595
+ function isFieldError(value) {
67596
+ return isRecord14(value) && typeof value.field === "string" && typeof value.code === "string" && typeof value.message === "string";
67597
+ }
67598
+ function fieldErrorsFromUnknown(value) {
67599
+ if (!Array.isArray(value)) return null;
67600
+ return value.every(isFieldError) ? value : null;
67601
+ }
67602
+ function extractEnvelopeErrorObject(body) {
67603
+ if (!isRecord14(body)) return null;
67604
+ const error = body.error;
67605
+ if (!isRecord14(error)) return null;
67606
+ if ("success" in body && body.success !== false) {
67607
+ return null;
67608
+ }
67609
+ return error;
67610
+ }
67611
+ function extractApiEnvelopeErrorDetails(body) {
67612
+ const error = extractEnvelopeErrorObject(body);
67613
+ if (!error) {
67614
+ return {
67615
+ rawCode: null,
67616
+ code: null,
67617
+ message: null,
67618
+ status: null,
67619
+ fieldErrors: null
67620
+ };
67621
+ }
67622
+ const rawCode = typeof error.code === "string" ? error.code : null;
67623
+ const message = typeof error.message === "string" && error.message.trim().length > 0 ? error.message : null;
67624
+ return {
67625
+ rawCode,
67626
+ code: isApiErrorCode(rawCode) ? rawCode : null,
67627
+ message,
67628
+ status: typeof error.status === "number" && Number.isFinite(error.status) ? error.status : null,
67629
+ fieldErrors: fieldErrorsFromUnknown(error.fieldErrors)
67630
+ };
67631
+ }
67375
67632
  var ApiEnvelopeError = class extends Error {
67376
67633
  constructor(error) {
67377
67634
  super(error.message);
@@ -67768,6 +68025,7 @@ function createParsedClient(rawClient) {
67768
68025
  const auth = config.auth ?? "user";
67769
68026
  if (!response.ok) {
67770
68027
  const body = await parseErrorBody(response);
68028
+ const envelopeError = extractApiEnvelopeErrorDetails(body);
67771
68029
  const requestId = response.headers.get("x-request-id") ?? void 0;
67772
68030
  const retryAfterMs = parseRetryAfterHeader(response.headers.get("retry-after"));
67773
68031
  throw new ApiRequestError(
@@ -67779,6 +68037,7 @@ function createParsedClient(rawClient) {
67779
68037
  auth,
67780
68038
  requestId,
67781
68039
  body,
68040
+ errorCode: envelopeError.code ?? void 0,
67782
68041
  retryAfterMs
67783
68042
  }
67784
68043
  );
@@ -67808,6 +68067,7 @@ var CANONICAL_REFUND_CONFLICT_CODES = [
67808
68067
  ];
67809
68068
  var CANONICAL_REFUND_PLANNER_ERROR_CODES = [
67810
68069
  ...CANONICAL_REFUND_CONFLICT_CODES,
68070
+ "invalid_amount",
67811
68071
  "amount_exceeds_remaining",
67812
68072
  "pass_revoke_requires_full_refund",
67813
68073
  "refund_failed"
@@ -67834,6 +68094,7 @@ var CUSTOMER_MEMBERSHIP_PAYMENT_REFUND_FAILED_CODES = [
67834
68094
  // ../api/src/bookingRefundOutcomes.ts
67835
68095
  var STANDARD_LINE_ITEM_REFUND_INVALID_CODES = [
67836
68096
  "missing_amount",
68097
+ "invalid_amount",
67837
68098
  "amount_exceeds_remaining",
67838
68099
  "credit_refunds_disabled",
67839
68100
  "missing_credit_customer",
@@ -67848,6 +68109,7 @@ var EVENT_ATTENDEE_REFUND_INVALID_CODES = [
67848
68109
  var MANAGED_PRODUCT_REFUND_INVALID_CODES = [
67849
68110
  "credit_refunds_disabled",
67850
68111
  "not_refundable",
68112
+ "invalid_amount",
67851
68113
  "amount_exceeds_remaining"
67852
68114
  ];
67853
68115
  var CUSTOMER_PASS_REFUND_INVALID_CODES = [
@@ -68092,7 +68354,7 @@ function preset(id, verticalId, canonicalBehaviour, label, pluralLabel, descript
68092
68354
  }
68093
68355
 
68094
68356
  // ../api/src/utils/isRecord.ts
68095
- function isRecord14(value) {
68357
+ function isRecord15(value) {
68096
68358
  return typeof value === "object" && value !== null && !Array.isArray(value);
68097
68359
  }
68098
68360
 
@@ -68399,7 +68661,7 @@ function sanitizeMarks(marks) {
68399
68661
  if (mark.type === "bold" || mark.type === "strong" || mark.type === "italic" || mark.type === "em") {
68400
68662
  return [{ type: mark.type }];
68401
68663
  }
68402
- if (mark.type === "link" && isRecord14(mark.attrs) && typeof mark.attrs.href === "string") {
68664
+ if (mark.type === "link" && isRecord15(mark.attrs) && typeof mark.attrs.href === "string") {
68403
68665
  const attrs = { href: mark.attrs.href };
68404
68666
  if (typeof mark.attrs.target === "string" && mark.attrs.target.trim().length > 0) {
68405
68667
  attrs.target = mark.attrs.target;
@@ -68414,10 +68676,10 @@ function sanitizeMarks(marks) {
68414
68676
  return sanitized.length > 0 ? sanitized : void 0;
68415
68677
  }
68416
68678
  function unwrapRichTextValue(value) {
68417
- if (isRecord14(value) && isRecord14(value.doc)) {
68679
+ if (isRecord15(value) && isRecord15(value.doc)) {
68418
68680
  return unwrapRichTextValue(value.doc);
68419
68681
  }
68420
- if (isRecord14(value) && value.type === "doc") {
68682
+ if (isRecord15(value) && value.type === "doc") {
68421
68683
  return {
68422
68684
  type: "doc",
68423
68685
  content: Array.isArray(value.content) ? value.content.filter(isTipTapNodeLike).map(coerceTipTapNode) : []
@@ -68426,7 +68688,7 @@ function unwrapRichTextValue(value) {
68426
68688
  return EMPTY_SITE_BANNER_BODY;
68427
68689
  }
68428
68690
  function isTipTapNodeLike(value) {
68429
- return isRecord14(value) && typeof value.type === "string";
68691
+ return isRecord15(value) && typeof value.type === "string";
68430
68692
  }
68431
68693
  function coerceTipTapNode(value) {
68432
68694
  return {
@@ -68434,9 +68696,9 @@ function coerceTipTapNode(value) {
68434
68696
  ...Array.isArray(value.content) ? { content: value.content.filter(isTipTapNodeLike).map(coerceTipTapNode) } : {},
68435
68697
  ...typeof value.text === "string" ? { text: value.text } : {},
68436
68698
  ...Array.isArray(value.marks) ? {
68437
- marks: value.marks.filter((mark) => isRecord14(mark) && typeof mark.type === "string").map((mark) => ({
68699
+ marks: value.marks.filter((mark) => isRecord15(mark) && typeof mark.type === "string").map((mark) => ({
68438
68700
  type: mark.type,
68439
- ...isRecord14(mark.attrs) ? { attrs: mark.attrs } : {}
68701
+ ...isRecord15(mark.attrs) ? { attrs: mark.attrs } : {}
68440
68702
  }))
68441
68703
  } : {}
68442
68704
  };
@@ -68626,7 +68888,7 @@ var ENTRY_REF_KEYS = [
68626
68888
  "entryId",
68627
68889
  "slug"
68628
68890
  ];
68629
- function isRecord15(value) {
68891
+ function isRecord16(value) {
68630
68892
  return Boolean(value) && typeof value === "object" && !Array.isArray(value);
68631
68893
  }
68632
68894
  function extractManualEntryRef(item) {
@@ -68634,7 +68896,7 @@ function extractManualEntryRef(item) {
68634
68896
  const trimmed = item.trim();
68635
68897
  return trimmed.length > 0 ? trimmed : null;
68636
68898
  }
68637
- if (!isRecord15(item)) return null;
68899
+ if (!isRecord16(item)) return null;
68638
68900
  for (const key of ENTRY_REF_KEYS) {
68639
68901
  const raw = item[key];
68640
68902
  if (typeof raw === "string" && raw.trim().length > 0) {
@@ -69159,7 +69421,7 @@ function collectMediaAssetSidecar(mediaAssets) {
69159
69421
  return Array.isArray(mediaAssets) && mediaAssets.length > 0 ? mediaAssets : void 0;
69160
69422
  }
69161
69423
  function convertPageResponseBlock(block) {
69162
- if (!isRecord16(block)) {
69424
+ if (!isRecord17(block)) {
69163
69425
  throw new Error("Invalid block format in page API response");
69164
69426
  }
69165
69427
  if (typeof block.id !== "string" && block.id !== null) {
@@ -69190,20 +69452,20 @@ function buildPageOutline(input) {
69190
69452
  blocks: input.blocks.map(convertPageResponseBlock)
69191
69453
  };
69192
69454
  }
69193
- function isRecord16(value) {
69455
+ function isRecord17(value) {
69194
69456
  return Boolean(value) && typeof value === "object" && !Array.isArray(value);
69195
69457
  }
69196
69458
  function readContentRecord(value) {
69197
- return isRecord16(value) ? value : void 0;
69459
+ return isRecord17(value) ? value : void 0;
69198
69460
  }
69199
69461
  function readNestedContentRecord(value) {
69200
- if (!isRecord16(value)) return null;
69462
+ if (!isRecord17(value)) return null;
69201
69463
  return readContentRecord(value.data) ?? null;
69202
69464
  }
69203
69465
  function sanitizeSdkRuntimeBlockContent(blockKind, content) {
69204
69466
  if (blockKind !== "block.newsletter-signup") return content;
69205
69467
  const sanitized = sanitizeNewsletterSignupPublicContent(content);
69206
- return isRecord16(sanitized) ? sanitized : {};
69468
+ return isRecord17(sanitized) ? sanitized : {};
69207
69469
  }
69208
69470
  function sanitizeNullableSdkRuntimeBlockContent(blockKind, content) {
69209
69471
  return content ? sanitizeSdkRuntimeBlockContent(blockKind, content) : null;
@@ -69820,15 +70082,15 @@ function Page(props2) {
69820
70082
  var lazyBlockOverrideSymbol = /* @__PURE__ */ Symbol.for("riverbankcms.sdk.lazyBlockOverride");
69821
70083
 
69822
70084
  // src/rendering/overrideResolution.ts
69823
- function isRecord17(value) {
70085
+ function isRecord18(value) {
69824
70086
  return typeof value === "object" && value !== null;
69825
70087
  }
69826
70088
  function isBlockOutlineLike(value) {
69827
70089
  const id = value.id;
69828
- return typeof value.kind === "string" && (typeof id === "string" || id === null) && (typeof value.purpose === "string" || isRecord17(value.content) || isRecord17(value.draftContent) || isRecord17(value.bindings));
70090
+ return typeof value.kind === "string" && (typeof id === "string" || id === null) && (typeof value.purpose === "string" || isRecord18(value.content) || isRecord18(value.draftContent) || isRecord18(value.bindings));
69829
70091
  }
69830
70092
  function collectBlockKindsFromValue(value, usedKinds, seen) {
69831
- if (!isRecord17(value)) return;
70093
+ if (!isRecord18(value)) return;
69832
70094
  if (seen.has(value)) return;
69833
70095
  seen.add(value);
69834
70096
  if (isBlockOutlineLike(value)) {
@@ -69877,7 +70139,7 @@ function selectOverrideKeysForUsedKinds(usedKinds, entries) {
69877
70139
  return selectedKeys;
69878
70140
  }
69879
70141
  function isLazyRegistration(registration) {
69880
- return isRecord17(registration) && registration[lazyBlockOverrideSymbol] === true;
70142
+ return isRecord18(registration) && registration[lazyBlockOverrideSymbol] === true;
69881
70143
  }
69882
70144
  async function resolveOverrideComponent(registration) {
69883
70145
  if (isLazyRegistration(registration)) {
@@ -70879,7 +71141,7 @@ var CircuitOpenError = class extends Error {
70879
71141
  };
70880
71142
 
70881
71143
  // src/version.ts
70882
- var SDK_VERSION = "0.91.0";
71144
+ var SDK_VERSION = "0.93.0";
70883
71145
 
70884
71146
  // src/next/content-load-failure.ts
70885
71147
  var SdkContentLoadError = RiverbankContentLoadError;