riverbankcms 0.20.0 → 0.21.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.
@@ -1,5 +1,5 @@
1
1
  #!/usr/bin/env node
2
- import { An as unsafeAsStoragePath, B as parsePublicContactDetails, C as stableJsonStringify, Cn as unsafeAsProductId, Dn as unsafeAsSiteScopedStoragePath, En as unsafeAsSiteId, H as isPresent, Mn as unsafeAsUserId, Mt as fromArray, N as parseFooterCompositionV1, Nn as err, Nt as mapNonEmptyArray, P as footerNavigationLayouts, Pn as ok, Pt as mapReadonlyNonEmptyArray, Tn as unsafeAsSiteFontId, Wt as assertNever, Zt as parseMediaAssetId, an as unsafeAsBookingRequirementId, bn as unsafeAsPositiveByteCount, c as resolveSiteVerticalBookingConfig, cn as unsafeAsDeclaredMimeType, ct as validateBookingPaymentOptionKinds, d as ORDINARY_EVENT_PRESET_VALUES, dn as unsafeAsEntitlementId, gn as unsafeAsMediaAssetId, hn as unsafeAsFileChecksumSha256, jn as unsafeAsUploadSessionId, kn as unsafeAsStorageBucketName, nt as localScheduleTimePattern, on as unsafeAsBookingSessionId, r as NAVIGATION_LOCATIONS, rt as parseUtcIsoDateTimeString, st as parseBookingTimeZone, tn as parseSiteId, u as EVENT_PRESET_VALUES, un as unsafeAsDetectedMimeType, vn as unsafeAsOriginalFilename, wn as unsafeAsSafeDownloadFilename, xn as unsafeAsPositiveSeconds, z as isCanonicalRichTextDoc } from "./src-Dixcv4PB.mjs";
2
+ import { An as unsafeAsSiteScopedStoragePath, B as isPresent, C as stableJsonStringify, Cn as unsafeAsPositiveByteCount, Dn as unsafeAsSafeDownloadFilename, En as unsafeAsProductId, Fn as unsafeAsUserId, Ft as fromArray, In as err, It as mapNonEmptyArray, L as isCanonicalRichTextDoc, Ln as ok, Lt as mapReadonlyNonEmptyArray, M as parseFooterCompositionV1, Mn as unsafeAsStorageBucketName, N as footerNavigationLayouts, Nn as unsafeAsStoragePath, On as unsafeAsSiteFontId, Pn as unsafeAsUploadSessionId, R as parsePublicContactDetails, c as resolveSiteVerticalBookingConfig, cn as unsafeAsBookingRequirementId, d as ORDINARY_EVENT_PRESET_VALUES, dn as unsafeAsDeclaredMimeType, dt as validateBookingPaymentOptionKinds, en as parseMediaAssetId, in as parseSiteId, it as parseUtcIsoDateTimeString, kn as unsafeAsSiteId, ln as unsafeAsBookingSessionId, mn as unsafeAsEntitlementId, pn as unsafeAsDetectedMimeType, qt as assertNever, r as NAVIGATION_LOCATIONS, rt as localScheduleTimePattern, u as EVENT_PRESET_VALUES, ut as parseBookingTimeZone, vn as unsafeAsFileChecksumSha256, wn as unsafeAsPositiveSeconds, xn as unsafeAsOriginalFilename, yn as unsafeAsMediaAssetId } from "./src-BENi4Q5k.mjs";
3
3
  import "node:module";
4
4
  import { z } from "zod";
5
5
 
