riverbankcms 0.8.0 → 0.9.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.
@@ -377,11 +377,13 @@ For theme and footer pushes, stale resolution updates only the metadata timestam
377
377
  "homepageId": null,
378
378
  "seoDefaults": null,
379
379
  "logoIdentifier": "positive-play-primary-logo",
380
+ "logoDarkBackgroundIdentifier": "positive-play-logo-light",
380
381
  "faviconIdentifier": "positive-play-primary-logo"
381
382
  }
382
383
  ```
383
384
 
384
385
  - Use `logoIdentifier` / `faviconIdentifier` to manage the site logo and favicon from the repo
386
+ - `logoDarkBackgroundIdentifier` is optional: a version of the logo designed for dark backgrounds. The default header and footer use it on dark surfaces; without it, `logoIdentifier` is used everywhere
385
387
  - The identifiers should match files in `content/media/`
386
388
  - `riverbankcms push settings` reuses the normal local-media upload flow before updating site settings, without pushing unrelated content
387
389
  - `riverbankcms pull settings` warns and omits a branding field if the current CMS asset cannot be represented by an identifier yet
@@ -216,6 +216,7 @@ Use `content/settings.json` as the repo-managed source of truth for branding:
216
216
  "homepageId": null,
217
217
  "seoDefaults": null,
218
218
  "logoIdentifier": "positive-play-primary-logo",
219
+ "logoDarkBackgroundIdentifier": "positive-play-logo-light",
219
220
  "faviconIdentifier": "positive-play-primary-logo"
220
221
  }
221
222
  ```
@@ -230,7 +231,8 @@ Recommended workflow:
230
231
  Notes:
231
232
 
232
233
  - `riverbankcms push settings` uploads missing branding files through the normal local-media sync path before updating site settings, without pushing unrelated content
233
- - `riverbankcms pull settings` warns and omits `logoIdentifier` / `faviconIdentifier` if the current CMS branding asset has no media identifier yet
234
+ - `logoDarkBackgroundIdentifier` is optional. It names a version of your logo designed for dark backgrounds; the default header and footer draw it when they sit on a dark surface, and fall back to `logoIdentifier` when it is absent. Custom headers and footers receive both as `logoVariants`
235
+ - `riverbankcms pull settings` warns and omits `logoIdentifier` / `logoDarkBackgroundIdentifier` / `faviconIdentifier` if the current CMS branding asset has no media identifier yet
234
236
  - Dashboard branding edits and CLI pushes both update the same site settings row, so treat them as last-write-wins and pull before pushing after dashboard-side edits
235
237
 
236
238
  ### Configure the booking vertical
@@ -1,6 +1,6 @@
1
1
  #!/usr/bin/env node
2
- import { a as classifySdkEventBookingOffer, i as classifySdkEventSchedule, r as sdkEventUpsertOptionalFieldSchemas } from "./sdk-event-upsert-Bf6wAl4s.mjs";
3
- import { l as EVENT_PRESET_VALUES } from "./src-B8fOSKJ6.mjs";
2
+ import { a as classifySdkEventBookingOffer, i as classifySdkEventSchedule, r as sdkEventUpsertOptionalFieldSchemas } from "./sdk-event-upsert-BNxbxaA0.mjs";
3
+ import { l as EVENT_PRESET_VALUES } from "./src-DbmhanBI.mjs";
4
4
  import { z } from "zod";
5
5
 
6
6
  //#region ../blocks/src/lib/typeGuards.ts
@@ -0,0 +1,4 @@
1
+ #!/usr/bin/env node
2
+ import { t as loadConfigFile } from "./load-config-Cf5uPEAn.mjs";
3
+
4
+ export { loadConfigFile };
@@ -7,7 +7,7 @@ import { existsSync as existsSync$1 } from "fs";
7
7
  import { fileURLToPath } from "url";
8
8
 
9
9
  //#region package.json
10
- var version = "0.8.0";
10
+ var version = "0.9.0";
11
11
  var peerDependencies = { "@riverbankcms/sdk": ">=0.139.0 <1.0.0" };
