@riverbankcms/sdk 0.64.0 → 0.67.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 (78) hide show
  1. package/dist/_dts/api/src/aiPlayground.d.ts +18 -11
  2. package/dist/_dts/api/src/apiEndpointTypes.d.ts +12 -0
  3. package/dist/_dts/api/src/bookingOperations.d.ts +1 -1
  4. package/dist/_dts/api/src/endpoints.d.ts +25 -0
  5. package/dist/_dts/api/src/sdkConfig/contracts.d.ts +0 -40
  6. package/dist/_dts/api/src/sdkContracts.d.ts +1 -1
  7. package/dist/_dts/api/src/siteMembers.d.ts +1 -1
  8. package/dist/_dts/api/src/siteOperations.d.ts +1 -1
  9. package/dist/_dts/billing/src/plans/types.d.ts +1 -1
  10. package/dist/_dts/blocks/src/bindings/index.d.ts +1 -1
  11. package/dist/_dts/blocks/src/system/node/validation-constants.d.ts +1 -1
  12. package/dist/_dts/blocks/src/system/transforms/registry/formatting.d.ts +1 -0
  13. package/dist/_dts/blocks/src/system/transforms/typed.d.ts +2 -1
  14. package/dist/_dts/db/src/generated/supabase/database.types.d.ts +81 -0
  15. package/dist/_dts/preview-next/src/client/blocks/pageDesignRuntimePreview.d.ts +7 -3
  16. package/dist/_dts/preview-next/src/client/blocks/previewProjection/runtimeContentDecoration.d.ts +2 -2
  17. package/dist/_dts/sdk/src/cli/commands/push/execute/footer.d.ts +33 -0
  18. package/dist/_dts/sdk/src/cli/commands/push-execute.d.ts +2 -1
  19. package/dist/_dts/sdk/src/cli/env.d.ts +2 -1
  20. package/dist/_dts/sdk/src/cli/merge-remote/entryMergePush.d.ts +2 -1
  21. package/dist/_dts/sdk/src/cli/site-commands/commandKeys.d.ts +13 -0
  22. package/dist/_dts/sdk/src/cli/site-commands/commandRuntime.d.ts +114 -0
  23. package/dist/_dts/sdk/src/cli/site-commands/entryCommands.d.ts +26 -48
  24. package/dist/_dts/sdk/src/cli/site-commands/footerCommands.d.ts +50 -0
  25. package/dist/_dts/sdk/src/cli/site-commands/formCommands.d.ts +57 -0
  26. package/dist/_dts/sdk/src/cli/site-commands/index.d.ts +5 -0
  27. package/dist/_dts/sdk/src/cli/site-commands/navigationCommands.d.ts +57 -0
  28. package/dist/_dts/sdk/src/cli/site-commands/pageCommands.d.ts +83 -0
  29. package/dist/_dts/sdk/src/cli/site-commands/pushExecution.d.ts +67 -14
  30. package/dist/_dts/sdk/src/cli/sync/executor.d.ts +10 -28
  31. package/dist/_dts/sdk/src/cli/sync/index.d.ts +1 -1
  32. package/dist/_dts/sdk/src/config/dashboard-validation.d.ts +0 -48
  33. package/dist/_dts/sdk/src/config/types.d.ts +1 -1
  34. package/dist/_dts/sdk/src/version.d.ts +1 -1
  35. package/dist/_dts/site-commands/src/adapter.d.ts +2 -2
  36. package/dist/_dts/site-commands/src/commands.d.ts +410 -13
  37. package/dist/_dts/site-commands/src/domain.d.ts +3 -3
  38. package/dist/_dts/site-commands/src/exposure.d.ts +41 -0
  39. package/dist/_dts/site-commands/src/index.d.ts +1 -0
  40. package/dist/_dts/site-commands/src/metadata.d.ts +93 -2
  41. package/dist/_dts/site-commands/src/planner.d.ts +13 -6
  42. package/dist/_dts/site-commands/src/refs.d.ts +13 -1
  43. package/dist/_dts/theme-core/src/palette/utils/index.d.ts +1 -0
  44. package/dist/_dts/theme-core/src/palette/utils/onColor.d.ts +2 -0
  45. package/dist/_dts/theme-core/src/site-styles/accessibleSurfaces.d.ts +83 -0
  46. package/dist/_dts/theme-core/src/site-styles/contentTemplateRuntimeCompiler.d.ts +2 -1
  47. package/dist/_dts/theme-core/src/site-styles/curatedSiteStyles.d.ts +89 -12
  48. package/dist/_dts/theme-core/src/site-styles/generatedSchemas.d.ts +8 -2
  49. package/dist/_dts/theme-core/src/site-styles/index.d.ts +1 -0
  50. package/dist/_dts/theme-core/src/site-styles/previewCompiler.d.ts +3 -2
  51. package/dist/_dts/theme-core/src/site-styles/runtimeCompiler.d.ts +9 -6
  52. package/dist/_dts/ui/src/callout.d.ts +1 -1
  53. package/dist/cli/index.mjs +4290 -2513
  54. package/dist/client/client.mjs +598 -372
  55. package/dist/client/hooks.mjs +311 -123
  56. package/dist/client/rendering/client.mjs +209 -68
  57. package/dist/client/rendering/islands.mjs +281 -150
  58. package/dist/client/rendering.mjs +416 -190
  59. package/dist/preview-next/before-render.mjs +61 -13
  60. package/dist/preview-next/client/runtime.mjs +930 -376
  61. package/dist/preview-next/middleware.mjs +61 -13
  62. package/dist/server/components.mjs +526 -325
  63. package/dist/server/config-validation.mjs +313 -125
  64. package/dist/server/config.mjs +313 -125
  65. package/dist/server/data.mjs +311 -123
  66. package/dist/server/index.mjs +78 -16
  67. package/dist/server/next.mjs +527 -326
  68. package/dist/server/page-converter.mjs +159 -41
  69. package/dist/server/prebuild.mjs +1 -1
  70. package/dist/server/rendering/server.mjs +526 -325
  71. package/dist/server/rendering.mjs +526 -325
  72. package/dist/server/routing.mjs +392 -131
  73. package/dist/server/server.mjs +312 -124
  74. package/dist/server/theme-bridge.mjs +155 -48
  75. package/package.json +1 -1
  76. package/dist/_dts/path-utils/src/index.d.ts +0 -8
  77. package/dist/_dts/path-utils/src/redirectPaths.d.ts +0 -26
  78. package/dist/_dts/path-utils/src/safeAppPath.d.ts +0 -26
