@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,236 @@
1
+ ---
2
+ schema: design-md/v1
3
+ product: Framer
4
+ provenance: library
5
+ sourced: 2026-07-04
6
+ ---
7
+
8
+ # Framer — operator surfaces on a black artboard
9
+
10
+ Framer's brand is a near-pure-black marketing artboard: white display type set poster-tight, one
11
+ confident blue used only as a signal, and vibrant gradient atmosphere tiles that show what the tool
12
+ builds. This library entry translates that identity to operator work — a CRM, a queue, a dashboard in
13
+ Framer's language. What carries: the dark charcoal surface ladder, white ink, the single blue signal,
14
+ the tight-tracked Inter voice, the softly-rounded geometry. What stays behind: the hero-scale GT
15
+ Walsheim display, the gradient spotlight cards as chrome, the pill CTA, the 5px/96px editorial rhythm.
16
+ Both machine blocks are fully valued; every judgment away from the marketing brand is annotated.
17
+
18
+ Framer is categorically dark. Where the operator doctrine defaults light and treats dark as opt-in,
19
+ this brand legitimately inverts it: the base theme *is* dark, and `color-tokens.light` carries the
20
+ dark charcoal palette (the brand ships no light mode — forcing one would discard the palette). This is
21
+ the recorded override, not a mistake.
22
+
23
+ ## 1 Visual Theme
24
+
25
+ Dark by default and dark only. The anchor surface is a near-black `background` canvas beside charcoal
26
+ `card` panels; hierarchy rises through a three-step surface ladder (canvas → surface-1 → surface-2),
27
+ not through heavy shadow. Flat: separation is carried by hairline `border`, surface lift, and white
28
+ ink against gray. A single chromatic accent — Framer blue — lives in `ring`, links, and selected/active
29
+ indicators, and is never a fill. The one primary action reads as a high-contrast white button on the
30
+ dark shell, not a colored one. Density is `standard`: the brand breathes like a poster, and the
31
+ operator read keeps that composure rather than crowding to terminal density.
32
+
33
+ ## 2 Color Roles
34
+
35
+ Dark values (the brand's only mode). One accent — Framer blue is the sole chromatic hue that signals;
36
+ status hues speak only status; the gradient family lives in charts, never in chrome.
37
+
38
+ | Role | Value | Allowed where |
39
+ | --- | --- | --- |
40
+ | `background` | near-black `#090909` | the page canvas — the dominant surface, warm-tinted black |
41
+ | `card` / `popover` | charcoal `#141414` (surface-1) | raised panels, cards, overlays, mockup tiles |
42
+ | `muted` / `accent` | `#1c1c1c` (surface-2) | hover rows, subtle fills, selected-row lift (selection is lift, not color) |
43
+ | `foreground` | pure white `#ffffff` (ink) | all primary ink and headlines |
44
+ | `muted-foreground` | gray `#999999` (ink-muted) | labels, meta, captions — the entire secondary tier |
45
+ | `border` / `input` | hairline `#262626` | every separator, grid line, and field edge |
46
+ | `primary` | white `#ffffff` on `#000000` | the one primary action per surface; a light button on dark |
47
+ | `ring` | Framer blue `#0099ff` | focus outlines, links, active/selected indicators — the single signal |
48
+ | `destructive` | red `#ef4444` | destructive actions and error state only |
49
+ | `success` / `warning` | green `#22c55e` / amber `#f59e0b` | status signalling only, never chrome |
50
+
51
+ Hierarchy is binary: ink or ink-muted, no mid-tone grays between. The gradient hues (violet, magenta,
52
+ orange, coral) are brand graces — they carry no chrome role, only chart series (see §7).
53
+
54
+ ## 3 Typography
55
+
56
+ One sans, one mono. `font-sans` is Inter — the operator body, UI, and headings all ride it, with Inter's
57
+ character variants (`cv01`, `cv05`, `cv09`, `cv11`, `ss03`, `ss07`) enabled; those variants are the
58
+ brand's body voice and the emitting agent keeps them on. `font-mono` is Geist Mono for IDs, codes,
59
+ timestamps, and log lines. Numeric columns render `tabular-nums` (Inter carries `tnum`) so figures align
60
+ down a column. Framer's hero-scale GT Walsheim display stays behind — operator headings top out where
61
+ Inter already serves.
62
+
63
+ | Step | Role | Size · line | Weight · tracking |
64
+ | --- | --- | --- | --- |
65
+ | h1 | page title | 24px / 1.2 | `font-weight-strong` · `heading-tracking` |
66
+ | h2 | section head | 20px / 1.25 | `font-weight-strong` · `heading-tracking` |
67
+ | h3 | card / group head | 16px / 1.3 | `font-weight-strong` · `heading-tracking` |
68
+ | body | UI + prose | 15px / 1.4 | `font-weight-normal` |
69
+ | small | labels, meta, dense table | 14px / 1.4 | `font-weight-normal` |
70
+ | caption | eyebrow / footnote | 13px / 1.2 | `font-weight-normal`, `+0.01em` |
71
+
72
+ Framer's signature is aggressive negative tracking; at operator sizes it carries as a tighter-than-neutral
73
+ `heading-tracking`, not the hero display's -5% extreme. Bump weight one narrow step for emphasis; never
74
+ change size to emphasize.
75
+
76
+ ## 4 Component Stylings
77
+
78
+ Every recurring operator component composes from the primitives — no literal values.
79
+
80
+ - **Button** — `primary`: filled white `primary` on `primary-foreground`, `radius`, no pill. Secondary:
81
+ `secondary` (surface-1) fill, `border`, `foreground`. Ghost: transparent, `muted` on hover.
82
+ - **Input** — `card` (surface-1) fill, 1px `border` (`border-weight`), `radius`; focus draws the blue
83
+ `ring` at 2px, no glow — the one chromatic moment in the field.
84
+ - **Card** — `card` surface, 1px `border`, `radius`; a soft light-edge + `shadow-intensity` drop only
85
+ when it floats off the canvas; inset by `density-inset`.
86
+ - **Table row** — height `table-row-height`; `border` grid lines; `muted` on hover; `tabular-nums` on
87
+ numeric columns; row selection lifts to `accent` (surface-2), never a colored fill.
88
+ - **Side panel** — detail and edit open in the side panel (`side-panel-width`, `side-panel-width-rich`
89
+ for content-heavy), beside the work, not over it.
90
+ - **Badge** — hairline `border`, `muted`/status fill; status badges take `success` / `warning` /
91
+ `destructive`, never `primary` and never the blue.
92
+
93
+ ## 5 Layout
94
+
95
+ Base spacing unit 4px (Tailwind `--spacing` 0.25rem); the on-scale ramp is `2 · 4 · 8 · 12 · 16 · 24 ·
96
+ 32 · 48 · 64`. Framer's marketing 5px rhythm (15 / 20 / 30) and 96px section breaks stay behind — the
97
+ operator surface normalizes to the 4px ramp the density remap expects. Shell dimensions map one-to-one
98
+ to the layout primitives: sidebar `sidebar-width-expanded` / `sidebar-width-collapsed`, topbar
99
+ `topbar-height` (56px, the brand's nav height), side panel `side-panel-width` / `side-panel-width-rich`,
100
+ modal cap `modal-width-max`, forms `form-max-width`, tables full-width. Density is governed globally by
101
+ `density-tier` and stepped per archetype by the surface catalog — never by absolute overrides.
102
+
103
+ ## 6 Depth
104
+
105
+ Flat. Rank comes from the surface ladder and hairlines, not stacked shadow:
106
+
107
+ - **0 — canvas** `background`, no border — the black artboard.
108
+ - **1 — panel / card** `card` (surface-1) on a 1px `border`; the working raised surface.
109
+ - **2 — overlay** `popover` / side panel / modal — a `rgba(255,255,255,0.08)` light top-edge plus a
110
+ soft `shadow-intensity` drop against the near-black. No level stacks a heavier shadow to signal rank;
111
+ rank is surface lift and position.
112
+
113
+ Focus is a 2px blue `ring` outline (never a glow), visible on every interactive element — the only
114
+ chromatic depth signal in the system. Three z-levels: content, sticky chrome, overlay.
115
+
116
+ ## 7 Do's & Don'ts
117
+
118
+ - **Do** keep the base dark. Framer ships no light mode; the near-black canvas is the identity.
119
+ - **Do** reserve Framer blue for `ring`, links, and selected/active indicators — a signal color, never a
120
+ surface or button fill.
121
+ - **Do** make the primary action a high-contrast white button; there is one per surface.
122
+ - **Do** mark selection and "active" by surface lift (surface-1 → surface-2), not by a colored tint.
123
+ - **Do** carry hierarchy as a binary ink / ink-muted split — no mid-tone grays crept in between.
124
+ - **Do** apply `tabular-nums` to every numeric column and `font-mono` to IDs, codes, and timestamps.
125
+ - **Don't** promote a second chromatic accent. The gradient hues are chart series only, never chrome.
126
+ - **Don't** pill operator buttons or reach for a radius outside `radius-scale` — the marketing pill CTA
127
+ stays behind; operator buttons take the `radius` default.
128
+ - **Don't** wash a section in a gradient. Gradients were marketing atmosphere; they do not enter the shell.
129
+ - **Don't** open detail or edit in a modal when the side panel fits — modals are for confirmations only.
130
+
131
+ ## 8 Responsive
132
+
133
+ The operator sweep is 375 / 768 / 1024 / 1440; the single dark theme holds at every width.
134
+
135
+ | Breakpoint | What changes |
136
+ | --- | --- |
137
+ | 375 | sidebar → off-canvas drawer; two-pane list+detail stacks; side panel → full sheet; density holds |
138
+ | 768 | sidebar collapses to the icon rail (`sidebar-width-collapsed`); tables scroll their overflow |
139
+ | 1024 | sidebar expands; two-pane queue+detail holds side by side |
140
+ | 1440 | forms cap at `form-max-width`; tables and dashboards use the full width |
141
+
142
+ ## 9 Agent Prompt Guide
143
+
144
+ Directives the emitting agent follows verbatim:
145
+
146
+ - Build dark. The base theme is the charcoal ladder — canvas `background`, surface-1 `card`, surface-2
147
+ `accent`/`muted` — with white ink and gray `muted-foreground`. There is no light interlude.
148
+ - Accent only with the blue, and only as a signal: focus `ring`, links, active nav, selected indicators.
149
+ If the blue becomes a fill, the brand is drifting.
150
+ - Make the one primary action a white button; everything else is neutral surface or status.
151
+ - Mark selection and active state by lifting a surface step, not by tinting — "selected is lift, not color".
152
+ - Keep hierarchy binary: ink `foreground` or gray `muted-foreground`, nothing between.
153
+ - Set Inter as `font-sans` with its `cv`/`ss` character variants on; `font-mono` Geist Mono for IDs,
154
+ codes, timestamps; `tabular-nums` on every numeric column.
155
+ - Track headings tight; keep buttons and cards on the `radius` default. Leave behind the GT Walsheim
156
+ hero display, the gradient spotlight cards, the pill CTA, and the 96px editorial section rhythm.
157
+
158
+ ```yaml design-primitives
159
+ radius: 10px # derived: brand default 15-20px card radius is marketing-soft; operator settles on the 10px form/list step, softer than a terminal but not a marketing panel
160
+ shadow-intensity: 0.5 # derived: brand elevates by surface lift + a light top-edge; shadow only lifts true overlays against near-black
161
+ border-weight: 1px
162
+ density-gap: 1
163
+ density-inset: 1
164
+ font-sans: Inter, system-ui, sans-serif # rationale: brand's body face; the single sans slot serves body/table chrome and operator headings (GT Walsheim is hero-display only, stays behind)
165
+ font-mono: Geist Mono, ui-monospace, SFMono-Regular, monospace # derived: corpus specs no mono; Geist is named as a substitute family, its mono sibling pairs cleanly with Inter for IDs/codes/logs
166
+ font-weight-normal: 400
167
+ font-weight-strong: 600 # derived: brand keeps a narrow weight band (display 500, Inter headline 700); operator strong lands at 600 so hierarchy rides size + tracking, not a heavy ramp
168
+ heading-tracking: -0.02em # derived: brand's aggressive negative tracking carries as a tighter-than-default operator heading tracking; the hero -5.5px extreme stays behind
169
+ duration-unit: 50ms # derived: corpus silent on motion; operator-standard base
170
+ duration-fast: 100ms
171
+ duration-normal: 150ms
172
+ duration-slow: 250ms
173
+ ease-default: cubic-bezier(0.4,0,0.2,1) # derived: corpus silent on easing; functional operator standard
174
+ contrast-boost: 1
175
+ icon-stroke: 1.75 # derived: corpus silent on icons; refined operator stroke, one step under lucide's 2
176
+ icon-size-base: 16px
177
+ sidebar-width-expanded: 248px # derived: no sidebar in the marketing corpus; operator-standard shell
178
+ sidebar-width-collapsed: 56px # derived: operator-standard icon rail
179
+ topbar-height: 56px # rationale: the brand's top-nav height (56px) carried directly
180
+ side-panel-width: 420px # derived: operator-standard shell (no side panel in the marketing corpus)
181
+ side-panel-width-rich: 640px # derived: operator-standard content-heavy panel
182
+ modal-width-max: 560px # derived: operator-standard modal cap
183
+ form-max-width: 640px # derived: operator-standard form column
184
+ table-row-height: 40px # derived: comfortable at standard density; dense archetypes step down via the surface catalog
185
+ verbosity: default
186
+ feedback: subtle
187
+ density-tier: standard # derived: brand reads spacious/editorial, not terminal-dense; operator holds at standard for legibility, steps denser per archetype
188
+ product-traits: [design-tool, builder, dashboard, saas, dev-tools]
189
+ ```
190
+
191
+ ```yaml lever-manifest
192
+ version: 1
193
+ fonts: { sans: "Inter, system-ui, sans-serif", mono: "Geist Mono, ui-monospace, SFMono-Regular, monospace" }
194
+ color-tokens:
195
+ light: # note: brand is categorically dark — the base map carries dark values (no light mode ships); this is the recorded doctrine-inversion override
196
+ background: "#090909"
197
+ foreground: "#ffffff"
198
+ card: "#141414"
199
+ card-foreground: "#ffffff"
200
+ muted: "#1c1c1c"
201
+ muted-foreground: "#999999"
202
+ border: "#262626"
203
+ input: "#262626"
204
+ ring: "#0099ff"
205
+ primary: "#ffffff"
206
+ primary-foreground: "#000000"
207
+ accent: "#1c1c1c"
208
+ accent-foreground: "#ffffff"
209
+ destructive: "#ef4444" # derived: corpus has no destructive red (only success green); operator-standard red legible on near-black
210
+ destructive-foreground: "#ffffff"
211
+ success: "#22c55e"
212
+ warning: "#f59e0b" # derived: corpus has no warning hue; operator-standard amber legible on near-black
213
+ popover: "#141414"
214
+ popover-foreground: "#ffffff"
215
+ secondary: "#141414"
216
+ secondary-foreground: "#ffffff"
217
+ chart-1: "#0099ff" # accent-blue as the primary data series
218
+ chart-2: "#6a4cf5" # gradient-violet, repurposed from marketing atmosphere to chart series
219
+ chart-3: "#d44df0" # gradient-magenta
220
+ chart-4: "#ff7a3d" # gradient-orange
221
+ chart-5: "#ff5577" # gradient-coral
222
+ sidebar: "#090909" # note: brand chrome sits on canvas; sidebar matches background, separated by sidebar-border
223
+ sidebar-foreground: "#ffffff"
224
+ sidebar-primary: "#0099ff" # derived: active-nav takes the blue signal (the brand marks selection/active with blue), not the white primary fill
225
+ sidebar-primary-foreground: "#ffffff"
226
+ sidebar-accent: "#141414" # hover/selected nav row lifts to surface-1
227
+ sidebar-accent-foreground: "#ffffff"
228
+ sidebar-border: "#1a1a1a" # hairline-soft, the brand's chrome divider
229
+ sidebar-ring: "#0099ff"
230
+ spacing-scale: [2, 4, 8, 12, 16, 24, 32, 48, 64]
231
+ radius-scale: [0, 4, 6, 10, 15, 9999]
232
+ shadow-levels: [none, sm, md]
233
+ motion: { durations: [100, 150, 250], easings: ["cubic-bezier(0.4,0,0.2,1)"] }
234
+ icons: { family: lucide, stroke: 1.75 }
235
+ accent-count: 1
236
+ ```
@@ -0,0 +1,220 @@
1
+ ---
2
+ schema: design-md/v1
3
+ product: HashiCorp
4
+ provenance: library
5
+ sourced: 2026-07-04
6
+ ---
7
+
8
+ # HashiCorp — an operator reading of the pure-black, multi-product infrastructure system
9
+
10
+ HashiCorp's web system is a confident, technical enterprise canvas: a pure-black ground, white engineered sans,
11
+ charcoal cards on felt-thin hairlines, and per-product accent colors marking which tool a section is about. This
12
+ entry is the *operator* reading — an internal tool (dashboard, run queue, policy console, log stream) in HashiCorp's
13
+ language. Carried over: the pure-black canvas, charcoal surface ladder, white-on-dark ink, flat shadowless depth, the
14
+ 8px-not-pill radius, hashicorpSans's engineered voice (Inter the substitute). Left behind: the 80/56/40px hero
15
+ display, the per-product chromatic identity cards, full-bleed CTA banners, and the 96px section rhythm.
16
+
17
+ **Categorically dark, literally pure black, one accent not seven.** Two floors yield: the light-default floor (the
18
+ categorically-dark exception — the default theme is dark and fills the required `light` slot) and the doctrine's ban
19
+ on pure `#000000` surfaces (the brand's canvas *is* `#000000`, so the brand token wins); both are recorded plainly.
20
+ The signature per-product palette is a *multi-product* marketing device — an internal tool is one product, so the
21
+ operator reading spends the one product-neutral hue the brand uses on every page: accent-blue `#2b89ff`, repurposed
22
+ as the chart categorical ramp, the one place multiple hues are legitimate (see §2, §7).
23
+
24
+ ## 1 Visual Theme
25
+
26
+ Dark by default — pure black `background` (`#000000`) is the floor of every surface, no light counterpart.
27
+ Emphatically flat: hierarchy comes from the charcoal surface ladder (canvas → surface-1 → surface-2), 1px hairline
28
+ `border`, type weight, and white-on-black contrast — never shadow. A single accent, blue `primary` (`#2b89ff`), is
29
+ held scarce: the one primary action, the focus `ring`, and the active-nav indicator, nothing else. The neutral ramp
30
+ is a cool near-achromatic charcoal (white ink through `#b2b6bd` to `#656a76`), so the UI reads engineered and
31
+ monochrome. Density is `standard` — the brand breathes more than a terminal, but the operator reading earns density.
32
+
33
+ ## 2 Color Roles
34
+
35
+ Dark values (the manifest carries the exact hex in the required default slot). One accent — blue `primary` is the
36
+ only chromatic hue that carries UI meaning; status hues speak only status; the product palette lives only in charts.
37
+
38
+ | Role | Value | Allowed where |
39
+ | --- | --- | --- |
40
+ | `background` | pure-black canvas `#000000` | page floor and content area — the dominant surface |
41
+ | `foreground` | white ink `#ffffff` | headlines and primary text |
42
+ | `card` / `popover` | charcoal `#15181e` (surface-1) | cards, tiles, overlays — the first lift off black |
43
+ | `secondary` / `accent` | charcoal-2 `#1f232b` (surface-2) | secondary-button fills; hover and selected rows and nav |
44
+ | `muted` | faint well `#0c0e12` | inset tracks, disabled fills, quiet band tints |
45
+ | `muted-foreground` | cool gray `#b2b6bd` | labels, captions, secondary text |
46
+ | `border` / `input` | hairline `#3b3d45` (surface-3) | every separator, grid line, and field edge |
47
+ | `primary` | accent-blue `#2b89ff` | the one primary action; active-nav indicator; the text-link |
48
+ | `primary-foreground` | white `#ffffff` | text on the blue action |
49
+ | `ring` | blue `#2b89ff` | the focus outline — unmistakable, because keyboard-first |
50
+ | `destructive` | Consul red `#e62b1e` | destructive actions and error state only |
51
+ | `success` / `warning` | Nomad green `#00ca8e` / Vault yellow `#ffcf25` | status signalling only, never chrome |
52
+
53
+ The per-product palette — Terraform `#7b42bc`, Vault `#ffcf25`, Waypoint `#14c6cb`, Nomad `#00ca8e`,
54
+ Boundary `#f24c53` — carries no UI role; it draws the chart categorical ramp (see §7).
55
+
56
+ ## 3 Typography
57
+
58
+ One sans, one mono. `font-sans` is hashicorpSans, the brand's geometric-humanist face — body, UI, and headings all
59
+ ride it; weight and tight tracking, not a second family, carry the display voice (Inter is the corpus's own open
60
+ substitute). `font-mono` is the operator's reclaim — the marketing brand reserves mono for in-product, but the
61
+ operator surface needs it for IDs, codes, timestamps, and log lines (JetBrains Mono). Numeric columns render
62
+ `tabular-nums`. The display scale (80/56/40px) stays behind — an operator surface tops out at a 24px page title.
63
+
64
+ | Step | Role | Size · line | Weight · tracking |
65
+ | --- | --- | --- | --- |
66
+ | h1 | page title | 24px / 1.25 | `font-weight-strong` · `heading-tracking` |
67
+ | h2 | section head | 18px / 1.3 | `font-weight-strong` · `heading-tracking` |
68
+ | h3 | card / group head | 15px / 1.35 | `font-weight-strong` |
69
+ | body | UI + prose | 14px / 1.5 | `font-weight-normal` |
70
+ | small | labels, meta, dense table | 13px / 1.4 | `font-weight-normal` |
71
+ | caption | uppercase eyebrow | 12px / 1.4 | `font-weight-strong`, `+0.05em`, uppercase |
72
+
73
+ The brand's weight hierarchy is deliberately small — 500 body / 600 emphasis / 700 display, no extremes, so the
74
+ system reads engineered. Operator headings run the strong weight (600, the brand's headline weight) with tight
75
+ negative tracking; the 700 display weights stay behind. Build hierarchy on size and weight, never a second family;
76
+ keep the uppercase eyebrow above sections.
77
+
78
+ ## 4 Component Stylings
79
+
80
+ Every recurring operator component composes from the primitives — no literal values.
81
+
82
+ - **Button** — primary: filled blue `primary` on white `primary-foreground`, `radius` (8px), never a pill. Secondary: `secondary` charcoal-2 fill, `border`, `foreground`. Ghost: transparent, `accent` on hover. The brand's white-on-black CTA is a legitimate monochrome variant for a lone hero action, but the operator default spends the accent-blue so primary, focus, and active-nav read as one system.
83
+ - **Input** — `background` fill, 1px `border` (`border-weight`), `radius`; focus draws the blue `ring` at 2px, no glow (the brand's focus is a 1px accent-blue outline, firmed to 2px for keyboard-first work).
84
+ - **Card** — `card` charcoal surface, 1px `border`, `radius` (cards step to 12px via the scale); depth is the surface lift off black, not shadow; inset by `density-inset`.
85
+ - **Table row** — height `table-row-height`; `border` grid lines carry the grid; `accent` on hover; `tabular-nums` on numeric columns; selection tints `accent` with a blue `primary` left-indicator.
86
+ - **Side panel** — detail and edit open in the panel (`side-panel-width`, `side-panel-width-rich` for content-heavy), beside the work, not over it.
87
+ - **Badge** — hairline `border`, `muted`/status fill, uppercase caption; status badges take `success` / `warning` / `destructive`, never `primary`. Pill radius is badges-only (the brand's product pills).
88
+
89
+ ## 5 Layout
90
+
91
+ Base spacing unit 8px; the on-scale ramp is `2 · 4 · 8 · 12 · 16 · 24 · 32 · 48 · 64` — the marketing 96px section
92
+ rhythm stays behind. Shell dimensions map one-to-one to the layout primitives: sidebar `sidebar-width-expanded` /
93
+ `sidebar-width-collapsed`, topbar `topbar-height` (64px, the brand's nav height), side panel `side-panel-width` /
94
+ `side-panel-width-rich`, modal cap `modal-width-max`, forms `form-max-width`, tables full-width. Density is governed
95
+ globally by `density-tier` (standard) and stepped denser per archetype by the surface catalog.
96
+
97
+ ## 6 Depth
98
+
99
+ Flat and shadowless. Depth comes from the charcoal surface ladder and hairlines, not drop shadows:
100
+
101
+ - **0 — canvas** `background` (`#000000`), no border.
102
+ - **1 — panel / card** `card` (`#15181e`, surface-1) on a 1px `border`; the charcoal lift off pure black carries rank. Hover and selected rows step one further to `accent` (`#1f232b`, surface-2); chips and sub-nav ride the `border` charcoal-3 (`#3b3d45`).
103
+ - **2 — overlay** `popover` / side panel / modal — the one place `shadow-intensity` earns the faintest lift, enough to separate an overlay from the black canvas above a scrim. Rank is surface, border, and position — never a heavier shadow.
104
+
105
+ The per-product chromatic card is a marketing *identity* device at a feature card's z-plane, not a depth level — it
106
+ stays behind. Focus is a 2px blue `ring` outline (never a glow), visible on every interactive element. Three
107
+ z-levels: content, chrome, overlay.
108
+
109
+ ## 7 Do's & Don'ts
110
+
111
+ - **Do** anchor every surface on the pure-black canvas and carry hierarchy with the black-plus-charcoal ladder, hairlines, weight, and size; the black `#000000` is deliberate — not a near-black to be softened.
112
+ - **Do** reserve blue `primary` for the primary action, the focus `ring`, and the active-nav indicator — nothing else. It is the one product-neutral chromatic hue the brand spends on every page.
113
+ - **Do** run headings the brand sans (hashicorpSans; Inter the substitute) at 600 with tight negative tracking, one family across the whole hierarchy.
114
+ - **Do** apply `tabular-nums` to numeric columns and `font-mono` to IDs, codes, timestamps, and log lines — the operator surface reclaims the mono the marketing brand withholds.
115
+ - **Do** draw chart series from the product palette (Terraform purple, Vault yellow, Nomad green, Boundary coral) — the one place multiple hues are legitimate.
116
+ - **Don't** rebuild the per-product accent system as UI chrome, fill large surfaces with a product hue, or set body text in one — that palette is a multi-product marketing device; an internal tool is one product with one accent.
117
+ - **Don't** pill controls or reach for a radius outside `radius-scale` — the button/input radius is 8px.
118
+ - **Don't** signal elevation with drop shadows, or adapt the shell to a light canvas — this brand has no light surface.
119
+ - **Don't** pair a display-only sans with a different body family — HashiCorp is one family across the full hierarchy.
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 | content caps at `form-max-width` for forms; tables and dashboards use the full width |
131
+
132
+ ## 9 Agent Prompt Guide
133
+
134
+ Directives the emitting agent follows verbatim:
135
+
136
+ - Wear the pure-black `#000000` canvas by default; this brand is categorically dark — no light surface to fall back to. Cards and panels are the charcoal surface-1 lift, not white; depth is that ladder plus hairlines, never shadow.
137
+ - Spend blue once per surface: the primary action, the focus `ring`, the active-nav indicator. If two things want the blue, one is not primary. The per-product palette (Terraform purple, Vault yellow, Waypoint cyan, …) stays behind as a marketing identity device — reuse it only as the chart categorical ramp, never as UI accents.
138
+ - Headings ride the brand sans (hashicorpSans; Inter the open substitute) at 600 with tight negative tracking; the 80/56/40px display scale stays behind — operator headings top out at 24px. Keep the uppercase eyebrow above meaningful sections.
139
+ - Every numeric column is `tabular-nums`; every ID / code / timestamp / log line is `font-mono` (JetBrains Mono) — the operator surface reclaims the mono the marketing brand reserves for in-product. Detail and edit go in the side panel beside the work; the blue `ring` focus outline is always visible for keyboard work.
140
+ - Leave behind: the 80px hero display, the per-product chromatic identity cards, full-bleed CTA banners, and the 96px section rhythm — marketing scale, not operator chrome.
141
+
142
+ ```yaml design-primitives
143
+ radius: 8px # corpus: brand button/input/list radius (rounded.md 8px); cards step to 12px via the scale; pill is badges-only
144
+ shadow-intensity: 0.2 # derived: brand is shadowless on dark — depth is surface lift; only true overlays earn the faintest lift on the black canvas
145
+ border-weight: 1px
146
+ density-gap: 1 # derived: standard tier — brand breathes more than a terminal (relaxed body, 96px sections); archetypes step denser
147
+ density-inset: 1 # derived: matches the standard density-gap for coherent component insets
148
+ font-sans: Inter, system-ui, sans-serif # derived: hashicorpSans is proprietary; Inter is the corpus's own first-choice open substitute (closest geometric proportions)
149
+ font-mono: JetBrains Mono, ui-monospace, monospace # derived: marketing brand withholds mono (in-product only); operator IDs/logs need one — JetBrains Mono
150
+ font-weight-normal: 400 # derived: brand marketing body is 500; dense operator tables read cleaner at 400, heading weight carries the engineered voice
151
+ font-weight-strong: 600 # corpus: headline / card-title / subhead / eyebrow all 600; the 700 display weights top out above operator scale and stay behind
152
+ heading-tracking: -0.02em # corpus: signature tight negative display tracking (-0.4 to -0.6px at operator heading sizes ≈ -0.02em)
153
+ duration-unit: 50ms # derived: corpus documents no motion (known gap); functional operator base
154
+ duration-fast: 100ms # derived: corpus silent; functional tempo
155
+ duration-normal: 150ms # derived: corpus silent; standard functional tempo
156
+ duration-slow: 250ms # derived: corpus silent; overlay / panel transition
157
+ ease-default: cubic-bezier(0.4,0,0.2,1) # derived: corpus silent; standard functional ease
158
+ contrast-boost: 1 # derived: the solid #3b3d45 hairline reads clearly on pure black; borders carry the grid, no boost
159
+ icon-stroke: 1.75 # derived: corpus silent on icons; refined operator stroke one step under lucide's 2, matching the engineered voice
160
+ icon-size-base: 16px # derived: corpus silent on icon size; operator default
161
+ sidebar-width-expanded: 248px # derived: brand has no app sidebar (marketing top nav); standard operator rail
162
+ sidebar-width-collapsed: 56px # derived: standard operator icon rail
163
+ topbar-height: 64px # corpus top-nav height (64px)
164
+ side-panel-width: 420px # derived: corpus silent; standard operator detail panel
165
+ side-panel-width-rich: 640px # derived: content-heavy detail panel
166
+ modal-width-max: 560px # derived: corpus's CTA banners are full-bleed marketing; operator confirmation cap
167
+ form-max-width: 640px # derived: brand max content ~1280px is marketing; operator form cap
168
+ table-row-height: 40px # derived: standard operator row; dense archetypes step down via the surface catalog
169
+ verbosity: default
170
+ feedback: subtle # derived: brand is confident and quiet; functional feedback only
171
+ density-tier: standard # derived: brand's relaxed body and 96px sections read more spacious than a terminal; the infra-operator reading is standard, archetypes step denser
172
+ product-traits: [dev-tools, infrastructure, dashboard, admin]
173
+ ```
174
+
175
+ ```yaml lever-manifest
176
+ version: 1
177
+ fonts: { sans: "Inter, system-ui, sans-serif", mono: "JetBrains Mono, ui-monospace, monospace" }
178
+ color-tokens:
179
+ light: # categorically-dark brand: the default-worn theme is dark and fills this required default slot; there is no light surface, and the canvas is pure #000000 (brand token wins over the doctrine ban)
180
+ background: "#000000"
181
+ foreground: "#ffffff"
182
+ card: "#15181e"
183
+ card-foreground: "#ffffff"
184
+ muted: "#0c0e12" # derived: a faint well between the black canvas and the charcoal card, for inset tracks and quiet band tints
185
+ muted-foreground: "#b2b6bd"
186
+ border: "#3b3d45"
187
+ input: "#3b3d45"
188
+ ring: "#2b89ff"
189
+ primary: "#2b89ff"
190
+ primary-foreground: "#ffffff"
191
+ accent: "#1f232b"
192
+ accent-foreground: "#ffffff"
193
+ destructive: "#e62b1e"
194
+ destructive-foreground: "#ffffff"
195
+ success: "#00ca8e"
196
+ warning: "#ffcf25"
197
+ popover: "#15181e"
198
+ popover-foreground: "#ffffff"
199
+ secondary: "#1f232b"
200
+ secondary-foreground: "#ffffff"
201
+ chart-1: "#2b89ff" # accent blue — primary data series
202
+ chart-2: "#7b42bc" # Terraform purple — per-product palette repurposed as the chart categorical ramp
203
+ chart-3: "#00ca8e" # Nomad green
204
+ chart-4: "#ffcf25" # Vault yellow
205
+ chart-5: "#f24c53" # Boundary coral
206
+ sidebar: "#000000" # derived: brand nav rides the canvas; the hairline sidebar-border carries the seam
207
+ sidebar-foreground: "#b2b6bd" # derived: resting nav labels dim to brand secondary ink, brightening on active
208
+ sidebar-primary: "#2b89ff" # derived: blue active-nav indicator
209
+ sidebar-primary-foreground: "#ffffff"
210
+ sidebar-accent: "#1f232b" # derived: hover / selected nav lift (surface-2)
211
+ sidebar-accent-foreground: "#ffffff"
212
+ sidebar-border: "#3b3d45"
213
+ sidebar-ring: "#2b89ff"
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, 250], easings: ["cubic-bezier(0.4,0,0.2,1)"] }
218
+ icons: { family: lucide, stroke: 1.75 }
219
+ accent-count: 1
220
+ ```