savant-code 0.0.21 → 0.0.23

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (79) hide show
  1. package/README.md +16 -8
  2. package/launcher.js +192 -5
  3. package/package.json +3 -2
  4. package/savant-design-systems/SKILL.md +12 -0
  5. package/savant-design-systems/manifest.json +2541 -0
  6. package/savant-design-systems/resources/airbnb-design-analysis.json +983 -0
  7. package/savant-design-systems/resources/airtable-design-analysis.json +931 -0
  8. package/savant-design-systems/resources/apple-design-analysis.json +920 -0
  9. package/savant-design-systems/resources/binance-design-analysis.json +1068 -0
  10. package/savant-design-systems/resources/bmw-design-analysis.json +912 -0
  11. package/savant-design-systems/resources/bmw-m-design-analysis.json +824 -0
  12. package/savant-design-systems/resources/bugatti-design-analysis.json +746 -0
  13. package/savant-design-systems/resources/cal-com-design-analysis.json +913 -0
  14. package/savant-design-systems/resources/claude-design-analysis.json +1007 -0
  15. package/savant-design-systems/resources/clay-design-analysis.json +919 -0
  16. package/savant-design-systems/resources/clickhouse-design-analysis.json +926 -0
  17. package/savant-design-systems/resources/cohere-design-analysis.json +725 -0
  18. package/savant-design-systems/resources/coinbase-design-analysis.json +998 -0
  19. package/savant-design-systems/resources/composio-design-analysis.json +851 -0
  20. package/savant-design-systems/resources/cursor-design-analysis.json +934 -0
  21. package/savant-design-systems/resources/dell-1996-inspired.json +1042 -0
  22. package/savant-design-systems/resources/elevenlabs.json +551 -0
  23. package/savant-design-systems/resources/expo-design-analysis.json +879 -0
  24. package/savant-design-systems/resources/ferrari-design-analysis.json +874 -0
  25. package/savant-design-systems/resources/figma-design-analysis.json +928 -0
  26. package/savant-design-systems/resources/framer-design-analysis.json +891 -0
  27. package/savant-design-systems/resources/hashicorp-design-analysis.json +909 -0
  28. package/savant-design-systems/resources/hp-design-analysis.json +1077 -0
  29. package/savant-design-systems/resources/ibm-design-analysis.json +881 -0
  30. package/savant-design-systems/resources/intercom-design-analysis.json +876 -0
  31. package/savant-design-systems/resources/kraken.json +172 -0
  32. package/savant-design-systems/resources/lamborghini.json +335 -0
  33. package/savant-design-systems/resources/linear-design-analysis.json +890 -0
  34. package/savant-design-systems/resources/lovable.json +345 -0
  35. package/savant-design-systems/resources/mastercard.json +412 -0
  36. package/savant-design-systems/resources/meta-design-analysis.json +1121 -0
  37. package/savant-design-systems/resources/minimax-design-analysis.json +1220 -0
  38. package/savant-design-systems/resources/mintlify-design-analysis.json +1418 -0
  39. package/savant-design-systems/resources/miro-design-analysis.json +1364 -0
  40. package/savant-design-systems/resources/mistral-ai-design-analysis.json +1286 -0
  41. package/savant-design-systems/resources/mongodb-design-analysis.json +1276 -0
  42. package/savant-design-systems/resources/nike-design-analysis.json +938 -0
  43. package/savant-design-systems/resources/nintendo-com-2001-analysis.json +1082 -0
  44. package/savant-design-systems/resources/notion-design-analysis.json +1368 -0
  45. package/savant-design-systems/resources/nvidia-design-analysis.json +1023 -0
  46. package/savant-design-systems/resources/ollama-design-analysis.json +863 -0
  47. package/savant-design-systems/resources/opencode-design-analysis.json +806 -0
  48. package/savant-design-systems/resources/pinterest-design-analysis.json +953 -0
  49. package/savant-design-systems/resources/playstation-design-analysis.json +1053 -0
  50. package/savant-design-systems/resources/posthog-design-analysis.json +1146 -0
  51. package/savant-design-systems/resources/raycast.json +716 -0
  52. package/savant-design-systems/resources/renault-design-analysis.json +916 -0
  53. package/savant-design-systems/resources/replicate-design-analysis.json +986 -0
  54. package/savant-design-systems/resources/resend-design-analysis.json +942 -0
  55. package/savant-design-systems/resources/revolut-design-analysis.json +1008 -0
  56. package/savant-design-systems/resources/runwayml.json +291 -0
  57. package/savant-design-systems/resources/sanity.json +404 -0
  58. package/savant-design-systems/resources/sentri-inspired-design-analysis.json +953 -0
  59. package/savant-design-systems/resources/shopifi-inspired-design-analysis.json +921 -0
  60. package/savant-design-systems/resources/slacc-inspired-design-analysis.json +799 -0
  61. package/savant-design-systems/resources/spacex-inspired-design-analysis.json +598 -0
  62. package/savant-design-systems/resources/spotify.json +293 -0
  63. package/savant-design-systems/resources/starbucks.json +627 -0
  64. package/savant-design-systems/resources/stripi-inspired-design-analysis.json +805 -0
  65. package/savant-design-systems/resources/supabase.json +509 -0
  66. package/savant-design-systems/resources/superhumon-inspired-design-analysis.json +740 -0
  67. package/savant-design-systems/resources/tesla.json +333 -0
  68. package/savant-design-systems/resources/theverge.json +386 -0
  69. package/savant-design-systems/resources/together-ai-inspired-design-analysis.json +1099 -0
  70. package/savant-design-systems/resources/uber-inspired-design-analysis.json +1067 -0
  71. package/savant-design-systems/resources/vercel-inspired-design-analysis.json +1261 -0
  72. package/savant-design-systems/resources/vodafone-inspired-design-analysis.json +912 -0
  73. package/savant-design-systems/resources/voltagent-inspired-design-analysis.json +929 -0
  74. package/savant-design-systems/resources/warp-inspired-design-analysis.json +946 -0
  75. package/savant-design-systems/resources/webflow-inspired-design-analysis.json +1033 -0
  76. package/savant-design-systems/resources/wired-inspired-design-analysis.json +877 -0
  77. package/savant-design-systems/resources/wise-inspired-design-analysis.json +916 -0
  78. package/savant-design-systems/resources/xai-inspired-design-analysis.json +820 -0
  79. package/savant-design-systems/resources/zapier-inspired-design-analysis.json +915 -0