@@ -1283,6 +1283,7 @@ var init_validation_constants = __esm({
1283
1283
  "date.formatShort",
1284
1284
  "array.length",
1285
1285
  "value.jsonArray",
1286
+ "value.csv",
1286
1287
  "array.marqueeLoop",
1287
1288
  // Layout (layout.ts)
1288
1289
  "layout.maxWidthClass",
@@ -2110,6 +2111,171 @@ var init_augmentManifest = __esm({
2110
2111
  }
2111
2112
  });
2112
2113
 
2114
+ // ../theme-core/src/palette/utils/colorConversion.ts
2115
+ function hexToRgb(hex) {
2116
+ const h = hex.replace(/^#/, "");
2117
+ const m = h.length === 3 ? h.split("").map((c2) => c2 + c2).join("") : h;
2118
+ if (m.length !== 6) throw new Error("Bad hex");
2119
+ const int = parseInt(m, 16);
2120
+ return { r: int >> 16 & 255, g: int >> 8 & 255, b: int & 255 };
2121
+ }
2122
+ function rgbToHex(r2, g, b2) {
2123
+ const to2 = (n) => Math.round(n).toString(16).padStart(2, "0");
2124
+ return `#${to2(r2)}${to2(g)}${to2(b2)}`;
2125
+ }
2126
+ function srgbToLinear(u) {
2127
+ const x = u / 255;
2128
+ return x <= 0.04045 ? x / 12.92 : Math.pow((x + 0.055) / 1.055, 2.4);
2129
+ }
2130
+ function linearToSrgb(x) {
2131
+ const y = x <= 31308e-7 ? 12.92 * x : 1.055 * Math.pow(x, 1 / 2.4) - 0.055;
2132
+ return clamp01(y) * 255;
2133
+ }
2134
+ function rgbToHsl(r2, g, b2) {
2135
+ const R2 = r2 / 255, G2 = g / 255, B = b2 / 255;
2136
+ const max = Math.max(R2, G2, B), min = Math.min(R2, G2, B);
2137
+ const d = max - min;
2138
+ let h = 0;
2139
+ if (d !== 0) {
2140
+ switch (max) {
2141
+ case R2:
2142
+ h = (G2 - B) / d + (G2 < B ? 6 : 0);
2143
+ break;
2144
+ case G2:
2145
+ h = (B - R2) / d + 2;
2146
+ break;
2147
+ case B:
2148
+ h = (R2 - G2) / d + 4;
2149
+ break;
2150
+ }
2151
+ h *= 60;
2152
+ }
2153
+ const l = (max + min) / 2;
2154
+ const s = d === 0 ? 0 : d / (1 - Math.abs(2 * l - 1));
2155
+ return { h, s, l };
2156
+ }
2157
+ function srgbToOklab(r2, g, b2) {
2158
+ const R2 = srgbToLinear(r2), G2 = srgbToLinear(g), B = srgbToLinear(b2);
2159
+ const l = 0.4122214708 * R2 + 0.5363325363 * G2 + 0.0514459929 * B;
2160
+ const m = 0.2119034982 * R2 + 0.6806995451 * G2 + 0.1073969566 * B;
2161
+ const s = 0.0883024619 * R2 + 0.2817188376 * G2 + 0.6299787005 * B;
2162
+ const l_ = Math.cbrt(l), m_ = Math.cbrt(m), s_ = Math.cbrt(s);
2163
+ const L2 = 0.2104542553 * l_ + 0.793617785 * m_ - 0.0040720468 * s_;
2164
+ const a = 1.9779984951 * l_ - 2.428592205 * m_ + 0.4505937099 * s_;
2165
+ const b22 = 0.0259040371 * l_ + 0.7827717662 * m_ - 0.808675766 * s_;
2166
+ return { L: L2, a, b: b22 };
2167
+ }
2168
+ function oklabToSrgb(L2, a, b2) {
2169
+ const l_ = Math.pow(L2 + 0.3963377774 * a + 0.2158037573 * b2, 3);
2170
+ const m_ = Math.pow(L2 - 0.1055613458 * a - 0.0638541728 * b2, 3);
2171
+ const s_ = Math.pow(L2 - 0.0894841775 * a - 1.291485548 * b2, 3);
2172
+ const R2 = 4.0767416621 * l_ - 3.3077115913 * m_ + 0.2309699292 * s_;
2173
+ const G2 = -1.2684380046 * l_ + 2.6097574011 * m_ - 0.3413193965 * s_;
2174
+ const B = -0.0041960863 * l_ - 0.7034186147 * m_ + 1.707614701 * s_;
2175
+ return { r: linearToSrgb(R2), g: linearToSrgb(G2), b: linearToSrgb(B) };
2176
+ }
2177
+ function oklabToOklch(L2, a, b2) {
2178
+ const C = Math.sqrt(a * a + b2 * b2);
2179
+ const h = C < 1e-7 ? 0 : deg(Math.atan2(b2, a) * 180 / Math.PI);
2180
+ return { L: L2, C, h };
2181
+ }
2182
+ function oklchToOklab(L2, C, h) {
2183
+ const hr = h * Math.PI / 180;
2184
+ const a = C * Math.cos(hr);
2185
+ const b2 = C * Math.sin(hr);
2186
+ return { L: L2, a, b: b2 };
2187
+ }
2188
+ function inSRGB(r2, g, b2) {
2189
+ return r2 >= 0 && r2 <= 255 && g >= 0 && g <= 255 && b2 >= 0 && b2 <= 255;
2190
+ }
2191
+ function oklchToHexGamut(L2, C, h) {
2192
+ let lo2 = 0, hi = C, best = 0;
2193
+ for (let i = 0; i < 18; i++) {
2194
+ const mid = (lo2 + hi) / 2;
2195
+ const { a: a2, b: b3 } = oklchToOklab(L2, mid, h);
2196
+ const { r: r3, g: g2, b: bb2 } = oklabToSrgb(L2, a2, b3);
2197
+ if (inSRGB(r3, g2, bb2)) {
2198
+ best = mid;
2199
+ lo2 = mid;
2200
+ } else {
2201
+ hi = mid;
2202
+ }
2203
+ }
2204
+ const { a, b: b2 } = oklchToOklab(L2, best, h);
2205
+ const { r: r2, g, b: bb } = oklabToSrgb(L2, a, b2);
2206
+ return rgbToHex(r2, g, bb);
2207
+ }
2208
+ function featuresFromHex(hex) {
2209
+ const { r: r2, g, b: b2 } = hexToRgb(hex);
2210
+ const { h, s, l } = rgbToHsl(r2, g, b2);
2211
+ const { L: L2, a, b: b22 } = srgbToOklab(r2, g, b2);
2212
+ const { L: okL, C: okC, h: okH } = oklabToOklch(L2, a, b22);
2213
+ const max = Math.max(r2, g, b2);
2214
+ const v = max / 255;
2215
+ const Y = 0.2126 * srgbToLinear(r2) + 0.7152 * srgbToLinear(g) + 0.0722 * srgbToLinear(b2);
2216
+ const chroma = s;
2217
+ return { r: r2, g, b: b2, h, s, l, v, Y, chroma, okL, okC, okH, hex };
2218
+ }
2219
+ var clamp01, mod, deg;
2220
+ var init_colorConversion = __esm({
2221
+ "../theme-core/src/palette/utils/colorConversion.ts"() {
2222
+ "use strict";
2223
+ clamp01 = (x) => Math.max(0, Math.min(1, x));
2224
+ mod = (a, n) => (a % n + n) % n;
2225
+ deg = (x) => mod(x, 360);
2226
+ }
2227
+ });
2228
+
2229
+ // ../theme-core/src/palette/utils/contrast.ts
2230
+ function relativeLuminance(r2, g, b2) {
2231
+ const R2 = srgbToLinear(r2), G2 = srgbToLinear(g), B = srgbToLinear(b2);
2232
+ return 0.2126 * R2 + 0.7152 * G2 + 0.0722 * B;
2233
+ }
2234
+ var init_contrast = __esm({
2235
+ "../theme-core/src/palette/utils/contrast.ts"() {
2236
+ "use strict";
2237
+ init_colorConversion();
2238
+ }
2239
+ });
2240
+
2241
+ // ../theme-core/src/palette/utils/onColor.ts
2242
+ function onColorTokenName(backgroundToken) {
2243
+ return `on${backgroundToken.split("-").filter((part) => part.length > 0).map((part) => part.charAt(0).toUpperCase() + part.slice(1)).join("")}`;
2244
+ }
2245
+ function isOnColorBackgroundCandidateToken(token) {
2246
+ const role = token.match(/^(.*?)(?:-\d{2,3})?$/)?.[1] ?? token;
2247
+ return BACKGROUND_ROLE_NAMES.has(role);
2248
+ }
2249
+ var BACKGROUND_ROLE_NAMES;
2250
+ var init_onColor = __esm({
2251
+ "../theme-core/src/palette/utils/onColor.ts"() {
2252
+ "use strict";
2253
+ BACKGROUND_ROLE_NAMES = /* @__PURE__ */ new Set([
2254
+ "primary",
2255
+ "secondary",
2256
+ "accent",
2257
+ "success",
2258
+ "warning",
2259
+ "destructive",
2260
+ "info",
2261
+ "background",
2262
+ "surface",
2263
+ "surfaceAlt",
2264
+ "muted",
2265
+ "neutral"
2266
+ ]);
2267
+ }
2268
+ });
2269
+
2270
+ // ../theme-core/src/site-styles/accessibleSurfaces.ts
2271
+ var init_accessibleSurfaces = __esm({
2272
+ "../theme-core/src/site-styles/accessibleSurfaces.ts"() {
2273
+ "use strict";
2274
+ init_contrast();
2275
+ init_onColor();
2276
+ }
2277
+ });
2278
+
2113
2279
  // ../theme-core/src/site-styles/appearancePresetResolution.ts
2114
2280
  function assertValidOptionGroups(preset2) {
2115
2281
  preset2.optionGroups?.forEach((group) => {
@@ -5558,7 +5724,7 @@ function getContrastingTextColorToken(backgroundToken, theme) {
5558
5724
  }
5559
5725
  return isLightTheme ? "neutral-50" : "neutral-950";
5560
5726
  }
5561
- var init_contrast = __esm({
5727
+ var init_contrast2 = __esm({
5562
5728
  "../theme-core/src/buttons/utils/contrast.ts"() {
5563
5729
  "use strict";
5564
5730
  }
@@ -5639,7 +5805,7 @@ var BORDER_WIDTH_TO_CLASS_MAP, VALID_CORNER_STYLES, VALID_SHADOW_SIZES;
5639
5805
  var init_generateDefaultButtonSystem = __esm({
5640
5806
  "../theme-core/src/buttons/generateDefaultButtonSystem.ts"() {
5641
5807
  "use strict";
5642
- init_contrast();
5808
+ init_contrast2();
5643
5809
  BORDER_WIDTH_TO_CLASS_MAP = {
5644
5810
  none: "border-0",
5645
5811
  // 0px
@@ -8327,7 +8493,8 @@ function defineCuratedSiteStyle(input) {
8327
8493
  name: input.name,
8328
8494
  description: input.description,
8329
8495
  generationBrief: input.generationBrief,
8330
- selectionKeywords: input.selectionKeywords ?? [],
8496
+ selectionKeywordRules: input.selectionKeywordRules ?? [],
8497
+ siteCreatorSelection: input.siteCreatorSelection ?? { kind: "explicit_only" },
8331
8498
  template: {
8332
8499
  id: asDesignSystemTemplateId(`template:${input.id.replace("site-style:", "")}`),
8333
8500
  name: input.name,
@@ -8372,6 +8539,9 @@ var init_curatedSiteStyles = __esm({
8372
8539
  "site-style:bright-community",
8373
8540
  "site-style:quiet-luxury",
8374
8541
  "site-style:practical-services",
8542
+ "site-style:quiet-practice",
8543
+ "site-style:personal-retreat-journal",
8544
+ "site-style:tactile-workshop",
8375
8545
  "site-style:modern-wellness",
8376
8546
  "site-style:bold-launch",
8377
8547
  "site-style:south-west-twerk-school"
@@ -8555,12 +8725,13 @@ var init_curatedSiteStyles = __esm({
8555
8725
  name: "Quiet Luxury",
8556
8726
  description: "Minimal, confident, and refined for premium experiences and private services.",
8557
8727
  generationBrief: "Use fewer claims, more specificity, and restrained sensory detail. Favor elegant media and low repetition over dense panels.",
8558
- selectionKeywords: [
8559
- "luxury",
8560
- "premium",
8561
- "boutique",
8562
- "bespoke",
8563
- "exclusive"
8728
+ siteCreatorSelection: { kind: "site_creator_keyword_heuristic", priority: 20 },
8729
+ selectionKeywordRules: [
8730
+ { kind: "word", value: "luxury" },
8731
+ { kind: "word", value: "premium" },
8732
+ { kind: "word", value: "boutique" },
8733
+ { kind: "word", value: "bespoke" },
8734
+ { kind: "word", value: "exclusive" }
8564
8735
  ],
8565
8736
  tokenRecipes: {
8566
8737
  palette: "high-contrast",
@@ -8589,13 +8760,14 @@ var init_curatedSiteStyles = __esm({
8589
8760
  name: "Practical Services",
8590
8761
  description: "Efficient, plainspoken, and conversion-focused for trades and everyday services.",
8591
8762
  generationBrief: "Make services, location, trust signals, and contact paths obvious. Keep copy brief and avoid ornate visual treatments.",
8592
- selectionKeywords: [
8593
- "repair",
8594
- "plumb",
8595
- "electric",
8596
- "cleaning",
8597
- "landscap",
8598
- "contractor"
8763
+ siteCreatorSelection: { kind: "primary_goal_support" },
8764
+ selectionKeywordRules: [
8765
+ { kind: "word", value: "repair" },
8766
+ { kind: "substring", value: "plumb" },
8767
+ { kind: "substring", value: "electric" },
8768
+ { kind: "word", value: "cleaning" },
8769
+ { kind: "substring", value: "landscap" },
8770
+ { kind: "substring", value: "contractor" }
8599
8771
  ],
8600
8772
  tokenRecipes: {
8601
8773
  palette: "brand-led",
@@ -8646,18 +8818,134 @@ var init_curatedSiteStyles = __esm({
8646
8818
  paletteChoice("warm-neutral-forest")
8647
8819
  ]
8648
8820
  }),
8821
+ defineCuratedSiteStyle({
8822
+ id: "site-style:quiet-practice",
8823
+ name: "Quiet Practice",
8824
+ description: "Grounded, calm, and practical for small appointment-first practices.",
8825
+ generationBrief: "Make services, practitioner trust, preparation notes, and booking routes easy to scan. Keep the tone warm and specific, with quiet confidence rather than spa cliches or medical claims.",
8826
+ siteCreatorSelection: { kind: "site_creator_keyword_heuristic", priority: 30 },
8827
+ selectionKeywordRules: [
8828
+ { kind: "substring", value: "massage" },
8829
+ { kind: "word", value: "bodywork" },
8830
+ { kind: "phrase", value: "appointment practice" },
8831
+ { kind: "phrase", value: "appointment-first" },
8832
+ { kind: "substring", value: "practitioner" },
8833
+ { kind: "substring", value: "therap" },
8834
+ { kind: "substring", value: "clinic" },
8835
+ { kind: "phrase", value: "wellness practice" }
8836
+ ],
8837
+ tokenRecipes: {
8838
+ palette: "soft-natural",
8839
+ contrast: "standard",
8840
+ radius: "soft",
8841
+ shadow: "subtle",
8842
+ typography: "clean-sans",
8843
+ spacing: "regular",
8844
+ motion: "subtle"
8845
+ },
8846
+ compositionBudget: quietBudget,
8847
+ recommendedHeaderLookIds: ["practical-utility", "clean-base", "centered-calm"],
8848
+ buttonPersonalityChoices: [
8849
+ buttonChoice("pebble"),
8850
+ buttonChoice("soft-pill"),
8851
+ buttonChoice("editorial-link")
8852
+ ],
8853
+ paletteVariantChoices: [
8854
+ paletteChoice("soft-natural-stone"),
8855
+ paletteChoice("soft-natural-sage"),
8856
+ paletteChoice("warm-neutral-clay")
8857
+ ]
8858
+ }),
8859
+ defineCuratedSiteStyle({
8860
+ id: "site-style:personal-retreat-journal",
8861
+ name: "Personal Retreat Journal",
8862
+ description: "Warm, story-led, and readable for solo practitioners with mixed offers.",
8863
+ generationBrief: "Center the practitioner as the guide, then make private sessions, classes, retreats, and resources feel like clear pathways. Keep retreat copy grounded and practical, with enough editorial warmth for longer reading.",
8864
+ siteCreatorSelection: { kind: "site_creator_keyword_heuristic", priority: 40 },
8865
+ selectionKeywordRules: [
8866
+ { kind: "substring", value: "retreat" },
8867
+ { kind: "phrase", value: "solo practitioner" },
8868
+ { kind: "phrase", value: "personal brand" },
8869
+ { kind: "substring", value: "teacher" },
8870
+ { kind: "substring", value: "coach" },
8871
+ { kind: "phrase", value: "retreat resources" },
8872
+ { kind: "substring", value: "journal" }
8873
+ ],
8874
+ tokenRecipes: {
8875
+ palette: "warm-neutral",
8876
+ contrast: "standard",
8877
+ radius: "soft",
8878
+ shadow: "subtle",
8879
+ typography: "serif-editorial",
8880
+ spacing: "airy",
8881
+ motion: "subtle"
8882
+ },
8883
+ compositionBudget: balancedBudget,
8884
+ recommendedHeaderLookIds: ["editorial-line", "centered-calm", "minimal-transparent"],
8885
+ buttonPersonalityChoices: [
8886
+ buttonChoice("editorial-link"),
8887
+ buttonChoice("soft-pill"),
8888
+ buttonChoice("brushed-wash")
8889
+ ],
8890
+ paletteVariantChoices: [
8891
+ paletteChoice("warm-neutral-forest"),
8892
+ paletteChoice("warm-neutral-clay"),
8893
+ paletteChoice("soft-natural-stone")
8894
+ ]
8895
+ }),
8896
+ defineCuratedSiteStyle({
8897
+ id: "site-style:tactile-workshop",
8898
+ name: "Tactile Workshop",
8899
+ description: "Bright, hands-on, and image-led for maker studios, workshops, and creative classes.",
8900
+ generationBrief: "Lead with objects, materials, studio process, and practical booking detail. Keep the tone warm and direct, with useful mess, clear dates, and enough gallery rhythm to feel like a real creative studio.",
8901
+ siteCreatorSelection: { kind: "site_creator_keyword_heuristic", priority: 50 },
8902
+ selectionKeywordRules: [
8903
+ { kind: "substring", value: "ceramic" },
8904
+ { kind: "word", value: "pottery" },
8905
+ { kind: "phrase", value: "maker studio" },
8906
+ { kind: "phrase", value: "craft class" },
8907
+ { kind: "phrase", value: "craft workshop" },
8908
+ { kind: "word", value: "clay" },
8909
+ { kind: "word", value: "kiln" }
8910
+ ],
8911
+ tokenRecipes: {
8912
+ palette: "brand-led",
8913
+ contrast: "standard",
8914
+ radius: "soft",
8915
+ shadow: "subtle",
8916
+ typography: "friendly-sans",
8917
+ spacing: "regular",
8918
+ motion: "subtle"
8919
+ },
8920
+ compositionBudget: balancedBudget,
8921
+ recommendedHeaderLookIds: ["brand-solid", "practical-utility", "clean-base"],
8922
+ recommendedFooterLookIds: ["site-footer-brand-two-band", "footer-muted-grounding"],
8923
+ buttonPersonalityChoices: [
8924
+ buttonChoice("pebble"),
8925
+ buttonChoice("confident-chip"),
8926
+ buttonChoice("ink-stamp"),
8927
+ buttonChoice("editorial-link")
8928
+ ],
8929
+ paletteVariantChoices: [
8930
+ paletteChoice("brand-led-warm"),
8931
+ paletteChoice("brand-led-cool"),
8932
+ paletteChoice("soft-natural-watercolor"),
8933
+ paletteChoice("warm-neutral-clay")
8934
+ ]
8935
+ }),
8649
8936
  defineCuratedSiteStyle({
8650
8937
  id: "site-style:bold-launch",
8651
8938
  name: "Bold Launch",
8652
8939
  description: "High-energy and punchy for launches, campaigns, and creative offers.",
8653
8940
  generationBrief: "Use crisp positioning, bold hero structure, strong calls to action, and confident visual rhythm. Keep it precise, not shouty.",
8654
- selectionKeywords: [
8655
- "launch",
8656
- "campaign",
8657
- "preorder",
8658
- "pre-order",
8659
- "waitlist",
8660
- "drop"
8941
+ siteCreatorSelection: { kind: "site_creator_keyword_heuristic", priority: 10 },
8942
+ selectionKeywordRules: [
8943
+ { kind: "substring", value: "launch" },
8944
+ { kind: "substring", value: "campaign" },
8945
+ { kind: "word", value: "preorder" },
8946
+ { kind: "phrase", value: "pre-order" },
8947
+ { kind: "substring", value: "waitlist" },
8948
+ { kind: "word", value: "drop" }
8661
8949
  ],
8662
8950
  tokenRecipes: {
8663
8951
  palette: "high-contrast",
@@ -8688,15 +8976,6 @@ var init_curatedSiteStyles = __esm({
8688
8976
  name: "South West Twerk School",
8689
8977
  description: "Energetic, editorial, and high-contrast for a branded dance school presence.",
8690
8978
  generationBrief: "Use confident rhythm, bold burgundy-and-gold accents, large editorial intro copy, strong booking routes, and dark feature sections where proof or forms need emphasis.",
8691
- selectionKeywords: [
8692
- "dance",
8693
- "classes",
8694
- "workshop",
8695
- "school",
8696
- "movement",
8697
- "performance",
8698
- "community"
8699
- ],
8700
8979
  tokenRecipes: {
8701
8980
  palette: "brand-led",
8702
8981
  contrast: "maximum",
@@ -8985,6 +9264,177 @@ var init_modern_minimal = __esm({
8985
9264
  }
8986
9265
  });
8987
9266
 
9267
+ // ../theme-core/src/palette/generateShades.ts
9268
+ function generateShades(hexColor, name) {
9269
+ const shadeSteps = [50, 100, 200, 300, 400, 500, 600, 700, 800, 900, 950];
9270
+ const base = featuresFromHex(hexColor);
9271
+ const hue = base.okH;
9272
+ const baseChroma = base.okC;
9273
+ const toneMap = {
9274
+ 50: 0.975,
9275
+ 100: 0.945,
9276
+ 200: 0.89,
9277
+ 300: 0.82,
9278
+ 400: 0.74,
9279
+ 500: 0.66,
9280
+ 600: 0.58,
9281
+ 700: 0.49,
9282
+ 800: 0.4,
9283
+ 900: 0.28,
9284
+ 950: 0.16
9285
+ };
9286
+ const shadeDefs = shadeSteps.map((step, idx) => {
9287
+ const t = idx / (shadeSteps.length - 1);
9288
+ const L2 = toneMap[step];
9289
+ const chromaFactor = 0.06 + 0.94 * Math.sin(Math.PI * t);
9290
+ const C = baseChroma * chromaFactor;
9291
+ return {
9292
+ name: `${name}-${step}`,
9293
+ hex: oklchToHexGamut(L2, C, hue)
9294
+ };
9295
+ });
9296
+ shadeDefs.push({ name, hex: hexColor });
9297
+ return shadeDefs;
9298
+ }
9299
+ var init_generateShades = __esm({
9300
+ "../theme-core/src/palette/generateShades.ts"() {
9301
+ "use strict";
9302
+ init_colorConversion();
9303
+ }
9304
+ });
9305
+
9306
+ // ../theme-core/src/palette/neutralScale.ts
9307
+ function generateNeutralScale({
9308
+ background,
9309
+ steps = 11,
9310
+ warm = false
9311
+ }) {
9312
+ const isDark = background === "#000000" || background.startsWith("#0") || background.startsWith("#1");
9313
+ const shadeNames = [50, 100, 200, 300, 400, 500, 600, 700, 800, 900, 950];
9314
+ const count = Math.min(steps, shadeNames.length);
9315
+ const scale = [];
9316
+ for (let i = 0; i < count; i++) {
9317
+ const t = i / (count - 1);
9318
+ const tone = isDark ? mix(0.06, 0.92, t) : mix(0.98, 0.1, t);
9319
+ const hex = oklchToHexGamut(tone, 0.02, warm ? 85 : 250);
9320
+ const name = `neutral-${shadeNames[i]}`;
9321
+ scale.push({ name, hex });
9322
+ }
9323
+ return scale;
9324
+ }
9325
+ function mix(a, b2, t) {
9326
+ return a + (b2 - a) * Math.max(0, Math.min(1, t));
9327
+ }
9328
+ var init_neutralScale = __esm({
9329
+ "../theme-core/src/palette/neutralScale.ts"() {
9330
+ "use strict";
9331
+ init_colorConversion();
9332
+ }
9333
+ });
9334
+
9335
+ // ../theme-core/src/palette/utils/textColor.ts
9336
+ function pickBlackOrWhiteTextColor(background, minContrast = 4.5) {
9337
+ const { r: r2, g, b: b2 } = parseColorToRgb(background);
9338
+ const luminance = relativeLuminance(r2, g, b2);
9339
+ const blackContrast = (luminance + 0.05) / 0.05;
9340
+ const whiteContrast = 1.05 / (luminance + 0.05);
9341
+ if (blackContrast >= minContrast && whiteContrast < minContrast) {
9342
+ return "#000000";
9343
+ }
9344
+ if (whiteContrast >= minContrast && blackContrast < minContrast) {
9345
+ return "#FFFFFF";
9346
+ }
9347
+ return blackContrast >= whiteContrast ? "#000000" : "#FFFFFF";
9348
+ }
9349
+ function getTextColorForBackground(background) {
9350
+ return pickBlackOrWhiteTextColor(background);
9351
+ }
9352
+ function parseColorToRgb(input) {
9353
+ const trimmed = input.trim();
9354
+ if (trimmed.startsWith("#")) {
9355
+ return hexToRgb(trimmed);
9356
+ }
9357
+ const rgbMatch = trimmed.match(
9358
+ /^rgba?\(\s*(\d{1,3})\s*,\s*(\d{1,3})\s*,\s*(\d{1,3})(?:\s*,\s*(?:0|1|0?\.\d+))?\s*\)$/i
9359
+ );
9360
+ if (rgbMatch?.[1] && rgbMatch[2] && rgbMatch[3]) {
9361
+ return {
9362
+ r: clamp255(Number(rgbMatch[1])),
9363
+ g: clamp255(Number(rgbMatch[2])),
9364
+ b: clamp255(Number(rgbMatch[3]))
9365
+ };
9366
+ }
9367
+ throw new Error("Unsupported color format");
9368
+ }
9369
+ function clamp255(value) {
9370
+ if (Number.isNaN(value)) return 0;
9371
+ return Math.max(0, Math.min(255, value));
9372
+ }
9373
+ var init_textColor = __esm({
9374
+ "../theme-core/src/palette/utils/textColor.ts"() {
9375
+ "use strict";
9376
+ init_colorConversion();
9377
+ init_contrast();
9378
+ }
9379
+ });
9380
+
9381
+ // ../theme-core/src/palette/expandPalette.ts
9382
+ function colorsToMap(palette) {
9383
+ const map = {};
9384
+ for (const c2 of palette.colors) {
9385
+ map[c2.name] = c2.hex;
9386
+ }
9387
+ return map;
9388
+ }
9389
+ function isBackgroundDark(hex) {
9390
+ try {
9391
+ return featuresFromHex(hex).Y < 0.5;
9392
+ } catch {
9393
+ return false;
9394
+ }
9395
+ }
9396
+ function expandPalette(palette) {
9397
+ const base = colorsToMap(palette);
9398
+ const expanded = { ...base };
9399
+ const background = base.background || base.surface || "#ffffff";
9400
+ const neutral2 = generateNeutralScale({ background, steps: 11, warm: false });
9401
+ neutral2.forEach((n) => {
9402
+ expanded[n.name] = n.hex;
9403
+ });
9404
+ for (const [name, hex] of Object.entries(base)) {
9405
+ if (hex) {
9406
+ const shades = generateShades(hex, name);
9407
+ shades.forEach((shade) => {
9408
+ expanded[shade.name] = shade.hex;
9409
+ });
9410
+ }
9411
+ }
9412
+ if (base.text) expanded.body = base.text;
9413
+ if (base.danger && !base.destructive) {
9414
+ expanded.destructive = base.danger;
9415
+ }
9416
+ const isDark = base.background ? isBackgroundDark(base.background) : false;
9417
+ const isDarkMode = palette.meta?.mode === "dark" || isDark;
9418
+ expanded.mutedText = isDarkMode ? expanded["neutral-600"] ?? "#666" : expanded["neutral-500"] ?? "#888";
9419
+ for (const [token, hex] of Object.entries({ ...expanded })) {
9420
+ if (!hex || !isOnColorBackgroundCandidateToken(token)) continue;
9421
+ const onToken = onColorTokenName(token);
9422
+ if (expanded[onToken]) continue;
9423
+ expanded[onToken] = getTextColorForBackground(hex);
9424
+ }
9425
+ return expanded;
9426
+ }
9427
+ var init_expandPalette = __esm({
9428
+ "../theme-core/src/palette/expandPalette.ts"() {
9429
+ "use strict";
9430
+ init_generateShades();
9431
+ init_neutralScale();
9432
+ init_colorConversion();
9433
+ init_textColor();
9434
+ init_onColor();
9435
+ }
9436
+ });
9437
+
8988
9438
  // ../theme-core/src/site-styles/rawStyleFields.ts
8989
9439
  var themeV2RuntimeStyleFieldNames, themeV2BlockSpecificRawStyleFieldNames, themeV2NormalEditorRawStyleFieldNames, themeV2NormalEditorRawStyleFieldNameSet;
8990
9440
  var init_rawStyleFields = __esm({
@@ -9168,35 +9618,31 @@ var init_runtimeCompiler = __esm({
9168
9618
  "use strict";
9169
9619
  init_schema3();
9170
9620
  init_modern_minimal();
9621
+ init_expandPalette();
9171
9622
  init_personalities();
9172
9623
  init_variants();
9173
9624
  init_designState();
9174
9625
  init_types2();
9626
+ init_accessibleSurfaces();
9175
9627
  defaultDesignRuntimeRules = defineDesignRuntimeRules({
9176
9628
  sectionSurfaces: {
9177
9629
  base: {},
9178
9630
  "muted-band": {
9179
9631
  background: {
9180
9632
  type: "color",
9181
- color: "muted",
9182
- textColor: "text",
9183
- headingColor: "text"
9633
+ color: "muted"
9184
9634
  }
9185
9635
  },
9186
9636
  "accent-band": {
9187
9637
  background: {
9188
9638
  type: "color",
9189
- color: "primary",
9190
- textColor: "primaryForeground",
9191
- headingColor: "primaryForeground"
9639
+ color: "primary"
9192
9640
  }
9193
9641
  },
9194
9642
  "brand-depth-band": {
9195
9643
  background: {
9196
9644
  type: "color",
9197
- color: "primary-800",
9198
- textColor: "primaryForeground",
9199
- headingColor: "primaryForeground"
9645
+ color: "primary-800"
9200
9646
  }
9201
9647
  },
9202
9648
  "hero-image": {
@@ -9662,6 +10108,7 @@ var init_tokenRecipes = __esm({
9662
10108
  var init_site_styles = __esm({
9663
10109
  "../theme-core/src/site-styles/index.ts"() {
9664
10110
  "use strict";
10111
+ init_accessibleSurfaces();
9665
10112
  init_appearancePresets();
9666
10113
  init_blockFlow();
9667
10114
  init_compositionBudget();
@@ -15598,121 +16045,6 @@ var init_form = __esm({
15598
16045
  }
15599
16046
  });
15600
16047
 
15601
- // ../theme-core/src/palette/utils/colorConversion.ts
15602
- function hexToRgb(hex) {
15603
- const h = hex.replace(/^#/, "");
15604
- const m = h.length === 3 ? h.split("").map((c2) => c2 + c2).join("") : h;
15605
- if (m.length !== 6) throw new Error("Bad hex");
15606
- const int = parseInt(m, 16);
15607
- return { r: int >> 16 & 255, g: int >> 8 & 255, b: int & 255 };
15608
- }
15609
- function rgbToHex(r2, g, b2) {
15610
- const to2 = (n) => Math.round(n).toString(16).padStart(2, "0");
15611
- return `#${to2(r2)}${to2(g)}${to2(b2)}`;
15612
- }
15613
- function srgbToLinear(u) {
15614
- const x = u / 255;
15615
- return x <= 0.04045 ? x / 12.92 : Math.pow((x + 0.055) / 1.055, 2.4);
15616
- }
15617
- function linearToSrgb(x) {
15618
- const y = x <= 31308e-7 ? 12.92 * x : 1.055 * Math.pow(x, 1 / 2.4) - 0.055;
15619
- return clamp01(y) * 255;
15620
- }
15621
- function rgbToHsl(r2, g, b2) {
15622
- const R2 = r2 / 255, G2 = g / 255, B = b2 / 255;
15623
- const max = Math.max(R2, G2, B), min = Math.min(R2, G2, B);
15624
- const d = max - min;
15625
- let h = 0;
15626
- if (d !== 0) {
15627
- switch (max) {
15628
- case R2:
15629
- h = (G2 - B) / d + (G2 < B ? 6 : 0);
15630
- break;
15631
- case G2:
15632
- h = (B - R2) / d + 2;
15633
- break;
15634
- case B:
15635
- h = (R2 - G2) / d + 4;
15636
- break;
15637
- }
15638
- h *= 60;
15639
- }
15640
- const l = (max + min) / 2;
15641
- const s = d === 0 ? 0 : d / (1 - Math.abs(2 * l - 1));
15642
- return { h, s, l };
15643
- }
15644
- function srgbToOklab(r2, g, b2) {
15645
- const R2 = srgbToLinear(r2), G2 = srgbToLinear(g), B = srgbToLinear(b2);
15646
- const l = 0.4122214708 * R2 + 0.5363325363 * G2 + 0.0514459929 * B;
15647
- const m = 0.2119034982 * R2 + 0.6806995451 * G2 + 0.1073969566 * B;
15648
- const s = 0.0883024619 * R2 + 0.2817188376 * G2 + 0.6299787005 * B;
15649
- const l_ = Math.cbrt(l), m_ = Math.cbrt(m), s_ = Math.cbrt(s);
15650
- const L2 = 0.2104542553 * l_ + 0.793617785 * m_ - 0.0040720468 * s_;
15651
- const a = 1.9779984951 * l_ - 2.428592205 * m_ + 0.4505937099 * s_;
15652
- const b22 = 0.0259040371 * l_ + 0.7827717662 * m_ - 0.808675766 * s_;
15653
- return { L: L2, a, b: b22 };
15654
- }
15655
- function oklabToSrgb(L2, a, b2) {
15656
- const l_ = Math.pow(L2 + 0.3963377774 * a + 0.2158037573 * b2, 3);
15657
- const m_ = Math.pow(L2 - 0.1055613458 * a - 0.0638541728 * b2, 3);
15658
- const s_ = Math.pow(L2 - 0.0894841775 * a - 1.291485548 * b2, 3);
15659
- const R2 = 4.0767416621 * l_ - 3.3077115913 * m_ + 0.2309699292 * s_;
15660
- const G2 = -1.2684380046 * l_ + 2.6097574011 * m_ - 0.3413193965 * s_;
15661
- const B = -0.0041960863 * l_ - 0.7034186147 * m_ + 1.707614701 * s_;
15662
- return { r: linearToSrgb(R2), g: linearToSrgb(G2), b: linearToSrgb(B) };
15663
- }
15664
- function oklabToOklch(L2, a, b2) {
15665
- const C = Math.sqrt(a * a + b2 * b2);
15666
- const h = C < 1e-7 ? 0 : deg(Math.atan2(b2, a) * 180 / Math.PI);
15667
- return { L: L2, C, h };
15668
- }
15669
- function oklchToOklab(L2, C, h) {
15670
- const hr = h * Math.PI / 180;
15671
- const a = C * Math.cos(hr);
15672
- const b2 = C * Math.sin(hr);
15673
- return { L: L2, a, b: b2 };
15674
- }
15675
- function inSRGB(r2, g, b2) {
15676
- return r2 >= 0 && r2 <= 255 && g >= 0 && g <= 255 && b2 >= 0 && b2 <= 255;
15677
- }
15678
- function oklchToHexGamut(L2, C, h) {
15679
- let lo2 = 0, hi = C, best = 0;
15680
- for (let i = 0; i < 18; i++) {
15681
- const mid = (lo2 + hi) / 2;
15682
- const { a: a2, b: b3 } = oklchToOklab(L2, mid, h);
15683
- const { r: r3, g: g2, b: bb2 } = oklabToSrgb(L2, a2, b3);
15684
- if (inSRGB(r3, g2, bb2)) {
15685
- best = mid;
15686
- lo2 = mid;
15687
- } else {
15688
- hi = mid;
15689
- }
15690
- }
15691
- const { a, b: b2 } = oklchToOklab(L2, best, h);
15692
- const { r: r2, g, b: bb } = oklabToSrgb(L2, a, b2);
15693
- return rgbToHex(r2, g, bb);
15694
- }
15695
- function featuresFromHex(hex) {
15696
- const { r: r2, g, b: b2 } = hexToRgb(hex);
15697
- const { h, s, l } = rgbToHsl(r2, g, b2);
15698
- const { L: L2, a, b: b22 } = srgbToOklab(r2, g, b2);
15699
- const { L: okL, C: okC, h: okH } = oklabToOklch(L2, a, b22);
15700
- const max = Math.max(r2, g, b2);
15701
- const v = max / 255;
15702
- const Y = 0.2126 * srgbToLinear(r2) + 0.7152 * srgbToLinear(g) + 0.0722 * srgbToLinear(b2);
15703
- const chroma = s;
15704
- return { r: r2, g, b: b2, h, s, l, v, Y, chroma, okL, okC, okH, hex };
15705
- }
15706
- var clamp01, mod, deg;
15707
- var init_colorConversion = __esm({
15708
- "../theme-core/src/palette/utils/colorConversion.ts"() {
15709
- "use strict";
15710
- clamp01 = (x) => Math.max(0, Math.min(1, x));
15711
- mod = (a, n) => (a % n + n) % n;
15712
- deg = (x) => mod(x, 360);
15713
- }
15714
- });
15715
-
15716
16048
  // ../blocks/src/lib/typeGuards.ts
15717
16049
  function isRecord4(value) {
15718
16050
  return typeof value === "object" && value !== null && !Array.isArray(value);
@@ -18013,64 +18345,6 @@ var init_utils = __esm({
18013
18345
  }
18014
18346
  });
18015
18347
 
18016
- // ../theme-core/src/palette/utils/contrast.ts
18017
- function relativeLuminance(r2, g, b2) {
18018
- const R2 = srgbToLinear(r2), G2 = srgbToLinear(g), B = srgbToLinear(b2);
18019
- return 0.2126 * R2 + 0.7152 * G2 + 0.0722 * B;
18020
- }
18021
- var init_contrast2 = __esm({
18022
- "../theme-core/src/palette/utils/contrast.ts"() {
18023
- "use strict";
18024
- init_colorConversion();
18025
- }
18026
- });
18027
-
18028
- // ../theme-core/src/palette/utils/textColor.ts
18029
- function pickBlackOrWhiteTextColor(background, minContrast = 4.5) {
18030
- const { r: r2, g, b: b2 } = parseColorToRgb(background);
18031
- const luminance = relativeLuminance(r2, g, b2);
18032
- const blackContrast = (luminance + 0.05) / 0.05;
18033
- const whiteContrast = 1.05 / (luminance + 0.05);
18034
- if (blackContrast >= minContrast && whiteContrast < minContrast) {
18035
- return "#000000";
18036
- }
18037
- if (whiteContrast >= minContrast && blackContrast < minContrast) {
18038
- return "#FFFFFF";
18039
- }
18040
- return blackContrast >= whiteContrast ? "#000000" : "#FFFFFF";
18041
- }
18042
- function getTextColorForBackground(background) {
18043
- return pickBlackOrWhiteTextColor(background);
18044
- }
18045
- function parseColorToRgb(input) {
18046
- const trimmed = input.trim();
18047
- if (trimmed.startsWith("#")) {
18048
- return hexToRgb(trimmed);
18049
- }
18050
- const rgbMatch = trimmed.match(
18051
- /^rgba?\(\s*(\d{1,3})\s*,\s*(\d{1,3})\s*,\s*(\d{1,3})(?:\s*,\s*(?:0|1|0?\.\d+))?\s*\)$/i
18052
- );
18053
- if (rgbMatch?.[1] && rgbMatch[2] && rgbMatch[3]) {
18054
- return {
18055
- r: clamp255(Number(rgbMatch[1])),
18056
- g: clamp255(Number(rgbMatch[2])),
18057
- b: clamp255(Number(rgbMatch[3]))
18058
- };
18059
- }
18060
- throw new Error("Unsupported color format");
18061
- }
18062
- function clamp255(value) {
18063
- if (Number.isNaN(value)) return 0;
18064
- return Math.max(0, Math.min(255, value));
18065
- }
18066
- var init_textColor = __esm({
18067
- "../theme-core/src/palette/utils/textColor.ts"() {
18068
- "use strict";
18069
- init_colorConversion();
18070
- init_contrast2();
18071
- }
18072
- });
18073
-
18074
18348
  // ../../node_modules/.pnpm/clsx@2.1.1/node_modules/clsx/dist/clsx.mjs
18075
18349
  function r(e) {
18076
18350
  var t, f, n = "";
@@ -20104,7 +20378,12 @@ var init_event_listing = __esm({
20104
20378
  detailLevel: "listing",
20105
20379
  kind: { $bind: { from: "content.kind" } },
20106
20380
  eventSurface: { $bind: { from: "content.eventSurface" } },
20107
- eventPresets: { $bind: { from: "content.filterEventPresets" } },
20381
+ eventPresets: {
20382
+ $bind: {
20383
+ from: "content.filterEventPresets",
20384
+ transforms: [{ id: "value.csv" }]
20385
+ }
20386
+ },
20108
20387
  scheduleScope: { $bind: { from: "content.scheduleScope" } }
20109
20388
  },
20110
20389
  mode: "server"
@@ -20948,7 +21227,12 @@ var init_event_calendar = __esm({
20948
21227
  // Pass filter params if configured
20949
21228
  kind: { $bind: { from: "content.kind" } },
20950
21229
  eventSurface: { $bind: { from: "content.eventSurface" } },
20951
- eventPresets: { $bind: { from: "content.filterEventPresets" } },
21230
+ eventPresets: {
21231
+ $bind: {
21232
+ from: "content.filterEventPresets",
21233
+ transforms: [{ id: "value.csv" }]
21234
+ }
21235
+ },
20952
21236
  scheduleScope: { $bind: { from: "content.scheduleScope" } },
20953
21237
  categoryIds: { $bind: { from: "content.filterCategoryIds" } },
20954
21238
  staffMemberId: { $bind: { from: "content.filterStaffMemberId" } },
@@ -29344,140 +29628,6 @@ var init_blockOverrides = __esm({
29344
29628
  }
29345
29629
  });
29346
29630
 
29347
- // ../theme-core/src/palette/generateShades.ts
29348
- function generateShades(hexColor, name) {
29349
- const shadeSteps = [50, 100, 200, 300, 400, 500, 600, 700, 800, 900, 950];
29350
- const base = featuresFromHex(hexColor);
29351
- const hue = base.okH;
29352
- const baseChroma = base.okC;
29353
- const toneMap = {
29354
- 50: 0.975,
29355
- 100: 0.945,
29356
- 200: 0.89,
29357
- 300: 0.82,
29358
- 400: 0.74,
29359
- 500: 0.66,
29360
- 600: 0.58,
29361
- 700: 0.49,
29362
- 800: 0.4,
29363
- 900: 0.28,
29364
- 950: 0.16
29365
- };
29366
- const shadeDefs = shadeSteps.map((step, idx) => {
29367
- const t = idx / (shadeSteps.length - 1);
29368
- const L2 = toneMap[step];
29369
- const chromaFactor = 0.06 + 0.94 * Math.sin(Math.PI * t);
29370
- const C = baseChroma * chromaFactor;
29371
- return {
29372
- name: `${name}-${step}`,
29373
- hex: oklchToHexGamut(L2, C, hue)
29374
- };
29375
- });
29376
- shadeDefs.push({ name, hex: hexColor });
29377
- return shadeDefs;
29378
- }
29379
- var init_generateShades = __esm({
29380
- "../theme-core/src/palette/generateShades.ts"() {
29381
- "use strict";
29382
- init_colorConversion();
29383
- }
29384
- });
29385
-
29386
- // ../theme-core/src/palette/neutralScale.ts
29387
- function generateNeutralScale({
29388
- background,
29389
- steps = 11,
29390
- warm = false
29391
- }) {
29392
- const isDark = background === "#000000" || background.startsWith("#0") || background.startsWith("#1");
29393
- const shadeNames = [50, 100, 200, 300, 400, 500, 600, 700, 800, 900, 950];
29394
- const count = Math.min(steps, shadeNames.length);
29395
- const scale = [];
29396
- for (let i = 0; i < count; i++) {
29397
- const t = i / (count - 1);
29398
- const tone = isDark ? mix(0.06, 0.92, t) : mix(0.98, 0.1, t);
29399
- const hex = oklchToHexGamut(tone, 0.02, warm ? 85 : 250);
29400
- const name = `neutral-${shadeNames[i]}`;
29401
- scale.push({ name, hex });
29402
- }
29403
- return scale;
29404
- }
29405
- function mix(a, b2, t) {
29406
- return a + (b2 - a) * Math.max(0, Math.min(1, t));
29407
- }
29408
- var init_neutralScale = __esm({
29409
- "../theme-core/src/palette/neutralScale.ts"() {
29410
- "use strict";
29411
- init_colorConversion();
29412
- }
29413
- });
29414
-
29415
- // ../theme-core/src/palette/expandPalette.ts
29416
- function colorsToMap(palette) {
29417
- const map = {};
29418
- for (const c2 of palette.colors) {
29419
- map[c2.name] = c2.hex;
29420
- }
29421
- return map;
29422
- }
29423
- function isBackgroundDark(hex) {
29424
- try {
29425
- return featuresFromHex(hex).Y < 0.5;
29426
- } catch {
29427
- return false;
29428
- }
29429
- }
29430
- function expandPalette(palette) {
29431
- const base = colorsToMap(palette);
29432
- const expanded = { ...base };
29433
- const background = base.background || base.surface || "#ffffff";
29434
- const neutral2 = generateNeutralScale({ background, steps: 11, warm: false });
29435
- neutral2.forEach((n) => {
29436
- expanded[n.name] = n.hex;
29437
- });
29438
- for (const [name, hex] of Object.entries(base)) {
29439
- if (hex) {
29440
- const shades = generateShades(hex, name);
29441
- shades.forEach((shade) => {
29442
- expanded[shade.name] = shade.hex;
29443
- });
29444
- }
29445
- }
29446
- if (base.text) expanded.body = base.text;
29447
- if (base.danger && !base.destructive) {
29448
- expanded.destructive = base.danger;
29449
- }
29450
- const isDark = base.background ? isBackgroundDark(base.background) : false;
29451
- const isDarkMode = palette.meta?.mode === "dark" || isDark;
29452
- expanded.mutedText = isDarkMode ? expanded["neutral-600"] ?? "#666" : expanded["neutral-500"] ?? "#888";
29453
- const onRoles = [
29454
- { role: "primary", on: "onPrimary" },
29455
- { role: "secondary", on: "onSecondary" },
29456
- { role: "accent", on: "onAccent" },
29457
- { role: "success", on: "onSuccess" },
29458
- { role: "warning", on: "onWarning" },
29459
- { role: "destructive", on: "onDestructive" },
29460
- { role: "info", on: "onInfo" },
29461
- { role: "surface", on: "onSurface" }
29462
- ];
29463
- for (const { role, on: on2 } of onRoles) {
29464
- const bg = base[role];
29465
- if (!bg) continue;
29466
- if (expanded[on2]) continue;
29467
- expanded[on2] = getTextColorForBackground(bg);
29468
- }
29469
- return expanded;
29470
- }
29471
- var init_expandPalette = __esm({
29472
- "../theme-core/src/palette/expandPalette.ts"() {
29473
- "use strict";
29474
- init_generateShades();
29475
- init_neutralScale();
29476
- init_colorConversion();
29477
- init_textColor();
29478
- }
29479
- });
29480
-
29481
29631
  // ../theme-core/src/runtime/fontFamily.ts
29482
29632
  function isGenericFamily(font) {
29483
29633
  return GENERIC_CSS_FAMILIES.includes(font.toLowerCase());
@@ -63651,6 +63801,17 @@ var init_newsletterForm2 = __esm({
63651
63801
  // src/rendering/hooks/usePage.ts
63652
63802
  import { useState, useEffect } from "react";
63653
63803
 
63804
+ // ../api/src/apiEndpointTypes.ts
63805
+ function blockedDemoMutationPolicy(classification, publicMessage) {
63806
+ if (publicMessage.trim() === "") {
63807
+ throw new Error(`Demo mutation policy ${classification} requires publicMessage.`);
63808
+ }
63809
+ return {
63810
+ classification,
63811
+ publicMessage
63812
+ };
63813
+ }
63814
+
63654
63815
  // ../api/src/cache-tags.ts
63655
63816
  var TAG_TEMPLATES = {
63656
63817
  siteCollection: "riverbank:site",
@@ -63681,6 +63842,18 @@ var TAG_TEMPLATES = {
63681
63842
  };
63682
63843
 
63683
63844
  // ../api/src/endpoints.ts
63845
+ var DEMO_MUTATION_BLOCKED_HIDDEN = blockedDemoMutationPolicy(
63846
+ "blocked-hidden",
63847
+ "This action is not available in demo sites."
63848
+ );
63849
+ var DEMO_MUTATION_BLOCKED_DISABLED = blockedDemoMutationPolicy(
63850
+ "blocked-disabled",
63851
+ "This setting is disabled in demo sites."
63852
+ );
63853
+ var DEMO_MUTATION_INTERNAL_ONLY = blockedDemoMutationPolicy(
63854
+ "internal-only",
63855
+ "This internal operation is not available in demo sites."
63856
+ );
63684
63857
  var ENDPOINT_DEFINITIONS = {
63685
63858
  // AI endpoints - no cache due to dynamic nature
63686
63859
  aiContentUpdateChat: {
@@ -63797,7 +63970,8 @@ var ENDPOINT_DEFINITIONS = {
63797
63970
  path: "/sites/{siteId}/ai/generate",
63798
63971
  method: "POST",
63799
63972
  auth: "user",
63800
- responseKind: "json"
63973
+ responseKind: "json",
63974
+ demoMutation: DEMO_MUTATION_BLOCKED_HIDDEN
63801
63975
  },
63802
63976
  getOnboardingPreviewStatus: {
63803
63977
  path: "/public/sites/{siteId}/onboarding/preview-status",
@@ -63818,7 +63992,8 @@ var ENDPOINT_DEFINITIONS = {
63818
63992
  method: "POST",
63819
63993
  auth: "user",
63820
63994
  errors: [],
63821
- responseKind: "json"
63995
+ responseKind: "json",
63996
+ demoMutation: DEMO_MUTATION_BLOCKED_DISABLED
63822
63997
  },
63823
63998
  goLiveSite: {
63824
63999
  path: "/sites/{siteId}/launch/go-live",
@@ -63887,20 +64062,23 @@ var ENDPOINT_DEFINITIONS = {
63887
64062
  path: "/sites/{siteId}/ai/site-wizard/goals",
63888
64063
  method: "POST",
63889
64064
  auth: "user",
63890
- responseKind: "json"
64065
+ responseKind: "json",
64066
+ demoMutation: DEMO_MUTATION_BLOCKED_HIDDEN
63891
64067
  },
63892
64068
  aiSiteWizardIntakeTriage: {
63893
64069
  path: "/sites/{siteId}/ai/site-wizard/intake-triage",
63894
64070
  method: "POST",
63895
64071
  auth: "user",
63896
- responseKind: "json"
64072
+ responseKind: "json",
64073
+ demoMutation: DEMO_MUTATION_BLOCKED_HIDDEN
63897
64074
  },
63898
64075
  aiSiteWizardTelemetry: {
63899
64076
  path: "/sites/{siteId}/ai/site-wizard/telemetry",
63900
64077
  method: "POST",
63901
64078
  auth: "user",
63902
64079
  errors: [],
63903
- responseKind: "json"
64080
+ responseKind: "json",
64081
+ demoMutation: DEMO_MUTATION_BLOCKED_HIDDEN
63904
64082
  },
63905
64083
  // Admin SEO
63906
64084
  listGscPropertiesAdmin: {
@@ -64107,7 +64285,7 @@ var ENDPOINT_DEFINITIONS = {
64107
64285
  responseKind: "json",
64108
64286
  errors: ["resource:not_found", "server:internal_error"]
64109
64287
  },
64110
- // Ops (event hosts/admins)
64288
+ // Ops (staff event operators/admins)
64111
64289
  opsListUpcomingEventOccurrences: {
64112
64290
  path: "/ops/sites/{siteId}/events",
64113
64291
  method: "GET",
@@ -64125,6 +64303,7 @@ var ENDPOINT_DEFINITIONS = {
64125
64303
  method: "POST",
64126
64304
  auth: "user",
64127
64305
  responseKind: "json",
64306
+ demoMutation: DEMO_MUTATION_INTERNAL_ONLY,
64128
64307
  errors: [
64129
64308
  "validation:invalid_input",
64130
64309
  "auth:forbidden",
@@ -64137,6 +64316,7 @@ var ENDPOINT_DEFINITIONS = {
64137
64316
  method: "POST",
64138
64317
  auth: "user",
64139
64318
  responseKind: "json",
64319
+ demoMutation: DEMO_MUTATION_INTERNAL_ONLY,
64140
64320
  errors: [
64141
64321
  "validation:invalid_input",
64142
64322
  "auth:forbidden",
@@ -64155,6 +64335,7 @@ var ENDPOINT_DEFINITIONS = {
64155
64335
  method: "POST",
64156
64336
  auth: "user",
64157
64337
  responseKind: "json",
64338
+ demoMutation: DEMO_MUTATION_INTERNAL_ONLY,
64158
64339
  errors: [
64159
64340
  "validation:invalid_input",
64160
64341
  "auth:forbidden",
@@ -64188,6 +64369,7 @@ var ENDPOINT_DEFINITIONS = {
64188
64369
  method: "POST",
64189
64370
  auth: "user",
64190
64371
  responseKind: "json",
64372
+ demoMutation: DEMO_MUTATION_INTERNAL_ONLY,
64191
64373
  errors: [
64192
64374
  "validation:invalid_input",
64193
64375
  "auth:forbidden",
@@ -64216,7 +64398,8 @@ var ENDPOINT_DEFINITIONS = {
64216
64398
  method: "POST",
64217
64399
  tags: [TAG_TEMPLATES.site, TAG_TEMPLATES.siteEmailSettings],
64218
64400
  auth: "user",
64219
- responseKind: "json"
64401
+ responseKind: "json",
64402
+ demoMutation: DEMO_MUTATION_BLOCKED_HIDDEN
64220
64403
  },
64221
64404
  previewEmailTemplate: {
64222
64405
  path: "/sites/{siteId}/settings/emails/preview",
@@ -64267,14 +64450,16 @@ var ENDPOINT_DEFINITIONS = {
64267
64450
  method: "POST",
64268
64451
  tags: [TAG_TEMPLATES.site, TAG_TEMPLATES.siteNewsletter],
64269
64452
  auth: "user",
64270
- responseKind: "json"
64453
+ responseKind: "json",
64454
+ demoMutation: DEMO_MUTATION_BLOCKED_HIDDEN
64271
64455
  },
64272
64456
  createNewsletterSubscribersImportUploadUrl: {
64273
64457
  path: "/sites/{siteId}/newsletter/subscribers/import-url",
64274
64458
  method: "POST",
64275
64459
  tags: [TAG_TEMPLATES.site, TAG_TEMPLATES.siteNewsletter],
64276
64460
  auth: "user",
64277
- responseKind: "json"
64461
+ responseKind: "json",
64462
+ demoMutation: DEMO_MUTATION_BLOCKED_HIDDEN
64278
64463
  },
64279
64464
  exportNewsletterSubscribersCsv: {
64280
64465
  path: "/sites/{siteId}/newsletter/subscribers/export.csv",
@@ -64471,14 +64656,16 @@ var ENDPOINT_DEFINITIONS = {
64471
64656
  method: "POST",
64472
64657
  tags: [TAG_TEMPLATES.site, TAG_TEMPLATES.siteNewsletter],
64473
64658
  auth: "user",
64474
- responseKind: "json"
64659
+ responseKind: "json",
64660
+ demoMutation: DEMO_MUTATION_BLOCKED_HIDDEN
64475
64661
  },
64476
64662
  testSendNewsletterCampaign: {
64477
64663
  path: "/sites/{siteId}/newsletter/campaigns/{campaignId}/test-send",
64478
64664
  method: "POST",
64479
64665
  tags: [TAG_TEMPLATES.site, TAG_TEMPLATES.siteNewsletter],
64480
64666
  auth: "user",
64481
- responseKind: "json"
64667
+ responseKind: "json",
64668
+ demoMutation: DEMO_MUTATION_BLOCKED_HIDDEN
64482
64669
  },
64483
64670
  listNewsletterSendJobs: {
64484
64671
  path: "/sites/{siteId}/newsletter/jobs",
@@ -65166,7 +65353,8 @@ var ENDPOINT_DEFINITIONS = {
65166
65353
  method: "DELETE",
65167
65354
  tags: ["site", "site-{siteId}"],
65168
65355
  auth: "user",
65169
- responseKind: "json"
65356
+ responseKind: "json",
65357
+ demoMutation: DEMO_MUTATION_BLOCKED_HIDDEN
65170
65358
  },
65171
65359
  listSiteMembers: {
65172
65360
  path: "/sites/{siteId}/members",
@@ -65622,7 +65810,8 @@ var ENDPOINT_DEFINITIONS = {
65622
65810
  method: "POST",
65623
65811
  tags: ["site-{siteId}", "content-{siteId}-{type}"],
65624
65812
  auth: "user",
65625
- responseKind: "json"
65813
+ responseKind: "json",
65814
+ demoMutation: DEMO_MUTATION_BLOCKED_HIDDEN
65626
65815
  },
65627
65816
  updateSiteGeneralSettings: {
65628
65817
  path: "/sites/{siteId}/settings/general",
@@ -67861,6 +68050,7 @@ var ENDPOINT_DEFINITIONS = {
67861
68050
  method: "POST",
67862
68051
  tags: ["site-{siteId}"],
67863
68052
  auth: "user",
68053
+ demoMutation: DEMO_MUTATION_BLOCKED_HIDDEN,
67864
68054
  errors: [
67865
68055
  "validation:invalid_input",
67866
68056
  "auth:forbidden",
@@ -67875,6 +68065,7 @@ var ENDPOINT_DEFINITIONS = {
67875
68065
  method: "POST",
67876
68066
  tags: ["site-{siteId}"],
67877
68067
  auth: "user",
68068
+ demoMutation: DEMO_MUTATION_BLOCKED_HIDDEN,
67878
68069
  errors: [
67879
68070
  "validation:invalid_input",
67880
68071
  "auth:forbidden",
@@ -68184,6 +68375,7 @@ var ENDPOINT_DEFINITIONS = {
68184
68375
  tags: ["site-{siteId}", "passes-{siteId}"],
68185
68376
  auth: "user",
68186
68377
  responseKind: "json",
68378
+ demoMutation: DEMO_MUTATION_BLOCKED_DISABLED,
68187
68379
  errors: ["validation:invalid_input", "server:internal_error"]
68188
68380
  },
68189
68381
  getBookingPass: {
@@ -68199,6 +68391,7 @@ var ENDPOINT_DEFINITIONS = {
68199
68391
  tags: ["site-{siteId}", "passes-{siteId}"],
68200
68392
  auth: "user",
68201
68393
  responseKind: "json",
68394
+ demoMutation: DEMO_MUTATION_BLOCKED_DISABLED,
68202
68395
  errors: [
68203
68396
  "validation:invalid_input",
68204
68397
  "resource:not_found",
@@ -68211,6 +68404,7 @@ var ENDPOINT_DEFINITIONS = {
68211
68404
  tags: ["site-{siteId}", "passes-{siteId}"],
68212
68405
  auth: "user",
68213
68406
  responseKind: "json",
68407
+ demoMutation: DEMO_MUTATION_BLOCKED_DISABLED,
68214
68408
  errors: [
68215
68409
  "validation:invalid_input",
68216
68410
  "resource:not_found",
@@ -68266,6 +68460,7 @@ var ENDPOINT_DEFINITIONS = {
68266
68460
  tags: ["site-{siteId}", "memberships-{siteId}"],
68267
68461
  auth: "user",
68268
68462
  responseKind: "json",
68463
+ demoMutation: DEMO_MUTATION_BLOCKED_DISABLED,
68269
68464
  errors: ["validation:invalid_input", "server:internal_error"]
68270
68465
  },
68271
68466
  getBookingMembership: {
@@ -68281,6 +68476,7 @@ var ENDPOINT_DEFINITIONS = {
68281
68476
  tags: ["site-{siteId}", "memberships-{siteId}"],
68282
68477
  auth: "user",
68283
68478
  responseKind: "json",
68479
+ demoMutation: DEMO_MUTATION_BLOCKED_DISABLED,
68284
68480
  errors: [
68285
68481
  "validation:invalid_input",
68286
68482
  "resource:not_found",
@@ -68293,6 +68489,7 @@ var ENDPOINT_DEFINITIONS = {
68293
68489
  tags: ["site-{siteId}", "memberships-{siteId}"],
68294
68490
  auth: "user",
68295
68491
  responseKind: "json",
68492
+ demoMutation: DEMO_MUTATION_BLOCKED_DISABLED,
68296
68493
  errors: [
68297
68494
  "validation:invalid_input",
68298
68495
  "resource:not_found",
@@ -68509,6 +68706,7 @@ var ENDPOINT_DEFINITIONS = {
68509
68706
  tags: ["site-{siteId}", "customers-{siteId}"],
68510
68707
  auth: "user",
68511
68708
  responseKind: "json",
68709
+ demoMutation: DEMO_MUTATION_BLOCKED_DISABLED,
68512
68710
  errors: [
68513
68711
  "validation:invalid_input",
68514
68712
  "auth:forbidden",
@@ -69906,8 +70104,7 @@ var dashboardNavVisibilityBaseSchema = z5.object({
69906
70104
  var dashboardNavVisibilityRolesSchema = z5.object({
69907
70105
  administrator: dashboardNavVisibilityBaseSchema.optional(),
69908
70106
  editor: dashboardNavVisibilityBaseSchema.optional(),
69909
- team_member: dashboardNavVisibilityBaseSchema.optional(),
69910
- event_host: dashboardNavVisibilityBaseSchema.optional()
70107
+ team_member: dashboardNavVisibilityBaseSchema.optional()
69911
70108
  }).strip().optional();
69912
70109
  var dashboardNavVisibilitySchema = dashboardNavVisibilityBaseSchema.extend({
69913
70110
  roles: dashboardNavVisibilityRolesSchema
@@ -70852,6 +71049,21 @@ var appointmentSetupServiceDraftSchema = z7.object({
70852
71049
  timezone: z7.string().trim().min(1).nullable(),
70853
71050
  payment: appointmentSetupPaymentDraftSchema,
70854
71051
  assignment: appointmentSetupServiceAssignmentDraftSchema
71052
+ }).superRefine((service, ctx) => {
71053
+ if (service.payment.priceType === "paid" && (service.priceAmount === null || service.priceAmount <= 0)) {
71054
+ ctx.addIssue({
71055
+ code: "custom",
71056
+ path: ["priceAmount"],
71057
+ message: "Paid appointment services need a positive price."
71058
+ });
71059
+ }
71060
+ if (service.payment.priceType === "free" && service.priceAmount !== null && service.priceAmount > 0) {
71061
+ ctx.addIssue({
71062
+ code: "custom",
71063
+ path: ["priceAmount"],
71064
+ message: "Free appointment services cannot carry a positive price."
71065
+ });
71066
+ }
70855
71067
  });
70856
71068
  var appointmentSetupPractitionerDraftSchema = z7.object({
70857
71069
  ref: appointmentSetupRefSchema,
@@ -72716,6 +72928,16 @@ var jsonArrayTransform = {
72716
72928
  return "";
72717
72929
  }
72718
72930
  };
72931
+ var csvTransform = {
72932
+ id: "value.csv",
72933
+ kind: "formatter",
72934
+ summary: "Normalize a string or array of strings into a comma-separated list",
72935
+ run: (value) => {
72936
+ const rawValues = Array.isArray(value) ? value : typeof value === "string" ? value.split(",") : [];
72937
+ const normalized = rawValues.filter((item) => typeof item === "string").map((item) => item.trim()).filter(Boolean);
72938
+ return normalized.length > 0 ? Array.from(new Set(normalized)).join(",") : "";
72939
+ }
72940
+ };
72719
72941
  var marqueeLoopOptionsSchema = z39.object({
72720
72942
  minItems: z39.number().int().min(1).default(10)
72721
72943
  });
@@ -72741,6 +72963,7 @@ var formattingTransforms = [
72741
72963
  dateFormatShort,
72742
72964
  arrayLengthTransform,
72743
72965
  jsonArrayTransform,
72966
+ csvTransform,
72744
72967
  marqueeLoopTransform
72745
72968
  ];
72746
72969
 
@@ -80482,11 +80705,11 @@ init_neutralScale();
80482
80705
 
80483
80706
  // ../theme-core/src/palette/utils/index.ts
80484
80707
  init_colorConversion();
80485
- init_contrast2();
80708
+ init_contrast();
80486
80709
 
80487
80710
  // ../theme-core/src/palette/utils/colorPlacement.ts
80488
80711
  init_colorConversion();
80489
- init_contrast2();
80712
+ init_contrast();
80490
80713
 
80491
80714
  // ../theme-core/src/palette/utils/backgroundGeneration.ts
80492
80715
  init_colorConversion();
@@ -80508,14 +80731,14 @@ init_colorConversion();
80508
80731
 
80509
80732
  // ../theme-core/src/palette/utils/suggestRecipes.ts
80510
80733
  init_colorConversion();
80511
- init_contrast2();
80734
+ init_contrast();
80512
80735
 
80513
80736
  // ../theme-core/src/palette/utils/generatePalette.ts
80514
80737
  init_colorConversion();
80515
- init_contrast2();
80738
+ init_contrast();
80516
80739
 
80517
80740
  // ../theme-core/src/palette/utils/legs.ts
80518
- init_contrast2();
80741
+ init_contrast();
80519
80742
  init_colorConversion();
80520
80743
 
80521
80744
  // ../theme-core/src/palette/utils/supportRoles.ts
@@ -80528,7 +80751,10 @@ init_colorConversion();
80528
80751
  init_textColor();
80529
80752
 
80530
80753
  // ../theme-core/src/palette/utils/legibility.ts
80531
- init_contrast2();
80754
+ init_contrast();
80755
+
80756
+ // ../theme-core/src/palette/utils/index.ts
80757
+ init_onColor();
80532
80758
 
80533
80759
  // ../theme-core/src/mock-themes/components/PaletteCard.tsx
80534
80760
  init_expandPalette();
@@ -83404,7 +83630,7 @@ var SimpleCache = class {
83404
83630
  };
83405
83631
 
83406
83632
  // src/version.ts
83407
- var SDK_VERSION = "0.64.0";
83633
+ var SDK_VERSION = "0.67.0";
83408
83634
 
83409
83635
  // src/client/error.ts
83410
83636
  var RiverbankApiError = class _RiverbankApiError extends Error {