@nurix/etna 0.18.19 → 0.18.20
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/data/harness-index.json +1 -1
- package/data/harnesses/code/harness.json +2 -2
- package/data/harnesses/code/skills/design/SKILL.md +65 -0
- package/data/harnesses/code/skills/design/data/catalog/rules.csv +132 -0
- package/data/harnesses/code/skills/design/data/design-md/SCHEMA.md +317 -0
- package/data/harnesses/code/skills/design/data/design-md/library/airbnb.md +235 -0
- package/data/harnesses/code/skills/design/data/design-md/library/airtable.md +232 -0
- package/data/harnesses/code/skills/design/data/design-md/library/anthropic-claude.md +220 -0
- package/data/harnesses/code/skills/design/data/design-md/library/apple.md +220 -0
- package/data/harnesses/code/skills/design/data/design-md/library/binance.md +223 -0
- package/data/harnesses/code/skills/design/data/design-md/library/bmw.md +219 -0
- package/data/harnesses/code/skills/design/data/design-md/library/cal.md +220 -0
- package/data/harnesses/code/skills/design/data/design-md/library/clay.md +220 -0
- package/data/harnesses/code/skills/design/data/design-md/library/clickhouse.md +220 -0
- package/data/harnesses/code/skills/design/data/design-md/library/cohere.md +227 -0
- package/data/harnesses/code/skills/design/data/design-md/library/coinbase.md +237 -0
- package/data/harnesses/code/skills/design/data/design-md/library/composio.md +220 -0
- package/data/harnesses/code/skills/design/data/design-md/library/cursor.md +220 -0
- package/data/harnesses/code/skills/design/data/design-md/library/elevenlabs.md +220 -0
- package/data/harnesses/code/skills/design/data/design-md/library/expo.md +228 -0
- package/data/harnesses/code/skills/design/data/design-md/library/figma.md +221 -0
- package/data/harnesses/code/skills/design/data/design-md/library/framer.md +236 -0
- package/data/harnesses/code/skills/design/data/design-md/library/hashicorp.md +220 -0
- package/data/harnesses/code/skills/design/data/design-md/library/ibm.md +234 -0
- package/data/harnesses/code/skills/design/data/design-md/library/intercom.md +240 -0
- package/data/harnesses/code/skills/design/data/design-md/library/kraken.md +236 -0
- package/data/harnesses/code/skills/design/data/design-md/library/linear-app.md +237 -0
- package/data/harnesses/code/skills/design/data/design-md/library/lovable.md +220 -0
- package/data/harnesses/code/skills/design/data/design-md/library/meta.md +220 -0
- package/data/harnesses/code/skills/design/data/design-md/library/minimax.md +220 -0
- package/data/harnesses/code/skills/design/data/design-md/library/mintlify.md +220 -0
- package/data/harnesses/code/skills/design/data/design-md/library/miro.md +233 -0
- package/data/harnesses/code/skills/design/data/design-md/library/mistral-ai.md +220 -0
- package/data/harnesses/code/skills/design/data/design-md/library/mongodb.md +236 -0
- package/data/harnesses/code/skills/design/data/design-md/library/notion.md +220 -0
- package/data/harnesses/code/skills/design/data/design-md/library/nvidia.md +222 -0
- package/data/harnesses/code/skills/design/data/design-md/library/ollama.md +226 -0
- package/data/harnesses/code/skills/design/data/design-md/library/opencode-ai.md +223 -0
- package/data/harnesses/code/skills/design/data/design-md/library/posthog.md +234 -0
- package/data/harnesses/code/skills/design/data/design-md/library/raycast.md +220 -0
- package/data/harnesses/code/skills/design/data/design-md/library/replicate.md +220 -0
- package/data/harnesses/code/skills/design/data/design-md/library/resend.md +285 -0
- package/data/harnesses/code/skills/design/data/design-md/library/revolut.md +225 -0
- package/data/harnesses/code/skills/design/data/design-md/library/runwayml.md +219 -0
- package/data/harnesses/code/skills/design/data/design-md/library/sanity.md +251 -0
- package/data/harnesses/code/skills/design/data/design-md/library/sentry.md +244 -0
- package/data/harnesses/code/skills/design/data/design-md/library/shopify.md +227 -0
- package/data/harnesses/code/skills/design/data/design-md/library/slack.md +240 -0
- package/data/harnesses/code/skills/design/data/design-md/library/spacex.md +252 -0
- package/data/harnesses/code/skills/design/data/design-md/library/spotify.md +248 -0
- package/data/harnesses/code/skills/design/data/design-md/library/stripe.md +241 -0
- package/data/harnesses/code/skills/design/data/design-md/library/supabase.md +255 -0
- package/data/harnesses/code/skills/design/data/design-md/library/superhuman.md +226 -0
- package/data/harnesses/code/skills/design/data/design-md/library/tesla.md +233 -0
- package/data/harnesses/code/skills/design/data/design-md/library/theverge.md +248 -0
- package/data/harnesses/code/skills/design/data/design-md/library/together-ai.md +220 -0
- package/data/harnesses/code/skills/design/data/design-md/library/uber.md +220 -0
- package/data/harnesses/code/skills/design/data/design-md/library/vercel.md +220 -0
- package/data/harnesses/code/skills/design/data/design-md/library/voltagent.md +245 -0
- package/data/harnesses/code/skills/design/data/design-md/library/warp.md +220 -0
- package/data/harnesses/code/skills/design/data/design-md/library/webflow.md +220 -0
- package/data/harnesses/code/skills/design/data/design-md/library/wired.md +220 -0
- package/data/harnesses/code/skills/design/data/design-md/library/wise.md +220 -0
- package/data/harnesses/code/skills/design/data/design-md/library/x-ai.md +220 -0
- package/data/harnesses/code/skills/design/data/design-md/library/zapier.md +238 -0
- package/data/harnesses/code/skills/design/data/design-md/nurix.md +217 -0
- package/data/harnesses/code/skills/design/data/operator-pack/exemplars/command-center.tsx +249 -0
- package/data/harnesses/code/skills/design/data/operator-pack/exemplars/create-edit.tsx +249 -0
- package/data/harnesses/code/skills/design/data/operator-pack/exemplars/dashboard.tsx +248 -0
- package/data/harnesses/code/skills/design/data/operator-pack/exemplars/entity-detail.tsx +245 -0
- package/data/harnesses/code/skills/design/data/operator-pack/exemplars/list-detail.tsx +223 -0
- package/data/harnesses/code/skills/design/data/operator-pack/exemplars/log-stream.tsx +249 -0
- package/data/harnesses/code/skills/design/data/operator-pack/fixtures.md +88 -0
- package/data/harnesses/code/skills/design/data/operator-pack/surface-catalog.md +132 -0
- package/data/harnesses/code/skills/design/data/operator-pack/trust-rubric.md +76 -0
- package/data/harnesses/code/skills/design/references/create.md +126 -0
- package/data/harnesses/code/skills/design/references/diagnosis.md +108 -0
- package/data/harnesses/code/skills/design/references/hard-rules.md +155 -0
- package/data/harnesses/code/skills/design/references/improve.md +85 -0
- package/data/harnesses/code/skills/design/references/interaction.md +77 -0
- package/data/harnesses/code/skills/design/references/introspect.md +100 -0
- package/data/harnesses/code/skills/design/references/lifecycle.md +73 -0
- package/data/harnesses/code/skills/design/references/personality.md +504 -0
- package/data/harnesses/code/skills/design/references/structure.md +138 -0
- package/data/harnesses/code/skills/design/scripts/derive-personality.mjs +706 -0
- package/data/harnesses/code/skills/design/scripts/detector.mjs +898 -0
- package/data/harnesses/code/skills/design/scripts/generate-fixtures.mjs +551 -0
- package/data/harnesses/code/skills/design/scripts/hook-config.json +11 -0
- package/data/harnesses/code/skills/design/scripts/phase-gate.mjs +386 -0
- package/data/harnesses/code/skills/design/scripts/preship-sweep.mjs +280 -0
- package/data/harnesses/code/skills/design/scripts/render-rung.mjs +690 -0
- package/data/harnesses/code/skills/design/scripts/scaffold.mjs +552 -0
- package/data/harnesses/code/skills/design/scripts/self-integrity.mjs +432 -0
- package/package.json +1 -1
|
@@ -0,0 +1,228 @@
|
|
|
1
|
+
---
|
|
2
|
+
schema: design-md/v1
|
|
3
|
+
product: Expo
|
|
4
|
+
provenance: library
|
|
5
|
+
sourced: 2026-07-04
|
|
6
|
+
---
|
|
7
|
+
|
|
8
|
+
# Expo — the operator reading
|
|
9
|
+
|
|
10
|
+
Expo's marketing surface is a quietly-confident developer platform: a pure-white editorial canvas
|
|
11
|
+
with a soft sky-blue gradient behind the hero and a centered MacBook + iPhone device composite as its
|
|
12
|
+
chrome. This entry keeps the parts an operator tool can wear — the near-black ink, the single **pure
|
|
13
|
+
black** brand voltage, the cool-neutral grays, the compact developer radii, and the Inter + JetBrains
|
|
14
|
+
Mono type voice — and leaves the marketing devices behind: the sky-gradient wash, the device-mockup
|
|
15
|
+
hero, the 64px display type, and the dark-inversion feature cards do not follow the brand onto a CRM,
|
|
16
|
+
a build queue, or a dashboard.
|
|
17
|
+
|
|
18
|
+
## 1 Visual Theme
|
|
19
|
+
|
|
20
|
+
Light by default; dark is opt-in. Flat and editorial: hierarchy is carried by hairline `border`, type
|
|
21
|
+
weight, and near-black ink — never by heavy shadow (Expo ships a single very-soft drop). The one brand
|
|
22
|
+
voltage is `primary` = **pure black `#000000`**, reserved for the single most important action on a
|
|
23
|
+
surface; this is a deliberate brand override of the usual chromatic-accent floor (black is the only CTA
|
|
24
|
+
fill Expo permits). The neutral ramp is a cool editorial gray anchored on ink `#171717`, so the whole
|
|
25
|
+
UI reads engineered and restrained rather than warm. The anchor surface is a white content canvas
|
|
26
|
+
beside a faintly off-white `sidebar`. Density is `standard` and steps denser per surface archetype.
|
|
27
|
+
|
|
28
|
+
## 2 Color Roles
|
|
29
|
+
|
|
30
|
+
Light values first (hex is the corpus's native format). One brand voltage — black `primary` — carries
|
|
31
|
+
the primary action; a scoped link-blue serves inline references only; status hues speak only status.
|
|
32
|
+
|
|
33
|
+
| Role | Value | Allowed where |
|
|
34
|
+
| --- | --- | --- |
|
|
35
|
+
| `background` / `card` / `popover` | pure white `#ffffff` | page, cards, and overlays — the dominant surface |
|
|
36
|
+
| `foreground` | near-black ink `#171717` | all primary ink, display and body alike |
|
|
37
|
+
| `muted` / `secondary` | soft neutral `#f0f0f3` | hover rows, subtle fills, secondary buttons, tiles |
|
|
38
|
+
| `muted-foreground` | cool gray `#60646c` | labels, captions, secondary running text |
|
|
39
|
+
| `border` / `input` | hairline-strong `#dcdee0` | card outlines, field edges, table grid lines |
|
|
40
|
+
| `primary` | pure black `#000000` | the one primary action; active nav; press state `#1a1a1a` |
|
|
41
|
+
| `accent` | neutral tint `#f0f0f3` | selected / hovered rows and nav (black has no light chroma tint) |
|
|
42
|
+
| `ring` | ink `#171717` | the 2px focus outline — Expo focuses to ink, never a glow |
|
|
43
|
+
| `destructive` | red `#dc2626` | destructive actions and error state only |
|
|
44
|
+
| `success` / `warning` | green `#16a34a` / amber `#ab6400` | status signalling only, never chrome |
|
|
45
|
+
|
|
46
|
+
The text-link blue `#0d74ce` is a scoped grace — inline body/reference links only, never a CTA or a
|
|
47
|
+
chart-of-record accent (see §7). The sky-blue gradient (`#cfe7ff → #a8c8e8`) and the dark-inversion
|
|
48
|
+
surfaces (`#171717` feature cards) are marketing devices; they carry no operator role.
|
|
49
|
+
|
|
50
|
+
## 3 Typography
|
|
51
|
+
|
|
52
|
+
One sans, one mono. `font-sans` is Inter — UI, body, and headings all ride it; heading weight and
|
|
53
|
+
negative tracking, not a second family, carry the editorial voice (display weight holds at 600, never
|
|
54
|
+
700). `font-mono` is JetBrains Mono for IDs, codes, timestamps, and log lines. Numeric columns render
|
|
55
|
+
`tabular-nums` so figures align down a column (floor P4).
|
|
56
|
+
|
|
57
|
+
| Step | Role | Size · line | Weight · tracking |
|
|
58
|
+
| --- | --- | --- | --- |
|
|
59
|
+
| h1 | page title | 24px / 1.25 | `font-weight-strong` · `heading-tracking` |
|
|
60
|
+
| h2 | section head | 18px / 1.4 | `font-weight-strong` · `heading-tracking` |
|
|
61
|
+
| h3 | card / group head | 16px / 1.4 | `font-weight-strong` · `heading-tracking` |
|
|
62
|
+
| body | UI + prose | 14px / 1.5 | `font-weight-normal` |
|
|
63
|
+
| small | labels, meta, dense tables | 13px / 1.4 | `font-weight-normal` |
|
|
64
|
+
| caption | uppercase eyebrow | 11px / 1.4 | `font-weight-strong`, `+0.88px`, uppercase |
|
|
65
|
+
| code | IDs, logs, snippets | 13px / 1.5 | JetBrains Mono, `font-weight-normal` |
|
|
66
|
+
|
|
67
|
+
Bump weight for emphasis; never change size to emphasize. The 64/48/36px hero display steps stay
|
|
68
|
+
behind — the operator ramp tops out at 24px.
|
|
69
|
+
|
|
70
|
+
## 4 Component Stylings
|
|
71
|
+
|
|
72
|
+
Every recurring operator component composes from the primitives — no literal values.
|
|
73
|
+
|
|
74
|
+
- **Button** — `primary`: filled black `primary` on `primary-foreground`, `radius` (8px), no pill;
|
|
75
|
+
press darkens to `#1a1a1a`. Secondary: `secondary` fill, 1px `border`, `foreground`. Tertiary:
|
|
76
|
+
transparent, text-link blue label, inline only.
|
|
77
|
+
- **Input** — `background` fill, 1px `border` (`border-weight`), `radius`; focus thickens to a 2px
|
|
78
|
+
`ring` (ink) outline, no glow. Field height runs generous.
|
|
79
|
+
- **Card** — `card` surface, 1px `border`, `radius` (12px for cards); the single soft drop appears only
|
|
80
|
+
when a card must lift off the canvas (`shadow-intensity`); inset by `density-inset`.
|
|
81
|
+
- **Table row** — height `table-row-height`; `border` grid lines; `muted` on hover; `tabular-nums` on
|
|
82
|
+
numeric columns; row selection tints `accent`.
|
|
83
|
+
- **Side panel** — detail and edit open in the side panel (`side-panel-width`, `side-panel-width-rich`
|
|
84
|
+
for content-heavy), beside the work, not over it (floor P3).
|
|
85
|
+
- **Badge** — pill (9999) with uppercase caption on a `muted` fill; status badges take
|
|
86
|
+
`success` / `warning` / `destructive`, never `primary`.
|
|
87
|
+
|
|
88
|
+
## 5 Layout
|
|
89
|
+
|
|
90
|
+
Base spacing unit 4px; the on-scale ramp is `2 · 4 · 8 · 12 · 16 · 20 · 24 · 32 · 48 · 64` (Expo keeps
|
|
91
|
+
a 20px step for compact workflow rows). Shell dimensions map one-to-one to the layout primitives:
|
|
92
|
+
sidebar `sidebar-width-expanded` / `sidebar-width-collapsed`, topbar `topbar-height`, side panel
|
|
93
|
+
`side-panel-width` / `side-panel-width-rich`, modal cap `modal-width-max`, forms `form-max-width`,
|
|
94
|
+
tables full-width. Density is governed globally by `density-tier` and stepped per archetype by the
|
|
95
|
+
surface catalog — never by absolute overrides. Expo's 96px marketing section rhythm stays behind.
|
|
96
|
+
|
|
97
|
+
## 6 Depth
|
|
98
|
+
|
|
99
|
+
Flat and editorial. Hierarchy comes from the surface ladder and hairlines, not shadow:
|
|
100
|
+
|
|
101
|
+
- **0 — canvas** `background`, no border.
|
|
102
|
+
- **1 — panel / card** `card` on a 1px `border`; the single soft drop `0 4px 12px rgba(0,0,0,0.04)`
|
|
103
|
+
only when a card must lift.
|
|
104
|
+
- **2 — overlay** `popover` / side panel / modal — the one place `shadow-intensity` earns a soft `md`
|
|
105
|
+
shadow. Rank is border and position, never a heavier stacked shadow.
|
|
106
|
+
|
|
107
|
+
Focus is a 2px `ring` outline in ink (never a glow), visible on every interactive element (floor P6).
|
|
108
|
+
Three z-levels: content, sticky chrome, overlay. The sky-gradient backdrop and dark-inversion surfaces
|
|
109
|
+
are marketing depth and do not appear in operator chrome.
|
|
110
|
+
|
|
111
|
+
## 7 Do's & Don'ts
|
|
112
|
+
|
|
113
|
+
- **Do** reserve black `primary` for the single most important action on a surface; everything else is
|
|
114
|
+
neutral or status.
|
|
115
|
+
- **Do** carry hierarchy with hairlines, weight, and whitespace — the brand is predominantly flat.
|
|
116
|
+
- **Do** set CTAs and inputs at 8px `radius` and cards at 12px — the developer dialect.
|
|
117
|
+
- **Do** apply `tabular-nums` to every numeric column and `font-mono` to IDs, codes, and timestamps.
|
|
118
|
+
- **Don't** introduce a saturated brand action color — black is the only primary fill.
|
|
119
|
+
- **Don't** put the text-link blue on a CTA or button; it is for inline references only.
|
|
120
|
+
- **Don't** pill the primary CTA — pill geometry is reserved for badges.
|
|
121
|
+
- **Don't** bring the sky-blue gradient, the device-mockup hero, or the 64px display into operator chrome.
|
|
122
|
+
- **Don't** signal elevation with heavy drop shadows; one soft drop is the ceiling.
|
|
123
|
+
|
|
124
|
+
## 8 Responsive
|
|
125
|
+
|
|
126
|
+
The operator sweep is 375 / 768 / 1024 / 1440.
|
|
127
|
+
|
|
128
|
+
| Breakpoint | What changes |
|
|
129
|
+
| --- | --- |
|
|
130
|
+
| 375 | sidebar → off-canvas drawer; two-pane list+detail stacks; side panel → full sheet; density holds |
|
|
131
|
+
| 768 | sidebar collapses to the icon rail (`sidebar-width-collapsed`); tables scroll their overflow |
|
|
132
|
+
| 1024 | sidebar expands; two-pane list+detail holds side by side |
|
|
133
|
+
| 1440 | forms cap at `form-max-width`; tables and dashboards use the full width |
|
|
134
|
+
|
|
135
|
+
## 9 Agent Prompt Guide
|
|
136
|
+
|
|
137
|
+
Directives the emitting agent follows verbatim for an operator surface wearing Expo:
|
|
138
|
+
|
|
139
|
+
- Reach first for the black `primary` as the single action fill; keep every other control neutral on a
|
|
140
|
+
hairline `border`. If two things want the accent, one of them is not primary.
|
|
141
|
+
- The text-link blue is a reference color only — inline links, breadcrumbs, entity cross-links. It
|
|
142
|
+
never fills a button and never leads a chart-of-record.
|
|
143
|
+
- Carry IDs, codes, timestamps, and log lines in JetBrains Mono; every numeric column is `tabular-nums`.
|
|
144
|
+
- Stay flat — hairline and weight before shadow. Reach past the single soft drop only for a real overlay.
|
|
145
|
+
- Leave the marketing devices behind: no sky-gradient wash, no device-mockup hero, no 64px display
|
|
146
|
+
type, no dark-inversion feature cards. What carries is the palette, the cool-neutral temperature, the
|
|
147
|
+
8px/12px radius character, and the Inter + JetBrains Mono voice.
|
|
148
|
+
- Every workflow completes from the keyboard; the ink `ring` focus outline is always visible (P6).
|
|
149
|
+
|
|
150
|
+
```yaml design-primitives
|
|
151
|
+
radius: 8px # derived: Expo's developer-dialect CTA/input radius (rounded.md); cards step to 12px in the scale
|
|
152
|
+
shadow-intensity: 0.3 # derived: Expo ships one very-soft drop (0.04 alpha) — flatter than the operator default
|
|
153
|
+
border-weight: 1px
|
|
154
|
+
density-gap: 1
|
|
155
|
+
density-inset: 1
|
|
156
|
+
font-sans: Inter, -apple-system, system-ui, sans-serif
|
|
157
|
+
font-mono: JetBrains Mono, Fira Code, ui-monospace, monospace
|
|
158
|
+
font-weight-normal: 400
|
|
159
|
+
font-weight-strong: 600 # rationale: Expo holds display weight at 600, never 700 — confident, not bombastic
|
|
160
|
+
heading-tracking: -0.02em # derived: Expo tracks display negative (-0.5 to -1.92px); at operator heading sizes that lands near -0.02em
|
|
161
|
+
duration-unit: 50ms # derived: corpus declares motion out of scope; functional operator timing
|
|
162
|
+
duration-fast: 100ms # derived: corpus silent on motion
|
|
163
|
+
duration-normal: 150ms # derived: corpus silent on motion
|
|
164
|
+
duration-slow: 250ms # derived: corpus silent on motion
|
|
165
|
+
ease-default: cubic-bezier(0.4,0,0.2,1) # derived: corpus silent on motion; standard operator ease
|
|
166
|
+
contrast-boost: 1 # derived: component borders use hairline-strong (#dcdee0), which reads as a grid at standard density
|
|
167
|
+
icon-stroke: 1.75 # derived: corpus silent on icons; refined operator lucide stroke
|
|
168
|
+
icon-size-base: 16px # derived: corpus silent on icons
|
|
169
|
+
sidebar-width-expanded: 248px # derived: no sidebar in the marketing corpus; operator shell default
|
|
170
|
+
sidebar-width-collapsed: 56px # derived: operator shell default
|
|
171
|
+
topbar-height: 56px # derived: Expo's marketing top-nav is 64px; operator chrome tightens to 56px
|
|
172
|
+
side-panel-width: 420px # derived: no side panel in the marketing corpus; operator shell default
|
|
173
|
+
side-panel-width-rich: 640px # derived: operator shell default
|
|
174
|
+
modal-width-max: 560px # derived: operator shell default
|
|
175
|
+
form-max-width: 640px # derived: operator shell default
|
|
176
|
+
table-row-height: 44px # derived: Expo runs generous component heights (44px inputs); tables echo that airier read
|
|
177
|
+
verbosity: default
|
|
178
|
+
feedback: subtle # rationale: Expo's quiet, editorial voice; feedback stays understated but legible
|
|
179
|
+
density-tier: standard # derived: developer platform between terminal-dense and consumer-spacious; standard, stepping denser per archetype
|
|
180
|
+
product-traits: [dev-tools, developer-platform, dashboard, ci-cd]
|
|
181
|
+
```
|
|
182
|
+
|
|
183
|
+
```yaml lever-manifest
|
|
184
|
+
version: 1
|
|
185
|
+
fonts: { sans: "Inter, -apple-system, system-ui, sans-serif", mono: "JetBrains Mono, Fira Code, ui-monospace, monospace" }
|
|
186
|
+
color-tokens:
|
|
187
|
+
light:
|
|
188
|
+
background: "#ffffff"
|
|
189
|
+
foreground: "#171717"
|
|
190
|
+
card: "#ffffff"
|
|
191
|
+
card-foreground: "#171717"
|
|
192
|
+
muted: "#f0f0f3"
|
|
193
|
+
muted-foreground: "#60646c"
|
|
194
|
+
border: "#dcdee0"
|
|
195
|
+
input: "#dcdee0"
|
|
196
|
+
ring: "#171717"
|
|
197
|
+
primary: "#000000"
|
|
198
|
+
primary-foreground: "#ffffff"
|
|
199
|
+
accent: "#f0f0f3" # derived: black primary has no light chroma tint; selected-row accent falls to the neutral surface-strong
|
|
200
|
+
accent-foreground: "#171717"
|
|
201
|
+
destructive: "#dc2626" # derived: Expo documents only a soft error-text rose (#eb8e90); a destructive action fill needs an accessible red
|
|
202
|
+
destructive-foreground: "#ffffff"
|
|
203
|
+
success: "#16a34a"
|
|
204
|
+
warning: "#ab6400"
|
|
205
|
+
popover: "#ffffff"
|
|
206
|
+
popover-foreground: "#171717"
|
|
207
|
+
secondary: "#f0f0f3"
|
|
208
|
+
secondary-foreground: "#171717"
|
|
209
|
+
chart-1: "#0d74ce" # derived: chart ramp drawn from Expo's scattered accent hues (link blue anchors — black does not chart)
|
|
210
|
+
chart-2: "#47c2ff" # derived: bright cyan from docs-widget accent
|
|
211
|
+
chart-3: "#16a34a" # derived: success green
|
|
212
|
+
chart-4: "#ab6400" # derived: warning amber
|
|
213
|
+
chart-5: "#8145b5" # derived: preview purple
|
|
214
|
+
sidebar: "#fafafa" # derived: no sidebar in corpus; faintly off-white canvas-soft beside the white content canvas
|
|
215
|
+
sidebar-foreground: "#171717"
|
|
216
|
+
sidebar-primary: "#000000"
|
|
217
|
+
sidebar-primary-foreground: "#ffffff"
|
|
218
|
+
sidebar-accent: "#f0f0f3" # derived: neutral hovered/selected nav tint
|
|
219
|
+
sidebar-accent-foreground: "#171717"
|
|
220
|
+
sidebar-border: "#f0f0f3" # derived: softer hairline for the sidebar's internal dividers
|
|
221
|
+
sidebar-ring: "#171717"
|
|
222
|
+
spacing-scale: [2, 4, 8, 12, 16, 20, 24, 32, 48, 64]
|
|
223
|
+
radius-scale: [0, 4, 8, 12, 16, 9999]
|
|
224
|
+
shadow-levels: [none, sm, md]
|
|
225
|
+
motion: { durations: [100, 150, 250], easings: ["cubic-bezier(0.4,0,0.2,1)"] }
|
|
226
|
+
icons: { family: lucide, stroke: 1.75 }
|
|
227
|
+
accent-count: 1
|
|
228
|
+
```
|
|
@@ -0,0 +1,221 @@
|
|
|
1
|
+
---
|
|
2
|
+
schema: design-md/v1
|
|
3
|
+
product: Figma
|
|
4
|
+
provenance: library
|
|
5
|
+
sourced: 2026-07-04
|
|
6
|
+
---
|
|
7
|
+
|
|
8
|
+
# Figma — the operator reading
|
|
9
|
+
|
|
10
|
+
Figma's marketing canvas is an editorial black-and-white frame interrupted by oversized pastel
|
|
11
|
+
color-block sections and pill CTAs — storytelling devices that stay on the marketing site with the
|
|
12
|
+
poster-scale display type. An operator surface inherits the *spine*: pure black ink on pure white, a
|
|
13
|
+
warm off-white for panels, hairline depth over shadow, one saturated chromatic accent (Figma
|
|
14
|
+
magenta), and the figmaSans/figmaMono type voice. It reads as a serious tool made by people who like
|
|
15
|
+
color — monochrome, calm, dense-capable, the joyful pastels demoted to chart encodings.
|
|
16
|
+
|
|
17
|
+
## 1 Visual Theme
|
|
18
|
+
|
|
19
|
+
Light by default; dark is not documented and stays opt-in. Flat: hierarchy is carried by hairline
|
|
20
|
+
`border`, type weight, and the black/white contrast itself — never by heavy shadow, which the brand
|
|
21
|
+
avoids by design. The spine is monochrome — pure black `foreground` on pure white `background`, with a
|
|
22
|
+
faintly warm off-white `muted`/`sidebar`. A single chromatic accent, Figma magenta, is reserved and
|
|
23
|
+
scarce: it carries the focus `ring` and active indicators, nothing decorative. The primary action
|
|
24
|
+
fills black — Figma's own primary is achromatic — so magenta stays a single-shot pop. Density is
|
|
25
|
+
`standard` and steps denser per archetype; the roomy 8px rhythm keeps it friendly, not cramped.
|
|
26
|
+
|
|
27
|
+
## 2 Color Roles
|
|
28
|
+
|
|
29
|
+
Light values first. The neutral spine is genuinely monochrome; magenta is the one chromatic hue that
|
|
30
|
+
carries meaning, and the pastels appear only as chart series.
|
|
31
|
+
|
|
32
|
+
| Role | Value | Allowed where |
|
|
33
|
+
| --- | --- | --- |
|
|
34
|
+
| `background` / `card` / `popover` | white `#ffffff` | page, cards, and overlays — the dominant surface |
|
|
35
|
+
| `foreground` | pure black `#000000` | all primary ink — headlines, body, labels |
|
|
36
|
+
| `muted` / `secondary` | warm off-white `#f7f7f5` | hover rows, tile fills, secondary buttons, the sidebar ground |
|
|
37
|
+
| `muted-foreground` | neutral gray `#666666` | labels, captions, table meta — the secondary ink role |
|
|
38
|
+
| `border` / `input` | hairline `#e6e6e6` | every separator, grid line, and field edge |
|
|
39
|
+
| `primary` | black `#000000` | the one primary action; active-nav fill; selected tab |
|
|
40
|
+
| `accent` | pale magenta `#ffe4ef` | selected / hovered rows and nav — a tint, never a fill |
|
|
41
|
+
| `ring` | magenta `#ff3d8b` | the focus outline and active indicator — the single chromatic pop |
|
|
42
|
+
| `destructive` | red `#eb5757` | destructive actions and error state only |
|
|
43
|
+
| `success` / `warning` | green `#1ea64a` / amber `#f2994a` | status signalling only, never chrome |
|
|
44
|
+
|
|
45
|
+
The pastel color blocks (lime, lilac, cream, mint, pink, coral, navy) are marketing surfaces — no
|
|
46
|
+
operator role, reappearing only as `chart-*` encodings (§7). Figma's marketing refuses a mid-gray text
|
|
47
|
+
role; an operator surface needs one, so `muted-foreground` is a derived neutral gray, AA on white.
|
|
48
|
+
|
|
49
|
+
## 3 Typography
|
|
50
|
+
|
|
51
|
+
One sans, one mono — a single voice that flexes by weight, not a multi-family stack. `font-sans`
|
|
52
|
+
substitutes for the proprietary figmaSans (Inter matches its fine variable-weight axis); the UI, body,
|
|
53
|
+
and headings all ride it, weight and negative tracking carrying the display voice. `font-mono`
|
|
54
|
+
substitutes for figmaMono — reserved for IDs, codes, timestamps, log lines, and uppercase
|
|
55
|
+
eyebrow/caption labels, never body. Numeric columns render `tabular-nums`.
|
|
56
|
+
|
|
57
|
+
| Step | Role | Size · line | Weight · tracking |
|
|
58
|
+
| --- | --- | --- | --- |
|
|
59
|
+
| h1 | page title | 24px / 1.3 | `font-weight-strong` · `heading-tracking` |
|
|
60
|
+
| h2 | section head | 18px / 1.35 | `font-weight-strong` · `heading-tracking` |
|
|
61
|
+
| h3 | card / group head | 15px / 1.4 | `font-weight-strong` · `heading-tracking` |
|
|
62
|
+
| body | UI + prose | 14px / 1.45 | `font-weight-normal` |
|
|
63
|
+
| small | labels, meta, dense table | 13px / 1.4 | `font-weight-normal` |
|
|
64
|
+
| eyebrow / caption | uppercase mono label | 12px / 1.3 | `font-mono`, `+0.05em`, uppercase |
|
|
65
|
+
|
|
66
|
+
Bump weight one step for emphasis; never change size — weight, not scale, carries hierarchy. The
|
|
67
|
+
poster-scale 86px/64px display steps and their aggressive negative tracking stay on the marketing site.
|
|
68
|
+
|
|
69
|
+
## 4 Component Stylings
|
|
70
|
+
|
|
71
|
+
Every recurring operator component composes from the primitives — no literal values.
|
|
72
|
+
|
|
73
|
+
- **Button** — `primary`: filled black `primary` on white `primary-foreground`, `radius`, no pill.
|
|
74
|
+
Secondary: `secondary` fill, 1px `border`, `foreground`. Ghost: transparent, `accent` on hover.
|
|
75
|
+
Icon-only buttons stay circular (`radius-scale` full, 9999) — the one marketing shape that carries.
|
|
76
|
+
- **Input** — `background` fill, 1px `border` (`border-weight`), `radius`; focus draws the magenta `ring` at 2px, no fill change and no glow.
|
|
77
|
+
- **Card** — `card` surface, 1px `border`, `radius`, inset by `density-inset`; shadow only when it must lift (`shadow-intensity`); large feature cards may take the large radius step.
|
|
78
|
+
- **Table row** — height `table-row-height`; `border` grid lines; `muted` on hover; `tabular-nums` on numeric columns; selection tints `accent` with a magenta `ring` indicator.
|
|
79
|
+
- **Side panel** — detail and edit open beside the work (`side-panel-width`, `side-panel-width-rich` for content-heavy), not over it.
|
|
80
|
+
- **Badge** — hairline `border`, `muted`/status fill, uppercase mono caption; status badges take `success` / `warning` / `destructive`, never `primary` or magenta.
|
|
81
|
+
|
|
82
|
+
## 5 Layout
|
|
83
|
+
|
|
84
|
+
Base spacing unit 8px (Figma's grid); the on-scale ramp is `4 · 8 · 12 · 16 · 24 · 32 · 48 · 96`.
|
|
85
|
+
Shell dimensions map one-to-one to the layout primitives: sidebar `sidebar-width-expanded` /
|
|
86
|
+
`sidebar-width-collapsed`, topbar `topbar-height` (56px — Figma's own nav height), side panel
|
|
87
|
+
`side-panel-width` / `side-panel-width-rich`, modal cap `modal-width-max`, forms `form-max-width`,
|
|
88
|
+
tables full-width. Density is governed globally by `density-tier` (through `density-gap`) and stepped
|
|
89
|
+
per archetype by the surface catalog — never absolute overrides. The 96px section rhythm stays behind.
|
|
90
|
+
|
|
91
|
+
## 6 Depth
|
|
92
|
+
|
|
93
|
+
Flat and shadow-light. Hierarchy comes from the surface ladder, hairlines, and the black/white
|
|
94
|
+
contrast — not shadow:
|
|
95
|
+
|
|
96
|
+
- **0 — canvas** `background`, no border.
|
|
97
|
+
- **1 — panel / card** `card` on a 1px `border`; shadow only when it must lift off the canvas.
|
|
98
|
+
- **2 — overlay** `popover` / side panel / modal — the one place `shadow-intensity` earns a soft `md`
|
|
99
|
+
shadow (roughly `0 4px 16px rgba(0,0,0,0.06)`). Rank is border and position, never a heavier shadow.
|
|
100
|
+
|
|
101
|
+
Focus is a 2px magenta `ring` outline (never a glow), visible on every interactive element — the one
|
|
102
|
+
chromatic surface the keyboard-first operator sees constantly. Three z-levels: content, chrome, overlay.
|
|
103
|
+
|
|
104
|
+
## 7 Do's & Don'ts
|
|
105
|
+
|
|
106
|
+
- **Do** reserve black `primary` for the single most important action on a surface; everything else is
|
|
107
|
+
neutral or status.
|
|
108
|
+
- **Do** keep magenta scarce — the focus `ring` and small active indicators only. It is a single-shot
|
|
109
|
+
accent, not a fill or a text color.
|
|
110
|
+
- **Do** carry hierarchy with hairlines, weight, and whitespace — the brand is emphatically flat, and
|
|
111
|
+
apply `tabular-nums` to numeric columns and `font-mono` to IDs, codes, and timestamps.
|
|
112
|
+
- **Don't** reach for the pastel color blocks as UI chrome; they are marketing surfaces and appear
|
|
113
|
+
operator-side only as `chart-*` series.
|
|
114
|
+
- **Don't** pill the primary CTA or reach for a radius outside `radius-scale` — pills stay on the
|
|
115
|
+
marketing site.
|
|
116
|
+
- **Don't** introduce a second chromatic accent, spend magenta on body text or a whole fill, or signal
|
|
117
|
+
elevation with heavy drop shadows.
|
|
118
|
+
|
|
119
|
+
## 8 Responsive
|
|
120
|
+
|
|
121
|
+
The operator sweep is 375 / 768 / 1024 / 1440.
|
|
122
|
+
|
|
123
|
+
| Breakpoint | What changes |
|
|
124
|
+
| --- | --- |
|
|
125
|
+
| 375 | sidebar → off-canvas drawer; two-pane list+detail stacks; side panel → full sheet; density holds |
|
|
126
|
+
| 768 | sidebar collapses to the icon rail (`sidebar-width-collapsed`); tables scroll their overflow |
|
|
127
|
+
| 1024 | sidebar expands; two-pane list+detail holds side by side |
|
|
128
|
+
| 1440 | content caps at `form-max-width` for forms; tables and dashboards use the full width |
|
|
129
|
+
|
|
130
|
+
## 9 Agent Prompt Guide
|
|
131
|
+
|
|
132
|
+
Directives the emitting agent follows verbatim:
|
|
133
|
+
|
|
134
|
+
- Wear the spine, not the marketing: pure black on white, warm off-white panels, hairline depth. The
|
|
135
|
+
color blocks, pill CTAs, and 86px display type stay behind.
|
|
136
|
+
- Primary action fills black. If two things want the black fill, one of them is not primary.
|
|
137
|
+
- Magenta is single-shot: the focus `ring` and active indicators only — never a fill, never body text.
|
|
138
|
+
- Icon-only buttons stay circular; every other control uses the base `radius`.
|
|
139
|
+
- Every numeric column is `tabular-nums`; every ID / code / timestamp is `font-mono`.
|
|
140
|
+
- The pastels live only in charts (`chart-1..5`); stay flat — hairline and weight before shadow, and
|
|
141
|
+
reach past a hairline only for a real overlay.
|
|
142
|
+
|
|
143
|
+
```yaml design-primitives
|
|
144
|
+
radius: 8px # derived: Figma control radius (rounded.md, inputs/list items) carries the friendly rounding; the marketing pill (50px) stays behind
|
|
145
|
+
shadow-intensity: 0.35 # derived: brand is shadow-light by design (level-2 overlay is only 0.06 alpha); hairline and surface carry depth
|
|
146
|
+
border-weight: 1px
|
|
147
|
+
density-gap: 1
|
|
148
|
+
density-inset: 1
|
|
149
|
+
font-sans: Inter, system-ui, sans-serif # derived: figmaSans substitute (corpus names Inter for its fine variable-weight axis)
|
|
150
|
+
font-mono: JetBrains Mono, ui-monospace, monospace # derived: figmaMono substitute (corpus names JetBrains Mono) — IDs, codes, log lines, eyebrows
|
|
151
|
+
font-weight-normal: 400 # derived: brand body runs 320-340 (display-tuned); Inter has no 320 stop and 300 is too thin for 13px tables, so 400
|
|
152
|
+
font-weight-strong: 600 # derived: operator emphasis bracketed by brand headline 540 / card-title 700
|
|
153
|
+
heading-tracking: -0.01em # derived: matches Figma's headline-scale tracking (-0.26px at 26px); the -1.72px hero tracking is display-scale, stays behind
|
|
154
|
+
duration-unit: 50ms # derived: corpus documents no motion (no-interaction policy); operator functional-motion base
|
|
155
|
+
duration-fast: 100ms # derived: operator functional default
|
|
156
|
+
duration-normal: 150ms # derived: operator functional default
|
|
157
|
+
duration-slow: 250ms # derived: operator functional default
|
|
158
|
+
ease-default: cubic-bezier(0.4,0,0.2,1) # derived: standard functional ease; corpus documents no motion
|
|
159
|
+
contrast-boost: 1 # derived: pure black ink on white is already maximal contrast; hairlines are visible; no boost needed
|
|
160
|
+
icon-stroke: 1.75 # derived: refined operator stroke, one step under lucide's 2
|
|
161
|
+
icon-size-base: 16px # derived: operator default; matches the corpus's 16px comparison-checkmark glyph
|
|
162
|
+
sidebar-width-expanded: 256px # derived: 8px-grid aligned (32 units), slightly roomier per the brand's generous rhythm
|
|
163
|
+
sidebar-width-collapsed: 56px # derived: mirrors Figma's 56px top-nav height (7 units)
|
|
164
|
+
topbar-height: 56px # brand: Figma's documented top-nav height
|
|
165
|
+
side-panel-width: 440px # derived: 8px-grid aligned (55 units), roomy per brand character
|
|
166
|
+
side-panel-width-rich: 640px # derived: 8px-grid aligned (80 units) for content-heavy detail
|
|
167
|
+
modal-width-max: 560px # derived: 8px-grid aligned (70 units); modals for confirmations only
|
|
168
|
+
form-max-width: 640px # derived: 8px-grid aligned (80 units)
|
|
169
|
+
table-row-height: 44px # derived: brand's generous rhythm + the 44px min touch target the corpus cites; dense archetypes step down via the surface catalog
|
|
170
|
+
verbosity: default
|
|
171
|
+
feedback: subtle # derived: brand is calm, editorial, shadow-light — quiet feedback fits
|
|
172
|
+
density-tier: standard # derived: brand rhythm is generous (8px base) but operator work needs function; standard, leaning roomy
|
|
173
|
+
product-traits: [design-tools, collaboration, dashboard, admin]
|
|
174
|
+
```
|
|
175
|
+
|
|
176
|
+
```yaml lever-manifest
|
|
177
|
+
version: 1
|
|
178
|
+
fonts: { sans: "Inter, system-ui, sans-serif", mono: "JetBrains Mono, ui-monospace, monospace" }
|
|
179
|
+
color-tokens:
|
|
180
|
+
light:
|
|
181
|
+
background: "#ffffff"
|
|
182
|
+
foreground: "#000000"
|
|
183
|
+
card: "#ffffff"
|
|
184
|
+
card-foreground: "#000000"
|
|
185
|
+
muted: "#f7f7f5"
|
|
186
|
+
muted-foreground: "#666666" # derived: brand refuses mid-gray text on marketing; operator secondary ink needs it — neutral gray, 5.7:1 AA on white
|
|
187
|
+
border: "#e6e6e6"
|
|
188
|
+
input: "#e6e6e6"
|
|
189
|
+
ring: "#ff3d8b" # brand: Figma magenta, the single chromatic accent, on the focus ring
|
|
190
|
+
primary: "#000000"
|
|
191
|
+
primary-foreground: "#ffffff"
|
|
192
|
+
accent: "#ffe4ef" # derived: pale magenta tint for selection/hover surfaces
|
|
193
|
+
accent-foreground: "#000000" # derived: ink-black for AA on the pale accent; magenta stays scarce on the ring/indicator
|
|
194
|
+
destructive: "#eb5757" # derived: Figma product red, matching the palette's bright-friendly saturation
|
|
195
|
+
destructive-foreground: "#ffffff"
|
|
196
|
+
success: "#1ea64a" # brand: documented semantic-success green
|
|
197
|
+
warning: "#f2994a" # derived: Figma product amber; matches the success green's friendly saturation
|
|
198
|
+
popover: "#ffffff"
|
|
199
|
+
popover-foreground: "#000000"
|
|
200
|
+
secondary: "#f7f7f5"
|
|
201
|
+
secondary-foreground: "#000000"
|
|
202
|
+
chart-1: "#ff3d8b" # brand: magenta anchors the ramp as the saturated primary series
|
|
203
|
+
chart-2: "#7c5cde" # derived: block-lilac (#c5b0f4) deepened for chart legibility
|
|
204
|
+
chart-3: "#1ea64a" # brand: success green
|
|
205
|
+
chart-4: "#f2994a" # derived: warning amber
|
|
206
|
+
chart-5: "#1f1d3d" # brand: block-navy deep indigo
|
|
207
|
+
sidebar: "#f7f7f5"
|
|
208
|
+
sidebar-foreground: "#000000"
|
|
209
|
+
sidebar-primary: "#000000"
|
|
210
|
+
sidebar-primary-foreground: "#ffffff"
|
|
211
|
+
sidebar-accent: "#ffe4ef" # derived: pale magenta hover/selection tint, matching accent
|
|
212
|
+
sidebar-accent-foreground: "#000000"
|
|
213
|
+
sidebar-border: "#e6e6e6"
|
|
214
|
+
sidebar-ring: "#ff3d8b" # brand: magenta focus ring in the nav
|
|
215
|
+
spacing-scale: [4, 8, 12, 16, 24, 32, 48, 96]
|
|
216
|
+
radius-scale: [0, 6, 8, 24, 9999]
|
|
217
|
+
shadow-levels: [none, sm, md]
|
|
218
|
+
motion: { durations: [100, 150, 250], easings: ["cubic-bezier(0.4,0,0.2,1)"] }
|
|
219
|
+
icons: { family: lucide, stroke: 1.75 }
|
|
220
|
+
accent-count: 1
|
|
221
|
+
```
|