Anduril Design System
When invoked, apply these opinionated constraints for building better interfaces.
How to use
/anduril — Apply these constraints to any UI work in this conversation.
/anduril <file> — Review the file against all constraints and output violations, why it matters, and a concrete fix.
Design System: Anduril
Colors
Core Palette
/* Backgrounds */
--bg-black: #000000; /* Pure black - dark mode primary */
--bg-dark: #1a1a1a; /* Near black - dark mode secondary */
--bg-warm: #f5f3ef; /* Warm off-white - light mode primary */
--bg-white: #ffffff; /* Pure white - cards, inputs */
/* Text */
--text-primary: #010101; /* Near black */
--text-inverse: #ffffff; /* White on dark */
--text-muted: #666666; /* Secondary text */
--text-subtle: #999999; /* Tertiary text */
/* Brand Accent */
--accent-lime: #DFF140; /* Anduril signature lime - primary accent */
--accent-lime-hover: #c8d93a;
/* Semantic */
--color-error: #FF3535; /* Red - errors, destructive */
--color-error-bg: #fef2f2;
--color-success: #16a34a; /* Green - success states */
--color-success-bg: #f0fdf4;
--color-info: #2563eb; /* Blue - info, links */
--color-info-bg: #eff6ff;
--color-warning: #f59e0b; /* Amber - warnings */
--color-warning-bg: #fffbeb;
/* Borders */
--border-light: #e5e5e5;
--border-default: #ddd;
--border-dark: #333333;
Tailwind Config
colors: {
anduril: {
black: '#000000',
dark: '#1a1a1a',
warm: '#f5f3ef',
lime: '#DFF140',
'lime-hover': '#c8d93a',
}
}
Usage Guidelines
- Use
--accent-lime sparingly — one accent per view
- Dark mode:
--bg-black background, --accent-lime for CTAs
- Light mode:
--bg-warm background, --text-primary for CTAs
- NEVER use lime on light backgrounds (poor contrast)
- Reserve
--color-error for destructive actions only
Typography
- MUST use
'Helvetica Neue', Helvetica, Arial, sans-serif
- Base font size:
15px, weight: 400, line-height: 1.5
- Headers:
font-weight: 400 (never bold)
- Labels:
11px, uppercase, letter-spacing: 0.05em, color: var(--text-muted)
- Hero headings:
48px, font-weight: 400, line-height: 1.1
- Navigation/header text:
14px, uppercase, letter-spacing: 0.1em
Spacing
- Cards:
padding: 32px
- Main content:
padding: 48px, max-width: 1200px
- Header:
padding: 24px 48px
- Form elements:
margin-top: 16px between fields
Components
Cards
background: #ffffff
border: none — NO borders
border-radius: 0 — sharp corners always
- NO shadows
Buttons
background: var(--text-primary)
color: var(--text-inverse)
border: 1px solid var(--text-primary)
padding: 12px 24px
border-radius: 0 — sharp corners
font-weight: 400
- Hover:
opacity: 0.85
- Disabled:
opacity: 0.5
Inputs
padding: 10px 12px
border: 1px solid #ddd
border-radius: 0
- Focus:
border-color: var(--text-primary), no outline
Method badges
font-family: monospace
font-size: 11px
text-transform: uppercase
letter-spacing: 0.05em
padding: 4px 8px
- POST:
color: #2563eb; background: #eff6ff
- GET:
color: #16a34a; background: #f0fdf4
Response/code blocks
background: var(--bg-warm)
font-family: monospace
font-size: 12px
- Error state:
background: #fef2f2; color: #dc2626
- Success state:
background: #f0fdf4; color: #16a34a
Stack
- MUST use Tailwind CSS defaults unless custom values already exist
- MUST use
motion/react when JavaScript animation is required
- SHOULD use
tw-animate-css for entrance and micro-animations
- MUST use
cn utility (clsx + tailwind-merge) for class logic
Components
- MUST use accessible component primitives (
Base UI, React Aria, Radix)
- MUST use the project's existing primitives first
- NEVER mix primitive systems within the same surface
- MUST add
aria-label to icon-only buttons
- NEVER rebuild keyboard or focus behavior by hand
Interaction
- MUST use
AlertDialog for destructive actions
- SHOULD use structural skeletons for loading states
- NEVER use
h-screen, use h-dvh
- MUST respect
safe-area-inset for fixed elements
- MUST show errors next to where the action happens
- NEVER block paste in inputs
Animation
- NEVER add animation unless explicitly requested
- MUST animate only compositor props (
transform, opacity)
- NEVER animate layout props (
width, height, top, left, margin, padding)
- SHOULD use
ease-out on entrance
- NEVER exceed
200ms for interaction feedback
- MUST pause looping animations when off-screen
- SHOULD respect
prefers-reduced-motion
Typography
- MUST use
text-balance for headings, text-pretty for body
- MUST use
tabular-nums for data
- SHOULD use
truncate or line-clamp for dense UI
- NEVER modify
letter-spacing unless explicitly requested
Layout
- MUST use a fixed
z-index scale (no arbitrary z-*)
- SHOULD use
size-* for square elements
Performance
- NEVER animate large
blur() or backdrop-filter surfaces
- NEVER apply
will-change outside an active animation
- NEVER use
useEffect for render logic
Design — Anduril Style
Shape & Surface
- NEVER use border-radius — sharp corners only
- NEVER use shadows on cards
- NEVER use gradients
- NEVER use glow effects
- NEVER use purple or multicolor anything
Color Usage
- Light mode:
--bg-warm (#f5f3ef) background, dark buttons
- Dark mode:
--bg-black (#000000) background, lime accent CTAs
- MUST use
--accent-lime (#DFF140) for primary actions in dark mode only
- NEVER use lime on light backgrounds — use near-black instead
- SHOULD limit accent color to ONE per view
- Use semantic colors (
--color-error, --color-success) consistently
Typography
- MUST keep headers lightweight (
font-weight: 400)
- MUST use uppercase + letter-spacing for labels and nav
- NEVER use bold for headings
States
- MUST give empty states one clear next action
- Error states: red text (#FF3535), light red background (#fef2f2)
- Success states: green text (#16a34a), light green background (#f0fdf4)
- Disabled:
opacity: 0.5, cursor: not-allowed
1---2name: anduril3description: Opinionated constraints for building better interfaces with Anduril-style design.4---56# Anduril Design System78When invoked, apply these opinionated constraints for building better interfaces.910## How to use1112- `/anduril` — Apply these constraints to any UI work in this conversation.13- `/anduril <file>` — Review the file against all constraints and output violations, why it matters, and a concrete fix.1415---1617## Design System: Anduril1819### Colors2021**Core Palette**22```css23/* Backgrounds */24--bg-black: #000000; /* Pure black - dark mode primary */25--bg-dark: #1a1a1a; /* Near black - dark mode secondary */26--bg-warm: #f5f3ef; /* Warm off-white - light mode primary */27--bg-white: #ffffff; /* Pure white - cards, inputs */2829/* Text */30--text-primary: #010101; /* Near black */31--text-inverse: #ffffff; /* White on dark */32--text-muted: #666666; /* Secondary text */33--text-subtle: #999999; /* Tertiary text */3435/* Brand Accent */36--accent-lime: #DFF140; /* Anduril signature lime - primary accent */37--accent-lime-hover: #c8d93a;3839/* Semantic */40--color-error: #FF3535; /* Red - errors, destructive */41--color-error-bg: #fef2f2;42--color-success: #16a34a; /* Green - success states */43--color-success-bg: #f0fdf4;44--color-info: #2563eb; /* Blue - info, links */45--color-info-bg: #eff6ff;46--color-warning: #f59e0b; /* Amber - warnings */47--color-warning-bg: #fffbeb;4849/* Borders */50--border-light: #e5e5e5;51--border-default: #ddd;52--border-dark: #333333;53```5455**Tailwind Config**56```js57colors: {58 anduril: {59 black: '#000000',60 dark: '#1a1a1a',61 warm: '#f5f3ef',62 lime: '#DFF140',63 'lime-hover': '#c8d93a',64 }65}66```6768**Usage Guidelines**69- Use `--accent-lime` sparingly — one accent per view70- Dark mode: `--bg-black` background, `--accent-lime` for CTAs71- Light mode: `--bg-warm` background, `--text-primary` for CTAs72- NEVER use lime on light backgrounds (poor contrast)73- Reserve `--color-error` for destructive actions only7475### Typography76- MUST use `'Helvetica Neue', Helvetica, Arial, sans-serif`77- Base font size: `15px`, weight: `400`, line-height: `1.5`78- Headers: `font-weight: 400` (never bold)79- Labels: `11px`, `uppercase`, `letter-spacing: 0.05em`, `color: var(--text-muted)`80- Hero headings: `48px`, `font-weight: 400`, `line-height: 1.1`81- Navigation/header text: `14px`, `uppercase`, `letter-spacing: 0.1em`8283### Spacing84- Cards: `padding: 32px`85- Main content: `padding: 48px`, `max-width: 1200px`86- Header: `padding: 24px 48px`87- Form elements: `margin-top: 16px` between fields8889### Components9091**Cards**92- `background: #ffffff`93- `border: none` — NO borders94- `border-radius: 0` — sharp corners always95- NO shadows9697**Buttons**98- `background: var(--text-primary)`99- `color: var(--text-inverse)`100- `border: 1px solid var(--text-primary)`101- `padding: 12px 24px`102- `border-radius: 0` — sharp corners103- `font-weight: 400`104- Hover: `opacity: 0.85`105- Disabled: `opacity: 0.5`106107**Inputs**108- `padding: 10px 12px`109- `border: 1px solid #ddd`110- `border-radius: 0`111- Focus: `border-color: var(--text-primary)`, no outline112113**Method badges**114- `font-family: monospace`115- `font-size: 11px`116- `text-transform: uppercase`117- `letter-spacing: 0.05em`118- `padding: 4px 8px`119- POST: `color: #2563eb; background: #eff6ff`120- GET: `color: #16a34a; background: #f0fdf4`121122**Response/code blocks**123- `background: var(--bg-warm)`124- `font-family: monospace`125- `font-size: 12px`126- Error state: `background: #fef2f2; color: #dc2626`127- Success state: `background: #f0fdf4; color: #16a34a`128129---130131## Stack132133- MUST use Tailwind CSS defaults unless custom values already exist134- MUST use `motion/react` when JavaScript animation is required135- SHOULD use `tw-animate-css` for entrance and micro-animations136- MUST use `cn` utility (`clsx` + `tailwind-merge`) for class logic137138## Components139140- MUST use accessible component primitives (`Base UI`, `React Aria`, `Radix`)141- MUST use the project's existing primitives first142- NEVER mix primitive systems within the same surface143- MUST add `aria-label` to icon-only buttons144- NEVER rebuild keyboard or focus behavior by hand145146## Interaction147148- MUST use `AlertDialog` for destructive actions149- SHOULD use structural skeletons for loading states150- NEVER use `h-screen`, use `h-dvh`151- MUST respect `safe-area-inset` for fixed elements152- MUST show errors next to where the action happens153- NEVER block paste in inputs154155## Animation156157- NEVER add animation unless explicitly requested158- MUST animate only compositor props (`transform`, `opacity`)159- NEVER animate layout props (`width`, `height`, `top`, `left`, `margin`, `padding`)160- SHOULD use `ease-out` on entrance161- NEVER exceed `200ms` for interaction feedback162- MUST pause looping animations when off-screen163- SHOULD respect `prefers-reduced-motion`164165## Typography166167- MUST use `text-balance` for headings, `text-pretty` for body168- MUST use `tabular-nums` for data169- SHOULD use `truncate` or `line-clamp` for dense UI170- NEVER modify `letter-spacing` unless explicitly requested171172## Layout173174- MUST use a fixed `z-index` scale (no arbitrary `z-*`)175- SHOULD use `size-*` for square elements176177## Performance178179- NEVER animate large `blur()` or `backdrop-filter` surfaces180- NEVER apply `will-change` outside an active animation181- NEVER use `useEffect` for render logic182183## Design — Anduril Style184185**Shape & Surface**186- NEVER use border-radius — sharp corners only187- NEVER use shadows on cards188- NEVER use gradients189- NEVER use glow effects190- NEVER use purple or multicolor anything191192**Color Usage**193- Light mode: `--bg-warm` (#f5f3ef) background, dark buttons194- Dark mode: `--bg-black` (#000000) background, lime accent CTAs195- MUST use `--accent-lime` (#DFF140) for primary actions in dark mode only196- NEVER use lime on light backgrounds — use near-black instead197- SHOULD limit accent color to ONE per view198- Use semantic colors (`--color-error`, `--color-success`) consistently199200**Typography**201- MUST keep headers lightweight (`font-weight: 400`)202- MUST use uppercase + letter-spacing for labels and nav203- NEVER use bold for headings204205**States**206- MUST give empty states one clear next action207- Error states: red text (#FF3535), light red background (#fef2f2)208- Success states: green text (#16a34a), light green background (#f0fdf4)209- Disabled: `opacity: 0.5`, `cursor: not-allowed`