Enforce a precise, minimal design system inspired by Linear, Notion, and Stripe. Use this skill when building dashboards, admin interfaces, or any UI that needs Jony Ive-level precision - clean, modern, minimalist with taste. Every pixel matters.
Premium, crafted UI for developers and translation managers. Every interface should look designed by a team that obsesses over 1-pixel differences.
Philosophy: Restraint, precision, intentionality. "Expensive" is conveyed through what you DON'T add.
Lingx blends Warmth & Approachability with Utility & Function:
| Aspect | Decision | Rationale |
|---|---|---|
| Personality | Warm-utility hybrid | Developers want density; managers want approachability |
| Foundation | Lavender-tinted backgrounds | Distinctive, memorable, not generic gray |
| Accent | Soft purple primary | Creativity, distinctiveness |
| Layout |
| Islands/bento on tinted bg |
| Floating cards create depth |
| Navigation | Persistent sidebar | Multi-section app with many destinations |
| Typography | Geist (geometric sans) | Modern, clean, developer-focused |
| Depth | Subtle shadows (light) / color shifts (dark) | Soft lift without complexity |
DO NOT reconsider these decisions. Apply them.
| Token | Light | Dark | Usage |
|---|---|---|---|
bg-background | #E8E6EF lavender-tint | #0D0D0D near-black | Page background |
bg-card | #FFFFFF | #1A1A1A | Islands, cards |
text-foreground | #242424 | #FFFFFF | Primary text |
text-muted-foreground | #6B6B6B | #A0A0A0 | Secondary text |
primary | #7C6EE6 | #9D8DF1 | Buttons, links, focus |
border | rgba(0,0,0,0.06) | rgba(255,255,255,0.06) | Card borders |
| Status | Color | Background | Usage |
|---|---|---|---|
| Missing | destructive coral | destructive/10 | No translation |
| Draft | warning amber | warning/10 | Needs review |
| Reviewed | info blue | info/10 | Ready, not published |
| Complete | success green | success/10 | Published |
--accent-warm) only for secondary CTAsAll spacing uses 4px increments. Use Tailwind scale:
| Size | Pixels | Tailwind | Usage |
|---|---|---|---|
| xs | 4px | p-1, gap-1 | Icon gaps, micro spacing |
| sm | 8px | p-2, gap-2 | Within components |
| md | 12px | p-3, gap-3 | Between related elements |
| base | 16px | p-4, gap-4 | Section padding |
| lg | 24px | p-6, gap-6 | Between sections |
| xl | 32px | p-8, gap-8 | Major separation |
Symmetrical padding required. p-4 or px-4 py-3 (when horizontal needs room). Never pt-6 pb-2 px-4.
| Element | Height | Radius | Class |
|---|---|---|---|
| Buttons | 44px | 12px | h-11 rounded-xl |
| Inputs | 44px | 12px | h-11 rounded-xl |
| Small buttons | 36px | 12px | h-9 rounded-xl |
| Large buttons | 48px | 12px | h-12 rounded-xl |
| Icons in buttons | 18px | - | size-4.5 |
| Cards/Islands | - | 12px | rounded-xl |
| Modals | - | 16px | rounded-2xl |
| Badges/Pills | - | 9999px | rounded-full |
// Always use .island class for card containers
<div className="island space-y-4 p-6">{/* content */}</div>
The .island class provides:
bg-card backgroundrounded-xl border radiusborder border-border (dark mode)import {
Form,
FormControl,
FormField,
FormItem,
FormLabel,
FormMessage,
} from '@/components/ui/form';
<Form {...form}>
<FormField
control={form.control}
name="fieldName"
render={({ field }) => (
<FormItem>
<FormLabel>Label</FormLabel>
<FormControl>
<Input {...field} /> {/* h-11 rounded-xl built-in */}
</FormControl>
<FormMessage /> {/* Auto error icon */}
</FormItem>
)}
/>
</Form>;
Use mode: 'onTouched' in useForm for errors after blur.
font-sans)font-mono)| Element | Size | Weight | Tracking |
|---|---|---|---|
| Page title | text-2xl (32px) | font-semibold | -tracking-tight |
| Section heading | text-xl (24px) | font-semibold | -tracking-tight |
| Card title | text-lg (18px) | font-medium | - |
| Body | text-base (16px) | font-normal | - |
| Secondary | text-sm (14px) | font-normal | - |
| Label/caption | text-xs (12px) | font-medium | - |
| Stats/numbers | text-4xl (40px) | font-semibold | tabular-nums |
font-mono text-smfont-mono tabular-numstabular-nums for alignment// Staggered fade-in for page content
<div className="animate-fade-in-up stagger-1">First element</div>
<div className="animate-fade-in-up stagger-2">Second element</div>
<div className="animate-fade-in-up stagger-3">Third element</div>
// ... up to stagger-6
| Type | Duration | Easing |
|---|---|---|
| Micro (hover, focus) | 150ms | ease-out |
| Standard | 200ms | ease-out |
| Large (modals, panels) | 250ms | --ease-out-expo |
.card-hover for elevation on hoverUse lucide-react (included via shadcn).
import { Plus, Settings, ChevronRight } from 'lucide-react';
<Button>
<Plus className="size-4.5" />
Add Key
</Button>;
Rules:
size-4.5 (18px)CRITICAL: Lingx uses Tailwind v4. Avoid v3 syntax errors:
| v3 (OLD) | v4 (USE THIS) |
|---|---|
bg-gradient-to-r | bg-linear-to-r |
shadow-black/[0.03] | shadow-black/3 |
bg-opacity-50 | bg-black/50 |
w-[200px] | w-50 (prefer scale) |
w-[800px] h-[800px] | size-200 |
| separate w/h for same value | size-{n} combined |
Spacing scale: value × 4px (e.g., w-50 = 200px, size-200 = 800px)
<div className="space-y-6">
{/* Page header */}
<div className="flex items-center justify-between">
<h1 className="text-2xl font-semibold -tracking-tight">Page Title</h1>
<Button>
<Plus className="size-4.5" />
Action
</Button>
</div>
{/* Stats row */}
<div className="grid grid-cols-4 gap-4">
<StatCard />
<StatCard />
<StatCard />
<StatCard />
</div>
{/* Main content island */}
<div className="island p-6">{/* content */}</div>
</div>
<div className="island animate-fade-in-up stagger-1 p-6">
<div className="flex items-center justify-between">
<span className="text-muted-foreground text-sm">Label</span>
<ArrowUpRight className="text-muted-foreground size-4" />
</div>
<div className="mt-2 text-4xl font-semibold tabular-nums">42,847</div>
<div className="text-success mt-1 flex items-center gap-1 text-sm">
<TrendingUp className="size-3.5" />
<span>12% vs last week</span>
</div>
</div>
Don't leave empty space. Options:
shadow-2xl, shadow-[0_25px_50px...])rounded-2xl on buttons)bg-card)<select>, <input type="date">)// Standard island
<div className="island p-6 space-y-4 animate-fade-in-up">
// Button with icon
<Button className="h-11"><Plus className="size-4.5" />Label</Button>
// Input
<Input className="h-11 rounded-xl bg-card" />
// Muted text
<span className="text-sm text-muted-foreground">Secondary info</span>
// Translation key
<code className="font-mono text-sm">namespace.key</code>
// Status badge
<Badge variant="success">Complete</Badge>
// Stats number
<span className="text-4xl font-semibold tabular-nums">1,234</span>
// Section spacing
<div className="space-y-6">
// Grid of cards
<div className="grid grid-cols-1 md:grid-cols-2 lg:grid-cols-4 gap-4">
For developer-facing features, leverage familiar patterns:
| Pattern | Usage |
|---|---|
| Diff view | Translation history, merge conflicts |
| Tree view | Namespace hierarchy |
| Command palette | Quick search (⌘K) |
| Monospace | Keys, code, API responses |
| Breadcrumbs | Nested navigation |
Balance familiarity with design system aesthetics.
Every interface should feel crafted, not generated. Premium is conveyed through:
The goal: intricate minimalism with warmth. Same quality bar as Linear, Stripe, Notion.