Skip to the page
Nitti Design System

Foundations

Nitti Intelligence and Polyther share every value on this page except the accent. Switch light and dark at the top right; everything follows.

Neutrals

Near-neutral greys with a trace of warmth. Areas separate by these fills, not by outlines; text clears 7:1 against the page.

--background
Page
--card
Tiles, cards
--popover
Menus, dialogs
--muted
Quiet fills
--input
Fields
--secondary
Tonal buttons
--muted-foreground
Secondary text
--foreground
Text

Accents

The only values that differ by brand. Filled accent always carries text at 7:1 or better.

Nitti Intelligence
--primary
Filled actions
--ring
Focus
--link
Links on the page
--chart-1
First data series
--chart-1-line
The same, as a line or a dot
Polyther
--primary
Filled actions
--ring
Focus
--link
Links on the page
--chart-1
First data series
--chart-1-line
The same, as a line or a dot

Status

Each status pairs a reading colour with a quiet surface, used together.

Destructive
Success
Warning
Info

Typography

Instrument Serif sets the page: titles, greetings, the first line someone reads. Geist carries everything else. Mono is for data only, never for navigation or labels.

Display
Instrument Serif · text-display · 48–84px
Politics, in plain words.
Headline
Instrument Serif · text-headline · 36–52px
Wrapping up the day, Elin?
Title
Instrument Serif · text-title · 28–36px
Responses: the grid permit inquiry
Heading
Geist Medium · text-xl
Responses by organisation
Body
Geist · text-base · 1.625
On Monday you have the weekly meeting at 09:00. The Slack question about 60-day payment terms is still unanswered, and two new consultation responses arrived overnight.
Interface
Geist · text-sm / medium for labels
Front desk · Workrooms · Documents · Sites
Data
Geist Mono · tabular · times, ids, counts
17:27 → 17:37 · ref 41/26 · 8,386,115

Surfaces

Three levels, told apart by fill and, for what floats, by shadow.

background
card
popover · shadow-overlay
Menus, dialogs and anything that floats.

Radius

Soft, consistent corners from one --radius of 12px.

md
Menu items
lg
Toggles
xl
Fields, menus
2xl
Cards, tiles, dialogs
full
Buttons, tabs

Sizes

One scale of heights for everything that can share a row: buttons, toggles, avatars, fields. The same name is the same height in every component, so a row is built by giving its parts one size. A status in such a row is a dot with its word (Status), not a filled pill: a pill would be one more shape at one more height, and would look like something to press. Badge stays for labels inside content.

xs · 28 px
Dense places: inside a card, a table row
Draft
VSAL
sm · 32 px
Bars and toolbars; the usual size beside text
Draft
VSAL
default · 36 px
Forms and the main action of a view
Draft
VSAL
lg · 44 px
Touch-first and marketing
Draft
VSAL

Lists in menus

Every menu, picker, select and command palette uses one anatomy, so a heading never reads as one more row. Weight belongs to the heading; rows are regular. Set once in globals.css as list-label, list-title and list-note.

Most capable
GPT-6 LunaOpenAI
Claude Opus 5.5Anthropic
Mode
AutoActs on what you ask, and asks when it is unsure.
PlanThinks the work through and shows a plan first.
list-label
A group's heading: 12 px, medium, muted, with 10 px of air above and 5 px below. It takes the same side padding as its rows, so it lines up with them.
list-title
A row's name: 14 px, regular, in the text colour. Never bold; the chosen row is marked by a fill and a check, not by weight.
list-note
The line under a name saying what it means: 13 px, regular, muted. Extra facts about a row (who serves a model, a shortcut) sit at its right edge in 12 px muted.

Motion

Three curves and three durations (160, 280, 460ms) in CSS, for entrances, hovers and loops. Anything that follows the pointer or makes room uses Motion for React with the same feel as named springs (makeRoom, settle, lift, snap in lib/motion), so a move that is interrupted carries its speed on. Under reduced motion every movement becomes an immediate change.

ease-ios
Moving into place, making room. iOS's own curve: quick start, long settle.
ease-spring
Settling: a dropped widget, a toggle thumb. A 4% overshoot, no wobble.
ease-leave
Leaving: under way at once, easing out as it fades.