Skip to content

Latest commit

 

History

History
478 lines (389 loc) · 21.5 KB

File metadata and controls

478 lines (389 loc) · 21.5 KB

Linear — Style Reference

midnight precision instrument

Theme: dark

Linear's design system is a midnight command center built on near-black surfaces (#08090a) with paper-white type and one electric acid-lime accent (#e4f222) that functions as a functional flashlight — small, high-contrast, and used sparingly to signal action. The interface treats darkness as a substrate rather than a theme: text is crisp white at tight tracking (-0.022em), weights sit in a low 400–510 band rather than bold, and borders are hairline-thin (0.5px) to let geometry do the work that shadows usually would. Components feel precision-machined — 6px and 12px radii, compact 8–12px paddings, and almost no decorative ornament — letting the product UI (issue cards, kanban boards, AI agent panels) be the only visual texture in an otherwise quiet system.

Tokens — Colors

Name Value Token Role
Void #08090a --color-void Page canvas, full-bleed backgrounds — the default everything sits on
Carbon #0f1011 --color-carbon Card surfaces, nav bars — one step above canvas for contained content
Obsidian #161718 --color-obsidian Elevated surfaces, deeper card panels
Graphite #23252a --color-graphite Subtle borders, dividers, ghost button outlines — low-contrast structural edges
Smoke #383b3f --color-smoke Hairline borders at higher contrast than graphite — section separators
Ash #62666d --color-ash Muted body text, inactive icons, secondary metadata
Fog #8a8f98 --color-fog Tertiary text, placeholder copy, icon fills
Mist #d0d6e0 --color-mist Secondary headings, button text on dark surfaces
Bone #e5e5e6 --color-bone Near-white surface fills, high-contrast button text
Paper #ffffff --color-paper Primary headings, hero type, max-contrast emphasis text
Acid Lime #e4f222 --color-acid-lime Primary action buttons, active nav indicators — electric accent that breaks the monochrome system
Pulse Green #27a644 --color-pulse-green Green outline accent for tags, dividers, and focused UI edges. Use as a supporting accent, not as a status color
Coral Red #eb5757 --color-coral-red Red wash for highlight backgrounds, decorative bands, and soft emphasis behind content. Use as a supporting accent, not as a status color
Signal Teal #02b8cc --color-signal-teal Decorative accent, informational icon fills
Iris Violet #6366f1 --color-iris-violet Tag/badge fills — soft chromatic punctuation on tags and labels
Lavender #8b5cf6 --color-lavender Secondary tag fills, category indicators

Tokens — Typography

Inter Variable — Primary UI and heading typeface — used across nav, body, headings, buttons, cards · --font-inter-variable

  • Substitute: Inter (variable), or system-ui as fallback
  • Weights: 300, 400, 510, 590
  • Sizes: 10, 11, 12, 13, 14, 15, 16, 17, 20, 24, 32, 48, 64, 72
  • Line height: 1.0–2.75
  • Letter spacing: -0.022em at 48–72px, -0.012em at 20–32px, -0.011em at 15px, -0.010em at 13–16px
  • OpenType features: "cv01" on, "ss03" on, "zero" on
  • Role: Primary UI and heading typeface — used across nav, body, headings, buttons, cards

Berkeley Mono — Code-adjacent UI text — issue IDs (ENG-2703), keyboard shortcuts, monospaced metadata · --font-berkeley-mono

  • Substitute: JetBrains Mono, IBM Plex Mono, or ui-monospace
  • Weights: 400
  • Sizes: 12, 14
  • Line height: 1.40–1.71
  • Letter spacing: -0.013em
  • OpenType features: "cv01" on, "ss03" on
  • Role: Code-adjacent UI text — issue IDs (ENG-2703), keyboard shortcuts, monospaced metadata

Type Scale

Role Size Line Height Letter Spacing Token
caption 13px 1.2 --text-caption
body-sm 15px 1.6 -0.165px --text-body-sm
body-lg 20px 1.33 -0.24px --text-body-lg
subheading 24px 1.33 -0.288px --text-subheading
heading-sm 32px 1.13 -0.704px --text-heading-sm
heading 48px 1 -1.056px --text-heading
heading-lg 64px 1 -1.408px --text-heading-lg
display 72px 1 -1.584px --text-display

