@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,248 @@
1
+ ---
2
+ schema: design-md/v1
3
+ product: Spotify
4
+ provenance: library
5
+ sourced: 2026-07-04
6
+ ---
7
+
8
+ # Spotify — the near-black operator reading
9
+
10
+ A content-first cocoon reduced to one idea: the UI recedes into near-black shadow so the work glows,
11
+ with a single functional green accent doing all the color. This entry is a deliberate operator reading
12
+ of Spotify — the dark immersion and the one-green discipline carried onto internal tools (a media
13
+ library, a catalog console, a content-ops dashboard), with the album-art color source and the hero
14
+ pill geometry left behind. Spotify is a **categorically dark** brand; the manifest ships that dark
15
+ surface set in the default slot (the corpus forbids light primary surfaces). Judgments away from the
16
+ corpus are annotated `# derived:`.
17
+
18
+ ## 1 Visual Theme
19
+
20
+ Dark by conviction, not by option. `background` is near-black `#121212` (never pure black — Spotify is
21
+ deliberately near-black), and surfaces step up by lightness rather than by line: `card` #181818,
22
+ interactive `secondary` #1f1f1f, elevated cards #252525/#272727. A single accent — Spotify Green
23
+ `primary` (#1ed760) — carries the one action that matters and nothing decorative. Because an operator
24
+ surface has no album art to color it, that green plus the status hues carry **all** the color on an
25
+ otherwise achromatic field; keep them scarce. Depth is shadow-carried, not flat — on near-black a
26
+ hairline all but vanishes, so elevation reads through heavy shadow and surface-lightening. Density is
27
+ `dense`: dark compression, built for scanning. This is Spotify's one true theme, so
28
+ `color-tokens.light` (the always-present default slot) carries the near-black set — dark is not opt-in
29
+ here, it is the identity.
30
+
31
+ ## 2 Color Roles
32
+
33
+ One accent — `primary` green is the only chromatic hue that carries brand meaning; red / orange / blue
34
+ speak status only. On the achromatic near-black field the accent and status hues are the sole color, so
35
+ scarcity is doubly load-bearing.
36
+
37
+ | Role | Value | Allowed where |
38
+ | --- | --- | --- |
39
+ | `primary` | Spotify Green #1ed760 | the one primary action, active nav, play/CTA — never decorative, never on a background |
40
+ | `primary-foreground` | black #000000 | icon/text on the green fill — the signature; never white on green |
41
+ | `background` / `sidebar` | near-black #121212 | page and nav canvas — the deepest layer, the dark cocoon |
42
+ | `card` | dark surface #181818 | cards, containers — one lightness step off the canvas |
43
+ | `secondary` / `muted` | mid-dark #1f1f1f | interactive/secondary surfaces, subtle fills, hover rows |
44
+ | `foreground` | white #ffffff | primary text (max-emphasis #fdfdfd, bright secondary #cbcbcb available) |
45
+ | `muted-foreground` | silver #b3b3b3 | secondary text, inactive nav, captions, dividers |
46
+ | `border` / `input` | subtle #2a2a2a | grid lines and field edges (control borders take the heavier #4d4d4d) |
47
+ | `accent` | lift #282828 | selected/hovered rows and nav — a neutral surface-lift, never a green wash |
48
+ | `ring` | green #1ed760 | the focus outline — unmistakable, because keyboard-first |
49
+ | `destructive` | negative red #f3727f | destructive actions and error state |
50
+ | `success` | deep green #1db954 | up/success status — the deeper green variant, distinct from the bright accent |
51
+ | `warning` | orange #ffa42b | caution and warning status only |
52
+
53
+ Announcement blue #539df5 is an info/status hue and a chart color, never a second brand accent.
54
+
55
+ ## 3 Typography
56
+
57
+ One family, split by cut. `font-sans` is SpotifyMixUI (Circular by Lineto; Inter is the corpus-adjacent
58
+ substitute) — the Title cut serves headings, the UI cut serves body, tables, and labels, same family.
59
+ The voice is a **bold/regular binary**: most text is 700 (`font-weight-strong`) or 400
60
+ (`font-weight-normal`), 600 used sparingly — hierarchy comes from weight contrast, not size. Type is
61
+ compact (10–24px), tuned for scanning, not reading. `font-mono` is derived — the corpus names none (a
62
+ music player has no IDs or logs), but operator tables need a numeric voice; numeric columns render
63
+ `tabular-nums`.
64
+
65
+ | Step | Role | Size · line | Weight · tracking |
66
+ | --- | --- | --- | --- |
67
+ | h1 | page / section title | 24px / 1.25 | `font-weight-strong` · 0 |
68
+ | h2 | feature heading | 18px / 1.3 | `font-weight-strong` · 0 |
69
+ | h3 | card / group head | 16px / 1.4 | `font-weight-strong` · 0 |
70
+ | body | UI + prose | 14px / 1.45 | `font-weight-normal` |
71
+ | small | labels, dense table | 12px / 1.5 | `font-weight-normal` |
72
+ | caption | uppercase eyebrow | 12px / 1.33 | `font-weight-strong`, +0.1em, uppercase |
73
+ | code | IDs, timestamps, amounts | 13px / 1.5 | `font-mono` |
74
+
75
+ The uppercase + wide-tracking (1.4–2px) systematic label voice survives on eyebrows and section labels;
76
+ it does not ride every button — operator buttons stay sentence-case for scannability.
77
+
78
+ ## 4 Component Stylings
79
+
80
+ Every recurring operator component composes from the primitives — no literal values.
81
+
82
+ - **Button** — `primary`: filled green on black `primary-foreground`, `radius` (8px), no pill. The full
83
+ 500px pill is a hero flourish left behind; the rounded-tactile character carries at 8px. Secondary:
84
+ `secondary` #1f1f1f fill, `foreground`. Ghost: transparent, `accent` lift on hover. Icon-only
85
+ controls stay **circular** — the one piece of pill-and-circle geometry that carries.
86
+ - **Input** — `secondary` fill, `radius`; focus draws the green `ring` at 2px. On dark, the edge reads
87
+ as an inset/surface step, not an exposed gray line.
88
+ - **Card** — `card` #181818 surface, `radius`; hover lightens the surface a step rather than drawing a
89
+ border; shadow (`shadow-intensity`) only when it must lift off the canvas.
90
+ - **Table row** — `table-row-height`; row separation by surface-lightening or a subtle `border`;
91
+ `accent` on selection; `muted` on hover; `tabular-nums` + `font-mono` on numeric columns.
92
+ - **Side panel** — detail and edit open in the side panel (`side-panel-width`, `side-panel-width-rich`),
93
+ beside the work, not over it.
94
+ - **Badge** — pill radius (9999), `muted` / status fill, uppercase caption; status badges take
95
+ `success` / `warning` / `destructive`, never `primary`.
96
+
97
+ ## 5 Layout
98
+
99
+ Base unit 8px; the on-scale ramp is `2 · 4 · 8 · 12 · 16 · 20 · 24 · 32 · 48` (Spotify's fine dense low
100
+ end 2–20 carries; 24–48 are operator section spacing). Shell dimensions map one-to-one to the layout
101
+ primitives: sidebar `sidebar-width-expanded` / `sidebar-width-collapsed`, topbar `topbar-height` (the
102
+ generous search-pill chrome), side panel `side-panel-width` / `side-panel-width-rich`, modal
103
+ `modal-width-max`, forms `form-max-width`, tables full-width. Spotify's full-width now-playing bottom
104
+ bar carries as an optional persistent transport/status bar in a media tool, not as literal music
105
+ chrome. Density is governed globally by `density-tier` (dark compression) and stepped per archetype —
106
+ never by absolute overrides.
107
+
108
+ ## 6 Depth
109
+
110
+ Shadow-carried, inverting the flat default — on near-black a hairline vanishes, so elevation is heavy
111
+ shadow plus surface-lightening (the corpus: never expose raw gray borders):
112
+
113
+ - **0 — canvas** `background` #121212, no border.
114
+ - **1 — surface** `card` #181818 / `secondary` #1f1f1f — one lightness step; hover lightens further.
115
+ - **2 — elevated** dropdowns and hover cards ride a `md` shadow (`rgba(0,0,0,0.3) 0 8px 8px`).
116
+ - **3 — dialog** modals, menus, side panels ride an `lg` shadow (`rgba(0,0,0,0.5) 0 8px 24px`) — the
117
+ dramatic "floating in darkness" lift.
118
+ - **inset — inputs** the recessed inset-border combo (`rgb(124,124,124) 0 0 0 1px inset`) reads as a
119
+ tactile field edge, not an exposed line.
120
+
121
+ Focus is a green `ring` outline (never a glow), visible on every interactive element. Three z-levels:
122
+ content, sticky chrome, overlay.
123
+
124
+ ## 7 Do's & Don'ts
125
+
126
+ - **Do** anchor on near-black `#121212`–`#1f1f1f`; carry depth through shade variation and heavy shadow,
127
+ because on dark a subtle shadow is invisible.
128
+ - **Do** reserve green `primary` for the single most important action, active state, and play/CTA —
129
+ never decoratively, never on a background. On green, keep black `primary-foreground`.
130
+ - **Do** let the achromatic gray field rest the eye; supply color only through the one accent and the
131
+ status hues (there is no album art here to do it for you).
132
+ - **Do** carry the bold/regular (700/400) weight binary and keep type compact; apply `tabular-nums` and
133
+ `font-mono` to every numeric column.
134
+ - **Don't** add a second brand color — announcement blue, orange, and red are status/chart roles, and
135
+ the deep green `success` is status, not a second accent.
136
+ - **Don't** use light backgrounds for primary surfaces — the dark immersion is the identity.
137
+ - **Don't** full-pill operator buttons or drop uppercase wide-tracking onto every label — those are
138
+ hero-scale flourishes; the rounded character lives at 8px and circular icon buttons.
139
+ - **Don't** expose raw gray borders where a surface-lift or inset edge will do; don't relax the compact
140
+ line-heights.
141
+
142
+ ## 8 Responsive
143
+
144
+ The operator sweep is 375 / 768 / 1024 / 1440:
145
+
146
+ | Breakpoint | What changes |
147
+ | --- | --- |
148
+ | 375 | sidebar → off-canvas drawer (Spotify's nav → bottom bar echoes here); two-pane list+detail stacks; side panel → full sheet; density holds |
149
+ | 768 | sidebar collapses to the icon rail (`sidebar-width-collapsed`); card grid re-flows 3→2; tables scroll their overflow |
150
+ | 1024 | sidebar expands; two-pane queue+detail holds side by side; grid 5→3 |
151
+ | 1440 | forms cap at `form-max-width`; tables and dashboards use the full width; grid opens up |
152
+
153
+ ## 9 Agent Prompt Guide
154
+
155
+ - Start in near-black darkness — everything lives on `#121212`; surfaces step by lightness (#181818,
156
+ #1f1f1f), never by exposed borders. This is the one theme; do not offer a light mockup of it.
157
+ - One accent, always: green `primary` marks THE action and active nav, black on green. On the
158
+ achromatic field the green and the status hues are the only color — keep them scarce and functional.
159
+ - Carry depth with heavy shadow (`md`/`lg`) and surface-lightening, not flat hairlines — the operator's
160
+ usual flat default is inverted here because shadow is what reads on dark.
161
+ - Bold/regular weight binary (700/400); compact type; `tabular-nums` + `font-mono` on every numeric
162
+ column; the uppercase wide-tracked label voice on eyebrows only.
163
+ - Keep the rounded-tactile character at 8px `radius`, pill for badges/chips, circular for icon-only
164
+ controls.
165
+ - Leave behind: album-art-as-color-source (there is none — the UI supplies its own restrained color),
166
+ the 500px hero pills, uppercase wide-tracking on every button, the light-mode marketing pills, and the
167
+ literal music transport bar. What carries: the near-black palette, the one functional green, the
168
+ achromatic discipline, the compact dense type, the rounded/circular geometry, and shadow-carried depth.
169
+
170
+ ```yaml design-primitives
171
+ radius: 8px # corpus: Spotify's comfortable/dialog radius; controls read rounded-tactile without the 500px hero pill (left behind)
172
+ shadow-intensity: 0.8 # corpus: depth is heavy shadow (0.3-0.5 alpha at 8-24px) — on near-black a hairline vanishes, so shadow lifts; the flat default is inverted here
173
+ border-weight: 1px
174
+ density-gap: 0.85 # derived: dark-compression — Spotify packs content densely, gaps and rows tighten
175
+ density-inset: 0.85 # derived: matches the dense tier's tighter component insets
176
+ font-sans: SpotifyMixUI, Inter, system-ui, sans-serif # SpotifyMixUI (Circular family); Inter is the corpus-adjacent substitute; the Title cut serves headings, same family
177
+ font-mono: JetBrains Mono, ui-monospace, monospace # derived: corpus names no mono (a player has no IDs/logs); operator tables need a numeric voice
178
+ font-weight-normal: 400 # corpus: regular is 400
179
+ font-weight-strong: 700 # corpus: the bold/regular binary — most text is 700 or 400, 600 sparingly
180
+ heading-tracking: 0 # corpus: Spotify titles track normal; the wide 1.4-2px tracking rides the uppercase label voice, not headings
181
+ duration-unit: 50ms # derived: corpus silent on motion; functional operator base
182
+ duration-fast: 100ms # derived: corpus silent on motion
183
+ duration-normal: 150ms # derived: corpus silent on motion
184
+ duration-slow: 250ms # derived: corpus silent on motion
185
+ ease-default: cubic-bezier(0.4,0,0.2,1) # derived: corpus silent; standard functional ease
186
+ contrast-boost: 1 # derived: the grid reads via surface-lightening and shadow, not boosted hairlines
187
+ icon-stroke: 2 # derived: Spotify's filled, bold glyph character → the full lucide stroke, not the refined 1.75
188
+ icon-size-base: 16px # derived: corpus silent; operator base control-icon size
189
+ sidebar-width-expanded: 256px # derived: a media-library rail wants room for playlist/entity names; a touch wider than the dense 248 default
190
+ sidebar-width-collapsed: 56px # derived: corpus silent; operator icon rail
191
+ topbar-height: 64px # derived: Spotify's top chrome is generous for the search pill and account
192
+ side-panel-width: 420px # derived: corpus's now-playing/queue panel; operator standard
193
+ side-panel-width-rich: 640px # derived: content-heavy detail width
194
+ modal-width-max: 560px # derived: corpus silent; confirmations only
195
+ form-max-width: 640px # derived: corpus silent; operator standard
196
+ table-row-height: 40px # derived: Spotify's album-thumbnail track rows run taller (~56px); a bare operator data row lands at 40px, dense archetypes step down
197
+ verbosity: compact # derived: content-first, scannable — Spotify trusts dense content over explanatory chrome
198
+ feedback: subtle
199
+ density-tier: dense # corpus: content density over breathing room, dark compression
200
+ product-traits: [media-library, catalog, dashboard, content-ops, admin]
201
+ ```
202
+
203
+ ```yaml lever-manifest
204
+ version: 1
205
+ fonts: { sans: "SpotifyMixUI, Inter, system-ui, sans-serif", mono: "JetBrains Mono, ui-monospace, monospace" }
206
+ color-tokens:
207
+ light: # categorically-dark brand — the default slot carries Spotify's near-black surface set; the corpus forbids light primary surfaces
208
+ background: "#121212"
209
+ foreground: "#ffffff"
210
+ card: "#181818"
211
+ card-foreground: "#ffffff"
212
+ muted: "#1f1f1f"
213
+ muted-foreground: "#b3b3b3"
214
+ border: "#2a2a2a" # derived: subtle grid/field hairline on near-black; corpus reserves #4d4d4d for control borders and prefers inset/surface-lightening over exposed lines
215
+ input: "#2a2a2a" # derived: field edge; input focus draws the ring
216
+ ring: "#1ed760" # derived: keyboard-first needs a visible ring; the accent green is the natural choice (corpus's #000000 focus edge fails the ring-visible floor)
217
+ primary: "#1ed760" # corpus: Spotify Green — the one accent
218
+ primary-foreground: "#000000" # corpus: black icon/text on green — the signature, never white on green
219
+ accent: "#282828" # derived: selection/hover lightens the surface a step (corpus hover = background lightening), a neutral lift, never a green wash
220
+ accent-foreground: "#ffffff"
221
+ destructive: "#f3727f" # corpus: negative red (--text-negative)
222
+ destructive-foreground: "#000000" # derived: black reads on the light coral-red; white on #f3727f fails contrast
223
+ success: "#1db954" # corpus: the deeper green-border variant, distinct from the bright #1ed760 accent so status green does not read as the primary CTA
224
+ warning: "#ffa42b" # corpus: warning orange (--text-warning)
225
+ popover: "#282828" # derived: elevated overlay/menu surface, a step above card, lifted by heavy shadow
226
+ popover-foreground: "#ffffff"
227
+ secondary: "#1f1f1f" # corpus: interactive/button surface (#1f1f1f)
228
+ secondary-foreground: "#ffffff"
229
+ chart-1: "#1ed760" # green
230
+ chart-2: "#539df5" # corpus: announcement blue
231
+ chart-3: "#ffa42b" # corpus: warning orange
232
+ chart-4: "#f3727f" # corpus: negative red
233
+ chart-5: "#b3b3b3" # derived: silver neutral for the fifth series (green + achromatic palette — no purple)
234
+ sidebar: "#121212" # corpus: navigation sidebar #121212
235
+ sidebar-foreground: "#ffffff"
236
+ sidebar-primary: "#1ed760"
237
+ sidebar-primary-foreground: "#000000"
238
+ sidebar-accent: "#282828"
239
+ sidebar-accent-foreground: "#ffffff"
240
+ sidebar-border: "#2a2a2a"
241
+ sidebar-ring: "#1ed760"
242
+ spacing-scale: [2, 4, 8, 12, 16, 20, 24, 32, 48]
243
+ radius-scale: [4, 6, 8, 12, 9999]
244
+ shadow-levels: [none, sm, md, lg]
245
+ motion: { durations: [100, 150, 250], easings: ["cubic-bezier(0.4,0,0.2,1)"] }
246
+ icons: { family: lucide, stroke: 2 }
247
+ accent-count: 1
248
+ ```
@@ -0,0 +1,241 @@
1
+ ---
2
+ schema: design-md/v1
3
+ product: Stripe
4
+ provenance: library
5
+ sourced: 2026-07-04
6
+ ---
7
+
8
+ # Stripe — operator reading
9
+
10
+ The operator translation of Stripe's financial-infrastructure brand — a marketing system built on a
11
+ gradient-mesh hero, thin Sohne display type at negative tracking, single-indigo pill CTAs, and tabular
12
+ money figures. This entry keeps the operator-durable core — the indigo accent, the deep-navy ink, the
13
+ cool temperature, the soft blue-tinted lift, the thin editorial type voice, the tabular-figure money
14
+ signal — and leaves the marketing scaffolding behind; §9 lists exactly what carries and what stays.
15
+ Both machine blocks are fully valued; judgments away from the marketing brand are annotated `# derived:`.
16
+
17
+ ## 1 Visual Theme
18
+
19
+ Light by default; dark is opt-in. The working canvas is white `background`, banded with a cool-tinted
20
+ off-white `canvas-soft` for grouped panels. Stripe's one departure from pure-flat carries: cards lift on
21
+ a **soft blue-tinted shadow** (`shadow-blue`, `rgba(0,55,112,0.08)`), not gray — depth reads cool and
22
+ engineered, never heavy. A single accent, indigo `primary` (`#533afd`), is reserved for the one action
23
+ that matters; ink is deep navy `foreground` (`#0d253d`), never pure black. The temperature runs cool
24
+ throughout — hairlines lean blue, inputs cooler still. The type voice is thin and editorial (Sohne, Inter
25
+ substitute) with negative heading tracking and the `ss01` stylistic set. Density is `standard` — the
26
+ dashboard reads clean and moderate, neither terminal-dense nor consumer-spacious.
27
+
28
+ ## 2 Color Roles
29
+
30
+ Light values (the manifest carries hex — the corpus's native format). One chromatic accent — indigo is
31
+ the only brand hue that carries meaning; status hues speak only status; the gradient palette lives in
32
+ charts, never chrome.
33
+
34
+ | Role | Value | Allowed where |
35
+ | --- | --- | --- |
36
+ | `background` / `card` / `popover` | white `#ffffff` (canvas) | page, cards, and overlays — the dominant surface |
37
+ | `foreground` | deep navy `#0d253d` (ink) | all primary ink; never pure black |
38
+ | `muted` / `secondary` | cool off-white `#f6f9fc` (canvas-soft) | hover rows, subtle fills, grouped panel bands |
39
+ | `muted-foreground` | mid slate `#64748d` (ink-mute) | labels, captions, table meta |
40
+ | `border` | hairline `#e3e8ee` | every separator, grid line, and card edge |
41
+ | `input` | cooler hairline `#a8c3de` (hairline-input) | form-field edges only — the brand's cool input border |
42
+ | `primary` | indigo `#533afd` | the one primary action; active nav; inline link emphasis |
43
+ | `accent` | pale indigo `#edecfe` | selected/hovered rows and nav on the light canvas |
44
+ | `accent-foreground` | indigo deep `#4434d4` (primary-deep) | ink on the accent tint |
45
+ | `ring` | `primary` `#533afd` | the focus outline — always visible, keyboard-first |
46
+ | `destructive` | ruby `#ea2261` | destructive actions and error state only |
47
+ | `success` / `warning` | green `#1a8754` / amber `#bb5504` | status signalling only, never chrome |
48
+
49
+ The gradient stops (cream, sherbet, lavender, magenta, ruby) carry no UI role — they appear only as
50
+ chart series (see §7). Deep-navy `brand-dark-900` (`#1c1e54`) is not a page surface here.
51
+
52
+ ## 3 Typography
53
+
54
+ One voice, thin and precise. `font-sans` is **Inter** — the documented open substitute for Stripe's
55
+ proprietary Sohne — carrying the brand rhythm with `ss01` enabled and negative tracking on headings;
56
+ it serves body, UI, table, and label. The 56px display tier and its weight-300 air stay behind, but the
57
+ thin editorial voice and tight tracking carry at operator heading scale. `font-mono` renders IDs, codes,
58
+ timestamps, and log lines; numeric columns and every money cell render `tabular-nums` — the brand's quiet
59
+ financial-data signal, which carries strongly.
60
+
61
+ | Step | Role | Size · line | Weight · tracking |
62
+ | --- | --- | --- | --- |
63
+ | h1 | page title | 24px / 1.25 | `font-weight-strong` · `heading-tracking` |
64
+ | h2 | section head | 18px / 1.3 | `font-weight-strong` · `heading-tracking` |
65
+ | h3 | card / group head | 15px / 1.4 | `font-weight-strong` · -0.01em |
66
+ | body | UI + prose | 14px / 1.45 | `font-weight-normal` |
67
+ | small | labels, meta, dense table | 13px / 1.4 | `font-weight-normal` |
68
+ | caption | uppercase eyebrow | 12px / 1.4 | `font-weight-strong`, +0.02em, uppercase |
69
+ | tabular | money / counts | 14px / 1.4 | `font-weight-normal`, `tabular-nums` |
70
+
71
+ Bump weight one step for emphasis — a thin brand, so emphasis lifts to medium 500, never a heavy 600.
72
+ Apply `ss01` on the body element so the stylistic-set substitution rides every text role.
73
+
74
+ ## 4 Component Stylings
75
+
76
+ Every recurring operator component composes from the primitives — no literal values.
77
+
78
+ - **Button** — `primary`: filled indigo `primary` on `primary-foreground`, `radius` (rounded, not pilled
79
+ — the marketing pill stays behind). Secondary: `secondary` fill, 1px `border`, `primary` text. Ghost:
80
+ transparent, `accent` on hover.
81
+ - **Input** — `background` fill, 1px `input` border (`border-weight`) — the cool input hairline; `radius`;
82
+ focus swaps the border to the `ring` at full 2px, no glow.
83
+ - **Card** — `card` surface, 1px `border`, `radius`; lifts on the soft blue-tinted `md` shadow
84
+ (`shadow-intensity`) — the brand's one elevation cue; inset by `density-inset`.
85
+ - **Table row** — height `table-row-height`; `border` grid lines; `muted` on hover; `tabular-nums` on
86
+ numeric columns; row selection tints `accent`.
87
+ - **Side panel** — detail and edit open in the side panel (`side-panel-width`, `side-panel-width-rich`
88
+ for content-heavy), beside the work, not over it.
89
+ - **Badge** — status pill (`radius-scale` max, the one controlled brand pill nod), hairline `border` or
90
+ status fill, uppercase caption; status badges take `success` / `warning` / `destructive`, never `primary`.
91
+
92
+ ## 5 Layout
93
+
94
+ Base spacing rhythm 8px on a 4px grid; the on-scale ramp is `2 · 4 · 8 · 12 · 16 · 24 · 32 · 48 · 64`
95
+ (48 added on the 8px grid; the corpus jumps 32→64 for marketing bands, which stay behind). Shell
96
+ dimensions map one-to-one to the layout primitives: sidebar `sidebar-width-expanded` /
97
+ `sidebar-width-collapsed`, topbar `topbar-height`, side panel `side-panel-width` / `side-panel-width-rich`,
98
+ modal `modal-width-max`, forms `form-max-width`, tables full-width. The marketing section padding
99
+ (64–96px) and the 1200px centered container stay behind. Density is governed globally by `density-tier`
100
+ and stepped per archetype by the surface catalog — never by absolute overrides.
101
+
102
+ ## 6 Depth
103
+
104
+ Subtly lifted, cool. Unlike a pure-flat operator brand, Stripe carries one soft elevation cue — a
105
+ blue-tinted shadow — and otherwise leans on hairlines and the surface ladder:
106
+
107
+ - **0 — canvas** `background` white, no border.
108
+ - **1 — panel / card** `card` on a 1px `border`; lifts on a soft blue-tinted shadow
109
+ (`rgba(0,55,112,0.08) 0 1px 3px`) — the brand's signature cool lift, kept restrained.
110
+ - **2 — overlay** `popover` / side panel / modal — a deeper blue-tinted `md`
111
+ (`rgba(0,55,112,0.08) 0 8px 24px`) for floating chrome. No level stacks a heavier shadow to signal
112
+ rank; rank is border, position, and the one soft lift.
113
+
114
+ The gradient-mesh backdrop — the corpus's primary marketing depth medium — stays behind entirely. Focus
115
+ is a 2px indigo `ring` outline (never a glow), visible on every interactive element. Three z-levels:
116
+ content, sticky chrome, overlay.
117
+
118
+ ## 7 Do's & Don'ts
119
+
120
+ - **Do** reserve indigo `primary` for the single most important action and inline link emphasis — one
121
+ filled control per view. If two things want it, one is not primary.
122
+ - **Do** keep ink deep navy `#0d253d`, never pure black; keep the temperature cool, hairlines blue-leaning.
123
+ - **Do** lift cards on the soft blue-tinted shadow (`shadow-blue`), never a neutral gray drop shadow.
124
+ - **Do** apply `tabular-nums` to every money and numeric column and `font-mono` to IDs, codes, timestamps;
125
+ keep `ss01` on the body.
126
+ - **Don't** promote a second chromatic accent — the gradient stops (cream, sherbet, lavender, magenta,
127
+ ruby) are chart series only, never chrome, and indigo is never a body-text color.
128
+ - **Don't** pill the primary CTA — the marketing pill stays behind; buttons take `radius`, only status
129
+ badges pill.
130
+ - **Don't** carry the gradient mesh, the cream feature band, or the dark-navy featured-tier inversion into
131
+ an operator surface.
132
+ - **Don't** open detail or edit in a modal when the side panel fits — modals are confirmations only.
133
+
134
+ ## 8 Responsive
135
+
136
+ The operator sweep is 375 / 768 / 1024 / 1440.
137
+
138
+ | Breakpoint | What changes |
139
+ | --- | --- |
140
+ | 375 | sidebar → off-canvas drawer; two-pane list+detail stacks; side panel → full sheet; density holds |
141
+ | 768 | sidebar collapses to the icon rail (`sidebar-width-collapsed`); tables scroll their overflow |
142
+ | 1024 | sidebar expands; two-pane queue+detail holds side by side |
143
+ | 1440 | forms cap at `form-max-width`; tables and dashboards use the full width |
144
+
145
+ ## 9 Agent Prompt Guide
146
+
147
+ **Carries over:** indigo `primary` (`#533afd`) as the single reserved accent · deep-navy ink `#0d253d`
148
+ (never pure black) · the cool temperature with a cooler input hairline · the soft blue-tinted card
149
+ shadow (`rgba(0,55,112,0.08)`) · the thin Sohne/Inter type voice with negative heading tracking and
150
+ `ss01` · `tabular-nums` money as the financial-data signal.
151
+
152
+ **Stays behind:** the gradient-mesh backdrop · hero-scale display (56px, weight 300) · the pill CTA
153
+ (`8px 16px` pill) · the cream feature band · the dark-navy featured-tier inversion · the composited
154
+ product-UI mockups · the dark-app dashboard shell as the working surface.
155
+
156
+ - Lead every list surface with its table; accent only the primary action in indigo.
157
+ - Detail and edit go in the side panel; a modal is a confirmation, not a workspace.
158
+ - Every money and numeric column is `tabular-nums`; every ID / code / timestamp is `font-mono`, and every
159
+ workflow completes from the keyboard with the indigo `ring` outline always visible.
160
+ - Lift a card on the soft blue-tinted shadow, not a gray one; reach past a hairline only for a real
161
+ overlay. Leave the gradient mesh, the hero display, and the cream bands behind.
162
+
163
+ ```yaml design-primitives
164
+ radius: 6px # derived: the input/sm corner is the operator-appropriate step; the pill CTA and 16px mockup chrome stay marketing-only
165
+ shadow-intensity: 0.5 # derived: brand lifts cards on a soft blue-tinted shadow (corpus ~0.08 alpha) — present but restrained
166
+ border-weight: 1px
167
+ density-gap: 1
168
+ density-inset: 1
169
+ font-sans: Inter, 'SF Pro Display', system-ui, -apple-system, sans-serif # derived: Sohne is proprietary; Inter with ss01 is the documented open substitute carrying the brand rhythm
170
+ font-mono: ui-monospace, SFMono-Regular, Menlo, monospace # derived: corpus ships no mono; a system mono keeps IDs/codes refined without a techy display face
171
+ font-weight-normal: 400 # derived: brand body is display-thin 300; dense operator body needs 400 to stay legible
172
+ font-weight-strong: 500 # derived: a thin brand — emphasis lifts to medium 500, never a heavy 600
173
+ heading-tracking: -0.02em # derived: the brand's negative-tracking display signature (-0.64px/32px), carried to operator heading sizes
174
+ duration-unit: 60ms # derived: corpus silent on motion; a slightly softer base suits the refined brand
175
+ duration-fast: 120ms # derived: corpus silent on motion; refined-airy operator timing
176
+ duration-normal: 180ms # derived: corpus silent on motion
177
+ duration-slow: 240ms # derived: corpus silent on motion
178
+ ease-default: cubic-bezier(0.4,0,0.2,1) # derived: corpus silent on motion; standard operator ease
179
+ contrast-boost: 1
180
+ icon-stroke: 1.5 # derived: the thin type voice calls for a lighter icon stroke than lucide's 2
181
+ icon-size-base: 16px # derived: corpus has no icon spec; operator standard
182
+ sidebar-width-expanded: 240px # derived: corpus is marketing-only; Stripe-dashboard nav width
183
+ sidebar-width-collapsed: 56px # derived: standard operator icon rail
184
+ topbar-height: 56px # derived: a touch airier than a dense console, matching the brand posture
185
+ side-panel-width: 440px # derived: refined detail panels breathe a touch wider than the 420px norm
186
+ side-panel-width-rich: 640px # derived: content-heavy detail width
187
+ modal-width-max: 560px # derived: confirmation dialog cap
188
+ form-max-width: 640px # derived: single-column form cap
189
+ table-row-height: 44px # derived: dashboard rows breathe more than a terminal at standard density
190
+ verbosity: default
191
+ feedback: subtle # derived: Stripe's micro-feedback is polished and present, not austere silence
192
+ density-tier: standard # derived: the dashboard reads clean and moderate, neither terminal-dense nor consumer-spacious
193
+ product-traits: [payments, fintech, dashboard, b2b]
194
+ ```
195
+
196
+ ```yaml lever-manifest
197
+ version: 1
198
+ fonts: { sans: "Inter, 'SF Pro Display', system-ui, -apple-system, sans-serif", mono: "ui-monospace, SFMono-Regular, Menlo, monospace" }
199
+ color-tokens:
200
+ light:
201
+ background: "#ffffff"
202
+ foreground: "#0d253d"
203
+ card: "#ffffff"
204
+ card-foreground: "#0d253d"
205
+ muted: "#f6f9fc"
206
+ muted-foreground: "#64748d"
207
+ border: "#e3e8ee"
208
+ input: "#a8c3de" # brand's cooler input hairline (hairline-input)
209
+ ring: "#533afd"
210
+ primary: "#533afd"
211
+ primary-foreground: "#ffffff"
212
+ accent: "#edecfe" # derived: pale indigo wash for row/nav selection, lighter than the tag fill #b9b9f9
213
+ accent-foreground: "#4434d4"
214
+ destructive: "#ea2261" # derived: brand ships no semantic red; ruby is the nearest hue, reads as a raspberry error
215
+ destructive-foreground: "#ffffff"
216
+ success: "#1a8754" # derived: brand ships no green; a teal-leaning success green
217
+ warning: "#bb5504" # derived: brand ships no amber; a burnt-amber warning, warmer cousin of lemon
218
+ popover: "#ffffff"
219
+ popover-foreground: "#0d253d"
220
+ secondary: "#f6f9fc"
221
+ secondary-foreground: "#0d253d"
222
+ chart-1: "#533afd" # indigo primary
223
+ chart-2: "#003770" # derived: shadow-blue deep ocean, second categorical series
224
+ chart-3: "#1a8754" # derived: success green as third series
225
+ chart-4: "#bb5504" # derived: amber as fourth series
226
+ chart-5: "#ea2261" # ruby as fifth series
227
+ sidebar: "#f6f9fc" # derived: faint cool sidebar tint against the white canvas
228
+ sidebar-foreground: "#0d253d"
229
+ sidebar-primary: "#533afd"
230
+ sidebar-primary-foreground: "#ffffff"
231
+ sidebar-accent: "#edecfe" # derived: matches accent — pale indigo nav selection
232
+ sidebar-accent-foreground: "#4434d4"
233
+ sidebar-border: "#e3e8ee"
234
+ sidebar-ring: "#533afd"
235
+ spacing-scale: [2, 4, 8, 12, 16, 24, 32, 48, 64]
236
+ radius-scale: [0, 4, 6, 8, 12, 9999]
237
+ shadow-levels: [none, sm, md]
238
+ motion: { durations: [120, 180, 240], easings: ["cubic-bezier(0.4,0,0.2,1)"] }
239
+ icons: { family: lucide, stroke: 1.5 }
240
+ accent-count: 1
241
+ ```