@@ -8763,11 +8763,11 @@ function isVideoPosterFileAssetSource(source) {
8763
8763
 
8764
8764
  //#endregion
8765
8765
  //#region ../media-core/src/typeGuards.ts
8766
- function isRecord$4(value) {
8766
+ function isRecord$3(value) {
8767
8767
  return Boolean(value) && typeof value === "object" && !Array.isArray(value);
8768
8768
  }
8769
- function asRecord$1(value) {
8770
- return isRecord$4(value) ? value : undefined;
8769
+ function asRecord(value) {
8770
+ return isRecord$3(value) ? value : undefined;
8771
8771
  }
8772
8772
 
8773
8773
  //#endregion
@@ -9698,7 +9698,7 @@ function parseTaggedObject(value, allowed) {
9698
9698
  return parseOneOf(record.value.tag, allowed);
9699
9699
  }
9700
9700
  function requireRecord(value) {
9701
- if (!isRecord$4(value)) return err("expected-object");
9701
+ if (!isRecord$3(value)) return err("expected-object");
9702
9702
  return ok(value);
9703
9703
  }
9704
9704
  function requireString(value) {
@@ -9909,7 +9909,7 @@ function parseOptionalRowExif(value) {
9909
9909
  if (value === null || value === undefined) {
9910
9910
  return ok(undefined);
9911
9911
  }
9912
- if (!isRecord$4(value) || !isFileJsonObject(value)) {
9912
+ if (!isRecord$3(value) || !isFileJsonObject(value)) {
9913
9913
  return err({
9914
9914
  tag: "invalid-exif",
9915
9915
  error: "expected-object"
@@ -9983,7 +9983,7 @@ function isFileJsonValue(value) {
9983
9983
  if (Array.isArray(value)) {
9984
9984
  return value.every(isFileJsonValue);
9985
9985
  }
9986
- return isRecord$4(value) && isFileJsonObject(value);
9986
+ return isRecord$3(value) && isFileJsonObject(value);
9987
9987
  }
9988
9988
  function emptyStatePatch(patch) {
9989
9989
  return {
@@ -12562,7 +12562,7 @@ function isCmsMediaObjectType(value) {
12562
12562
  return mediaTypeDiscriminants.some((type) => type === value);
12563
12563
  }
12564
12564
  function isCmsMediaObject(value) {
12565
- if (!isRecord$4(value)) return false;
12565
+ if (!isRecord$3(value)) return false;
12566
12566
  if (value.tag === "media") return true;
12567
12567
  const type = value.type;
12568
12568
  if (!isCmsMediaObjectType(type)) return false;
@@ -12581,7 +12581,7 @@ function collectMediaObjects(value, out, location = "") {
12581
12581
  value.forEach((item, index) => collectMediaObjects(item, out, `${location}[${index}]`));
12582
12582
  return;
12583
12583
  }
12584
- if (!isRecord$4(value)) return;
12584
+ if (!isRecord$3(value)) return;
12585
12585
  if (isCmsMediaObject(value)) {
12586
12586
  out.push({
12587
12587
  obj: value,
@@ -12641,7 +12641,7 @@ function scanForMediaAssetUsage(value, tokens) {
12641
12641
  for (const item of node) visit(item);
12642
12642
  return;
12643
12643
  }
12644
- if (!isRecord$4(node)) return;
12644
+ if (!isRecord$3(node)) return;
12645
12645
  for (const [key, child] of Object.entries(node)) {
12646
12646
  if (typeof child === "string") {
12647
12647
  switch (key) {
@@ -12753,8 +12753,8 @@ function walkAndCollectImageAttrs(value, out, location = "") {
12753
12753
  value.forEach((item, index) => walkAndCollectImageAttrs(item, out, `${location}[${index}]`));
12754
12754
  return;
12755
12755
  }
12756
- if (!isRecord$4(value)) return;
12757
- if (value.type === "image" && isRecord$4(value.attrs)) {
12756
+ if (!isRecord$3(value)) return;
12757
+ if (value.type === "image" && isRecord$3(value.attrs)) {
12758
12758
  out.push({
12759
12759
  attrs: value.attrs,
12760
12760
  location: location ? `${location}.attrs` : "attrs"
@@ -12951,7 +12951,7 @@ function resolvePortableMediaReferences(references, lookup) {
12951
12951
 
12952
12952
  //#endregion
12953
12953
  //#region ../media-core/src/contentMediaAudit.ts
12954
- function isRecord$6(value) {
12954
+ function isRecord$5(value) {
12955
12955
  return typeof value === "object" && value !== null && !Array.isArray(value);
12956
12956
  }
12957
12957
  function formatContentFieldPath(path) {
@@ -12965,11 +12965,11 @@ function summarizeContentMediaValue(value) {
12965
12965
  }
12966
12966
  if (value === null) return "null";
12967
12967
  if (Array.isArray(value)) return `array(${value.length})`;
12968
- if (isRecord$6(value)) return `object(${Object.keys(value).sort().join(",")})`;
12968
+ if (isRecord$5(value)) return `object(${Object.keys(value).sort().join(",")})`;
12969
12969
  return typeof value;
12970
12970
  }
12971
12971
  function isPortableMediaValue(value, allowedMediaTypes$1) {
12972
- if (!isRecord$6(value) || !parseCanonicalMediaIdentifier(value.identifier).ok) return false;
12972
+ if (!isRecord$5(value) || !parseCanonicalMediaIdentifier(value.identifier).ok) return false;
12973
12973
  const type = value.type ?? allowedMediaTypes$1[0];
12974
12974
  const validType = allowedMediaTypes$1.some((allowed) => allowed === type);
12975
12975
  const hasEnvironmentFields = [
@@ -13020,7 +13020,7 @@ function auditMediaValue(context, path, allowedMediaTypes$1, value) {
13020
13020
  }];
13021
13021
  }
13022
13022
  function auditFields(context, fields, value, parentPath) {
13023
- if (!isRecord$6(value)) return [];
13023
+ if (!isRecord$5(value)) return [];
13024
13024
  const findings = [];
13025
13025
  for (const field of fields) {
13026
13026
  if (!(field.id in value)) continue;
@@ -13037,7 +13037,7 @@ function auditFields(context, fields, value, parentPath) {
13037
13037
  if (!Array.isArray(fieldValue)) break;
13038
13038
  for (const [index, item] of fieldValue.entries()) {
13039
13039
  const itemPath = [...fieldPath, index];
13040
- if (!isRecord$6(item)) {
13040
+ if (!isRecord$5(item)) {
13041
13041
  findings.push({
13042
13042
  tag: "missing-schema",
13043
13043
  context,
@@ -13139,7 +13139,7 @@ function resolveLegacyMediaFindings(findings, assets) {
13139
13139
  //#endregion
13140
13140
  //#region ../media-core/src/contentMediaAuditFieldAdapter.ts
13141
13141
  const contentMediaTypes = new Set(mediaTypeDiscriminants);
13142
- function isRecord$5(value) {
13142
+ function isRecord$4(value) {
13143
13143
  return typeof value === "object" && value !== null && !Array.isArray(value);
13144
13144
  }
13145
13145
  function unknownArray(value) {
@@ -13148,7 +13148,7 @@ function unknownArray(value) {
13148
13148
  function fieldsArray(value) {
13149
13149
  const directFields = unknownArray(value);
13150
13150
  if (directFields) return directFields;
13151
- if (!isRecord$5(value)) return null;
13151
+ if (!isRecord$4(value)) return null;
13152
13152
  return unknownArray(value.fields);
13153
13153
  }
13154
13154
  function nestedFields(field) {
@@ -13217,7 +13217,7 @@ function mergeFields(fields) {
13217
13217
  }
13218
13218
  function adaptFields(rawFields, flattenRepeaterGroups = false, defaultFileKinds = ["document"]) {
13219
13219
  return mergeFields(rawFields.flatMap((rawField) => {
13220
- if (!isRecord$5(rawField)) return [];
13220
+ if (!isRecord$4(rawField)) return [];
13221
13221
  const { id: id$2, type } = rawField;
13222
13222
  if (typeof id$2 !== "string" || !id$2 || typeof type !== "string") return [];
13223
13223
  if (type === "media" || type === "file") {
@@ -13227,7 +13227,7 @@ function adaptFields(rawFields, flattenRepeaterGroups = false, defaultFileKinds
13227
13227
  allowedMediaTypes: allowedMediaTypes(rawField, type, defaultFileKinds)
13228
13228
  }];
13229
13229
  }
13230
- if (flattenRepeaterGroups && type === "group" && isRecord$5(rawField.ui) && rawField.ui.flattenInRepeater === true) {
13230
+ if (flattenRepeaterGroups && type === "group" && isRecord$4(rawField.ui) && rawField.ui.flattenInRepeater === true) {
13231
13231
  return adaptFields(nestedFields(rawField), false, defaultFileKinds);
13232
13232
  }
13233
13233
  if (type === "group" || type === "modal") {
@@ -13242,12 +13242,12 @@ function adaptFields(rawFields, flattenRepeaterGroups = false, defaultFileKinds
13242
13242
  return [{
13243
13243
  kind: "object",
13244
13244
  id: id$2,
13245
- fields: adaptFields(tabs.flatMap((tab) => isRecord$5(tab) ? unknownArray(tab.fields) ?? [] : []), false, defaultFileKinds)
13245
+ fields: adaptFields(tabs.flatMap((tab) => isRecord$4(tab) ? unknownArray(tab.fields) ?? [] : []), false, defaultFileKinds)
13246
13246
  }];
13247
13247
  }
13248
13248
  if (type !== "repeater") return [];
13249
- if (isRecord$5(rawField.itemTypes)) {
13250
- const variants = Object.entries(rawField.itemTypes).flatMap(([typeId, itemType]) => isRecord$5(itemType) && Array.isArray(itemType.fields) ? [{
13249
+ if (isRecord$4(rawField.itemTypes)) {
13250
+ const variants = Object.entries(rawField.itemTypes).flatMap(([typeId, itemType]) => isRecord$4(itemType) && Array.isArray(itemType.fields) ? [{
13251
13251
  typeId,
13252
13252
  fields: adaptFields(itemType.fields, true, defaultFileKinds)
13253
13253
  }] : []);
@@ -13746,7 +13746,7 @@ const runtimeBoxBackgroundSchema = z.discriminatedUnion("type", [
13746
13746
  ]).nullable().optional() })
13747
13747
  ]);
13748
13748
  function normalizeAuthoringOpacity(value) {
13749
- if (!isRecord$3(value)) return value;
13749
+ if (!isRecord$2(value)) return value;
13750
13750
  return {
13751
13751
  ...value,
13752
13752
  opacity: normalizeOpacity(value.opacity)
@@ -13755,7 +13755,7 @@ function normalizeAuthoringOpacity(value) {
13755
13755
  function normalizeOpacity(value) {
13756
13756
  return typeof value === "number" && value > 1 && value <= 100 ? value / 100 : value;
13757
13757
  }
13758
- function isRecord$3(value) {
13758
+ function isRecord$2(value) {
13759
13759
  return typeof value === "object" && value !== null && !Array.isArray(value);
13760
13760
  }
13761
13761
 
@@ -14628,7 +14628,7 @@ function validateCompositionBudget(input) {
14628
14628
 
14629
14629
  //#endregion
14630
14630
  //#region ../theme-core/src/site-styles/records.ts
14631
- function isRecord$2(value) {
14631
+ function isRecord$1(value) {
14632
14632
  return typeof value === "object" && value !== null && !Array.isArray(value);
14633
14633
  }
14634
14634
 
@@ -14830,15 +14830,15 @@ function parsePersistedFooterPreferences(value) {
14830
14830
  }
14831
14831
  /** One-time backfill rule, also exercised against the migration SQL. Not a runtime fallback. */
14832
14832
  function readFooterPreferences(theme) {
14833
- const footer = isRecord$2(theme) && isRecord$2(theme.footer) ? theme.footer : {};
14834
- const background = isRecord$2(footer.background) ? footer.background : {};
14833
+ const footer = isRecord$1(theme) && isRecord$1(theme.footer) ? theme.footer : {};
14834
+ const background = isRecord$1(footer.background) ? footer.background : {};
14835
14835
  const token = background.type === "color" && background.contentOwner === siteChromeBackgroundOverrideOwner ? parseSiteChromeBackgroundColorToken(background.color) : null;
14836
14836
  return {
14837
14837
  background: token === null ? { kind: "default" } : {
14838
14838
  kind: "color",
14839
14839
  token
14840
14840
  },
14841
- navigationLayout: isRecord$2(footer.navLayout) && footer.navLayout.layout === "stack" ? "stack" : "inline-wrap"
14841
+ navigationLayout: isRecord$1(footer.navLayout) && footer.navLayout.layout === "stack" ? "stack" : "inline-wrap"
14842
14842
  };
14843
14843
  }
14844
14844
  function applyFooterPreferences(theme, footer, preferences) {
@@ -38668,29 +38668,29 @@ function planGeneratedHeaderOpeningSection(input) {
38668
38668
  }
38669
38669
  function hasPersistedImageBackground(content) {
38670
38670
  const sectionStyles = content._sectionStyles;
38671
- if (!isRecord$2(sectionStyles)) return false;
38671
+ if (!isRecord$1(sectionStyles)) return false;
38672
38672
  const background = sectionStyles.background;
38673
- return isRecord$2(background) && background.type === "image" && background.image !== undefined;
38673
+ return isRecord$1(background) && background.type === "image" && background.image !== undefined;
38674
38674
  }
38675
38675
  function openingBackground(content) {
38676
38676
  const sectionStyles = content ? content._sectionStyles : null;
38677
- if (!isRecord$2(sectionStyles)) return null;
38677
+ if (!isRecord$1(sectionStyles)) return null;
38678
38678
  const background = sectionStyles.background;
38679
- return isRecord$2(background) ? background : null;
38679
+ return isRecord$1(background) ? background : null;
38680
38680
  }
38681
38681
  function contentHasContrastOverlay(content) {
38682
38682
  if (!content) return false;
38683
38683
  const imageSurfaceTreatment = content.imageSurfaceTreatment;
38684
- const imageSurfaceTreatmentKind = isRecord$2(imageSurfaceTreatment) ? imageSurfaceTreatment.kind : null;
38684
+ const imageSurfaceTreatmentKind = isRecord$1(imageSurfaceTreatment) ? imageSurfaceTreatment.kind : null;
38685
38685
  const background = openingBackground(content);
38686
38686
  const backgroundOverlay = background?.overlay;
38687
- const hasBackgroundOverlay = isRecord$2(backgroundOverlay) && backgroundOverlay.type !== undefined && backgroundOverlay.type !== null && backgroundOverlay.type !== "none";
38687
+ const hasBackgroundOverlay = isRecord$1(backgroundOverlay) && backgroundOverlay.type !== undefined && backgroundOverlay.type !== null && backgroundOverlay.type !== "none";
38688
38688
  return content.heroLegibility === "scrim-gradient" || imageSurfaceTreatmentKind === "brand-scrim" || imageSurfaceTreatmentKind === "neutral-scrim" || hasBackgroundOverlay;
38689
38689
  }
38690
38690
  function contentHasOpeningTopSpacing(content) {
38691
38691
  if (!content) return false;
38692
38692
  const sectionStyles = content._sectionStyles;
38693
- const minHeight = isRecord$2(sectionStyles) ? sectionStyles.minHeight : null;
38693
+ const minHeight = isRecord$1(sectionStyles) ? sectionStyles.minHeight : null;
38694
38694
  return content.sectionHeight === "hero" || content.sectionHeight === "immersive" || minHeight === "hero" || minHeight === "immersive";
38695
38695
  }
38696
38696
  function runtimeHasContrastOverlay(block) {
@@ -46141,7 +46141,7 @@ function planCommandOrderingDependencies(command, commands, providerByRef, requi
46141
46141
 
46142
46142
  //#endregion
46143
46143
  //#region ../site-commands/src/guards.ts
46144
- function isRecord$1(value) {
46144
+ function isRecord(value) {
46145
46145
  return typeof value === "object" && value !== null;
46146
46146
  }
46147
46147
 
@@ -46488,7 +46488,7 @@ function collectVenueRefsFromIntervals(intervals, path) {
46488
46488
  }
46489
46489
  function collectNavigationRefs(items, path) {
46490
46490
  return items.flatMap((item, index) => {
46491
- if (!isRecord$1(item)) return [];
46491
+ if (!isRecord(item)) return [];
46492
46492
  const itemPath = `${path}[${index}]`;
46493
46493
  const refs = [];
46494
46494
  if (typeof item.pageRef === "string") {
@@ -46511,7 +46511,7 @@ function collectNavigationRefs(items, path) {
46511
46511
  }
46512
46512
  function collectBlockRefs(blocks, path) {
46513
46513
  return blocks.flatMap((block, index) => {
46514
- if (!isRecord$1(block)) return [];
46514
+ if (!isRecord(block)) return [];
46515
46515
  const blockPath = `${path}[${index}]`;
46516
46516
  return [...collectNestedRefs(block.props, `${blockPath}.props`), ...collectNestedRefs(block.children, `${blockPath}.children`)];
46517
46517
  });
@@ -46527,7 +46527,7 @@ function collectNestedRefs(value, path) {
46527
46527
  if (Array.isArray(value)) {
46528
46528
  return value.flatMap((item, index) => collectNestedRefs(item, `${path}[${index}]`));
46529
46529
  }
46530
- if (!isRecord$1(value)) return [];
46530
+ if (!isRecord(value)) return [];
46531
46531
  return Object.entries(value).flatMap(([key, child]) => collectNestedRefs(child, `${path}.${key}`));
46532
46532
  }
46533
46533
 
@@ -46762,9 +46762,9 @@ function deriveIdempotencyKey(input) {
46762
46762
  ].join("|"));
46763
46763
  }
46764
46764
  function findUnknownCommandTypes(input) {
46765
- if (!isRecord$1(input) || !Array.isArray(input.commands)) return [];
46765
+ if (!isRecord(input) || !Array.isArray(input.commands)) return [];
46766
46766
  return input.commands.flatMap((command, commandIndex) => {
46767
- if (!isRecord$1(command) || typeof command.type !== "string") return [];
46767
+ if (!isRecord(command) || typeof command.type !== "string") return [];
46768
46768
  if (commandTypeSet.has(command.type)) return [];
46769
46769
  return [{
46770
46770
  code: "unknown_command_type",
@@ -46790,9 +46790,9 @@ function commandIndexForIssuePath(path) {
46790
46790
  return path[0] === "commands" && typeof path[1] === "number" ? path[1] : -1;
46791
46791
  }
46792
46792
  function commandTypeForIssue(input, commandIndex) {
46793
- if (!isRecord$1(input) || !isUnknownArray(input.commands)) return null;
46793
+ if (!isRecord(input) || !isUnknownArray(input.commands)) return null;
46794
46794
  const command = input.commands[commandIndex];
46795
- return isRecord$1(command) && typeof command.type === "string" ? command.type : null;
46795
+ return isRecord(command) && typeof command.type === "string" ? command.type : null;
46796
46796
  }
46797
46797
  function isUnknownArray(value) {
46798
46798
  return Array.isArray(value);
@@ -47842,229 +47842,4 @@ function parseSdkEventRunUpsertInput(input, runIndex, options) {
47842
47842
  }
47843
47843
 
47844
47844
  //#endregion
47845
- //#region ../blocks/src/lib/typeGuards.ts
47846
- /**
47847
- * Strict record guard: excludes null, primitives, and arrays.
47848
- */
47849
- function isRecord(value) {
47850
- return typeof value === "object" && value !== null && !Array.isArray(value);
47851
- }
47852
- /**
47853
- * Non-null object guard: includes arrays for behavior parity with legacy helpers.
47854
- *
47855
- * NOTE: This intentionally narrows to UnknownRecord for compatibility with existing
47856
- * callsites even though arrays pass at runtime. Follow-up cleanup should replace
47857
- * this API with a more precise predicate type and migrate consumers.
47858
- */
47859
- function isObjectRecord(value) {
47860
- return typeof value === "object" && value !== null;
47861
- }
47862
- /**
47863
- * Coerces unknown input into a strict record, returning an empty object fallback.
47864
- */
47865
- function asRecord(value) {
47866
- return isRecord(value) ? value : {};
47867
- }
47868
-
47869
- //#endregion
47870
- //#region ../blocks/src/system/manifest/richTextSchema.ts
47871
- /**
47872
- * Shared Rich Text Schema
47873
- *
47874
- * This module provides a single source of truth for TipTap rich text validation
47875
- * across both the block-form editor and the block rendering system.
47876
- *
47877
- * Rich-text fields use one canonical root shape:
47878
- * `{ type: 'doc', content: [...] }`.
47879
- */
47880
- /**
47881
- * TipTap document node schema (recursive structure)
47882
- *
47883
- * Supports the full TipTap document structure including:
47884
- * - type: Node type (e.g., 'doc', 'paragraph', 'text')
47885
- * - content: Nested array of child nodes
47886
- * - text: Text content for text nodes
47887
- * - attrs: Node attributes (e.g., alignment, color)
47888
- * - marks: Text formatting marks (e.g., bold, italic)
47889
- */
47890
- const TipTapMarkSchema = z.object({
47891
- type: z.string().min(1),
47892
- attrs: z.record(z.string(), z.unknown()).optional()
47893
- }).strict();
47894
- const TipTapNodeSchema = z.lazy(() => z.object({
47895
- type: z.string().min(1),
47896
- content: z.array(TipTapNodeSchema).optional(),
47897
- text: z.string().optional(),
47898
- attrs: z.record(z.string(), z.unknown()).optional(),
47899
- marks: z.array(TipTapMarkSchema).optional()
47900
- }).strict().superRefine((node, ctx) => {
47901
- if (node.type === "doc") {
47902
- ctx.addIssue({
47903
- code: "custom",
47904
- path: ["type"],
47905
- message: "Document nodes are only valid at the rich-text root"
47906
- });
47907
- }
47908
- if (node.type === "text") {
47909
- if (node.text === undefined || node.text.length === 0) {
47910
- ctx.addIssue({
47911
- code: "custom",
47912
- path: ["text"],
47913
- message: "Text nodes require a non-empty text value"
47914
- });
47915
- }
47916
- if (node.content !== undefined) {
47917
- ctx.addIssue({
47918
- code: "custom",
47919
- path: ["content"],
47920
- message: "Text nodes cannot contain child nodes"
47921
- });
47922
- }
47923
- return;
47924
- }
47925
- if (node.text !== undefined) {
47926
- ctx.addIssue({
47927
- code: "custom",
47928
- path: ["text"],
47929
- message: "Only text nodes can contain a text value"
47930
- });
47931
- }
47932
- }));
47933
- /**
47934
- * Canonical schema for a TipTap rich-text document root.
47935
- *
47936
- * Stricter than {@link TipTapNodeSchema}: `type` is literally `'doc'` and
47937
- * `content` is required (possibly empty). This is the shape every producer
47938
- * (dummy content, editor output, migrations) must emit, and the shape every
47939
- * non-legacy consumer can rely on.
47940
- *
47941
- */
47942
- const RichTextDocSchema = z.object({
47943
- type: z.literal("doc"),
47944
- content: z.array(TipTapNodeSchema)
47945
- }).strict();
47946
- /**
47947
- * Type guard for {@link RichTextDoc}.
47948
- *
47949
- * Returns `true` only for the canonical unwrapped form. The shared structural
47950
- * contract lives in `@riverbankcms/core`; parity tests keep its dependency-free
47951
- * guard aligned with this detailed Zod validator.
47952
- */
47953
- function isRichTextDoc(value) {
47954
- return RichTextDocSchema.safeParse(value).success;
47955
- }
47956
- /**
47957
- * Build a canonical {@link RichTextDoc} from plain-text paragraphs.
47958
- *
47959
- * Single source of truth for constructing a TipTap doc from strings.
47960
- * Used by:
47961
- * - `@riverbankcms/dummy-content` (fixture body generators)
47962
- * - `@riverbankcms/content-model` (default template `cta-full` content)
47963
- *
47964
- * Empty strings produce a paragraph with no `content` array — matching
47965
- * the TipTap convention for empty paragraphs. The shape is exactly what
47966
- * {@link RichTextDocSchema} validates, so the type and runtime check
47967
- * never drift from the constructor.
47968
- */
47969
- function createRichTextDoc(paragraphs) {
47970
- return {
47971
- type: "doc",
47972
- content: paragraphs.map((text) => text ? {
47973
- type: "paragraph",
47974
- content: [{
47975
- type: "text",
47976
- text
47977
- }]
47978
- } : { type: "paragraph" })
47979
- };
47980
- }
47981
- function createHardBreakNode() {
47982
- return { type: "hardBreak" };
47983
- }
47984
- /**
47985
- * Parse a small markdown subset into TipTap inline nodes.
47986
- *
47987
- * This intentionally supports only bold (`**text**`) because the SDK/content
47988
- * import paths use it for lightweight default content, not full markdown.
47989
- */
47990
- function parseRichTextInlineMarkdown(text) {
47991
- const out = [];
47992
- const pushText = (value, marks) => {
47993
- if (!value) return;
47994
- out.push(marks && marks.length > 0 ? {
47995
- type: "text",
47996
- text: value,
47997
- marks
47998
- } : {
47999
- type: "text",
48000
- text: value
48001
- });
48002
- };
48003
- let rest = text;
48004
- while (rest.length > 0) {
48005
- const start = rest.indexOf("**");
48006
- if (start === -1) {
48007
- pushText(rest);
48008
- break;
48009
- }
48010
- const end = rest.indexOf("**", start + 2);
48011
- if (end === -1) {
48012
- pushText(rest);
48013
- break;
48014
- }
48015
- pushText(rest.slice(0, start));
48016
- pushText(rest.slice(start + 2, end), [{ type: "bold" }]);
48017
- rest = rest.slice(end + 2);
48018
- }
48019
- return out;
48020
- }
48021
- function parseRichTextParagraphInlineMarkdown(text) {
48022
- return text.split("\n").flatMap((line, index) => {
48023
- const lineNodes = parseRichTextInlineMarkdown(line.trim());
48024
- return index === 0 ? lineNodes : [createHardBreakNode(), ...lineNodes];
48025
- });
48026
- }
48027
- /**
48028
- * Convert a plain string with a tiny markdown subset to canonical TipTap JSON.
48029
- *
48030
- * Double newlines create semantic paragraphs. Single newlines remain inside the
48031
- * current paragraph as TipTap `hardBreak` nodes for line-oriented content such
48032
- * as addresses, opening hours, and contact details.
48033
- */
48034
- function createRichTextDocFromMarkdown(markdown) {
48035
- const normalized = markdown.replace(/\r\n/g, "\n").trim();
48036
- if (!normalized) return {
48037
- type: "doc",
48038
- content: []
48039
- };
48040
- const paragraphs = normalized.split(/\n{2,}/).map((paragraph) => paragraph.trim()).filter(Boolean);
48041
- return {
48042
- type: "doc",
48043
- content: paragraphs.map((paragraph) => {
48044
- const inline = parseRichTextParagraphInlineMarkdown(paragraph);
48045
- return inline.length > 0 ? {
48046
- type: "paragraph",
48047
- content: inline
48048
- } : { type: "paragraph" };
48049
- })
48050
- };
48051
- }
48052
- function buildRichTextSchema(options) {
48053
- let schema = RichTextDocSchema;
48054
- if (options?.required) {
48055
- const label = options.label ?? "This field";
48056
- schema = schema.refine((val) => {
48057
- const content = val.content;
48058
- if (!Array.isArray(content) || content.length === 0) return false;
48059
- const first = content[0];
48060
- if (content.length === 1 && isRecord(first) && first.type === "paragraph" && (!("content" in first) || first.content == null)) {
48061
- return false;
48062
- }
48063
- return true;
48064
- }, { message: `${label} is required` });
48065
- }
48066
- return schema;
48067
- }
48068
-
48069
- //#endregion
48070
- export { createBlocksRef as $, isOnColorBackgroundCandidateToken as $i, looksLikeUuid as $n, asLayoutVariantKey as $r, ACCORDION_OPEN_ACCENT_THICKNESS as $t, parseAndPlanCommandBatchForTypes as A, opaqueSurfaceDeclarations as Ai, pageDesignIntentSchemaVersion as An, parseRelativeStoragePath as Ar, themeSchema as At, pageIdentifierForCommand as B, unsafeAsOpaqueButtonColourToken as Bi, parseCanonicalRuntimeBackground as Bn, generateShadowValue as Br, MQ_MD_DOWN as Bt, pageLinkSchema as C, borderColorStyle as Ci, buildTextContrastShadow as Cn, slugifyMediaIdentifier as Cr, resolvePublishedLook as Ct, sortRecord as D, textColorStyle as Di, resolveItemSurface as Dn, getMimeType as Dr, getGradientPreset as Dt, venueManagementFields as E, rgbColorValue as Ei, arrangementSlotNames as En, getExtensionForMimeType as Er, GRADIENT_PRESET_IDS as Et, eventManagementTiming as F, resolveThemeColorReferenceValue as Fi, sectionFactsForContent as Fn, parseSafeDownloadFilename as Fr, BREAKPOINT_LG as Ft, bookingPaymentCollectionOptionSchema as G, DEFAULT_SURFACE_TEXT_COLOR as Gi, runtimeBoxBackgroundSchema as Gn, backgroundAppearanceQuickColorTokenNames as Gr, getComponentBorderWidthPx as Gt, hasConfiguredBookingVertical as H, surfaceToneFromForegroundToken as Hi, resolveSectionPhotoPlacement as Hn, cardVariantRoleValues as Hr, MQ_SM_UP as Ht, blockIdentifierForCommand as I, resolveTokenOrCssColorValue as Ii, boundaryRuntimeMetricsForDecorativeTransition as In, generateCardCoreCss as Ir, BREAKPOINT_MD as It, require_react as J, surfaceForegroundInputFromResolved as Ji, stripStaleTransitionStyleGroup as Jn, resolveEffectiveKnobs as Jr, parseCustomCssRules as Jt, bookingPaymentTermsSchema as K, SURFACE_FOREGROUND_CSS_VARS as Ki, pageDesignEditorBackgroundOverrideOwner as Kn, parseBackgroundAppearanceColorToken as Kr, getComponentShadowVar as Kt, blockOrderIdentifiersForCommand as L, generateShadowValue$1 as Li, anglePolygonCss as Ln, getDefaultCardVariants as Lr, BREAKPOINT_SM as Lt, evaluateSiteCommandBatchExposure as M, formatButtonColourContractError as Mi, headerRootPaint as Mn, MAX_MANAGEMENT_MEDIA_UPLOAD_BYTES as Mr, generateMobileOverlayBackdropFilterFix as Mt, evaluateSiteCommandExposure as N, isCssColorLiteral as Ni, boundaryLayout as Nn, classifyKnownMimeType as Nr, getHeaderPaintTargets as Nt, stableStringify as O, textColorValue as Oi, resolveLookSlotSurfaces as On, asRecord$1 as Or, parseGradientPresetId as Ot, getSiteCommandMetadata as P, resolveOnColorForThemeToken as Pi, composeBoundary as Pn, managementMediaLibraryUploadLimitForMimeType as Pr, renderHeaderPaintTargetRules as Pt, createBlockRef as Q, expandPalette as Qi, deleteEnvSpecificKeys as Qn, asDesignBlockId as Qr, LABEL_FONT_SIZE_MAP as Qt, entryIdentifierForCommand as R, PUBLIC_BUTTON_ROLES as Ri, transitionCatalogueEntries as Rn, generateCardCss as Rr, BREAKPOINT_XL as Rt, normalizeLinkValue as S, backgroundColorStyle as Si, footerForegroundCandidates as Sn, resolveMediaIdentifier as Sr, resolveModeArrangement as St, isEventVisibility as T, mergeStyles as Ti, arrangementLookHooks as Tn, resolveVideoSelectionIntentForMediaField as Tr, gradientToCss as Tt, eventCommandScheduleSchema as U, buildThemeTokens as Ui, boxBackgroundOverlaySchema as Un, normalizeCardRole as Ur, MQ_TABLET_ONLY as Ut, pagePathForCommand as V, selectLogoVariant as Vi, resolveSectionBackground as Vn, cardRoleSchema as Vr, MQ_SM_DOWN as Vt, eventBookingOfferIntentSchema as W, defaultThemeTokens as Wi, boxBackgroundSchema as Wn, backgroundAppearanceColorTokenNames as Wr, headerVariantValues as Wt, generateCssVars as X, surfaceForegroundValue as Xi, summarizePortableMediaReferences as Xn, cardListKnobBlocks as Xr, INPUT_FONT_SIZE_MAP as Xt, pickShadeTowardBackground as Y, surfaceForegroundStyle as Yi, collectPortableMediaReferencesFromContent as Yn, cardListFamilyBlocks as Yr, FONT_WEIGHT_MAP as Yt, ianaTimezoneSchema as Z, surfaceForegroundValueWithOpacity as Zi, walkAndCollectImageAttrs as Zn, asAppearancePresetId as Zr, INPUT_SPACING_MAP as Zt, internalResolvedLinkSchema as _, resolveSurface as _i, buildGoogleFontFamilyQuery as _n, mediaTypeDiscriminants as _r, mergeHeaderNavTypographyPreference as _t, isRecord as a, parseThemeColorToken as aa, defineNoBlockDesignCapability as ai, generateButtonActionLayoutCss as an, getDirectImageUrlForRelativePath as ar, createFormRef as at, isResolvedInternalLinkEntityType as b, safeTokenOr as bi, buttonStyleSelectionSchema as bn, parseCanonicalMediaIdentifier as br, readStoredMode as bt, sdkEventOccurrenceInputSchema as c, featuresFromHex as ca, featureCardCompositionTreatmentValues as ci, resolvedButtonColourDeclarations as cn, isSiteScopedDirectImageStoragePath as cr, createSiteCommandSiteRef as ct, classifySdkEventBookingOffer as d, __commonJSMin as da, makeBoundaryId as di, parseThemeButtonVariantId as dn, mediaSchema as dr, slugPart as dt, onColorTokenName as ea, asPageFlowPresetId as ei, ACCORDION_SPACING_MAP as en, rotateNormalizedPoint as er, createCommandRef as et, RESOLVED_INTERNAL_LINK_ENTITY_TYPES as f, __toESM as fa, offeringsPreviewCompositionTreatmentValues as fi, themeButtonExtraClassesWithTrailingIcon as fn, persistableMediaSchema as fr, effectiveHeaderNavLinkStyle as ft, internalLinkSchema as g, visibleHeadingDecorationFamilyValues as gi, skinTokenCssVars as gn, resolveManagedMediaReference as gr, readOpeningForegroundProjection as gt, externalLinkSchema as h, toNonEmptyReadonlyArray as hi, parseThemeForPersistence as hn, indexRenderableMediaAssets as hr, transparentHeaderForegroundInput as ht, isObjectRecord as i, resolveOpaqueSurfaceHex as ia, defineFrameCapability as ii, ICON_SIZE_PX as in, resolveMediaTransformForAspect as ir, createFooterRef as it, mapEventCommandContent as j, compileButtonColourStates as ji, footerPreferencesSchema as jn, FILE_SIZE_LIMITS as jr, generateHeaderScrollTreatmentStyles as jt, createDryRunReport as k, opaqueSurfaceContextFromTheme as ki, pageDesignBoundaryTreatmentSchema as kn, normalizeAmbiguousStoragePathForSite as kr, deriveSiteStyleBlockPolicy as kt, sdkEventUpsertOptionalFieldSchemas as l, hexToRgb as la, headingDecorationColorTokenValues as li, resolvedButtonFocusDeclarations as ln, imageMediaSchema as lr, createVenueRef as lt, entryLinkSchema as m, tileTreatmentValues as mi, themeButtonVariantClassNames as mn, buildRenderableMediaAssetIndex as mr, headerLeafTextColor as mt, createRichTextDoc as n, ORDINARY_TEXT_MIN_CONTRAST_RATIO as na, assertNever$1 as ni, ACCORDION_TRIGGER_LETTER_SPACING as nn, isExplicitRectCrop as nr, createEventCategoryRef as nt, classifySdkEventTiming as o, parseBlockColorToken as oa, eventListTreatmentValues as oi, generateButtonCss as on, getDirectImageUrlForSiteScopedPath as or, createNavigationRef as ot, customLinkSchema as p, testimonialsCompositionTreatmentValues as pi, themeButtonSizeClassName as pn, runtimeMediaSchema as pr, headerForegroundCandidates as pt, require_jsx_runtime as q, surfaceForegroundDeclarations as qi, siteChromeBackgroundOverrideOwner as qn, defineBlockDesignMetadata as qr, parseBlockCustomCssRules as qt, isRichTextDoc as r, contrastRatio as ra, defineBlockDesignCapability as ri, ICON_CONFIG as rn, parseAspectRatioValue as rr, createEventSeriesRef as rt, sdkCourseBookingSettingsSchema as s, parseColorTokenParts as sa, eyebrowTreatmentValues as si, RESOLVED_BUTTON_DISABLED_DECLARATIONS as sn, getImageUrl as sr, createPageRef as st, RichTextDocSchema as t, getTextColorForBackground as ta, asSiteStyleId as ti, ACCORDION_TRIGGER_FONT_SCALE as tn, normalizeWidthCandidates as tr, createContentEntryRef as tt, classifySdkEventSchedule as u, oklchToHexGamut as ua, introCompositionTreatmentValues as ui, generateDefaultButtonSystem as un, mediaPosterSchema as ur, refSlug as ut, internalRouteOnlyLinkSchema as v, surfaceDecorationColors as vi, generateFontFaceCss as vn, mediaIdentifierSchema as vr, readHeaderNavFontSizePreference as vt, eventVisibilitySchema as w, cssVarValue as wi, generateNavLinkCSS as wn, deriveVideoSlotPolicy as wr, requireCuratedSiteStyle as wt, linkSchema as x, TokenResolver as xi, generateFooterCss as xn, parseMediaIdentifier as xr, resolveEffectiveArrangement as xt, isInternalResolvedLinkValue as y, resolveSurfaceForeground as yi, getFontWidthRange as yn, buildMediaIdentifierFromFilename as yr, arrangementManifestFromVariants as yt, pageIdentifierForBlockCommand as z, buttonVariantIdSchema as zi, deriveSectionGround as zn, renderCssDeclarations as zr, MQ_LG_UP as zt };
47845
+ export { createNavigationRef as $, cardVariantRoleValues as $n, headerRootPaint as $t, eventManagementTiming as A, buildRenderableMediaAssetIndex as An, borderColorStyle as Ar, BREAKPOINT_XL as At, bookingPaymentCollectionOptionSchema as B, resolveVideoSelectionIntentForMediaField as Bn, selectLogoVariant as Br, themeButtonVariantClassNames as Bt, stableStringify as C, getDirectImageUrlForSiteScopedPath as Cn, toNonEmptyReadonlyArray as Cr, generateHeaderScrollTreatmentStyles as Ct, evaluateSiteCommandBatchExposure as D, mediaSchema as Dn, resolveSurfaceForeground as Dr, BREAKPOINT_LG as Dt, mapEventCommandContent as E, mediaPosterSchema as En, surfaceDecorationColors as Er, renderHeaderPaintTargetRules as Et, pageIdentifierForCommand as F, parseCanonicalMediaIdentifier as Fn, isCssColorLiteral as Fr, ICON_CONFIG as Ft, createBlockRef as G, parseRelativeStoragePath as Gn, surfaceForegroundStyle as Gr, generateNavLinkCSS as Gt, require_jsx_runtime as H, getMimeType as Hn, defaultThemeTokens as Hr, buttonStyleSelectionSchema as Ht, pagePathForCommand as I, parseMediaIdentifier as In, resolveOnColorForThemeToken as Ir, generateDefaultButtonSystem as It, createContentEntryRef as J, classifyKnownMimeType as Jn, getTextColorForBackground as Jr, resolveItemSurface as Jt, createBlocksRef as K, FILE_SIZE_LIMITS as Kn, surfaceForegroundValue as Kr, arrangementLookHooks as Kt, hasConfiguredBookingVertical as L, resolveMediaIdentifier as Ln, resolveThemeColorReferenceValue as Lr, parseThemeButtonVariantId as Lt, blockOrderIdentifiersForCommand as M, mediaTypeDiscriminants as Mn, rgbColorValue as Mr, headerVariantValues as Mt, entryIdentifierForCommand as N, mediaIdentifierSchema as Nn, textColorStyle as Nr, getComponentBorderWidthPx as Nt, evaluateSiteCommandExposure as O, persistableMediaSchema as On, TokenResolver as Or, BREAKPOINT_MD as Ot, pageIdentifierForBlockCommand as P, buildMediaIdentifierFromFilename as Pn, opaqueSurfaceDeclarations as Pr, getComponentShadowVar as Pt, createFormRef as Q, cardRoleSchema as Qn, __toESM as Qr, footerPreferencesSchema as Qt, eventCommandScheduleSchema as R, slugifyMediaIdentifier as Rn, resolveTokenOrCssColorValue as Rr, themeButtonExtraClassesWithTrailingIcon as Rt, sortRecord as S, getDirectImageUrlForRelativePath as Sn, tileTreatmentValues as Sr, themeSchema as St, parseAndPlanCommandBatchForTypes as T, isSiteScopedDirectImageStoragePath as Tn, resolveSurface as Tr, getHeaderPaintTargets as Tt, require_react as U, asRecord as Un, surfaceForegroundDeclarations as Ur, footerForegroundCandidates as Ut, bookingPaymentTermsSchema as V, getExtensionForMimeType as Vn, surfaceToneFromForegroundToken as Vr, parseThemeForPersistence as Vt, ianaTimezoneSchema as W, normalizeAmbiguousStoragePathForSite as Wn, surfaceForegroundInputFromResolved as Wr, buildTextContrastShadow as Wt, createEventSeriesRef as X, parseSafeDownloadFilename as Xn, parseBlockColorToken as Xr, pageDesignBoundaryTreatmentSchema as Xt, createEventCategoryRef as Y, managementMediaLibraryUploadLimitForMimeType as Yn, parseThemeColorToken as Yr, resolveLookSlotSurfaces as Yt, createFooterRef as Z, renderCssDeclarations as Zn, __commonJSMin as Zr, pageDesignIntentSchemaVersion as Zt, normalizeLinkValue as _, rotateNormalizedPoint as _n, headingDecorationColorTokenValues as _r, requireCuratedSiteStyle as _t, classifySdkEventSchedule as a, resolveSectionBackground as an, asAppearancePresetId as ar, effectiveHeaderNavLinkStyle as at, isEventVisibility as b, parseAspectRatioValue as bn, offeringsPreviewCompositionTreatmentValues as br, parseGradientPresetId as bt, customLinkSchema as c, boxBackgroundSchema as cn, asPageFlowPresetId as cr, transparentHeaderForegroundInput as ct, internalLinkSchema as d, stripStaleTransitionStyleGroup as dn, defineBlockDesignCapability as dr, readHeaderNavFontSizePreference as dt, boundaryLayout as en, normalizeCardRole as er, createPageRef as et, internalResolvedLinkSchema as f, collectPortableMediaReferencesFromContent as fn, defineFrameCapability as fr, arrangementManifestFromVariants as ft, linkSchema as g, looksLikeUuid as gn, featureCardCompositionTreatmentValues as gr, resolvePublishedLook as gt, isResolvedInternalLinkEntityType as h, deleteEnvSpecificKeys as hn, eyebrowTreatmentValues as hr, resolveModeArrangement as ht, sdkEventUpsertOptionalFieldSchemas as i, parseCanonicalRuntimeBackground as in, cardListKnobBlocks as ir, slugPart as it, blockIdentifierForCommand as j, resolveManagedMediaReference as jn, mergeStyles as jr, MQ_MD_DOWN as jt, getSiteCommandMetadata as k, runtimeMediaSchema as kn, backgroundColorStyle as kr, BREAKPOINT_SM as kt, entryLinkSchema as l, runtimeBoxBackgroundSchema as ln, asSiteStyleId as lr, readOpeningForegroundProjection as lt, isInternalResolvedLinkValue as m, walkAndCollectImageAttrs as mn, eventListTreatmentValues as mr, resolveEffectiveArrangement as mt, sdkCourseBookingSettingsSchema as n, sectionFactsForContent as nn, resolveEffectiveKnobs as nr, createVenueRef as nt, classifySdkEventBookingOffer as o, resolveSectionPhotoPlacement as on, asDesignBlockId as or, headerForegroundCandidates as ot, internalRouteOnlyLinkSchema as p, summarizePortableMediaReferences as pn, defineNoBlockDesignCapability as pr, readStoredMode as pt, createCommandRef as q, MAX_MANAGEMENT_MEDIA_UPLOAD_BYTES as qn, expandPalette as qr, arrangementSlotNames as qt, sdkEventOccurrenceInputSchema as r, deriveSectionGround as rn, cardListFamilyBlocks as rr, refSlug as rt, RESOLVED_INTERNAL_LINK_ENTITY_TYPES as s, boxBackgroundOverlaySchema as sn, asLayoutVariantKey as sr, headerLeafTextColor as st, classifySdkEventTiming as t, composeBoundary as tn, defineBlockDesignMetadata as tr, createSiteCommandSiteRef as tt, externalLinkSchema as u, siteChromeBackgroundOverrideOwner as un, assertNever$1 as ur, mergeHeaderNavTypographyPreference as ut, pageLinkSchema as v, normalizeWidthCandidates as vn, introCompositionTreatmentValues as vr, gradientToCss as vt, createDryRunReport as w, getImageUrl as wn, visibleHeadingDecorationFamilyValues as wr, generateMobileOverlayBackdropFilterFix as wt, venueManagementFields as x, resolveMediaTransformForAspect as xn, testimonialsCompositionTreatmentValues as xr, deriveSiteStyleBlockPolicy as xt, eventVisibilitySchema as y, isExplicitRectCrop as yn, makeBoundaryId as yr, getGradientPreset as yt, eventBookingOfferIntentSchema as z, deriveVideoSlotPolicy as zn, PUBLIC_BUTTON_ROLES as zr, themeButtonSizeClassName as zt };