@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.
Files changed (100) hide show
  1. package/data/harness-index.json +1 -1
  2. package/data/harnesses/code/harness.json +2 -2
  3. package/data/harnesses/code/rules/general.md +2 -1
  4. package/data/harnesses/code/skills/design/SKILL.md +65 -0
  5. package/data/harnesses/code/skills/design/data/catalog/rules.csv +132 -0
  6. package/data/harnesses/code/skills/design/data/design-md/SCHEMA.md +317 -0
  7. package/data/harnesses/code/skills/design/data/design-md/library/airbnb.md +235 -0
  8. package/data/harnesses/code/skills/design/data/design-md/library/airtable.md +232 -0
  9. package/data/harnesses/code/skills/design/data/design-md/library/anthropic-claude.md +220 -0
  10. package/data/harnesses/code/skills/design/data/design-md/library/apple.md +220 -0
  11. package/data/harnesses/code/skills/design/data/design-md/library/binance.md +223 -0
  12. package/data/harnesses/code/skills/design/data/design-md/library/bmw.md +219 -0
  13. package/data/harnesses/code/skills/design/data/design-md/library/cal.md +220 -0
  14. package/data/harnesses/code/skills/design/data/design-md/library/clay.md +220 -0
  15. package/data/harnesses/code/skills/design/data/design-md/library/clickhouse.md +220 -0
  16. package/data/harnesses/code/skills/design/data/design-md/library/cohere.md +227 -0
  17. package/data/harnesses/code/skills/design/data/design-md/library/coinbase.md +237 -0
  18. package/data/harnesses/code/skills/design/data/design-md/library/composio.md +220 -0
  19. package/data/harnesses/code/skills/design/data/design-md/library/cursor.md +220 -0
  20. package/data/harnesses/code/skills/design/data/design-md/library/elevenlabs.md +220 -0
  21. package/data/harnesses/code/skills/design/data/design-md/library/expo.md +228 -0
  22. package/data/harnesses/code/skills/design/data/design-md/library/figma.md +221 -0
  23. package/data/harnesses/code/skills/design/data/design-md/library/framer.md +236 -0
  24. package/data/harnesses/code/skills/design/data/design-md/library/hashicorp.md +220 -0
  25. package/data/harnesses/code/skills/design/data/design-md/library/ibm.md +234 -0
  26. package/data/harnesses/code/skills/design/data/design-md/library/intercom.md +240 -0
  27. package/data/harnesses/code/skills/design/data/design-md/library/kraken.md +236 -0
  28. package/data/harnesses/code/skills/design/data/design-md/library/linear-app.md +237 -0
  29. package/data/harnesses/code/skills/design/data/design-md/library/lovable.md +220 -0
  30. package/data/harnesses/code/skills/design/data/design-md/library/meta.md +220 -0
  31. package/data/harnesses/code/skills/design/data/design-md/library/minimax.md +220 -0
  32. package/data/harnesses/code/skills/design/data/design-md/library/mintlify.md +220 -0
  33. package/data/harnesses/code/skills/design/data/design-md/library/miro.md +233 -0
  34. package/data/harnesses/code/skills/design/data/design-md/library/mistral-ai.md +220 -0
  35. package/data/harnesses/code/skills/design/data/design-md/library/mongodb.md +236 -0
  36. package/data/harnesses/code/skills/design/data/design-md/library/notion.md +220 -0
  37. package/data/harnesses/code/skills/design/data/design-md/library/nvidia.md +222 -0
  38. package/data/harnesses/code/skills/design/data/design-md/library/ollama.md +226 -0
  39. package/data/harnesses/code/skills/design/data/design-md/library/opencode-ai.md +223 -0
  40. package/data/harnesses/code/skills/design/data/design-md/library/posthog.md +234 -0
  41. package/data/harnesses/code/skills/design/data/design-md/library/raycast.md +220 -0
  42. package/data/harnesses/code/skills/design/data/design-md/library/replicate.md +220 -0
  43. package/data/harnesses/code/skills/design/data/design-md/library/resend.md +285 -0
  44. package/data/harnesses/code/skills/design/data/design-md/library/revolut.md +225 -0
  45. package/data/harnesses/code/skills/design/data/design-md/library/runwayml.md +219 -0
  46. package/data/harnesses/code/skills/design/data/design-md/library/sanity.md +251 -0
  47. package/data/harnesses/code/skills/design/data/design-md/library/sentry.md +244 -0
  48. package/data/harnesses/code/skills/design/data/design-md/library/shopify.md +227 -0
  49. package/data/harnesses/code/skills/design/data/design-md/library/slack.md +240 -0
  50. package/data/harnesses/code/skills/design/data/design-md/library/spacex.md +252 -0
  51. package/data/harnesses/code/skills/design/data/design-md/library/spotify.md +248 -0
  52. package/data/harnesses/code/skills/design/data/design-md/library/stripe.md +241 -0
  53. package/data/harnesses/code/skills/design/data/design-md/library/supabase.md +255 -0
  54. package/data/harnesses/code/skills/design/data/design-md/library/superhuman.md +226 -0
  55. package/data/harnesses/code/skills/design/data/design-md/library/tesla.md +233 -0
  56. package/data/harnesses/code/skills/design/data/design-md/library/theverge.md +248 -0
  57. package/data/harnesses/code/skills/design/data/design-md/library/together-ai.md +220 -0
  58. package/data/harnesses/code/skills/design/data/design-md/library/uber.md +220 -0
  59. package/data/harnesses/code/skills/design/data/design-md/library/vercel.md +220 -0
  60. package/data/harnesses/code/skills/design/data/design-md/library/voltagent.md +245 -0
  61. package/data/harnesses/code/skills/design/data/design-md/library/warp.md +220 -0
  62. package/data/harnesses/code/skills/design/data/design-md/library/webflow.md +220 -0
  63. package/data/harnesses/code/skills/design/data/design-md/library/wired.md +220 -0
  64. package/data/harnesses/code/skills/design/data/design-md/library/wise.md +220 -0
  65. package/data/harnesses/code/skills/design/data/design-md/library/x-ai.md +220 -0
  66. package/data/harnesses/code/skills/design/data/design-md/library/zapier.md +238 -0
  67. package/data/harnesses/code/skills/design/data/design-md/nurix.md +217 -0
  68. package/data/harnesses/code/skills/design/data/operator-pack/exemplars/command-center.tsx +249 -0
  69. package/data/harnesses/code/skills/design/data/operator-pack/exemplars/create-edit.tsx +249 -0
  70. package/data/harnesses/code/skills/design/data/operator-pack/exemplars/dashboard.tsx +248 -0
  71. package/data/harnesses/code/skills/design/data/operator-pack/exemplars/entity-detail.tsx +245 -0
  72. package/data/harnesses/code/skills/design/data/operator-pack/exemplars/list-detail.tsx +223 -0
  73. package/data/harnesses/code/skills/design/data/operator-pack/exemplars/log-stream.tsx +249 -0
  74. package/data/harnesses/code/skills/design/data/operator-pack/fixtures.md +88 -0
  75. package/data/harnesses/code/skills/design/data/operator-pack/surface-catalog.md +132 -0
  76. package/data/harnesses/code/skills/design/data/operator-pack/trust-rubric.md +76 -0
  77. package/data/harnesses/code/skills/design/references/create.md +126 -0
  78. package/data/harnesses/code/skills/design/references/diagnosis.md +108 -0
  79. package/data/harnesses/code/skills/design/references/hard-rules.md +155 -0
  80. package/data/harnesses/code/skills/design/references/improve.md +85 -0
  81. package/data/harnesses/code/skills/design/references/interaction.md +77 -0
  82. package/data/harnesses/code/skills/design/references/introspect.md +100 -0
  83. package/data/harnesses/code/skills/design/references/lifecycle.md +73 -0
  84. package/data/harnesses/code/skills/design/references/personality.md +504 -0
  85. package/data/harnesses/code/skills/design/references/structure.md +138 -0
  86. package/data/harnesses/code/skills/design/scripts/derive-personality.mjs +706 -0
  87. package/data/harnesses/code/skills/design/scripts/detector.mjs +898 -0
  88. package/data/harnesses/code/skills/design/scripts/generate-fixtures.mjs +551 -0
  89. package/data/harnesses/code/skills/design/scripts/hook-config.json +11 -0
  90. package/data/harnesses/code/skills/design/scripts/phase-gate.mjs +386 -0
  91. package/data/harnesses/code/skills/design/scripts/preship-sweep.mjs +280 -0
  92. package/data/harnesses/code/skills/design/scripts/render-rung.mjs +690 -0
  93. package/data/harnesses/code/skills/design/scripts/scaffold.mjs +552 -0
  94. package/data/harnesses/code/skills/design/scripts/self-integrity.mjs +432 -0
  95. package/data/harnesses/etna/CLAUDE.md +1 -1
  96. package/data/harnesses/etna/harness.json +2 -2
  97. package/data/harnesses/etna/rules/general.md +2 -1
  98. package/data/harnesses/mobile/harness.json +2 -2
  99. package/data/harnesses/mobile/rules/general.md +2 -1
  100. 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
+ ```