@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
@@ -14668,6 +14668,44 @@ var init_core2 = __esm({
14668
14668
  }
14669
14669
  });
14670
14670
 
14671
+ // ../theme-core/src/palette/utils/onColor.ts
14672
+ function onColorTokenName(backgroundToken) {
14673
+ return `on${backgroundToken.split("-").filter((part) => part.length > 0).map((part) => part.charAt(0).toUpperCase() + part.slice(1)).join("")}`;
14674
+ }
14675
+ function isOnColorBackgroundCandidateToken(token) {
14676
+ const role = token.match(/^(.*?)(?:-\d{2,3})?$/)?.[1] ?? token;
14677
+ return BACKGROUND_ROLE_NAMES.has(role);
14678
+ }
14679
+ var BACKGROUND_ROLE_NAMES;
14680
+ var init_onColor = __esm({
14681
+ "../theme-core/src/palette/utils/onColor.ts"() {
14682
+ "use strict";
14683
+ BACKGROUND_ROLE_NAMES = /* @__PURE__ */ new Set([
14684
+ "primary",
14685
+ "secondary",
14686
+ "accent",
14687
+ "success",
14688
+ "warning",
14689
+ "destructive",
14690
+ "info",
14691
+ "background",
14692
+ "surface",
14693
+ "surfaceAlt",
14694
+ "muted",
14695
+ "neutral"
14696
+ ]);
14697
+ }
14698
+ });
14699
+
14700
+ // ../theme-core/src/site-styles/accessibleSurfaces.ts
14701
+ var init_accessibleSurfaces = __esm({
14702
+ "../theme-core/src/site-styles/accessibleSurfaces.ts"() {
14703
+ "use strict";
14704
+ init_contrast2();
14705
+ init_onColor();
14706
+ }
14707
+ });
14708
+
14671
14709
  // ../theme-core/src/site-styles/appearancePresetResolution.ts