@@ -0,0 +1,890 @@
1
+ {
2
+ "schemaVersion": "1",
3
+ "id": "linear-design-analysis",
4
+ "displayName": "Linear-design-analysis",
5
+ "description": "A near-black product-focused marketing canvas built around #010102 (the deepest dark surface of any tool in this collection), light gray text (#f7f8f8), and the signature Linear lavender-blue (#5e6ad2) used as the single chromatic accent. The system reads as software-craft documentation: dense, technical, and quietly luxurious. Display type is set in the Linear custom sans (SF Pro Display fallback) at 500–700 with measured negative tracking. Cards live as charcoal panels (#0f1011) with hairline borders. The accent lavender appears on the brand mark, focus rings, and a few intentional CTAs — never decoratively. Page rhythm leans on product UI screenshots framed in dark panels rather than atmospheric color.",
6
+ "source": "embedded",
7
+ "status": "curated-reference",
8
+ "targets": [
9
+ "terminal",
10
+ "react"
11
+ ],
12
+ "contentPath": "packages/design-systems/library/linear.app.design.md",
13
+ "sourceContentHash": "30bd30e72c48a16e4bdbd010f2d1c85fab657c6fae3cc85389399aab10f9cb5f",
14
+ "normalizedContentHash": "58fee554c2b6356e5539cf356d21db031fdcfb533b5be7e40fb036e0252ed09e",
15
+ "provenance": {
16
+ "sourceRepository": "VoltAgent/awesome-design-md",
17
+ "sourceRevision": "working-tree-curated-snapshot",
18
+ "sourcePath": "packages/design-systems/library/linear.app.design.md",
19
+ "license": "MIT"
20
+ },
21
+ "fonts": [
22
+ {
23
+ "family": "Linear Display",
24
+ "fallback": [
25
+ "system-ui",
26
+ "sans-serif"
27
+ ],
28
+ "redistributable": false
29
+ },
30
+ {
31
+ "family": "Linear Mono",
32
+ "fallback": [
33
+ "system-ui",
34
+ "sans-serif"
35
+ ],
36
+ "redistributable": false
37
+ },
38
+ {
39
+ "family": "Linear Text",
40
+ "fallback": [
41
+ "system-ui",
42
+ "sans-serif"
43
+ ],
44
+ "redistributable": false
45
+ }
46
+ ],
47
+ "tokens": {
48
+ "colors": {
49
+ "brand-secure": "#7a7fad",
50
+ "canvas": "#010102",
51
+ "hairline": "#23252a",
52
+ "hairline-strong": "#34343a",
53
+ "hairline-tertiary": "#3e3e44",
54
+ "ink": "#f7f8f8",
55
+ "ink-muted": "#d0d6e0",
56
+ "ink-subtle": "#8a8f98",
57
+ "ink-tertiary": "#62666d",
58
+ "inverse-canvas": "#ffffff",
59
+ "inverse-ink": "#000000",
60
+ "inverse-surface-1": "#f5f6f6",
61
+ "inverse-surface-2": "#f6f7f7",
62
+ "on-primary": "#ffffff",
63
+ "primary": "#5e6ad2",
64
+ "primary-focus": "#5e69d1",
65
+ "primary-hover": "#828fff",
66
+ "semantic-overlay": "#000000",
67
+ "semantic-success": "#27a644",
68
+ "surface-1": "#0f1011",
69
+ "surface-2": "#141516",
70
+ "surface-3": "#18191a",
71
+ "surface-4": "#191a1b"
72
+ },
73
+ "typography": {
74
+ "display-xl": {
75
+ "fontFamily": "Linear Display",
76
+ "fontSize": "80px",
77
+ "fontWeight": 600,
78
+ "letterSpacing": "-3.0px",
79
+ "lineHeight": 1.05
80
+ },
81
+ "display-lg": {
82
+ "fontFamily": "Linear Display",
83
+ "fontSize": "56px",
84
+ "fontWeight": 600,
85
+ "letterSpacing": "-1.8px",
86
+ "lineHeight": 1.1
87
+ },
88
+ "display-md": {
89
+ "fontFamily": "Linear Display",
90
+ "fontSize": "40px",
91
+ "fontWeight": 600,
92
+ "letterSpacing": "-1.0px",
93
+ "lineHeight": 1.15
94
+ },
95
+ "headline": {
96
+ "fontFamily": "Linear Display",
97
+ "fontSize": "28px",
98
+ "fontWeight": 600,
99
+ "letterSpacing": "-0.6px",
100
+ "lineHeight": 1.2
101
+ },
102
+ "card-title": {
103
+ "fontFamily": "Linear Display",
104
+ "fontSize": "22px",
105
+ "fontWeight": 500,
106
+ "letterSpacing": "-0.4px",
107
+ "lineHeight": 1.25
108
+ },
109
+ "subhead": {
110
+ "fontFamily": "Linear Display",
111
+ "fontSize": "20px",
112
+ "fontWeight": 400,
113
+ "letterSpacing": "-0.2px",
114
+ "lineHeight": 1.4
115
+ },
116
+ "body-lg": {
117
+ "fontFamily": "Linear Text",
118
+ "fontSize": "18px",
119
+ "fontWeight": 400,
120
+ "letterSpacing": "-0.1px",
121
+ "lineHeight": 1.5
122
+ },
123
+ "body": {
124
+ "fontFamily": "Linear Text",
125
+ "fontSize": "16px",
126
+ "fontWeight": 400,
127
+ "letterSpacing": "-0.05px",
128
+ "lineHeight": 1.5
129
+ },
130
+ "body-sm": {
131
+ "fontFamily": "Linear Text",
132
+ "fontSize": "14px",
133
+ "fontWeight": 400,
134
+ "letterSpacing": 0,
135
+ "lineHeight": 1.5
136
+ },
137
+ "caption": {
138
+ "fontFamily": "Linear Text",
139
+ "fontSize": "12px",
140
+ "fontWeight": 400,
141
+ "letterSpacing": 0,
142
+ "lineHeight": 1.4
143
+ },
144
+ "button": {
145
+ "fontFamily": "Linear Text",
146
+ "fontSize": "14px",
147
+ "fontWeight": 500,
148
+ "letterSpacing": 0,
149
+ "lineHeight": 1.2
150
+ },
151
+ "eyebrow": {
152
+ "fontFamily": "Linear Text",
153
+ "fontSize": "13px",
154
+ "fontWeight": 500,
155
+ "letterSpacing": "0.4px",
156
+ "lineHeight": 1.3
157
+ },
158
+ "mono": {
159
+ "fontFamily": "Linear Mono",
160
+ "fontSize": "13px",
161
+ "fontWeight": 400,
162
+ "letterSpacing": 0,
163
+ "lineHeight": 1.5
164
+ }
165
+ },
166
+ "spacing": {
167
+ "lg": "24px",
168
+ "md": "16px",
169
+ "section": "96px",
170
+ "sm": "12px",
171
+ "xl": "32px",
172
+ "xs": "8px",
173
+ "xxl": "48px",
174
+ "xxs": "4px"
175
+ },
176
+ "radius": {
177
+ "full": "9999px",
178
+ "lg": "12px",
179
+ "md": "8px",
180
+ "pill": "9999px",
181
+ "sm": "6px",
182
+ "xl": "16px",
183
+ "xs": "4px",
184
+ "xxl": "24px"
185
+ },
186
+ "components": {
187
+ "button-primary": {
188
+ "backgroundColor": "{colors.primary}",
189
+ "padding": "8px 14px",
190
+ "rounded": "{rounded.md}",
191
+ "textColor": "{colors.on-primary}",
192
+ "typography": "{typography.button}"
193
+ },
194
+ "button-primary-pressed": {
195
+ "backgroundColor": "{colors.primary-focus}",
196
+ "rounded": "{rounded.md}",
197
+ "textColor": "{colors.on-primary}",
198
+ "typography": "{typography.button}"
199
+ },
200
+ "button-primary-hover": {
201
+ "backgroundColor": "{colors.primary-hover}",
202
+ "rounded": "{rounded.md}",
203
+ "textColor": "{colors.on-primary}",
204
+ "typography": "{typography.button}"
205
+ },
206
+ "button-secondary": {
207
+ "backgroundColor": "{colors.surface-1}",
208
+ "padding": "8px 14px",
209
+ "rounded": "{rounded.md}",
210
+ "textColor": "{colors.ink}",
211
+ "typography": "{typography.button}"
212
+ },
213
+ "button-tertiary": {
214
+ "backgroundColor": "{colors.canvas}",
215
+ "padding": "8px 14px",
216
+ "rounded": "{rounded.md}",
217
+ "textColor": "{colors.ink}",
218
+ "typography": "{typography.button}"
219
+ },
220
+ "button-inverse": {
221
+ "backgroundColor": "{colors.inverse-canvas}",
222
+ "padding": "8px 14px",
223
+ "rounded": "{rounded.md}",
224
+ "textColor": "{colors.inverse-ink}",
225
+ "typography": "{typography.button}"
226
+ },
227
+ "pricing-card": {
228
+ "backgroundColor": "{colors.surface-1}",
229
+ "padding": "24px",
230
+ "rounded": "{rounded.lg}",
231
+ "textColor": "{colors.ink}",
232
+ "typography": "{typography.body}"
233
+ },
234
+ "pricing-card-featured": {
235
+ "backgroundColor": "{colors.surface-2}",
236
+ "padding": "24px",
237
+ "rounded": "{rounded.lg}",
238
+ "textColor": "{colors.ink}",
239
+ "typography": "{typography.body}"
240
+ },
241
+ "feature-card": {
242
+ "backgroundColor": "{colors.surface-1}",
243
+ "padding": "24px",
244
+ "rounded": "{rounded.lg}",
245
+ "textColor": "{colors.ink}",
246
+ "typography": "{typography.body}"
247
+ },
248
+ "product-screenshot-card": {
249
+ "backgroundColor": "{colors.surface-1}",
250
+ "padding": "24px",
251
+ "rounded": "{rounded.xl}",
252
+ "textColor": "{colors.ink}",
253
+ "typography": "{typography.body}"
254
+ },
255
+ "testimonial-card": {
256
+ "backgroundColor": "{colors.surface-1}",
257
+ "padding": "32px",
258
+ "rounded": "{rounded.lg}",
259
+ "textColor": "{colors.ink}",
260
+ "typography": "{typography.body-lg}"
261
+ },
262
+ "customer-logo-tile": {
263
+ "backgroundColor": "{colors.canvas}",
264
+ "padding": "16px",
265
+ "rounded": "{rounded.xs}",
266
+ "textColor": "{colors.ink-subtle}",
267
+ "typography": "{typography.caption}"
268
+ },
269
+ "text-input": {
270
+ "backgroundColor": "{colors.surface-1}",
271
+ "padding": "8px 12px",
272
+ "rounded": "{rounded.md}",
273
+ "textColor": "{colors.ink}",
274
+ "typography": "{typography.body}"
275
+ },
276
+ "text-input-focused": {
277
+ "backgroundColor": "{colors.surface-1}",
278
+ "padding": "8px 12px",
279
+ "rounded": "{rounded.md}",
280
+ "textColor": "{colors.ink}",
281
+ "typography": "{typography.body}"
282
+ },
283
+ "pricing-tab-default": {
284
+ "backgroundColor": "{colors.canvas}",
285
+ "padding": "6px 14px",
286
+ "rounded": "{rounded.pill}",
287
+ "textColor": "{colors.ink-subtle}",
288
+ "typography": "{typography.button}"
289
+ },
290
+ "pricing-tab-selected": {
291
+ "backgroundColor": "{colors.surface-2}",
292
+ "padding": "6px 14px",
293
+ "rounded": "{rounded.pill}",
294
+ "textColor": "{colors.ink}",
295
+ "typography": "{typography.button}"
296
+ },
297
+ "cta-banner": {
298
+ "backgroundColor": "{colors.surface-1}",
299
+ "padding": "48px",
300
+ "rounded": "{rounded.lg}",
301
+ "textColor": "{colors.ink}",
302
+ "typography": "{typography.headline}"
303
+ },
304
+ "changelog-row": {
305
+ "backgroundColor": "{colors.canvas}",
306
+ "padding": "24px 0",
307
+ "rounded": "{rounded.xs}",
308
+ "textColor": "{colors.ink}",
309
+ "typography": "{typography.body}"
310
+ },
311
+ "status-badge": {
312
+ "backgroundColor": "{colors.surface-2}",
313
+ "padding": "2px 8px",
314
+ "rounded": "{rounded.pill}",
315
+ "textColor": "{colors.ink-muted}",
316
+ "typography": "{typography.caption}"
317
+ },
318
+ "top-nav": {
319
+ "backgroundColor": "{colors.canvas}",
320
+ "height": "56px",
321
+ "rounded": "{rounded.xs}",
322
+ "textColor": "{colors.ink}",
323
+ "typography": "{typography.body-sm}"
324
+ },
325
+ "footer": {
326
+ "backgroundColor": "{colors.canvas}",
327
+ "padding": "64px 32px",
328
+ "rounded": "{rounded.xs}",
329
+ "textColor": "{colors.ink-subtle}",
330
+ "typography": "{typography.caption}"
331
+ }
332
+ },
333
+ "extensions": {
334
+ "description": "A near-black product-focused marketing canvas built around #010102 (the deepest dark surface of any tool in this collection), light gray text (#f7f8f8), and the signature Linear lavender-blue (#5e6ad2) used as the single chromatic accent. The system reads as software-craft documentation: dense, technical, and quietly luxurious. Display type is set in the Linear custom sans (SF Pro Display fallback) at 500–700 with measured negative tracking. Cards live as charcoal panels (#0f1011) with hairline borders. The accent lavender appears on the brand mark, focus rings, and a few intentional CTAs — never decoratively. Page rhythm leans on product UI screenshots framed in dark panels rather than atmospheric color.",
335
+ "name": "Linear-design-analysis",
336
+ "version": "alpha"
337
+ }
338
+ }
339
+ }
340
+
341
+ ---
342
+
343
+ ---
344
+ version: alpha
345
+ name: Linear-design-analysis
346
+ description: "A near-black product-focused marketing canvas built around #010102 (the deepest dark surface of any tool in this collection), light gray text (#f7f8f8), and the signature Linear lavender-blue (#5e6ad2) used as the single chromatic accent. The system reads as software-craft documentation: dense, technical, and quietly luxurious. Display type is set in the Linear custom sans (SF Pro Display fallback) at 500–700 with measured negative tracking. Cards live as charcoal panels (#0f1011) with hairline borders. The accent lavender appears on the brand mark, focus rings, and a few intentional CTAs — never decoratively. Page rhythm leans on product UI screenshots framed in dark panels rather than atmospheric color."
347
+
348
+ colors:
349
+ primary: "#5e6ad2"
350
+ on-primary: "#ffffff"
351
+ primary-hover: "#828fff"
352
+ primary-focus: "#5e69d1"
353
+ ink: "#f7f8f8"
354
+ ink-muted: "#d0d6e0"
355
+ ink-subtle: "#8a8f98"
356
+ ink-tertiary: "#62666d"
357
+ canvas: "#010102"
358
+ surface-1: "#0f1011"
359
+ surface-2: "#141516"
360
+ surface-3: "#18191a"
361
+ surface-4: "#191a1b"
362
+ hairline: "#23252a"
363
+ hairline-strong: "#34343a"
364
+ hairline-tertiary: "#3e3e44"
365
+ inverse-canvas: "#ffffff"
366
+ inverse-surface-1: "#f5f6f6"
367
+ inverse-surface-2: "#f6f7f7"
368
+ inverse-ink: "#000000"
369
+ brand-secure: "#7a7fad"
370
+ semantic-success: "#27a644"
371
+ semantic-overlay: "#000000"
372
+
373
+ typography:
374
+ display-xl:
375
+ fontFamily: Linear Display
376
+ fontSize: 80px
377
+ fontWeight: 600
378
+ lineHeight: 1.05
379
+ letterSpacing: -3.0px
380
+ display-lg:
381
+ fontFamily: Linear Display
382
+ fontSize: 56px
383
+ fontWeight: 600
384
+ lineHeight: 1.10
385
+ letterSpacing: -1.8px
386
+ display-md:
387
+ fontFamily: Linear Display
388
+ fontSize: 40px
389
+ fontWeight: 600
390
+ lineHeight: 1.15
391
+ letterSpacing: -1.0px
392
+ headline:
393
+ fontFamily: Linear Display
394
+ fontSize: 28px
395
+ fontWeight: 600
396
+ lineHeight: 1.20
397
+ letterSpacing: -0.6px
398
+ card-title:
399
+ fontFamily: Linear Display
400
+ fontSize: 22px
401
+ fontWeight: 500
402
+ lineHeight: 1.25
403
+ letterSpacing: -0.4px
404
+ subhead:
405
+ fontFamily: Linear Display
406
+ fontSize: 20px
407
+ fontWeight: 400
408
+ lineHeight: 1.40
409
+ letterSpacing: -0.2px
410
+ body-lg:
411
+ fontFamily: Linear Text
412
+ fontSize: 18px
413
+ fontWeight: 400
414
+ lineHeight: 1.50
415
+ letterSpacing: -0.1px
416
+ body:
417
+ fontFamily: Linear Text
418
+ fontSize: 16px
419
+ fontWeight: 400
420
+ lineHeight: 1.50
421
+ letterSpacing: -0.05px
422
+ body-sm:
423
+ fontFamily: Linear Text
424
+ fontSize: 14px
425
+ fontWeight: 400
426
+ lineHeight: 1.50
427
+ letterSpacing: 0
428
+ caption:
429
+ fontFamily: Linear Text
430
+ fontSize: 12px
431
+ fontWeight: 400
432
+ lineHeight: 1.40
433
+ letterSpacing: 0
434
+ button:
435
+ fontFamily: Linear Text
436
+ fontSize: 14px
437
+ fontWeight: 500
438
+ lineHeight: 1.20
439
+ letterSpacing: 0
440
+ eyebrow:
441
+ fontFamily: Linear Text
442
+ fontSize: 13px
443
+ fontWeight: 500
444
+ lineHeight: 1.30
445
+ letterSpacing: 0.4px
446
+ mono:
447
+ fontFamily: Linear Mono
448
+ fontSize: 13px
449
+ fontWeight: 400
450
+ lineHeight: 1.50
451
+ letterSpacing: 0
452
+
453
+ rounded:
454
+ xs: 4px
455
+ sm: 6px
456
+ md: 8px
457
+ lg: 12px
458
+ xl: 16px
459
+ xxl: 24px
460
+ pill: 9999px
461
+ full: 9999px
462
+
463
+ spacing:
464
+ xxs: 4px
465
+ xs: 8px
466
+ sm: 12px
467
+ md: 16px
468
+ lg: 24px
469
+ xl: 32px
470
+ xxl: 48px
471
+ section: 96px
472
+
473
+ components:
474
+ button-primary:
475
+ backgroundColor: "{colors.primary}"
476
+ textColor: "{colors.on-primary}"
477
+ typography: "{typography.button}"
478
+ rounded: "{rounded.md}"
479
+ padding: 8px 14px
480
+ button-primary-pressed:
481
+ backgroundColor: "{colors.primary-focus}"
482
+ textColor: "{colors.on-primary}"
483
+ typography: "{typography.button}"
484
+ rounded: "{rounded.md}"
485
+ button-primary-hover:
486
+ backgroundColor: "{colors.primary-hover}"
487
+ textColor: "{colors.on-primary}"
488
+ typography: "{typography.button}"
489
+ rounded: "{rounded.md}"
490
+ button-secondary:
491
+ backgroundColor: "{colors.surface-1}"
492
+ textColor: "{colors.ink}"
493
+ typography: "{typography.button}"
494
+ rounded: "{rounded.md}"
495
+ padding: 8px 14px
496
+ button-tertiary:
497
+ backgroundColor: "{colors.canvas}"
498
+ textColor: "{colors.ink}"
499
+ typography: "{typography.button}"
500
+ rounded: "{rounded.md}"
501
+ padding: 8px 14px
502
+ button-inverse:
503
+ backgroundColor: "{colors.inverse-canvas}"
504
+ textColor: "{colors.inverse-ink}"
505
+ typography: "{typography.button}"
506
+ rounded: "{rounded.md}"
507
+ padding: 8px 14px
508
+ pricing-card:
509
+ backgroundColor: "{colors.surface-1}"
510
+ textColor: "{colors.ink}"
511
+ typography: "{typography.body}"
512
+ rounded: "{rounded.lg}"
513
+ padding: 24px
514
+ pricing-card-featured:
515
+ backgroundColor: "{colors.surface-2}"
516
+ textColor: "{colors.ink}"
517
+ typography: "{typography.body}"
518
+ rounded: "{rounded.lg}"
519
+ padding: 24px
520
+ feature-card:
521
+ backgroundColor: "{colors.surface-1}"
522
+ textColor: "{colors.ink}"
523
+ typography: "{typography.body}"
524
+ rounded: "{rounded.lg}"
525
+ padding: 24px
526
+ product-screenshot-card:
527
+ backgroundColor: "{colors.surface-1}"
528
+ textColor: "{colors.ink}"
529
+ typography: "{typography.body}"
530
+ rounded: "{rounded.xl}"
531
+ padding: 24px
532
+ testimonial-card:
533
+ backgroundColor: "{colors.surface-1}"
534
+ textColor: "{colors.ink}"
535
+ typography: "{typography.body-lg}"
536
+ rounded: "{rounded.lg}"
537
+ padding: 32px
538
+ customer-logo-tile:
539
+ backgroundColor: "{colors.canvas}"
540
+ textColor: "{colors.ink-subtle}"
541
+ typography: "{typography.caption}"
542
+ rounded: "{rounded.xs}"
543
+ padding: 16px
544
+ text-input:
545
+ backgroundColor: "{colors.surface-1}"
546
+ textColor: "{colors.ink}"
547
+ typography: "{typography.body}"
548
+ rounded: "{rounded.md}"
549
+ padding: 8px 12px
550
+ text-input-focused:
551
+ backgroundColor: "{colors.surface-1}"
552
+ textColor: "{colors.ink}"
553
+ typography: "{typography.body}"
554
+ rounded: "{rounded.md}"
555
+ padding: 8px 12px
556
+ pricing-tab-default:
557
+ backgroundColor: "{colors.canvas}"
558
+ textColor: "{colors.ink-subtle}"
559
+ typography: "{typography.button}"
560
+ rounded: "{rounded.pill}"
561
+ padding: 6px 14px
562
+ pricing-tab-selected:
563
+ backgroundColor: "{colors.surface-2}"
564
+ textColor: "{colors.ink}"
565
+ typography: "{typography.button}"
566
+ rounded: "{rounded.pill}"
567
+ padding: 6px 14px
568
+ cta-banner:
569
+ backgroundColor: "{colors.surface-1}"
570
+ textColor: "{colors.ink}"
571
+ typography: "{typography.headline}"
572
+ rounded: "{rounded.lg}"
573
+ padding: 48px
574
+ changelog-row:
575
+ backgroundColor: "{colors.canvas}"
576
+ textColor: "{colors.ink}"
577
+ typography: "{typography.body}"
578
+ rounded: "{rounded.xs}"
579
+ padding: 24px 0
580
+ status-badge:
581
+ backgroundColor: "{colors.surface-2}"
582
+ textColor: "{colors.ink-muted}"
583
+ typography: "{typography.caption}"
584
+ rounded: "{rounded.pill}"
585
+ padding: 2px 8px
586
+ top-nav:
587
+ backgroundColor: "{colors.canvas}"
588
+ textColor: "{colors.ink}"
589
+ typography: "{typography.body-sm}"
590
+ rounded: "{rounded.xs}"
591
+ height: 56px
592
+ footer:
593
+ backgroundColor: "{colors.canvas}"
594
+ textColor: "{colors.ink-subtle}"
595
+ typography: "{typography.caption}"
596
+ rounded: "{rounded.xs}"
597
+ padding: 64px 32px
598
+ ---
599
+
600
+ ## Overview
601
+
602
+ Linear's marketing canvas is the deepest dark surface in this collection — `{colors.canvas}` is #010102, essentially pure black with a faint blue tint. On top sits a four-step surface ladder (`{colors.surface-1}` through `{colors.surface-4}`) for cards, panels, and lifted tiles, with hairline borders running from `{colors.hairline}` (#23252a) up through `{colors.hairline-strong}` and `{colors.hairline-tertiary}`. Light gray text (`{colors.ink}` #f7f8f8) carries the body and headlines.
603
+
604
+ The single chromatic accent is **Linear lavender-blue** `{colors.primary}` (#5e6ad2) — used on the brand mark, focus rings, and the primary CTA button. A lighter hover state (`{colors.primary-hover}` #828fff) and a focus-tinted variant (`{colors.primary-focus}` #5e69d1) extend the same hue. Linear avoids saturated greens, oranges, reds, etc. on the marketing canvas — the only semantic color is `{colors.semantic-success}` (#27a644) for status pills and the rare success indicator.
605
+
606
+ Display type runs Linear's custom sans (with `SF Pro Display` fallback) at weight 500–700 with negative letter-spacing scaling from -3.0px at 80px down to 0 at body. The body family is Linear's text cut, and a Linear Mono is reserved for code snippets in product screenshots.
607
+
608
+ The page rhythm is **dense product screenshots** — Linear's marketing leads with high-fidelity captures of the product UI (issue list, project view, dashboard) framed in `{colors.surface-1}` panels with `{rounded.xl}` 16px corners. The chrome is intentionally minimal so the app screenshots can do the heavy lifting.
609
+
610
+ **Key Characteristics:**
611
+ - **Dark-canvas marketing system** — `{colors.canvas}` (#010102) is the deepest dark in this collection.
612
+ - **Lavender-blue brand accent** (`{colors.primary}` #5e6ad2) — used scarcely on brand mark, focus, and the primary CTA.
613
+ - Four-step surface ladder (canvas → surface-1 → surface-2 → surface-3 → surface-4) carries hierarchy without shadow.
614
+ - Display tracking pulls aggressively negative (-3.0px at 80px); body holds at -0.05px.
615
+ - Cards use `{rounded.lg}` 12px corners with 1px hairline borders — never pill, rarely 16px.
616
+ - **Product UI screenshots** dominate the page. The marketing chrome is a dark frame for the app.
617
+ - No second chromatic color. No atmospheric gradients. No spotlight cards.
618
+
619
+ ## Colors
620
+
621
+ > Source pages: linear.app (home), /intake, /pricing, /contact/sales, /build.
622
+
623
+ ### Brand & Accent
624
+ - **Lavender-Blue** ({colors.primary}): The signature Linear accent — primary CTA, brand mark, link emphasis.
625
+ - **Lavender Hover** ({colors.primary-hover}): Lighter lavender (#828fff) — hovered state of the primary CTA.
626
+ - **Lavender Focus** ({colors.primary-focus}): Focus-ring tint (#5e69d1) — focused inputs, focused buttons.
627
+ - **Brand Secure** ({colors.brand-secure}): Muted lavender-gray (#7a7fad) — used in "Linear Security" surfaces.
628
+
629
+ ### Surface
630
+ - **Canvas** ({colors.canvas}): Default page background — #010102, near-pure black with a faint blue tint.
631
+ - **Surface 1** ({colors.surface-1}): One step above canvas — feature cards, pricing cards, product screenshot panels.
632
+ - **Surface 2** ({colors.surface-2}): Two steps above — featured pricing card, hovered cards.
633
+ - **Surface 3** ({colors.surface-3}): Three steps above — line-tertiary backgrounds, sub-nav.
634
+ - **Surface 4** ({colors.surface-4}): Four steps above — bg-level-3, deepest lifted surface.
635
+ - **Hairline** ({colors.hairline}): 1px borders on cards and dividers.
636
+ - **Hairline Strong** ({colors.hairline-strong}): Stronger 1px borders — input focus rings.
637
+ - **Hairline Tertiary** ({colors.hairline-tertiary}): Tertiary borders for nested surfaces.
638
+ - **Inverse Canvas** ({colors.inverse-canvas}): Pure white — surface of the inverse pill CTA on a small set of section openers.
639
+ - **Inverse Surface 1** ({colors.inverse-surface-1}): One step above inverse canvas.
640
+ - **Inverse Surface 2** ({colors.inverse-surface-2}): Two steps above inverse canvas.
641
+
642
+ ### Text
643
+ - **Ink** ({colors.ink}): All headlines and emphasized body type — light gray #f7f8f8.
644
+ - **Ink Muted** ({colors.ink-muted}): Secondary type at #d0d6e0 — meta info on hero panels.
645
+ - **Ink Subtle** ({colors.ink-subtle}): Tertiary type at #8a8f98 — deselected pricing tabs, footer columns.
646
+ - **Ink Tertiary** ({colors.ink-tertiary}): Quaternary at #62666d — disabled, footnotes.
647
+
648
+ ### Semantic
649
+ - **Success Green** ({colors.semantic-success}): Status pills, success indicators. The only semantic color on marketing.
650
+ - **Overlay** ({colors.semantic-overlay}): Pure black overlay scrim for modals.
651
+
652
+ ## Typography
653
+
654
+ ### Font Family
655
+
656
+ - **Linear Display** — Linear's custom display sans; fallback `SF Pro Display, -apple-system, system-ui, Segoe UI, Roboto`. Carries display-xl through subhead.
657
+ - **Linear Text** — Linear's custom text sans (a slightly different cut tuned for body sizes); same fallback stack. Carries body sizes, button labels, captions.
658
+ - **Linear Mono** — Linear's custom mono; fallback `ui-monospace, SF Mono, Menlo`. Used for code snippets in product screenshots and for status / ID tokens.
659
+
660
+ The marketing surface treats Display and Text as one continuous voice; the family change is silent.
661
+
662
+ ### Hierarchy
663
+
664
+ | Token | Size | Weight | Line Height | Letter Spacing | Use |
665
+ |---|---|---|---|---|---|
666
+ | `{typography.display-xl}` | 80px | 600 | 1.05 | -3.0px | Largest hero headline |
667
+ | `{typography.display-lg}` | 56px | 600 | 1.10 | -1.8px | Section opener headlines |
668
+ | `{typography.display-md}` | 40px | 600 | 1.15 | -1.0px | Sub-section headlines |
669
+ | `{typography.headline}` | 28px | 600 | 1.20 | -0.6px | Pricing tier titles, CTA banner heading |
670
+ | `{typography.card-title}` | 22px | 500 | 1.25 | -0.4px | Feature card title |
671
+ | `{typography.subhead}` | 20px | 400 | 1.40 | -0.2px | Lead body, intro paragraphs |
672
+ | `{typography.body-lg}` | 18px | 400 | 1.50 | -0.1px | Hero subhead, lead paragraphs |
673
+ | `{typography.body}` | 16px | 400 | 1.50 | -0.05px | Default body |
674
+ | `{typography.body-sm}` | 14px | 400 | 1.50 | 0 | Card body, footer columns |
675
+ | `{typography.caption}` | 12px | 400 | 1.40 | 0 | Captions, meta, status |
676
+ | `{typography.button}` | 14px | 500 | 1.20 | 0 | All button labels |
677
+ | `{typography.eyebrow}` | 13px | 500 | 1.30 | 0.4px | Section eyebrow (slight positive tracking) |
678
+ | `{typography.mono}` | 13px | 400 | 1.50 | 0 | Linear Mono for code in product screenshots |
679
+
680
+ ### Principles
681
+
682
+ - **Aggressive negative tracking on display** (-3.0px at 80px ≈ 4% of size).
683
+ - **Single voice from display to body.** Display-xl at 600 → body at 400 — same family, narrower weights.
684
+ - **Eyebrow uses positive tracking** (+0.4px) — contrast against the negative-tracked display marks the eyebrow as taxonomy.
685
+ - **Mono only in code contexts.** Linear Mono lives inside product screenshots — not on marketing chrome.
686
+
687
+ ### Note on Font Substitutes
688
+
689
+ Linear's custom typeface isn't publicly distributed; the documented fallback `SF Pro Display, -apple-system, system-ui` is the recommended substitute on macOS. For cross-platform implementation, **Inter** at weight 500 / 600 / 700 is the closest free substitute. **Geist Sans** is also viable. For mono, **JetBrains Mono** or **Geist Mono** at weight 400 closely approximates Linear Mono.
690
+
691
+ ## Layout
692
+
693
+ ### Spacing System
694
+
695
+ - **Base unit**: 4px.
696
+ - **Tokens (front matter)**: `{spacing.xxs}` 4px · `{spacing.xs}` 8px · `{spacing.sm}` 12px · `{spacing.md}` 16px · `{spacing.lg}` 24px · `{spacing.xl}` 32px · `{spacing.xxl}` 48px · `{spacing.section}` 96px.
697
+ - Card interior padding: `{spacing.lg}` 24px on feature/pricing cards; `{spacing.xl}` 32px on testimonial cards; `{spacing.xxl}` 48px on CTA banners.
698
+ - Pill button padding: 8px vertical · 14px horizontal — Linear's compact button spec.
699
+ - Form input padding: 8px vertical · 12px horizontal.
700
+
701
+ ### Grid & Container
702
+
703
+ - Max content width sits around 1280px.
704
+ - Card grids are 3-up at desktop, 2-up at tablet, 1-up at mobile.
705
+ - Pricing tier grid is 3-up; comparison strip below shows checkmarks per tier.
706
+ - Product screenshot panels span full content width — they're the protagonist.
707
+
708
+ ### Whitespace Philosophy
709
+
710
+ The dark canvas IS the whitespace. Sections separate by lift onto surface-1 panels, not by gaps in white. Within a panel, generous `{spacing.lg}` 24px gaps between content blocks; `{spacing.section}` 96px between sections.
711
+
712
+ ## Elevation & Depth
713
+
714
+ | Level | Treatment | Use |
715
+ |---|---|---|
716
+ | 0 (flat) | No shadow, no border | Default for body type, hero text, footer |
717
+ | 1 (charcoal lift) | `{colors.surface-1}` background on canvas, 1px `{colors.hairline}` | Default cards, product panels |
718
+ | 2 (surface-2 lift) | `{colors.surface-2}` background, 1px `{colors.hairline-strong}` | Featured pricing card, hovered cards |
719
+ | 3 (surface-3 lift) | `{colors.surface-3}` background | Sub-nav, dropdown menus |
720
+ | 4 (focus ring) | 2px `{colors.primary-focus}` outline at 50% opacity | Focused input, focused button |
721
+
722
+ Linear's depth is carried by surface ladder + hairline borders. The brand resists drop shadows on dark almost entirely.
723
+
724
+ ### Decorative Depth
725
+
726
+ - **Product UI screenshots** dominate as decorative depth.
727
+ - **No atmospheric gradients, no spotlight cards.**
728
+ - **Subtle white edge highlight** on the top edge of lifted panels — gives the dark surface a faint "pixel rendered" feel.
729
+
730
+ ## Shapes
731
+
732
+ ### Border Radius Scale
733
+
734
+ | Token | Value | Use |
735
+ |---|---|---|
736
+ | `{rounded.xs}` | 4px | Small chips, status badges |
737
+ | `{rounded.sm}` | 6px | Inline tags |
738
+ | `{rounded.md}` | 8px | All buttons, form inputs |
739
+ | `{rounded.lg}` | 12px | Pricing cards, feature cards, testimonial cards |
740
+ | `{rounded.xl}` | 16px | Product screenshot panels |
741
+ | `{rounded.xxl}` | 24px | Oversized CTA banners (rare) |
742
+ | `{rounded.pill}` | 9999px | Pricing tab toggles, status pills |
743
+ | `{rounded.full}` | 9999px | Avatar circles |
744
+
745
+ ### Photography & Illustration Geometry
746
+
747
+ - Product UI screenshots dominate; they sit in `{rounded.xl}` 16px tiles with `{spacing.lg}` 24px outer padding.
748
+ - Customer logo tiles render at small sizes (~24px logo height) on `{colors.canvas}` with no border.
749
+ - Avatar circles in testimonial cards use `{rounded.full}` at 32–40px sizes.
750
+
751
+ ## Components
752
+
753
+ ### Buttons
754
+
755
+ **`button-primary`** — Lavender CTA. The default primary CTA across all pages.
756
+ - Background `{colors.primary}`, text `{colors.on-primary}`, type `{typography.button}`, padding 8px 14px, rounded `{rounded.md}`.
757
+ - Pressed state lives in `button-primary-pressed` (background shifts to `{colors.primary-focus}`).
758
+ - Hover state lives in `button-primary-hover` (background shifts to `{colors.primary-hover}` lighter lavender).
759
+
760
+ **`button-secondary`** — Charcoal button. Used for secondary CTAs ("Sign in", "Read changelog").
761
+ - Background `{colors.surface-1}`, text `{colors.ink}`, type `{typography.button}`, padding 8px 14px, rounded `{rounded.md}`. 1px `{colors.hairline}` border.
762
+
763
+ **`button-tertiary`** — Plain text button.
764
+ - Background `{colors.canvas}`, text `{colors.ink}`, type `{typography.button}`, rounded `{rounded.md}`, padding 8px 14px.
765
+
766
+ **`button-inverse`** — White-on-dark inverse CTA.
767
+ - Background `{colors.inverse-canvas}`, text `{colors.inverse-ink}`, type `{typography.button}`, rounded `{rounded.md}`, padding 8px 14px.
768
+
769
+ ### Pricing Tabs
770
+
771
+ **`pricing-tab-default`** + **`pricing-tab-selected`** — Pill-toggle on `/pricing`.
772
+ - Default: `{colors.canvas}` background, `{colors.ink-subtle}` text, rounded `{rounded.pill}`, padding 6px 14px.
773
+ - Selected: `{colors.surface-2}` background, `{colors.ink}` text — selected = surface lift.
774
+
775
+ ### Cards & Containers
776
+
777
+ **`pricing-card`** — Each tier on `/pricing`.
778
+ - Background `{colors.surface-1}`, text `{colors.ink}`, type `{typography.body}`, rounded `{rounded.lg}`, padding 24px. 1px `{colors.hairline}` border.
779
+
780
+ **`pricing-card-featured`** — Recommended tier — surface lift to surface-2.
781
+ - Background `{colors.surface-2}`, otherwise identical structure.
782
+
783
+ **`feature-card`** — Generic feature highlight tile.
784
+ - Background `{colors.surface-1}`, text `{colors.ink}`, type `{typography.body}`, rounded `{rounded.lg}`, padding 24px.
785
+
786
+ **`product-screenshot-card`** — The dominant card type — frames a high-fidelity Linear app UI screenshot.
787
+ - Background `{colors.surface-1}`, text `{colors.ink}`, type `{typography.body}`, rounded `{rounded.xl}`, padding 24px.
788
+
789
+ **`testimonial-card`** — Customer quote with avatar + name + role.
790
+ - Background `{colors.surface-1}`, text `{colors.ink}`, type `{typography.body-lg}`, rounded `{rounded.lg}`, padding 32px.
791
+
792
+ **`customer-logo-tile`** — Small tile in the customer marquee.
793
+ - Background `{colors.canvas}`, text `{colors.ink-subtle}`, type `{typography.caption}`, rounded `{rounded.xs}`, padding 16px.
794
+
795
+ **`cta-banner`** — Closing CTA panel near page bottom.
796
+ - Background `{colors.surface-1}`, text `{colors.ink}`, type `{typography.headline}`, rounded `{rounded.lg}`, padding 48px.
797
+
798
+ ### Inputs & Forms
799
+
800
+ **`text-input`** + **`text-input-focused`** — Form fields on `/contact/sales` and signup overlays.
801
+ - Background `{colors.surface-1}`, text `{colors.ink}`, type `{typography.body}`, rounded `{rounded.md}`, padding 8px 12px.
802
+ - Focused state retains the same surface; the focus ring is a 2px `{colors.primary-focus}` outline at 50% opacity.
803
+
804
+ ### Status & Build Page
805
+
806
+ **`changelog-row`** — Each row in `/build` (changelog page) listing version, date, and changes.
807
+ - Background `{colors.canvas}`, text `{colors.ink}`, type `{typography.body}`, rounded `{rounded.xs}`, padding 24px 0. 1px `{colors.hairline}` bottom rule.
808
+
809
+ **`status-badge`** — Small status pill.
810
+ - Background `{colors.surface-2}`, text `{colors.ink-muted}`, type `{typography.caption}`, rounded `{rounded.pill}`, padding 2px 8px.
811
+
812
+ ### Navigation
813
+
814
+ **`top-nav`** — Sticky dark bar with the Linear wordmark left, primary nav links centered, and a `button-secondary` ("Sign in") + `button-primary` ("Get started") pair right.
815
+ - Background `{colors.canvas}`, text `{colors.ink}`, type `{typography.body-sm}`, height 56px.
816
+
817
+ ### Footer
818
+
819
+ **`footer`** — Dense link grid on `{colors.canvas}` with the Linear wordmark left.
820
+ - Background `{colors.canvas}`, text `{colors.ink-subtle}`, type `{typography.caption}`, padding 64px 32px.
821
+
822
+ ## Do's and Don'ts
823
+
824
+ ### Do
825
+
826
+ - Reserve `{colors.canvas}` (#010102) as the system's anchor surface — the faint blue tint is intentional.
827
+ - Use `{colors.primary}` lavender ONLY for: brand mark, primary CTA, focus ring, link emphasis.
828
+ - Use the four-step surface ladder for hierarchy. Avoid skipping levels.
829
+ - Pair display weight 600 with body weight 400 — Linear resists 700+ display weights.
830
+ - Apply negative letter-spacing aggressively on display.
831
+ - Use product UI screenshots as the protagonist of every section.
832
+ - Compose CTAs as `{rounded.md}` 8px corners.
833
+
834
+ ### Don't
835
+
836
+ - Don't ship a light-mode marketing page.
837
+ - Don't use lavender as a section background or card fill.
838
+ - Don't introduce a second chromatic accent (orange, pink, green for marketing).
839
+ - Don't add atmospheric gradients or spotlight cards.
840
+ - Don't pill-round CTAs.
841
+ - Don't use `#000000` true black as the canvas.
842
+ - Don't combine multiple bright accents in product screenshot mockups.
843
+
844
+ ## Responsive Behavior
845
+
846
+ ### Breakpoints
847
+
848
+ | Name | Width | Key Changes |
849
+ |---|---|---|
850
+ | Desktop-XL | 1440px | Default desktop layout |
851
+ | Desktop | 1280px | Card grid 3-up maintained |
852
+ | Tablet | 1024px | Card grid 3-up → 2-up |
853
+ | Mobile-Lg | 768px | Pricing comparison becomes accordion; nav hamburger |
854
+ | Mobile | 480px | Single-column; display-xl scales 80px → ~36px |
855
+
856
+ ### Touch Targets
857
+
858
+ - CTAs hold ≥40px tap height across viewports.
859
+ - Pricing tab pills hold ≥36px tap height; touch viewports grow to ≥44px.
860
+ - Form inputs hold ≥44px tap target on touch.
861
+
862
+ ### Collapsing Strategy
863
+
864
+ - **Top nav**: links collapse to hamburger below 768px.
865
+ - **Card grids**: 3-up → 2-up at 1024px → 1-up below 768px.
866
+ - **Pricing comparison**: per-tier accordion below 768px.
867
+ - **Display type**: `{typography.display-xl}` 80px scales toward `{typography.display-md}` 40px on mobile.
868
+
869
+ ### Image Behavior
870
+
871
+ - Product UI screenshots maintain aspect ratio and never crop.
872
+ - Customer logos in the marquee may collapse from 6-up to 3-up below 768px.
873
+
874
+ ## Iteration Guide
875
+
876
+ 1. Focus on ONE component at a time and reference it by its `components:` token name.
877
+ 2. When introducing a section, decide first which surface lift it lives on.
878
+ 3. Default body to `{typography.body}` at weight 400.
879
+ 4. Run `npx @google/design.md lint DESIGN.md` after edits.
880
+ 5. Add new variants as separate component entries.
881
+ 6. Treat lavender as scarce: brand mark, primary CTA, focus, link emphasis.
882
+ 7. Lead every section with a product UI screenshot.
883
+
884
+ ## Known Gaps
885
+
886
+ - The four-step surface ladder values are extracted directly from Linear's `--color-bg-level-3`, `--color-line-tint`, etc. CSS variables; they are Linear's canonical surface spec.
887
+ - Form-field error and validation styling is not visible on the inspected pages.
888
+ - Light mode is not documented because the marketing site does not ship a light theme.
889
+ - Linear's actual product UI uses a richer color-tag palette (red, orange, yellow, green, blue, purple) for issue priorities and project labels — those colors live in the in-product surfaces shown in mockups.
890
+ - The custom display, text, and mono families are proprietary; an open-source substitute is acceptable.