12
12
  var package_default = {
13
13
  name: "riverbankcms",
@@ -83,7 +83,7 @@ var package_default = {
83
83
  //#endregion
84
84
  //#region src/version.ts
85
85
  /** The package manifest is the source-run fallback; builds inject this value. */
86
- const CLI_VERSION = typeof "0.8.0" === "string" ? "0.8.0" : version;
86
+ const CLI_VERSION = typeof "0.9.0" === "string" ? "0.9.0" : version;
87
87
  /**
88
88
  * The CLI's SDK peer range is bundled from the CLI manifest alongside its
89
89
  * version. Runtime config loading uses this value as the single compatibility
@@ -1,6 +1,6 @@
1
1
  #!/usr/bin/env node
2
- import { Mt as asAppearancePresetId, S as eventBookingOfferIntentSchema, V as buttonStyleSelectionSchema, c as stableStringify, n as sdkEventOccurrenceInputSchema, ut as themeSchema } from "./sdk-event-upsert-Bf6wAl4s.mjs";
3
- import { A as parseFooterCompositionV1, At as unsafeAsPositiveSeconds, Bt as unsafeAsUserId, Ct as unsafeAsEventOfferingId, Dt as unsafeAsOccurrenceId, Et as unsafeAsMediaAssetId, Ft as unsafeAsSiteScopedStoragePath, Ht as ok, K as parseUtcIsoDateTimeString, Lt as unsafeAsStorageBucketName, Mt as unsafeAsSafeDownloadFilename, Nt as unsafeAsSiteFontId, Ot as unsafeAsOriginalFilename, Pt as unsafeAsSiteId, Rt as unsafeAsStoragePath, St as unsafeAsEntitlementId, Tt as unsafeAsFileChecksumSha256, Vt as err, _t as unsafeAsBookingRequirementId, a as parseVerticalId, jt as unsafeAsProductId, kt as unsafeAsPositiveByteCount, l as EVENT_PRESET_VALUES, lt as assertNever, mt as parseSiteId, o as parseVerticalPresetId, ot as fromArray, r as canonicalizeConfiguredBookingVerticalConfig, s as resolveSiteVerticalBookingConfig, st as mapNonEmptyArray, v as exposeSecret, vt as unsafeAsBookingSessionId, wt as unsafeAsEventSeriesId, xt as unsafeAsDetectedMimeType, yt as unsafeAsDeclaredMimeType, zt as unsafeAsUploadSessionId } from "./src-B8fOSKJ6.mjs";
2
+ import { Nt as asAppearancePresetId, S as eventBookingOfferIntentSchema, V as buttonStyleSelectionSchema, c as stableStringify, dt as themeSchema, n as sdkEventOccurrenceInputSchema } from "./sdk-event-upsert-BNxbxaA0.mjs";
3
+ import { A as parseFooterCompositionV1, At as unsafeAsPositiveSeconds, Bt as unsafeAsUserId, Ct as unsafeAsEventOfferingId, Dt as unsafeAsOccurrenceId, Et as unsafeAsMediaAssetId, Ft as unsafeAsSiteScopedStoragePath, Ht as ok, K as parseUtcIsoDateTimeString, Lt as unsafeAsStorageBucketName, Mt as unsafeAsSafeDownloadFilename, Nt as unsafeAsSiteFontId, Ot as unsafeAsOriginalFilename, Pt as unsafeAsSiteId, Rt as unsafeAsStoragePath, St as unsafeAsEntitlementId, Tt as unsafeAsFileChecksumSha256, Vt as err, _t as unsafeAsBookingRequirementId, a as parseVerticalId, i as canonicalizeConfiguredBookingVerticalConfig, jt as unsafeAsProductId, kt as unsafeAsPositiveByteCount, l as EVENT_PRESET_VALUES, lt as assertNever, mt as parseSiteId, o as parseVerticalPresetId, ot as fromArray, s as resolveSiteVerticalBookingConfig, st as mapNonEmptyArray, v as exposeSecret, vt as unsafeAsBookingSessionId, wt as unsafeAsEventSeriesId, xt as unsafeAsDetectedMimeType, yt as unsafeAsDeclaredMimeType, zt as unsafeAsUploadSessionId } from "./src-DbmhanBI.mjs";
4
4
  import * as fs from "fs/promises";
5
5
  import * as path$1 from "path";
6
6
  import { z } from "zod";
@@ -603,6 +603,7 @@ const sdkSettingsUpdateSchema = z.object({
603
603
  homepageId: z.string().nullable().optional(),
604
604
  seoDefaults: sdkSeoDefaultsSchema.nullable().optional(),
605
605
  logoIdentifier: z.string().min(1).nullable().optional(),
606
+ logoDarkBackgroundIdentifier: z.string().min(1).nullable().optional(),
606
607
  faviconIdentifier: z.string().min(1).nullable().optional()
607
608
  }).strict();
608
609
  const sdkPullSettingsSchema = sdkSettingsUpdateSchema.extend({
@@ -7460,13 +7461,18 @@ const SETTINGS_BASE_FIELDS = [
7460
7461
  "homepageId",
7461
7462
  "seoDefaults"
7462
7463
  ];
7463
- const SETTINGS_BRANDING_FIELDS = ["logoIdentifier", "faviconIdentifier"];
7464
+ const SETTINGS_BRANDING_FIELDS = [
7465
+ "logoIdentifier",
7466
+ "logoDarkBackgroundIdentifier",
7467
+ "faviconIdentifier"
7468
+ ];
7464
7469
  const SETTINGS_FIELDS = [...SETTINGS_BASE_FIELDS, ...SETTINGS_BRANDING_FIELDS];
7465
7470
  /** Fields owned by content/settings.json. Booking configuration has its own
7466
7471
  * mutation operation and must never enter the generic settings update input. */
7467
7472
  const SETTINGS_FILE_FIELDS = [...SETTINGS_FIELDS, "verticalConfig"];
7468
7473
  const SETTINGS_BRANDING_LABELS = {
7469
7474
  logoIdentifier: "logo",
7475
+ logoDarkBackgroundIdentifier: "dark-background logo",
7470
7476
  faviconIdentifier: "favicon"
7471
7477
  };
7472
7478
  function hasOwnSettingsField(settings, field) {
@@ -7494,6 +7500,9 @@ function buildSettingsUpdateInput(settings) {
7494
7500
  case "logoIdentifier":
7495
7501
  update.logoIdentifier = settings.logoIdentifier;
7496
7502
  break;
7503
+ case "logoDarkBackgroundIdentifier":
7504
+ update.logoDarkBackgroundIdentifier = settings.logoDarkBackgroundIdentifier;
7505
+ break;
7497
7506
  case "faviconIdentifier":
7498
7507
  update.faviconIdentifier = settings.faviconIdentifier;
7499
7508
  break;
@@ -1,5 +1,5 @@
1
1
  #!/usr/bin/env node
2
- import { Ht as ok, Vt as err, mt as parseSiteId } from "./src-B8fOSKJ6.mjs";
2
+ import { Ht as ok, Vt as err, mt as parseSiteId } from "./src-DbmhanBI.mjs";
3
3
  import { existsSync, readFileSync } from "node:fs";
4
4
  import { dirname, isAbsolute, join, parse, relative, resolve, sep } from "node:path";
5
5
  import { fileURLToPath } from "node:url";
@@ -1,5 +1,5 @@
1
1
  #!/usr/bin/env node
2
- import "../src-B8fOSKJ6.mjs";
3
- import { a as prepareScaffoldExecution, d as loadGeneratedPackageRanges, i as preflightScaffoldTargets, l as deriveGeneratedPackageRanges, o as writeScaffoldFiles, r as preflightScaffoldPlan, s as deriveScaffoldLocalManifest, t as deriveScaffoldPlan, u as findPackageManifestPath } from "../plan-DtQEnwCM.mjs";
2
+ import "../src-DbmhanBI.mjs";
3
+ import { a as prepareScaffoldExecution, d as loadGeneratedPackageRanges, i as preflightScaffoldTargets, l as deriveGeneratedPackageRanges, o as writeScaffoldFiles, r as preflightScaffoldPlan, s as deriveScaffoldLocalManifest, t as deriveScaffoldPlan, u as findPackageManifestPath } from "../plan-By0bjnd3.mjs";
4
4
 
5
5
  export { deriveGeneratedPackageRanges, deriveScaffoldLocalManifest, deriveScaffoldPlan, findPackageManifestPath, loadGeneratedPackageRanges, preflightScaffoldPlan, preflightScaffoldTargets, prepareScaffoldExecution, writeScaffoldFiles };
@@ -1,5 +1,5 @@
1
1
  #!/usr/bin/env node
2
- import { A as parseFooterCompositionV1, Ht as ok, K as parseUtcIsoDateTimeString, M as isCanonicalRichTextDoc, P as isPresent, Vt as err, X as parseBookingTimeZone, b as stableJsonStringify, k as footerNavigationLayouts, l as EVENT_PRESET_VALUES, lt as assertNever, s as resolveSiteVerticalBookingConfig, t as NAVIGATION_LOCATIONS, u as ORDINARY_EVENT_PRESET_VALUES } from "./src-B8fOSKJ6.mjs";
2
+ import { A as parseFooterCompositionV1, Ht as ok, K as parseUtcIsoDateTimeString, M as isCanonicalRichTextDoc, P as isPresent, Vt as err, X as parseBookingTimeZone, b as stableJsonStringify, k as footerNavigationLayouts, l as EVENT_PRESET_VALUES, lt as assertNever, n as NAVIGATION_LOCATIONS, s as resolveSiteVerticalBookingConfig, u as ORDINARY_EVENT_PRESET_VALUES } from "./src-DbmhanBI.mjs";
3
3
  import "node:module";
4
4
  import { z } from "zod";
5
5
 
@@ -2658,6 +2658,37 @@ function normalizedReference(value) {
2658
2658
  return normalized.length > 0 ? normalized : null;
2659
2659
  }
2660
2660
 
2661
+ //#endregion
2662
+ //#region ../theme-core/src/surfaces/logoVariant.ts
2663
+ /** Concrete hex behind a plain, opaque palette token, or null otherwise. */
2664
+ function opaquePaletteHexForToken(expandedPalette, token) {
2665
+ if (!token) return null;
2666
+ const parts = parseColorTokenParts(token);
2667
+ if (parts.kind !== "token" || parts.opacityPercent !== null) return null;
2668
+ return expandedPalette[parts.token] ?? null;
2669
+ }
2670
+ /**
2671
+ * Tone of the surface a foreground token was resolved for.
2672
+ *
2673
+ * A token with opacity has no known underlay to composite against, and a raw
2674
+ * or unrecognised token has no palette hex, so both are `unknown` rather than
2675
+ * a guess.
2676
+ */
2677
+ function surfaceToneFromForegroundToken(expandedPalette, foregroundToken) {
2678
+ const hex = opaquePaletteHexForToken(expandedPalette, foregroundToken);
2679
+ if (!hex) return "unknown";
2680
+ return featuresFromHex(hex).Y >= .5 ? "dark" : "light";
2681
+ }
2682
+ /**
2683
+ * The logo to draw on a surface of the given tone. A missing variant falls
2684
+ * back to the other one, and an unknown tone uses the light-backgrounds logo,
2685
+ * which is what every site rendered before variants existed.
2686
+ */
2687
+ function selectLogoVariant(tone, variants) {
2688
+ const { forLightBackgrounds, forDarkBackgrounds } = variants;
2689
+ return tone === "dark" ? forDarkBackgrounds ?? forLightBackgrounds : forLightBackgrounds ?? forDarkBackgrounds;
2690
+ }
2691
+
2661
2692
  //#endregion
2662
2693
  //#region ../theme-core/src/utils/colorStyles.ts
2663
2694
  const COLOR_VAR_PREFIX = "--tb-";
@@ -2733,18 +2764,30 @@ function backgroundColorStyle(token) {
2733
2764
  return { backgroundColor: rgbColorValue(token) };
2734
2765
  }
2735
2766
  /**
2736
- * Creates a text color style object from a theme token.
2767
+ * Converts a text color token to a CSS color value that follows the enclosing
2768
+ * surface. The semantic text tokens (`text`, `heading`, `mutedText`) resolve
2769
+ * to the surface foreground variables, so text adapts when a section's
2770
+ * background changes; any other token is a fixed theme color.
2737
2771
  *
2738
2772
  * @param token - Theme color token
2739
- * @returns CSSProperties with color
2773
+ * @returns CSS color value
2740
2774
  */
2741
- function textColorStyle(token) {
2775
+ function textColorValue(token) {
2742
2776
  const parsed = parseToken(token);
2743
2777
  const surfaceRole = parsed.raw ? null : surfaceRoleForTextToken(parsed.token);
2744
- if (surfaceRole) {
2745
- return { color: parsed.opacityPercent === undefined ? surfaceForegroundValue(surfaceRole) : surfaceForegroundValueWithOpacity(surfaceRole, parsed.opacityPercent) };
2778
+ if (!surfaceRole) {
2779
+ return rgbColorValue(token);
2746
2780
  }
2747
- return { color: rgbColorValue(token) };
2781
+ return parsed.opacityPercent === undefined ? surfaceForegroundValue(surfaceRole) : surfaceForegroundValueWithOpacity(surfaceRole, parsed.opacityPercent);
2782
+ }
2783
+ /**
2784
+ * Creates a text color style object from a theme token.
2785
+ *
2786
+ * @param token - Theme color token
2787
+ * @returns CSSProperties with color
2788
+ */
2789
+ function textColorStyle(token) {
2790
+ return { color: textColorValue(token) };
2748
2791
  }
2749
2792
  /**
2750
2793
  * Creates a border color style object from a theme token.
@@ -6930,7 +6973,7 @@ function parseThemeForPersistence(value) {
6930
6973
  * overriding the twelve styles that deliberately declare none. Whether a button
6931
6974
  * carries a trailing affordance is the style's decision; the only caller that
6932
6975
  * legitimately opts out is the authored-button renderer, which reaches it
6933
- * through `themeButtonClassNameWithTrailingIcon`.
6976
+ * through `themeButtonExtraClassesWithTrailingIcon`.
6934
6977
  */
6935
6978
  const AFFORDANCE_SUPPRESS_CLASS = "rb-affordance-off";
6936
6979
 
@@ -6970,19 +7013,10 @@ function themeButtonSelector(variant, size) {
6970
7013
  }
6971
7014
  return `${baseSelector}.${themeButtonSizeClassName(size)}`;
6972
7015
  }
6973
- function themeButtonClassName(spec) {
6974
- const classes = [
6975
- ...themeButtonVariantClassNames(spec.variant),
6976
- themeButtonSizeClassName(spec.size),
6977
- spec.extraClassName
6978
- ];
6979
- return classes.filter(Boolean).join(" ");
6980
- }
6981
7016
  /**
6982
- * Button classes for an authored button that renders its own trailing icon.
7017
+ * Extra classes for an authored button that renders its own trailing icon.
6983
7018
  *
6984
- * A separate function rather than a flag on `themeButtonClassName`, because
6985
- * there is exactly one caller and it should stay visible in a diff. The name
7019
+ * This intent-named function has exactly one caller. The name
6986
7020
  * states what the caller knows to be true of its own markup — that it renders a
6987
7021
  * trailing icon — rather than what the theme does about it. The consequence is
6988
7022
  * the theme's to decide and to change; a caller naming the consequence would be
@@ -6993,11 +7027,8 @@ function themeButtonClassName(spec) {
6993
7027
  * affordance is declared by the button style, and a block overriding that is the
6994
7028
  * defect this replaced.
6995
7029
  */
6996
- function themeButtonClassNameWithTrailingIcon(spec) {
6997
- return themeButtonClassName({
6998
- ...spec,
6999
- extraClassName: [spec.extraClassName, AFFORDANCE_SUPPRESS_CLASS].filter(Boolean).join(" ")
7000
- });
7030
+ function themeButtonExtraClassesWithTrailingIcon() {
7031
+ return AFFORDANCE_SUPPRESS_CLASS;
7001
7032
  }
7002
7033
 
7003
7034
  //#endregion
@@ -28678,9 +28709,7 @@ function isNavUnderlineEffect(effect) {
28678
28709
  }
28679
28710
  /** Concrete hex behind a plain palette token, or null when it is not one. */
28680
28711
  function paletteHexForToken(theme, token) {
28681
- const parts = parseColorTokenParts(token);
28682
- if (parts.kind !== "token" || parts.opacityPercent !== null) return null;
28683
- return expandPalette(theme.palette)[parts.token] ?? null;
28712
+ return opaquePaletteHexForToken(expandPalette(theme.palette), token);
28684
28713
  }
28685
28714
  function compileHeaderScrollTreatment(theme, recipe, foregroundToken) {
28686
28715
  if (recipe.scrollTreatment !== "contrast-glass") return undefined;
@@ -32848,4 +32877,4 @@ function parseSdkEventRunUpsertInput(input, runIndex, options) {
32848
32877
  }
32849
32878
 
32850
32879
  //#endregion
32851
- export { generateBaseInteractiveCSS as $, createContentEntryRef as $n, NAV_LINK_LETTER_SPACING_MAP as $t, getGradientPreset as A, featuresFromHex as An, resolveTokenOrCssColorValue as At, generateCssVars as B, normalizeCardRole as Bn, featureCardCompositionTreatmentValues as Bt, retargetCompiledBoundaryRuntimeForContentAdjacency as C, resolveSurfaceForeground as Cn, MQ_SM_DOWN as Ct, compileTransitionRuntime as D, defaultThemeTokens as Dn, isCssColorLiteral as Dt, getCuratedSiteStyle as E, buildThemeTokens as En, headerVariantValues as Et, parseBackgroundAppearanceColorToken as F, surfaceForegroundStyle as Fn, defineBlockDesignCapability as Ft, resolvedButtonColourDeclarations as G, footerModeSchema as Gn, testimonialsCompositionTreatmentValues as Gt, PUBLIC_BUTTON_ROLES as H, mediaSchema as Hn, introCompositionTreatmentValues as Ht, defineBlockDesignMetadata as I, surfaceForegroundValue as In, defineFrameCapability as It, contextualButtonSurfaceStyles as J, unsafeAsOpaqueButtonColourToken as Jn, getComponentBorderWidthPx as Jt, resolvedButtonFocusDeclarations as K, VARIANT_ROLES as Kn, tileTreatmentValues as Kt, require_jsx_runtime as L, generateShadowValue$1 as Ln, defineNoBlockDesignCapability as Lt, boundaryRuntimeMetricsForTransition as M, oklchToHexGamut as Mn, asAppearancePresetId as Mt, backgroundAppearanceColorTokenNames as N, DEFAULT_SURFACE_TEXT_COLOR as Nn, asDesignBlockId as Nt, gradientToCss as O, ORDINARY_TEXT_MIN_CONTRAST_RATIO as On, resolveOnColorForThemeToken as Ot, backgroundAppearanceQuickColorTokenNames as P, surfaceForegroundDeclarations as Pn, assertNever$1 as Pt, generateEffectsCSS as Q, createCommandRef as Qn, NAV_LINK_BORDER_RADIUS_MAP as Qt, require_react as R, cardRoleSchema as Rn, eventListTreatmentValues as Rt, eventBookingOfferIntentSchema as S, textColorStyle as Sn, MQ_MD_DOWN as St, readHeaderNavFontSizePreference as T, onColorTokenName as Tn, MQ_TABLET_ONLY as Tt, generateButtonCss as U, mediaTypeDiscriminants as Un, makeBoundaryId as Ut, buttonStyleSelectionSchema as V, mediaIdentifierSchema as Vn, headingDecorationColorTokenValues as Vt, RESOLVED_BUTTON_DISABLED_DECLARATIONS as W, persistableMediaSchema as Wn, offeringsPreviewCompositionTreatmentValues as Wt, resolveContextualButtonRole as X, createBlockRef as Xn, parseBlockCustomCssRules as Xt, deriveButtonSurfaceContext as Y, parseBlockColorToken as Yn, getComponentShadowVar as Yt, generateDefaultButtonSystem as Z, createBlocksRef as Zn, parseCustomCssRules as Zt, entryIdentifierForCommand as _, backgroundColorStyle as _n, BREAKPOINT_LG as _t, classifySdkEventBookingOffer as a, INPUT_SPACING_MAP as an, createPageRef as ar, compileButtonColourStates as at, pagePathForCommand as b, mergeStyles as bn, BREAKPOINT_XL as bt, stableStringify as c, ACCORDION_SPACING_MAP as cn, refSlug as cr, expandPalette as ct, mapEventCommandContent as d, ICON_CONFIG as dn, boxBackgroundOverlaySchema as dt, NAV_LINK_PADDING_MAP as en, createEventCategoryRef as er, generateInteractiveChildInheritanceCSS as et, evaluateSiteCommandBatchExposure as f, ICON_SIZE_PX as fn, boxBackgroundSchema as ft, blockOrderIdentifiersForCommand as g, TokenResolver as gn, renderHeaderPaintTargetRules as gt, blockIdentifierForCommand as h, generateCardCss as hn, getHeaderPaintTargets as ht, classifySdkEventSchedule as i, INPUT_FONT_SIZE_MAP as in, createNavigationRef as ir, parseThemeForPersistence as it, parseGradientPresetId as j, hexToRgb as jn, pageDesignEditorBackgroundOverrideOwner as jt, GRADIENT_PRESET_IDS as k, contrastRatio as kn, resolveThemeColorReferenceValue as kt, createDryRunReport as l, ACCORDION_TRIGGER_FONT_SCALE as ln, slugPart as lr, getTextColorForBackground as lt, getSiteCommandMetadata as m, getDefaultCardVariants as mn, generateMobileOverlayBackdropFilterFix as mt, sdkEventOccurrenceInputSchema as n, NAV_LINK_TEXT_SIZE_MAP as nn, createFooterRef as nr, themeButtonClassName as nt, venueManagementFields as o, LABEL_FONT_SIZE_MAP as on, createSiteCommandSiteRef as or, formatButtonColourContractError as ot, evaluateSiteCommandExposure as p, generateCardCoreCss as pn, generateHeaderScrollTreatmentStyles as pt, contextualButtonSurfaceResetStyles as q, buttonVariantIdSchema as qn, visibleHeadingDecorationFamilyValues as qt, sdkEventUpsertOptionalFieldSchemas as r, FONT_WEIGHT_MAP$1 as rn, createFormRef as rr, themeButtonClassNameWithTrailingIcon as rt, sortRecord as s, ACCORDION_OPEN_ACCENT_THICKNESS as sn, createVenueRef as sr, generateShadowValue as st, classifySdkEventTiming as t, NAV_LINK_PADDING_X_MAP as tn, createEventSeriesRef as tr, parseThemeButtonVariantId as tt, parseAndPlanCommandBatchForTypes as u, ACCORDION_TRIGGER_LETTER_SPACING as un, __toESM as ur, themeSchema as ut, pageIdentifierForBlockCommand as v, borderColorStyle as vn, BREAKPOINT_MD as vt, mergeHeaderNavTypographyPreference as w, isOnColorBackgroundCandidateToken as wn, MQ_SM_UP as wt, hasConfiguredBookingVertical as x, rgbColorValue as xn, MQ_LG_UP as xt, pageIdentifierForCommand as y, cssVarValue as yn, BREAKPOINT_SM as yt, pickShadeTowardBackground as z, cardVariantRoleValues as zn, eyebrowTreatmentValues as zt };
32880
+ export { generateBaseInteractiveCSS as $, parseBlockColorToken as $n, NAV_LINK_BORDER_RADIUS_MAP as $t, getGradientPreset as A, buildThemeTokens as An, resolveThemeColorReferenceValue as At, generateCssVars as B, surfaceForegroundValue as Bn, eyebrowTreatmentValues as Bt, retargetCompiledBoundaryRuntimeForContentAdjacency as C, textColorStyle as Cn, MQ_MD_DOWN as Ct, compileTransitionRuntime as D, resolveSurfaceForeground as Dn, headerVariantValues as Dt, getCuratedSiteStyle as E, surfaceToneFromForegroundToken as En, MQ_TABLET_ONLY as Et, parseBackgroundAppearanceColorToken as F, hexToRgb as Fn, assertNever$1 as Ft, resolvedButtonColourDeclarations as G, mediaIdentifierSchema as Gn, offeringsPreviewCompositionTreatmentValues as Gt, PUBLIC_BUTTON_ROLES as H, cardRoleSchema as Hn, headingDecorationColorTokenValues as Ht, defineBlockDesignMetadata as I, oklchToHexGamut as In, defineBlockDesignCapability as It, contextualButtonSurfaceStyles as J, persistableMediaSchema as Jn, visibleHeadingDecorationFamilyValues as Jt, resolvedButtonFocusDeclarations as K, mediaSchema as Kn, testimonialsCompositionTreatmentValues as Kt, require_jsx_runtime as L, DEFAULT_SURFACE_TEXT_COLOR as Ln, defineFrameCapability as Lt, boundaryRuntimeMetricsForTransition as M, ORDINARY_TEXT_MIN_CONTRAST_RATIO as Mn, pageDesignEditorBackgroundOverrideOwner as Mt, backgroundAppearanceColorTokenNames as N, contrastRatio as Nn, asAppearancePresetId as Nt, gradientToCss as O, isOnColorBackgroundCandidateToken as On, isCssColorLiteral as Ot, backgroundAppearanceQuickColorTokenNames as P, featuresFromHex as Pn, asDesignBlockId as Pt, generateEffectsCSS as Q, unsafeAsOpaqueButtonColourToken as Qn, parseCustomCssRules as Qt, require_react as R, surfaceForegroundDeclarations as Rn, defineNoBlockDesignCapability as Rt, eventBookingOfferIntentSchema as S, rgbColorValue as Sn, MQ_LG_UP as St, readHeaderNavFontSizePreference as T, selectLogoVariant as Tn, MQ_SM_UP as Tt, generateButtonCss as U, cardVariantRoleValues as Un, introCompositionTreatmentValues as Ut, buttonStyleSelectionSchema as V, generateShadowValue$1 as Vn, featureCardCompositionTreatmentValues as Vt, RESOLVED_BUTTON_DISABLED_DECLARATIONS as W, normalizeCardRole as Wn, makeBoundaryId as Wt, resolveContextualButtonRole as X, VARIANT_ROLES as Xn, getComponentShadowVar as Xt, deriveButtonSurfaceContext as Y, footerModeSchema as Yn, getComponentBorderWidthPx as Yt, generateDefaultButtonSystem as Z, buttonVariantIdSchema as Zn, parseBlockCustomCssRules as Zt, entryIdentifierForCommand as _, TokenResolver as _n, renderHeaderPaintTargetRules as _t, classifySdkEventBookingOffer as a, INPUT_FONT_SIZE_MAP as an, createEventSeriesRef as ar, parseThemeForPersistence as at, pagePathForCommand as b, cssVarValue as bn, BREAKPOINT_SM as bt, stableStringify as c, ACCORDION_OPEN_ACCENT_THICKNESS as cn, createNavigationRef as cr, generateShadowValue as ct, mapEventCommandContent as d, ACCORDION_TRIGGER_LETTER_SPACING as dn, createVenueRef as dr, themeSchema as dt, NAV_LINK_LETTER_SPACING_MAP as en, createBlockRef as er, generateInteractiveChildInheritanceCSS as et, evaluateSiteCommandBatchExposure as f, ICON_CONFIG as fn, refSlug as fr, boxBackgroundOverlaySchema as ft, blockOrderIdentifiersForCommand as g, generateCardCss as gn, getHeaderPaintTargets as gt, blockIdentifierForCommand as h, getDefaultCardVariants as hn, generateMobileOverlayBackdropFilterFix as ht, classifySdkEventSchedule as i, FONT_WEIGHT_MAP$1 as in, createEventCategoryRef as ir, themeButtonVariantClassNames as it, parseGradientPresetId as j, defaultThemeTokens as jn, resolveTokenOrCssColorValue as jt, GRADIENT_PRESET_IDS as k, onColorTokenName as kn, resolveOnColorForThemeToken as kt, createDryRunReport as l, ACCORDION_SPACING_MAP as ln, createPageRef as lr, expandPalette as lt, getSiteCommandMetadata as m, generateCardCoreCss as mn, __toESM as mr, generateHeaderScrollTreatmentStyles as mt, sdkEventOccurrenceInputSchema as n, NAV_LINK_PADDING_X_MAP as nn, createCommandRef as nr, themeButtonExtraClassesWithTrailingIcon as nt, venueManagementFields as o, INPUT_SPACING_MAP as on, createFooterRef as or, compileButtonColourStates as ot, evaluateSiteCommandExposure as p, ICON_SIZE_PX as pn, slugPart as pr, boxBackgroundSchema as pt, contextualButtonSurfaceResetStyles as q, mediaTypeDiscriminants as qn, tileTreatmentValues as qt, sdkEventUpsertOptionalFieldSchemas as r, NAV_LINK_TEXT_SIZE_MAP as rn, createContentEntryRef as rr, themeButtonSizeClassName as rt, sortRecord as s, LABEL_FONT_SIZE_MAP as sn, createFormRef as sr, formatButtonColourContractError as st, classifySdkEventTiming as t, NAV_LINK_PADDING_MAP as tn, createBlocksRef as tr, parseThemeButtonVariantId as tt, parseAndPlanCommandBatchForTypes as u, ACCORDION_TRIGGER_FONT_SCALE as un, createSiteCommandSiteRef as ur, getTextColorForBackground as ut, pageIdentifierForBlockCommand as v, backgroundColorStyle as vn, BREAKPOINT_LG as vt, mergeHeaderNavTypographyPreference as w, textColorValue as wn, MQ_SM_DOWN as wt, hasConfiguredBookingVertical as x, mergeStyles as xn, BREAKPOINT_XL as xt, pageIdentifierForCommand as y, borderColorStyle as yn, BREAKPOINT_MD as yt, pickShadeTowardBackground as z, surfaceForegroundStyle as zn, eventListTreatmentValues as zt };
@@ -7008,4 +7008,79 @@ function parseSiteNavigationLocations(rows) {
7008
7008
  }
7009
7009
 
7010
7010
  //#endregion
7011
- export { formatEventPricing as $, parseFooterCompositionV1 as A, unsafeAsPositiveSeconds as At, formatBookingTime as B, unsafeAsUserId as Bt, parseMailingListContentVersionId as C, unsafeAsEventOfferingId as Ct, DEFAULT_MAILING_LIST_SUCCESS_MESSAGE as D, unsafeAsOccurrenceId as Dt, planMailingListChoicePresentation as E, unsafeAsMediaAssetId as Et, normalizeLocationAddressText as F, unsafeAsSiteScopedStoragePath as Ft, getLocalScheduleTime as G, formatLocalScheduleTime as H, ok as Ht, toLocationCoordinates as I, unsafeAsStaffMemberId as It, toScheduledBookingDateRange as J, parseUtcIsoDateTimeString as K, buildBookingUtcDateWindow as L, unsafeAsStorageBucketName as Lt, isCanonicalRichTextDoc as M, unsafeAsSafeDownloadFilename as Mt, assertAllowedPublicUrl as N, unsafeAsSiteFontId as Nt, parseMailingListProviderScope as O, unsafeAsOriginalFilename as Ot, isPresent as P, unsafeAsSiteId as Pt, formatBookingPriceDisplay as Q, formatBookingDate as R, unsafeAsStoragePath as Rt, parseMailingListBlockId as S, unsafeAsEntitlementId as St, parseMailingListRuntimeContext as T, unsafeAsFileChecksumSha256 as Tt, getBookingLocalDateKey as U, formatLocalScheduleDate as V, err as Vt, getLocalScheduleDate as W, parseBookingTimeZone as X, toScheduledBookingDateTime as Y, parseEventPageSurfaceSubject as Z, createSecret as _, unsafeAsBookingRequirementId as _t, parseVerticalId as a, resolvePricingOptionsPriceDisplay as at, stableJsonStringify as b, unsafeAsDemoCapability as bt, DEFAULT_EVENT_TYPE_PRESETS as c, formatCurrencyAmount as ct, SURFACE_EVENT_PRESET_VALUES as d, parseEventSeriesId as dt, isPublicEventPricingOptionDisplayable as et, WHOLE_SERIES_EVENT_PRESET_VALUES as f, parseMediaAssetId as ft, resolveWholeSeriesBookingPhase as g, unsafeAsAppointmentResourceId as gt, orderedLiveRunSessions as h, parseUserId as ht, isEventSeriesVerticalPresetDefinition as i, resolveExactOrFreePriceDisplay as it, parseMailingListPlacementTargeting as j, unsafeAsProductId as jt, footerNavigationLayouts as k, unsafeAsPositiveByteCount as kt, EVENT_PRESET_VALUES as l, assertNever as lt, CANCELLED_SESSION_STATUS as m, parseSiteId as mt, areConfiguredBookingVerticalConfigsEqual as n, publicEventPricingDisplay as nt, parseVerticalPresetId as o, fromArray as ot, publicReadFreshnessSeconds as p, parsePageId as pt, toBookingTimeZone as q, canonicalizeConfiguredBookingVerticalConfig as r, publicEventPricingType as rt, resolveSiteVerticalBookingConfig as s, mapNonEmptyArray as st, NAVIGATION_LOCATIONS as t, publicEventPricingCurrency as tt, ORDINARY_EVENT_PRESET_VALUES as u, parseApiKeyId as ut, exposeSecret as v, unsafeAsBookingSessionId as vt, parseMailingListSignedSourceToken as w, unsafeAsEventSeriesId as wt, buildMailingListSignupBlockSourceRef as x, unsafeAsDetectedMimeType as xt, parseManagementKey as y, unsafeAsDeclaredMimeType as yt, formatBookingDateParts as z, unsafeAsUploadSessionId as zt };
7011
+ //#region ../core/src/event-preset-vocabulary.ts
7012
+ const EVENT_PRESET_VOCABULARY = {
7013
+ event: {
7014
+ label: "Event",
7015
+ pluralLabel: "Events",
7016
+ description: "Any event, repeating or manually dated, that does not fit the other categories."
7017
+ },
7018
+ class: {
7019
+ label: "Class",
7020
+ pluralLabel: "Classes",
7021
+ description: "Regular scheduled classes and group sessions."
7022
+ },
7023
+ course: {
7024
+ label: "Course",
7025
+ pluralLabel: "Courses",
7026
+ description: "A fixed set of dates that people book together."
7027
+ },
7028
+ term: {
7029
+ label: "Term",
7030
+ pluralLabel: "Terms",
7031
+ description: "A fixed term of sessions that people book together."
7032
+ },
7033
+ workshop: {
7034
+ label: "Workshop",
7035
+ pluralLabel: "Workshops",
7036
+ description: "One-off workshops, day sessions, or special events."
7037
+ },
7038
+ retreat: {
7039
+ label: "Retreat",
7040
+ pluralLabel: "Retreats",
7041
+ description: "Multi-day or residential immersive experiences."
7042
+ },
7043
+ performance: {
7044
+ label: "Performance",
7045
+ pluralLabel: "Performances",
7046
+ description: "Audience-facing shows, concerts, recitals, or showcases."
7047
+ }
7048
+ };
7049
+
7050
+ //#endregion
7051
+ //#region ../core/src/event-catalogue.ts
7052
+ /** Accepts validated settings; defaults and raw configuration parsing belong to the caller. */
7053
+ function resolveEventCatalogue(settings) {
7054
+ const entries = (settings.verticalConfig?.selectedPresetIds ?? []).map(getVerticalPresetDefinition).filter(isEventSeriesVerticalPresetDefinition).map((preset) => ({
7055
+ preset: eventPresetForVerticalPreset(preset),
7056
+ verticalPresetId: preset.id,
7057
+ label: preset.label,
7058
+ pluralLabel: preset.pluralLabel,
7059
+ description: preset.description
7060
+ }));
7061
+ if (entries.length > 0) return {
7062
+ source: "business_profile",
7063
+ entries,
7064
+ catchAll: "implicit"
7065
+ };
7066
+ return {
7067
+ source: "generic",
7068
+ entries: settings.eventTypePresets.filter((preset) => preset !== "event").map((preset) => ({
7069
+ preset,
7070
+ verticalPresetId: null,
7071
+ ...EVENT_PRESET_VOCABULARY[preset]
7072
+ })),
7073
+ catchAll: settings.eventTypePresets.includes("event") ? "selected" : "unavailable"
7074
+ };
7075
+ }
7076
+ /** Named choices retain authored order; catch-all is consistently last. */
7077
+ function eventCatalogueChoices(catalogue) {
7078
+ return catalogue.catchAll === "unavailable" ? catalogue.entries : [...catalogue.entries, {
7079
+ preset: "event",
7080
+ verticalPresetId: null,
7081
+ ...EVENT_PRESET_VOCABULARY.event
7082
+ }];
7083
+ }
7084
+
7085
+ //#endregion
7086
+ export { formatEventPricing as $, parseFooterCompositionV1 as A, unsafeAsPositiveSeconds as At, formatBookingTime as B, unsafeAsUserId as Bt, parseMailingListContentVersionId as C, unsafeAsEventOfferingId as Ct, DEFAULT_MAILING_LIST_SUCCESS_MESSAGE as D, unsafeAsOccurrenceId as Dt, planMailingListChoicePresentation as E, unsafeAsMediaAssetId as Et, normalizeLocationAddressText as F, unsafeAsSiteScopedStoragePath as Ft, getLocalScheduleTime as G, formatLocalScheduleTime as H, ok as Ht, toLocationCoordinates as I, unsafeAsStaffMemberId as It, toScheduledBookingDateRange as J, parseUtcIsoDateTimeString as K, buildBookingUtcDateWindow as L, unsafeAsStorageBucketName as Lt, isCanonicalRichTextDoc as M, unsafeAsSafeDownloadFilename as Mt, assertAllowedPublicUrl as N, unsafeAsSiteFontId as Nt, parseMailingListProviderScope as O, unsafeAsOriginalFilename as Ot, isPresent as P, unsafeAsSiteId as Pt, formatBookingPriceDisplay as Q, formatBookingDate as R, unsafeAsStoragePath as Rt, parseMailingListBlockId as S, unsafeAsEntitlementId as St, parseMailingListRuntimeContext as T, unsafeAsFileChecksumSha256 as Tt, getBookingLocalDateKey as U, formatLocalScheduleDate as V, err as Vt, getLocalScheduleDate as W, parseBookingTimeZone as X, toScheduledBookingDateTime as Y, parseEventPageSurfaceSubject as Z, createSecret as _, unsafeAsBookingRequirementId as _t, parseVerticalId as a, resolvePricingOptionsPriceDisplay as at, stableJsonStringify as b, unsafeAsDemoCapability as bt, DEFAULT_EVENT_TYPE_PRESETS as c, formatCurrencyAmount as ct, SURFACE_EVENT_PRESET_VALUES as d, parseEventSeriesId as dt, isPublicEventPricingOptionDisplayable as et, WHOLE_SERIES_EVENT_PRESET_VALUES as f, parseMediaAssetId as ft, resolveWholeSeriesBookingPhase as g, unsafeAsAppointmentResourceId as gt, orderedLiveRunSessions as h, parseUserId as ht, canonicalizeConfiguredBookingVerticalConfig as i, resolveExactOrFreePriceDisplay as it, parseMailingListPlacementTargeting as j, unsafeAsProductId as jt, footerNavigationLayouts as k, unsafeAsPositiveByteCount as kt, EVENT_PRESET_VALUES as l, assertNever as lt, CANCELLED_SESSION_STATUS as m, parseSiteId as mt, NAVIGATION_LOCATIONS as n, publicEventPricingDisplay as nt, parseVerticalPresetId as o, fromArray as ot, publicReadFreshnessSeconds as p, parsePageId as pt, toBookingTimeZone as q, areConfiguredBookingVerticalConfigsEqual as r, publicEventPricingType as rt, resolveSiteVerticalBookingConfig as s, mapNonEmptyArray as st, resolveEventCatalogue as t, publicEventPricingCurrency as tt, ORDINARY_EVENT_PRESET_VALUES as u, parseApiKeyId as ut, exposeSecret as v, unsafeAsBookingSessionId as vt, parseMailingListSignedSourceToken as w, unsafeAsEventSeriesId as wt, buildMailingListSignupBlockSourceRef as x, unsafeAsDetectedMimeType as xt, parseManagementKey as y, unsafeAsDeclaredMimeType as yt, formatBookingDateParts as z, unsafeAsUploadSessionId as zt };
package/dist/testing.mjs CHANGED
@@ -1,6 +1,6 @@
1
1
  #!/usr/bin/env node
2
- import "./sdk-event-upsert-Bf6wAl4s.mjs";
3
- import "./src-B8fOSKJ6.mjs";
4
- import { n as syncLocalMediaForPush, r as syncLocalMediaForPull, y as writeMediaManifest } from "./local-sync-EcUwLrRx.mjs";
2
+ import "./sdk-event-upsert-BNxbxaA0.mjs";
3
+ import "./src-DbmhanBI.mjs";
4
+ import { n as syncLocalMediaForPush, r as syncLocalMediaForPull, y as writeMediaManifest } from "./local-sync-DF-2DL_D.mjs";
5
5
 
6
6
  export { syncLocalMediaForPull, syncLocalMediaForPush, writeMediaManifest };
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "riverbankcms",
3
- "version": "0.8.0",
3
+ "version": "0.9.0",
4
4
  "description": "Riverbank CMS command-line tools for SDK site developers",
5
5
  "bin": {
6
6
  "riverbankcms": "dist/cli/index.mjs"
@@ -1,4 +0,0 @@
1
- #!/usr/bin/env node
2
- import { t as loadConfigFile } from "./load-config-De0cFlPg.mjs";
3
-
4
- export { loadConfigFile };