14672
14710
  function assertValidOptionGroups(preset2) {
14673
14711
  preset2.optionGroups?.forEach((group) => {
@@ -17623,7 +17661,8 @@ function defineCuratedSiteStyle(input) {
17623
17661
  name: input.name,
17624
17662
  description: input.description,
17625
17663
  generationBrief: input.generationBrief,
17626
- selectionKeywords: input.selectionKeywords ?? [],
17664
+ selectionKeywordRules: input.selectionKeywordRules ?? [],
17665
+ siteCreatorSelection: input.siteCreatorSelection ?? { kind: "explicit_only" },
17627
17666
  template: {
17628
17667
  id: asDesignSystemTemplateId(`template:${input.id.replace("site-style:", "")}`),
17629
17668
  name: input.name,
@@ -17668,6 +17707,9 @@ var init_curatedSiteStyles = __esm({
17668
17707
  "site-style:bright-community",
17669
17708
  "site-style:quiet-luxury",
17670
17709
  "site-style:practical-services",
17710
+ "site-style:quiet-practice",
17711
+ "site-style:personal-retreat-journal",
17712
+ "site-style:tactile-workshop",
17671
17713
  "site-style:modern-wellness",
17672
17714
  "site-style:bold-launch",
17673
17715
  "site-style:south-west-twerk-school"
@@ -17851,12 +17893,13 @@ var init_curatedSiteStyles = __esm({
17851
17893
  name: "Quiet Luxury",
17852
17894
  description: "Minimal, confident, and refined for premium experiences and private services.",
17853
17895
  generationBrief: "Use fewer claims, more specificity, and restrained sensory detail. Favor elegant media and low repetition over dense panels.",
17854
- selectionKeywords: [
17855
- "luxury",
17856
- "premium",
17857
- "boutique",
17858
- "bespoke",
17859
- "exclusive"
17896
+ siteCreatorSelection: { kind: "site_creator_keyword_heuristic", priority: 20 },
17897
+ selectionKeywordRules: [
17898
+ { kind: "word", value: "luxury" },
17899
+ { kind: "word", value: "premium" },
17900
+ { kind: "word", value: "boutique" },
17901
+ { kind: "word", value: "bespoke" },
17902
+ { kind: "word", value: "exclusive" }
17860
17903
  ],
17861
17904
  tokenRecipes: {
17862
17905
  palette: "high-contrast",
@@ -17885,13 +17928,14 @@ var init_curatedSiteStyles = __esm({
17885
17928
  name: "Practical Services",
17886
17929
  description: "Efficient, plainspoken, and conversion-focused for trades and everyday services.",
17887
17930
  generationBrief: "Make services, location, trust signals, and contact paths obvious. Keep copy brief and avoid ornate visual treatments.",
17888
- selectionKeywords: [
17889
- "repair",
17890
- "plumb",
17891
- "electric",
17892
- "cleaning",
17893
- "landscap",
17894
- "contractor"
17931
+ siteCreatorSelection: { kind: "primary_goal_support" },
17932
+ selectionKeywordRules: [
17933
+ { kind: "word", value: "repair" },
17934
+ { kind: "substring", value: "plumb" },
17935
+ { kind: "substring", value: "electric" },
17936
+ { kind: "word", value: "cleaning" },
17937
+ { kind: "substring", value: "landscap" },
17938
+ { kind: "substring", value: "contractor" }
17895
17939
  ],
17896
17940
  tokenRecipes: {
17897
17941
  palette: "brand-led",
@@ -17942,18 +17986,134 @@ var init_curatedSiteStyles = __esm({
17942
17986
  paletteChoice("warm-neutral-forest")
17943
17987
  ]
17944
17988
  }),
17989
+ defineCuratedSiteStyle({
17990
+ id: "site-style:quiet-practice",
17991
+ name: "Quiet Practice",
17992
+ description: "Grounded, calm, and practical for small appointment-first practices.",
17993
+ 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.",
17994
+ siteCreatorSelection: { kind: "site_creator_keyword_heuristic", priority: 30 },
17995
+ selectionKeywordRules: [
17996
+ { kind: "substring", value: "massage" },
17997
+ { kind: "word", value: "bodywork" },
17998
+ { kind: "phrase", value: "appointment practice" },
17999
+ { kind: "phrase", value: "appointment-first" },
18000
+ { kind: "substring", value: "practitioner" },
18001
+ { kind: "substring", value: "therap" },
18002
+ { kind: "substring", value: "clinic" },
18003
+ { kind: "phrase", value: "wellness practice" }
18004
+ ],
18005
+ tokenRecipes: {
18006
+ palette: "soft-natural",
18007
+ contrast: "standard",
18008
+ radius: "soft",
18009
+ shadow: "subtle",
18010
+ typography: "clean-sans",
18011
+ spacing: "regular",
18012
+ motion: "subtle"
18013
+ },
18014
+ compositionBudget: quietBudget,
18015
+ recommendedHeaderLookIds: ["practical-utility", "clean-base", "centered-calm"],
18016
+ buttonPersonalityChoices: [
18017
+ buttonChoice("pebble"),
18018
+ buttonChoice("soft-pill"),
18019
+ buttonChoice("editorial-link")
18020
+ ],
18021
+ paletteVariantChoices: [
18022
+ paletteChoice("soft-natural-stone"),
18023
+ paletteChoice("soft-natural-sage"),
18024
+ paletteChoice("warm-neutral-clay")
18025
+ ]
18026
+ }),
18027
+ defineCuratedSiteStyle({
18028
+ id: "site-style:personal-retreat-journal",
18029
+ name: "Personal Retreat Journal",
18030
+ description: "Warm, story-led, and readable for solo practitioners with mixed offers.",
18031
+ 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.",
18032
+ siteCreatorSelection: { kind: "site_creator_keyword_heuristic", priority: 40 },
18033
+ selectionKeywordRules: [
18034
+ { kind: "substring", value: "retreat" },
18035
+ { kind: "phrase", value: "solo practitioner" },
18036
+ { kind: "phrase", value: "personal brand" },
18037
+ { kind: "substring", value: "teacher" },
18038
+ { kind: "substring", value: "coach" },
18039
+ { kind: "phrase", value: "retreat resources" },
18040
+ { kind: "substring", value: "journal" }
18041
+ ],
18042
+ tokenRecipes: {
18043
+ palette: "warm-neutral",
18044
+ contrast: "standard",
18045
+ radius: "soft",
18046
+ shadow: "subtle",
18047
+ typography: "serif-editorial",
18048
+ spacing: "airy",
18049
+ motion: "subtle"
18050
+ },
18051
+ compositionBudget: balancedBudget,
18052
+ recommendedHeaderLookIds: ["editorial-line", "centered-calm", "minimal-transparent"],
18053
+ buttonPersonalityChoices: [
18054
+ buttonChoice("editorial-link"),
18055
+ buttonChoice("soft-pill"),
18056
+ buttonChoice("brushed-wash")
18057
+ ],
18058
+ paletteVariantChoices: [
18059
+ paletteChoice("warm-neutral-forest"),
18060
+ paletteChoice("warm-neutral-clay"),
18061
+ paletteChoice("soft-natural-stone")
18062
+ ]
18063
+ }),
18064
+ defineCuratedSiteStyle({
18065
+ id: "site-style:tactile-workshop",
18066
+ name: "Tactile Workshop",
18067
+ description: "Bright, hands-on, and image-led for maker studios, workshops, and creative classes.",
18068
+ 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.",
18069
+ siteCreatorSelection: { kind: "site_creator_keyword_heuristic", priority: 50 },
18070
+ selectionKeywordRules: [
18071
+ { kind: "substring", value: "ceramic" },
18072
+ { kind: "word", value: "pottery" },
18073
+ { kind: "phrase", value: "maker studio" },
18074
+ { kind: "phrase", value: "craft class" },
18075
+ { kind: "phrase", value: "craft workshop" },
18076
+ { kind: "word", value: "clay" },
18077
+ { kind: "word", value: "kiln" }
18078
+ ],
18079
+ tokenRecipes: {
18080
+ palette: "brand-led",
18081
+ contrast: "standard",
18082
+ radius: "soft",
18083
+ shadow: "subtle",
18084
+ typography: "friendly-sans",
18085
+ spacing: "regular",
18086
+ motion: "subtle"
18087
+ },
18088
+ compositionBudget: balancedBudget,
18089
+ recommendedHeaderLookIds: ["brand-solid", "practical-utility", "clean-base"],
18090
+ recommendedFooterLookIds: ["site-footer-brand-two-band", "footer-muted-grounding"],
18091
+ buttonPersonalityChoices: [
18092
+ buttonChoice("pebble"),
18093
+ buttonChoice("confident-chip"),
18094
+ buttonChoice("ink-stamp"),
18095
+ buttonChoice("editorial-link")
18096
+ ],
18097
+ paletteVariantChoices: [
18098
+ paletteChoice("brand-led-warm"),
18099
+ paletteChoice("brand-led-cool"),
18100
+ paletteChoice("soft-natural-watercolor"),
18101
+ paletteChoice("warm-neutral-clay")
18102
+ ]
18103
+ }),
17945
18104
  defineCuratedSiteStyle({
17946
18105
  id: "site-style:bold-launch",
17947
18106
  name: "Bold Launch",
17948
18107
  description: "High-energy and punchy for launches, campaigns, and creative offers.",
17949
18108
  generationBrief: "Use crisp positioning, bold hero structure, strong calls to action, and confident visual rhythm. Keep it precise, not shouty.",
17950
- selectionKeywords: [
17951
- "launch",
17952
- "campaign",
17953
- "preorder",
17954
- "pre-order",
17955
- "waitlist",
17956
- "drop"
18109
+ siteCreatorSelection: { kind: "site_creator_keyword_heuristic", priority: 10 },
18110
+ selectionKeywordRules: [
18111
+ { kind: "substring", value: "launch" },
18112
+ { kind: "substring", value: "campaign" },
18113
+ { kind: "word", value: "preorder" },
18114
+ { kind: "phrase", value: "pre-order" },
18115
+ { kind: "substring", value: "waitlist" },
18116
+ { kind: "word", value: "drop" }
17957
18117
  ],
17958
18118
  tokenRecipes: {
17959
18119
  palette: "high-contrast",
@@ -17984,15 +18144,6 @@ var init_curatedSiteStyles = __esm({
17984
18144
  name: "South West Twerk School",
17985
18145
  description: "Energetic, editorial, and high-contrast for a branded dance school presence.",
17986
18146
  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.",
17987
- selectionKeywords: [
17988
- "dance",
17989
- "classes",
17990
- "workshop",
17991
- "school",
17992
- "movement",
17993
- "performance",
17994
- "community"
17995
- ],
17996
18147
  tokenRecipes: {
17997
18148
  palette: "brand-led",
17998
18149
  contrast: "maximum",
@@ -18281,6 +18432,131 @@ var init_modern_minimal = __esm({
18281
18432
  }
18282
18433
  });
18283
18434
 
18435
+ // ../theme-core/src/palette/generateShades.ts
18436
+ function generateShades(hexColor, name) {
18437
+ const shadeSteps = [50, 100, 200, 300, 400, 500, 600, 700, 800, 900, 950];
18438
+ const base = featuresFromHex(hexColor);
18439
+ const hue = base.okH;
18440
+ const baseChroma = base.okC;
18441
+ const toneMap = {
18442
+ 50: 0.975,
18443
+ 100: 0.945,
18444
+ 200: 0.89,
18445
+ 300: 0.82,
18446
+ 400: 0.74,
18447
+ 500: 0.66,
18448
+ 600: 0.58,
18449
+ 700: 0.49,
18450
+ 800: 0.4,
18451
+ 900: 0.28,
18452
+ 950: 0.16
18453
+ };
18454
+ const shadeDefs = shadeSteps.map((step, idx) => {
18455
+ const t = idx / (shadeSteps.length - 1);
18456
+ const L2 = toneMap[step];
18457
+ const chromaFactor = 0.06 + 0.94 * Math.sin(Math.PI * t);
18458
+ const C = baseChroma * chromaFactor;
18459
+ return {
18460
+ name: `${name}-${step}`,
18461
+ hex: oklchToHexGamut(L2, C, hue)
18462
+ };
18463
+ });
18464
+ shadeDefs.push({ name, hex: hexColor });
18465
+ return shadeDefs;
18466
+ }
18467
+ var init_generateShades = __esm({
18468
+ "../theme-core/src/palette/generateShades.ts"() {
18469
+ "use strict";
18470
+ init_colorConversion();
18471
+ }
18472
+ });
18473
+
18474
+ // ../theme-core/src/palette/neutralScale.ts
18475
+ function generateNeutralScale({
18476
+ background,
18477
+ steps = 11,
18478
+ warm = false
18479
+ }) {
18480
+ const isDark = background === "#000000" || background.startsWith("#0") || background.startsWith("#1");
18481
+ const shadeNames = [50, 100, 200, 300, 400, 500, 600, 700, 800, 900, 950];
18482
+ const count = Math.min(steps, shadeNames.length);
18483
+ const scale = [];
18484
+ for (let i = 0; i < count; i++) {
18485
+ const t = i / (count - 1);
18486
+ const tone = isDark ? mix(0.06, 0.92, t) : mix(0.98, 0.1, t);
18487
+ const hex = oklchToHexGamut(tone, 0.02, warm ? 85 : 250);
18488
+ const name = `neutral-${shadeNames[i]}`;
18489
+ scale.push({ name, hex });
18490
+ }
18491
+ return scale;
18492
+ }
18493
+ function mix(a, b2, t) {
18494
+ return a + (b2 - a) * Math.max(0, Math.min(1, t));
18495
+ }
18496
+ var init_neutralScale = __esm({
18497
+ "../theme-core/src/palette/neutralScale.ts"() {
18498
+ "use strict";
18499
+ init_colorConversion();
18500
+ }
18501
+ });
18502
+
18503
+ // ../theme-core/src/palette/expandPalette.ts
18504
+ function colorsToMap(palette) {
18505
+ const map = {};
18506
+ for (const c2 of palette.colors) {
18507
+ map[c2.name] = c2.hex;
18508
+ }
18509
+ return map;
18510
+ }
18511
+ function isBackgroundDark(hex) {
18512
+ try {
18513
+ return featuresFromHex(hex).Y < 0.5;
18514
+ } catch {
18515
+ return false;
18516
+ }
18517
+ }
18518
+ function expandPalette(palette) {
18519
+ const base = colorsToMap(palette);
18520
+ const expanded = { ...base };
18521
+ const background = base.background || base.surface || "#ffffff";
18522
+ const neutral2 = generateNeutralScale({ background, steps: 11, warm: false });
18523
+ neutral2.forEach((n) => {
18524
+ expanded[n.name] = n.hex;
18525
+ });
18526
+ for (const [name, hex] of Object.entries(base)) {
18527
+ if (hex) {
18528
+ const shades = generateShades(hex, name);
18529
+ shades.forEach((shade) => {
18530
+ expanded[shade.name] = shade.hex;
18531
+ });
18532
+ }
18533
+ }
18534
+ if (base.text) expanded.body = base.text;
18535
+ if (base.danger && !base.destructive) {
18536
+ expanded.destructive = base.danger;
18537
+ }
18538
+ const isDark = base.background ? isBackgroundDark(base.background) : false;
18539
+ const isDarkMode = palette.meta?.mode === "dark" || isDark;
18540
+ expanded.mutedText = isDarkMode ? expanded["neutral-600"] ?? "#666" : expanded["neutral-500"] ?? "#888";
18541
+ for (const [token, hex] of Object.entries({ ...expanded })) {
18542
+ if (!hex || !isOnColorBackgroundCandidateToken(token)) continue;
18543
+ const onToken = onColorTokenName(token);
18544
+ if (expanded[onToken]) continue;
18545
+ expanded[onToken] = getTextColorForBackground(hex);
18546
+ }
18547
+ return expanded;
18548
+ }
18549
+ var init_expandPalette = __esm({
18550
+ "../theme-core/src/palette/expandPalette.ts"() {
18551
+ "use strict";
18552
+ init_generateShades();
18553
+ init_neutralScale();
18554
+ init_colorConversion();
18555
+ init_textColor();
18556
+ init_onColor();
18557
+ }
18558
+ });
18559
+
18284
18560
  // ../theme-core/src/site-styles/rawStyleFields.ts
18285
18561
  var themeV2RuntimeStyleFieldNames, themeV2BlockSpecificRawStyleFieldNames, themeV2NormalEditorRawStyleFieldNames, themeV2NormalEditorRawStyleFieldNameSet;
18286
18562
  var init_rawStyleFields = __esm({
@@ -18464,35 +18740,31 @@ var init_runtimeCompiler = __esm({
18464
18740
  "use strict";
18465
18741
  init_schema2();
18466
18742
  init_modern_minimal();
18743
+ init_expandPalette();
18467
18744
  init_personalities();
18468
18745
  init_variants();
18469
18746
  init_designState();
18470
18747
  init_types9();
18748
+ init_accessibleSurfaces();
18471
18749
  defaultDesignRuntimeRules = defineDesignRuntimeRules({
18472
18750
  sectionSurfaces: {
18473
18751
  base: {},
18474
18752
  "muted-band": {
18475
18753
  background: {
18476
18754
  type: "color",
18477
- color: "muted",
18478
- textColor: "text",
18479
- headingColor: "text"
18755
+ color: "muted"
18480
18756
  }
18481
18757
  },
18482
18758
  "accent-band": {
18483
18759
  background: {
18484
18760
  type: "color",
18485
- color: "primary",
18486
- textColor: "primaryForeground",
18487
- headingColor: "primaryForeground"
18761
+ color: "primary"
18488
18762
  }
18489
18763
  },
18490
18764
  "brand-depth-band": {
18491
18765
  background: {
18492
18766
  type: "color",
18493
- color: "primary-800",
18494
- textColor: "primaryForeground",
18495
- headingColor: "primaryForeground"
18767
+ color: "primary-800"
18496
18768
  }
18497
18769
  },
18498
18770
  "hero-image": {
@@ -18958,6 +19230,7 @@ var init_tokenRecipes = __esm({
18958
19230
  var init_site_styles = __esm({
18959
19231
  "../theme-core/src/site-styles/index.ts"() {
18960
19232
  "use strict";
19233
+ init_accessibleSurfaces();
18961
19234
  init_appearancePresets();
18962
19235
  init_blockFlow();
18963
19236
  init_compositionBudget();
@@ -20429,6 +20702,7 @@ var init_validation_constants = __esm({
20429
20702
  "date.formatShort",
20430
20703
  "array.length",
20431
20704
  "value.jsonArray",
20705
+ "value.csv",
20432
20706
  "array.marqueeLoop",
20433
20707
  // Layout (layout.ts)
20434
20708
  "layout.maxWidthClass",
@@ -27420,7 +27694,12 @@ var init_event_calendar = __esm({
27420
27694
  // Pass filter params if configured
27421
27695
  kind: { $bind: { from: "content.kind" } },
27422
27696
  eventSurface: { $bind: { from: "content.eventSurface" } },
27423
- eventPresets: { $bind: { from: "content.filterEventPresets" } },
27697
+ eventPresets: {
27698
+ $bind: {
27699
+ from: "content.filterEventPresets",
27700
+ transforms: [{ id: "value.csv" }]
27701
+ }
27702
+ },
27424
27703
  scheduleScope: { $bind: { from: "content.scheduleScope" } },
27425
27704
  categoryIds: { $bind: { from: "content.filterCategoryIds" } },
27426
27705
  staffMemberId: { $bind: { from: "content.filterStaffMemberId" } },
@@ -27895,7 +28174,12 @@ var init_event_listing = __esm({
27895
28174
  detailLevel: "listing",
27896
28175
  kind: { $bind: { from: "content.kind" } },
27897
28176
  eventSurface: { $bind: { from: "content.eventSurface" } },
27898
- eventPresets: { $bind: { from: "content.filterEventPresets" } },
28177
+ eventPresets: {
28178
+ $bind: {
28179
+ from: "content.filterEventPresets",
28180
+ transforms: [{ id: "value.csv" }]
28181
+ }
28182
+ },
27899
28183
  scheduleScope: { $bind: { from: "content.scheduleScope" } }
27900
28184
  },
27901
28185
  mode: "server"
@@ -49696,140 +49980,6 @@ var init_newsletter_form_client = __esm({
49696
49980
  }
49697
49981
  });
49698
49982
 
49699
- // ../theme-core/src/palette/generateShades.ts
49700
- function generateShades(hexColor, name) {
49701
- const shadeSteps = [50, 100, 200, 300, 400, 500, 600, 700, 800, 900, 950];
49702
- const base = featuresFromHex(hexColor);
49703
- const hue = base.okH;
49704
- const baseChroma = base.okC;
49705
- const toneMap = {
49706
- 50: 0.975,
49707
- 100: 0.945,
49708
- 200: 0.89,
49709
- 300: 0.82,
49710
- 400: 0.74,
49711
- 500: 0.66,
49712
- 600: 0.58,
49713
- 700: 0.49,
49714
- 800: 0.4,
49715
- 900: 0.28,
49716
- 950: 0.16
49717
- };
49718
- const shadeDefs = shadeSteps.map((step, idx) => {
49719
- const t = idx / (shadeSteps.length - 1);
49720
- const L2 = toneMap[step];
49721
- const chromaFactor = 0.06 + 0.94 * Math.sin(Math.PI * t);
49722
- const C = baseChroma * chromaFactor;
49723
- return {
49724
- name: `${name}-${step}`,
49725
- hex: oklchToHexGamut(L2, C, hue)
49726
- };
49727
- });
49728
- shadeDefs.push({ name, hex: hexColor });
49729
- return shadeDefs;
49730
- }
49731
- var init_generateShades = __esm({
49732
- "../theme-core/src/palette/generateShades.ts"() {
49733
- "use strict";
49734
- init_colorConversion();
49735
- }
49736
- });
49737
-
49738
- // ../theme-core/src/palette/neutralScale.ts
49739
- function generateNeutralScale({
49740
- background,
49741
- steps = 11,
49742
- warm = false
49743
- }) {
49744
- const isDark = background === "#000000" || background.startsWith("#0") || background.startsWith("#1");
49745
- const shadeNames = [50, 100, 200, 300, 400, 500, 600, 700, 800, 900, 950];
49746
- const count = Math.min(steps, shadeNames.length);
49747
- const scale = [];
49748
- for (let i = 0; i < count; i++) {
49749
- const t = i / (count - 1);
49750
- const tone = isDark ? mix(0.06, 0.92, t) : mix(0.98, 0.1, t);
49751
- const hex = oklchToHexGamut(tone, 0.02, warm ? 85 : 250);
49752
- const name = `neutral-${shadeNames[i]}`;
49753
- scale.push({ name, hex });
49754
- }
49755
- return scale;
49756
- }
49757
- function mix(a, b2, t) {
49758
- return a + (b2 - a) * Math.max(0, Math.min(1, t));
49759
- }
49760
- var init_neutralScale = __esm({
49761
- "../theme-core/src/palette/neutralScale.ts"() {
49762
- "use strict";
49763
- init_colorConversion();
49764
- }
49765
- });
49766
-
49767
- // ../theme-core/src/palette/expandPalette.ts
49768
- function colorsToMap(palette) {
49769
- const map = {};
49770
- for (const c2 of palette.colors) {
49771
- map[c2.name] = c2.hex;
49772
- }
49773
- return map;
49774
- }
49775
- function isBackgroundDark(hex) {
49776
- try {
49777
- return featuresFromHex(hex).Y < 0.5;
49778
- } catch {
49779
- return false;
49780
- }
49781
- }
49782
- function expandPalette(palette) {
49783
- const base = colorsToMap(palette);
49784
- const expanded = { ...base };
49785
- const background = base.background || base.surface || "#ffffff";
49786
- const neutral2 = generateNeutralScale({ background, steps: 11, warm: false });
49787
- neutral2.forEach((n) => {
49788
- expanded[n.name] = n.hex;
49789
- });
49790
- for (const [name, hex] of Object.entries(base)) {
49791
- if (hex) {
49792
- const shades = generateShades(hex, name);
49793
- shades.forEach((shade) => {
49794
- expanded[shade.name] = shade.hex;
49795
- });
49796
- }
49797
- }
49798
- if (base.text) expanded.body = base.text;
49799
- if (base.danger && !base.destructive) {
49800
- expanded.destructive = base.danger;
49801
- }
49802
- const isDark = base.background ? isBackgroundDark(base.background) : false;
49803
- const isDarkMode = palette.meta?.mode === "dark" || isDark;
49804
- expanded.mutedText = isDarkMode ? expanded["neutral-600"] ?? "#666" : expanded["neutral-500"] ?? "#888";
49805
- const onRoles = [
49806
- { role: "primary", on: "onPrimary" },
49807
- { role: "secondary", on: "onSecondary" },
49808
- { role: "accent", on: "onAccent" },
49809
- { role: "success", on: "onSuccess" },
49810
- { role: "warning", on: "onWarning" },
49811
- { role: "destructive", on: "onDestructive" },
49812
- { role: "info", on: "onInfo" },
49813
- { role: "surface", on: "onSurface" }
49814
- ];
49815
- for (const { role, on: on2 } of onRoles) {
49816
- const bg = base[role];
49817
- if (!bg) continue;
49818
- if (expanded[on2]) continue;
49819
- expanded[on2] = getTextColorForBackground(bg);
49820
- }
49821
- return expanded;
49822
- }
49823
- var init_expandPalette = __esm({
49824
- "../theme-core/src/palette/expandPalette.ts"() {
49825
- "use strict";
49826
- init_generateShades();
49827
- init_neutralScale();
49828
- init_colorConversion();
49829
- init_textColor();
49830
- }
49831
- });
49832
-
49833
49983
  // ../theme-core/src/runtime/fontFamily.ts
49834
49984
  function isGenericFamily(font) {
49835
49985
  return GENERIC_CSS_FAMILIES.includes(font.toLowerCase());
@@ -65696,6 +65846,16 @@ var jsonArrayTransform = {
65696
65846
  return "";
65697
65847
  }
65698
65848
  };
65849
+ var csvTransform = {
65850
+ id: "value.csv",
65851
+ kind: "formatter",
65852
+ summary: "Normalize a string or array of strings into a comma-separated list",
65853
+ run: (value) => {
65854
+ const rawValues = Array.isArray(value) ? value : typeof value === "string" ? value.split(",") : [];
65855
+ const normalized = rawValues.filter((item) => typeof item === "string").map((item) => item.trim()).filter(Boolean);
65856
+ return normalized.length > 0 ? Array.from(new Set(normalized)).join(",") : "";
65857
+ }
65858
+ };
65699
65859
  var marqueeLoopOptionsSchema = z58.object({
65700
65860
  minItems: z58.number().int().min(1).default(10)
65701
65861
  });
@@ -65721,6 +65881,7 @@ var formattingTransforms = [
65721
65881
  dateFormatShort,
65722
65882
  arrayLengthTransform,
65723
65883
  jsonArrayTransform,
65884
+ csvTransform,
65724
65885
  marqueeLoopTransform
65725
65886
  ];
65726
65887
 
@@ -73360,6 +73521,9 @@ init_textColor();
73360
73521
  // ../theme-core/src/palette/utils/legibility.ts
73361
73522
  init_contrast2();
73362
73523
 
73524
+ // ../theme-core/src/palette/utils/index.ts
73525
+ init_onColor();
73526
+
73363
73527
  // ../theme-core/src/mock-themes/components/PaletteCard.tsx
73364
73528
  init_expandPalette();
73365
73529
 
@@ -75856,6 +76020,17 @@ async function Layout({
75856
76020
  return useThemeScope ? /* @__PURE__ */ jsx162(ThemeScope2, { theme, children: content }) : content;
75857
76021
  }
75858
76022
 
76023
+ // ../api/src/apiEndpointTypes.ts
76024
+ function blockedDemoMutationPolicy(classification, publicMessage) {
76025
+ if (publicMessage.trim() === "") {
76026
+ throw new Error(`Demo mutation policy ${classification} requires publicMessage.`);
76027
+ }
76028
+ return {
76029
+ classification,
76030
+ publicMessage
76031
+ };
76032
+ }
76033
+
75859
76034
  // ../api/src/cache-tags.ts
75860
76035
  var TAG_TEMPLATES = {
75861
76036
  siteCollection: "riverbank:site",
@@ -75886,6 +76061,18 @@ var TAG_TEMPLATES = {
75886
76061
  };
75887
76062
 
75888
76063
  // ../api/src/endpoints.ts
76064
+ var DEMO_MUTATION_BLOCKED_HIDDEN = blockedDemoMutationPolicy(
76065
+ "blocked-hidden",
76066
+ "This action is not available in demo sites."
76067
+ );
76068
+ var DEMO_MUTATION_BLOCKED_DISABLED = blockedDemoMutationPolicy(
76069
+ "blocked-disabled",
76070
+ "This setting is disabled in demo sites."
76071
+ );
76072
+ var DEMO_MUTATION_INTERNAL_ONLY = blockedDemoMutationPolicy(
76073
+ "internal-only",
76074
+ "This internal operation is not available in demo sites."
76075
+ );
75889
76076
  var ENDPOINT_DEFINITIONS = {
75890
76077
  // AI endpoints - no cache due to dynamic nature
75891
76078
  aiContentUpdateChat: {
@@ -76002,7 +76189,8 @@ var ENDPOINT_DEFINITIONS = {
76002
76189
  path: "/sites/{siteId}/ai/generate",
76003
76190
  method: "POST",
76004
76191
  auth: "user",
76005
- responseKind: "json"
76192
+ responseKind: "json",
76193
+ demoMutation: DEMO_MUTATION_BLOCKED_HIDDEN
76006
76194
  },
76007
76195
  getOnboardingPreviewStatus: {
76008
76196
  path: "/public/sites/{siteId}/onboarding/preview-status",
@@ -76023,7 +76211,8 @@ var ENDPOINT_DEFINITIONS = {
76023
76211
  method: "POST",
76024
76212
  auth: "user",
76025
76213
  errors: [],
76026
- responseKind: "json"
76214
+ responseKind: "json",
76215
+ demoMutation: DEMO_MUTATION_BLOCKED_DISABLED
76027
76216
  },
76028
76217
  goLiveSite: {
76029
76218
  path: "/sites/{siteId}/launch/go-live",
@@ -76092,20 +76281,23 @@ var ENDPOINT_DEFINITIONS = {
76092
76281
  path: "/sites/{siteId}/ai/site-wizard/goals",
76093
76282
  method: "POST",
76094
76283
  auth: "user",
76095
- responseKind: "json"
76284
+ responseKind: "json",
76285
+ demoMutation: DEMO_MUTATION_BLOCKED_HIDDEN
76096
76286
  },
76097
76287
  aiSiteWizardIntakeTriage: {
76098
76288
  path: "/sites/{siteId}/ai/site-wizard/intake-triage",
76099
76289
  method: "POST",
76100
76290
  auth: "user",
76101
- responseKind: "json"
76291
+ responseKind: "json",
76292
+ demoMutation: DEMO_MUTATION_BLOCKED_HIDDEN
76102
76293
  },
76103
76294
  aiSiteWizardTelemetry: {
76104
76295
  path: "/sites/{siteId}/ai/site-wizard/telemetry",
76105
76296
  method: "POST",
76106
76297
  auth: "user",
76107
76298
  errors: [],
76108
- responseKind: "json"
76299
+ responseKind: "json",
76300
+ demoMutation: DEMO_MUTATION_BLOCKED_HIDDEN
76109
76301
  },
76110
76302
  // Admin SEO
76111
76303
  listGscPropertiesAdmin: {
@@ -76312,7 +76504,7 @@ var ENDPOINT_DEFINITIONS = {
76312
76504
  responseKind: "json",
76313
76505
  errors: ["resource:not_found", "server:internal_error"]
76314
76506
  },
76315
- // Ops (event hosts/admins)
76507
+ // Ops (staff event operators/admins)
76316
76508
  opsListUpcomingEventOccurrences: {
76317
76509
  path: "/ops/sites/{siteId}/events",
76318
76510
  method: "GET",
@@ -76330,6 +76522,7 @@ var ENDPOINT_DEFINITIONS = {
76330
76522
  method: "POST",
76331
76523
  auth: "user",
76332
76524
  responseKind: "json",
76525
+ demoMutation: DEMO_MUTATION_INTERNAL_ONLY,
76333
76526
  errors: [
76334
76527
  "validation:invalid_input",
76335
76528
  "auth:forbidden",
@@ -76342,6 +76535,7 @@ var ENDPOINT_DEFINITIONS = {
76342
76535
  method: "POST",
76343
76536
  auth: "user",
76344
76537
  responseKind: "json",
76538
+ demoMutation: DEMO_MUTATION_INTERNAL_ONLY,
76345
76539
  errors: [
76346
76540
  "validation:invalid_input",
76347
76541
  "auth:forbidden",
@@ -76360,6 +76554,7 @@ var ENDPOINT_DEFINITIONS = {
76360
76554
  method: "POST",
76361
76555
  auth: "user",
76362
76556
  responseKind: "json",
76557
+ demoMutation: DEMO_MUTATION_INTERNAL_ONLY,
76363
76558
  errors: [
76364
76559
  "validation:invalid_input",
76365
76560
  "auth:forbidden",
@@ -76393,6 +76588,7 @@ var ENDPOINT_DEFINITIONS = {
76393
76588
  method: "POST",
76394
76589
  auth: "user",
76395
76590
  responseKind: "json",
76591
+ demoMutation: DEMO_MUTATION_INTERNAL_ONLY,
76396
76592
  errors: [
76397
76593
  "validation:invalid_input",
76398
76594
  "auth:forbidden",
@@ -76421,7 +76617,8 @@ var ENDPOINT_DEFINITIONS = {
76421
76617
  method: "POST",
76422
76618
  tags: [TAG_TEMPLATES.site, TAG_TEMPLATES.siteEmailSettings],
76423
76619
  auth: "user",
76424
- responseKind: "json"
76620
+ responseKind: "json",
76621
+ demoMutation: DEMO_MUTATION_BLOCKED_HIDDEN
76425
76622
  },
76426
76623
  previewEmailTemplate: {
76427
76624
  path: "/sites/{siteId}/settings/emails/preview",
@@ -76472,14 +76669,16 @@ var ENDPOINT_DEFINITIONS = {
76472
76669
  method: "POST",
76473
76670
  tags: [TAG_TEMPLATES.site, TAG_TEMPLATES.siteNewsletter],
76474
76671
  auth: "user",
76475
- responseKind: "json"
76672
+ responseKind: "json",
76673
+ demoMutation: DEMO_MUTATION_BLOCKED_HIDDEN
76476
76674
  },
76477
76675
  createNewsletterSubscribersImportUploadUrl: {
76478
76676
  path: "/sites/{siteId}/newsletter/subscribers/import-url",
76479
76677
  method: "POST",
76480
76678
  tags: [TAG_TEMPLATES.site, TAG_TEMPLATES.siteNewsletter],
76481
76679
  auth: "user",
76482
- responseKind: "json"
76680
+ responseKind: "json",
76681
+ demoMutation: DEMO_MUTATION_BLOCKED_HIDDEN
76483
76682
  },
76484
76683
  exportNewsletterSubscribersCsv: {
76485
76684
  path: "/sites/{siteId}/newsletter/subscribers/export.csv",
@@ -76676,14 +76875,16 @@ var ENDPOINT_DEFINITIONS = {
76676
76875
  method: "POST",
76677
76876
  tags: [TAG_TEMPLATES.site, TAG_TEMPLATES.siteNewsletter],
76678
76877
  auth: "user",
76679
- responseKind: "json"
76878
+ responseKind: "json",
76879
+ demoMutation: DEMO_MUTATION_BLOCKED_HIDDEN
76680
76880
  },
76681
76881
  testSendNewsletterCampaign: {
76682
76882
  path: "/sites/{siteId}/newsletter/campaigns/{campaignId}/test-send",
76683
76883
  method: "POST",
76684
76884
  tags: [TAG_TEMPLATES.site, TAG_TEMPLATES.siteNewsletter],
76685
76885
  auth: "user",
76686
- responseKind: "json"
76886
+ responseKind: "json",
76887
+ demoMutation: DEMO_MUTATION_BLOCKED_HIDDEN
76687
76888
  },
76688
76889
  listNewsletterSendJobs: {
76689
76890
  path: "/sites/{siteId}/newsletter/jobs",
@@ -77371,7 +77572,8 @@ var ENDPOINT_DEFINITIONS = {
77371
77572
  method: "DELETE",
77372
77573
  tags: ["site", "site-{siteId}"],
77373
77574
  auth: "user",
77374
- responseKind: "json"
77575
+ responseKind: "json",
77576
+ demoMutation: DEMO_MUTATION_BLOCKED_HIDDEN
77375
77577
  },
77376
77578
  listSiteMembers: {
77377
77579
  path: "/sites/{siteId}/members",
@@ -77827,7 +78029,8 @@ var ENDPOINT_DEFINITIONS = {
77827
78029
  method: "POST",
77828
78030
  tags: ["site-{siteId}", "content-{siteId}-{type}"],
77829
78031
  auth: "user",
77830
- responseKind: "json"
78032
+ responseKind: "json",
78033
+ demoMutation: DEMO_MUTATION_BLOCKED_HIDDEN
77831
78034
  },
77832
78035
  updateSiteGeneralSettings: {
77833
78036
  path: "/sites/{siteId}/settings/general",
@@ -80066,6 +80269,7 @@ var ENDPOINT_DEFINITIONS = {
80066
80269
  method: "POST",
80067
80270
  tags: ["site-{siteId}"],
80068
80271
  auth: "user",
80272
+ demoMutation: DEMO_MUTATION_BLOCKED_HIDDEN,
80069
80273
  errors: [
80070
80274
  "validation:invalid_input",
80071
80275
  "auth:forbidden",
@@ -80080,6 +80284,7 @@ var ENDPOINT_DEFINITIONS = {
80080
80284
  method: "POST",
80081
80285
  tags: ["site-{siteId}"],
80082
80286
  auth: "user",
80287
+ demoMutation: DEMO_MUTATION_BLOCKED_HIDDEN,
80083
80288
  errors: [
80084
80289
  "validation:invalid_input",
80085
80290
  "auth:forbidden",
@@ -80389,6 +80594,7 @@ var ENDPOINT_DEFINITIONS = {
80389
80594
  tags: ["site-{siteId}", "passes-{siteId}"],
80390
80595
  auth: "user",
80391
80596
  responseKind: "json",
80597
+ demoMutation: DEMO_MUTATION_BLOCKED_DISABLED,
80392
80598
  errors: ["validation:invalid_input", "server:internal_error"]
80393
80599
  },
80394
80600
  getBookingPass: {
@@ -80404,6 +80610,7 @@ var ENDPOINT_DEFINITIONS = {
80404
80610
  tags: ["site-{siteId}", "passes-{siteId}"],
80405
80611
  auth: "user",
80406
80612
  responseKind: "json",
80613
+ demoMutation: DEMO_MUTATION_BLOCKED_DISABLED,
80407
80614
  errors: [
80408
80615
  "validation:invalid_input",
80409
80616
  "resource:not_found",
@@ -80416,6 +80623,7 @@ var ENDPOINT_DEFINITIONS = {
80416
80623
  tags: ["site-{siteId}", "passes-{siteId}"],
80417
80624
  auth: "user",
80418
80625
  responseKind: "json",
80626
+ demoMutation: DEMO_MUTATION_BLOCKED_DISABLED,
80419
80627
  errors: [
80420
80628
  "validation:invalid_input",
80421
80629
  "resource:not_found",
@@ -80471,6 +80679,7 @@ var ENDPOINT_DEFINITIONS = {
80471
80679
  tags: ["site-{siteId}", "memberships-{siteId}"],
80472
80680
  auth: "user",
80473
80681
  responseKind: "json",
80682
+ demoMutation: DEMO_MUTATION_BLOCKED_DISABLED,
80474
80683
  errors: ["validation:invalid_input", "server:internal_error"]
80475
80684
  },
80476
80685
  getBookingMembership: {
@@ -80486,6 +80695,7 @@ var ENDPOINT_DEFINITIONS = {
80486
80695
  tags: ["site-{siteId}", "memberships-{siteId}"],
80487
80696
  auth: "user",
80488
80697
  responseKind: "json",
80698
+ demoMutation: DEMO_MUTATION_BLOCKED_DISABLED,
80489
80699
  errors: [
80490
80700
  "validation:invalid_input",
80491
80701
  "resource:not_found",
@@ -80498,6 +80708,7 @@ var ENDPOINT_DEFINITIONS = {
80498
80708
  tags: ["site-{siteId}", "memberships-{siteId}"],
80499
80709
  auth: "user",
80500
80710
  responseKind: "json",
80711
+ demoMutation: DEMO_MUTATION_BLOCKED_DISABLED,
80501
80712
  errors: [
80502
80713
  "validation:invalid_input",
80503
80714
  "resource:not_found",
@@ -80714,6 +80925,7 @@ var ENDPOINT_DEFINITIONS = {
80714
80925
  tags: ["site-{siteId}", "customers-{siteId}"],
80715
80926
  auth: "user",
80716
80927
  responseKind: "json",
80928
+ demoMutation: DEMO_MUTATION_BLOCKED_DISABLED,
80717
80929
  errors: [
80718
80930
  "validation:invalid_input",
80719
80931
  "auth:forbidden",
@@ -82093,8 +82305,7 @@ var dashboardNavVisibilityBaseSchema = z68.object({
82093
82305
  var dashboardNavVisibilityRolesSchema = z68.object({
82094
82306
  administrator: dashboardNavVisibilityBaseSchema.optional(),
82095
82307
  editor: dashboardNavVisibilityBaseSchema.optional(),
82096
- team_member: dashboardNavVisibilityBaseSchema.optional(),
82097
- event_host: dashboardNavVisibilityBaseSchema.optional()
82308
+ team_member: dashboardNavVisibilityBaseSchema.optional()
82098
82309
  }).strip().optional();
82099
82310
  var dashboardNavVisibilitySchema = dashboardNavVisibilityBaseSchema.extend({
82100
82311
  roles: dashboardNavVisibilityRolesSchema
@@ -82615,6 +82826,21 @@ var appointmentSetupServiceDraftSchema = z70.object({
82615
82826
  timezone: z70.string().trim().min(1).nullable(),
82616
82827
  payment: appointmentSetupPaymentDraftSchema,
82617
82828
  assignment: appointmentSetupServiceAssignmentDraftSchema
82829
+ }).superRefine((service, ctx) => {
82830
+ if (service.payment.priceType === "paid" && (service.priceAmount === null || service.priceAmount <= 0)) {
82831
+ ctx.addIssue({
82832
+ code: "custom",
82833
+ path: ["priceAmount"],
82834
+ message: "Paid appointment services need a positive price."
82835
+ });
82836
+ }
82837
+ if (service.payment.priceType === "free" && service.priceAmount !== null && service.priceAmount > 0) {
82838
+ ctx.addIssue({
82839
+ code: "custom",
82840
+ path: ["priceAmount"],
82841
+ message: "Free appointment services cannot carry a positive price."
82842
+ });
82843
+ }
82618
82844
  });
82619
82845
  var appointmentSetupPractitionerDraftSchema = z70.object({
82620
82846
  ref: appointmentSetupRefSchema,