@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,285 @@
1
+ ---
2
+ schema: design-md/v1
3
+ product: Resend
4
+ provenance: library
5
+ sourced: 2026-07-04
6
+ ---
7
+
8
+ # Resend — editorial-noir developer console
9
+
10
+ Resend's marketing surfaces are a developer tool wearing the typography of a print magazine: a
11
+ true-black canvas, off-white ink, oversized Domaine Display serif headlines, and depth built entirely
12
+ from translucent-white hairlines instead of shadow. This entry is the *operator* reading of that brand —
13
+ an internal tool (sending-logs stream, API-key console, audience table, deliverability dashboard) in
14
+ Resend's language. What carries: the pure-black `#000000` canvas, off-white ink, the single white-hot
15
+ `primary` (a white surface that is the brightest pixel — the inverted accent), translucent-white hairline
16
+ depth with no shadow, the 8px button / 12px card radius vocabulary, Geist Mono on every code surface, the
17
+ Inter UI voice, and the six atmospheric accents repurposed as chart/status hues. What stays behind: the
18
+ 76–96px Domaine Display serif hero, ABC Favorit marketing body, the full-section glow washes, the
19
+ 96–128px section bands, and the print-magazine email-mockup insets.
20
+
21
+ **Categorically dark, and truly black.** Two doctrine-floor overrides are legitimate here and recorded
22
+ plainly: the brand is dark by default (`data-theme="dark"` is the signature; a derived light daytime
23
+ floor ships alongside per schema), and its canvas is exactly `#000000`, never a near-black. Both blocks
24
+ value every token in light *and* dark; judgments away from the brand are annotated `# derived:`.
25
+
26
+ ## 1 Visual Theme
27
+
28
+ Dark by default; a light daytime mode is the opt-in floor. Emphatically flat: hierarchy is carried by
29
+ translucent-white hairline `border`, type weight, and a surface ladder that steps by luminance, never
30
+ shadow — the system has no drop-shadow language. A single accent — but the accent is *white*. `primary`
31
+ is an off-white surface with black text, the brightest pixel on the black canvas and the one solid anchor
32
+ (in the light floor it inverts to near-black-on-white, the same highest-contrast invariant). The anchor
33
+ surface is a pure `#000000` canvas with cards a hairline-and-luminance-step above it; ink is off-white
34
+ `foreground`, faintly blue-cool so it reads as printed paper. Density is `standard` — dense-capable and
35
+ technical, editorial breathing carried in the shell dimensions, not the data grid.
36
+
37
+ ## 2 Color Roles
38
+
39
+ Both themes are valued; dark is the signature (listed second, but it is the default the tool wears).
40
+ One action accent — `primary` is the only solid that carries interactive meaning; the six atmospheric
41
+ accents live only in charts and status (see §7); status hues speak only status.
42
+
43
+ | Role | Light (floor) | Dark (signature) | Allowed where |
44
+ | --- | --- | --- | --- |
45
+ | `background` | `#ffffff` | canvas `#000000` | the page floor — the dominant surface |
46
+ | `card` / `popover` | `#ffffff` | card `#0a0a0c`, popover `#101012` | panels and overlays, one luminance step up |
47
+ | `foreground` | `#000000` | off-white ink `#fcfdff` | all primary ink |
48
+ | `muted` / `secondary` | `#f1f7fe` | `#101012` | hover fills, quiet bands, ghost/secondary buttons |
49
+ | `muted-foreground` | `#5b6066` | `#a1a4a5` | labels, captions, secondary text |
50
+ | `border` / `input` | `#e4e8ee` | hairline-strong `rgba(255,255,255,0.14)` | every card edge, field edge, and grid line |
51
+ | `primary` | near-black `#000000` | white-hot `#fcfdff` | the one primary action; active nav; the brightest solid |
52
+ | `primary-foreground` | `#ffffff` | `#000000` | label on the primary surface — black on the white pill |
53
+ | `accent` | `#eef4fc` | wash `rgba(255,255,255,0.09)` | selected / hovered rows and nav — a neutral lift, never colored |
54
+ | `ring` | `#000000` | ink `#fcfdff` | focus outline — the border thickens to ink, no separate glow |
55
+ | `destructive` | `#e11d3f` | brand red `#ff2047` | destructive actions and error state only |
56
+ | `success` / `warning` | `#0a9d63` / `#b8790a` | `#11ff99` / `#ffc53d` | status signalling only, never chrome |
57
+
58
+ The atmospheric glow colours (orange, blue, green, yellow, red) are marketing backdrops; here they carry
59
+ `chart-1..5` and semantic status, never full-section washes or solid buttons.
60
+
61
+ ## 3 Typography
62
+
63
+ One UI sans, one mono. `font-sans` is Inter — the corpus's own UI face — carrying body, tables, labels,
64
+ and every heading; ABC Favorit (marketing body) and the 76–96px Domaine Display serif hero both stay
65
+ behind, since operator surfaces top out at a 24px title where the serif never appears. `font-mono` is
66
+ Geist Mono for IDs, codes, timestamps, log lines, and every code well; numeric columns render
67
+ `tabular-nums`. Hierarchy is size and family, not weight — body holds at 400 and the brand never bolds
68
+ past the strong 500.
69
+
70
+ | Step | Role | Size · line | Weight · tracking |
71
+ | --- | --- | --- | --- |
72
+ | h1 | page title | 24px / 1.5 | `font-weight-strong` (500) · `heading-tracking` |
73
+ | h2 | section head | 20px / 1.3 | `font-weight-strong` (500) · `heading-tracking` |
74
+ | h3 | card / group head | 16px / 1.4 | `font-weight-strong` (500) · 0 |
75
+ | body | UI + prose | 14px / 1.5 | `font-weight-normal` (400) |
76
+ | small | labels, meta, dense table | 13px / 1.4 | `font-weight-normal` |
77
+ | caption | eyebrow, footer meta | 12px / 1.5 | `font-weight-normal` |
78
+ | code | IDs, logs, amounts | mono 13px / 1.6 | `font-weight-normal` |
79
+
80
+ Emphasise by size or family (sans → mono), never by bumping body weight to 600 — the corpus forbids it.
81
+
82
+ ## 4 Component Stylings
83
+
84
+ Every recurring operator component composes from the primitives — no literal values.
85
+
86
+ - **Button** — primary: filled `primary` (white on dark / near-black on light), `primary-foreground`,
87
+ `radius` (8px), never a pill — the one brightest solid per surface. Secondary/ghost: `secondary` fill,
88
+ 1px `border`; outline: transparent on `background`, 1px `border`.
89
+ - **Input** — `card` fill, 1px `border` (`border-weight`), `radius`; focus thickens the edge to the ink
90
+ `ring` — no glow, no separate ring colour.
91
+ - **Card** — `card` a luminance step above canvas on a 1px hairline `border`, `radius` stepping to 12px
92
+ for large panels and code wells; depth is the hairline plus the step, never a shadow.
93
+ - **Table row** — height `table-row-height`; `border` grid lines (soft dividers may drop to a 6%
94
+ hairline); `muted` on hover; `tabular-nums` on numeric columns; selection washes to `accent`.
95
+ - **Code / log well** — the darkest, coolest surface (`#06060a` on dark, a step below canvas), 1px
96
+ `border`, `radius`, `font-mono` — depth by temperature, not blur.
97
+ - **Side panel** — detail and edit open in the panel (`side-panel-width`, `side-panel-width-rich` for
98
+ content-heavy), beside the work, not over it.
99
+ - **Badge** — pill radius (badges only), `muted`/status fill; status badges take `success` / `warning` /
100
+ `destructive`, never `primary`.
101
+
102
+ ## 5 Layout
103
+
104
+ Base spacing unit 4px; the on-scale ramp is `2 · 4 · 8 · 12 · 16 · 24 · 32 · 48 · 64` — the marketing
105
+ 96px / 128px section bands stay behind. Shell dimensions map one-to-one to the layout primitives: sidebar
106
+ `sidebar-width-expanded` (248px) / `sidebar-width-collapsed` (56px), topbar `topbar-height` (64px, the
107
+ brand's nav height), side panel `side-panel-width` (420px) / `side-panel-width-rich` (640px, the corpus's
108
+ email-inset max width), modal `modal-width-max`, forms `form-max-width`, tables full-width. Density is
109
+ governed globally by `density-tier` and stepped per archetype by the surface catalog.
110
+
111
+ ## 6 Depth
112
+
113
+ Flat, hairline-and-luminance only — no drop-shadow language on this canvas:
114
+
115
+ - **0 — canvas** `background` (`#000000` dark / `#ffffff` light), no border.
116
+ - **1 — panel / card** `card` a luminance step above canvas on a 1px hairline `border`; step plus
117
+ hairline carries the lift.
118
+ - **2 — overlay** `popover` / side panel / modal — a further luminance step (dark) or the faintest
119
+ `shadow-intensity` lift (light floor). Rank is surface, hairline, and position.
120
+ - **inlay — code / log well** the darkest, coolest surface (`#06060a` on dark) — depth by temperature.
121
+
122
+ Focus is an ink `ring` — the border thickens to `foreground`, never a glow — visible on every
123
+ interactive element. Three z-levels: content, sticky chrome, overlay.
124
+
125
+ ## 7 Do's & Don'ts
126
+
127
+ - **Do** anchor every dark surface on true `#000000` — never a near-black; the corpus is emphatic the
128
+ brand sits on pure black, not `#0a0a0a`.
129
+ - **Do** reserve the white-hot `primary` as the single brightest solid per surface — one primary action,
130
+ the active nav, the focus `ring`. Its scarcity is what makes white read as the accent.
131
+ - **Do** carry depth with translucent-white hairlines and the luminance ladder; render every code, log,
132
+ and terminal surface in `font-mono` (Geist Mono) with `tabular-nums` on numeric columns.
133
+ - **Don't** introduce a second solid brand accent — white (or its light-floor near-black) is the brand;
134
+ the six atmospheric colours are chart/status only, never buttons or full-section washes.
135
+ - **Don't** signal elevation with drop shadows — hairlines and luminance carry depth on the black canvas.
136
+ - **Don't** pill the primary CTA or reach for a radius outside `radius-scale` — buttons/inputs are 8px,
137
+ cards and code wells 12px; pill is badges only.
138
+ - **Don't** bring the serif or ABC Favorit into operator surfaces — Inter carries the UI; the display
139
+ serif is a hero-scale marketing signature that stays behind.
140
+
141
+ ## 8 Responsive
142
+
143
+ The operator sweep is 375 / 768 / 1024 / 1440.
144
+
145
+ | Breakpoint | What changes |
146
+ | --- | --- |
147
+ | 375 | sidebar → off-canvas drawer; two-pane list+detail stacks; side panel → full sheet; nav → hamburger; density holds |
148
+ | 768 | sidebar collapses to the icon rail (`sidebar-width-collapsed`); tables scroll their overflow |
149
+ | 1024 | sidebar expands; two-pane queue+detail holds side by side |
150
+ | 1440 | forms cap at `form-max-width`; tables and dashboards use the full width |
151
+
152
+ Code and log wells keep mono legibility at every breakpoint by scrolling horizontally, not wrapping.
153
+
154
+ ## 9 Agent Prompt Guide
155
+
156
+ Directives the emitting agent follows verbatim:
157
+
158
+ - Wear the dark theme by default (`data-theme="dark"`); the light map is the opt-in daytime floor. On
159
+ dark the canvas is exactly `#000000` — never a near-black.
160
+ - Spend the white-hot `primary` once per surface: the primary action, the active nav, the focus `ring`.
161
+ If two things want the white, one is not primary. Everything else is neutral or status.
162
+ - Lead every list surface with its table; render code, log, and terminal panels in `font-mono` (Geist
163
+ Mono) as the darkest/coolest surface. Every numeric column is `tabular-nums`; every ID / code /
164
+ timestamp is `font-mono`.
165
+ - The six atmospheric accents (orange / blue / green / yellow / red) are the sanctioned multi-hue set —
166
+ chart series and semantic status only, never solid buttons or full-section glow washes.
167
+ - Depth is the luminance ladder and translucent-white hairlines, never shadow; the focus ring is the
168
+ border thickened to ink. Detail and edit go in the side panel beside the work, never a modal.
169
+ - Keep the UI on Inter; leave behind the Domaine Display serif hero, ABC Favorit body, the full-section
170
+ glows, the 96–128px section bands, and the email-mockup insets.
171
+
172
+ ```yaml design-primitives
173
+ radius: 8px # corpus: buttons/inputs at rounded.md (8px); cards and code wells step to 12px (lg), 16px large; pill is badges-only
174
+ shadow-intensity: 0.1 # derived: corpus has no drop-shadow language ("hairlines carry the role drop shadows would"); only the light floor's overlays earn the faintest lift
175
+ border-weight: 1px # corpus: all borders are 1px translucent-white hairlines
176
+ density-gap: 1 # derived: marketing is spacious-editorial (96-128px bands); operator reads down to an honest standard tier, breathing carried by shell dims not the grid
177
+ density-inset: 1 # derived: matches density-gap for coherent component insets
178
+ font-sans: Inter, system-ui, sans-serif # corpus: Inter is the documented open-source UI face; ABC Favorit (marketing body) and Domaine Display (hero serif) stay behind
179
+ font-mono: Geist Mono, ui-monospace, SFMono-Regular, monospace # corpus: Geist Mono in every code well
180
+ font-weight-normal: 400 # corpus: body weight stays at 400; hierarchy is family/size change, never a weight bump
181
+ font-weight-strong: 500 # corpus: headings and button labels at 500; the brand never bolds body to 600
182
+ heading-tracking: -0.015em # corpus: negative letter-spacing on headings (heading-md -0.4px at 24px) scaled to em; the -0.96px hero display tracking stays behind
183
+ duration-unit: 50ms # derived: corpus documents no motion (marketing site); operator-standard functional base
184
+ duration-fast: 100ms # derived: corpus silent on motion; functional tempo
185
+ duration-normal: 150ms # derived: corpus silent on motion; standard functional tempo
186
+ duration-slow: 250ms # derived: corpus silent on motion; overlay/panel transition
187
+ ease-default: cubic-bezier(0.4,0,0.2,1) # derived: corpus silent on easing; standard functional ease
188
+ contrast-boost: 1 # derived: the translucent-white hairlines are the intentional depth language; the structural 14% border reads on black without a boost
189
+ icon-stroke: 1.5 # derived: corpus silent on icons; a fine precise stroke suits the minimal editorial-technical feel
190
+ icon-size-base: 16px # derived: corpus silent on icon size; operator standard
191
+ sidebar-width-expanded: 248px # derived: corpus has no app shell (marketing nav only); standard expanded rail
192
+ sidebar-width-collapsed: 56px # derived: standard operator icon rail
193
+ topbar-height: 64px # corpus: nav-bar height 64px (the brand's nav height)
194
+ side-panel-width: 420px # derived: corpus has no shell; standard detail-panel width
195
+ side-panel-width-rich: 640px # corpus: email-mockup inset max width 640px, reused for the content-heavy panel
196
+ modal-width-max: 560px # derived: corpus's CTA/bands are full-bleed marketing; operator confirmation cap
197
+ form-max-width: 640px # derived: corpus max content ~1200px is marketing; readable single-column form cap
198
+ table-row-height: 40px # derived: technical dark grid at standard density; dense archetypes step down via the surface catalog
199
+ verbosity: default
200
+ feedback: subtle # derived: the brand is quiet and precise (pressed/active states barely documented); functional present feedback, not austere silence
201
+ density-tier: standard # derived: a spacious-editorial marketing brand read down to an honest, dense-capable operator tier
202
+ product-traits: [dev-tools, email-api, dashboard, log-stream, admin]
203
+ ```
204
+
205
+ ```yaml lever-manifest
206
+ version: 1
207
+ fonts: { sans: "Inter, system-ui, sans-serif", mono: "Geist Mono, ui-monospace, SFMono-Regular, monospace" }
208
+ color-tokens:
209
+ light:
210
+ background: "#ffffff" # derived: no documented light mode; daytime inversion of the black canvas
211
+ foreground: "#000000" # corpus: on-light ink is #000000
212
+ card: "#ffffff"
213
+ card-foreground: "#000000"
214
+ muted: "#f1f7fe" # corpus: surface-light, the one documented light-tinted off-white
215
+ muted-foreground: "#5b6066" # derived: mid cool gray for secondary text on white (corpus on-light-mute is navy-tinted)
216
+ border: "#e4e8ee" # derived: light cool hairline
217
+ input: "#e4e8ee"
218
+ ring: "#000000" # derived: focus thickens to ink; on light that ink is black
219
+ primary: "#000000" # derived: the white-hot primary inverts to near-black — the highest-contrast solid anchor on white
220
+ primary-foreground: "#ffffff"
221
+ accent: "#eef4fc" # derived: cool light selection wash, a tint of muted; never colored
222
+ accent-foreground: "#000000"
223
+ destructive: "#e11d3f" # derived: brand red #ff2047 darkened for white-bg contrast
224
+ destructive-foreground: "#ffffff"
225
+ success: "#0a9d63" # derived: brand neon green #11ff99 darkened for readable status on white
226
+ warning: "#b8790a" # derived: brand yellow #ffc53d darkened to amber for white-bg contrast
227
+ popover: "#ffffff"
228
+ popover-foreground: "#000000"
229
+ secondary: "#f1f7fe"
230
+ secondary-foreground: "#000000"
231
+ chart-1: "#0075ff" # derived: brand accent-blue for light readability (corpus glow rgba(0,117,255))
232
+ chart-2: "#0a9d63" # derived: brand green darkened for light
233
+ chart-3: "#e06600" # derived: brand orange #ff801f darkened for light
234
+ chart-4: "#c2870a" # derived: brand yellow darkened for light
235
+ chart-5: "#e11d3f" # derived: brand red darkened for light
236
+ sidebar: "#f7f9fc" # derived: faint cool tint below the white canvas so the rail reads as chrome
237
+ sidebar-foreground: "#000000"
238
+ sidebar-primary: "#000000"
239
+ sidebar-primary-foreground: "#ffffff"
240
+ sidebar-accent: "#eef4fc"
241
+ sidebar-accent-foreground: "#000000"
242
+ sidebar-border: "#e4e8ee"
243
+ sidebar-ring: "#000000"
244
+ dark:
245
+ background: "#000000" # corpus: canvas is true black #000000, never a near-black — the brand's hard rule
246
+ foreground: "#fcfdff" # corpus: ink, faintly blue-cool off-white
247
+ card: "#0a0a0c" # corpus: surface-card, one luminance step above canvas
248
+ card-foreground: "#fcfdff"
249
+ muted: "#101012" # corpus: surface-elevated — subtle fills and hover, a step above card
250
+ muted-foreground: "#a1a4a5" # corpus: mute, supporting text and inactive labels
251
+ border: "rgba(255,255,255,0.14)" # corpus: hairline-strong, the structural border on cards, code wells, inputs
252
+ input: "rgba(255,255,255,0.14)"
253
+ ring: "#fcfdff" # corpus: focus thickens the border to ink; no separate ring colour
254
+ primary: "#fcfdff" # corpus: the white pill is the brightest pixel and the one accent
255
+ primary-foreground: "#000000" # corpus: black label on the white primary
256
+ accent: "rgba(255,255,255,0.09)" # derived: translucent-white selection wash (the brand's depth idiom); neutral, never colored
257
+ accent-foreground: "#fcfdff"
258
+ destructive: "#ff2047" # corpus: accent-red, inline error red
259
+ destructive-foreground: "#fcfdff"
260
+ success: "#11ff99" # corpus: accent-green, status dots
261
+ warning: "#ffc53d" # corpus: accent-yellow
262
+ popover: "#101012" # corpus: surface-elevated, overlays and menus
263
+ popover-foreground: "#fcfdff"
264
+ secondary: "#101012" # corpus: button-ghost surface is surface-elevated
265
+ secondary-foreground: "#fcfdff"
266
+ chart-1: "#3b9eff" # corpus: accent-blue
267
+ chart-2: "#11ff99" # corpus: accent-green
268
+ chart-3: "#ff801f" # corpus: accent-orange
269
+ chart-4: "#ffc53d" # corpus: accent-yellow
270
+ chart-5: "#ff2047" # corpus: accent-red
271
+ sidebar: "#000000" # corpus: nav-bar background is canvas
272
+ sidebar-foreground: "rgba(252,253,255,0.86)" # corpus: nav-bar text is body off-white at 86%
273
+ sidebar-primary: "#fcfdff" # corpus: the white accent in nav
274
+ sidebar-primary-foreground: "#000000"
275
+ sidebar-accent: "rgba(255,255,255,0.09)" # derived: selected-nav wash, matches accent
276
+ sidebar-accent-foreground: "#fcfdff"
277
+ sidebar-border: "rgba(255,255,255,0.06)" # corpus: hairline, the nav's soft bottom border
278
+ sidebar-ring: "#fcfdff"
279
+ spacing-scale: [2, 4, 8, 12, 16, 24, 32, 48, 64]
280
+ radius-scale: [0, 4, 6, 8, 12, 16, 9999]
281
+ shadow-levels: [none, sm, md]
282
+ motion: { durations: [100, 150, 250], easings: ["cubic-bezier(0.4,0,0.2,1)"] }
283
+ icons: { family: lucide, stroke: 1.5 }
284
+ accent-count: 1
285
+ ```
@@ -0,0 +1,225 @@
1
+ ---
2
+ schema: design-md/v1
3
+ product: Revolut
4
+ provenance: library
5
+ sourced: 2026-07-04
6
+ ---
7
+
8
+ # Revolut — operator reading
9
+
10
+ The operator translation of Revolut's fintech-meets-brochure system — a two-mode marketing canvas
11
+ (true-black storytelling bands alternating with white catalogue bands, oversized Aeonik Pro headlines,
12
+ pill buttons, eight saturated illustration colours). This entry keeps the operator-durable core and
13
+ leaves the hero scale behind; §9 lists exactly what carries and what stays. Both machine blocks are
14
+ fully valued; judgments away from the marketing brand are annotated `# derived:`.
15
+
16
+ ## 1 Visual Theme
17
+
18
+ Light by default: the working canvas is the white catalogue mode — the surface Revolut reserves for its
19
+ comparison tables and download tiles. Beside it stands a signature **true-black `sidebar`** (`#000000`):
20
+ Revolut's nav and footer are pure black, so the one piece of persistent operator chrome carries the
21
+ brand's dark identity while the work stays on white. Flat — no drop-shadow language; hierarchy comes
22
+ from surface-luminance shifts and 1px hairlines. A single accent, cobalt violet `primary` (`#494fdf`),
23
+ is reserved for the one action that matters; ink is warm near-black (`#191c1f`), never pure black.
24
+ Components are distinctly rounded (12px working, 20px cards) without the marketing pill; density is
25
+ `standard` and comfortable, the way Revolut's tall inputs feel.
26
+
27
+ ## 2 Color Roles
28
+
29
+ Light values first; one chromatic accent. Cobalt violet is the only brand stamp that carries meaning —
30
+ status hues speak status, the illustration palette lives in charts.
31
+
32
+ | Role | Value | Allowed where |
33
+ | --- | --- | --- |
34
+ | `background` / `card` / `popover` | white `#ffffff` | page, cards, and overlays — the dominant surface |
35
+ | `foreground` | warm near-black `#191c1f` (brand ink) | all primary ink; softer than pure black on purpose |
36
+ | `muted` / `secondary` | off-white `#f4f4f4` (surface-soft) | hover rows, soft-button fills, inset groups |
37
+ | `muted-foreground` | mid-slate `#505a63` (brand mute) | labels, captions, secondary text |
38
+ | `border` / `input` | hairline `#e2e2e7` | every separator, grid line, and field edge |
39
+ | `primary` | cobalt violet `#494fdf` | the one primary action; active nav; key interactive detail |
40
+ | `accent` | pale cobalt tint `#edeefc` | selected / hovered rows and nav on the light canvas |
41
+ | `accent-foreground` | cobalt deep `#3a40c4` | ink on the accent tint |
42
+ | `ring` | `primary` `#494fdf` | the focus outline — always visible, keyboard-first |
43
+ | `destructive` | danger red `#e23b4a` | destructive actions and error state only |
44
+ | `success` / `warning` | green `#428619` / orange `#ec7e00` | status signalling only, never chrome |
45
+
46
+ The eight saturated illustration colours (teal, light-blue, pink, light-green, yellow, brown) carry no
47
+ UI role — they appear only as chart series (see §7).
48
+
49
+ ## 3 Typography
50
+
51
+ Two families, one voice. `font-sans` leads with **Aeonik Pro** (the brand's editorial display face),
52
+ falling through its documented substitutes — Inter Display, General Sans, Söhne — to **Inter**, the
53
+ workhorse for body, labels, and tables. Headings carry Aeonik's tight negative tracking; body rides
54
+ Inter with a faint positive tracking that reads mechanical and fintech-precise. `font-mono` is JetBrains
55
+ Mono for amounts, IDs, and timestamps; numeric columns render `tabular-nums`.
56
+
57
+ | Step | Role | Size · line | Weight · tracking |
58
+ | --- | --- | --- | --- |
59
+ | h1 | page title | 28px / 1.2 | `font-weight-strong` · `heading-tracking` |
60
+ | h2 | section head | 22px / 1.3 | `font-weight-strong` · `heading-tracking` |
61
+ | h3 | card / group head | 18px / 1.35 | `font-weight-strong` · `heading-tracking` |
62
+ | body | UI + prose | 15px / 1.5 | `font-weight-normal` |
63
+ | small | labels, meta, dense table | 13px / 1.4 | `font-weight-normal` |
64
+ | caption | uppercase eyebrow | 12px / 1.2 | `font-weight-strong`, `+0.02em`, uppercase |
65
+
66
+ Bump weight for emphasis, never size. Aeonik's hero sizes (80–136px) stay behind — voice carries, scale does not.
67
+
68
+ ## 4 Component Stylings
69
+
70
+ Every recurring operator component composes from the primitives — no literal values.
71
+
72
+ - **Button** — `primary`: filled cobalt `primary` on `primary-foreground`, `radius` (rounded, not pilled
73
+ — the marketing pill stays behind). Secondary: `secondary` fill, `border`. Ghost: `accent` on hover.
74
+ - **Input** — `background` fill, 1px `border` (`border-weight`), `radius`; focus draws the `ring` at
75
+ full 2px, no glow; comfortable height, echoing Revolut's tall fields.
76
+ - **Card** — `card` surface, 1px `border`, the larger radius step (20px, Revolut's card corner), no
77
+ shadow — depth is the hairline and the surface.
78
+ - **Table row** — height `table-row-height`; `border` grid lines; `muted` on hover; `tabular-nums` on
79
+ numeric columns; selection tints `accent`.
80
+ - **Side panel** — detail and edit open beside the work (`side-panel-width`, `side-panel-width-rich` for
81
+ content-heavy), not over it.
82
+ - **Badge** — full pill (`radius-scale` max, the one controlled Revolut pill nod), hairline `border` or
83
+ status fill, uppercase caption; status badges take `success` / `warning` / `destructive`, never `primary`.
84
+
85
+ ## 5 Layout
86
+
87
+ Base spacing unit 4px; the on-scale ramp is `4 · 6 · 8 · 14 · 16 · 24 · 32 · 48 · 64` (6px and 14px are
88
+ Revolut's own off-grid comfort steps, kept). Shell dimensions map one-to-one to the layout primitives:
89
+ sidebar `sidebar-width-expanded` / `sidebar-width-collapsed`, topbar `topbar-height` (64px, Revolut's
90
+ nav-bar height), side panel `side-panel-width` / `side-panel-width-rich`, modal `modal-width-max`, forms
91
+ `form-max-width`, tables full-width. Density is governed globally by `density-tier` and stepped per
92
+ archetype by the surface catalog.
93
+
94
+ ## 6 Depth
95
+
96
+ Flat, and more so than most — Revolut has **no traditional drop-shadow language**. Hierarchy comes from
97
+ surface-luminance shifts and hairlines:
98
+
99
+ - **0 — canvas** `background` white, no border.
100
+ - **1 — panel / card** `card` on a 1px `border`; to lift off a band, the band steps to `muted`
101
+ (`#f4f4f4`) rather than casting a shadow.
102
+ - **2 — overlay** `popover` / side panel / modal — the one place `shadow-intensity` earns a low `md`.
103
+
104
+ The black `sidebar` runs its own dark ladder: `#000000` chrome, `#16181a` hovered/selected nav row,
105
+ `#ffffff1f` dividers. Focus is a 2px cobalt `ring` outline (never a glow) on every interactive element;
106
+ three z-levels: content, sticky chrome, overlay.
107
+
108
+ ## 7 Do's & Don'ts
109
+
110
+ - **Do** reserve cobalt `primary` for the single most important action — a stamp, not a theme. If two things want it, one is not primary.
111
+ - **Do** keep the `sidebar` true black `#000000` — Revolut's black is `#000000`, not near-black; a deliberate override of the light-surface default.
112
+ - **Do** carry depth with surface-luminance and hairlines; keep body ink warm `#191c1f`, not pure black.
113
+ - **Do** apply `tabular-nums` to every numeric column and `font-mono` to amounts, IDs, and timestamps.
114
+ - **Don't** promote a second chromatic accent — the eight illustration colours are chart series only, never chrome.
115
+ - **Don't** full-pill buttons or CTAs — the marketing pill stays behind; buttons take `radius`, only badges pill.
116
+ - **Don't** add drop shadows to cards; colour-block and surface-luminance carry elevation.
117
+ - **Don't** open detail or edit in a modal when the side panel fits — modals are confirmations only.
118
+
119
+ ## 8 Responsive
120
+
121
+ The operator sweep is 375 / 768 / 1024 / 1440.
122
+
123
+ | Breakpoint | What changes |
124
+ | --- | --- |
125
+ | 375 | black `sidebar` → off-canvas drawer; two-pane list+detail stacks; side panel → full sheet; density holds |
126
+ | 768 | sidebar collapses to the black icon rail (`sidebar-width-collapsed`); tables scroll their overflow |
127
+ | 1024 | sidebar expands; two-pane queue+detail holds side by side |
128
+ | 1440 | forms cap at `form-max-width`; tables and dashboards use the full width |
129
+
130
+ ## 9 Agent Prompt Guide
131
+
132
+ **Carries over:** cobalt violet `primary` as the single accent · warm-black `#191c1f` ink · the black
133
+ `#000000` sidebar chrome · rounded character (12px working, 20px cards) · Aeonik heading voice with tight
134
+ tracking over an Inter body · flat, shadowless depth · `tabular-nums` money.
135
+
136
+ **Stays behind:** the black canvas as the *working* surface · hero-scale Aeonik (80–136px) · the
137
+ white-pill-on-black CTA (a dark-canvas device — the operator primary is the cobalt fill) · full-pill
138
+ buttons · the band-switching rhythm · the illustration palette as chrome.
139
+
140
+ - Lead every list surface with its table; the black sidebar is the persistent left chrome.
141
+ - Accent only the primary action with cobalt; everything else is neutral or status.
142
+ - Detail and edit go in the side panel; a modal is a confirmation, not a workspace.
143
+ - Every numeric column is `tabular-nums`; every amount / ID / timestamp is `font-mono`, and every
144
+ workflow completes from the keyboard with the cobalt `ring` outline always visible.
145
+ - Stay flat — hairline and surface before shadow; illustration colours are chart series, not chrome.
146
+
147
+ ```yaml design-primitives
148
+ radius: 12px # derived: Revolut's input radius (rounded.md) — the working-component corner; rounder than a typical operator base to carry the brand
149
+ shadow-intensity: 0.3 # derived: Revolut has no drop-shadow language; shadow barely lifts a true overlay
150
+ border-weight: 1px
151
+ density-gap: 1
152
+ density-inset: 1
153
+ font-sans: Aeonik Pro, Inter Display, General Sans, Inter, system-ui, sans-serif
154
+ font-mono: JetBrains Mono, ui-monospace, SFMono-Regular, monospace # derived: corpus ships no mono; a clean geometric mono for amounts/IDs, pairing with Inter
155
+ font-weight-normal: 400
156
+ font-weight-strong: 600 # derived: brand display is Aeonik 500, but operator headings at 18–28px read cleaner at 600 (Revolut's own bold/button weight)
157
+ heading-tracking: -0.02em # derived: Revolut's display-xxl ratio (-2.72px/136px); carries the signature tight tracking at operator heading sizes
158
+ duration-unit: 50ms # derived: corpus silent on motion; functional operator defaults
159
+ duration-fast: 100ms # derived: corpus silent on motion
160
+ duration-normal: 150ms # derived: corpus silent on motion
161
+ duration-slow: 250ms # derived: corpus silent on motion
162
+ ease-default: cubic-bezier(0.4,0,0.2,1) # derived: corpus silent on motion; standard operator ease
163
+ contrast-boost: 1
164
+ icon-stroke: 1.75 # derived: corpus has no icon spec; one step under lucide's 2 for a refined operator stroke
165
+ icon-size-base: 16px # derived: corpus has no icon spec; operator default
166
+ sidebar-width-expanded: 256px # derived: Revolut is a top-nav marketing site; comfortable operator sidebar
167
+ sidebar-width-collapsed: 56px # derived: standard operator icon rail
168
+ topbar-height: 64px # Revolut nav-bar height
169
+ side-panel-width: 420px # derived: no side panels in the marketing corpus; operator default
170
+ side-panel-width-rich: 640px # derived: operator default for content-heavy detail
171
+ modal-width-max: 560px # derived: operator default
172
+ form-max-width: 640px # derived: operator default
173
+ table-row-height: 44px # derived: Revolut's comfortable feel (tall inputs) → a touch taller than the 40px operator norm
174
+ verbosity: default
175
+ feedback: subtle
176
+ density-tier: standard # derived: Revolut's generous marketing whitespace stays behind; operator density is standard-comfortable, not dense-terminal
177
+ product-traits: [fintech, payments, transaction-queue, dashboard, crm]
178
+ ```
179
+
180
+ ```yaml lever-manifest
181
+ version: 1
182
+ fonts: { sans: "Aeonik Pro, Inter Display, General Sans, Inter, system-ui, sans-serif", mono: "JetBrains Mono, ui-monospace, SFMono-Regular, monospace" }
183
+ color-tokens:
184
+ light:
185
+ background: "#ffffff"
186
+ foreground: "#191c1f"
187
+ card: "#ffffff"
188
+ card-foreground: "#191c1f"
189
+ muted: "#f4f4f4"
190
+ muted-foreground: "#505a63"
191
+ border: "#e2e2e7"
192
+ input: "#e2e2e7"
193
+ ring: "#494fdf"
194
+ primary: "#494fdf"
195
+ primary-foreground: "#ffffff"
196
+ accent: "#edeefc" # derived: pale cobalt tint for selected/hovered rows; corpus gives no light tint of primary
197
+ accent-foreground: "#3a40c4"
198
+ destructive: "#e23b4a"
199
+ destructive-foreground: "#ffffff"
200
+ success: "#428619"
201
+ warning: "#ec7e00"
202
+ popover: "#ffffff"
203
+ popover-foreground: "#191c1f"
204
+ secondary: "#f4f4f4"
205
+ secondary-foreground: "#191c1f"
206
+ chart-1: "#494fdf"
207
+ chart-2: "#00a87e"
208
+ chart-3: "#007bc2"
209
+ chart-4: "#ec7e00"
210
+ chart-5: "#e61e49"
211
+ sidebar: "#000000"
212
+ sidebar-foreground: "#ffffff"
213
+ sidebar-primary: "#494fdf"
214
+ sidebar-primary-foreground: "#ffffff"
215
+ sidebar-accent: "#16181a"
216
+ sidebar-accent-foreground: "#ffffff"
217
+ sidebar-border: "#ffffff1f" # derived: hairline-dark rgba(255,255,255,0.12) as 8-digit hex
218
+ sidebar-ring: "#494fdf"
219
+ spacing-scale: [4, 6, 8, 14, 16, 24, 32, 48, 64]
220
+ radius-scale: [0, 8, 12, 20, 9999]
221
+ shadow-levels: [none, sm, md]
222
+ motion: { durations: [100, 150, 250], easings: ["cubic-bezier(0.4,0,0.2,1)"] }
223
+ icons: { family: lucide, stroke: 1.75 }
224
+ accent-count: 1
225
+ ```