Tokens — Spacing & Shapes

Base unit: 4px

Density: compact

Spacing Scale

Name Value Token
4 4px --spacing-4
8 8px --spacing-8
12 12px --spacing-12
16 16px --spacing-16
20 20px --spacing-20
24 24px --spacing-24
28 28px --spacing-28
32 32px --spacing-32
36 36px --spacing-36
40 40px --spacing-40
48 48px --spacing-48
56 56px --spacing-56
64 64px --spacing-64
80 80px --spacing-80
96 96px --spacing-96
128 128px --spacing-128

Border Radius

Element Value
cards 12px
pills 9999px
small 2px
badges 4px
inputs 6px
buttons 6px

Shadows

Name Value Token
sm rgba(0, 0, 0, 0.4) 0px 2px 4px 0px --shadow-sm
md rgba(0, 0, 0, 0.2) 0px 0px 12px 0px inset --shadow-md
subtle rgb(35, 37, 42) 0px 0px 0px 1px inset --shadow-subtle
subtle-2 rgba(0, 0, 0, 0.2) 0px 0px 0px 1px --shadow-subtle-2
subtle-3 rgba(0, 0, 0, 0.01) 0px 5px 2px 0px, rgba(0, 0, 0, 0.04) ... --shadow-subtle-3
xl rgba(8, 9, 10, 0.6) 0px 4px 32px 0px --shadow-xl
subtle-4 rgba(255, 255, 255, 0.03) 0px 0px 0px 1px inset, rgba(255... --shadow-subtle-4
subtle-5 rgba(0, 0, 0, 0.1) 0px 0px 0px 2px --shadow-subtle-5

Layout

  • Page max-width: 1200px
  • Section gap: 96px
  • Card padding: 24px
  • Element gap: 8px

Components

Primary Action Button (Acid Lime)

Role: High-emphasis CTA — the one chromatic button in the system

Background #e4f222, text #08090a, border-radius 6px, padding 10px 16px, Inter 14px / weight 510, letter-spacing -0.011em. Sits as the sole filled chromatic element — every other button on the site is neutral.

Nav Text Button

Role: Top navigation items

Transparent background, text #d0d6e0, padding 8px 12px, Inter 13px / weight 400. No border, no fill — pure typographic nav with underline on hover.

Pill Button

Role: Tag chips, status pills, compact action triggers

Background rgba(255,255,255,0.05), text #d0d6e0, border-radius 9999px, padding 4px 12px, Inter 12–13px / weight 400.

Ghost / Outline Button

Role: Secondary actions, less prominent CTAs

Transparent background, border 1px #23252a, text #d0d6e0, border-radius 6px, padding 8px 12px, Inter 13px / weight 400.

Sign-up Button (Rounded Pill, Neutral)

Role: High-emphasis nav CTA

Background #ffffff, text #08090a, border-radius 9999px, padding 8px 16px, Inter 13px / weight 510. White pill against the dark nav bar — the second highest-contrast element after the acid-lime CTA.

Card (Product Screenshot Frame)

Role: Large showcase surface for product UI screenshots

Background #0f1011, border-radius 12px, inset shadow rgb(35,37,42) 0 0 0 1px, padding 24px. Hairline inner border defines the card edge — no outer shadow, no glow.

Card (Subtle)

Role: Small content cards, nested panels

Background rgba(255,255,255,0.02), border-radius 6px, shadow rgba(0,0,0,0.4) 0 2px 4px, padding 8px. Almost invisible — the card barely separates from the canvas.

Text Input

Role: Form fields, search inputs

Background rgba(255,255,255,0.02), border 1px rgba(255,255,255,0.08), text #d0d6e0, border-radius 6px, padding 12px 14px, Inter 14px / weight 400. Focus ring: border brightens to #d0d6e0.

Badge / Status Tag

Role: Issue status, category labels, inline metadata

Background rgba(255,255,255,0.05), text #8a8f98, border-radius 4px, padding 0px 6px, Inter 12px / weight 400. Color-coded variants use Pulse Green, Coral Red, Iris Violet, or Lavender fills.

Logo Mark

Role: Brand identification in nav

Linear wordmark + geometric glyph, Inter 16px / weight 510, color #ffffff. Glyph rendered as inline SVG in white.

Logo Bar (Customer Strip)

Role: Social proof — customer logos in a horizontal row

Neutral grey logos (Vercel, Cursor, Oscar, OpenAI, Coinbase, Cash App, Boom, Ramp) at #8a8f98–#d0d6e0, evenly spaced with 48–64px gaps, no card backgrounds.

Hero Gradient Floor

Role: Atmospheric base under the product screenshot

Linear gradient from rgb(8,9,10) at 10% to rgb(208,214,224) at 100% — a subtle light wash that grounds the floating product UI against the void.

Do's and Don'ts

Do

  • Use Inter Variable with font-feature-settings 'cv01' on, 'ss03' on, 'zero' on — these alternate glyphs define Linear's typographic identity
  • Use #e4f222 exclusively for the single primary action per view — never for decoration, never for secondary buttons
  • Set body text at 16px Inter weight 400 with line-height 1.5 — larger reading sizes (17px+ at weight 590) are reserved for body emphasis blocks
  • Use letter-spacing -0.022em at 48px and above — tight tracking is non-negotiable for display type
  • Set card radius to 12px, button radius to 6px, pill radius to 9999px — three radii is the entire radius vocabulary
  • Use 0.5px hairline borders (#23252a or #383b3f) instead of shadows for surface separation — Linear's elevation comes from borders and subtle inner shadows
  • Keep section gaps at 96px and element gaps at 8px — the 8/12/24/96 spacing ladder is the rhythm

Don't

  • Do not use bold weights (700+) — Linear's type scale caps at weight 590, the system deliberately avoids heavy display weights
  • Do not use decorative gradients on buttons, cards, or text — gradients are reserved for the hero atmospheric floor only
  • Do not introduce additional chromatic accent colors as actions — the acid-lime button is the only chromatic UI element
  • Do not use large radii (16px+) on cards or panels — 12px is the max card radius in this system
  • Do not use shadows to separate cards from the canvas — use hairline borders (#23252a) and inner inset shadows instead
  • Do not use chromatic text colors for body copy — all body text sits in the #d0d6e0 / #8a8f98 / #62666d grey scale
  • Do not use Berkeley Mono for headings or marketing copy — it is reserved for issue IDs, keyboard shortcuts, and technical metadata

Surfaces

Level Name Value Purpose
0 Void #08090a Page canvas — the default full-bleed background
1 Carbon #0f1011 Card surfaces, product screenshot frames, nav containers
2 Obsidian #161718 Elevated panels, deeper nested surfaces
3 Slate #23252a Interactive surface tint, ghost button fills, border-adjacent backgrounds

Elevation

Elevation in Linear's system is achieved almost entirely through hairline borders (0.5px #23252a or 1px inset #23252a) and subtle dark drop shadows (rgba(0,0,0,0.4) 0 2px 4px) rather than layered shadow stacks. The visual hierarchy comes from the surface-level progression (#08090a → #0f1011 → #161718 → #23252a) and border definition, not from ambient shadow. The acid-lime CTA button uses an inset shadow stack (0px 5px 2px / 0px 3px 2px / 0px 1px 1px) — the only place in the system where a real shadow is applied to a chrome element.

Imagery

Linear's visual language is product-screenshot-first: the hero and section illustrations are real Linear app UI captured at full fidelity — issue cards, kanban boards, AI agent panels, command palettes — placed inside framed card containers with hairline borders. No stock photography, no lifestyle imagery, no abstract illustration. Logos appear as a customer strip in neutral grey (#8a8f98) at uniform size. Icons are minimal line-art SVGs in single-color grey scale. The hero screenshot floats on a subtle linear gradient (dark-to-light) that creates atmospheric depth without literal scenery. Every visual element is a functional artifact of the product itself.

Layout

Layout is max-width contained at ~1200px, centered, with full-bleed dark backgrounds extending to viewport edges. The hero is a left-aligned oversized headline (64–72px) paired with a right-aligned link CTA, followed by a large product screenshot that bleeds beyond the max-width slightly. Section rhythm alternates between text-left/image-right 2-column compositions and full-width product showcase bands, separated by 96px vertical gaps. The customer logo strip is a single horizontal row. The page never uses 3-column card grids or masonry — information density stays low, with most sections using generous whitespace and a single focal point per screen. Navigation is a fixed top bar with left-aligned logo and right-aligned links, no sidebar, no mega-menu.

Agent Prompt Guide

Quick Color Reference:

  • text (primary heading): #ffffff
  • text (body): #d0d6e0
  • text (muted): #8a8f98
  • background (canvas): #08090a
  • background (card): #0f1011
  • border (hairline): #23252a
  • accent (CTA): #e4f222
  • primary action: #e4f222 (filled action)

3-5 Example Component Prompts:

  1. Hero headline block: Full-bleed #08090a canvas. Headline at 64px Inter Variable weight 510, color #ffffff, letter-spacing -0.022em, line-height 1.0. Subtext at 16px Inter weight 400, color #8a8f98. No button — secondary link text in #d0d6e0 with arrow glyph.

  2. Product screenshot card: Background #0f1011, border-radius 12px, inset border 1px #23252a via box-shadow, padding 24px. Contains a simulated app UI at full opacity over the card surface. No outer drop shadow.

  3. Acid-lime primary action button: Background #e4f222, text #08090a, border-radius 6px, padding 10px 16px, Inter 14px weight 510, letter-spacing -0.011em. Only one per view.

  4. Nav top bar: Background #08090a (transparent over canvas), padding 16px horizontal, max-width 1200px centered. Logo wordmark #ffffff at 16px weight 510 left-aligned. Nav links #d0d6e0 at 13px weight 400, 8px gaps. Right-aligned white pill sign-up button: bg #ffffff, text #08090a, border-radius 9999px, padding 8px 16px.

  5. Status badge row: Horizontal flex, 8px gap. Each badge: background rgba(255,255,255,0.05), text #8a8f98, border-radius 4px, padding 0px 6px, Inter 12px weight 400. Color-coded variants: #27a644 for success, #eb5757 for error, #6366f1 for tags.

Type Scale Detail

Display: 72px / 510 / lh 1.0 / ls -0.022em Hero: 64px / 510 / lh 1.0 / ls -0.022em Section heading: 48px / 510 / lh 1.0 / ls -0.022em Subheading: 32px / 400 / lh 1.13 / ls -0.022em Heading: 24px / 400 / lh 1.33 / ls -0.012em Body emphasis: 20px / 590 / lh 1.33 / ls -0.012em Body large: 17px / 590 / lh 1.6 / ls default Body: 16px / 400 / lh 1.5 / ls default Body small: 15px / 400 / lh 1.6 / ls -0.011em Caption: 13px / 400 / lh 1.2 / ls default Label: 12px / 400 / lh 1.4 / ls default Micro: 10px / 510 / lh 1.5 / ls default

Similar Brands

  • Vercel — Same dark-canvas-first approach with hairline borders, tight Inter typography, and product-screenshot-as-hero layout — both treat the product UI as the visual content rather than illustration
  • Cursor — Identical midnight dark mode with acid-lime accent CTA, compact Inter type at 400–510 weights, and product-screenshot showcase cards at 12px radius
  • Raycast — Shared dark precision-instrument aesthetic — compact spacing, 6px button radius, monochromatic chrome with a single functional accent color for active states
  • Framer — Same dark-canvas layout language with large 48–64px Inter headings at tight tracking, product-screenshot hero cards, and minimal ornament between sections

Quick Start

CSS Custom Properties

:root {
  /* Colors */
  --color-void: #08090a;
  --color-carbon: #0f1011;
  --color-obsidian: #161718;
  --color-graphite: #23252a;
  --color-smoke: #383b3f;
  --color-ash: #62666d;
  --color-fog: #8a8f98;
  --color-mist: #d0d6e0;
  --color-bone: #e5e5e6;
  --color-paper: #ffffff;
  --color-acid-lime: #e4f222;
  --color-pulse-green: #27a644;
  --color-coral-red: #eb5757;
  --color-signal-teal: #02b8cc;
  --color-iris-violet: #6366f1;
  --color-lavender: #8b5cf6;

  /* Typography — Font Families */
  --font-inter-variable: 'Inter Variable', ui-sans-serif, system-ui, -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, sans-serif;
  --font-berkeley-mono: 'Berkeley Mono', ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, monospace;

  /* Typography — Scale */
  --text-caption: 13px;
  --leading-caption: 1.2;
  --text-body-sm: 15px;
  --leading-body-sm: 1.6;
  --tracking-body-sm: -0.165px;
  --text-body-lg: 20px;
  --leading-body-lg: 1.33;
  --tracking-body-lg: -0.24px;
  --text-subheading: 24px;
  --leading-subheading: 1.33;
  --tracking-subheading: -0.288px;
  --text-heading-sm: 32px;
  --leading-heading-sm: 1.13;
  --tracking-heading-sm: -0.704px;
  --text-heading: 48px;
  --leading-heading: 1;
  --tracking-heading: -1.056px;
  --text-heading-lg: 64px;
  --leading-heading-lg: 1;
  --tracking-heading-lg: -1.408px;
  --text-display: 72px;
  --leading-display: 1;
  --tracking-display: -1.584px;

  /* Typography — Weights */
  --font-weight-light: 300;
  --font-weight-regular: 400;
  --font-weight-w510: 510;
  --font-weight-w590: 590;

  /* Spacing */
  --spacing-unit: 4px;
  --spacing-4: 4px;
  --spacing-8: 8px;
  --spacing-12: 12px;
  --spacing-16: 16px;
  --spacing-20: 20px;
  --spacing-24: 24px;
  --spacing-28: 28px;
  --spacing-32: 32px;
  --spacing-36: 36px;
  --spacing-40: 40px;
  --spacing-48: 48px;
  --spacing-56: 56px;
  --spacing-64: 64px;
  --spacing-80: 80px;
  --spacing-96: 96px;
  --spacing-128: 128px;

  /* Layout */
  --page-max-width: 1200px;
  --section-gap: 96px;
  --card-padding: 24px;
  --element-gap: 8px;

  /* Border Radius */
  --radius-sm: 2px;
  --radius-md: 6px;
  --radius-xl: 12px;
  --radius-2xl: 16px;
  --radius-2xl-2: 22px;
  --radius-full: 400px;
  --radius-full-2: 9999px;

  /* Named Radii */
  --radius-cards: 12px;
  --radius-pills: 9999px;
  --radius-small: 2px;
  --radius-badges: 4px;
  --radius-inputs: 6px;
  --radius-buttons: 6px;

  /* Shadows */
  --shadow-sm: rgba(0, 0, 0, 0.4) 0px 2px 4px 0px;
  --shadow-md: rgba(0, 0, 0, 0.2) 0px 0px 12px 0px inset;
  --shadow-subtle: rgb(35, 37, 42) 0px 0px 0px 1px inset;
  --shadow-subtle-2: rgba(0, 0, 0, 0.2) 0px 0px 0px 1px;
  --shadow-subtle-3: rgba(0, 0, 0, 0.01) 0px 5px 2px 0px, rgba(0, 0, 0, 0.04) 0px 3px 2px 0px, rgba(0, 0, 0, 0.07) 0px 1px 1px 0px, rgba(0, 0, 0, 0.08) 0px 0px 1px 0px;
  --shadow-xl: rgba(8, 9, 10, 0.6) 0px 4px 32px 0px;
  --shadow-subtle-4: rgba(255, 255, 255, 0.03) 0px 0px 0px 1px inset, rgba(255, 255, 255, 0.04) 0px 1px 0px 0px inset, rgba(0, 0, 0, 0.6) 0px 0px 0px 1px, rgba(0, 0, 0, 0.1) 0px 4px 4px 0px;
  --shadow-subtle-5: rgba(0, 0, 0, 0.1) 0px 0px 0px 2px;

  /* Surfaces */
  --surface-void: #08090a;
  --surface-carbon: #0f1011;
  --surface-obsidian: #161718;
  --surface-slate: #23252a;
}

Tailwind v4

@theme {
  /* Colors */
  --color-void: #08090a;
  --color-carbon: #0f1011;
  --color-obsidian: #161718;
  --color-graphite: #23252a;
  --color-smoke: #383b3f;
  --color-ash: #62666d;
  --color-fog: #8a8f98;
  --color-mist: #d0d6e0;
  --color-bone: #e5e5e6;
  --color-paper: #ffffff;
  --color-acid-lime: #e4f222;
  --color-pulse-green: #27a644;
  --color-coral-red: #eb5757;
  --color-signal-teal: #02b8cc;
  --color-iris-violet: #6366f1;
  --color-lavender: #8b5cf6;

  /* Typography */
  --font-inter-variable: 'Inter Variable', ui-sans-serif, system-ui, -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, sans-serif;
  --font-berkeley-mono: 'Berkeley Mono', ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, monospace;

  /* Typography — Scale */
  --text-caption: 13px;
  --leading-caption: 1.2;
  --text-body-sm: 15px;
  --leading-body-sm: 1.6;
  --tracking-body-sm: -0.165px;
  --text-body-lg: 20px;
  --leading-body-lg: 1.33;
  --tracking-body-lg: -0.24px;
  --text-subheading: 24px;
  --leading-subheading: 1.33;
  --tracking-subheading: -0.288px;
  --text-heading-sm: 32px;
  --leading-heading-sm: 1.13;
  --tracking-heading-sm: -0.704px;
  --text-heading: 48px;
  --leading-heading: 1;
  --tracking-heading: -1.056px;
  --text-heading-lg: 64px;
  --leading-heading-lg: 1;
  --tracking-heading-lg: -1.408px;
  --text-display: 72px;
  --leading-display: 1;
  --tracking-display: -1.584px;

  /* Spacing */
  --spacing-4: 4px;
  --spacing-8: 8px;
  --spacing-12: 12px;
  --spacing-16: 16px;
  --spacing-20: 20px;
  --spacing-24: 24px;
  --spacing-28: 28px;
  --spacing-32: 32px;
  --spacing-36: 36px;
  --spacing-40: 40px;
  --spacing-48: 48px;
  --spacing-56: 56px;
  --spacing-64: 64px;
  --spacing-80: 80px;
  --spacing-96: 96px;
  --spacing-128: 128px;

  /* Border Radius */
  --radius-sm: 2px;
  --radius-md: 6px;
  --radius-xl: 12px;
  --radius-2xl: 16px;
  --radius-2xl-2: 22px;
  --radius-full: 400px;
  --radius-full-2: 9999px;

  /* Shadows */
  --shadow-sm: rgba(0, 0, 0, 0.4) 0px 2px 4px 0px;
  --shadow-md: rgba(0, 0, 0, 0.2) 0px 0px 12px 0px inset;
  --shadow-subtle: rgb(35, 37, 42) 0px 0px 0px 1px inset;
  --shadow-subtle-2: rgba(0, 0, 0, 0.2) 0px 0px 0px 1px;
  --shadow-subtle-3: rgba(0, 0, 0, 0.01) 0px 5px 2px 0px, rgba(0, 0, 0, 0.04) 0px 3px 2px 0px, rgba(0, 0, 0, 0.07) 0px 1px 1px 0px, rgba(0, 0, 0, 0.08) 0px 0px 1px 0px;
  --shadow-xl: rgba(8, 9, 10, 0.6) 0px 4px 32px 0px;
  --shadow-subtle-4: rgba(255, 255, 255, 0.03) 0px 0px 0px 1px inset, rgba(255, 255, 255, 0.04) 0px 1px 0px 0px inset, rgba(0, 0, 0, 0.6) 0px 0px 0px 1px, rgba(0, 0, 0, 0.1) 0px 4px 4px 0px;
  --shadow-subtle-5: rgba(0, 0, 0, 0.1) 0px 0px 0px 2px;
}