aiblueprint-cli 1.4.73 → 1.4.75
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/README.md +7 -0
- package/agents-config/skills/use-style/SKILL.md +54 -0
- package/agents-config/skills/use-style/examples/anthropic.html +400 -0
- package/agents-config/skills/use-style/examples/dusk.html +368 -0
- package/agents-config/skills/use-style/examples/gumroad.html +396 -0
- package/agents-config/skills/use-style/examples/linear.html +389 -0
- package/agents-config/skills/use-style/examples/new-york-times.html +417 -0
- package/agents-config/skills/use-style/examples/raycast.html +402 -0
- package/agents-config/skills/use-style/examples/split-auth.html +366 -0
- package/agents-config/skills/use-style/examples/stripe.html +386 -0
- package/agents-config/skills/use-style/examples/vercel.html +379 -0
- package/agents-config/skills/use-style/styles/anthropic.md +266 -0
- package/agents-config/skills/use-style/styles/dusk.md +269 -0
- package/agents-config/skills/use-style/styles/grid.md +284 -0
- package/agents-config/skills/use-style/styles/gumroad.md +273 -0
- package/agents-config/skills/use-style/styles/linear.md +355 -0
- package/agents-config/skills/use-style/styles/new-york-times.md +277 -0
- package/agents-config/skills/use-style/styles/raycast.md +285 -0
- package/agents-config/skills/use-style/styles/split-auth.md +281 -0
- package/agents-config/skills/use-style/styles/stripe.md +372 -0
- package/agents-config/skills/use-style/styles/vercel-simple.md +322 -0
- package/dist/cli.js +513 -42
- package/package.json +1 -1
|
@@ -0,0 +1,273 @@
|
|
|
1
|
+
# Gumroad Style
|
|
2
|
+
|
|
3
|
+
Loud neo-brutalist commerce. Yellow + pink primaries, thick black borders, hard offset shadows, flat fills, playful illustration. Confident and a little chaotic - built to sell.
|
|
4
|
+
|
|
5
|
+
**Reference vibe:** gumroad.com (marketplace) and the Gumroad creator dashboard.
|
|
6
|
+
|
|
7
|
+
---
|
|
8
|
+
|
|
9
|
+
## Core vibe
|
|
10
|
+
|
|
11
|
+
- **Loud and flat.** Saturated primaries, no gradients on UI, no soft shadows. Everything is bold and unapologetic.
|
|
12
|
+
- **Thick black outlines.** `2-4px` solid black borders define cards, buttons, inputs - the structural language.
|
|
13
|
+
- **Hard offset shadow.** The neo-brutalist tell: `4px 4px 0 #000` (or `6px 6px`), no blur. Things look stamped, not floating.
|
|
14
|
+
- **Yellow + pink.** Brand yellow `#FFC900` for big surfaces/marketing, pink `#FF90E8` for accents, prices, CTAs, active state.
|
|
15
|
+
- **Bold geometric sans.** Heavy grotesque for everything; lowercase wordmark. No serif.
|
|
16
|
+
- **Square-ish, but pills for actions.** Cards near-`0` radius with thick borders; nav items and buttons are full pills.
|
|
17
|
+
- **Playful illustration.** Flat primary-color cartoons, hand-drawn energy, emoji-adjacent. Personality over polish.
|
|
18
|
+
- **Two surfaces.** Loud light/yellow marketplace, and a near-black creator dashboard with pink accents.
|
|
19
|
+
|
|
20
|
+
---
|
|
21
|
+
|
|
22
|
+
## Color
|
|
23
|
+
|
|
24
|
+
Portable palette. Map to project tokens when available.
|
|
25
|
+
|
|
26
|
+
| Role | Hex | CSS var (suggested) | Usage |
|
|
27
|
+
|------|-----|---------------------|-------|
|
|
28
|
+
| Brand yellow | `#FFC900` | `--gr-yellow` | Hero bands, marketing background, highlights |
|
|
29
|
+
| Pink | `#FF90E8` | `--gr-pink` | Accent, price tags, CTAs, active nav, links |
|
|
30
|
+
| Ink | `#000000` | `--gr-fg` | Text, borders, shadows |
|
|
31
|
+
| Paper | `#FFFFFF` | `--gr-bg` | Light surface, cards on yellow/dark |
|
|
32
|
+
| Off-white | `#F4F4F0` | `--gr-paper` | Subtle light cards |
|
|
33
|
+
| Teal | `#23A094` | `--gr-teal` | Secondary accent / illustration / chart |
|
|
34
|
+
| Mint | `#90E8D0` | `--gr-mint` | Light teal tint |
|
|
35
|
+
| Purple | `#90A8ED` | `--gr-purple` | Illustration / chart series |
|
|
36
|
+
| Orange | `#FF7051` | `--gr-orange` | Warning / illustration / chart |
|
|
37
|
+
|
|
38
|
+
### Dark / dashboard surface
|
|
39
|
+
|
|
40
|
+
| Role | Hex | Usage |
|
|
41
|
+
|------|-----|-------|
|
|
42
|
+
| App canvas | `#161616` | Dashboard background |
|
|
43
|
+
| App rail | `#0F0F0F` / `#000` | Sidebar |
|
|
44
|
+
| Panel | `#1C1C1C` | Cards, product tiles |
|
|
45
|
+
| Panel raised | `#242424` | Hover, inputs |
|
|
46
|
+
| Ink on dark | `#FFFFFF` | Primary text |
|
|
47
|
+
| Muted on dark | `#A0A0A0` | Secondary text, inactive nav |
|
|
48
|
+
| Border on dark | `#2A2A2A` | Dividers, tile borders |
|
|
49
|
+
| Pink | `#FF90E8` | Active nav, accents, pill |
|
|
50
|
+
|
|
51
|
+
### Tailwind mapping (when no project tokens)
|
|
52
|
+
|
|
53
|
+
```css
|
|
54
|
+
:root {
|
|
55
|
+
--gr-yellow: #ffc900;
|
|
56
|
+
--gr-pink: #ff90e8;
|
|
57
|
+
--gr-fg: #000;
|
|
58
|
+
--gr-bg: #fff;
|
|
59
|
+
--gr-teal: #23a094;
|
|
60
|
+
--gr-dark: #161616;
|
|
61
|
+
}
|
|
62
|
+
```
|
|
63
|
+
|
|
64
|
+
**Rule:** On light, color is bold and large (yellow bands, pink tags). On dark, the canvas is near-black and pink is the one bright accent. Borders and shadows are always pure black.
|
|
65
|
+
|
|
66
|
+
---
|
|
67
|
+
|
|
68
|
+
## Typography
|
|
69
|
+
|
|
70
|
+
### Font stacks
|
|
71
|
+
|
|
72
|
+
| Role | Stack | Open substitute |
|
|
73
|
+
|------|-------|-----------------|
|
|
74
|
+
| Display / UI (sans) | `"Mabry Pro", "ABC Favorit", "Mona Sans", Inter, system-ui, sans-serif` | `"Mona Sans"` or Inter (tight) |
|
|
75
|
+
| Mono (rare: code/IDs) | `"Berkeley Mono", ui-monospace, monospace` | ui-monospace |
|
|
76
|
+
|
|
77
|
+
Geometric grotesque, bold. The `gumroad` wordmark is lowercase, heavy, slightly rounded.
|
|
78
|
+
|
|
79
|
+
### Scale
|
|
80
|
+
|
|
81
|
+
| Level | Pattern |
|
|
82
|
+
|-------|---------|
|
|
83
|
+
| Hero | `text-5xl md:text-7xl font-bold tracking-tight text-black` |
|
|
84
|
+
| Section / H2 | `text-2xl md:text-3xl font-bold` |
|
|
85
|
+
| Card title | `text-lg font-semibold` |
|
|
86
|
+
| Body | `text-base leading-relaxed` |
|
|
87
|
+
| Nav / button / label | `text-sm font-medium` |
|
|
88
|
+
| Price | `text-sm font-bold` (in the pink ribbon) |
|
|
89
|
+
| Wordmark | `text-2xl font-bold lowercase tracking-tight` |
|
|
90
|
+
|
|
91
|
+
Weight does the work - prefer `font-bold` over light weights. Tracking tight on big sizes.
|
|
92
|
+
|
|
93
|
+
---
|
|
94
|
+
|
|
95
|
+
## Layout tokens
|
|
96
|
+
|
|
97
|
+
| Token | Value |
|
|
98
|
+
|-------|-------|
|
|
99
|
+
| `GR_SHELL` | `mx-auto w-full max-w-[1200px] px-4 sm:px-6` |
|
|
100
|
+
| `GR_SECTION` | `py-10 md:py-14` |
|
|
101
|
+
| `GR_BORDER` | `border-2 border-black` (or `border-4` for emphasis) |
|
|
102
|
+
| `GR_SHADOW` | `shadow-[4px_4px_0_#000]` (hard, no blur) |
|
|
103
|
+
| `GR_CARD_PAD` | `p-5 sm:p-6` |
|
|
104
|
+
|
|
105
|
+
### Marketplace shell
|
|
106
|
+
|
|
107
|
+
Yellow top band (search + nav pills), then dark or white product grid below.
|
|
108
|
+
|
|
109
|
+
```tsx
|
|
110
|
+
<div className="min-h-screen bg-[#161616] text-white">
|
|
111
|
+
<header className="bg-[#ffc900] text-black">
|
|
112
|
+
<div className={cn(GR_SHELL, "flex items-center gap-4 py-4")}>
|
|
113
|
+
<span className="text-2xl font-bold lowercase">gumroad</span>
|
|
114
|
+
<input className="flex-1 rounded-full bg-black px-5 py-2.5 text-white" placeholder="Search products" />
|
|
115
|
+
<button className="rounded-full border-2 border-black px-5 py-2 font-medium">Log in</button>
|
|
116
|
+
</div>
|
|
117
|
+
<nav className={cn(GR_SHELL, "flex gap-2 pb-3")}>{pills}</nav>
|
|
118
|
+
</header>
|
|
119
|
+
<main className={cn(GR_SHELL, "py-10")}>{grid}</main>
|
|
120
|
+
</div>
|
|
121
|
+
```
|
|
122
|
+
|
|
123
|
+
### Dashboard shell (creator)
|
|
124
|
+
|
|
125
|
+
Black sidebar + dark canvas. Active item = pink text + pink icon.
|
|
126
|
+
|
|
127
|
+
```tsx
|
|
128
|
+
<div className="flex min-h-screen bg-[#161616] text-white">
|
|
129
|
+
<aside className="w-60 border-r border-[#2a2a2a] bg-black p-3">{nav}</aside>
|
|
130
|
+
<main className="flex-1 p-6 md:p-8">{content}</main>
|
|
131
|
+
</div>
|
|
132
|
+
```
|
|
133
|
+
|
|
134
|
+
---
|
|
135
|
+
|
|
136
|
+
## Borders, radius & shadow
|
|
137
|
+
|
|
138
|
+
| Context | Radius | Border | Shadow |
|
|
139
|
+
|---------|--------|--------|--------|
|
|
140
|
+
| Card / tile (light) | `rounded-none` or `rounded-sm` | `border-2 border-black` | `shadow-[4px_4px_0_#000]` |
|
|
141
|
+
| Card / tile (dark) | `rounded-md` | `border border-[#2a2a2a]` | none (flat) |
|
|
142
|
+
| Button / nav pill | `rounded-full` | `border-2 border-black` (light) | optional hard shadow |
|
|
143
|
+
| Input | `rounded-full` (search) or `rounded-md` | `border-2 border-black` | none |
|
|
144
|
+
| Price tag | ribbon/flag shape | none | none |
|
|
145
|
+
|
|
146
|
+
On light surfaces the hard offset shadow is the whole personality - use it on cards, buttons, callouts. On dark, drop the shadow and use thin borders instead.
|
|
147
|
+
|
|
148
|
+
---
|
|
149
|
+
|
|
150
|
+
## Component patterns
|
|
151
|
+
|
|
152
|
+
### Primary button (pink pill)
|
|
153
|
+
|
|
154
|
+
```tsx
|
|
155
|
+
<button className="rounded-full border-2 border-black bg-[#ff90e8] px-6 py-3 font-medium text-black shadow-[4px_4px_0_#000] transition-transform hover:-translate-y-0.5 hover:shadow-[6px_6px_0_#000]">
|
|
156
|
+
Start selling
|
|
157
|
+
</button>
|
|
158
|
+
```
|
|
159
|
+
|
|
160
|
+
### Secondary / nav pill
|
|
161
|
+
|
|
162
|
+
```tsx
|
|
163
|
+
// active
|
|
164
|
+
<button className="rounded-full bg-black px-4 py-1.5 text-sm font-medium text-white">Design</button>
|
|
165
|
+
// inactive
|
|
166
|
+
<button className="rounded-full px-4 py-1.5 text-sm font-medium text-black hover:bg-black/10">3D</button>
|
|
167
|
+
```
|
|
168
|
+
|
|
169
|
+
### Product tile (dark)
|
|
170
|
+
|
|
171
|
+
```tsx
|
|
172
|
+
<div className="overflow-hidden rounded-md border border-[#2a2a2a] bg-[#1c1c1c]">
|
|
173
|
+
<div className="aspect-[4/3] bg-[#242424]">{cover}</div>
|
|
174
|
+
<div className="border-t border-[#2a2a2a] p-4">
|
|
175
|
+
<h3 className="font-semibold text-white">Dracula PRO</h3>
|
|
176
|
+
<p className="mt-1 text-sm text-[#a0a0a0]">by Dracula</p>
|
|
177
|
+
</div>
|
|
178
|
+
</div>
|
|
179
|
+
```
|
|
180
|
+
|
|
181
|
+
### Price ribbon (the pink flag)
|
|
182
|
+
|
|
183
|
+
A pink tag with a notched/flag end, black text, bold.
|
|
184
|
+
|
|
185
|
+
```tsx
|
|
186
|
+
<span className="relative inline-block bg-[#ff90e8] px-3 py-1 text-sm font-bold text-black
|
|
187
|
+
[clip-path:polygon(0_0,100%_0,88%_50%,100%_100%,0_100%)]">
|
|
188
|
+
€130.15
|
|
189
|
+
</span>
|
|
190
|
+
```
|
|
191
|
+
|
|
192
|
+
### Sidebar nav item (dashboard)
|
|
193
|
+
|
|
194
|
+
```tsx
|
|
195
|
+
<a className={cn(
|
|
196
|
+
"flex items-center gap-3 rounded-md px-3 py-2 text-sm font-medium",
|
|
197
|
+
active ? "text-[#ff90e8]" : "text-white hover:bg-[#242424]"
|
|
198
|
+
)}>
|
|
199
|
+
<Icon className="size-5" /> Home
|
|
200
|
+
</a>
|
|
201
|
+
```
|
|
202
|
+
|
|
203
|
+
### Onboarding / getting-started card
|
|
204
|
+
|
|
205
|
+
Bordered dark tile with a flat line-illustration icon and a check when done.
|
|
206
|
+
|
|
207
|
+
```tsx
|
|
208
|
+
<div className="rounded-md border border-[#2a2a2a] bg-[#1c1c1c] p-6 text-center">
|
|
209
|
+
<div className="mx-auto mb-3 text-[#ff90e8]">{illustration}</div>
|
|
210
|
+
<p className="font-semibold text-white">Showtime</p>
|
|
211
|
+
<p className="mt-1 text-sm text-[#a0a0a0]">Create your first product.</p>
|
|
212
|
+
</div>
|
|
213
|
+
```
|
|
214
|
+
|
|
215
|
+
### Illustration band
|
|
216
|
+
|
|
217
|
+
Flat primary-color cartoon, full-bleed inside a bordered black panel. Teal/yellow/pink, hand-drawn energy.
|
|
218
|
+
|
|
219
|
+
```tsx
|
|
220
|
+
<div className="rounded-md border border-[#2a2a2a] overflow-hidden">
|
|
221
|
+
<img className="w-full" src="/illustration.png" alt="" />
|
|
222
|
+
</div>
|
|
223
|
+
```
|
|
224
|
+
|
|
225
|
+
---
|
|
226
|
+
|
|
227
|
+
## Charts (bold flat data viz)
|
|
228
|
+
|
|
229
|
+
Match the loud, flat personality:
|
|
230
|
+
|
|
231
|
+
- Series in the brand primaries: pink `#ff90e8`, teal `#23a094`, yellow `#ffc900`, purple `#90a8ed`, orange `#ff7051`. Highlighted series = pink.
|
|
232
|
+
- **Flat fills, thick or no bar radius** (`borderRadius: 0-4`). On light, add `borderColor:'#000', borderWidth:2` for the outlined look.
|
|
233
|
+
- Light surface: gridlines `#000` at low opacity or `#e5e5e0`; dark surface: gridlines `#2a2a2a`.
|
|
234
|
+
- Axis text bold sans; tooltip black background, white text, square corners (or a 2px black-bordered box).
|
|
235
|
+
- Doughnut: segments separated by the surface color; bold legend.
|
|
236
|
+
|
|
237
|
+
```js
|
|
238
|
+
const PINK="#ff90e8", TEAL="#23a094", YELLOW="#ffc900", PURPLE="#90a8ed", GRID="#2a2a2a";
|
|
239
|
+
Chart.defaults.font.family = "Mona Sans, Inter, system-ui, sans-serif";
|
|
240
|
+
// dark: bars backgroundColor:[TEAL, PINK], borderRadius:4
|
|
241
|
+
// light: add borderColor:"#000", borderWidth:2
|
|
242
|
+
// tooltip: { backgroundColor:"#000", cornerRadius:0 }
|
|
243
|
+
```
|
|
244
|
+
|
|
245
|
+
---
|
|
246
|
+
|
|
247
|
+
## Motion & effects
|
|
248
|
+
|
|
249
|
+
- Hover = lift into the shadow: `hover:-translate-y-0.5` with the offset shadow growing (`4px → 6px`). Tactile, stamped.
|
|
250
|
+
- Fast, snappy transitions (`transition-transform duration-100`). No slow fades.
|
|
251
|
+
- No soft/blurred shadows, no gradients on UI chrome, no glass blur.
|
|
252
|
+
- Gradients only inside product cover artwork, never on the UI itself.
|
|
253
|
+
|
|
254
|
+
---
|
|
255
|
+
|
|
256
|
+
## Anti-patterns
|
|
257
|
+
|
|
258
|
+
| Avoid | Why |
|
|
259
|
+
|-------|-----|
|
|
260
|
+
| Soft blurred shadows (`shadow-lg`, `shadow-xl`) | The look is hard offset `Npx Npx 0 #000` |
|
|
261
|
+
| Thin `1px` gray borders on light cards | Light cards use thick `2-4px` black borders |
|
|
262
|
+
| Muted / pastel-only palette | Gumroad is saturated and loud (yellow + pink) |
|
|
263
|
+
| Serif type | All bold geometric sans |
|
|
264
|
+
| Gradients on buttons / backgrounds | Keep UI flat; gradients live in cover art only |
|
|
265
|
+
| Light weights for headings | Prefer `font-bold` everywhere |
|
|
266
|
+
| Pink as a huge background fill | Pink is accents/tags/CTAs; yellow is the big surface |
|
|
267
|
+
| Over-rounded `rounded-2xl` cards | Cards are square-ish; only buttons/nav are full pills |
|
|
268
|
+
|
|
269
|
+
---
|
|
270
|
+
|
|
271
|
+
## Project overrides
|
|
272
|
+
|
|
273
|
+
If the repo defines `.agents/styles/gumroad.md` or `.agents/styles/gumroad-theme.md`, prefer those tokens and components over this portable spec.
|
|
@@ -0,0 +1,355 @@
|
|
|
1
|
+
# Linear Style
|
|
2
|
+
|
|
3
|
+
Linear's app UI. Near-black canvas, dense aligned navigation, indigo accent, Inter Display headings. Quiet chrome, line-defined structure, content-first hierarchy.
|
|
4
|
+
|
|
5
|
+
**Reference vibe:** Linear desktop app (inbox, issue view, sidebar). See `linear.app/now/how-we-redesigned-the-linear-ui`.
|
|
6
|
+
|
|
7
|
+
---
|
|
8
|
+
|
|
9
|
+
## Core vibe
|
|
10
|
+
|
|
11
|
+
- **Product UI, not marketing.** This is an app shell aesthetic: sidebar, panes, lists, properties. Use it for dashboards and tools, not hero landing pages.
|
|
12
|
+
- **Quiet chrome.** Reduce visual noise. Navigation recedes; content leads. Neutral, timeless, minimal blue tint in the grays.
|
|
13
|
+
- **Line over depth.** 1px low-contrast borders separate panes. No shadows on structure (one soft shadow only on floating menus/popovers).
|
|
14
|
+
- **Dense and aligned.** Compact rows, tight vertical rhythm. Labels, icons, and buttons align both vertically and horizontally.
|
|
15
|
+
- **Indigo accent, used sparingly.** Linear's signature `#5e6ad2` for active state, links, focus. 90% of the UI stays neutral gray.
|
|
16
|
+
- **Inter Display for headings, Inter for body.** Display adds expressiveness on titles; regular Inter keeps prose readable.
|
|
17
|
+
- **Soft small radius.** `rounded-md` (6px) on rows, buttons, inputs. Never sharp `0`, never `rounded-xl+`.
|
|
18
|
+
- **Status by glyph.** Colored circle/icon glyphs carry meaning (todo, in-progress, done, urgent), not colored text or fills.
|
|
19
|
+
|
|
20
|
+
---
|
|
21
|
+
|
|
22
|
+
## Color
|
|
23
|
+
|
|
24
|
+
Portable palette. LCH-derived neutrals with a faint cool tint. Map to project tokens when available.
|
|
25
|
+
|
|
26
|
+
| Role | Hex | CSS var (suggested) | Usage |
|
|
27
|
+
|------|-----|---------------------|-------|
|
|
28
|
+
| Canvas | `#08090a` | `--ln-bg` | App background, main pane |
|
|
29
|
+
| Surface | `#0f1011` | `--ln-surface` | Sidebar, secondary panes |
|
|
30
|
+
| Surface raised | `#1a1b1e` | `--ln-surface-raised` | Hover rows, selected items, inputs |
|
|
31
|
+
| Popover | `#1c1d1f` | `--ln-popover` | Floating menus, dropdowns, tooltips |
|
|
32
|
+
| Ink | `#f7f8f8` | `--ln-fg` | Headings, primary text, active labels |
|
|
33
|
+
| Muted ink | `#8a8f98` | `--ln-muted-fg` | Secondary text, inactive nav, metadata |
|
|
34
|
+
| Subtle ink | `#62666d` | `--ln-subtle-fg` | Timestamps, placeholders, faint labels |
|
|
35
|
+
| Border | `#1f2023` | `--ln-border` | Pane dividers, row separators |
|
|
36
|
+
| Border strong | `#2c2e33` | `--ln-border-strong` | Hover/active borders, input focus ring base |
|
|
37
|
+
| Accent | `#5e6ad2` | `--ln-accent` | Active state, links, selection, focus |
|
|
38
|
+
| Accent hover | `#6e79de` | `--ln-accent-hover` | Accent hover |
|
|
39
|
+
| Todo | `#e2a336` | `--ln-todo` | Yellow status glyph |
|
|
40
|
+
| In progress | `#f2994a` | `--ln-progress` | Orange status glyph (partial ring) |
|
|
41
|
+
| Done | `#5e6ad2` | `--ln-done` | Filled indigo check |
|
|
42
|
+
| Urgent | `#eb5757` | `--ln-urgent` | Red SLA / urgent glyph |
|
|
43
|
+
| Success | `#4cb782` | `--ln-success` | Positive state |
|
|
44
|
+
|
|
45
|
+
### Tailwind mapping (when no project tokens)
|
|
46
|
+
|
|
47
|
+
```css
|
|
48
|
+
:root {
|
|
49
|
+
--ln-bg: #08090a;
|
|
50
|
+
--ln-surface: #0f1011;
|
|
51
|
+
--ln-surface-raised: #1a1b1e;
|
|
52
|
+
--ln-fg: #f7f8f8;
|
|
53
|
+
--ln-muted-fg: #8a8f98;
|
|
54
|
+
--ln-border: #1f2023;
|
|
55
|
+
--ln-accent: #5e6ad2;
|
|
56
|
+
}
|
|
57
|
+
```
|
|
58
|
+
|
|
59
|
+
| Tailwind | Value |
|
|
60
|
+
|----------|-------|
|
|
61
|
+
| `bg-[#08090a]` | Canvas |
|
|
62
|
+
| `bg-[#0f1011]` | Surface (sidebar) |
|
|
63
|
+
| `bg-[#1a1b1e]` | Hover / selected row |
|
|
64
|
+
| `text-[#f7f8f8]` | Primary |
|
|
65
|
+
| `text-[#8a8f98]` | Muted |
|
|
66
|
+
| `border-[#1f2023]` | Structure |
|
|
67
|
+
| `text-[#5e6ad2]` | Accent |
|
|
68
|
+
|
|
69
|
+
**Rule:** Keep the surface within a 2-3 step gray range. Accent and status colors are glyph-sized only - never large fills.
|
|
70
|
+
|
|
71
|
+
---
|
|
72
|
+
|
|
73
|
+
## Typography
|
|
74
|
+
|
|
75
|
+
### Font stacks
|
|
76
|
+
|
|
77
|
+
| Role | Stack |
|
|
78
|
+
|------|-------|
|
|
79
|
+
| Display (headings) | `Inter Display, Inter, ui-sans-serif, system-ui, sans-serif` |
|
|
80
|
+
| Body / UI | `Inter, ui-sans-serif, system-ui, sans-serif` |
|
|
81
|
+
| Mono (IDs, code) | `Berkeley Mono, ui-monospace, SFMono-Regular, Menlo, monospace` |
|
|
82
|
+
|
|
83
|
+
Load Inter via `@fontsource/inter` or `next/font`. Inter Display is the optical "display" cut for large sizes; fall back to Inter if unavailable.
|
|
84
|
+
|
|
85
|
+
### Scale
|
|
86
|
+
|
|
87
|
+
| Level | Font | Pattern |
|
|
88
|
+
|-------|------|---------|
|
|
89
|
+
| Issue / page title | Display | `text-2xl md:text-3xl font-semibold tracking-[-0.01em] text-[#f7f8f8]` |
|
|
90
|
+
| Pane heading (Inbox) | Display | `text-base font-semibold text-[#f7f8f8]` |
|
|
91
|
+
| Section label | Body | `text-xs font-medium text-[#8a8f98]` (e.g. Workspace, Favorites) |
|
|
92
|
+
| Row title | Body | `text-sm font-medium text-[#f7f8f8]` |
|
|
93
|
+
| Row subtitle / meta | Body | `text-[13px] text-[#8a8f98]` |
|
|
94
|
+
| Body prose | Body | `text-sm md:text-[15px] leading-relaxed text-[#d0d2d6]` |
|
|
95
|
+
| Timestamp / ID | Body or Mono | `text-xs text-[#62666d]` |
|
|
96
|
+
|
|
97
|
+
### Section labels
|
|
98
|
+
|
|
99
|
+
Small, medium weight, muted. NOT uppercase, NOT letter-spaced (unlike Vercel style). Examples: `Workspace`, `Favorites`, `Your teams`, `Properties`, `Labels`.
|
|
100
|
+
|
|
101
|
+
```tsx
|
|
102
|
+
<p className="px-2 text-xs font-medium text-[#8a8f98]">Workspace</p>
|
|
103
|
+
```
|
|
104
|
+
|
|
105
|
+
---
|
|
106
|
+
|
|
107
|
+
## Layout tokens
|
|
108
|
+
|
|
109
|
+
| Token | Value |
|
|
110
|
+
|-------|-------|
|
|
111
|
+
| `LN_SIDEBAR` | `w-56 shrink-0 bg-[#0f1011] border-r border-[#1f2023]` |
|
|
112
|
+
| `LN_LIST` | `w-[360px] shrink-0 border-r border-[#1f2023]` |
|
|
113
|
+
| `LN_MAIN` | `flex-1 min-w-0` |
|
|
114
|
+
| `LN_PROPS` | `w-64 shrink-0 border-l border-[#1f2023] p-4` |
|
|
115
|
+
| `LN_ROW` | `flex items-center gap-2.5 rounded-md px-2 py-1.5` |
|
|
116
|
+
| `LN_CONTENT` | `mx-auto w-full max-w-3xl px-6 md:px-10 py-8` |
|
|
117
|
+
|
|
118
|
+
### App shell (Linear's core layout)
|
|
119
|
+
|
|
120
|
+
Two or three panes: sidebar + (list) + main, optional right properties rail.
|
|
121
|
+
|
|
122
|
+
```
|
|
123
|
+
+--------+------------------+---------------------------+--------+
|
|
124
|
+
| side | list / inbox | main (issue / content) | props |
|
|
125
|
+
| bar | rows w/ glyphs | title + body + activity | rail |
|
|
126
|
+
| w-56 | w-[360px] | flex-1 | w-64 |
|
|
127
|
+
+--------+------------------+---------------------------+--------+
|
|
128
|
+
```
|
|
129
|
+
|
|
130
|
+
```tsx
|
|
131
|
+
<div className="flex h-screen bg-[#08090a] text-[#f7f8f8]">
|
|
132
|
+
<aside className="w-56 shrink-0 border-r border-[#1f2023] bg-[#0f1011] p-2">...</aside>
|
|
133
|
+
<section className="w-[360px] shrink-0 border-r border-[#1f2023]">...</section>
|
|
134
|
+
<main className="flex-1 min-w-0">...</main>
|
|
135
|
+
<aside className="w-64 shrink-0 border-l border-[#1f2023] p-4">...</aside>
|
|
136
|
+
</div>
|
|
137
|
+
```
|
|
138
|
+
|
|
139
|
+
### Breadcrumb header
|
|
140
|
+
|
|
141
|
+
Top of the main pane. Icon + segment, `/` or `chevron` between, muted until the leaf.
|
|
142
|
+
|
|
143
|
+
```tsx
|
|
144
|
+
<header className="flex items-center gap-1.5 border-b border-[#1f2023] px-4 py-2.5 text-sm">
|
|
145
|
+
<span className="text-[#8a8f98]">Product</span>
|
|
146
|
+
<span className="text-[#62666d]">/</span>
|
|
147
|
+
<span className="text-[#8a8f98]">Insights</span>
|
|
148
|
+
<span className="text-[#62666d]">/</span>
|
|
149
|
+
<span className="text-[#f7f8f8]">LIN-1305</span>
|
|
150
|
+
</header>
|
|
151
|
+
```
|
|
152
|
+
|
|
153
|
+
---
|
|
154
|
+
|
|
155
|
+
## Borders & radius
|
|
156
|
+
|
|
157
|
+
| Context | Radius | Border |
|
|
158
|
+
|---------|--------|--------|
|
|
159
|
+
| Panes (sidebar, list, rail) | n/a | `border-[#1f2023]` dividers only |
|
|
160
|
+
| Sidebar / list rows | `rounded-md` (6px) | none; selection = `bg-[#1a1b1e]` |
|
|
161
|
+
| Buttons, badges, inputs | `rounded-md` (6px) | `border-[#1f2023]` or borderless |
|
|
162
|
+
| Avatars, status icons | `rounded-full` | none |
|
|
163
|
+
| Popovers / menus | `rounded-lg` (8px) | `border-[#2c2e33]` + soft shadow |
|
|
164
|
+
|
|
165
|
+
Dividers: `border-b border-[#1f2023]`, full width inside the pane. Rows are separated by selection bg, not by per-row borders.
|
|
166
|
+
|
|
167
|
+
---
|
|
168
|
+
|
|
169
|
+
## Component patterns
|
|
170
|
+
|
|
171
|
+
### Sidebar nav item
|
|
172
|
+
|
|
173
|
+
Icon + label. Inactive muted, active = raised bg + white text. No left accent bar.
|
|
174
|
+
|
|
175
|
+
```tsx
|
|
176
|
+
<a className={cn(
|
|
177
|
+
"flex items-center gap-2.5 rounded-md px-2 py-1.5 text-sm",
|
|
178
|
+
active ? "bg-[#1a1b1e] text-[#f7f8f8]" : "text-[#8a8f98] hover:bg-[#1a1b1e] hover:text-[#f7f8f8]"
|
|
179
|
+
)}>
|
|
180
|
+
<Icon className="size-4 shrink-0" />
|
|
181
|
+
<span className="truncate">Inbox</span>
|
|
182
|
+
</a>
|
|
183
|
+
```
|
|
184
|
+
|
|
185
|
+
### Status glyph
|
|
186
|
+
|
|
187
|
+
Colored ring/circle, no fill text. The glyph is the only color in the row.
|
|
188
|
+
|
|
189
|
+
```tsx
|
|
190
|
+
// Todo: hollow yellow circle · In progress: partial orange ring · Done: filled indigo check · Urgent: red square
|
|
191
|
+
<span className="grid size-4 place-items-center rounded-full border-2 border-[#e2a336]" />
|
|
192
|
+
<CheckCircle className="size-4 text-[#5e6ad2]" />
|
|
193
|
+
```
|
|
194
|
+
|
|
195
|
+
### Inbox / list row
|
|
196
|
+
|
|
197
|
+
Avatar or glyph left, two-line title + subtitle, status + timestamp right. Selected row gets raised bg.
|
|
198
|
+
|
|
199
|
+
```tsx
|
|
200
|
+
<a className={cn(
|
|
201
|
+
"flex items-center gap-3 rounded-md px-3 py-2.5",
|
|
202
|
+
selected ? "bg-[#1a1b1e]" : "hover:bg-[#1a1b1e]/60"
|
|
203
|
+
)}>
|
|
204
|
+
<img className="size-7 shrink-0 rounded-full" src={avatar} />
|
|
205
|
+
<div className="min-w-0 flex-1">
|
|
206
|
+
<p className="truncate text-sm font-medium text-[#f7f8f8]">LIN-13055 Add source to insights</p>
|
|
207
|
+
<p className="truncate text-[13px] text-[#8a8f98]">nan mentioned you</p>
|
|
208
|
+
</div>
|
|
209
|
+
<div className="flex items-center gap-2 text-xs text-[#62666d]">
|
|
210
|
+
<StatusGlyph />
|
|
211
|
+
<span>2d</span>
|
|
212
|
+
</div>
|
|
213
|
+
</a>
|
|
214
|
+
```
|
|
215
|
+
|
|
216
|
+
### Issue title block
|
|
217
|
+
|
|
218
|
+
Display heading + sub-issue context line.
|
|
219
|
+
|
|
220
|
+
```tsx
|
|
221
|
+
<div className="mb-6">
|
|
222
|
+
<h1 className="text-2xl font-semibold tracking-[-0.01em] text-[#f7f8f8] md:text-3xl">Update copy</h1>
|
|
223
|
+
<p className="mt-2 flex items-center gap-1.5 text-sm text-[#8a8f98]">
|
|
224
|
+
Sub-issue of <CheckCircle className="size-3.5 text-[#5e6ad2]" />
|
|
225
|
+
<span className="text-[#f7f8f8]">LIN-19734 Update welcome and log in screens</span>
|
|
226
|
+
</p>
|
|
227
|
+
</div>
|
|
228
|
+
```
|
|
229
|
+
|
|
230
|
+
### Properties rail row
|
|
231
|
+
|
|
232
|
+
Label-less stacked rows or icon + value. Muted label, white value, click to edit.
|
|
233
|
+
|
|
234
|
+
```tsx
|
|
235
|
+
<div className="space-y-1">
|
|
236
|
+
<p className="text-xs font-medium text-[#8a8f98]">Properties</p>
|
|
237
|
+
<button className="flex w-full items-center gap-2 rounded-md px-2 py-1.5 text-sm text-[#f7f8f8] hover:bg-[#1a1b1e]">
|
|
238
|
+
<CheckCircle className="size-4 text-[#5e6ad2]" /> Done
|
|
239
|
+
</button>
|
|
240
|
+
<button className="flex w-full items-center gap-2 rounded-md px-2 py-1.5 text-sm text-[#8a8f98] hover:bg-[#1a1b1e]">
|
|
241
|
+
<CircleDashed className="size-4" /> Set priority
|
|
242
|
+
</button>
|
|
243
|
+
</div>
|
|
244
|
+
```
|
|
245
|
+
|
|
246
|
+
### Label / badge chip
|
|
247
|
+
|
|
248
|
+
Small, muted, dot or icon + text. `rounded-md`, faint border or transparent.
|
|
249
|
+
|
|
250
|
+
```tsx
|
|
251
|
+
<span className="inline-flex items-center gap-1.5 rounded-md border border-[#1f2023] px-2 py-0.5 text-xs text-[#8a8f98]">
|
|
252
|
+
<span className="size-2 rounded-full bg-[#5e6ad2]" /> UI Refresh
|
|
253
|
+
</span>
|
|
254
|
+
```
|
|
255
|
+
|
|
256
|
+
### Buttons
|
|
257
|
+
|
|
258
|
+
| Variant | Classes |
|
|
259
|
+
|---------|---------|
|
|
260
|
+
| Primary | `rounded-md bg-[#5e6ad2] px-3 py-1.5 text-sm font-medium text-white hover:bg-[#6e79de]` |
|
|
261
|
+
| Secondary | `rounded-md border border-[#2c2e33] bg-transparent px-3 py-1.5 text-sm text-[#f7f8f8] hover:bg-[#1a1b1e]` |
|
|
262
|
+
| Ghost / toolbar | `rounded-md px-2 py-1.5 text-sm text-[#8a8f98] hover:bg-[#1a1b1e] hover:text-[#f7f8f8]` |
|
|
263
|
+
| Link | `text-[#5e6ad2] hover:underline` |
|
|
264
|
+
|
|
265
|
+
### Input
|
|
266
|
+
|
|
267
|
+
```tsx
|
|
268
|
+
<input
|
|
269
|
+
className="w-full rounded-md border border-[#1f2023] bg-[#1a1b1e] px-3 py-1.5 text-sm text-[#f7f8f8] placeholder:text-[#62666d] focus:border-[#5e6ad2] focus:outline-none"
|
|
270
|
+
placeholder="Add description..."
|
|
271
|
+
/>
|
|
272
|
+
```
|
|
273
|
+
|
|
274
|
+
### Popover / command menu
|
|
275
|
+
|
|
276
|
+
Floating surface gets the one allowed shadow.
|
|
277
|
+
|
|
278
|
+
```tsx
|
|
279
|
+
<div className="rounded-lg border border-[#2c2e33] bg-[#1c1d1f] p-1 shadow-[0_8px_24px_rgba(0,0,0,0.5)]">
|
|
280
|
+
{items.map(...)}
|
|
281
|
+
</div>
|
|
282
|
+
```
|
|
283
|
+
|
|
284
|
+
### Avatar
|
|
285
|
+
|
|
286
|
+
```tsx
|
|
287
|
+
<img className="size-6 rounded-full ring-1 ring-[#1f2023]" src={src} />
|
|
288
|
+
// stacked: -ml-1.5 ring-2 ring-[#08090a]
|
|
289
|
+
```
|
|
290
|
+
|
|
291
|
+
---
|
|
292
|
+
|
|
293
|
+
## Charts (app data viz)
|
|
294
|
+
|
|
295
|
+
Dashboards and insights panes use charts that stay as quiet as the rest of the chrome:
|
|
296
|
+
|
|
297
|
+
- Series in the neutral grays: `#8a8f98`, `#62666d`, `#2c2e33`, with **one** indigo accent `#5e6ad2` for the highlighted/primary series. Status colors (`#e2a336`, `#f2994a`, `#eb5757`, `#4cb782`) only when the chart literally encodes those states.
|
|
298
|
+
- **Small-radius bars** (`borderRadius: 4`), flat fills. No gradients, no glow.
|
|
299
|
+
- Background = pane surface (`#08090a` / `#0f1011`); gridlines `#1f2023`; axis text `Inter`, muted `#8a8f98`.
|
|
300
|
+
- Tooltip: popover surface `#1c1d1f`, border `#2c2e33`, ink `#f7f8f8`, `8px` corners, the one allowed soft shadow.
|
|
301
|
+
- Keep legends and labels in `Inter` sentence-case (not uppercase), matching section labels.
|
|
302
|
+
|
|
303
|
+
```js
|
|
304
|
+
const ACCENT="#5e6ad2", S2="#8a8f98", S3="#62666d", S4="#2c2e33", GRID="#1f2023";
|
|
305
|
+
Chart.defaults.font.family = "Inter, system-ui, sans-serif";
|
|
306
|
+
Chart.defaults.color = "#8a8f98";
|
|
307
|
+
// bars: backgroundColor:[S3, ACCENT], borderRadius:4
|
|
308
|
+
// grid: { color: GRID }
|
|
309
|
+
// tooltip: { backgroundColor:"#1c1d1f", borderColor:"#2c2e33", borderWidth:1, cornerRadius:8 }
|
|
310
|
+
```
|
|
311
|
+
|
|
312
|
+
---
|
|
313
|
+
|
|
314
|
+
## Motion & effects
|
|
315
|
+
|
|
316
|
+
- **Quiet.** Transitions are fast and subtle: `transition-colors duration-100`.
|
|
317
|
+
- Hover = bg shift to `#1a1b1e` and/or text muted to white. No scale, no lift on rows.
|
|
318
|
+
- One soft shadow allowed: floating menus/popovers only (`0 8px 24px rgba(0,0,0,.5)`).
|
|
319
|
+
- Focus ring uses accent: `focus:border-[#5e6ad2]` or `focus-visible:ring-1 ring-[#5e6ad2]`.
|
|
320
|
+
- No gradients, no glow, no glass blur on structure.
|
|
321
|
+
|
|
322
|
+
---
|
|
323
|
+
|
|
324
|
+
## When to use
|
|
325
|
+
|
|
326
|
+
| Surface | Fit |
|
|
327
|
+
|---------|-----|
|
|
328
|
+
| Issue tracker, inbox, dashboard, settings, admin panel | Strong fit |
|
|
329
|
+
| Tool with sidebar + list + detail panes | Strong fit |
|
|
330
|
+
| Marketing landing / hero page | Poor fit - use `grid` or `vercel-simple` |
|
|
331
|
+
| Data calculator / index of tools | Use `vercel-simple` (mono + sharp) |
|
|
332
|
+
|
|
333
|
+
Linear style is for **product app shells**. If the request is a marketing page, redirect to another style.
|
|
334
|
+
|
|
335
|
+
---
|
|
336
|
+
|
|
337
|
+
## Anti-patterns
|
|
338
|
+
|
|
339
|
+
| Avoid | Why |
|
|
340
|
+
|-------|-----|
|
|
341
|
+
| Sharp `rounded-none` rows/buttons | Linear is soft 6px, not Vercel-sharp |
|
|
342
|
+
| `rounded-xl`, `rounded-2xl`, pills on rows | Too soft; breaks the dense app feel |
|
|
343
|
+
| Uppercase letter-spaced section labels | Linear labels are sentence-case, medium weight |
|
|
344
|
+
| Large accent or status color fills | Color lives in glyphs and active state only |
|
|
345
|
+
| Shadows on cards, panes, rows | Structure is line-defined; shadow is popover-only |
|
|
346
|
+
| Per-row 1px borders in lists | Use selection bg + spacing, not borders |
|
|
347
|
+
| High-contrast pure `#000` / `#fff` | Use `#08090a` canvas and `#f7f8f8` ink |
|
|
348
|
+
| Monospace as the primary UI font | Inter is primary; mono only for IDs/code |
|
|
349
|
+
| Gradient or photographic backgrounds | Keep flat neutral surfaces |
|
|
350
|
+
|
|
351
|
+
---
|
|
352
|
+
|
|
353
|
+
## Project overrides
|
|
354
|
+
|
|
355
|
+
If the repo defines `.agents/styles/linear.md` or `.agents/styles/linear-theme.md`, prefer those tokens and components over this portable spec.
|