@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,223 @@
|
|
|
1
|
+
---
|
|
2
|
+
schema: design-md/v1
|
|
3
|
+
product: OpenCode
|
|
4
|
+
provenance: library
|
|
5
|
+
sourced: 2026-07-04
|
|
6
|
+
---
|
|
7
|
+
|
|
8
|
+
# OpenCode — the terminal-native monospace operator design
|
|
9
|
+
|
|
10
|
+
OpenCode's marketing site is a manpage rendered at modern resolution: every word sits in one monospaced
|
|
11
|
+
face on a warm cream canvas, ASCII `[+]`/`[-]` markers stand in for icons, and a single dark card mocks
|
|
12
|
+
up the OpenCode TUI. This entry is the *operator* reading of that brand — an internal tool (agent-ops
|
|
13
|
+
console, run queue, log stream, dashboard) in OpenCode's language. What carries: the warm cream canvas
|
|
14
|
+
(never pure white), near-black ink, the monospace-everywhere type voice, the sharp-container /
|
|
15
|
+
4px-interactive radius character, the single reserved Apple-Blue accent, and categorically-flat hairline
|
|
16
|
+
depth. What stays behind: the full-bleed dark hero TUI mockup, the 38px display headline, the 96px
|
|
17
|
+
section rhythm, the block-pixel ASCII wordmark, and the bracket markers used as bullets.
|
|
18
|
+
|
|
19
|
+
**Monochrome chrome, one held accent.** The chrome is ink-on-cream monochrome; the primary action is a
|
|
20
|
+
near-black ink button, not a colored one (the Vercel/Geist dialect), and Apple Blue (`#007aff`) is the
|
|
21
|
+
one chromatic accent — reserved, as the source reserves it, for interactive and data signal only. It
|
|
22
|
+
reads *light*, so the light-default floor holds. Both machine blocks are fully valued; judgments away
|
|
23
|
+
from the brand are annotated `# derived:` where the corpus is silent.
|
|
24
|
+
|
|
25
|
+
## 1 Visual Theme
|
|
26
|
+
|
|
27
|
+
Light by default; dark is opt-in. The whole UI floats on OpenCode's warm cream `background` (`#fdfcfc`)
|
|
28
|
+
— a faintly-blushed off-white, never the cool gray the category defaults to. Emphatically flat:
|
|
29
|
+
hierarchy is carried by hairline `border`, type weight, and the near-black/cream contrast — never a drop
|
|
30
|
+
shadow (the source has none; nothing lifts, nothing floats). The type voice is the identity: one
|
|
31
|
+
monospaced face carries every role (Berkeley Mono in the source, proprietary; JetBrains Mono the shipped
|
|
32
|
+
substitute) — no sans anywhere. The primary action is a near-black ink button; Apple Blue is the single
|
|
33
|
+
chromatic accent, held scarce. Density is `dense` — the surface reads like a terminal. The anchor
|
|
34
|
+
surface is a cream canvas seated beside a barely-warmer `sidebar`, separated by a hairline, not a band.
|
|
35
|
+
|
|
36
|
+
## 2 Color Roles
|
|
37
|
+
|
|
38
|
+
Light values (the manifest carries hex — the corpus's native format). One chromatic accent — Apple Blue
|
|
39
|
+
is the only hue that carries interactive meaning; the primary action is neutral ink; status speaks status.
|
|
40
|
+
|
|
41
|
+
| Role | Value | Allowed where |
|
|
42
|
+
| --- | --- | --- |
|
|
43
|
+
| `background` / `card` / `popover` | warm cream `#fdfcfc` | page, cards, and overlays — one warm off-white, no surface bands |
|
|
44
|
+
| `foreground` | near-black ink `#201d1d` | all primary ink; the primary button fill |
|
|
45
|
+
| `muted` / `secondary` | soft warm `#f8f7f7` | hover rows, subtle fills, secondary-button fill |
|
|
46
|
+
| `muted-foreground` | warm gray `#646262` | labels, captions, secondary text |
|
|
47
|
+
| `border` / `input` | warm hairline `#e0dddd` | every separator, grid line, field edge (solid form of the source's `rgba(15,0,0,0.12)`) |
|
|
48
|
+
| `primary` | near-black ink `#201d1d` | the one primary action — a dark button, never blue |
|
|
49
|
+
| `accent` | warm selection `#f1eeee` | selected / hovered rows and nav — a warm step, never blue |
|
|
50
|
+
| `ring` | `primary` ink `#201d1d` | the focus outline — an ink border, no glow (keyboard-first) |
|
|
51
|
+
| Apple Blue (the accent hue) | `#007aff` | interactive: active-nav, links, selected emphasis, `chart-1` — held scarce |
|
|
52
|
+
| `destructive` | Apple red `#ff3b30` | destructive actions and error state only |
|
|
53
|
+
| `success` / `warning` | Apple green `#30d158` / amber `#ff9f0a` | status signalling only, never chrome |
|
|
54
|
+
|
|
55
|
+
The Apple HIG semantic ramp is the brand's own; in the source it lives in the in-product TUI, and the operator surface *is* that context.
|
|
56
|
+
|
|
57
|
+
## 3 Typography
|
|
58
|
+
|
|
59
|
+
There is no sans/mono split — `font-sans` and `font-mono` are the same monospaced family (JetBrains
|
|
60
|
+
Mono, the corpus's substitute for the proprietary Berkeley Mono). One face carries body, headings,
|
|
61
|
+
labels, IDs, and every numeric column; numerals align natively (monospace figures are already tabular),
|
|
62
|
+
so `tabular-nums` is inherent. Weights are 400 / 500 / 700, and — the defining detail — tracking is `0`
|
|
63
|
+
on every role: monospace does not track. The 38px display headline stays behind; a page title tops at 24px.
|
|
64
|
+
|
|
65
|
+
| Step | Role | Size · line | Weight · tracking |
|
|
66
|
+
| --- | --- | --- | --- |
|
|
67
|
+
| h1 | page title | 24px / 1.4 | `font-weight-strong` (700) · `heading-tracking` (0) |
|
|
68
|
+
| h2 | section head | 18px / 1.4 | `font-weight-strong` (700) · 0 |
|
|
69
|
+
| h3 | card / group head | 16px / 1.4 | `font-weight-strong` (700) · 0 |
|
|
70
|
+
| body | UI + prose | 14px / 1.5 | `font-weight-normal` (400) |
|
|
71
|
+
| small | labels, meta, dense table | 13px / 1.4 | `font-weight-normal` |
|
|
72
|
+
| caption | footer, badge, eyebrow | 12px / 1.4 | 500 (medium) |
|
|
73
|
+
| code | IDs, logs, amounts | 13px / 1.5 | `font-weight-normal` |
|
|
74
|
+
|
|
75
|
+
Emphasise by stepping weight 400 → 500 → 700; never by tracking, and never by swapping the face — there
|
|
76
|
+
is no other face.
|
|
77
|
+
|
|
78
|
+
## 4 Component Stylings
|
|
79
|
+
|
|
80
|
+
Every recurring operator component composes from the primitives — no literal values.
|
|
81
|
+
|
|
82
|
+
- **Button** — primary: filled ink `primary` on cream `primary-foreground`, `radius` (4px), never a pill. Secondary: `secondary` fill, 1px `border`, `foreground`. Ghost: transparent, `accent` on hover.
|
|
83
|
+
- **Input** — `background` fill, 1px `border` (`border-weight`), `radius` (4px); focus draws the ink `ring` at 2px — a flat border, no glow.
|
|
84
|
+
- **Card** — `card` surface on a 1px `border`, **sharp corners** (containers are 0px); the hairline carries the lift, never a shadow; inset by `density-inset`.
|
|
85
|
+
- **Table row** — height `table-row-height`; `border` grid lines; `muted` on hover; numerics align natively in the mono face; selection tints `accent`, active rows mark with the blue accent.
|
|
86
|
+
- **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.
|
|
87
|
+
- **Badge** — 4px `radius`, `muted` / status fill, uppercase caption; status badges take `success` / `warning` / `destructive`, never `primary`.
|
|
88
|
+
|
|
89
|
+
## 5 Layout
|
|
90
|
+
|
|
91
|
+
Base spacing unit 8px with fine 1 / 4px steps (the source's own base); the on-scale ramp is `1 · 4 · 8 ·
|
|
92
|
+
12 · 16 · 24 · 32 · 48` — the marketing 96px section rhythm stays behind. Shell dimensions map to the
|
|
93
|
+
layout primitives: sidebar `sidebar-width-expanded` (248px) / `sidebar-width-collapsed` (56px), topbar
|
|
94
|
+
`topbar-height` (56px, the source's nav height), side panel `side-panel-width` (420px) /
|
|
95
|
+
`side-panel-width-rich` (640px), modal `modal-width-max`, forms `form-max-width`, tables full-width. The
|
|
96
|
+
grid runs tight — a terminal-native brand earns its density, governed globally by `density-tier`
|
|
97
|
+
(`dense`) and stepped per archetype by the surface catalog.
|
|
98
|
+
|
|
99
|
+
## 6 Depth
|
|
100
|
+
|
|
101
|
+
Categorically flat — the source has no drop shadows; hierarchy comes from hairlines, the surface ladder,
|
|
102
|
+
and one color inversion:
|
|
103
|
+
|
|
104
|
+
- **0 — canvas** `background`, no border.
|
|
105
|
+
- **1 — panel / card** `card` on a 1px `border`, sharp corners; the hairline alone carries the lift. Selected / hover rows warm to `accent`.
|
|
106
|
+
- **2 — overlay** `popover` / side panel / modal — a strong hairline and position carry rank; `shadow-intensity` earns only the faintest whisper to float a true overlay off the cream.
|
|
107
|
+
- **inlay — terminal / log / console** dark `#201d1d` with cream `on-dark` text, `#302c2c` elevated rows, and the mono face — the source's single dark moment (the hero TUI mockup) carried as the console inlay.
|
|
108
|
+
|
|
109
|
+
Focus is a 2px ink `ring` outline (never a glow), visible on every interactive element; three z-levels: content, sticky chrome, overlay.
|
|
110
|
+
|
|
111
|
+
## 7 Do's & Don'ts
|
|
112
|
+
|
|
113
|
+
- **Do** anchor every surface on the warm cream canvas — pure white reads as any-other-tool; the faint blush is OpenCode.
|
|
114
|
+
- **Do** render every role in the one monospaced face — body, headings, labels, and numerics alike; the single-face decision is the entire identity.
|
|
115
|
+
- **Do** keep the primary action a near-black ink button, and keep Apple Blue scarce — interactive, active-nav, links, and chart series only.
|
|
116
|
+
- **Do** keep containers sharp (0px) and interactive elements at 4px; that two-value split is the radius vocabulary.
|
|
117
|
+
- **Don't** introduce a sans-serif or a display face — there is one face, and it is monospaced.
|
|
118
|
+
- **Don't** fill the primary button blue, promote a second chromatic accent, or signal elevation with drop shadows.
|
|
119
|
+
- **Don't** open detail or edit in a modal when the side panel fits — a modal is a confirmation.
|
|
120
|
+
|
|
121
|
+
## 8 Responsive
|
|
122
|
+
|
|
123
|
+
The operator sweep is 375 / 768 / 1024 / 1440.
|
|
124
|
+
|
|
125
|
+
| Breakpoint | What changes |
|
|
126
|
+
| --- | --- |
|
|
127
|
+
| 375 | sidebar → off-canvas drawer; two-pane list+detail stacks; side panel → full sheet; density holds |
|
|
128
|
+
| 768 | sidebar collapses to the icon rail (`sidebar-width-collapsed`); tables scroll their overflow |
|
|
129
|
+
| 1024 | sidebar expands; two-pane queue+detail holds side by side |
|
|
130
|
+
| 1440 | forms cap at `form-max-width`; tables and dashboards use the full width |
|
|
131
|
+
|
|
132
|
+
Terminal, log, and console inlays keep mono legibility at every breakpoint by scrolling horizontally, never wrapping.
|
|
133
|
+
|
|
134
|
+
## 9 Agent Prompt Guide
|
|
135
|
+
|
|
136
|
+
Directives the emitting agent follows verbatim:
|
|
137
|
+
|
|
138
|
+
- Reach for the warm cream canvas first — never pure white; the faint blush is the brand. Cards are the same cream, seated by a hairline.
|
|
139
|
+
- Render every text role in the one monospaced face (JetBrains Mono) — there is no sans. Numerics align natively; no `tabular-nums` toggle is needed.
|
|
140
|
+
- Keep the primary action an ink button. Spend Apple Blue only on interactive and data signal: active-nav, links, selected emphasis, chart series. If two things want the blue, one is not primary.
|
|
141
|
+
- Keep containers sharp (0px) and interactive elements at 4px — that split is the brand's whole geometry.
|
|
142
|
+
- Depth is hairline, surface, and position — never shadow. Dress terminal, log, and console panels in the dark inlay (`#201d1d`, mono, cream text) — real console chrome, not a light mockup of it.
|
|
143
|
+
- Keyboard-first: the ink `ring` focus outline is always visible. Leave behind the dark hero TUI mockup, the 38px display, the 96px rhythm, the ASCII wordmark, and the bracket bullets — use real lucide icons.
|
|
144
|
+
|
|
145
|
+
```yaml design-primitives
|
|
146
|
+
radius: 4px # source: the single interactive radius (rounded.sm); containers stay sharp at 0
|
|
147
|
+
shadow-intensity: 0.1 # derived: source is categorically flat (no drop shadows, "nothing floats"); only a true overlay earns the faintest whisper
|
|
148
|
+
border-weight: 1px # source: 1px hairlines carry all separation
|
|
149
|
+
density-gap: 0.85 # derived: terminal-native brand reads dense; tighten the base gap
|
|
150
|
+
density-inset: 0.85 # derived: matches the dense gap on component insets
|
|
151
|
+
font-sans: JetBrains Mono, ui-monospace, SFMono-Regular, Menlo, monospace # derived: source is monospace-everywhere (Berkeley Mono, proprietary); JetBrains Mono is the documented open substitute — the sans slot carries the mono voice too
|
|
152
|
+
font-mono: JetBrains Mono, ui-monospace, SFMono-Regular, Menlo, monospace # source: one monospaced face for the whole system
|
|
153
|
+
font-weight-normal: 400 # source: body-md is 400
|
|
154
|
+
font-weight-strong: 700 # source: headings and display sit at 700 (500 is the medium step)
|
|
155
|
+
heading-tracking: 0 # source: letter-spacing is 0 on every role — monospace does not track
|
|
156
|
+
duration-unit: 50ms # derived: corpus documents no motion; operator-standard base
|
|
157
|
+
duration-fast: 100ms # derived: corpus silent on motion
|
|
158
|
+
duration-normal: 150ms # derived: corpus silent on motion
|
|
159
|
+
duration-slow: 200ms # derived: snappy, near-instant to match the austere terminal character
|
|
160
|
+
ease-default: cubic-bezier(0.4,0,0.2,1) # derived: corpus silent on easing; standard functional ease
|
|
161
|
+
contrast-boost: 1 # derived: the source's hairline is deliberately faint; hold default rather than thicken the grid
|
|
162
|
+
icon-stroke: 2 # derived: the source's icon system is bold ASCII bracket markers; for lucide, a full 2px stroke matches that blocky terminal character
|
|
163
|
+
icon-size-base: 16px # source: the body/glyph grid is 16px
|
|
164
|
+
sidebar-width-expanded: 248px # derived: marketing source has no app shell; operator-standard rail
|
|
165
|
+
sidebar-width-collapsed: 56px # derived: standard operator icon rail
|
|
166
|
+
topbar-height: 56px # source: primary-nav height ~56px
|
|
167
|
+
side-panel-width: 420px # derived: source has no shell; standard operator detail panel
|
|
168
|
+
side-panel-width-rich: 640px # derived: content-heavy detail width
|
|
169
|
+
modal-width-max: 480px # derived: source favored narrow ~480px columns; kept tight for the austere brand
|
|
170
|
+
form-max-width: 560px # derived: source marketing form column ~480px, widened modestly for operator field density
|
|
171
|
+
table-row-height: 36px # derived: dense terminal brand; tighter than the 40px default (source rows sit ~32–36px)
|
|
172
|
+
verbosity: compact # derived: manpage-terse brand voice
|
|
173
|
+
feedback: minimal # derived: austere, flat, near-motionless system
|
|
174
|
+
density-tier: dense # derived: terminal-native brand reads dense
|
|
175
|
+
product-traits: [dev-tools, terminal, cli, ai-agent]
|
|
176
|
+
```
|
|
177
|
+
|
|
178
|
+
```yaml lever-manifest
|
|
179
|
+
version: 1
|
|
180
|
+
fonts: { sans: "JetBrains Mono, ui-monospace, SFMono-Regular, Menlo, monospace", mono: "JetBrains Mono, ui-monospace, SFMono-Regular, Menlo, monospace" }
|
|
181
|
+
color-tokens:
|
|
182
|
+
light:
|
|
183
|
+
background: "#fdfcfc"
|
|
184
|
+
foreground: "#201d1d"
|
|
185
|
+
card: "#fdfcfc"
|
|
186
|
+
card-foreground: "#201d1d"
|
|
187
|
+
muted: "#f8f7f7"
|
|
188
|
+
muted-foreground: "#646262"
|
|
189
|
+
border: "#e0dddd" # derived: solid equivalent of the source's translucent hairline rgba(15,0,0,0.12) flattened over the cream canvas
|
|
190
|
+
input: "#e0dddd"
|
|
191
|
+
ring: "#201d1d" # source: the focus signal is a flat ink border, no halo (ring == primary)
|
|
192
|
+
primary: "#201d1d" # source: the CTA fill is near-black ink, not a color
|
|
193
|
+
primary-foreground: "#fdfcfc"
|
|
194
|
+
accent: "#f1eeee" # source: surface-card, the warm selected/hover surface — never blue
|
|
195
|
+
accent-foreground: "#201d1d"
|
|
196
|
+
destructive: "#ff3b30"
|
|
197
|
+
destructive-foreground: "#fdfcfc"
|
|
198
|
+
success: "#30d158"
|
|
199
|
+
warning: "#ff9f0a"
|
|
200
|
+
popover: "#fdfcfc"
|
|
201
|
+
popover-foreground: "#201d1d"
|
|
202
|
+
secondary: "#f8f7f7"
|
|
203
|
+
secondary-foreground: "#201d1d"
|
|
204
|
+
chart-1: "#007aff" # source: Apple Blue — the one chromatic accent, carrying the primary chart series
|
|
205
|
+
chart-2: "#30d158" # source: Apple green
|
|
206
|
+
chart-3: "#ff9f0a" # source: Apple amber
|
|
207
|
+
chart-4: "#ff3b30" # source: Apple red
|
|
208
|
+
chart-5: "#5856d6" # derived: Apple HIG system indigo to complete a 5-hue categorical set (source ships only 4 semantic hues)
|
|
209
|
+
sidebar: "#f8f7f7" # derived: barely-warmer step to seat the nav rail; the source forbids heavy gray bands, so kept to the softest surface
|
|
210
|
+
sidebar-foreground: "#201d1d"
|
|
211
|
+
sidebar-primary: "#007aff" # derived: the active-nav indicator is the one place blue enters persistent chrome (source reserves blue for in-product active/interactive)
|
|
212
|
+
sidebar-primary-foreground: "#fdfcfc"
|
|
213
|
+
sidebar-accent: "#f1eeee"
|
|
214
|
+
sidebar-accent-foreground: "#201d1d"
|
|
215
|
+
sidebar-border: "#e0dddd"
|
|
216
|
+
sidebar-ring: "#201d1d" # derived: focus in the rail matches the ink ring
|
|
217
|
+
spacing-scale: [1, 4, 8, 12, 16, 24, 32, 48]
|
|
218
|
+
radius-scale: [0, 4, 9999]
|
|
219
|
+
shadow-levels: [none, sm, md]
|
|
220
|
+
motion: { durations: [100, 150, 200], easings: ["cubic-bezier(0.4,0,0.2,1)"] }
|
|
221
|
+
icons: { family: lucide, stroke: 2 }
|
|
222
|
+
accent-count: 1
|
|
223
|
+
```
|
|
@@ -0,0 +1,234 @@
|
|
|
1
|
+
---
|
|
2
|
+
schema: design-md/v1
|
|
3
|
+
product: PostHog
|
|
4
|
+
provenance: library
|
|
5
|
+
sourced: 2026-07-04
|
|
6
|
+
---
|
|
7
|
+
|
|
8
|
+
# PostHog — operator reading
|
|
9
|
+
|
|
10
|
+
The operator distillation of PostHog's engineering-sketchbook brand. The source is a marketing system:
|
|
11
|
+
a warm cream canvas dotted with hand-drawn hedgehog mascots, hero-scale display type, and a single
|
|
12
|
+
loud yellow-orange CTA pill. This entry keeps the temperature and voice that make it PostHog — the
|
|
13
|
+
cream canvas, the olive ink, the one yellow accent, IBM Plex Sans, the flat hairline depth, the dark
|
|
14
|
+
code island — and leaves the decoration behind: no mascots, no 36px/800 hero type, no pastel callout
|
|
15
|
+
bands, no pill CTAs on operator chrome. What remains is a warm, calm, flat dev-tools console. Both
|
|
16
|
+
machine blocks are fully valued (no `hint:`); every judgment away from the marketing brand is annotated
|
|
17
|
+
`# derived:` where it lands.
|
|
18
|
+
|
|
19
|
+
## 1 Visual Theme
|
|
20
|
+
|
|
21
|
+
Light by default; dark is opt-in. The signature is the **warm cream canvas** (`background` `#eeefe9`) —
|
|
22
|
+
never plain white — with true-white cards (`card`) floating on it. Flat: hierarchy is carried by
|
|
23
|
+
hairline olive `border`, type weight, and color, never by shadow. A single loud accent — PostHog yellow
|
|
24
|
+
(`primary` `#f7a501`) — carries the one action that matters on a surface, and it wears **dark olive ink**
|
|
25
|
+
(`primary-foreground`), never white. The neutral ramp is a warm olive-gray, so the whole UI reads like a
|
|
26
|
+
friendly engineering blog rather than cold gray tooling. Density is `standard` and steps denser per
|
|
27
|
+
archetype — dense-capable, warm, not cramped.
|
|
28
|
+
|
|
29
|
+
## 2 Color Roles
|
|
30
|
+
|
|
31
|
+
Light values first (the manifest carries the exact hex). One loud accent — `primary` yellow is the only
|
|
32
|
+
saturated hue that carries a call to action; blue is a quiet functional signal; status hues speak only
|
|
33
|
+
status.
|
|
34
|
+
|
|
35
|
+
| Role | Value | Allowed where |
|
|
36
|
+
| --- | --- | --- |
|
|
37
|
+
| `background` | warm cream `#eeefe9` | the page canvas — end to end, never substituted with white |
|
|
38
|
+
| `card` / `popover` | white `#ffffff` | cards, panels, and overlays floating on the cream |
|
|
39
|
+
| `foreground` | deep olive-charcoal `#23251d` | headlines and primary ink |
|
|
40
|
+
| `muted` / `secondary` | soft greige `#e5e7e0` | hover rows, subtle fills, secondary buttons |
|
|
41
|
+
| `muted-foreground` | olive `#6c6e63` | labels, captions, metadata, secondary text |
|
|
42
|
+
| `border` / `input` | olive hairline `#bfc1b7` | every separator, grid line, and field edge |
|
|
43
|
+
| `primary` | PostHog yellow `#f7a501` | the one primary action; wears dark ink, never white |
|
|
44
|
+
| `accent` | pale yellow wash `#f7eccf` | selected / hovered rows and nav, on-accent surfaces only |
|
|
45
|
+
| `ring` | focus blue `#2c84e0` | the focus outline — the brand focuses in blue, not yellow |
|
|
46
|
+
| `destructive` | red `#cd4239` | destructive actions and error state only |
|
|
47
|
+
| `success` | green `#2c8c66` | positive status only |
|
|
48
|
+
| `warning` | gold-amber `#b17816` | caution status only — deliberately deeper than the CTA yellow |
|
|
49
|
+
|
|
50
|
+
Link/info blue `#2c84e0` and the pastel callout family (`accent-blue-soft`, `-green-soft`, `-red-soft`,
|
|
51
|
+
`-purple-soft`) are marketing/doc vocabulary: they carry no operator chrome role (see §7).
|
|
52
|
+
|
|
53
|
+
## 3 Typography
|
|
54
|
+
|
|
55
|
+
One sans, one mono. `font-sans` is IBM Plex Sans Variable — UI, body, and headings all ride it, and the
|
|
56
|
+
brand's signature is that hierarchy is built from **weight**, not a second family. `font-mono` is
|
|
57
|
+
Source Code Pro for IDs, codes, timestamps, and log lines. Numeric columns render `tabular-nums` so
|
|
58
|
+
figures align down a column.
|
|
59
|
+
|
|
60
|
+
| Step | Role | Size · line | Weight · tracking |
|
|
61
|
+
| --- | --- | --- | --- |
|
|
62
|
+
| h1 | page title | 24px / 1.3 | `font-weight-strong` · `heading-tracking` |
|
|
63
|
+
| h2 | section head | 20px / 1.4 | `font-weight-strong` · `heading-tracking` |
|
|
64
|
+
| h3 | card / group head | 16px / 1.45 | `font-weight-strong` |
|
|
65
|
+
| body | UI + prose | 14px / 1.45 | `font-weight-normal` |
|
|
66
|
+
| small | labels, meta, dense table | 13px / 1.4 | `font-weight-normal` |
|
|
67
|
+
| caption | uppercase eyebrow | 12px / 1.33 | `font-weight-strong`, `+0.02em`, uppercase |
|
|
68
|
+
|
|
69
|
+
Bump weight one step for emphasis; never change size to emphasize. The marketing hero (36px / 800) and
|
|
70
|
+
the 800-weight display tier stay behind — operator headings top out at `font-weight-strong`.
|
|
71
|
+
|
|
72
|
+
## 4 Component Stylings
|
|
73
|
+
|
|
74
|
+
Every recurring operator component composes from the primitives — no literal values.
|
|
75
|
+
|
|
76
|
+
- **Button** — `primary`: filled `primary` yellow on dark `primary-foreground` ink, `radius`, no pill.
|
|
77
|
+
Secondary: `secondary` greige fill, `border`, `foreground`. Ghost: transparent, `accent` on hover.
|
|
78
|
+
- **Input** — `card` fill, 1px `border` (`border-weight`), `radius`; focus draws the `ring` (blue) at
|
|
79
|
+
full 2px, no glow.
|
|
80
|
+
- **Card** — `card` white surface, 1px `border` hairline, `radius`, **flat — no shadow**; inset by
|
|
81
|
+
`density-inset`. Flat cards on cream is the brand.
|
|
82
|
+
- **Table row** — height `table-row-height`; `border` grid lines; `muted` on hover; row selection tints
|
|
83
|
+
`accent`; `tabular-nums` on numeric columns; `font-mono` on IDs and timestamps.
|
|
84
|
+
- **Side panel** — detail and edit open in the side panel (`side-panel-width`, `side-panel-width-rich`
|
|
85
|
+
for content-heavy), beside the work, not over it.
|
|
86
|
+
- **Badge** — hairline `border`, `muted` / status fill, uppercase caption; status badges take `success`
|
|
87
|
+
/ `warning` / `destructive`, never `primary`.
|
|
88
|
+
- **Code / log surface** — the brand's signature inverted moment: dark olive-charcoal (`foreground`
|
|
89
|
+
`#23251d`) fill with white text in `font-mono`. The one place a surface goes dark on the light UI.
|
|
90
|
+
|
|
91
|
+
## 5 Layout
|
|
92
|
+
|
|
93
|
+
Base spacing unit 4px (Tailwind `--spacing` 0.25rem); the brand's rhythm centers on the 8px step. The
|
|
94
|
+
on-scale ramp is `2 · 4 · 8 · 12 · 16 · 24 · 32 · 48 · 64`. Shell dimensions map one-to-one to the
|
|
95
|
+
layout primitives: sidebar `sidebar-width-expanded` / `sidebar-width-collapsed`, topbar `topbar-height`,
|
|
96
|
+
side panel `side-panel-width` / `side-panel-width-rich`, modal cap `modal-width-max`, forms
|
|
97
|
+
`form-max-width`, tables full-width. Density is governed globally by `density-tier` (rewriting the
|
|
98
|
+
spacing scale through `density-gap`) and stepped per archetype by the surface catalog — never by
|
|
99
|
+
absolute overrides. The 80px marketing section rhythm stays behind.
|
|
100
|
+
|
|
101
|
+
## 6 Depth
|
|
102
|
+
|
|
103
|
+
Flat — this is where the brand and operator restraint agree completely. Hierarchy comes from the surface
|
|
104
|
+
ladder and hairlines, never shadow:
|
|
105
|
+
|
|
106
|
+
- **0 — canvas** `background` cream, no border.
|
|
107
|
+
- **1 — panel / card** `card` white on a 1px `border` hairline; flat, no shadow.
|
|
108
|
+
- **2 — overlay** `popover` / side panel / modal — the one place `shadow-intensity` earns a soft `md`
|
|
109
|
+
shadow to lift off the cream. The dark code / log surface is the brand's other "elevated" moment, and
|
|
110
|
+
it lifts with **color, not shadow**.
|
|
111
|
+
|
|
112
|
+
Focus is a 2px `ring` outline in blue (never a glow), visible on every interactive element. Three
|
|
113
|
+
z-levels: content, sticky chrome, overlay.
|
|
114
|
+
|
|
115
|
+
## 7 Do's & Don'ts
|
|
116
|
+
|
|
117
|
+
- **Do** keep the cream `background` (`#eeefe9`) as the app canvas — never flatten it to plain white.
|
|
118
|
+
- **Do** reserve `primary` yellow for the single most important action, and carry dark ink on it — the
|
|
119
|
+
yellow pill never takes white text.
|
|
120
|
+
- **Do** carry hierarchy with hairlines, weight, and whitespace — the brand is flat, no drop shadows.
|
|
121
|
+
- **Do** render code and log surfaces on the dark olive-charcoal `foreground` fill with `font-mono`.
|
|
122
|
+
- **Don't** pill operator buttons — the pill is the marketing nav CTA only; operator buttons are `radius`.
|
|
123
|
+
- **Don't** promote a second loud chromatic accent. Blue stays a quiet link / focus signal; the pastel
|
|
124
|
+
callout family and the hedgehog mascots are marketing decoration and do not enter operator chrome.
|
|
125
|
+
- **Don't** bring the 36px / 800 hero display tier into operator surfaces — headings stop at
|
|
126
|
+
`font-weight-strong`.
|
|
127
|
+
- **Don't** signal elevation with heavy shadows; reach past a hairline only for a real overlay.
|
|
128
|
+
|
|
129
|
+
## 8 Responsive
|
|
130
|
+
|
|
131
|
+
The operator sweep is 375 / 768 / 1024 / 1440.
|
|
132
|
+
|
|
133
|
+
| Breakpoint | What changes |
|
|
134
|
+
| --- | --- |
|
|
135
|
+
| 375 | sidebar → off-canvas drawer; two-pane list+detail stacks; side panel → full sheet; density holds |
|
|
136
|
+
| 768 | sidebar collapses to the icon rail (`sidebar-width-collapsed`); tables scroll their overflow |
|
|
137
|
+
| 1024 | sidebar expands; two-pane queue+detail holds side by side |
|
|
138
|
+
| 1440 | content caps at `form-max-width` for forms; tables and dashboards use the full width |
|
|
139
|
+
|
|
140
|
+
## 9 Agent Prompt Guide
|
|
141
|
+
|
|
142
|
+
Directives the emitting agent follows verbatim:
|
|
143
|
+
|
|
144
|
+
- The cream `background` (`#eeefe9`) is the app canvas — white cards float on it; never flatten to plain
|
|
145
|
+
white. This warmth is the brand's whole identity once the mascots are gone.
|
|
146
|
+
- Reserve the yellow `primary` for the one primary action per surface, always with dark ink; if two
|
|
147
|
+
things want the accent, one is not primary.
|
|
148
|
+
- IBM Plex Sans across every role; build hierarchy from weight (`400` / `600`), not size jumps; every
|
|
149
|
+
numeric column is `tabular-nums`; every ID, code, and timestamp is `font-mono`.
|
|
150
|
+
- Stay flat — hairline olive `border` and weight before shadow. The dark `#23251d` code / log surface is
|
|
151
|
+
the only "elevated" surface, and it lifts with color, not shadow.
|
|
152
|
+
- Blue is links and focus only; green / red / amber are status only; one loud color (yellow).
|
|
153
|
+
- Leave behind: hedgehog mascots, 36px / 800 hero type, pill CTAs on chrome, pastel callout bands, the
|
|
154
|
+
80px marketing section rhythm.
|
|
155
|
+
|
|
156
|
+
```yaml design-primitives
|
|
157
|
+
radius: 6px # brand dominant card/button radius (rounded.md)
|
|
158
|
+
shadow-intensity: 0.3 # derived: brand is flat with zero drop shadows; low value lifts only true overlays
|
|
159
|
+
border-weight: 1px
|
|
160
|
+
density-gap: 1
|
|
161
|
+
density-inset: 1
|
|
162
|
+
font-sans: IBM Plex Sans, system-ui, sans-serif # brand primary face across every role
|
|
163
|
+
font-mono: Source Code Pro, ui-monospace, monospace # brand display monospace for code, IDs, logs
|
|
164
|
+
font-weight-normal: 400
|
|
165
|
+
font-weight-strong: 600 # derived: brand builds hierarchy from weight; body-strong/nav is 600; the 700-800 display tier is marketing-scale and stays behind
|
|
166
|
+
heading-tracking: -0.02em # derived from brand display tracking (-0.5/-0.6px at 21-24px)
|
|
167
|
+
duration-unit: 50ms # derived: corpus silent on motion; standard operator base
|
|
168
|
+
duration-fast: 100ms # derived: corpus silent on motion
|
|
169
|
+
duration-normal: 150ms # derived: corpus silent on motion
|
|
170
|
+
duration-slow: 250ms # derived: corpus silent on motion
|
|
171
|
+
ease-default: cubic-bezier(0.4,0,0.2,1) # derived: corpus silent on motion; standard functional ease
|
|
172
|
+
contrast-boost: 1
|
|
173
|
+
icon-stroke: 1.75 # derived: brand uses rounded outline icons; 1.75 is the refined operator stroke
|
|
174
|
+
icon-size-base: 16px # derived: standard operator icon size
|
|
175
|
+
sidebar-width-expanded: 240px # brand doc-sidebar width
|
|
176
|
+
sidebar-width-collapsed: 56px # derived: standard icon rail
|
|
177
|
+
topbar-height: 56px # brand primary-nav height
|
|
178
|
+
side-panel-width: 420px # derived: corpus has no side panel; standard operator width
|
|
179
|
+
side-panel-width-rich: 640px # derived: near the brand's ~720px article column, tuned for a rich panel
|
|
180
|
+
modal-width-max: 560px # derived: standard operator modal cap
|
|
181
|
+
form-max-width: 640px # derived: narrower than the brand's ~720px article for operator forms
|
|
182
|
+
table-row-height: 40px # derived: brand button height is 40px; standard operator row
|
|
183
|
+
verbosity: default
|
|
184
|
+
feedback: subtle # derived: brand is calm and flat with no loud motion
|
|
185
|
+
density-tier: standard # derived: not terminal-dense, not consumer-spacious; a warm readable operator default
|
|
186
|
+
product-traits: [dev-tools, analytics, dashboard]
|
|
187
|
+
```
|
|
188
|
+
|
|
189
|
+
```yaml lever-manifest
|
|
190
|
+
version: 1
|
|
191
|
+
fonts: { sans: "IBM Plex Sans, system-ui, sans-serif", mono: "Source Code Pro, ui-monospace, monospace" }
|
|
192
|
+
color-tokens:
|
|
193
|
+
light:
|
|
194
|
+
background: "#eeefe9"
|
|
195
|
+
foreground: "#23251d"
|
|
196
|
+
card: "#ffffff"
|
|
197
|
+
card-foreground: "#23251d"
|
|
198
|
+
muted: "#e5e7e0"
|
|
199
|
+
muted-foreground: "#6c6e63"
|
|
200
|
+
border: "#bfc1b7"
|
|
201
|
+
input: "#bfc1b7"
|
|
202
|
+
ring: "#2c84e0"
|
|
203
|
+
primary: "#f7a501"
|
|
204
|
+
primary-foreground: "#23251d"
|
|
205
|
+
accent: "#f7eccf" # derived: pale wash of the primary yellow for row/nav selection warmth
|
|
206
|
+
accent-foreground: "#23251d"
|
|
207
|
+
destructive: "#cd4239"
|
|
208
|
+
destructive-foreground: "#ffffff"
|
|
209
|
+
success: "#2c8c66"
|
|
210
|
+
warning: "#b17816" # derived: brand gold-tone (primary-active), kept deeper than the CTA yellow so warning ≠ accent
|
|
211
|
+
popover: "#ffffff"
|
|
212
|
+
popover-foreground: "#23251d"
|
|
213
|
+
secondary: "#e5e7e0"
|
|
214
|
+
secondary-foreground: "#23251d"
|
|
215
|
+
chart-1: "#f7a501"
|
|
216
|
+
chart-2: "#2c84e0"
|
|
217
|
+
chart-3: "#2c8c66"
|
|
218
|
+
chart-4: "#7c44a6"
|
|
219
|
+
chart-5: "#cd4239"
|
|
220
|
+
sidebar: "#e5e7e0" # derived: one step deeper than the cream canvas so the nav rail reads as chrome
|
|
221
|
+
sidebar-foreground: "#23251d"
|
|
222
|
+
sidebar-primary: "#f7a501"
|
|
223
|
+
sidebar-primary-foreground: "#23251d"
|
|
224
|
+
sidebar-accent: "#ffffff" # derived: brand signals active nav by lifting to a white card
|
|
225
|
+
sidebar-accent-foreground: "#23251d"
|
|
226
|
+
sidebar-border: "#bfc1b7"
|
|
227
|
+
sidebar-ring: "#2c84e0"
|
|
228
|
+
spacing-scale: [2, 4, 8, 12, 16, 24, 32, 48, 64]
|
|
229
|
+
radius-scale: [0, 2, 4, 6, 8, 9999]
|
|
230
|
+
shadow-levels: [none, sm, md]
|
|
231
|
+
motion: { durations: [100, 150, 250], easings: ["cubic-bezier(0.4,0,0.2,1)"] }
|
|
232
|
+
icons: { family: lucide, stroke: 1.75 }
|
|
233
|
+
accent-count: 1
|
|
234
|
+
```
|