Less, but better.
A design language for web and mobile products where content is the interface. Version 1.0, with tokens for CSS, Tailwind and Figma.
Design philosophy
Every pixel must earn its place. If removing an element does not reduce comprehension or capability, remove it.
Ship only what the task needs. Can it be deleted without loss?
Size, weight and opacity show importance, not decoration.
Space is a material. Spacing is systematic, never accidental.
One primary action, one accent, one idea per section.
No gradients, heavy shadows or ornaments. Borders only where space fails.
Decision order
- Remove it.
- Express it with space.
- Express it with type weight or opacity.
- Express it with a hairline.
- Only last, use color or elevation.
Spatial engine and layout
A 4pt base with an 8pt rhythm. Gaps communicate relationship: related items sit close, groups sit 4x apart, sections 8x or more.
Spacing scale
Breakpoints and dynamic padding
| Breakpoint | Min width | Gutter | Section padding | Columns |
|---|---|---|---|---|
| base | 0 | 16px | 64px | 4 |
| sm | 640px | 24px | 64px | 4 |
| md | 768px | 32px | 96px | 8 |
| lg | 1024px | 48px | 96px | 12 |
| xl | 1280px | 64px | 128px | 12 |
--gutter: clamp(1rem, 4vw, 4rem); --section-y: clamp(4rem, 10vw, 8rem); --measure: 65ch; --container: 72rem; --container-narrow: 40rem;
Layout rules
- Default to a single column; reading and forms use 40rem.
- Use a 12-column grid on desktop, collapse to one column below 768px. Never more than 4 content columns.
- Pair a narrow label column with a wide content column for editorial calm.
- Use a 1px hairline only where spacing fails. Never stack border, fill and shadow.
- Keep a strong left edge. Touch targets are at least 44 by 44px.
Typography and hierarchy
Inter for interface and body, with Newsreader as an optional editorial accent. Hierarchy comes from size, weight and opacity.
| Role | Primary | Alternatives |
|---|---|---|
| Sans | Inter | SF Pro, Neue Haas Grotesk, Roboto, Geist |
| Serif accent | Newsreader | Source Serif 4, Fraunces |
| Mono | JetBrains Mono | SF Mono, IBM Plex Mono |
Scale
Quiet confidence
Page title
Section title
Subsection title
Lead paragraphs sit slightly larger and calmer than body.
Default text. Keep measure between 55 and 75 characters.
Secondary text uses the secondary tone.
Meta and helper text never drop below AA contrast.
Weight and opacity
Use weights 400 and 500; allow 600 for one emphasis tier; never 700 or above. Three tones create depth: primary, secondary (about 70%) and tertiary (about 55%, never below AA). Large type tightens tracking, small type loosens it.
Color and surface
A warm monochrome foundation and exactly one accent. Surfaces are flat: no gradients, glass or textures, and never more than two levels visible at once.
Neutral foundation (light, with dark values)
#FFFFFF / #0B0B0A
#FAFAF8 / #0F0F0E
#F4F4F1 / #171716
#EAEAE6 / #1F1F1E
#D9D8D3 / #2B2B29
#9A9892 / #6F6E69
#6B6A66 / #9E9D98
#52514D / #B8B7B2
#141413 / #EDEDEA
Single accent
Reserved for the primary call to action, selected state, links, focus ring and progress. Pick one per product.
#2B4EFF, hover #1F3BD9
tint #EEF1FF, dark #7C93FF
#3E6B55, hover #2F5742
tint #EEF4F0, dark #8FBFA4
fill #F59E0B, text #B45309
tint #FFF7E6, dark #FBBF24
#C62828, dark #FF8A80
Always with icon or text
Tokens
:root {
--bg:#FAFAF8; --surface:#FFFFFF; --surface-tint:#F4F4F1;
--border-subtle:#EAEAE6; --border-strong:#D9D8D3;
--text-primary:#141413; --text-secondary:#52514D; --text-tertiary:#6B6A66;
--accent:#2B4EFF; --accent-hover:#1F3BD9; --accent-tint:#EEF1FF; --on-accent:#FFFFFF;
}
Surface rules
- Flat planes only.
- At most two surface levels visible at once.
- Separate with space, then a hairline, then a tint. Elevation last.
- Images carry color; chrome stays neutral.
Interactive components
Radius is 6px for controls and 10px for containers, with one 1px border weight. Shadows appear only on overlays.
Buttons
Sizes are 32, 40 and 48px high. One primary per view. Labels use sentence case and weight 500.
Cards
Borderless by default
Hover shifts the hairline. Nothing lifts or scales.
Flat variant
Separated by space alone, with no border or fill.
Form controls
Modal, tooltip and overlays
Delete project?
This removes all files. You cannot undo this.
modal: 0 8px 32px rgba(20,20,19,.08), 0 1px 2px rgba(20,20,19,.04) radius 10px scrim rgba(20,20,19,.4), no blur dark mode: replace shadow with a 1px --border-strong hairline
Motion
Motion explains cause and effect; it never entertains. Animate only opacity, transform and color. No bounce, parallax or looping decoration.
| Token | Value | Use |
|---|---|---|
| duration-instant | 100ms | Opacity shifts, press feedback |
| duration-base | 150ms | Color, border, background |
| duration-slow | 200ms | Overlay enter, accordion |
| ease-out | cubic-bezier(0.2, 0, 0, 1) | Enter and most transitions |
| ease-in | cubic-bezier(0.4, 0, 1, 1) | Exit, 100 to 150ms |
@media (prefers-reduced-motion: reduce) {
*, *::before, *::after { animation-duration: .01ms !important; transition-duration: .01ms !important; }
}
Accessibility
Light, quiet typography is minimalism's biggest accessibility risk. These minimums are mandatory in both themes.
| Content | AA | AAA | Token |
|---|---|---|---|
| Body and UI text | 4.5:1 | 7:1 | text-primary, text-secondary |
| Tertiary and helper text | 4.5:1 | n/a | text-tertiary, never lighter |
| Large text (24px+ or 18.66px bold) | 3:1 | 4.5:1 | any text token |
| Input borders, focus ring, icons | 3:1 | n/a | border-strong, accent |
| Decorative hairlines | exempt | n/a | border-subtle |
Rules
- Never use weight below 400; 300 or lighter is prohibited below 24px.
- Text below 14px must meet 4.5:1.
- Do not dim text with opacity; use the tertiary token.
- Never convey state by color alone.
- Keep focus always visible: 2px accent ring with 2px offset.
- Support 200% zoom, reflow at 320px, keyboard order and focus trapping in modals.
- Honor reduced motion and avoid flashing above 3 times per second.
Figma tokens
Three tiers: primitive, semantic, component. Light and dark modes swap the semantic layer. Name tokens category/role/variant/state, for example color/text/secondary or motion/duration/base. Bind auto-layout spacing to variables so the grid is enforced by construction.
The Minimalism audit
Before shipping a screen, answer yes to all of these. A no is a defect, not a preference.
- Is there a single, obvious primary action?
- Is the accent used only for action, selection, links and focus?
- Could any border, fill, shadow or icon go without loss of meaning?
- Does every spacing value come from the scale?
- Do all text and UI elements meet the contrast table?
- Are there at most two weights and one serif accent?
- Do transitions stay within 100 to 200ms and respect reduced motion?