@brunosouzas/design-system 0.5.1 → 0.5.3

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.
package/README.md CHANGED
@@ -146,7 +146,7 @@ Thirteen pieces draw a metro map and its page diagrams, for [stackledger](https:
146
146
  - `countBadge` takes `textSize` (6 to 48, default 11): without `height`, the height, width and baseline grow with it.
147
147
  - A line's colour comes from the map's data, so `pipe.fill`, `lineBadge.fill` and `zone.fill` also accept `#RRGGBB`. Every other colour is a token path, and a cover spec rejects any hex.
148
148
  - `map.bendRadius` (32) is the radius of a bundle's centre line at a 45° or 90° bend; no piece reads it, the map engine draws the arcs (`pipe.d` takes `A`).
149
- - The `map.*` tokens hold the measures (outline 3, shadow 3.5, line 12, casing 6, badge 20, node 46, ring 3, halo 1.5, licence 10, zone padding 32, bend radius 32…), `surface.*.zoneOpacity` the zone's opacity (0.12, dark 0.22), and `site.*` the page palette, fonts and type scale of brunosouzas.com in light and dark.
149
+ - The `map.*` tokens hold the measures (outline 3, shadow 3.5, line 12, casing 6, badge 20, node 46, ring 3, halo 1.5, licence 10, zone padding 32, bend radius 32…), `surface.*.zoneOpacity` the zone's opacity (0.12, dark 0.22), `surface.*.backdropWater`, `backdropWaterEdge`, `backdropPark` and `backdropCredit` the colours of a city backdrop behind a map and its OpenStreetMap credit (no piece draws it; stackledger does), and `site.*` the page palette, fonts and type scale of brunosouzas.com in light and dark.
150
150
 
151
151
  ```ts
152
152
  import { lineBadge, pipe, stationMarker, toSvg } from "@brunosouzas/design-system";
@@ -168,7 +168,7 @@ Ten pieces draw what the blog's body diagrams need beyond the map pieces: `diagr
168
168
 
169
169
  ### The cast and the emotes
170
170
 
171
- `mascot({ who, x, y, face, action, scale, look, headTilt, prop })` draws one character standing with the centre of its ground line at `(x, y)`. Each one carries its identity in three layers, so no video has to introduce it: a body shape, a mark always visible, and a prop when its hands are free.
171
+ `mascot({ who, x, y, face, action, scale, look, headTilt, prop, surface })` draws one character standing with the centre of its ground line at `(x, y)`. Each one carries its identity in three layers, so no video has to introduce it: a body shape, a mark always visible, and a prop when its hands are free.
172
172
 
173
173
  | `who` | Body | Mark | Prop | Colour |
174
174
  |---|---|---|---|---|
@@ -184,7 +184,7 @@ Ten pieces draw what the blog's body diagrams need beyond the map pieces: `diagr
184
184
  - `action`: `none` (the default: an expression has no hands or feet), `rest`, `wave`, `hold`, `reach`, `up`, `shrug`, `type`. Arms and legs start at the body's sides; hands are mittens.
185
185
  - `look` (-1 to 1) moves the gaze, `headTilt` (-30 to 30) turns the agent's head on its neck, `prop: false` hides the prop. Every part is a group named by `data-part` (`body`, `face`, `eyes`, `brows`, `mouth`, `arm-left`, `arm-right`, `legs`, `prop`, `mark`, …), so a scene can animate it.
186
186
 
187
- `emote({ kind, x, y, scale, burst })` draws a reaction beside a head, never over the face. Each kind keeps one meaning in every video, like the colours:
187
+ `emote({ kind, x, y, scale, burst, surface })` draws a reaction beside a head, never over the face. Each kind keeps one meaning in every video, like the colours:
188
188
 
189
189
  | `kind` | Shape | Meaning |
190
190
  |---|---|---|
@@ -199,7 +199,7 @@ Ten pieces draw what the blog's body diagrams need beyond the map pieces: `diagr
199
199
 
200
200
  In a scene, an emote pops in on the frame the face changes (`emotePop` in `src/brand/cast-motion.ts`, with `leave`, `blinking`, `breathe`, `squashAfter` and `hop`), one at a time, and the body acts through `pose`. A mascot's colour is its identity and never changes with state. The approved motion test is the Studio composition `cast-motion-test` (folder `cast`): `npx remotion render src/index.ts cast-motion-test`. It is a proof of the cast, not an article scene, so `npm run stills` and `npm run render` do not list it.
201
201
 
202
- The cast draws the same on any background; a dark-surface variant is planned (AB#187).
202
+ On a dark page pass `surface: "dark"` (AB#187, 0.5.2): the hard shadows take `surface.dark.shadow`, the ground takes `surface.dark.grid`, and a light rim (`surface.dark.rim`) lines the whole outline, limbs and props included; faces are unchanged. Without `surface`, the cast draws as in 0.5.0.
203
203
 
204
204
  ### A cover
205
205
 
@@ -1,4 +1,5 @@
1
1
  import { type SvgNode } from "./node.ts";
2
+ import { type SurfaceName } from "./ink.ts";
2
3
  export declare const MASCOTS: readonly ["dev", "agent", "architect", "devops", "data", "request", "message"];
3
4
  export declare const MASCOT_FACES: readonly ["normal", "blink", "happy", "wink", "surprised", "worried", "thinking", "focused"];
4
5
  export declare const MASCOT_ACTIONS: readonly ["none", "rest", "wave", "hold", "reach", "up", "shrug", "type"];
@@ -18,6 +19,7 @@ export type MascotParams = {
18
19
  look?: number;
19
20
  headTilt?: number;
20
21
  prop?: boolean;
22
+ surface?: SurfaceName;
21
23
  };
22
24
  export type EmoteParams = {
23
25
  kind: EmoteKind;
@@ -25,6 +27,7 @@ export type EmoteParams = {
25
27
  y: number;
26
28
  scale?: number;
27
29
  burst?: boolean;
30
+ surface?: SurfaceName;
28
31
  };
29
32
  /** One character standing with the centre of its ground line at (x, y). */
30
33
  export declare const mascot: import("./piece.ts").Piece<MascotParams>;
@@ -10,7 +10,9 @@
10
10
  // (~/.hermes/spikes/design-system/cast-and-emotes/cast.mts). The frozen fixture
11
11
  // test/fixtures/cast-0.5.0.json pins every call's output, so a refactor here
12
12
  // must keep every hash.
13
+ import { tokens } from "../../tokens/generated/tokens.js";
13
14
  import { drawn, el, g } from "./node.js";
15
+ import { surfaceParam } from "./ink.js";
14
16
  import { colour, pos } from "./params.js";
15
17
  import { definePiece } from "./piece.js";
16
18
  const c = (path) => colour(path);
@@ -20,10 +22,59 @@ export const MASCOT_ACTIONS = ["none", "rest", "wave", "hold", "reach", "up", "s
20
22
  export const EMOTE_KINDS = ["idea", "doubt", "problem", "worked", "refused", "pressure", "liked", "waiting"];
21
23
  const ink = () => c("color.ink");
22
24
  const O = () => ({ stroke: ink(), "stroke-width": 4, "stroke-linejoin": "round" });
23
- const shade = (d, dx = 8) => el("path", { d, fill: ink(), transform: `translate(${dx} ${dx})` });
25
+ // Every hard shadow is made by `hard`, so the dark drawing finds it by identity, not by its look.
26
+ const SHADOWS = new WeakSet();
27
+ const hard = (n) => (SHADOWS.add(n), n);
28
+ const shade = (d, dx = 8) => hard(el("path", { d, fill: ink(), transform: `translate(${dx} ${dx})` }));
24
29
  const solid = (d, fill, dx = 8) => [shade(d, dx), el("path", { d, fill, ...O() })];
25
30
  const shine = (d, col) => el("path", { d, fill: "none", stroke: col, "stroke-width": 9, "stroke-linecap": "round" });
26
31
  const rr = (x, y, w, h, r) => `M${x + r},${y} H${x + w - r} Q${x + w},${y} ${x + w},${y + r} V${y + h - r} Q${x + w},${y + h} ${x + w - r},${y + h} H${x + r} Q${x},${y + h} ${x},${y + h - r} V${y + r} Q${x},${y} ${x + r},${y} Z`;
32
+ // ---------------------------------------------------------------- dark surface (card 187)
33
+ // On the dark surface (ADR 0003 amendment) the light drawing is rewritten, so the
34
+ // light output stays the frozen 0.5.0 tree: each hard shadow (made by `hard`) takes the surface's
35
+ // shadow colour, the ground takes the surface's grid colour, and a light rim
36
+ // (the drawing in the rim colour, every stroke widened by 2 × 2 × rimWidth) sits
37
+ // behind the whole outline, arms and legs included. The face is unchanged.
38
+ const walk = (n, f) => {
39
+ const m = f(n);
40
+ if (!m)
41
+ return null;
42
+ const kids = m.children.map((k) => (typeof k === "string" ? k : walk(k, f))).filter((k) => k !== null);
43
+ return { ...m, children: kids };
44
+ };
45
+ const part = (n) => String(n.attrs["data-part"] ?? "");
46
+ const onDark = (n) => {
47
+ const d = tokens.surface.dark;
48
+ return walk(n, (x) => {
49
+ if (SHADOWS.has(x))
50
+ return { ...x, attrs: { ...x.attrs, fill: d.shadow } };
51
+ if (part(x) === "ground")
52
+ return { ...x, children: x.children.map((k) => (typeof k === "string" ? k : { ...k, attrs: { ...k.attrs, fill: d.grid } })) };
53
+ return x;
54
+ });
55
+ };
56
+ const rimOf = (n) => {
57
+ const d = tokens.surface.dark;
58
+ return walk(n, (x) => {
59
+ if (SHADOWS.has(x) || ["ground", "face"].includes(part(x)) || x.attrs.opacity !== undefined)
60
+ return null;
61
+ if (x.tag === "g")
62
+ return x;
63
+ const sw = x.attrs.stroke !== undefined && x.attrs.stroke !== "none" ? Number(x.attrs["stroke-width"] ?? 4) : 0;
64
+ const attrs = { ...x.attrs, stroke: d.rim, "stroke-width": sw + 4 * d.rimWidth, "stroke-linejoin": "round" };
65
+ if (x.attrs.fill !== undefined && x.attrs.fill !== "none")
66
+ attrs.fill = d.rim;
67
+ return { ...x, attrs };
68
+ });
69
+ };
70
+ /** The light drawing redrawn for the dark surface: ground, rim, then the drawing. */
71
+ const darken = (root) => {
72
+ // The rim is taken from the light tree, where shadows are still known by identity.
73
+ const isGround = (k) => typeof k === "object" && part(k) === "ground";
74
+ const rim = rimOf({ ...root, attrs: {}, children: root.children.filter((k) => !isGround(k)) });
75
+ const dark = onDark(root);
76
+ return { ...dark, children: [...dark.children.filter(isGround), ...(rim ? [g({ "data-part": "rim" }, ...rim.children)] : []), ...dark.children.filter((k) => !isGround(k))] };
77
+ };
27
78
  // ---------------------------------------------------------------- face (macs.ts)
28
79
  export const face = (cx, cy, f, col, mouthFill) => {
29
80
  const k = 1, dx = 24 * k;
@@ -206,7 +257,7 @@ const drawMascot = (p) => {
206
257
  parts = [...parts, g({ "data-part": "head", transform: `rotate(${tilt} ${top[0]} ${top[1]})` }, ...solid(rr(top[0] - 96, 0, 192, 132, 22), c("color.white")), el("path", { d: rr(top[0] - 80, 14, 160, 104, 12), fill: c("illustration.codePanel"), stroke: ink(), "stroke-width": 4 }), faceWrapped)];
207
258
  }
208
259
  const root = g({ "data-mascot": p.who, transform: `translate(${p.x} ${p.y}) scale(${k}) translate(${-ax} ${-ay})`, stroke: "none" }, g({ "data-part": "ground" }, el("ellipse", { cx: ax, cy: ay, rx: ch.ground, ry: 9, fill: c("cast.ground") })), ...(front ? [] : arms), legs, ...parts, ch.faceInHead ? null : faceWrapped, showProp ? g({ "data-part": "prop" }, ...ch.prop()) : null, ...(front ? arms : []));
209
- return drawn([root]);
260
+ return drawn([p.surface === "dark" ? darken(root) : root]);
210
261
  };
211
262
  // ---------------------------------------------------------------- emotes (emotes.ts)
212
263
  const rays = (cx, cy, r1, r2, n, from = -150, to = -30) => Array.from({ length: n }, (_, i) => {
@@ -215,7 +266,7 @@ const rays = (cx, cy, r1, r2, n, from = -150, to = -30) => Array.from({ length:
215
266
  return el("path", { d: `M${r(cx + r1 * Math.cos(a))},${r(cy + r1 * Math.sin(a))} L${r(cx + r2 * Math.cos(a))},${r(cy + r2 * Math.sin(a))}`, stroke: ink(), "stroke-width": 6, "stroke-linecap": "round" });
216
267
  });
217
268
  const EO = () => ({ stroke: ink(), "stroke-width": 5, "stroke-linejoin": "round", "stroke-linecap": "round" });
218
- const disc = (cx, cy, r, fill) => [el("circle", { cx: cx + 6, cy: cy + 6, r, fill: ink() }), el("circle", { cx, cy, r, fill, ...EO() })];
269
+ const disc = (cx, cy, r, fill) => [hard(el("circle", { cx: cx + 6, cy: cy + 6, r, fill: ink() })), el("circle", { cx, cy, r, fill, ...EO() })];
219
270
  const zed = (x, y, s) => {
220
271
  // A Z of height s with its top-left at (x, y - s): ink casing, caller fill.
221
272
  const w = s * 0.72, d = `M${x},${y - s} H${x + w} L${x},${y} H${x + w}`;
@@ -230,7 +281,7 @@ const drawEmote = (p) => {
230
281
  if (burst)
231
282
  parts.push(el("circle", { cx, cy: cy - 6, r: 62, fill: c("color.transitional"), opacity: 0.35 }), ...rays(cx, cy - 6, 50, 72, 7, -180, 0));
232
283
  const bulb = `M${cx - 30},${cy - 10} A34,34 0 1 1 ${cx + 30},${cy - 10} Q${cx + 22},${cy + 6} ${cx + 18},${cy + 22} H${cx - 18} Q${cx - 22},${cy + 6} ${cx - 30},${cy - 10} Z`;
233
- parts.push(el("path", { d: bulb, fill: ink(), transform: "translate(6 6)" }), el("path", { d: bulb, fill: c("color.transitional"), ...EO() }), el("path", { d: `M${cx - 16},${cy - 22} Q${cx - 12},${cy - 32} ${cx - 2},${cy - 34}`, fill: "none", stroke: c("color.white"), "stroke-width": 6, "stroke-linecap": "round" }), el("path", { d: `M${cx - 8},${cy + 22} V${cy} L${cx},${cy + 8} L${cx + 8},${cy} V${cy + 22}`, fill: "none", stroke: ink(), "stroke-width": 4, "stroke-linejoin": "round" }), el("rect", { x: cx - 18, y: cy + 22, width: 36, height: 12, rx: 3, fill: c("cast.metal"), ...EO(), "stroke-width": 4 }), el("rect", { x: cx - 14, y: cy + 34, width: 28, height: 10, rx: 5, fill: c("cast.metal"), ...EO(), "stroke-width": 4 }));
284
+ parts.push(hard(el("path", { d: bulb, fill: ink(), transform: "translate(6 6)" })), el("path", { d: bulb, fill: c("color.transitional"), ...EO() }), el("path", { d: `M${cx - 16},${cy - 22} Q${cx - 12},${cy - 32} ${cx - 2},${cy - 34}`, fill: "none", stroke: c("color.white"), "stroke-width": 6, "stroke-linecap": "round" }), el("path", { d: `M${cx - 8},${cy + 22} V${cy} L${cx},${cy + 8} L${cx + 8},${cy} V${cy + 22}`, fill: "none", stroke: ink(), "stroke-width": 4, "stroke-linejoin": "round" }), el("rect", { x: cx - 18, y: cy + 22, width: 36, height: 12, rx: 3, fill: c("cast.metal"), ...EO(), "stroke-width": 4 }), el("rect", { x: cx - 14, y: cy + 34, width: 28, height: 10, rx: 5, fill: c("cast.metal"), ...EO(), "stroke-width": 4 }));
234
285
  break;
235
286
  }
236
287
  case "doubt":
@@ -239,7 +290,7 @@ const drawEmote = (p) => {
239
290
  case "problem":
240
291
  if (burst)
241
292
  parts.push(...rays(cx, cy, 48, 70, 5));
242
- parts.push(el("path", { d: `M${cx},${cy - 44} L${cx + 46},${cy + 34} H${cx - 46} Z`, fill: ink(), transform: "translate(6 6)" }), el("path", { d: `M${cx},${cy - 44} L${cx + 46},${cy + 34} H${cx - 46} Z`, fill: c("color.failure"), ...EO() }), el("path", { d: `M${cx},${cy - 18} V${cy + 8}`, stroke: ink(), "stroke-width": 9, "stroke-linecap": "round" }), el("circle", { cx, cy: cy + 22, r: 5.5, fill: ink() }));
293
+ parts.push(hard(el("path", { d: `M${cx},${cy - 44} L${cx + 46},${cy + 34} H${cx - 46} Z`, fill: ink(), transform: "translate(6 6)" })), el("path", { d: `M${cx},${cy - 44} L${cx + 46},${cy + 34} H${cx - 46} Z`, fill: c("color.failure"), ...EO() }), el("path", { d: `M${cx},${cy - 18} V${cy + 8}`, stroke: ink(), "stroke-width": 9, "stroke-linecap": "round" }), el("circle", { cx, cy: cy + 22, r: 5.5, fill: ink() }));
243
294
  break;
244
295
  case "pressure":
245
296
  for (const [dx, dy, k] of [[0, 0, 1], [30, 22, 0.6]])
@@ -261,7 +312,8 @@ const drawEmote = (p) => {
261
312
  break;
262
313
  }
263
314
  const attrs = s === 1 ? { "data-emote": kind, stroke: "none" } : { "data-emote": kind, stroke: "none", transform: `translate(${cx} ${cy}) scale(${s}) translate(${-cx} ${-cy})` };
264
- return drawn([g(attrs, ...parts)]);
315
+ const root = g(attrs, ...parts);
316
+ return drawn([p.surface === "dark" ? darken(root) : root]);
265
317
  };
266
318
  const unit = { kind: "number", min: 0, exclusiveMin: true, max: 10 };
267
319
  /** One character standing with the centre of its ground line at (x, y). */
@@ -275,6 +327,7 @@ export const mascot = definePiece("mascot", {
275
327
  look: { kind: "number", min: -1, max: 1 },
276
328
  headTilt: { kind: "number", min: -30, max: 30 },
277
329
  prop: { kind: "boolean" },
330
+ surface: surfaceParam,
278
331
  }, drawMascot, ({ who, headTilt }) => (headTilt !== undefined && headTilt !== 0 && who !== "agent" ? [{ path: "headTilt", message: "applies only to the agent" }] : []));
279
332
  /** One reaction symbol with a fixed meaning, centred on (x, y), beside a head. */
280
- export const emote = definePiece("emote", { kind: { kind: "enum", required: true, values: EMOTE_KINDS }, x: pos(), y: pos(), scale: unit, burst: { kind: "boolean" } }, drawEmote);
333
+ export const emote = definePiece("emote", { kind: { kind: "enum", required: true, values: EMOTE_KINDS }, x: pos(), y: pos(), scale: unit, burst: { kind: "boolean" }, surface: surfaceParam }, drawEmote);
@@ -15,6 +15,10 @@ export declare const limits: (...checks: (Problem | false)[]) => Problem[];
15
15
  /** The surface's colours and the ink measures at a scale. */
16
16
  export declare const inkOf: ({ surface, inkScale }: Ink) => {
17
17
  s: {
18
+ readonly backdropCredit: "#9AA6D6";
19
+ readonly backdropPark: "#183F52";
20
+ readonly backdropWater: "#1E3175";
21
+ readonly backdropWaterEdge: "#2A3F8A";
18
22
  readonly background: "#14215A";
19
23
  readonly grid: "#1C2D74";
20
24
  readonly muted: "#8F9BD0";
@@ -25,6 +29,10 @@ export declare const inkOf: ({ surface, inkScale }: Ink) => {
25
29
  readonly text: "#EEF2FF";
26
30
  readonly zoneOpacity: 0.22;
27
31
  } | {
32
+ readonly backdropCredit: "#5A6385";
33
+ readonly backdropPark: "#D4F2DF";
34
+ readonly backdropWater: "#C9D8FF";
35
+ readonly backdropWaterEdge: "#B5C7F5";
28
36
  readonly background: "#EEF2FF";
29
37
  readonly grid: "#E0E7FB";
30
38
  readonly muted: "#5B6694";
@@ -275,6 +275,10 @@ export declare const tokens: {
275
275
  };
276
276
  readonly surface: {
277
277
  readonly dark: {
278
+ readonly backdropCredit: "#9AA6D6";
279
+ readonly backdropPark: "#183F52";
280
+ readonly backdropWater: "#1E3175";
281
+ readonly backdropWaterEdge: "#2A3F8A";
278
282
  readonly background: "#14215A";
279
283
  readonly grid: "#1C2D74";
280
284
  readonly muted: "#8F9BD0";
@@ -286,6 +290,10 @@ export declare const tokens: {
286
290
  readonly zoneOpacity: 0.22;
287
291
  };
288
292
  readonly light: {
293
+ readonly backdropCredit: "#5A6385";
294
+ readonly backdropPark: "#D4F2DF";
295
+ readonly backdropWater: "#C9D8FF";
296
+ readonly backdropWaterEdge: "#B5C7F5";
289
297
  readonly background: "#EEF2FF";
290
298
  readonly grid: "#E0E7FB";
291
299
  readonly muted: "#5B6694";
@@ -276,6 +276,10 @@ export const tokens = {
276
276
  },
277
277
  "surface": {
278
278
  "dark": {
279
+ "backdropCredit": "#9AA6D6",
280
+ "backdropPark": "#183F52",
281
+ "backdropWater": "#1E3175",
282
+ "backdropWaterEdge": "#2A3F8A",
279
283
  "background": "#14215A",
280
284
  "grid": "#1C2D74",
281
285
  "muted": "#8F9BD0",
@@ -287,6 +291,10 @@ export const tokens = {
287
291
  "zoneOpacity": 0.22
288
292
  },
289
293
  "light": {
294
+ "backdropCredit": "#5A6385",
295
+ "backdropPark": "#D4F2DF",
296
+ "backdropWater": "#C9D8FF",
297
+ "backdropWaterEdge": "#B5C7F5",
290
298
  "background": "#EEF2FF",
291
299
  "grid": "#E0E7FB",
292
300
  "muted": "#5B6694",
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@brunosouzas/design-system",
3
- "version": "0.5.1",
3
+ "version": "0.5.3",
4
4
  "description": "Design tokens and illustration pieces of brunosouzas.com: tokens as CSS, JSON and TypeScript, pieces that draw SVG (and React), and a cover command.",
5
5
  "license": "Apache-2.0",
6
6
  "repository": {
@@ -176,6 +176,10 @@
176
176
  --ds-site-light-text: #444444;
177
177
  --ds-site-light-text-dark: #040404;
178
178
  --ds-site-light-text-light: #717171;
179
+ --ds-surface-dark-backdrop-credit: #9AA6D6;
180
+ --ds-surface-dark-backdrop-park: #183F52;
181
+ --ds-surface-dark-backdrop-water: #1E3175;
182
+ --ds-surface-dark-backdrop-water-edge: #2A3F8A;
179
183
  --ds-surface-dark-background: #14215A;
180
184
  --ds-surface-dark-grid: #1C2D74;
181
185
  --ds-surface-dark-muted: #8F9BD0;
@@ -185,6 +189,10 @@
185
189
  --ds-surface-dark-shadow: #4C5CB8;
186
190
  --ds-surface-dark-text: #EEF2FF;
187
191
  --ds-surface-dark-zone-opacity: 0.22;
192
+ --ds-surface-light-backdrop-credit: #5A6385;
193
+ --ds-surface-light-backdrop-park: #D4F2DF;
194
+ --ds-surface-light-backdrop-water: #C9D8FF;
195
+ --ds-surface-light-backdrop-water-edge: #B5C7F5;
188
196
  --ds-surface-light-background: #EEF2FF;
189
197
  --ds-surface-light-grid: #E0E7FB;
190
198
  --ds-surface-light-muted: #5B6694;
@@ -275,6 +275,10 @@
275
275
  },
276
276
  "surface": {
277
277
  "dark": {
278
+ "backdropCredit": "#9AA6D6",
279
+ "backdropPark": "#183F52",
280
+ "backdropWater": "#1E3175",
281
+ "backdropWaterEdge": "#2A3F8A",
278
282
  "background": "#14215A",
279
283
  "grid": "#1C2D74",
280
284
  "muted": "#8F9BD0",
@@ -286,6 +290,10 @@
286
290
  "zoneOpacity": 0.22
287
291
  },
288
292
  "light": {
293
+ "backdropCredit": "#5A6385",
294
+ "backdropPark": "#D4F2DF",
295
+ "backdropWater": "#C9D8FF",
296
+ "backdropWaterEdge": "#B5C7F5",
289
297
  "background": "#EEF2FF",
290
298
  "grid": "#E0E7FB",
291
299
  "muted": "#5B6694",
@@ -277,6 +277,10 @@ export const tokens = {
277
277
  },
278
278
  "surface": {
279
279
  "dark": {
280
+ "backdropCredit": "#9AA6D6",
281
+ "backdropPark": "#183F52",
282
+ "backdropWater": "#1E3175",
283
+ "backdropWaterEdge": "#2A3F8A",
280
284
  "background": "#14215A",
281
285
  "grid": "#1C2D74",
282
286
  "muted": "#8F9BD0",
@@ -288,6 +292,10 @@ export const tokens = {
288
292
  "zoneOpacity": 0.22
289
293
  },
290
294
  "light": {
295
+ "backdropCredit": "#5A6385",
296
+ "backdropPark": "#D4F2DF",
297
+ "backdropWater": "#C9D8FF",
298
+ "backdropWaterEdge": "#B5C7F5",
291
299
  "background": "#EEF2FF",
292
300
  "grid": "#E0E7FB",
293
301
  "muted": "#5B6694",