@nurix/etna 0.18.18 → 0.18.20
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/data/harness-index.json +1 -1
- package/data/harnesses/code/harness.json +2 -2
- package/data/harnesses/code/rules/general.md +2 -1
- package/data/harnesses/code/skills/design/SKILL.md +65 -0
- package/data/harnesses/code/skills/design/data/catalog/rules.csv +132 -0
- package/data/harnesses/code/skills/design/data/design-md/SCHEMA.md +317 -0
- package/data/harnesses/code/skills/design/data/design-md/library/airbnb.md +235 -0
- package/data/harnesses/code/skills/design/data/design-md/library/airtable.md +232 -0
- package/data/harnesses/code/skills/design/data/design-md/library/anthropic-claude.md +220 -0
- package/data/harnesses/code/skills/design/data/design-md/library/apple.md +220 -0
- package/data/harnesses/code/skills/design/data/design-md/library/binance.md +223 -0
- package/data/harnesses/code/skills/design/data/design-md/library/bmw.md +219 -0
- package/data/harnesses/code/skills/design/data/design-md/library/cal.md +220 -0
- package/data/harnesses/code/skills/design/data/design-md/library/clay.md +220 -0
- package/data/harnesses/code/skills/design/data/design-md/library/clickhouse.md +220 -0
- package/data/harnesses/code/skills/design/data/design-md/library/cohere.md +227 -0
- package/data/harnesses/code/skills/design/data/design-md/library/coinbase.md +237 -0
- package/data/harnesses/code/skills/design/data/design-md/library/composio.md +220 -0
- package/data/harnesses/code/skills/design/data/design-md/library/cursor.md +220 -0
- package/data/harnesses/code/skills/design/data/design-md/library/elevenlabs.md +220 -0
- package/data/harnesses/code/skills/design/data/design-md/library/expo.md +228 -0
- package/data/harnesses/code/skills/design/data/design-md/library/figma.md +221 -0
- package/data/harnesses/code/skills/design/data/design-md/library/framer.md +236 -0
- package/data/harnesses/code/skills/design/data/design-md/library/hashicorp.md +220 -0
- package/data/harnesses/code/skills/design/data/design-md/library/ibm.md +234 -0
- package/data/harnesses/code/skills/design/data/design-md/library/intercom.md +240 -0
- package/data/harnesses/code/skills/design/data/design-md/library/kraken.md +236 -0
- package/data/harnesses/code/skills/design/data/design-md/library/linear-app.md +237 -0
- package/data/harnesses/code/skills/design/data/design-md/library/lovable.md +220 -0
- package/data/harnesses/code/skills/design/data/design-md/library/meta.md +220 -0
- package/data/harnesses/code/skills/design/data/design-md/library/minimax.md +220 -0
- package/data/harnesses/code/skills/design/data/design-md/library/mintlify.md +220 -0
- package/data/harnesses/code/skills/design/data/design-md/library/miro.md +233 -0
- package/data/harnesses/code/skills/design/data/design-md/library/mistral-ai.md +220 -0
- package/data/harnesses/code/skills/design/data/design-md/library/mongodb.md +236 -0
- package/data/harnesses/code/skills/design/data/design-md/library/notion.md +220 -0
- package/data/harnesses/code/skills/design/data/design-md/library/nvidia.md +222 -0
- package/data/harnesses/code/skills/design/data/design-md/library/ollama.md +226 -0
- package/data/harnesses/code/skills/design/data/design-md/library/opencode-ai.md +223 -0
- package/data/harnesses/code/skills/design/data/design-md/library/posthog.md +234 -0
- package/data/harnesses/code/skills/design/data/design-md/library/raycast.md +220 -0
- package/data/harnesses/code/skills/design/data/design-md/library/replicate.md +220 -0
- package/data/harnesses/code/skills/design/data/design-md/library/resend.md +285 -0
- package/data/harnesses/code/skills/design/data/design-md/library/revolut.md +225 -0
- package/data/harnesses/code/skills/design/data/design-md/library/runwayml.md +219 -0
- package/data/harnesses/code/skills/design/data/design-md/library/sanity.md +251 -0
- package/data/harnesses/code/skills/design/data/design-md/library/sentry.md +244 -0
- package/data/harnesses/code/skills/design/data/design-md/library/shopify.md +227 -0
- package/data/harnesses/code/skills/design/data/design-md/library/slack.md +240 -0
- package/data/harnesses/code/skills/design/data/design-md/library/spacex.md +252 -0
- package/data/harnesses/code/skills/design/data/design-md/library/spotify.md +248 -0
- package/data/harnesses/code/skills/design/data/design-md/library/stripe.md +241 -0
- package/data/harnesses/code/skills/design/data/design-md/library/supabase.md +255 -0
- package/data/harnesses/code/skills/design/data/design-md/library/superhuman.md +226 -0
- package/data/harnesses/code/skills/design/data/design-md/library/tesla.md +233 -0
- package/data/harnesses/code/skills/design/data/design-md/library/theverge.md +248 -0
- package/data/harnesses/code/skills/design/data/design-md/library/together-ai.md +220 -0
- package/data/harnesses/code/skills/design/data/design-md/library/uber.md +220 -0
- package/data/harnesses/code/skills/design/data/design-md/library/vercel.md +220 -0
- package/data/harnesses/code/skills/design/data/design-md/library/voltagent.md +245 -0
- package/data/harnesses/code/skills/design/data/design-md/library/warp.md +220 -0
- package/data/harnesses/code/skills/design/data/design-md/library/webflow.md +220 -0
- package/data/harnesses/code/skills/design/data/design-md/library/wired.md +220 -0
- package/data/harnesses/code/skills/design/data/design-md/library/wise.md +220 -0
- package/data/harnesses/code/skills/design/data/design-md/library/x-ai.md +220 -0
- package/data/harnesses/code/skills/design/data/design-md/library/zapier.md +238 -0
- package/data/harnesses/code/skills/design/data/design-md/nurix.md +217 -0
- package/data/harnesses/code/skills/design/data/operator-pack/exemplars/command-center.tsx +249 -0
- package/data/harnesses/code/skills/design/data/operator-pack/exemplars/create-edit.tsx +249 -0
- package/data/harnesses/code/skills/design/data/operator-pack/exemplars/dashboard.tsx +248 -0
- package/data/harnesses/code/skills/design/data/operator-pack/exemplars/entity-detail.tsx +245 -0
- package/data/harnesses/code/skills/design/data/operator-pack/exemplars/list-detail.tsx +223 -0
- package/data/harnesses/code/skills/design/data/operator-pack/exemplars/log-stream.tsx +249 -0
- package/data/harnesses/code/skills/design/data/operator-pack/fixtures.md +88 -0
- package/data/harnesses/code/skills/design/data/operator-pack/surface-catalog.md +132 -0
- package/data/harnesses/code/skills/design/data/operator-pack/trust-rubric.md +76 -0
- package/data/harnesses/code/skills/design/references/create.md +126 -0
- package/data/harnesses/code/skills/design/references/diagnosis.md +108 -0
- package/data/harnesses/code/skills/design/references/hard-rules.md +155 -0
- package/data/harnesses/code/skills/design/references/improve.md +85 -0
- package/data/harnesses/code/skills/design/references/interaction.md +77 -0
- package/data/harnesses/code/skills/design/references/introspect.md +100 -0
- package/data/harnesses/code/skills/design/references/lifecycle.md +73 -0
- package/data/harnesses/code/skills/design/references/personality.md +504 -0
- package/data/harnesses/code/skills/design/references/structure.md +138 -0
- package/data/harnesses/code/skills/design/scripts/derive-personality.mjs +706 -0
- package/data/harnesses/code/skills/design/scripts/detector.mjs +898 -0
- package/data/harnesses/code/skills/design/scripts/generate-fixtures.mjs +551 -0
- package/data/harnesses/code/skills/design/scripts/hook-config.json +11 -0
- package/data/harnesses/code/skills/design/scripts/phase-gate.mjs +386 -0
- package/data/harnesses/code/skills/design/scripts/preship-sweep.mjs +280 -0
- package/data/harnesses/code/skills/design/scripts/render-rung.mjs +690 -0
- package/data/harnesses/code/skills/design/scripts/scaffold.mjs +552 -0
- package/data/harnesses/code/skills/design/scripts/self-integrity.mjs +432 -0
- package/data/harnesses/etna/CLAUDE.md +1 -1
- package/data/harnesses/etna/harness.json +2 -2
- package/data/harnesses/etna/rules/general.md +2 -1
- package/data/harnesses/mobile/harness.json +2 -2
- package/data/harnesses/mobile/rules/general.md +2 -1
- package/package.json +1 -1
|
@@ -0,0 +1,220 @@
|
|
|
1
|
+
---
|
|
2
|
+
schema: design-md/v1
|
|
3
|
+
product: Vercel
|
|
4
|
+
provenance: library
|
|
5
|
+
sourced: 2026-07-04
|
|
6
|
+
---
|
|
7
|
+
|
|
8
|
+
# Vercel — stark ink-on-near-white developer-platform operator design
|
|
9
|
+
|
|
10
|
+
The operator reading of Vercel's design language. Vercel's own surface is a marketing deck for
|
|
11
|
+
engineers — a near-white canvas broken at hero scale by a multi-stop mesh gradient (cyan / blue /
|
|
12
|
+
magenta / amber) that is the entire decoration system. This entry keeps what survives at operator
|
|
13
|
+
scale: the stark ink-on-near-white palette, the deliberate gray ramp, the two-tone canvas, the Geist
|
|
14
|
+
type voice (via Inter), negative heading tracking, the 6px radius, and the calm stacked-shadow-plus-
|
|
15
|
+
hairline elevation. The mesh gradient, the pill CTA, the hero display, and the dark bands stay behind.
|
|
16
|
+
|
|
17
|
+
## 1 Visual Theme
|
|
18
|
+
|
|
19
|
+
Light by default; dark is opt-in. The system is achromatic to its core — ink `foreground` `#171717`
|
|
20
|
+
on a two-tone near-white field: the page body is `#fafafa` (98% white) and cards sit on pure white
|
|
21
|
+
`#ffffff`, separated by a `#ebebeb` hairline, not by brightness. Flat: hierarchy is carried by the
|
|
22
|
+
gray ramp, hairline `border`, and type weight — never heavy shadow. The single accent is the ink
|
|
23
|
+
itself — Vercel's primary action is a **black button** (`primary` `#171717` on white); one chromatic
|
|
24
|
+
hue, link/focus blue `#0070f3`, is reserved for interaction. Density is `standard`; the anchor surface
|
|
25
|
+
is a white canvas beside a faintly-tinted `sidebar`.
|
|
26
|
+
|
|
27
|
+
## 2 Color Roles
|
|
28
|
+
|
|
29
|
+
Light values (the manifest carries hex — the corpus's native format). The identity is monochrome —
|
|
30
|
+
ink + a deliberate gray ramp; the one chromatic accent is the interaction blue, and status speaks status.
|
|
31
|
+
|
|
32
|
+
| Role | Value | Allowed where |
|
|
33
|
+
| --- | --- | --- |
|
|
34
|
+
| `background` | near-white `#fafafa` | the page body — 98% white, the dominant field |
|
|
35
|
+
| `card` / `popover` | pure white `#ffffff` | cards, panels, and overlays — set off the body by a hairline, not brightness |
|
|
36
|
+
| `foreground` | ink `#171717` | all primary ink and headlines |
|
|
37
|
+
| `muted` / `secondary` | canvas-soft-2 `#f5f5f5` | hover rows, inset regions, secondary button fills |
|
|
38
|
+
| `muted-foreground` | gray `#666666` | labels, captions, secondary text |
|
|
39
|
+
| `border` / `input` | hairline `#ebebeb` | every separator, grid line, and field edge |
|
|
40
|
+
| `primary` | ink `#171717` | the one primary action — the black button; active nav indicator |
|
|
41
|
+
| `accent` | canvas-soft-2 `#f5f5f5` | selected / hovered rows and nav — a neutral gray wash, never coloured |
|
|
42
|
+
| `ring` | interaction blue `#0070f3` | the focus outline — the one chromatic hue, unmistakable and keyboard-first |
|
|
43
|
+
| `destructive` | red `#ee0000` | destructive actions and error state only |
|
|
44
|
+
| `success` / `warning` | green `#16a34a` / amber `#f5a623` | status signalling only, never chrome |
|
|
45
|
+
|
|
46
|
+
The mesh gradient (cyan `#50e3c2`, violet `#7928ca`, pink `#ff0080`, amber) is a hero-only marketing
|
|
47
|
+
object with no operator role (see §7); its hues survive only as chart series.
|
|
48
|
+
|
|
49
|
+
## 3 Typography
|
|
50
|
+
|
|
51
|
+
One sans, one mono, single continuous voice. `font-sans` is **Geist** — the brand's custom geometric
|
|
52
|
+
face — with **Inter** the corpus-named open substitute (`Geist, Inter, system-ui, sans-serif`); it
|
|
53
|
+
carries display, body, button, and label. `font-mono` is Geist Mono (JetBrains Mono the substitute)
|
|
54
|
+
for IDs, codes, timestamps, terminal mockups, and technical eyebrows. Numeric columns render `tabular-nums`.
|
|
55
|
+
|
|
56
|
+
| Step | Role | Size · line | Weight · tracking |
|
|
57
|
+
| --- | --- | --- | --- |
|
|
58
|
+
| h1 | page title | 24px / 1.3 | `font-weight-strong` · `heading-tracking` |
|
|
59
|
+
| h2 | section head | 20px / 1.4 | `font-weight-strong` · `heading-tracking` |
|
|
60
|
+
| h3 | card / group head | 16px / 1.5 | `font-weight-strong` · -0.01em |
|
|
61
|
+
| body | UI + prose | 14px / 1.45 | `font-weight-normal` · -0.28px |
|
|
62
|
+
| small | labels, meta, dense table | 13px / 1.4 | `font-weight-normal` |
|
|
63
|
+
| eyebrow | technical label, section eyebrow | 12px / 1.35 | `font-weight-normal`, mono |
|
|
64
|
+
| code | IDs, logs, command snippets | 13px / 1.5 | `font-weight-normal`, mono |
|
|
65
|
+
|
|
66
|
+
Weight 600 is the display ceiling — the sans never reaches 700, and the brand reads calm for it. Bump
|
|
67
|
+
weight to emphasise, never size. Negative tracking is the voice (hero -0.05em stays behind; headings hold -0.03em).
|
|
68
|
+
|
|
69
|
+
## 4 Component Stylings
|
|
70
|
+
|
|
71
|
+
Every recurring operator component composes from the primitives — no literal values.
|
|
72
|
+
|
|
73
|
+
- **Button** — `primary`: filled ink on `primary-foreground`, `radius` 6px, no pill — the black button
|
|
74
|
+
is the signature, kept square. Secondary: white `card` fill, 1px `border`. Ghost: `accent` on hover.
|
|
75
|
+
- **Input** — `background` fill, 1px `border`, `radius`; focus draws the blue `ring` at 2px, no glow (field 40px).
|
|
76
|
+
- **Card** — pure white `card` on a 1px `border`, `radius`; a faint stacked shadow plus inset-hairline ring only when lifted.
|
|
77
|
+
- **Table row** — height `table-row-height`; `border` grid; `muted` on hover; selection tints `accent`; `tabular-nums` on numerics.
|
|
78
|
+
- **Side panel** — detail and edit open in the panel (`side-panel-width`, `side-panel-width-rich`), beside the work, not over it.
|
|
79
|
+
- **Badge** — hairline `border`, `muted`/status fill; status uses `success` / `warning` / `destructive`, never `primary`.
|
|
80
|
+
|
|
81
|
+
## 5 Layout
|
|
82
|
+
|
|
83
|
+
Base spacing unit 4px (corpus `--geist-space`); the on-scale ramp is `2 · 4 · 8 · 12 · 16 · 24 · 32 ·
|
|
84
|
+
48 · 64` — the marketing 96 / 128 / 192px section rhythm stays behind. Shell dimensions map one-to-one
|
|
85
|
+
to the layout primitives: sidebar `sidebar-width-expanded` (256px) / `sidebar-width-collapsed` (56px),
|
|
86
|
+
topbar `topbar-height` (64px, the corpus nav height), side panel `side-panel-width` (440px) /
|
|
87
|
+
`side-panel-width-rich` (640px), modal `modal-width-max`, forms `form-max-width`, tables full-width.
|
|
88
|
+
The page reads engineered — large gaps between regions, tight interior stacks. Density is governed by
|
|
89
|
+
`density-tier`, stepped per archetype by the surface catalog, never by absolute overrides.
|
|
90
|
+
|
|
91
|
+
## 6 Depth
|
|
92
|
+
|
|
93
|
+
Flat, calm, achromatic. Rank comes from the gray ladder and hairlines, never a heavy drop:
|
|
94
|
+
|
|
95
|
+
- **0 — canvas** `background` (`#fafafa`), no border.
|
|
96
|
+
- **1 — card / panel** pure white `card` set off the body by a 1px `border` + inset hairline ring.
|
|
97
|
+
- **2 — overlay** `popover` / side panel / modal — the one place `shadow-intensity` earns a soft
|
|
98
|
+
stacked `md` shadow, kept subtle (corpus elevation rides 4–12% black, never a single 8px blur).
|
|
99
|
+
|
|
100
|
+
Focus is a 2px blue `ring` outline (never a glow) on every interactive element — the one place a
|
|
101
|
+
chromatic hue appears, because the achromatic ink would vanish on the black button. Three z-levels: content, sticky chrome, overlay.
|
|
102
|
+
|
|
103
|
+
## 7 Do's & Don'ts
|
|
104
|
+
|
|
105
|
+
- **Do** anchor on the two-tone near-white field — `#fafafa` page, `#ffffff` cards, set off by a hairline.
|
|
106
|
+
- **Do** make the primary action a square black button (`primary` ink, `radius` 6px); it is the brand.
|
|
107
|
+
- **Do** carry hierarchy with the gray ramp, hairlines, and type weight — the system is flat.
|
|
108
|
+
- **Do** set every ID, code, timestamp, and technical eyebrow in `font-mono`; mono is the platform's voice.
|
|
109
|
+
- **Don't** introduce a second chromatic accent — the interaction blue is focus and links only.
|
|
110
|
+
- **Don't** render the CTA as a 100px pill or mix pill with 6px radii — pick the 6px in-app scale and hold it.
|
|
111
|
+
- **Don't** bring the mesh gradient in at all — it is a hero-scale object, never an icon or a swatch.
|
|
112
|
+
- **Don't** promote the geometric sans past weight 600, set body in mono, or signal elevation with a heavy drop.
|
|
113
|
+
|
|
114
|
+
## 8 Responsive
|
|
115
|
+
|
|
116
|
+
The operator sweep is 375 / 768 / 1024 / 1440.
|
|
117
|
+
|
|
118
|
+
| Breakpoint | What changes |
|
|
119
|
+
| --- | --- |
|
|
120
|
+
| 375 | sidebar → off-canvas drawer; two-pane list+detail stacks; side panel → full sheet; density holds |
|
|
121
|
+
| 768 | sidebar collapses to the icon rail (`sidebar-width-collapsed`); tables scroll their overflow; nav → hamburger |
|
|
122
|
+
| 1024 | sidebar expands; two-pane queue+detail holds side by side |
|
|
123
|
+
| 1440 | forms cap at `form-max-width`; tables and dashboards use the full width |
|
|
124
|
+
|
|
125
|
+
Code and terminal panels keep mono legibility at every breakpoint by scrolling horizontally, not wrapping.
|
|
126
|
+
|
|
127
|
+
## 9 Agent Prompt Guide
|
|
128
|
+
|
|
129
|
+
Directives the emitting agent follows verbatim:
|
|
130
|
+
|
|
131
|
+
- Anchor on the two-tone near-white field — `#fafafa` page, white cards set off by a hairline; never
|
|
132
|
+
pure-white everywhere, never a coloured page.
|
|
133
|
+
- Make the one primary action a square black button; accent nothing else. Reserve the interaction blue
|
|
134
|
+
`#0070f3` for the focus `ring` and inline links only — never a fill, never a second accent.
|
|
135
|
+
- Set page titles in the geometric sans with negative tracking (never past weight 600); set every ID,
|
|
136
|
+
code, timestamp, and technical eyebrow in `font-mono`; every numeric column is `tabular-nums`.
|
|
137
|
+
- Carry depth with the gray ladder, hairlines, and the inset-hairline card ring — past a hairline only
|
|
138
|
+
for a real overlay. Every workflow completes from the keyboard; the blue `ring` is always visible.
|
|
139
|
+
- Leave marketing behind entirely: the mesh gradient, the 100px pill CTA, the 48px hero display, the
|
|
140
|
+
dark bands, and the 96 / 128 / 192px section rhythm.
|
|
141
|
+
|
|
142
|
+
```yaml design-primitives
|
|
143
|
+
radius: 6px # corpus: --geist-radius (6px) is the in-app base for buttons/inputs/menus; the 100px marketing pill stays behind
|
|
144
|
+
shadow-intensity: 0.3 # derived: corpus elevation is exceptionally subtle — stacked small offsets at 4–12% black + an inset hairline ring
|
|
145
|
+
border-weight: 1px
|
|
146
|
+
density-gap: 1
|
|
147
|
+
density-inset: 1
|
|
148
|
+
font-sans: Geist, Inter, system-ui, -apple-system, sans-serif # corpus: Geist is the brand face; Inter is the named open substitute
|
|
149
|
+
font-mono: Geist Mono, JetBrains Mono, ui-monospace, SFMono-Regular, monospace # corpus: Geist Mono for technical layer; JetBrains Mono the named substitute
|
|
150
|
+
font-weight-normal: 400
|
|
151
|
+
font-weight-strong: 600 # corpus: weight 600 is the display ceiling; the brand never reaches 700
|
|
152
|
+
heading-tracking: -0.03em # corpus: aggressive negative display tracking (-0.04em at 24px display-md) scaled to operator headings; the -0.05em hero tracking stays behind
|
|
153
|
+
duration-unit: 50ms # derived: corpus silent on motion; snappy operator base — Vercel's UI reads crisp and fast
|
|
154
|
+
duration-fast: 100ms # derived: corpus silent on motion
|
|
155
|
+
duration-normal: 150ms # derived: functional transition default
|
|
156
|
+
duration-slow: 200ms # derived: kept short — crisp, not cinematic
|
|
157
|
+
ease-default: cubic-bezier(0.4,0,0.2,1) # derived: corpus silent on easing; standard crisp ease
|
|
158
|
+
contrast-boost: 1 # derived: the deliberate gray ramp gives clear hairlines; no boost needed
|
|
159
|
+
icon-stroke: 1.5 # derived: the Geist icon set is fine and geometric; below lucide's default 2 for a refined stroke
|
|
160
|
+
icon-size-base: 16px
|
|
161
|
+
sidebar-width-expanded: 256px # derived: corpus has no operator shell; Vercel dashboard left-nav proportion
|
|
162
|
+
sidebar-width-collapsed: 56px # derived: icon-rail width
|
|
163
|
+
topbar-height: 64px # corpus: nav-bar height (--header-height) is 64px
|
|
164
|
+
side-panel-width: 440px # derived: corpus has no operator shell; detail-panel proportion
|
|
165
|
+
side-panel-width-rich: 640px # derived: content-heavy detail width (corpus content column family)
|
|
166
|
+
modal-width-max: 560px # derived: confirmation-dialog cap
|
|
167
|
+
form-max-width: 640px # derived: readable single-column form width
|
|
168
|
+
table-row-height: 44px # derived: corpus field height is 40px; rows breathe a hair over the dense default at standard density
|
|
169
|
+
verbosity: default # derived: Vercel's product chrome is clean but labelled, not terse-expert
|
|
170
|
+
feedback: subtle # derived: understated, functional feedback matches the calm system
|
|
171
|
+
density-tier: standard # derived: Vercel's product reads clean and engineered, not dense-technical; a standard operator tier
|
|
172
|
+
product-traits: [dev-tools, deployment-dashboard, platform-console, admin]
|
|
173
|
+
```
|
|
174
|
+
|
|
175
|
+
```yaml lever-manifest
|
|
176
|
+
version: 1
|
|
177
|
+
fonts: { sans: "Geist, Inter, system-ui, -apple-system, sans-serif", mono: "Geist Mono, JetBrains Mono, ui-monospace, SFMono-Regular, monospace" }
|
|
178
|
+
color-tokens:
|
|
179
|
+
light:
|
|
180
|
+
background: "#fafafa" # corpus canvas-soft — the 98% white page body
|
|
181
|
+
foreground: "#171717" # corpus ink
|
|
182
|
+
card: "#ffffff" # corpus canvas — pure white cards
|
|
183
|
+
card-foreground: "#171717"
|
|
184
|
+
muted: "#f5f5f5" # corpus canvas-soft-2 — inset / hover surface
|
|
185
|
+
muted-foreground: "#666666" # derived: Vercel gray ramp mid-tone (between body #4d4d4d and mute #888888) for the label/caption role, readable on white
|
|
186
|
+
border: "#ebebeb" # corpus hairline
|
|
187
|
+
input: "#ebebeb" # corpus hairline — form-input border
|
|
188
|
+
ring: "#0070f3" # corpus link/interactive blue; Vercel's real focus ring is blue, and the achromatic ink would vanish on the black button
|
|
189
|
+
primary: "#171717" # corpus ink — the single black-button CTA
|
|
190
|
+
primary-foreground: "#ffffff" # corpus on-primary
|
|
191
|
+
accent: "#f5f5f5" # corpus canvas-soft-2 — neutral selected/hover wash; monochrome selection is the signature
|
|
192
|
+
accent-foreground: "#171717"
|
|
193
|
+
destructive: "#ee0000" # corpus error
|
|
194
|
+
destructive-foreground: "#ffffff" # corpus on-primary (white on the red)
|
|
195
|
+
success: "#16a34a" # derived: Vercel's full system scale includes a green (corpus notes the 100–1000 green ramp); success reads green so status stays distinct from the interaction blue #0070f3
|
|
196
|
+
warning: "#f5a623" # corpus warning amber
|
|
197
|
+
popover: "#ffffff" # corpus canvas — crisp white overlay lifted by the inset hairline + soft stacked shadow
|
|
198
|
+
popover-foreground: "#171717"
|
|
199
|
+
secondary: "#f5f5f5" # corpus canvas-soft-2 — secondary button / soft surface fill
|
|
200
|
+
secondary-foreground: "#171717"
|
|
201
|
+
chart-1: "#0070f3" # corpus link blue
|
|
202
|
+
chart-2: "#7928ca" # corpus violet
|
|
203
|
+
chart-3: "#50e3c2" # corpus cyan
|
|
204
|
+
chart-4: "#f5a623" # corpus amber
|
|
205
|
+
chart-5: "#ff0080" # corpus highlight pink — the brand accent hues repurposed as categorical series
|
|
206
|
+
sidebar: "#fafafa" # corpus canvas-soft — a faint tint distinct from the white content canvas, a hairline above the page
|
|
207
|
+
sidebar-foreground: "#171717"
|
|
208
|
+
sidebar-primary: "#171717" # corpus: app-shell active nav uses the ink primary as the indicator
|
|
209
|
+
sidebar-primary-foreground: "#ffffff"
|
|
210
|
+
sidebar-accent: "#f5f5f5" # corpus canvas-soft-2 — selected nav-row wash
|
|
211
|
+
sidebar-accent-foreground: "#171717"
|
|
212
|
+
sidebar-border: "#ebebeb" # corpus hairline
|
|
213
|
+
sidebar-ring: "#0070f3"
|
|
214
|
+
spacing-scale: [2, 4, 8, 12, 16, 24, 32, 48, 64]
|
|
215
|
+
radius-scale: [0, 4, 6, 8, 12, 16, 9999]
|
|
216
|
+
shadow-levels: [none, sm, md]
|
|
217
|
+
motion: { durations: [100, 150, 200], easings: ["cubic-bezier(0.4,0,0.2,1)"] }
|
|
218
|
+
icons: { family: lucide, stroke: 1.5 }
|
|
219
|
+
accent-count: 1
|
|
220
|
+
```
|
|
@@ -0,0 +1,245 @@
|
|
|
1
|
+
---
|
|
2
|
+
schema: design-md/v1
|
|
3
|
+
product: VoltAgent
|
|
4
|
+
provenance: library
|
|
5
|
+
sourced: 2026-07-04
|
|
6
|
+
---
|
|
7
|
+
|
|
8
|
+
# VoltAgent — near-black electric-green developer-console operator design
|
|
9
|
+
|
|
10
|
+
The *operator* reading of VoltAgent — a near-black IDE dressed as a documentation site: an unrelenting `#101010`
|
|
11
|
+
canvas with no light counterpart, one electric-green accent, hairline-bordered cards, code-editor mockups.
|
|
12
|
+
**Categorically dark**, like the source: dark is the signature, a valued light daytime mode ships alongside. What
|
|
13
|
+
carries — the near-black canvas, the single accent held scarce, hairline-only flat depth, Inter + SF Mono, the 6px
|
|
14
|
+
radius, near-black text on green (never white); what stays behind — the 60px hero, the code-editor mockups, the 48px
|
|
15
|
+
band rhythm, the green divider band. One green does everything, so `success` is the brand's own deeper emerald
|
|
16
|
+
`#10b981` (its inline-link green), never the accent. Both blocks are fully valued; judgments annotated `# derived:`
|
|
17
|
+
where the corpus is silent, `# corpus:` where it states the value.
|
|
18
|
+
|
|
19
|
+
## 1 Visual Theme
|
|
20
|
+
|
|
21
|
+
Dark by default; light is the opt-in daytime mode. The UI floats on the near-black canvas `background` (`#101010`) —
|
|
22
|
+
no gradient, no glow, no illustration, just the surface and its hairlines. Emphatically flat: hierarchy comes from
|
|
23
|
+
1px `border` hairlines, type weight, and the off-white/near-black contrast, never a drop shadow (only true overlays
|
|
24
|
+
lift). A single accent, electric-green `primary` (`#00d992`), is reserved for the one primary action, live-status
|
|
25
|
+
indicators, the active-nav mark, and the focus `ring`; ink is a strain-reducing off-white `foreground` (`#f2f2f2`).
|
|
26
|
+
Density is `standard`, dense-capable from the engineered-documentation heritage, stepping denser per archetype. The
|
|
27
|
+
anchor surface is the near-black canvas beside a hair-darker `sidebar`, separated by a hairline, not a band.
|
|
28
|
+
|
|
29
|
+
## 2 Color Roles
|
|
30
|
+
|
|
31
|
+
The signature is dark; both themes are valued (light listed first in the manifest). One chromatic
|
|
32
|
+
accent — `primary` is the only hue that carries the primary-action meaning; status hues speak only
|
|
33
|
+
status; the deeper emerald `success` is deliberately not the accent green.
|
|
34
|
+
|
|
35
|
+
| Role | Light (daytime) | Dark (signature) | Allowed where |
|
|
36
|
+
| --- | --- | --- | --- |
|
|
37
|
+
| `background` / `card` | `#ffffff` / `#ffffff` | `#101010` / `#1a1a1a` | page canvas; panels a hairline above it |
|
|
38
|
+
| `foreground` | `#101010` | `#f2f2f2` | all primary ink (off-white on dark to ease strain) |
|
|
39
|
+
| `muted` / `secondary` | `#f4f4f5` | `#242424` | hover rows, quiet fills, secondary-button fill |
|
|
40
|
+
| `muted-foreground` | `#6b7280` | `#8b949e` | labels, captions, secondary text |
|
|
41
|
+
| `border` / `input` | `#e4e4e7` | `#3d3a39` | every separator, grid line, and field edge |
|
|
42
|
+
| `primary` | `#00d992` | `#00d992` | the one primary action; live indicators; active nav; `ring` |
|
|
43
|
+
| `primary-foreground` | `#101010` | `#101010` | text on the green — near-black, never white (brand mandate) |
|
|
44
|
+
| `accent` | `#ececed` | `#2e2e2e` | selected / hovered rows and nav — a neutral surface lift, never green |
|
|
45
|
+
| `ring` | `#00d992` | `#00d992` | the focus outline — unmistakable, because keyboard-first |
|
|
46
|
+
| `destructive` | `#dc2626` | `#f04438` | destructive actions and error state only |
|
|
47
|
+
| `success` / `warning` | `#10b981` / `#d97706` | `#10b981` / `#f59e0b` | status only, never chrome; `success` is the deeper emerald, not the accent |
|
|
48
|
+
|
|
49
|
+
## 3 Typography
|
|
50
|
+
|
|
51
|
+
Two faces. `font-sans` is Inter (weights 400 / 500 / 600 / 700) — display, body, UI, button, and every uppercase
|
|
52
|
+
eyebrow ride it; a second family never does the label work. `font-mono` is SF Mono (`SFMono-Regular` with Menlo /
|
|
53
|
+
Monaco / Consolas fallbacks; JetBrains Mono or Geist Mono the free substitutes) for IDs, codes, timestamps, log
|
|
54
|
+
lines, and metric counters; numeric columns render `tabular-nums`. The signature label is the **uppercase Inter
|
|
55
|
+
eyebrow with wide positive tracking** (`+0.18em`, the source's `2.52px` at `14px`) — the brand's one flourish.
|
|
56
|
+
|
|
57
|
+
| Step | Role | Size · line | Weight · tracking |
|
|
58
|
+
| --- | --- | --- | --- |
|
|
59
|
+
| h1 | page title | 24px / 1.35 | `font-weight-strong` (600) · `heading-tracking` |
|
|
60
|
+
| h2 | section head | 20px / 1.4 | `font-weight-strong` (600) · `heading-tracking` |
|
|
61
|
+
| h3 | card / group head | 16px / 1.5 | `font-weight-strong` (600) · 0 |
|
|
62
|
+
| body | UI + prose | 14px / 1.45 | `font-weight-normal` (400) |
|
|
63
|
+
| small | labels, meta, dense table | 13px / 1.4 | `font-weight-normal` |
|
|
64
|
+
| caption | uppercase eyebrow | 12px / 1.3 | `font-weight-strong`, `+0.18em`, uppercase |
|
|
65
|
+
| code | IDs, logs, amounts | mono 13px / 1.4 | `font-weight-normal` |
|
|
66
|
+
|
|
67
|
+
The calm 60px/400 hero display stays behind — operator headings top out at a 24px title, emphasized by
|
|
68
|
+
weight, never by a heavier display.
|
|
69
|
+
|
|
70
|
+
## 4 Component Stylings
|
|
71
|
+
|
|
72
|
+
Every recurring operator component composes from the primitives — no literal values.
|
|
73
|
+
|
|
74
|
+
- **Button** — primary: filled green `primary` on near-black `primary-foreground`, `radius` (6px), never a pill. Secondary: `card` fill, 1px `border`, `foreground`. Ghost: transparent, green `primary` label (the one place a green *label* is allowed), `accent` on hover.
|
|
75
|
+
- **Input** — `muted` fill on dark, `background` fill on light; 1px `border` (`border-weight`), `radius`; focus draws the green `ring` at full 2px, no glow.
|
|
76
|
+
- **Card** — `card` surface on a 1px `border`; the hairline carries the edge, not a shadow; inset by `density-inset`. Featured cards take a 3px `border` or a 2px `primary` green edge, never a fill.
|
|
77
|
+
- **Table row** — height `table-row-height`; `border` grid lines; `muted` on hover; `tabular-nums` on numeric columns; row selection tints `accent` (neutral, never green).
|
|
78
|
+
- **Side panel** — detail and edit open in the side panel (`side-panel-width`, `side-panel-width-rich` for content-heavy), beside the work, not over it.
|
|
79
|
+
- **Badge** — pill radius (badges only), `muted`/status fill, uppercase caption; status badges take `success` / `warning` / `destructive`, live pills take `primary`.
|
|
80
|
+
|
|
81
|
+
## 5 Layout
|
|
82
|
+
|
|
83
|
+
Base spacing unit 4px; the on-scale ramp is `2 · 4 · 8 · 12 · 16 · 24 · 32 · 48 · 64` (the marketing
|
|
84
|
+
48px band rhythm stays behind). Shell dimensions map one-to-one to the layout primitives: sidebar
|
|
85
|
+
`sidebar-width-expanded` (248px) / `sidebar-width-collapsed` (56px), topbar `topbar-height` (52px),
|
|
86
|
+
side panel `side-panel-width` (420px) / `side-panel-width-rich` (640px), modal `modal-width-max`, forms
|
|
87
|
+
`form-max-width`, tables full-width — the source has only a marketing top-nav, so these are the operator
|
|
88
|
+
standard. Density is governed globally by `density-tier` and stepped per archetype by the surface catalog.
|
|
89
|
+
|
|
90
|
+
## 6 Depth
|
|
91
|
+
|
|
92
|
+
Flat and hairline-first. Depth comes from the surface ladder and hairlines, not shadow:
|
|
93
|
+
|
|
94
|
+
- **0 — canvas** `background` (`#101010` dark / `#ffffff` light), no border.
|
|
95
|
+
- **1 — panel / card** `card` a hairline above the canvas on a 1px `border` — the source seats marketing cards directly on the canvas with only a hairline; the operator reading lifts panels one surface step so dense tables read, keeping the hairline as the primary edge.
|
|
96
|
+
- **2 — overlay** `popover` / side panel / modal — the one place `shadow-intensity` earns a soft lift; rank is border, surface, and position, never a heavier shadow.
|
|
97
|
+
|
|
98
|
+
A 2px `primary` green border marks a featured or active card; the dashed divider stays behind. Focus is a 2px green `ring` outline (never a glow) on every interactive element; three z-levels: content, sticky chrome, overlay.
|
|
99
|
+
|
|
100
|
+
## 7 Do's & Don'ts
|
|
101
|
+
|
|
102
|
+
- **Do** anchor the signature on the near-black canvas (`#101010`); ship the light daytime mode as the opt-in, never the default read.
|
|
103
|
+
- **Do** reserve electric-green `primary` for the single primary action, live indicators, the active-nav mark, and the focus `ring` — its scarcity is what reads as voltage.
|
|
104
|
+
- **Do** render code, log, and terminal surfaces in `font-mono` (SF Mono) with `tabular-nums`; carry the uppercase Inter eyebrow at `+0.18em` for section labels.
|
|
105
|
+
- **Don't** fill a decorative surface with the accent green — it is action, live-status, and the focus ring only; a green *label* is allowed only on the ghost button.
|
|
106
|
+
- **Don't** let a status green equal the accent green — `success` is the deeper emerald `#10b981`, never a CTA.
|
|
107
|
+
- **Don't** pill the primary CTA or use a radius outside `radius-scale` (buttons/inputs 6px, cards 8px; pill is badges and live tags only), and don't signal elevation with drop shadows — hairlines and the one-step surface lift carry depth.
|
|
108
|
+
|
|
109
|
+
## 8 Responsive
|
|
110
|
+
|
|
111
|
+
The operator sweep is 375 / 768 / 1024 / 1440.
|
|
112
|
+
|
|
113
|
+
| Breakpoint | What changes |
|
|
114
|
+
| --- | --- |
|
|
115
|
+
| 375 | sidebar → off-canvas drawer; two-pane list+detail stacks; side panel → full sheet; density holds |
|
|
116
|
+
| 768 | sidebar collapses to the icon rail (`sidebar-width-collapsed`); tables scroll their overflow |
|
|
117
|
+
| 1024 | sidebar expands; two-pane queue+detail holds side by side |
|
|
118
|
+
| 1440 | forms cap at `form-max-width`; tables and dashboards use the full width |
|
|
119
|
+
|
|
120
|
+
Code and log surfaces keep mono legibility by scrolling horizontally, not wrapping.
|
|
121
|
+
|
|
122
|
+
## 9 Agent Prompt Guide
|
|
123
|
+
|
|
124
|
+
Directives the emitting agent follows verbatim:
|
|
125
|
+
|
|
126
|
+
- Wear the near-black canvas as the signature; the light daytime mode is opt-in only — never make light the default for this brand. Panels sit a hairline above the canvas.
|
|
127
|
+
- Spend the electric green once per surface: the primary action, live indicators, the active-nav mark, the focus `ring`. If two things want the green, one is not primary. Never fill a decorative surface with it; text on the green is near-black (`#101010`), never white.
|
|
128
|
+
- `success` is the deeper emerald `#10b981`, never the accent green — keep status legible against a brand whose accent is already green.
|
|
129
|
+
- Render every code, log, terminal, and metric surface in `font-mono` (SF Mono); every numeric column is `tabular-nums`; every ID / code / timestamp is `font-mono`; section labels wear the uppercase Inter eyebrow at `+0.18em`.
|
|
130
|
+
- Depth is hairlines and one surface step, never shadow; reach for the overlay lift only for a true modal or popover. Detail and edit go in the side panel, never a modal. The green `ring` focus outline is always visible. Leave behind the 60px hero, the code-editor mockups, the 48px band rhythm, and the green divider.
|
|
131
|
+
|
|
132
|
+
```yaml design-primitives
|
|
133
|
+
radius: 6px # corpus: buttons/inputs at rounded.sm (6px); cards step to 8px (md); pill 9999 is badges/live-tags only
|
|
134
|
+
shadow-intensity: 0.4 # derived: brand is hairline-first with no card shadows, but its modal lift is heavy — overlays earn a real md shadow while cards stay flat
|
|
135
|
+
border-weight: 1px # corpus: 1px hairlines carry all elevation (featured cards use 3px, a variant not the base)
|
|
136
|
+
density-gap: 1 # derived: engineered-documentation feel read to an honest standard operator tier; archetypes step denser via the surface catalog
|
|
137
|
+
density-inset: 1 # derived: matches density-gap for coherent component insets
|
|
138
|
+
font-sans: Inter, system-ui, -apple-system, sans-serif # corpus: Inter carries display, body, UI, buttons, and every uppercase eyebrow
|
|
139
|
+
font-mono: SFMono-Regular, Menlo, Monaco, Consolas, monospace # corpus: SF Mono on every code/log/terminal/metric surface (JetBrains Mono or Geist Mono the free substitutes)
|
|
140
|
+
font-weight-normal: 400 # corpus: body and UI at 400
|
|
141
|
+
font-weight-strong: 600 # corpus: eyebrows, buttons, and strong body at 600 (the 700 display weight is hero-scale and stays behind)
|
|
142
|
+
heading-tracking: -0.02em # corpus: negative display tracking (-0.6px at 24px, -0.9px at 36px) is the calm engineered signature; -0.02em at operator heading scale
|
|
143
|
+
duration-unit: 50ms # derived: corpus is silent on motion; operator-standard functional base
|
|
144
|
+
duration-fast: 100ms # derived: corpus silent on motion
|
|
145
|
+
duration-normal: 150ms # derived: corpus silent on motion
|
|
146
|
+
duration-slow: 250ms # derived: corpus silent on motion; overlay/panel transition
|
|
147
|
+
ease-default: cubic-bezier(0.4,0,0.2,1) # derived: corpus silent; standard functional ease
|
|
148
|
+
contrast-boost: 1 # derived: the subtle hairline discipline on near-black is intentional; no boost
|
|
149
|
+
icon-stroke: 1.75 # derived: corpus has no icon system; a refined 1.75 stroke suits the precise engineered feel
|
|
150
|
+
icon-size-base: 16px # derived: corpus silent on icon size; operator standard
|
|
151
|
+
sidebar-width-expanded: 248px # derived: corpus has a marketing top-nav, no app-shell rail; operator standard
|
|
152
|
+
sidebar-width-collapsed: 56px # derived: standard operator icon rail
|
|
153
|
+
topbar-height: 52px # derived: corpus nav padding (12/32) reads generous; operator tightens to 52px
|
|
154
|
+
side-panel-width: 420px # derived: corpus has no shell; operator standard detail width
|
|
155
|
+
side-panel-width-rich: 640px # derived: content-heavy detail panel
|
|
156
|
+
modal-width-max: 560px # derived: corpus modal is full-bleed marketing; operator confirmation cap
|
|
157
|
+
form-max-width: 640px # derived: corpus max content ~1200-1400px is marketing; operator single-column reading caps forms at 640
|
|
158
|
+
table-row-height: 40px # derived: standard operator row; the engineered feel wants dense rows
|
|
159
|
+
verbosity: default
|
|
160
|
+
feedback: subtle # derived: brand is quiet and engineered but ships live pills and copy affordances — gentle present feedback, not austere silence
|
|
161
|
+
density-tier: standard # derived: engineered-documentation brand read to an honest operator tier; archetypes step denser, never the whole app
|
|
162
|
+
product-traits: [dev-tools, ai-agents, agent-console, dashboard, log-stream]
|
|
163
|
+
```
|
|
164
|
+
|
|
165
|
+
```yaml lever-manifest
|
|
166
|
+
version: 1
|
|
167
|
+
fonts: { sans: "Inter, system-ui, -apple-system, sans-serif", mono: "SFMono-Regular, Menlo, Monaco, Consolas, monospace" }
|
|
168
|
+
color-tokens:
|
|
169
|
+
light:
|
|
170
|
+
background: "#ffffff"
|
|
171
|
+
foreground: "#101010" # corpus: the brand near-black carries as daytime ink
|
|
172
|
+
card: "#ffffff"
|
|
173
|
+
card-foreground: "#101010"
|
|
174
|
+
muted: "#f4f4f5" # derived: neutral light fill, inverse of the near-black surface family
|
|
175
|
+
muted-foreground: "#6b7280" # derived: neutral-cool gray echoing the corpus mute #8b949e
|
|
176
|
+
border: "#e4e4e7" # derived: neutral light hairline (the dark #3d3a39 hairline inverts)
|
|
177
|
+
input: "#e4e4e7"
|
|
178
|
+
ring: "#00d992"
|
|
179
|
+
primary: "#00d992" # corpus: the single electric-green accent
|
|
180
|
+
primary-foreground: "#101010" # corpus: near-black text on green, never white
|
|
181
|
+
accent: "#ececed" # derived: neutral selection lift; never the accent green
|
|
182
|
+
accent-foreground: "#101010"
|
|
183
|
+
destructive: "#dc2626" # derived: corpus surfaces no error hue (Docusaurus default); standard operator red
|
|
184
|
+
destructive-foreground: "#ffffff"
|
|
185
|
+
success: "#10b981" # corpus: primary-deep — the deeper emerald, distinct from the electric accent green
|
|
186
|
+
warning: "#d97706" # derived: corpus has no warning hue; standard operator amber
|
|
187
|
+
popover: "#ffffff"
|
|
188
|
+
popover-foreground: "#101010"
|
|
189
|
+
secondary: "#f4f4f5"
|
|
190
|
+
secondary-foreground: "#101010"
|
|
191
|
+
chart-1: "#00d992" # corpus: brand green anchors the categorical series
|
|
192
|
+
chart-2: "#0ea5e9" # derived: sky, spread across a categorical set
|
|
193
|
+
chart-3: "#8b5cf6" # derived: violet
|
|
194
|
+
chart-4: "#f59e0b" # derived: amber
|
|
195
|
+
chart-5: "#f43f5e" # derived: rose
|
|
196
|
+
sidebar: "#fafafa" # derived: faint step below the white canvas so the rail reads as chrome
|
|
197
|
+
sidebar-foreground: "#101010"
|
|
198
|
+
sidebar-primary: "#00d992"
|
|
199
|
+
sidebar-primary-foreground: "#101010"
|
|
200
|
+
sidebar-accent: "#ececed"
|
|
201
|
+
sidebar-accent-foreground: "#101010"
|
|
202
|
+
sidebar-border: "#e4e4e7"
|
|
203
|
+
sidebar-ring: "#00d992"
|
|
204
|
+
dark:
|
|
205
|
+
background: "#101010" # corpus: canvas — the only marketing surface
|
|
206
|
+
foreground: "#f2f2f2" # corpus: ink, off-white to reduce contrast strain
|
|
207
|
+
card: "#1a1a1a" # corpus: canvas-soft — operator panel lift (marketing cards sit on the canvas + hairline; that flatness stays behind)
|
|
208
|
+
card-foreground: "#f2f2f2"
|
|
209
|
+
muted: "#242424" # derived: neutral hover/fill step above the card, reads on #1a1a1a
|
|
210
|
+
muted-foreground: "#8b949e" # corpus: mute
|
|
211
|
+
border: "#3d3a39" # corpus: hairline
|
|
212
|
+
input: "#3d3a39" # corpus: hairline field edge
|
|
213
|
+
ring: "#00d992"
|
|
214
|
+
primary: "#00d992"
|
|
215
|
+
primary-foreground: "#101010" # corpus: on-primary near-black
|
|
216
|
+
accent: "#2e2e2e" # derived: neutral selection lift above hover; never green
|
|
217
|
+
accent-foreground: "#f2f2f2"
|
|
218
|
+
destructive: "#f04438" # derived: red reads on near-black (corpus semantic is Docusaurus default)
|
|
219
|
+
destructive-foreground: "#ffffff"
|
|
220
|
+
success: "#10b981" # corpus: primary-deep emerald, distinct from the accent
|
|
221
|
+
warning: "#f59e0b" # derived: amber that reads on near-black
|
|
222
|
+
popover: "#1a1a1a" # corpus: canvas-soft — overlays match the card
|
|
223
|
+
popover-foreground: "#f2f2f2"
|
|
224
|
+
secondary: "#242424"
|
|
225
|
+
secondary-foreground: "#f2f2f2"
|
|
226
|
+
chart-1: "#00d992" # corpus: brand green anchors the series
|
|
227
|
+
chart-2: "#38bdf8" # derived: sky, reads on near-black
|
|
228
|
+
chart-3: "#a78bfa" # derived: violet
|
|
229
|
+
chart-4: "#fbbf24" # derived: amber
|
|
230
|
+
chart-5: "#fb7185" # derived: rose
|
|
231
|
+
sidebar: "#0c0c0c" # derived: one hair below the canvas so the nav rail recedes as chrome
|
|
232
|
+
sidebar-foreground: "#bdbdbd" # corpus: body — the nav-link text color
|
|
233
|
+
sidebar-primary: "#00d992"
|
|
234
|
+
sidebar-primary-foreground: "#101010"
|
|
235
|
+
sidebar-accent: "#2e2e2e"
|
|
236
|
+
sidebar-accent-foreground: "#f2f2f2"
|
|
237
|
+
sidebar-border: "#3d3a39"
|
|
238
|
+
sidebar-ring: "#00d992"
|
|
239
|
+
spacing-scale: [2, 4, 8, 12, 16, 24, 32, 48, 64]
|
|
240
|
+
radius-scale: [0, 4, 6, 8, 9999]
|
|
241
|
+
shadow-levels: [none, sm, md]
|
|
242
|
+
motion: { durations: [100, 150, 250], easings: ["cubic-bezier(0.4,0,0.2,1)"] }
|
|
243
|
+
icons: { family: lucide, stroke: 1.75 }
|
|
244
|
+
accent-count: 1
|
|
245
|
+
```
|