Remixes of linear.app
Latest remixes
No public remixes yet. Be the first to make one.
Remix itLatest remixes
No public remixes yet. Be the first to make one.
Remix itSwitch between the rendered Visual preview and the Raw DESIGN.md.
version: alpha
name: Linear
description: |
Linear's design system embodies a sophisticated, high-performance aesthetic
rooted in minimalism and dark-mode-first thinking. The visual language
prioritizes clarity and density—every interface element serves function, with
virtually no decorative ornament. The atmosphere is cool, professional, and
technically refined, reflecting a product designed for engineers and product
teams who value precision over warmth. Typography is spare and weighted;
spacing breathes but never wastes; colors are deployed with surgical
restraint. The overall effect is one of quiet confidence and purposeful
construction—a system that trusts its users to operate at depth and speed.
source:
url: "https://linear.app"
pagesAnalyzed: 6
extractedAt: 2026-11-02
tokensMeasured: true
colors:
primary: "#FFFFFF"
accent: "#5E6AD2"
link: "#828FFF"
canvas: "#08090A"
surface: "#0F1011"
on-primary: "#08090A"
ink: "#F7F8F8"
body: "#D0D6E0"
muted: "#8A8F98"
faint: "#62666D"
hairline: "#E5E5E6"
accent-1: "#23252A"
neutral-1: "#161718"
typography:
display-xl:
fontFamily: "Inter Variable"
fontSize: 72px
fontWeight: 510
lineHeight: 1
letterSpacing: -1.58px
display-lg:
fontFamily: "Inter Variable"
fontSize: 64px
fontWeight: 510
lineHeight: 1
letterSpacing: -1.41px
display-md:
fontFamily: "Inter Variable"
fontSize: 48px
fontWeight: 510
lineHeight: 1
letterSpacing: -1.06px
display-md-strong:
fontFamily: "Inter Variable"
fontSize: 48px
fontWeight: 590
lineHeight: 1
letterSpacing: -1.06px
display-sm:
fontFamily: "Inter Variable"
fontSize: 40px
fontWeight: 510
lineHeight: 1.1
letterSpacing: -0.88px
heading-xl:
fontFamily: "Inter Variable"
fontSize: 32px
fontWeight: 400
lineHeight: 1.13
letterSpacing: -0.7px
heading-lg:
fontFamily: "Inter Variable"
fontSize: 24px
fontWeight: 590
lineHeight: 1.33
letterSpacing: -0.29px
heading-md:
fontFamily: "Inter Variable"
fontSize: 20px
fontWeight: 590
lineHeight: 1.33
letterSpacing: -0.24px
heading-sm:
fontFamily: "Inter Variable"
fontSize: 16px
fontWeight: 590
lineHeight: 1.75
letterSpacing: 0px
heading-xs:
fontFamily: "Inter Variable"
fontSize: 13px
fontWeight: 510
lineHeight: 1.5
letterSpacing: -0.13px
body-xl:
fontFamily: "Inter Variable"
fontSize: 24px
fontWeight: 400
lineHeight: 1.33
letterSpacing: -0.29px
body-lg:
fontFamily: "Inter Variable"
fontSize: 15px
fontWeight: 400
lineHeight: 1.6
letterSpacing: -0.16px
body-lg-strong:
fontFamily: "Inter Variable"
fontSize: 15px
fontWeight: 510
lineHeight: 1.6
letterSpacing: -0.16px
body-md:
fontFamily: "Inter Variable"
fontSize: 14px
fontWeight: 400
lineHeight: 1.5
letterSpacing: -0.18px
body-sm:
fontFamily: "Inter Variable"
fontSize: 13px
fontWeight: 400
lineHeight: 1.5
letterSpacing: -0.13px
body-sm-strong:
fontFamily: "Inter Variable"
fontSize: 13px
fontWeight: 510
lineHeight: 3.08
letterSpacing: 0px
nav:
fontFamily: "Inter Variable"
fontSize: 13px
fontWeight: 400
lineHeight: 1.5
letterSpacing: 0px
button-lg:
fontFamily: "Inter Variable"
fontSize: 16px
fontWeight: 510
lineHeight: 2.75
letterSpacing: 0px
button-md:
fontFamily: "Inter Variable"
fontSize: 14px
fontWeight: 400
lineHeight: 2.86
letterSpacing: 0px
button-md-strong:
fontFamily: "Inter Variable"
fontSize: 14px
fontWeight: 510
letterSpacing: 0px
button-sm:
fontFamily: "Inter Variable"
fontSize: 13.3333px
fontWeight: 400
letterSpacing: 0px
button-xs:
fontFamily: "Inter Variable"
fontSize: 13px
fontWeight: 510
lineHeight: 3.38
letterSpacing: 0px
label:
fontFamily: "Inter Variable"
fontSize: 14px
fontWeight: 400
lineHeight: 1.5
letterSpacing: 0px
caption-xs:
fontFamily: "Inter Variable"
fontSize: 12px
fontWeight: 400
lineHeight: 1.17
letterSpacing: 0px
caption-xs-strong:
fontFamily: "Inter Variable"
fontSize: 12px
fontWeight: 510
lineHeight: 1.4
letterSpacing: 0px
code-sm:
fontFamily: "Berkeley Mono"
fontSize: 14px
fontWeight: 400
lineHeight: 1.71
letterSpacing: 0px
code-sm-tight:
fontFamily: "Berkeley Mono"
fontSize: 14px
fontWeight: 400
lineHeight: 1.2
letterSpacing: 0px
code-xs:
fontFamily: "Berkeley Mono"
fontSize: 12px
fontWeight: 400
lineHeight: 1.4
letterSpacing: 0px
textTransform: uppercase
rounded:
none: 0px
xs: 3px
sm: 4px
md: 6px
lg: 8px
xl: 9px
xxl: 12px
full: 9999px
spacing:
xxs: 4px
xs: 8px
sm: 12px
md: 16px
lg: 20px
xl: 24px
xxl: 28px
xxxl: 32px
section: 40px
band: 48px
borderWidths:
thin: 1px
shadows:
sm: "rgba(0, 0, 0, 0.2) 0px 0px 0px 1px"
md: "rgba(0, 0, 0, 0.4) 0px 1px 0px 0px"
lg: "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"
elevationStrategy: layered-micro
themes:
derived: light # the other theme is the site's measured palette
light:
bg: "#F9FAFE"
surface: "#EFF0F4"
surfaceRaised: "#E8E9EC"
text: "#15151B"
textMuted: "#6B6B70"
border: "#D6D7DA"
accent: "#5E6AD2"
accentFg: "#FFFFFF"
focusRing: "#5E6AD2"
elevation: shadow
dark:
bg: "#08090A"
surface: "#0F1011"
surfaceRaised: "#222324"
text: "#F7F8F8"
textMuted: "#D0D6E0"
border: "#E5E5E6"
accent: "#5E6AD2"
accentFg: "#FFFFFF"
focusRing: "#5E6AD2"
elevation: "border+surface"
gradients:
- context: hero
kind: mixed
value: "radial-gradient(52.53% 57.5% at 50% 100%, rgba(8, 9, 10, 0) 0%, rgba(8, 9, 10, 0.5) 100%), linear-gradient(rgb(8, 9, 10) 10%, rgb(208, 214, 224) 100%)"
- context: section
kind: linear
value: "linear-gradient(rgba(255, 255, 255, 0.03), rgba(255, 255, 255, 0.03)), none"
- context: section
kind: linear
value: "linear-gradient(rgba(11, 11, 11, 0.8) 0%, oklab(0.149576 0.00000680983 0.00000298768 / 0.761905) 100%)"
- context: section
kind: radial
value: "radial-gradient(50% 50%, rgba(255, 255, 255, 0.04) 0%, rgba(255, 255, 255, 0) 90%)"
- context: section
kind: linear
value: "linear-gradient(rgba(255, 255, 255, 0.04), rgba(255, 255, 255, 0.04)), none"
- context: section
kind: linear
value: "linear-gradient(rgba(255, 255, 255, 0.03), rgba(255, 255, 255, 0.03)), linear-gradient(rgb(22, 23, 24), rgb(22, 23, 24)), linear-gradient(135deg, rgba(255, 255, 255, 0.15) 0%, rgba(255, 255, 255, 0.05) 25%)"
components:
button-filled:
textColor: "{colors.on-primary}"
border: "1px solid {colors.hairline}"
height: 32px
padding: "0px 12px 0px 12px"
fontSize: 13px
boxShadow: "rgba(0, 0, 0, 0) 0px 8px 2px 0px, 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"
fontFamily: "Inter Variable"
fontWeight: 510
lineHeight: 2.46
rounded: "{rounded.full}"
backgroundColor: "{colors.hairline}"
button-filled-lg:
typography: "{typography.button-lg}"
textColor: "{colors.on-primary}"
border: "1px solid {colors.hairline}"
height: 44px
padding: "0px 20px 0px 20px"
boxShadow: "rgba(0, 0, 0, 0) 0px 8px 2px 0px, 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"
rounded: "{rounded.full}"
backgroundColor: "{colors.hairline}"
button-primary:
textColor: "{colors.body}"
height: 28px
padding: "0px 7px 0px 7px"
fontSize: 13px
fontFamily: "Inter Variable"
fontWeight: 510
rounded: "{rounded.lg}"
backgroundColor: "rgba(255, 255, 255, 0.04)"
button-icon:
typography: "{typography.button-sm}"
textColor: "rgb(226, 228, 231)"
border: "1px solid rgb(36, 40, 44)"
height: 28px
rounded: "{rounded.full}"
backgroundColor: "rgba(255, 255, 255, 0.02)"
button-primary-lg:
typography: "{typography.button-lg}"
textColor: "{colors.ink}"
height: 44px
padding: "0px 20px 0px 20px"
boxShadow: "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"
rounded: "{rounded.full}"
backgroundColor: "rgba(255, 255, 255, 0.05)"
button-icon-2:
typography: "{typography.button-sm}"
textColor: "{colors.muted}"
height: 28px
padding: "0px 7px 0px 7px"
boxShadow: "rgba(255, 255, 255, 0.05) 0px 0px 0px 1px inset"
rounded: "{rounded.full}"
backgroundColor: "rgba(255, 255, 255, 0.02)"
card:
textColor: "{colors.ink}"
border: "1px solid rgba(255, 255, 255, 0.08)"
padding: "12px 16px 16px 16px"
fontSize: 16px
boxShadow: "rgba(0, 0, 0, 0.2) 0px 0px 0px 1px"
fontFamily: "Inter Variable"
fontWeight: 400
lineHeight: 1.5
rounded: "{rounded.xl}"
backgroundColor: "{colors.surface}"
card-featured:
textColor: "{colors.ink}"
padding: "24px 32px 24px 32px"
fontSize: 16px
fontFamily: "Inter Variable"
fontWeight: 400
lineHeight: 1.5
rounded: "{rounded.lg}"
backgroundColor: "rgb(228, 242, 34)"
card-lg:
textColor: "{colors.ink}"
padding: "12px 12px 0px 12px"
fontSize: 16px
fontFamily: "Inter Variable"
fontWeight: 400
lineHeight: 1.5
badge-primary:
textColor: "{colors.body}"
border: "1px solid rgba(255, 255, 255, 0.08)"
height: 22px
padding: "2px 5px 2px 4px"
fontSize: 13px
fontFamily: "Inter Variable"
fontWeight: 400
lineHeight: 1.54
rounded: "{rounded.xs}"
backgroundColor: "rgba(255, 255, 255, 0.07)"
badge-text:
textColor: "{colors.muted}"
height: 24px
padding: "0px 4px 0px 8px"
fontSize: 12px
fontFamily: "Inter Variable"
fontWeight: 510
lineHeight: 1.17
rounded: "{rounded.full}"
badge-primary-sm:
textColor: "{colors.body}"
border: "1px solid rgba(255, 255, 255, 0.08)"
height: 20px
padding: "0px 6px 0px 4px"
fontSize: 12px
fontFamily: "Inter Variable"
fontWeight: 510
lineHeight: 1.5
rounded: "{rounded.sm}"
backgroundColor: "rgba(255, 255, 255, 0.05)"
badge-filled:
textColor: "{colors.body}"
border: "1px solid rgba(255, 255, 255, 0.08)"
height: 20px
padding: "0px 6px 0px 4px"
fontSize: 12px
fontFamily: "Inter Variable"
fontWeight: 510
lineHeight: 1.5
rounded: "{rounded.sm}"
backgroundColor: "rgb(28, 28, 29)"
navigation:
textColor: "{colors.ink}"
height: 72px
fontSize: 16px
fontFamily: "Inter Variable"
fontWeight: 400
lineHeight: 1.5
footer:
textColor: "{colors.ink}"
border: "1px solid {colors.accent-1}"
fontSize: 16px
fontFamily: "Inter Variable"
fontWeight: 400
lineHeight: 1.5
backgroundColor: "{colors.canvas}"
link:
textColor: "{colors.ink}"
fontSize: 16px
fontFamily: "Inter Variable"
fontWeight: 400
lineHeight: 1.5
rounded: "{rounded.sm}"
link-sm:
typography: "{typography.body-sm}"
textColor: "{colors.muted}"
padding: "0px 12px 0px 12px"
rounded: "{rounded.full}"
states:
other-hover:
target: other
state: hover
textColor: currentcolor
other-focus:
target: other
state: focus
opacity: 1
transform: none
other-disabled:
target: other
state: disabled
opacity: 0.5
other-active:
target: other
state: active
filter: "brightness(98%)"
transform: "scale(0.97)"
other-focus-visible:
target: other
state: focus-visible
outline: none
button-hover:
target: button
state: hover
filter: "brightness(1.3)"
button-active:
target: button
state: active
filter: "brightness(1.6)"
button-focus-visible:
target: button
state: focus-visible
boxShadow: "rgba(0, 0, 0, 0.4) 0px 0px 0px 2px"
link-hover:
target: link
state: hover
backgroundColor: "rgba(39, 44, 48, 0.75)"
breakpoints:
- width: 375
containerWidth: 343
gridColumns: 2
navLinksVisible: 3
menuToggleVisible: true
headingPx: 38
bodyPx: 16
sectionPaddingX: 16
- width: 768
containerWidth: 712
gridColumns: 2
navLinksVisible: 3
menuToggleVisible: true
headingPx: 56
bodyPx: 16
sectionPaddingX: 28
- width: 1024
containerWidth: 968
gridColumns: 6
navLinksVisible: 6
menuToggleVisible: true
headingPx: 56
bodyPx: 16
sectionPaddingX: 28
- width: 1280
containerWidth: 1270
gridColumns: 6
navLinksVisible: 7
menuToggleVisible: true
headingPx: 64
bodyPx: 16
sectionPaddingX: 10
- width: 1440
containerWidth: 1344
gridColumns: 6
navLinksVisible: 7
menuToggleVisible: true
headingPx: 72
bodyPx: 16
sectionPaddingX: 46
coverage:
statesFound: 108
gradientsFound: 8
rolesUnassigned: 2
archetypesUnnamed: 0
archetypesDetected: 0
responsiveMeasured: true
stylesheetsBlocked: false
semanticRampDeclared: false
Linear's design system embodies a sophisticated, high-performance aesthetic rooted in minimalism and dark-mode-first thinking. The visual language prioritizes clarity and density—every interface element serves function, with virtually no decorative ornament. The atmosphere is cool, professional, and technically refined, reflecting a product designed for engineers and product teams who value precision over warmth. Typography is spare and weighted; spacing breathes but never wastes; colors are deployed with surgical restraint. The overall effect is one of quiet confidence and purposeful construction—a system that trusts its users to operate at depth and speed.
Key Characteristics
#08090A) and white primary (#FFFFFF) form the backbone#5E6AD2) used sparingly for links and states, never for fill{rounded.full} = 9999px){colors.primary} — #FFFFFF): Used as button fill, brand accent, and active state indicator. The dominant light color deployed on dark backgrounds.{colors.accent} — #5E6AD2): Brand hue paired alongside the achromatic primary; appears in interactive states and alongside primary CTAs.{colors.link} — #828FFF): Inline link and hypertext color; lighter than brand accent for distinction.{colors.accent-1} — #23252A): No measured role; used decoratively where a subtle dark accent is needed.{colors.ink} — #F7F8F8): Headings and primary text; near-white for maximum contrast on dark surfaces.{colors.body} — #D0D6E0): Secondary body text; used for longer-form content where maximum contrast is not required.{colors.muted} — #8A8F98): Captions, secondary labels, and tertiary UI text.{colors.faint} — #62666D): Placeholder text, disabled states, and lowest-priority information.{colors.canvas} — #08090A): Default page background and application root. The true dark foundation of the system.{colors.surface} — #0F1011): Card, panel, and elevated container background. One step lighter than canvas for depth.{colors.neutral-1} — #161718): No measured role; subtle tonal shift used decoratively.{colors.hairline} — #E5E5E6): 1px borders and dividers; deployed sparingly, typically with reduced opacity.Primary: Inter Variable, with fallback stack: -apple-system, BlinkMacSystemFont, Segoe UI, Roboto, Oxygen, Ubuntu, Cantarell, Fira Sans, Droid Sans, Helvetica Neue, sans-serif
Secondary (Code): Berkeley Mono, with fallback: Courier New, monospace
| Role | Font | Size | Weight | Line Height | Letter Spacing | Notes |
|---|---|---|---|---|---|---|
| Display Large | Inter Variable | 64px | 510 | 1.0 | -1.41px | Hero, primary h1 |
| Display MD | Inter Variable | 48px | 510 | 1.0 | -1.06px | h1, h2 |
| Display MD Strong | Inter Variable | 48px | 590 | 1.0 | -1.06px | Bold variant of Display MD |
| Display SM | Inter Variable | 40px | 510 | 1.1 | -0.88px | Large heading; h1 at smaller viewports |
| Display XL | Inter Variable | 72px | 510 | 1.0 | -1.58px | Largest display size; hero text |
| Heading XL | Inter Variable | 32px | 400 | 1.13 | -0.70px | Section heading |
| Heading LG | Inter Variable | 24px | 590 | 1.33 | -0.29px | h3, subsection title |
| Heading MD | Inter Variable | 20px | 590 | 1.33 | -0.24px | h3 variant |
| Heading SM | Inter Variable | 16px | 590 | 1.75 | 0px | h4, small heading |
| Heading XS | Inter Variable | 13px | 510 | 1.5 | -0.13px | Label, small title |
| Body XL | Inter Variable | 24px | 400 | 1.33 | -0.29px | Large body prose |
| Body LG | Inter Variable | 15px | 400 | 1.6 | -0.16px | Default body copy |
| Body LG Strong | Inter Variable | 15px | 510 | 1.6 | -0.16px | Bold variant of Body LG |
| Body MD | Inter Variable | 14px | 400 | 1.5 | -0.18px | Standard body, labels, input |
| Body SM | Inter Variable | 13px | 400 | 1.5 | -0.13px | Secondary body, list items, links |
| Body SM Strong | Inter Variable | 13px | 510 | 3.08 | 0px | Bold small text; unusual line-height for specific context |
| Button LG | Inter Variable | 16px | 510 | 2.75 | 0px | Large button text |
| Button MD | Inter Variable | 14px | 400 | 2.86 | 0px | Standard button text |
| Button MD Strong | Inter Variable | 14px | 510 | — | 0px | Bold button variant |
| Button SM | Inter Variable | 13.33px | 400 | — | 0px | Small button, compact UI |
| Button XS | Inter Variable | 13px | 510 | 3.38 | 0px | Extra-small button; very tall line-height |
| Navigation | Inter Variable | 13px | 400 | 1.5 | 0px | Primary nav link; same size as body-sm |
| Caption XS | Inter Variable | 12px | 400 | 1.17 | 0px | Smallest caption, footnote |
| Caption XS Strong | Inter Variable | 12px | 510 | 1.4 | 0px | Bold caption |
| Code XS | Berkeley Mono | 12px | 400 | 1.4 | 0px | Inline code, uppercase transform |
| Code SM | Berkeley Mono | 14px | 400 | 1.71 | 0px | Code block, standard monospace |
| Code SM Tight | Berkeley Mono | 14px | 400 | 1.2 | 0px | Condensed code presentation |
| Label | Inter Variable | 14px | 400 | 1.5 | 0px | Form label, semantic size |
rgba(255, 255, 255, 0.05){colors.body} (#D0D6E0){typography.button-sm} (13.33px, weight 400){rounded.lg} (8px)filter: brightness(1.3)filter: brightness(1.6)rgba(255, 255, 255, 0.05){colors.ink} (#F7F8F8){typography.button-lg} (16px, weight 510){rounded.full} (9999px)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 0pxfilter: brightness(1.3)filter: brightness(1.6)#E5E5E6 ({colors.hairline}){colors.canvas} (#08090A){typography.button-sm} (13px, weight 510)1px solid #E5E5E6{rounded.full} (9999px)rgba(0, 0, 0, 0) 0px 8px 2px 0px, 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 0pxfilter: brightness(120%)filter: brightness(98%); transform: scale(0.97)#E5E5E6 ({colors.hairline}){colors.canvas} (#08090A){typography.button-lg} (16px, weight 510)1px solid #E5E5E6{rounded.full} (9999px)rgba(0, 0, 0, 0) 0px 8px 2px 0px, 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 0pxfilter: brightness(120%)filter: brightness(98%)rgba(255, 255, 255, 0.02)#E2E4E7{typography.button-sm} (13.33px, weight 400)1px solid #242C2C (rgb(36, 40, 44)){rounded.full} (9999px)backgroundColor: rgba(255, 255, 255, 0.16)backgroundColor: rgba(255, 255, 255, 0.16); transform: scale(0.97)rgba(255, 255, 255, 0.02){colors.muted} (#8A8F98){typography.button-sm} (13.33px, weight 400){rounded.full} (9999px)rgba(255, 255, 255, 0.05) 0px 0px 0px 1px insetbackgroundColor: rgba(255, 255, 255, 0.04)transform: scale(0.97){colors.ink} (#F7F8F8){typography.body-sm} (13px, weight 400)color: var(--color-link-hover); backgroundColor: rgba(255, 255, 255, 0.04)color: var(--color-text-primary); transform: scale(0.97){colors.surface} (#0F1011){colors.ink} (#F7F8F8)12px 16px 16px 16px ({spacing.sm} x {spacing.md} x {spacing.md} x {spacing.md})1px solid rgba(255, 255, 255, 0.08){rounded.xl} (9px)rgba(0, 0, 0, 0.2) 0px 0px 0px 1px (micro-elevation via hairline){typography.body-md} (14px, weight 400)backgroundColor: rgba(255, 255, 255, 0.03) (subtle lift)#E4F222 (bright yellow-green, brand highlight){colors.canvas} (#08090A)24px 32px 24px 32px ({spacing.xl} x {spacing.xxxl} x {spacing.xl} x {spacing.xxxl}){rounded.lg} (8px){typography.body-md} (14px, weight 400)rgba(0, 0, 0, 0){colors.ink} (#F7F8F8)12px 12px 0px 12px{rounded.none} (0px){typography.body-md} (14px, weight 400){colors.ink} (#F7F8F8){typography.label} (14px, weight 400)1px solid border on focus; color derived from surface tone{rounded.md} (6px) to {rounded.lg} (8px)outline: 2px solid var(--color-accent) with border-radius adjustmentopacity: 0.5rgba(0, 0, 0, 0) (transparent; inherits canvas){colors.ink} (#F7F8F8){typography.nav} (13px, weight 400){rounded.none} (0px)color: var(--color-text-primary); backgroundColor: rgba(255, 255, 255, 0.04)color: var(--btn-highlight-color) (typically brand accent or emphasis color){colors.canvas} (#08090A){colors.ink} (#F7F8F8)1px solid #232529 (rgb(35, 37, 42)){typography.body-md} (14px, weight 400)rgba(255, 255, 255, 0.07){colors.body} (#D0D6E0)2px 5px 2px 4px (minimal){typography.body-sm} (13px, weight 400)1px solid rgba(255, 255, 255, 0.08){rounded.xs} (3px)rgba(255, 255, 255, 0.05) or rgb(28, 28, 29) (filled variant){colors.body} (#D0D6E0)0px 6px 0px 4px{typography.caption-xs-strong} (12px, weight 510)1px solid rgba(255, 255, 255, 0.08){rounded.sm} (4px){colors.muted} (#8A8F98)0px 4px 0px 8px{typography.caption-xs-strong} (12px, weight 510){rounded.full} (9999px){colors.ink} (#F7F8F8){typography.body-md} (14px, weight 400)color: var(--color-text-tertiary); backgroundColor: rgba(39, 44, 48, 0.75) (subtle background, muted text)color: var(--color-text-tertiary)outline: 2px solid var(--color-accent){colors.muted} (#8A8F98){typography.body-sm} (13px, weight 400)0px 12px 0px 12px{rounded.full} (9999px)color: var(--color-text-primary)The spacing system uses an 4px base unit with a logarithmic scale designed for rhythm and breathing room:
{spacing.xxs} = 4px — Micro-spacing: adjacent inline elements, icon-to-text{spacing.xs} = 8px — Extra-small: adjacent components, condensed layouts{spacing.sm} = 12px — Small: default gap between sections, compact cards{spacing.md} = 16px — Medium: default padding within containers, standard gap{spacing.lg} = 20px — Large: gap between component groups, breathing room{spacing.xl} = 24px — Extra-large: section separation, card padding{spacing.xxl} = 28px — Double extra-large: header/footer zones{spacing.xxxl} = 32px — Triple extra-large: generous gutters, featured content{spacing.section} = 40px — Section block: vertical spacing between major sections{spacing.band} = 48px — Band / hero: largest vertical rhythm unitUsage Context:
{spacing.md} padding; featured cards to {spacing.xl} and {spacing.xxxl}{spacing.xxl} (28px) for vertical balance{spacing.lg} to {spacing.section} between blocks{spacing.sm} to {spacing.md} for internal spacing{spacing.md}){spacing.xxl})The system embraces negative space as a design principle. Whitespace is deployed:
{spacing.section} to {spacing.band} (40–48px) creates visual separation without visual division{spacing.md} padding with a single border (1px hairline) provides micro-elevationWhitespace is never wasted; it always serves to clarify hierarchy or focus attention.
{rounded.none} = 0px — Sharp, full-bleed containers; footer, sections{rounded.xs} = 3px — Micro-radius; badges, small affordances{rounded.sm} = 4px — Small radius; input fields, small cards{rounded.md} = 6px — Medium radius; avatars, moderate cards{rounded.lg} = 8px — Large radius; buttons, significant containers{rounded.xl} = 9px — Extra-large; card default (card: 9px measured){rounded.xxl} = 12px — Double extra-large; featured cards, modals{rounded.full} = 9999px — Pill/circle; buttons, icon buttons, badgesComponent Mapping (Measured):
{rounded.lg} (8px) or {rounded.full} (9999px) depending on variant{rounded.xl} (9px){rounded.lg} (8px){rounded.none} to {rounded.sm} (0–4px) for text/data badges; {rounded.full} for pill badges{rounded.md} (6px){rounded.full} or square (0px) depending on content1px — Used for card borders, input focus states, button strokes, and hairline dividers
1px solid rgba(255, 255, 255, 0.08)1px solid (typically border-color matches background)1px from shadow or border2px solid accent (derived from border, not the border-width scale itself)The system employs a color-blocking and micro-shadow strategy rather than dramatic elevation. Depth is primarily achieved through:
rgba(255, 255, 255, 0.08) borders define edges without hard lines#F7F8F8 (ink, headings) → #D0D6E0 (body) → #62666D (faint) creates depth through readability| Level | Treatment | Use |
|---|---|---|
| Flat / Base | No shadow; background only | Canvas, section backgrounds, full-bleed layouts |
| Card / Micro | rgba(0, 0, 0, 0.2) 0px 0px 0px 1px | Card default; hairline border with minimal depth cueing |
| Navigation / Subtle | rgba(0, 0, 0, 0.4) 0px 1px 0px 0px | Navigation bar bottom edge; barely perceptible lift |
| Button / Layered | 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 | Primary button; complex multi-layer shadow for depth and inner highlight |
Shadow Philosophy: The system rejects drop shadows in favor of inset bevels and hairline borders. This micro-elevation approach keeps the interface visually flat while providing tactile affordance and surface definition. Buttons are the exception: they carry a complex shadow stack (inset highlight + outer depth + soft falloff) to signal interactivity. All shadows use black with opacity variations (0.1–0.6) to preserve the dark theme's integrity.
Typical uses:
rgba(255, 255, 255, 0.08) (5% opacity on white)rgba(255, 255, 255, 0.16) (16% opacity)opacity: 0.5 (50% of full color)rgba(0, 0, 0, 0.5) to rgba(0, 0, 0, 0.8)Stacking Context: The system maintains a shallow z-index ladder because most interactive depth is managed via color and shadow rather than stacking order. Dropdowns sit at 50, sticky nav at 100, and true modals above 1000. This prevents z-index wars and keeps the layer ordering predictable.
#F7F8F8 → #D0D6E0 → #62666D) to create hierarchy and secondary information without additional contrast layers{rounded.full}) with tight negative letter-spacing on adjacent display text for a cohesive, forward-moving aesthetic#5E6AD2 and #828FFF) to links, hover states, and accent fills; keep the primary background/button fill white (#FFFFFF) or high-opacity white{spacing.md} (16px) as the default gap; deviations should be purposefulfilter: brightness() values; they are precise and non-negotiable{rounded.full} buttons with {rounded.none} inputs); consistency within component type is essential#5E6AD2) as a primary fill; reserve it for secondary emphasis and link underlines{spacing.sm} (12px) on interactive elements; click targets must remain at least 28px in height/width| Viewport (min-width) | Content Width | Grid Columns | Nav Visible Links | Menu Toggle | Display Size Largest | Body Size | Section Padding (x) |
|---|---|---|---|---|---|---|---|
| 375px (mobile) | 343px | 2 | 3 | Yes | {typography.display-sm} (40px) | {typography.body-md} (14px) | {spacing.md} (16px) |
| 768px (tablet) | 712px | 2 | 3 | Yes | {typography.display-sm} (40px) | {typography.body-md} (14px) | {spacing.xxl} (28px) |
| 1024px (small desktop) | 968px | 6 | 6 | Yes | {typography.display-sm} (40px) | {typography.body-md} (14px) | {spacing.xxl} (28px) |
| 1280px (desktop) | 1270px | 6 | 7 | Yes | {typography.display-lg} (64px) | {typography.body-md} (14px) | 10px |
| 1440px (large desktop) | 1344px | 6 | 7 | Yes | {typography.display-xl} (72px) | {typography.body-md} (14px) | 46px |
Transition Points:
Menu Toggle: A hamburger menu (not a collapse) appears at 375px and remains visible across all viewports. Navigation may reorganize internally but does not hide.
{spacing.sm} (12px) separation between interactive elements in dense layoutsButton & Link Sizing:
Mobile (375px):
Tablet (768px):
Small Desktop (1024px):
Desktop & Large Desktop (1280px+):
Images & Media:
{colors.primary} — #FFFFFF){colors.accent} — #5E6AD2){colors.link} — #828FFF){colors.canvas} — #08090A){colors.surface} — #0F1011){colors.ink} — #F7F8F8){colors.body} — #D0D6E0){colors.muted} — #8A8F98){colors.faint} — #62666D){colors.hairline} — #E5E5E6){colors.accent-1} (#23252A), {colors.neutral-1} (#161718) — use sparingly for tonal variation onlyRespect negative letter-spacing on all display/heading text — Every heading from 13px upward carries precise negative tracking (e.g., -0.13px at 13px, -1.58px at 72px). This is not ornamental; it defines density and motion.
Deploy the text color ramp, not contrast switches — Use the measured hierarchy (#F7F8F8 → #D0D6E0 → #62666D → #8A8F98 → #62666D) to signal priority. Never jump directly to white or black for emphasis.
Use hairline borders and micro-shadows only — Card and container depth comes from 1px solid rgba(255, 255, 255, 0.08) borders and minimal box-shadows (card: rgba(0, 0, 0, 0.2) 0px 0px 0px 1px). Drop shadows are forbidden except on primary buttons.
Buttons: white fill or high-opacity white background — Primary CTAs use #FFFFFF or rgba(255, 255, 255, 0.05). Reserve the brand purple for secondary emphasis and links, never primary button fills.
Pill-shaped buttons are mandatory for primary interactions ({rounded.full} = 9999px) — Small secondary buttons may use {rounded.lg} (8px), but CTAs must be pill-shaped. Icon buttons follow suit.
**Spacing defaults to {spacing.md} (16px) — Increase only for major section breaks ({spacing.section} = 40px, {spacing.band} = 48px). Never invent intermediate spacing; use the provided scale.
Grid is 2 columns mobile, 6 columns desktop — Mobile layouts collapse to single column; tablet stretches to 2. Desktop activates the 6-column grid. Do not force multi-column on mobile.
Apply filter: brightness() for hover/active states — Primary buttons: brightness(1.3) on hover, brightness(1.6) on active. This is more precise than color shifts and maintains the brand's minimalist aesthetic.
Inter Variable everywhere, Berkeley Mono for code only — Weight scales from 400 (body) to 590 (headings) with 510 as the button/accent weight. Never use serif fonts; monospace is reserved for <code> and pre-formatted text.
Responsive text scales progressively — 40px display at mobile/tablet, 64px at 1280px, 72px at 1440px. Body remains 14px across all breakpoints. Do not invent intermediate scaling; follow the measured progression.
Focus states: outline + context — Links and buttons on focus show outline: 2px solid var(--color-accent). Form inputs show the same. Do not hide focus rings; they are accessibility-critical.
Opacity for disabled and secondary states — Disabled buttons: opacity: 0.5. Secondary muted text: use the color ramp, not opacity reduction. Overlay/scrim backgrounds: rgba(0, 0, 0, 0.5) to rgba(0, 0, 0, 0.8).
No semantic color ramp — The site does not expose error (red), success (green), warning (orange), or info (blue) colors in its markup. Do not invent these; if the design requires status communication, use monochromatic opacity or text labels only.
Two decorative-only colours — {colors.accent-1} (#23252A) and {colors.neutral-1} (#161718) were measured but have no clear semantic role. They appear only in subtle tonal variations and decorative backgrounds. Treat them as optional tonal shifts, not as semantic placeholders.
No interaction states from stylesheets — The extraction captured hover/active/focus states from the site's CSS, but they vary widely depending on component type. Not every variant (button, link, input, nav) has a complete hover+active+focus set. Assume missing states follow the brightness/opacity pattern documented above; test edge cases (e.g., disabled inputs, invalid forms) in context.
Surfaces behind authentication not visited — The site has logged-in product features (workspace sidebar, issues detail, boards, etc.) that were not extracted. The public marketing pages, pricing, and customer stories were analyzed; the application core is out of scope.
No dark/light theme toggle observed — Linear.app displays a single dark theme. No light mode was measured or inferred. If the brand supports a light theme, it was not visible during extraction and is not documented here.
No animation or transition timings — The extraction captured static visual properties (color, size, shadow, radius) and interaction states (hover, active, focus) but not motion curves, durations, or transform animations. Animations observed (translateY, scale) are listed but timings (ms) and easing functions were not extracted.
No icon library or symbol definitions — Icon sizes and styles were observed in components (buttons, navigation) but the source icon set (name, asset, variants) was not catalogued. Assume icons are 16–24px, monochrome (inherit text color), and available as SVG or similar scalable format.
No typography fallback depth — Inter Variable is the primary font; the system assumes it loads successfully. If Inter fails, the fallback stack (-apple-system, BlinkMacSystemFont, Segoe UI, ...) is provided, but no system font rules or font-display strategies were extracted.
No grid system / layout library documented — The responsive grid (2→6 columns) was measured empirically; no CSS Grid or Flexbox source code was examined. Implement using modern layout tools (CSS Grid recommended for 6-column at desktop, Flexbox for mobile wrapping).
No component variant completeness — Not all components have full hover/active/focus/disabled sets. For example, badge and card states are minimal. Use the documented patterns (brightness, opacity, color ramp) to extrapolate missing states.
No loading, skeleton, or empty states — The site as captured did not display loading spinners, skeleton screens, or empty state illustrations. If these exist, they are not documented here.
This design system was extracted from Linear.app across 6 public pages (homepage, pricing, customers, product detail). Implementation should prioritize the colour ramp, negative letter-spacing, hairline borders, and responsive grid as the system's non-negotiable core. All values are measured and exact; deviations should be documented and justified.