@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,234 @@
|
|
|
1
|
+
---
|
|
2
|
+
schema: design-md/v1
|
|
3
|
+
product: IBM
|
|
4
|
+
provenance: library
|
|
5
|
+
sourced: 2026-07-04
|
|
6
|
+
---
|
|
7
|
+
|
|
8
|
+
# IBM — Carbon operator design
|
|
9
|
+
|
|
10
|
+
The operator reading of IBM's Carbon Design System. Carbon was built for enterprise product
|
|
11
|
+
surfaces, so it dresses an internal tool almost natively — but the source corpus is IBM's *marketing*
|
|
12
|
+
canvas, and marketing graces are stripped here. What carries: the flat 0px square geometry, IBM Blue
|
|
13
|
+
as the single accent, IBM Plex Sans, the 4px grid, and depth carried by hairlines and surface change.
|
|
14
|
+
What stays behind: the 76/60/42px weight-300 hero display type, the full-bleed blue CTA banner, the
|
|
15
|
+
dark inverted footer, and the soft-blue hero gradient. Both machine blocks are fully valued; every
|
|
16
|
+
judgment past the corpus is annotated `# derived:` where it lands.
|
|
17
|
+
|
|
18
|
+
## 1 Visual Theme
|
|
19
|
+
|
|
20
|
+
Light by default; dark is opt-in — in the brand only the footer and global header invert, and that
|
|
21
|
+
inversion is a marketing move that stays behind. Flat and square: every button, card, input, and
|
|
22
|
+
container sits at 0px corners, and hierarchy is carried by a 1px hairline `border` and surface change,
|
|
23
|
+
never by shadow. A single accent — IBM Blue `primary` #0f62fe — is reserved for the one action that
|
|
24
|
+
matters, for links, and for the focus rule. The neutral ramp is a true charcoal-on-white: ink #161616
|
|
25
|
+
on a white canvas, with #f4f4f4 and #e0e0e0 grays doing the structural work. Dense by design — Carbon
|
|
26
|
+
expects a lot on the page, not a lot of air. The anchor surface is a white content canvas beside a
|
|
27
|
+
faint gray side nav.
|
|
28
|
+
|
|
29
|
+
## 2 Color Roles
|
|
30
|
+
|
|
31
|
+
Light values first; hex is the brand's native format. One accent — `primary` is the only chromatic hue
|
|
32
|
+
that carries meaning; status hues speak only status.
|
|
33
|
+
|
|
34
|
+
| Role | Value | Allowed where |
|
|
35
|
+
| --- | --- | --- |
|
|
36
|
+
| `background` / `card` / `popover` | white `#ffffff` | page, tiles, and overlays — the dominant surface |
|
|
37
|
+
| `foreground` | charcoal `#161616` | all headings and primary ink |
|
|
38
|
+
| `muted` / `secondary` | light gray `#f4f4f4` (Carbon surface-1) | field fills, alternate-row bands, hovered tiles |
|
|
39
|
+
| `muted-foreground` | mid gray `#525252` | meta, sub-headlines, secondary text |
|
|
40
|
+
| `border` / `input` | hairline `#e0e0e0` (Carbon gray-20) | every card edge, grid line, field rule, divider |
|
|
41
|
+
| `primary` | IBM Blue `#0f62fe` | the one primary action; links; active nav; focus rule |
|
|
42
|
+
| `accent` | blue-10 tint `#edf5ff` | selected/hovered rows and nav, on-accent surfaces only |
|
|
43
|
+
| `ring` | `primary` `#0f62fe` | the 2px focus outline — keyboard-first, unmistakable |
|
|
44
|
+
| `destructive` | red-60 `#da1e28` | destructive actions and error state only |
|
|
45
|
+
| `success` / `warning` | green-50 `#24a148` / yellow-30 `#f1c21b` | status signalling only, never chrome |
|
|
46
|
+
|
|
47
|
+
## 3 Typography
|
|
48
|
+
|
|
49
|
+
One family carries everything: **IBM Plex Sans** for UI, body, and headings — hierarchy comes from size
|
|
50
|
+
and weight, never a second face. Operator headings run `font-weight-strong` (600); the marketing
|
|
51
|
+
weight-300 hero display treatment stays behind. **IBM Plex Mono** returns for IDs, codes, timestamps,
|
|
52
|
+
and log lines — Carbon keeps mono to product surfaces, and an operator UI is a product surface. Body
|
|
53
|
+
carries Carbon's signature `+0.16px` positive letter-spacing (part of the voice — keep it). Numeric
|
|
54
|
+
columns render `tabular-nums` so figures align down a column.
|
|
55
|
+
|
|
56
|
+
| Step | Role | Size · line | Weight · tracking |
|
|
57
|
+
| --- | --- | --- | --- |
|
|
58
|
+
| h1 | page title | 32px / 1.25 | `font-weight-strong` · `heading-tracking` |
|
|
59
|
+
| h2 | section head | 24px / 1.33 | `font-weight-strong` · `heading-tracking` |
|
|
60
|
+
| h3 | card / group head | 20px / 1.40 | `font-weight-strong` · `heading-tracking` |
|
|
61
|
+
| body | UI + prose | 16px / 1.50 | `font-weight-normal` · +0.16px |
|
|
62
|
+
| small | labels, meta, dense table | 14px / 1.29 | `font-weight-normal` · +0.16px |
|
|
63
|
+
| caption | eyebrow, utility meta | 12px / 1.33 | `font-weight-normal` · +0.32px, sentence case |
|
|
64
|
+
|
|
65
|
+
Eyebrows stay sentence case — Carbon resists the all-caps tracked eyebrow. Bump weight for emphasis;
|
|
66
|
+
never change size.
|
|
67
|
+
|
|
68
|
+
## 4 Component Stylings
|
|
69
|
+
|
|
70
|
+
Every recurring operator component composes from the primitives — no literal values.
|
|
71
|
+
|
|
72
|
+
- **Button** — `primary`: filled `primary` on `primary-foreground`, `radius` (0px, square), 12px·16px
|
|
73
|
+
padding, never pill. Secondary follows Carbon's charcoal treatment: `foreground` fill,
|
|
74
|
+
`primary-foreground` text. Tertiary/ghost: transparent with a 1px `primary` border and `primary`
|
|
75
|
+
text, fill only on hover.
|
|
76
|
+
- **Input** — `muted` fill, a 1px bottom `border`; focus swaps the bottom rule for Carbon's signature
|
|
77
|
+
2px `ring` underline and draws the full focus outline, square, no radius.
|
|
78
|
+
- **Card** — `card` surface on a 1px `border`, 0px corners, no shadow; a "recommended" tile lifts by
|
|
79
|
+
moving to the `muted` ground, not by elevation.
|
|
80
|
+
- **Table row** — height `table-row-height`; `border` grid lines; `muted` on hover; row selection
|
|
81
|
+
tints `accent`; `tabular-nums` on numeric columns; `font-mono` on IDs and codes.
|
|
82
|
+
- **Side panel** — detail and edit open in the side panel (`side-panel-width`,
|
|
83
|
+
`side-panel-width-rich` for content-heavy), beside the work, not over it.
|
|
84
|
+
- **Badge** — square (0px) tag, hairline `border`, status fill; status badges take `success` /
|
|
85
|
+
`warning` / `destructive`, never `primary`.
|
|
86
|
+
|
|
87
|
+
## 5 Layout
|
|
88
|
+
|
|
89
|
+
Base spacing unit 4px (Carbon's 4-pixel grid); the on-scale ramp is `2 · 4 · 8 · 12 · 16 · 24 · 32 ·
|
|
90
|
+
48 · 64 · 96`. Shell dimensions map one-to-one to the layout primitives: side nav
|
|
91
|
+
`sidebar-width-expanded` (256px) / `sidebar-width-collapsed` (48px icon rail), topbar `topbar-height`
|
|
92
|
+
(48px), side panel `side-panel-width` / `side-panel-width-rich`, modal cap `modal-width-max`, forms
|
|
93
|
+
`form-max-width`, tables full-width. Density is governed globally by `density-tier` (`dense`) and
|
|
94
|
+
stepped per archetype by the surface catalog. Sections separate by thin gray rows, not by large
|
|
95
|
+
vertical gaps — Carbon spends alignment, not air.
|
|
96
|
+
|
|
97
|
+
## 6 Depth
|
|
98
|
+
|
|
99
|
+
Flat. Hierarchy comes from the surface ladder and hairlines, not shadow:
|
|
100
|
+
|
|
101
|
+
- **0 — canvas** `background` white, no border.
|
|
102
|
+
- **1 — tile / card** `card` on a 1px `border`; no shadow — the default enterprise tile.
|
|
103
|
+
- **2 — surface band** the `muted` ground for alternate rows and hovered tiles; rank is surface
|
|
104
|
+
change, not elevation.
|
|
105
|
+
- **3 — overlay** `popover` / menu / side panel / modal — the one place `shadow-intensity` earns a
|
|
106
|
+
soft `sm`/`md` shadow.
|
|
107
|
+
|
|
108
|
+
Focus is Carbon's 2px `primary` outline (with a hairline-strong underline on fields), visible on every
|
|
109
|
+
interactive element. Three z-levels: content, sticky chrome, overlay.
|
|
110
|
+
|
|
111
|
+
## 7 Do's & Don'ts
|
|
112
|
+
|
|
113
|
+
- **Do** keep every button, card, input, and container at 0px square — the flat geometry *is* the
|
|
114
|
+
brand.
|
|
115
|
+
- **Do** reserve `primary` IBM Blue for the single primary action, links, and the focus rule; treat it
|
|
116
|
+
as scarce.
|
|
117
|
+
- **Do** carry hierarchy with surface change (`background` → `muted`) and 1px hairlines — skip drop
|
|
118
|
+
shadows.
|
|
119
|
+
- **Do** apply the +0.16px tracking to body sizes and `tabular-nums` / `font-mono` to figures and IDs.
|
|
120
|
+
- **Don't** round corners — even 4px breaks the Carbon look.
|
|
121
|
+
- **Don't** bold operator headings past `font-weight-strong`, or reach for the marketing weight-300
|
|
122
|
+
hero display.
|
|
123
|
+
- **Don't** promote a second chromatic accent — status uses `success` / `warning` / `destructive`
|
|
124
|
+
only.
|
|
125
|
+
- **Don't** open detail or edit in a modal when the side panel fits, and don't signal rank with shadow.
|
|
126
|
+
|
|
127
|
+
## 8 Responsive
|
|
128
|
+
|
|
129
|
+
The operator sweep is 375 / 768 / 1024 / 1440.
|
|
130
|
+
|
|
131
|
+
| Breakpoint | What changes |
|
|
132
|
+
| --- | --- |
|
|
133
|
+
| 375 | side nav → hamburger overlay; utility meta hides; two-pane list+detail stacks; side panel → full sheet; density holds |
|
|
134
|
+
| 768 | side nav collapses to the 48px icon rail; tables scroll their overflow; card grid → 2-up |
|
|
135
|
+
| 1024 | side nav expands to 256px; two-pane queue+detail holds side by side; grid up to 4-up |
|
|
136
|
+
| 1440 | content caps at `form-max-width` for forms; tables and dashboards use the full width |
|
|
137
|
+
|
|
138
|
+
## 9 Agent Prompt Guide
|
|
139
|
+
|
|
140
|
+
This entry dresses an internal operator surface — a queue, a data console, an admin panel — in Carbon.
|
|
141
|
+
Carry over: flat 0px square geometry, IBM Blue as the single accent, IBM Plex Sans plus Plex Mono, the
|
|
142
|
+
4px grid, hairline-and-surface-change depth, the 2px blue focus rule, and the +0.16px body tracking.
|
|
143
|
+
Leave behind: the 76/60/42px weight-300 hero display type, the full-bleed blue CTA banner, the dark
|
|
144
|
+
inverted footer, and the soft-blue hero gradient — all marketing.
|
|
145
|
+
|
|
146
|
+
- Lead every list surface with its data table; keep it square and dense.
|
|
147
|
+
- Accent only the primary action. IBM Blue is scarce — links, primary CTA, focus. Anything more is
|
|
148
|
+
drift.
|
|
149
|
+
- Keep 0px corners everywhere; a rounded corner reads as a different brand.
|
|
150
|
+
- IDs, codes, and timestamps in Plex Mono; every numeric column `tabular-nums`; body keeps +0.16px
|
|
151
|
+
tracking and sentence-case eyebrows.
|
|
152
|
+
- Depth is hairline and surface change; reach past a hairline only for a real overlay.
|
|
153
|
+
- Detail and edit go in the side panel; a modal is a confirmation, not a workspace.
|
|
154
|
+
- Keep the whole app light; do not invert to charcoal outside a deliberate dark opt-in.
|
|
155
|
+
|
|
156
|
+
```yaml design-primitives
|
|
157
|
+
radius: 0px # derived: Carbon commits to 0px square corners on every surface; the scale still offers 2/4px for rare exceptions
|
|
158
|
+
shadow-intensity: 0.3 # derived: Carbon resists shadow on flat tiles; only overlays (menu/modal) take a soft Carbon elevation
|
|
159
|
+
border-weight: 1px
|
|
160
|
+
density-gap: 0.85 # derived: "content is dense by design" — dense tier tightens the spacing scale
|
|
161
|
+
density-inset: 0.85 # derived: matches the dense tier for coherent component insets
|
|
162
|
+
font-sans: IBM Plex Sans, Helvetica Neue, Arial, sans-serif
|
|
163
|
+
font-mono: IBM Plex Mono, ui-monospace, SFMono-Regular, monospace # derived: Carbon keeps mono to product surfaces; the operator UI is a product surface, so Plex Mono returns for IDs/codes/logs
|
|
164
|
+
font-weight-normal: 400
|
|
165
|
+
font-weight-strong: 600 # rationale: Carbon body-emphasis weight; operator headings use 600, not the marketing weight-300 hero display
|
|
166
|
+
heading-tracking: 0em # rationale: Carbon operator-scale headings track 0; the negative display tracking (-0.5px at 76px) stays with the marketing hero
|
|
167
|
+
duration-unit: 50ms # derived: corpus is silent on motion; a functional operator base
|
|
168
|
+
duration-fast: 70ms # derived: Carbon fast-01
|
|
169
|
+
duration-normal: 150ms # derived: Carbon moderate-01
|
|
170
|
+
duration-slow: 240ms # derived: Carbon moderate-02
|
|
171
|
+
ease-default: cubic-bezier(0.2,0,0.38,0.9) # derived: Carbon "productive standard" easing (corpus silent; brand-authentic)
|
|
172
|
+
contrast-boost: 1 # derived: Carbon's 1px #e0e0e0 hairlines already read crisply; no boost needed
|
|
173
|
+
icon-stroke: 2 # derived: Carbon @carbon/icons run a 2px square stroke — heavier and squarer than the default 1.75
|
|
174
|
+
icon-size-base: 16px # derived: Carbon's smallest icon size on the 16px grid
|
|
175
|
+
sidebar-width-expanded: 256px # derived: Carbon UI Shell SideNav width
|
|
176
|
+
sidebar-width-collapsed: 48px # derived: Carbon SideNav icon rail / header height (corpus top-nav is 48px)
|
|
177
|
+
topbar-height: 48px # rationale: corpus top-nav height is 48px exactly
|
|
178
|
+
side-panel-width: 400px # derived: corpus documents no side panel; standard operator detail width
|
|
179
|
+
side-panel-width-rich: 640px # derived: content-heavy detail; matches Carbon's wide modal
|
|
180
|
+
modal-width-max: 640px # derived: Carbon medium modal width
|
|
181
|
+
form-max-width: 640px # derived: single-column form cap
|
|
182
|
+
table-row-height: 40px # derived: Carbon DataTable "short" row; dense archetypes step to 32px via the surface catalog
|
|
183
|
+
verbosity: default
|
|
184
|
+
feedback: subtle
|
|
185
|
+
density-tier: dense # rationale: Carbon reads dense — "content is dense by design, not a lot of air"
|
|
186
|
+
product-traits: [enterprise, dashboard, admin, data-grid, dev-tools]
|
|
187
|
+
```
|
|
188
|
+
|
|
189
|
+
```yaml lever-manifest
|
|
190
|
+
version: 1
|
|
191
|
+
fonts: { sans: "IBM Plex Sans, Helvetica Neue, Arial, sans-serif", mono: "IBM Plex Mono, ui-monospace, SFMono-Regular, monospace" }
|
|
192
|
+
color-tokens:
|
|
193
|
+
light:
|
|
194
|
+
background: "#ffffff"
|
|
195
|
+
foreground: "#161616"
|
|
196
|
+
card: "#ffffff"
|
|
197
|
+
card-foreground: "#161616"
|
|
198
|
+
muted: "#f4f4f4"
|
|
199
|
+
muted-foreground: "#525252"
|
|
200
|
+
border: "#e0e0e0"
|
|
201
|
+
input: "#e0e0e0"
|
|
202
|
+
ring: "#0f62fe"
|
|
203
|
+
primary: "#0f62fe"
|
|
204
|
+
primary-foreground: "#ffffff"
|
|
205
|
+
accent: "#edf5ff" # derived: Carbon blue-10 row-selection tint (corpus gives no selection color)
|
|
206
|
+
accent-foreground: "#0f62fe"
|
|
207
|
+
destructive: "#da1e28"
|
|
208
|
+
destructive-foreground: "#ffffff"
|
|
209
|
+
success: "#24a148"
|
|
210
|
+
warning: "#f1c21b"
|
|
211
|
+
popover: "#ffffff"
|
|
212
|
+
popover-foreground: "#161616"
|
|
213
|
+
secondary: "#f4f4f4"
|
|
214
|
+
secondary-foreground: "#161616"
|
|
215
|
+
chart-1: "#6929c4" # derived: Carbon @carbon/charts categorical 1 (purple-70) — corpus silent on charts
|
|
216
|
+
chart-2: "#1192e8" # derived: Carbon categorical 2 (cyan-50)
|
|
217
|
+
chart-3: "#005d5d" # derived: Carbon categorical 3 (teal-70)
|
|
218
|
+
chart-4: "#9f1853" # derived: Carbon categorical 4 (magenta-70)
|
|
219
|
+
chart-5: "#fa4d56" # derived: Carbon categorical 5 (red-50)
|
|
220
|
+
sidebar: "#f4f4f4" # derived: Carbon surface-1 side-nav ground, distinct from the white canvas
|
|
221
|
+
sidebar-foreground: "#161616"
|
|
222
|
+
sidebar-primary: "#0f62fe"
|
|
223
|
+
sidebar-primary-foreground: "#ffffff"
|
|
224
|
+
sidebar-accent: "#edf5ff" # derived: blue-10 active/hovered nav tint
|
|
225
|
+
sidebar-accent-foreground: "#0f62fe"
|
|
226
|
+
sidebar-border: "#e0e0e0"
|
|
227
|
+
sidebar-ring: "#0f62fe"
|
|
228
|
+
spacing-scale: [2, 4, 8, 12, 16, 24, 32, 48, 64, 96]
|
|
229
|
+
radius-scale: [0, 2, 4, 6, 8, 9999]
|
|
230
|
+
shadow-levels: [none, sm, md]
|
|
231
|
+
motion: { durations: [70, 150, 240], easings: ["cubic-bezier(0.2,0,0.38,0.9)"] }
|
|
232
|
+
icons: { family: lucide, stroke: 2 }
|
|
233
|
+
accent-count: 1
|
|
234
|
+
```
|
|
@@ -0,0 +1,240 @@
|
|
|
1
|
+
---
|
|
2
|
+
schema: design-md/v1
|
|
3
|
+
product: Intercom
|
|
4
|
+
provenance: library
|
|
5
|
+
sourced: 2026-07-04
|
|
6
|
+
---
|
|
7
|
+
|
|
8
|
+
# Intercom — the operator reading
|
|
9
|
+
|
|
10
|
+
The calm, editorial customer-service brand rendered for internal tools. Intercom's public surfaces are
|
|
11
|
+
publication-quiet and product-screenshot-led; an operator surface wearing this brand keeps the warm
|
|
12
|
+
cream canvas, the white-on-cream lift, the charcoal ink, the single reserved Fin Orange, the modest
|
|
13
|
+
radii, and the geometric-sans voice that never bolds past 500. The 72px hero display, the
|
|
14
|
+
product-mockup rhythm, the pure-black quote strip, the pill tab toggles, and the 96px section breathing
|
|
15
|
+
stay behind. What carries is the feel: a warm cream ground the category never uses, panels that lift by
|
|
16
|
+
turning white rather than by casting shadow, and one orange spark held in reserve. Both machine blocks
|
|
17
|
+
are fully valued; every judgment past the corpus is annotated `# derived:`.
|
|
18
|
+
|
|
19
|
+
## 1 Visual Theme
|
|
20
|
+
|
|
21
|
+
Light by default; dark is opt-in (Intercom ships no dark theme on the public web). The anchor surface
|
|
22
|
+
is not white — it is a soft warm cream `background` (`#f5f1ec`), the brand's defining signal. Panels
|
|
23
|
+
and cards lift **onto white** (`card`, `#ffffff`): the depth strategy is a surface change, not a shadow.
|
|
24
|
+
Flat throughout — hierarchy comes from the cream-to-white ladder, warm hairline `border` (`#d3cec6`),
|
|
25
|
+
and type weight, never heavy elevation. A single chromatic voltage, Fin Orange (`primary`, `#ff5600`),
|
|
26
|
+
is held in reserve for the one action that matters; everything neutral is charcoal ink (`foreground`,
|
|
27
|
+
`#111111`) on cream. Corners are modest — `radius` (8px) on buttons and inputs, a larger step on cards
|
|
28
|
+
— never pill, never square. Density is `standard`: calm and editorial, not cramped.
|
|
29
|
+
|
|
30
|
+
## 2 Color Roles
|
|
31
|
+
|
|
32
|
+
Light values (the manifest carries the exact hex — Intercom's native format). One accent: Fin Orange
|
|
33
|
+
is the only chromatic hue that carries meaning; the report palette lives in charts, status speaks only
|
|
34
|
+
status.
|
|
35
|
+
|
|
36
|
+
| Role | Value | Allowed where |
|
|
37
|
+
| --- | --- | --- |
|
|
38
|
+
| `background` | cream `#f5f1ec` | the page canvas — warm, never pure white; the brand's defining surface |
|
|
39
|
+
| `card` / `popover` | white `#ffffff` | cards, panels, overlays — they lift off the cream by turning white |
|
|
40
|
+
| `foreground` | charcoal `#111111` | all primary ink, headlines, and neutral/secondary button labels |
|
|
41
|
+
| `muted` | warm cream `#ebe7e1` | hover rows, subtle fills, quiet panel bands (surface-2) |
|
|
42
|
+
| `muted-foreground` | ink-muted `#626260` | labels, captions, secondary text, inactive tabs |
|
|
43
|
+
| `secondary` | warm cream `#ebe7e1` | secondary button fill — ink label on cream, 1px `border` |
|
|
44
|
+
| `border` / `input` | warm hairline `#d3cec6` | every separator, grid line, and field edge — a soft warm gray, not an ink line |
|
|
45
|
+
| `primary` | Fin Orange `#ff5600` | the single primary action per surface; active nav; the one reserved voltage |
|
|
46
|
+
| `accent` | deep cream `#e6e0d6` | selected/hovered rows and nav — Intercom selects by a warm-neutral shift, not by colour |
|
|
47
|
+
| `ring` | Fin Orange `#ff5600` | the focus outline — unmistakable, because keyboard-first |
|
|
48
|
+
| `destructive` | error red `#c41c1c` | destructive actions and error state only |
|
|
49
|
+
| `success` / `warning` | green `#0bdf50` / amber `#d97706` | status signalling only, never chrome |
|
|
50
|
+
|
|
51
|
+
Charcoal is Intercom's marketing primary because a marketing page carries many CTAs; the operator
|
|
52
|
+
reading has one primary action per surface, so it earns the reserved orange, and charcoal stays the
|
|
53
|
+
neutral ink for secondary actions. Brand Blue (`#0007cb`) and the pure-black quote strip are marketing
|
|
54
|
+
graces — they carry no operator role (see §7).
|
|
55
|
+
|
|
56
|
+
## 3 Typography
|
|
57
|
+
|
|
58
|
+
One sans, one mono. `font-sans` is Saans — Intercom's proprietary geometric sans (Inter at weight 500
|
|
59
|
+
the closest open substitute); the whole ramp rides it, display voice carried by size and modest weight,
|
|
60
|
+
not a second family. The signature is restraint: `font-weight-strong` stops at **500** — Saans at 500
|
|
61
|
+
reads confident without bold, and the brand never reaches past it. Negative tracking is the other
|
|
62
|
+
signature, scaling with size (the corpus runs -0.5px at 28px). `font-mono` is SaansMono (JetBrains Mono
|
|
63
|
+
the approximation) for IDs, codes, timestamps, and log lines; numeric columns render `tabular-nums`.
|
|
64
|
+
|
|
65
|
+
| Step | Role | Size · line | Weight · tracking |
|
|
66
|
+
| --- | --- | --- | --- |
|
|
67
|
+
| h1 | page title | 24px / 1.25 | `font-weight-strong` · `heading-tracking` |
|
|
68
|
+
| h2 | section head | 20px / 1.3 | `font-weight-strong` · -0.015em |
|
|
69
|
+
| h3 | card / group head | 16px / 1.35 | `font-weight-strong` · -0.01em |
|
|
70
|
+
| body | UI + prose | 14px / 1.5 | `font-weight-normal` |
|
|
71
|
+
| small | labels, meta, dense table | 13px / 1.4 | `font-weight-normal` |
|
|
72
|
+
| eyebrow | section eyebrow | 13px / 1.3 | `font-weight-strong`, sentence case, no tracking |
|
|
73
|
+
| code | IDs, logs, amounts | 13px / 1.5 | `font-weight-normal` |
|
|
74
|
+
|
|
75
|
+
Body line-height relaxes to 1.5 — an editorial breath the category tightens away. Eyebrows are
|
|
76
|
+
**sentence case**, never the all-caps tracked label the operator default reaches for. Bump weight to
|
|
77
|
+
`font-weight-strong` (500) for emphasis; never bold. The 72px hero display stays behind.
|
|
78
|
+
|
|
79
|
+
## 4 Component Stylings
|
|
80
|
+
|
|
81
|
+
Every recurring operator component composes from the primitives — no literal values.
|
|
82
|
+
|
|
83
|
+
- **Button** — `primary`: filled Fin Orange on `primary-foreground` (white), `radius` (8px), no pill.
|
|
84
|
+
Secondary: `secondary` warm-cream fill, 1px `border`, `foreground` ink label. Ghost: transparent,
|
|
85
|
+
`accent` on hover.
|
|
86
|
+
- **Input** — `card` (white) fill, 1px `border` (`border-weight`), `radius`; focus draws the Fin Orange `ring` at 2px, no glow.
|
|
87
|
+
- **Card** — `card` white surface lifting off the cream canvas, 1px `border`, a larger corner step from
|
|
88
|
+
the radius scale; shadow only when a true overlay floats (`shadow-intensity`); inset by `density-inset`.
|
|
89
|
+
- **Table row** — height `table-row-height`; `border` grid lines; `muted` on hover; `tabular-nums` on
|
|
90
|
+
numeric columns; row selection tints `accent` (warm-neutral, not orange).
|
|
91
|
+
- **Side panel** — detail and edit open in the side panel (`side-panel-width`, `side-panel-width-rich`
|
|
92
|
+
for content-heavy), beside the work, not over it.
|
|
93
|
+
- **Badge** — pill radius, hairline `border`, `muted`/status fill, sentence-case label; status badges
|
|
94
|
+
take `success` / `warning` / `destructive`, never `primary`.
|
|
95
|
+
|
|
96
|
+
## 5 Layout
|
|
97
|
+
|
|
98
|
+
Base spacing unit 8px; the on-scale ramp is `4 · 8 · 12 · 16 · 24 · 32 · 48 · 64` (the marketing 96px
|
|
99
|
+
section step stays behind). Shell dimensions map one-to-one to the layout primitives: sidebar
|
|
100
|
+
`sidebar-width-expanded` (248px) / `sidebar-width-collapsed` (56px), topbar `topbar-height` (56px, the
|
|
101
|
+
corpus nav height), side panel `side-panel-width` (420px) / `side-panel-width-rich` (640px), modal cap
|
|
102
|
+
`modal-width-max`, forms `form-max-width`, tables full-width; card interior padding a calm 24px. Density
|
|
103
|
+
is governed globally by `density-tier` and stepped per archetype by the surface catalog.
|
|
104
|
+
|
|
105
|
+
## 6 Depth
|
|
106
|
+
|
|
107
|
+
Flat, surface-change-first. Hierarchy comes from the cream-to-white ladder and warm hairlines, not
|
|
108
|
+
shadow — Intercom resists drop shadows:
|
|
109
|
+
|
|
110
|
+
- **0 — canvas** `background` cream (`#f5f1ec`), no border.
|
|
111
|
+
- **1 — panel / card** `card` white lifting off the cream on a 1px `border`; the lift is the elevation.
|
|
112
|
+
- **2 — overlay** `popover` / side panel / modal — the one place `shadow-intensity` earns a single
|
|
113
|
+
faint `sm` shadow, over a scrim for modals. Rank is the white-on-cream shift, the border, and position.
|
|
114
|
+
|
|
115
|
+
Focus is a 2px Fin Orange `ring` outline (never a glow), visible on every interactive element. Three
|
|
116
|
+
z-levels: content, sticky chrome, overlay.
|
|
117
|
+
|
|
118
|
+
## 7 Do's & Don'ts
|
|
119
|
+
|
|
120
|
+
- **Do** anchor on the warm cream canvas — pure white reads as ordinary SaaS; the cream is the brand.
|
|
121
|
+
- **Do** lift panels and cards onto white (`card`) off the cream — the surface change is the depth.
|
|
122
|
+
- **Do** reserve Fin Orange (`primary`) for the single most important action; everything else is
|
|
123
|
+
charcoal ink or status.
|
|
124
|
+
- **Do** keep corners modest (`radius` 8px on buttons/inputs, the larger step on cards), write eyebrows
|
|
125
|
+
in sentence case, apply `tabular-nums` to numeric columns and `font-mono` to IDs/codes/timestamps.
|
|
126
|
+
- **Don't** use pure white as the canvas, or add drop shadows to floating cards.
|
|
127
|
+
- **Don't** spread Fin Orange — no orange section fills, no orange on secondary actions, no second
|
|
128
|
+
chromatic accent. The report palette stays in charts; status uses `success` / `warning` / `destructive`.
|
|
129
|
+
- **Don't** bold — Saans stops at weight 500; emphasise by weight, never a heavier cut or a size jump.
|
|
130
|
+
- **Don't** write all-caps tracked eyebrows, pill the primary CTA, or pull the 72px hero, the black
|
|
131
|
+
quote strip, or the product-mockup rhythm into operator chrome.
|
|
132
|
+
|
|
133
|
+
## 8 Responsive
|
|
134
|
+
|
|
135
|
+
The operator sweep is 375 / 768 / 1024 / 1440.
|
|
136
|
+
|
|
137
|
+
| Breakpoint | What changes |
|
|
138
|
+
| --- | --- |
|
|
139
|
+
| 375 | sidebar → off-canvas drawer; two-pane list+detail stacks; side panel → full sheet; density holds |
|
|
140
|
+
| 768 | sidebar collapses to the icon rail (`sidebar-width-collapsed`); tables scroll their overflow; card grids drop to 2-up |
|
|
141
|
+
| 1024 | sidebar expands; two-pane queue+detail holds side by side; card grids 3-up |
|
|
142
|
+
| 1440 | forms cap at `form-max-width`; tables and dashboards use the full width; the cream breathing widens |
|
|
143
|
+
|
|
144
|
+
## 9 Agent Prompt Guide
|
|
145
|
+
|
|
146
|
+
Directives the emitting agent follows verbatim. This brand is calm and editorial; keep it restrained
|
|
147
|
+
for operator work.
|
|
148
|
+
|
|
149
|
+
- Reach for the warm cream canvas first — never pure white; the cream tint is Intercom.
|
|
150
|
+
- Lift panels and cards by turning them white on the cream, not by casting a shadow.
|
|
151
|
+
- Accent only the primary action in Fin Orange (`primary`). If two things want the accent, one is not
|
|
152
|
+
primary. Neutral and secondary actions are charcoal ink on cream.
|
|
153
|
+
- Type stays Saans (Inter fallback) at weight 500 for emphasis and 400 for body — never bold. Eyebrows
|
|
154
|
+
are sentence case, never all-caps tracked; page titles carry negative tracking.
|
|
155
|
+
- Every numeric column is `tabular-nums`; every ID / code / timestamp is `font-mono`. Every workflow
|
|
156
|
+
completes from the keyboard; the Fin Orange `ring` focus outline is always visible.
|
|
157
|
+
- Stay flat — the cream-to-white ladder and warm hairlines before shadow; reach for the one faint tier
|
|
158
|
+
only for a real overlay.
|
|
159
|
+
- One accent. The report palette (`chart-*`) is for charts only; Brand Blue and the black quote strip
|
|
160
|
+
are not operator colors. Leave the hero, the product-mockup rhythm, and the 96px breathing behind.
|
|
161
|
+
|
|
162
|
+
```yaml design-primitives
|
|
163
|
+
radius: 8px # corpus: buttons/inputs at rounded.md (8px); scale offers 12px cards, 16px product tiles
|
|
164
|
+
shadow-intensity: 0.25 # derived: Intercom resists drop shadows — depth is white-on-cream surface change; shadow only faint on true overlays
|
|
165
|
+
border-weight: 1px
|
|
166
|
+
density-gap: 1
|
|
167
|
+
density-inset: 1
|
|
168
|
+
font-sans: Saans, Inter, system-ui, sans-serif # corpus: proprietary Saans; Inter at weight 500 the closest free substitute
|
|
169
|
+
font-mono: SaansMono, "JetBrains Mono", ui-monospace, monospace # corpus: proprietary SaansMono; JetBrains Mono the approximation
|
|
170
|
+
font-weight-normal: 400
|
|
171
|
+
font-weight-strong: 500 # corpus: weight 500 carries display "confident without bold" — the brand never bolds past 500
|
|
172
|
+
heading-tracking: -0.02em # corpus: aggressive negative tracking is an Intercom signature (-0.5px at 28px); ~-0.02em at operator heading scale
|
|
173
|
+
duration-unit: 50ms # derived: corpus (marketing) is silent on motion; operator-standard functional base
|
|
174
|
+
duration-fast: 100ms # derived: corpus silent on motion
|
|
175
|
+
duration-normal: 150ms # derived: corpus silent on motion
|
|
176
|
+
duration-slow: 250ms # derived: corpus silent on motion
|
|
177
|
+
ease-default: cubic-bezier(0.4,0,0.2,1) # derived: corpus silent; standard operator ease
|
|
178
|
+
contrast-boost: 1 # derived: Intercom's soft warm hairline (#d3cec6 on cream) is intentionally low-contrast; no boost
|
|
179
|
+
icon-stroke: 1.5 # derived: refined editorial feel; one step under lucide's 2
|
|
180
|
+
icon-size-base: 16px
|
|
181
|
+
sidebar-width-expanded: 248px # derived: Intercom has no operator shell; standard operator rail
|
|
182
|
+
sidebar-width-collapsed: 56px # derived: corpus has no shell; operator standard icon rail
|
|
183
|
+
topbar-height: 56px # corpus: top-nav height 56px
|
|
184
|
+
side-panel-width: 420px # derived: corpus has no shell; standard side panel
|
|
185
|
+
side-panel-width-rich: 640px # derived: corpus has no shell; content-heavy detail width
|
|
186
|
+
modal-width-max: 560px # derived: corpus has no shell; confirmations only
|
|
187
|
+
form-max-width: 640px # derived: corpus has no shell; standard form column
|
|
188
|
+
table-row-height: 44px # derived: Intercom's calm editorial rhythm breathes a touch over the dense 40px
|
|
189
|
+
verbosity: default
|
|
190
|
+
feedback: subtle # rationale: Intercom is a warm, human support brand — gentle present feedback, not austere silence
|
|
191
|
+
density-tier: standard # rationale: editorial-spacious marketing read down to an honest operator tier; warmth carried by the cream palette, not whitespace
|
|
192
|
+
product-traits: [customer-support, helpdesk, inbox, crm, ai-agent]
|
|
193
|
+
```
|
|
194
|
+
|
|
195
|
+
```yaml lever-manifest
|
|
196
|
+
version: 1
|
|
197
|
+
fonts: { sans: "Saans, Inter, system-ui, sans-serif", mono: "SaansMono, \"JetBrains Mono\", ui-monospace, monospace" }
|
|
198
|
+
color-tokens:
|
|
199
|
+
light:
|
|
200
|
+
background: "#f5f1ec" # cream canvas — the brand's defining surface, never pure white
|
|
201
|
+
foreground: "#111111" # charcoal ink
|
|
202
|
+
card: "#ffffff" # white — cards lift off the cream canvas
|
|
203
|
+
card-foreground: "#111111"
|
|
204
|
+
muted: "#ebe7e1" # surface-2 warm cream — hover rows, subtle fills
|
|
205
|
+
muted-foreground: "#626260" # ink-muted
|
|
206
|
+
border: "#d3cec6" # warm hairline
|
|
207
|
+
input: "#d3cec6"
|
|
208
|
+
ring: "#ff5600" # derived: focus outline in the brand voltage, unmistakable for keyboard-first
|
|
209
|
+
primary: "#ff5600" # Fin Orange — the single voltage, reserved for the one primary action per surface (operator reading of Intercom's reserve-orange rule)
|
|
210
|
+
primary-foreground: "#ffffff" # corpus: white on button-fin
|
|
211
|
+
accent: "#e6e0d6" # derived: deep-cream selection tint (a step past surface-2) — Intercom selects by warm-neutral shift, reserving orange
|
|
212
|
+
accent-foreground: "#111111"
|
|
213
|
+
destructive: "#c41c1c" # corpus: semantic-error
|
|
214
|
+
destructive-foreground: "#ffffff"
|
|
215
|
+
success: "#0bdf50" # corpus: semantic-success (bright brand green; a status fill/dot, not text)
|
|
216
|
+
warning: "#d97706" # derived: corpus has no warning amber; a warm amber kept distinct from the red-orange Fin primary
|
|
217
|
+
popover: "#ffffff"
|
|
218
|
+
popover-foreground: "#111111"
|
|
219
|
+
secondary: "#ebe7e1" # warm cream secondary button (operator reading of Intercom's white/cream secondary — cream stays visible on white cards)
|
|
220
|
+
secondary-foreground: "#111111"
|
|
221
|
+
chart-1: "#fe4c02" # corpus report palette: report-orange
|
|
222
|
+
chart-2: "#65b5ff" # corpus: report-blue
|
|
223
|
+
chart-3: "#0bdf50" # corpus: report-green
|
|
224
|
+
chart-4: "#ff2067" # corpus: report-pink
|
|
225
|
+
chart-5: "#b3e01c" # corpus: report-lime
|
|
226
|
+
sidebar: "#efeae3" # derived: warm cream rail, a hair off the cream canvas
|
|
227
|
+
sidebar-foreground: "#111111"
|
|
228
|
+
sidebar-primary: "#ff5600" # Fin Orange marks the active nav item
|
|
229
|
+
sidebar-primary-foreground: "#ffffff"
|
|
230
|
+
sidebar-accent: "#e6e0d6" # matches accent — warm-cream hover/active nav
|
|
231
|
+
sidebar-accent-foreground: "#111111"
|
|
232
|
+
sidebar-border: "#d3cec6"
|
|
233
|
+
sidebar-ring: "#ff5600"
|
|
234
|
+
spacing-scale: [4, 8, 12, 16, 24, 32, 48, 64] # corpus base unit 8px; drops the marketing 96px section step
|
|
235
|
+
radius-scale: [0, 4, 6, 8, 12, 16, 24, 9999] # corpus radius scale (xs..xxl, pill)
|
|
236
|
+
shadow-levels: [none, sm] # Intercom resists shadows — one faint tier for true overlays over the flat baseline
|
|
237
|
+
motion: { durations: [100, 150, 250], easings: ["cubic-bezier(0.4,0,0.2,1)"] } # derived: corpus silent on motion
|
|
238
|
+
icons: { family: lucide, stroke: 1.5 }
|
|
239
|
+
accent-count: 1
|
|
240
|
+
```
|