Nautes Design System — Usage Guide
Version: 0.3.0
Last Updated: 2026-02-05
Direction: LIGHT MODE FIRST — NAVY + WARM CREAM
Source of Truth: tokens/nautes.json & DESIGN-LANGUAGE.md
Quick Reference
Design Philosophy
One sentence: Authority through restraint — quiet modernism where navy is the brand, warm cream is the canvas, and negative space holds equal weight to content.
Key principles:
- Earned Presence — Every element must justify its existence. If it does not serve the reader, it does not belong.
- Quiet Authority — Confidence expressed through restraint, not volume. Evidence over claims. Show, do not tell.
- Human Precision — Technical excellence that still feels warm. Nordic clarity with functional warmth.
Colors
Background Scale (Warm Cream)
| Token | Hex | Usage |
|---|---|---|
background.primary |
#FAF7F2 |
Page background — barely tinted warm white |
background.secondary |
#F0ECE3 |
Cards, elevated surfaces |
background.tertiary |
#E5E0D6 |
Hover backgrounds, active sections |
background.elevated |
#D8D2C6 |
Dropdowns, tooltips |
CSS Variables:
var(--background)
var(--background-secondary)
var(--background-tertiary)
var(--background-elevated)
Tailwind Classes:
bg-background
bg-secondary
bg-muted
Text Scale (Navy)
| Token | Hex | Usage |
|---|---|---|
text.primary |
#1E2B5A |
Main body text — deepest navy |
text.secondary |
#4A5575 |
Supporting text, captions |
text.muted |
#6E7694 |
Placeholders, hints |
text.inverted |
#FAF7F2 |
Text on navy backgrounds |
CSS Variables:
var(--foreground)
var(--foreground-secondary)
var(--foreground-muted)
var(--foreground-inverted)
Tailwind Classes:
text-foreground
text-muted-foreground
Accent (Navy = Brand)
| Token | Hex | Usage |
|---|---|---|
accent.default |
#2D3A6E |
Links, buttons, interactive elements — navy brand |
accent.hover |
#3D4D85 |
Hover state — slightly lighter navy |
accent.active |
#1E2B5A |
Pressed state — matches text.primary |
accent.muted |
#8B96BE |
Badges, subtle indicators, disabled interactive |
CSS Variables:
var(--primary)
var(--primary-hover)
var(--primary-active)
var(--accent)
var(--accent-muted)
Tailwind Classes:
bg-primary text-primary-foreground
bg-primary-hover
bg-accent text-accent-foreground
Key rule: Navy is both text and accent. Interactive elements are distinguished by treatment (underline, fill, weight change), not by using a different color.
Neutral Scale (Warm Undertones)
| Level | Hex | Usage |
|---|---|---|
| 50 | #FDFBF7 |
Lightest — barely tinted |
| 100 | #FAF7F2 |
Page background |
| 200 | #F0ECE3 |
Card surfaces |
| 300 | #E5E0D6 |
Borders, dividers |
| 400 | #C4BDB0 |
Muted borders |
| 500 | #9A9488 |
Disabled states |
| 600 | #706B62 |
Muted warm text |
| 700 | #4A5575 |
Secondary text (bridges to navy) |
| 800 | #2D3A6E |
Brand navy |
| 900 | #1E2B5A |
Primary text, deepest navy |
| 950 | #141D42 |
Near-black navy |
Tailwind Classes:
bg-neutral-100 (page background)
bg-neutral-200 (card surfaces)
text-neutral-900 (primary text)
border-neutral-300 (dividers)
Semantic Colors
| Token | Hex | Usage |
|---|---|---|
success |
#2D7D46 |
Confirmation, completion |
successLight |
#3A9A5A |
Success hover |
successDark |
#1F5E33 |
Success pressed |
warning |
#B87A1E |
Caution states |
warningLight |
#D49030 |
Warning hover |
warningDark |
#966315 |
Warning pressed |
error |
#C23B3B |
Errors, destructive actions |
errorLight |
#D54E4E |
Error hover |
errorDark |
#A02E2E |
Error pressed |
info |
#2D3A6E |
Informational (= accent.default) |
The 95/5 rule: A page should be almost entirely cream and navy. Semantic colors appear only in functional contexts (form validation, status indicators).
Typography
Font Philosophy
Typography is the primary design element. In quiet modernism, type does the work that decoration does in other systems. One typeface family (Barlow), used across its full range, creates the entire visual hierarchy. The drama comes from the contrast between condensed bold display and open regular body — not from mixing typeface families.
Font Families
| Token | Value | Usage |
|---|---|---|
font-display |
"Barlow Condensed", ui-sans-serif, system-ui, sans-serif |
Headlines, display text — condensed for impact |
font-body |
"Barlow", ui-sans-serif, system-ui, sans-serif |
Body text, UI elements — regular width for reading |
font-mono |
ui-monospace, "SFMono-Regular", Menlo, Monaco, Consolas, monospace |
Code, technical content |
Font Characteristics:
- Barlow Condensed (Variable, 100-900, italic): Geometric, low-contrast grotesk. Condensed proportions create impact without needing large sizes. Used at SemiBold (600) and Medium (500).
- Barlow (Variable, 100-900, italic): Same family in regular width. Warm, open letterforms for comfortable reading. Used at Light (300), Regular (400), and Medium (500).
Tailwind Classes:
font-display → Barlow Condensed (condensed sans-serif)
font-body → Barlow (regular sans-serif)
font-mono → System monospace
Google Fonts Import:
@import url('https://fonts.googleapis.com/css2?family=Barlow+Condensed:ital,wght@0,100..900;1,100..900&family=Barlow:ital,wght@0,100..900;1,100..900&display=swap');
Type Scale
System: Perfect Fourth (1.333 ratio) from 18px base, grid-snapped for 8px baseline alignment.
| Token | Size | Display LH | Prose LH | Usage |
|---|---|---|---|---|
text-xs |
0.625rem (10px) | 1rem (16px) | — | Fine print, labels (uppercase) |
text-sm |
0.875rem (14px) | 1.5rem (24px) | — | Labels, captions, nav |
text-base |
1.125rem (18px) | 2rem (32px) | 1.5rem (24px) | Body text default |
text-lg |
1.5rem (24px) | 2.5rem (40px) | 2rem (32px) | Large body, H5, H6 |
text-xl |
2rem (32px) | 3rem (48px) | — | H4 headings |
text-2xl |
2.5rem (40px) | 3.5rem (56px) | — | H3 headings |
text-3xl |
3.5rem (56px) | 4.5rem (72px) | — | H2 display |
text-4xl |
4.5rem (72px) | 5.5rem (88px) | — | H1 hero display |
Line Height Contexts
Display (default): Generous whitespace for headlines, hero text, marketing, and UI. Quiet modernism aesthetic. Ratio decreases as font size increases.
Prose: Tighter line heights (1.33 ratio) optimized for focused reading. Use for articles, essays, and long-form content.
<!-- Display context (default) -->
<p class="text-base">Marketing copy with generous line height.</p>
<!-- Prose context (articles) -->
<p class="text-base leading-prose-base">Article text with tighter line height.</p>
<p class="text-lg leading-prose-lg">Large article text.</p>
Tailwind utilities for prose:
leading-prose-base→ 1.5rem (24px) for 18px textleading-prose-lg→ 2rem (32px) for 24px text
Font Weights
Weights are fixed (not theme-aware). Maximum weight is 600 — no bold (700) in the system.
| Tier | Weight | Value | Usage |
|---|---|---|---|
| Display | SemiBold | 600 | H1, H2 headlines (Barlow Condensed) |
| Structural | Medium | 500 | H3, H4, H5, H6, navigation, buttons, labels |
| Reading | Regular | 400 | Body text default |
| Light | Light | 300 | Subtitles, hero supporting text, body light |
CSS Custom Properties:
var(--font-weight-light) /* 300 */
var(--font-weight-regular) /* 400 */
var(--font-weight-medium) /* 500 */
var(--font-weight-semibold) /* 600 */
Letter Spacing
Key insight: Barlow Condensed display uses negative letter-spacing for tight, editorial titling. Barlow body uses neutral or slightly positive spacing. Labels and overlines use wide spacing.
| Token | Value | Usage |
|---|---|---|
tracking-tighter |
-0.02em | H1 Barlow Condensed display |
tracking-tight |
-0.01em | H2, H3 Barlow Condensed |
tracking-normal |
0 | Body text, H4–H6 |
tracking-wide |
0.01em | Captions |
tracking-wider |
0.02em | Navigation, buttons |
tracking-widest |
0.08em | Labels, overlines (uppercase) |
Type Hierarchy
Full hierarchy combining family, weight, spacing, and size:
| Use | Family | Weight | Spacing | Size |
|---|---|---|---|---|
| H1 hero display | Barlow Condensed | 600 (SemiBold) | -0.02em | 72px (4xl) |
| H2 section heads | Barlow Condensed | 600 (SemiBold) | -0.01em | 56px (3xl) |
| H3 sub-sections | Barlow Condensed | 500 (Medium) | -0.01em | 40px (2xl) |
| H4 headings | Barlow | 500 (Medium) | 0 | 32px (xl) |
| H5–H6 small heads | Barlow | 500 (Medium) | 0 | 24px (lg) |
| Body text | Barlow | 400 (Regular) | 0 | 18px (base) |
| Body light | Barlow | 300 (Light) | 0 | 18px (base) |
| Navigation | Barlow | 500 (Medium) | 0.02em | 14px (sm) |
| Buttons | Barlow | 500 (Medium) | 0.02em | 16px |
| Labels, tags | Barlow | 500 (Medium) | 0.08em | 12px (xs, uppercase) |
| Captions | Barlow | 400 (Regular) | 0.01em | 14px (sm) |
Heading Classes
/* Barlow Condensed display + negative tracking */
h1: font-display text-3xl md:text-4xl font-semibold tracking-tighter /* 56px → 72px */
h2: font-display text-2xl md:text-3xl font-semibold tracking-tight /* 40px → 56px */
h3: font-display text-xl md:text-2xl font-medium tracking-tight /* 32px → 40px */
/* Barlow regular + neutral tracking */
h4: font-body text-lg md:text-xl font-medium tracking-normal /* 24px → 32px */
h5: font-body text-base md:text-lg font-medium tracking-normal /* 18px → 24px */
h6: font-body text-sm md:text-base font-medium tracking-normal /* 14px → 18px */
Mixed-Italic Headlines
Headlines can mix upright and italic text within the same line to create emphasis. The italic words keep the same weight (600 SemiBold) — differentiation comes from style alone.
<h1 class="font-display text-4xl font-semibold tracking-tighter">
Extend what <em class="italic">your team</em> can do
</h1>
Use italic for the human element, the key differentiator, or the action word. Never italicize more than half the headline.
Spacing
Base Unit: 8px
All spacing follows an 8px grid for visual consistency.
| Token | Value | Tailwind |
|---|---|---|
| 0.5 | 4px | p-0.5, m-0.5 |
| 1 | 8px | p-1, m-1 |
| 1.5 | 12px | p-1.5, m-1.5 |
| 2 | 16px | p-2, m-2 |
| 2.5 | 20px | p-2.5, m-2.5 |
| 3 | 24px | p-3, m-3 |
| 4 | 32px | p-4, m-4 |
| 5 | 40px | p-5, m-5 |
| 6 | 48px | p-6, m-6 |
| 7 | 56px | p-7, m-7 |
| 8 | 64px | p-8, m-8 |
| 9 | 72px | p-9, m-9 |
| 10 | 80px | p-10, m-10 |
| 12 | 96px | p-12, m-12 |
| 14 | 112px | p-14, m-14 |
| 16 | 128px | p-16, m-16 |
| 20 | 160px | p-20, m-20 |
| 24 | 192px | p-24, m-24 |
| 28 | 224px | p-28, m-28 |
| 32 | 256px | p-32, m-32 |
Layout Spacing
| Purpose | Mobile | Tablet | Desktop |
|---|---|---|---|
| Page gutters | 32px (p-4) | 48px (md:p-6) | 64px (lg:p-8) |
| Section gap (small) | 80px | 80px | 80px |
| Section gap (medium) | 96px | 128px | 128px |
| Section gap (large) | 128px | 192px | 192px |
| Card padding | 24px | 32px | 32px |
| Card gap | 16px | 24px | 24px |
Border Radius
| Token | Value | Usage |
|---|---|---|
rounded-none |
0px | Sharp edges |
rounded-sm |
4px | Subtle rounding |
rounded |
8px | Default (1 spacing unit) |
rounded-md |
12px | Medium rounding |
rounded-lg |
16px | Large components |
rounded-xl |
24px | Cards, modals |
rounded-2xl |
32px | Large cards |
rounded-full |
9999px | Circles, pills |
Shadows
Shadows are subtle — elevation comes primarily through spacing and borders, not heavy shadows.
| Token | Value | Usage |
|---|---|---|
shadow-sm |
0 1px 2px 0 rgb(0 0 0 / 0.05) |
Subtle lift |
shadow |
0 1px 3px 0 rgb(0 0 0 / 0.1), 0 1px 2px -1px rgb(0 0 0 / 0.1) |
Default elevation |
shadow-md |
0 4px 6px -1px rgb(0 0 0 / 0.1), 0 2px 4px -2px rgb(0 0 0 / 0.1) |
Cards, dropdowns |
shadow-lg |
0 10px 15px -3px rgb(0 0 0 / 0.1), 0 4px 6px -4px rgb(0 0 0 / 0.1) |
Modals, popovers |
Animation
Duration
| Token | Value | Usage |
|---|---|---|
duration-fast |
150ms | Color changes, opacity shifts |
duration-default |
200ms | Most state transitions |
duration-slow |
300ms | Layout shifts, content reveals |
duration-slower |
400ms | Page transitions, modal entries |
Easing
| Token | Value | Usage |
|---|---|---|
ease |
ease | Default timing |
ease-in |
ease-in | Elements exiting |
ease-out |
ease-out | Elements entering |
ease-in-out |
ease-in-out | Continuous motion |
Common Transitions
/* Standard hover transition */
transition: all 200ms ease;
/* Button hover */
.btn-interactive:hover {
transform: translateY(-1px);
}
/* Card hover */
.card-interactive:hover {
transform: translateY(-2px);
}
Motion rules: Maximum 2px translation, 2% scale. Respect prefers-reduced-motion: reduce. One property at a time where possible.
Breakpoints
| Token | Value | Usage |
|---|---|---|
sm |
640px | Small tablets |
md |
768px | Tablets |
lg |
1024px | Laptops |
xl |
1280px | Desktops |
2xl |
1440px | Large screens |
Container
- Max width: 1440px
- Prose max width: 65ch (optimal reading)
- Center aligned with responsive gutters
Component Patterns
Cards
<div class="bg-secondary border border-neutral-300 rounded-lg p-6 md:p-8
hover:border-primary/30 hover:shadow-sm transition-all">
<span class="font-body text-xs uppercase tracking-widest font-medium text-muted-foreground">
Category
</span>
<h3 class="font-display text-xl font-medium tracking-tight text-foreground">
Card Title
</h3>
<p class="font-body text-base text-foreground-secondary">
Description text goes here.
</p>
<a class="text-primary font-medium tracking-wider hover:underline transition-colors">
View Details
<svg class="inline-block w-4 h-4 ml-1">...</svg>
</a>
</div>
Buttons
<!-- Primary (navy background, cream text) -->
<button class="bg-primary text-primary-foreground hover:bg-primary-hover
active:bg-primary-active px-4 py-2 rounded font-medium
tracking-wider transition-all btn-interactive">
Button Text
</button>
<!-- Secondary (navy border, navy text) -->
<button class="bg-transparent text-primary border-[1.5px] border-primary
hover:bg-primary hover:text-primary-foreground
px-4 py-2 rounded font-medium tracking-wider
transition-all btn-interactive">
Button Text
</button>
<!-- Ghost (navy text, cream hover background) -->
<button class="bg-transparent text-primary hover:bg-muted
px-4 py-2 rounded font-medium tracking-wider
transition-all">
Button Text
</button>
Links
<!-- Navigation link -->
<a class="text-primary font-medium tracking-wider hover:underline transition-colors">
Link Text
</a>
<!-- Prose link (underline by default) -->
<a class="text-primary underline decoration-primary/30 hover:decoration-primary transition-colors">
Link Text
</a>
Future: Dark Mode
Note: Dark mode is deferred. Light mode (warm cream + navy) is the primary brand identity. Ship one mode well first.
When dark mode is added, the palette will invert:
background.primary→#1E2B5A(deep navy)text.primary→#FAF7F2(warm cream)accent.default→#8B96BE(lighter navy for visibility on dark)- Font weights shift lighter (body 300) to compensate for luminous screens
Design principle: Dark mode should maintain the Quiet Modernism identity. Navy backgrounds with warm cream text, not arbitrary dark grays.
Status: Dark mode token values TBD. Implementation follows light mode launch.
Usage Guidelines
DO
- Use semantic tokens (
bg-background,text-foreground) over raw colors - Maintain minimum 4.5:1 contrast ratio for text (all cream/navy combinations exceed this)
- Use the 8px grid for all spacing decisions
- Apply subtle hover states (1-2px lift, border opacity change)
- Let negative space breathe — aim for 60% negative space per viewport
- Use navy for both text and interactive elements, differentiating by treatment
- Keep to warm cream backgrounds — never cool grays or pure white
DON'T
- Use pure white (
#FFFFFF) or cool grays (#F5F5F5) for backgrounds - Use pure black (
#000000) for text — always use navy - Add competing accent colors — navy and cream are the entire palette
- Mix tokens from different semantic contexts
- Add unnecessary borders or decorative elements
- Use flashy animations or excessive motion (max 2px, max 200ms for most transitions)
- Crowd elements without adequate spacing
- Use font-bold (700) — maximum weight is semibold (600)
File Locations
Nautes Design System (Source)
| File | Purpose |
|---|---|
~/Hanlon/design/nautes/tokens/nautes.json |
Single Source of Truth |
~/Hanlon/design/nautes/tokens/dist/nautes.css |
Generated CSS custom properties |
~/Hanlon/design/nautes/tokens/dist/nautes.ts |
Generated TypeScript exports |
~/Hanlon/design/nautes/tokens/dist/nautes-tailwind.js |
Generated Tailwind config |
~/Hanlon/design/nautes/research/ |
Design research and references |
hanlon.agency Website (Synced)
| File | Purpose |
|---|---|
~/Projects/hanlon.agency/src/tokens/nautes.css |
CSS custom properties (synced) |
~/Projects/hanlon.agency/src/tokens/nautes.ts |
TypeScript exports (synced) |
~/Projects/hanlon.agency/src/tokens/nautes-tailwind.js |
Tailwind config (synced) |
~/Projects/hanlon.agency/tailwind.config.mjs |
Tailwind configuration |
PAI Art Integration
| File | Purpose |
|---|---|
~/Hanlon/design/nautes/nautes.ts |
CLI tool (build, sync, check, init, projects, pai, all) |
~/.claude/skills/_HANLON/tools/nautes-brand.json |
Brand data for Art skill |
~/.claude/skills/CORE/USER/SKILLCUSTOMIZATIONS/Art/PREFERENCES.md |
Art preferences |
Workflow
# After editing nautes.json, run:
bun ~/Hanlon/design/nautes/nautes.ts all
Version History
| Version | Date | Changes |
|---|---|---|
| 3.0.0 | 2026-02-05 | QUIET MODERNISM v3 — Complete direction change: light mode first, navy + warm cream palette. Barlow type system (Condensed display + regular body) replaces Cormorant Garamond + Work Sans. Negative letter-spacing for condensed display. Fixed weights (max 600, no theme-aware switching). Navy serves as both text and accent color. Warm undertone neutral scale. Muted light-appropriate semantic colors. Dark mode deferred. |
| 2.0.1 | 2026-01-22 | NAUT INFRASTRUCTURE — Migrated to Nautes Design System. Single source of truth (nautes.json), CLI tool for build/sync/pai, PAI Art integration. Updated file locations. |
| 2.0.0 | 2026-01-21 | VIOLET FORWARD PALETTE — Complete color overhaul. Deep purple-black base (#1A1625), soft violet accent (#A78BFA), purple undertones throughout neutral scale. Bold AI-forward positioning. |
| 1.3.0 | 2026-01-21 | Type scale: Perfect Fourth (1.333) from 18px base. Display vs Prose line heights. 8px baseline grid. |
| 1.2.0 | 2026-01-21 | Theme-aware font weights: dark mode (headline 400, body 300) / light mode (headline 500, body 400) |
| 1.1.0 | 2026-01-21 | Typography overhaul: Cormorant Garamond + Work Sans (variable fonts), positive letter spacing for serif headlines |
| 1.0.0 | 2026-01-21 | Initial dark mode first implementation |