Skip to content

Ivory

White panels float on warm ivory: a capsule header, black pill buttons and coral kept to small marks.

  • Light by default
  • 35 colours · 14 type steps
  • Inspired by fish.audio
Use Ivory
localhost:3000

The same generated app in every design. Scroll inside the window to see the whole page.

What it is

Ivory sets rounded white panels on a warm ivory ground and lets the step between them do the dividing. A white header capsule floats at the top, and the hero sits in a warm tray with the product window inside it. Every button, badge and tab is a full pill, and the only strong fill is the near-black primary. Coral is kept for links, focus rings and one small dot in each eyebrow. One face, Onest, sets every heading and label in sentence case with no letter spacing.

Maintained by @agentic-studio in the open registry.

Best for

Creative tools, media and audio products, and calm consumer apps where the user's work should be the loudest thing on screen. It suits teams that want a quiet, premium feel more than a technical one.

Trade-offs

  • The step from ivory to white is about 1.1:1. On a washed-out screen or projector the panels flatten into one sheet.
  • One black and one coral leave little room for a brand colour. A product with a loud brand will fight the design.
  • Sentence case, zero tracking and soft warm greys make dense data screens calmer, but less scannable than a technical design.

Tokens

Generated from this design’s design.yaml, and shipped as CSS variables plus a Tailwind theme. Templates may use these names and nothing else.

Colours

Every colour token in design.yaml, grouped the way the system documents them. These are the light palette's values. The dark palette uses the same names with its own values, and tokens.css ships both.

Brand and accent

  • accent

    #bf3400

  • accent-1

    #ee5a30

  • accent-2

    #1c5c9c

  • accent-3

    #125444

  • accent-4

    #47007f

  • accent-5

    #ad5b00

  • accent-6

    #b8286f

  • accent-hover

    #9e2b00

  • accent-soft

    #fdede6

  • primary

    #0f0e0d

Surface

  • canvas

    #f5f3f1

  • hairline

    #ebe3e0

  • surface-card

    #f6f0ec

  • surface-dark

    #181514

  • surface-dark-elevated

    #262321

  • surface-soft

    #fdfbf9

  • surface-solid

    #ffffff

  • surface-strong

    #ebe3e0

Text

  • body

    #44403b

  • body-strong

    #2b2a29

  • ink

    #0f0e0d

  • muted

    #665f5a

  • muted-soft

    #928a85

  • on-accent

    #ffffff

  • on-dark

    #faf7f7

  • on-primary

    #ffffff

Semantic

  • error

    #ad322d

  • success

    #006d52

  • warning

    #944d00

Other

  • danger

    #ad322d

  • danger-soft

    #ffece8

  • error-soft

    #ffece8

  • primary-hover

    #2b2a29

  • success-soft

    #e3f6f0

  • warning-soft

    #fdf0dd

Type scale

Each token rendered at its real size, weight, line height and tracking. Specimens fall back to this site's typeface when the design's own face is not installed locally, so read the numbers, not the letterforms.

  • Ship faster

    Token
    display-xl
    Values
    3.75rem · 60px · 600 · lh 1.05 · ls 0
  • Ship faster

    Token
    display-lg
    Values
    3rem · 48px · 600 · lh 1.08 · ls 0
  • Ship faster

    Token
    display-md
    Values
    2.25rem · 36px · 600 · lh 1.12 · ls 0
  • Ship faster

    Token
    display-sm
    Values
    1.875rem · 30px · 600 · lh 1.2 · ls 0
  • Ship faster

    Token
    title-lg
    Values
    1.5rem · 24px · 600 · lh 1.3 · ls 0
  • Ship faster

    Token
    body-lg
    Values
    1.125rem · 18px · 400 · lh 1.6 · ls 0
  • Ship faster

    Token
    title-md
    Values
    1.125rem · 18px · 600 · lh 1.44 · ls 0.01em
  • Ship faster

    Token
    body-md
    Values
    1rem · 16px · 400 · lh 1.625 · ls 0
  • Ship faster

    Token
    title-sm
    Values
    1rem · 16px · 600 · lh 1.5 · ls 0
  • Ship faster

    Token
    body-sm
    Values
    0.875rem · 14px · 400 · lh 1.43 · ls 0
  • Ship faster

    Token
    button
    Values
    0.875rem · 14px · 500 · lh 1 · ls 0
  • Ship faster

    Token
    nav-link
    Values
    0.875rem · 14px · 400 · lh 1.43 · ls 0.02em
  • Ship faster

    Token
    caption
    Values
    0.75rem · 12px · 500 · lh 1.33 · ls 0
  • SHIP FASTER

    Token
    caption-uppercase
    Values
    0.6875rem · 11px · 600 · lh 1.45 · ls 0.05em

Typefaces

The families the generated Tailwind theme points at. A licensed face is named here even when the substitute below is what actually renders.

  • DisplayOnest, ui-sans-serif, system-ui, -apple-system, "Segoe UI", Roboto, sans-serif
  • BodyOnest, ui-sans-serif, system-ui, -apple-system, "Segoe UI", Roboto, sans-serif
  • MonoJetBrains Mono, ui-monospace, SFMono-Regular, "SF Mono", Menlo, Consolas, monospace

Spacing scale

Drawn at true size. These are the only gaps and paddings a generated repo is allowed to use.

  • xxs0.25rem · 4px
  • xs0.5rem · 8px
  • sm0.75rem · 12px
  • md1rem · 16px
  • lg1.5rem · 24px
  • xl2rem · 32px
  • xxl3rem · 48px
  • section6rem · 96px

Radius scale

Sample shapes at true corner radius. Buttons and inputs sit at the small end of this scale, feature cards at the large end.

  • xs0.375rem · 6px
  • sm0.5rem · 8px
  • md0.75rem · 12px
  • lg1rem · 16px
  • xl1.5rem · 24px
  • full9999px
  • pill9999px

Elevation

Shadow tokens on a neutral card, at true blur and spread.

  • inset0 0 #0000
  • lift0 4px 14px rgb(15 14 13 / 0.06), 0 0 0 1px rgb(15 14 13 / 0.03)
  • overlay0 4px 20px rgb(15 14 13 / 0.1), 0 0 0 1px rgb(15 14 13 / 0.03)
  • ring0 0 0 3px rgb(237 89 48 / 0.25)
  • soft0 0 #0000
  • xs0 1px 2px rgb(15 14 13 / 0.05)

DESIGN.md

Ships in your repo as DESIGN.md. The designer agent reads it before it may introduce a new visual pattern. This is the briefing, not a page about the briefing.

Ivory is white panels floating on a warm ivory sheet, with one black pill per section. Every piece on the page is a brighter white shape with big round corners, and the step from ivory to white does the dividing, not lines or shadows. A white capsule header floats at the top, the hero sits in a warm tray, and coral is kept to links, the focus ring and one dot in each eyebrow.

Read this before you add a screen, a component or a colour. The tokens live in src/app/globals.css, the faces in src/app/fonts.ts, the kit in src/components/ui/.

At a glance

ThemeLight native: an ivory canvas (#f5f3f1) with white cards and panels. Dark is a warm near-black ramp (#181514 canvas, #262321 cards), not an inversion.
TypeOnest for everything: headings at 600 with no tracking, body at 400, labels at 500, all in sentence case. JetBrains Mono for code, keys and ids only.
ColourWarm greys, one near-black primary (#0f0e0d) and one coral (#bf3400 for link text, #ed5930 for the ring and the dots). Status is deep green, amber and brick red on pale warm tints.
ShapeBig and round: 12px fields and menu items, 16px cards and menus, 20px trays and stat tiles, 24px page panels, and a full pill on every button, badge, tab and chip.
DepthFlat. Fill steps carry the page. Shadows sit only on things that float: the header capsule, menus, popovers, tooltips, toasts, dialogs and sheets.
SignatureA white header capsule floating 12px under the top edge, a hero in one warm 20px tray, and eyebrow chips that lead with a coral dot.

Principles

  1. White pieces on ivory: the fill step divides, never a line.
  2. Every button, badge, chip, tab and switch is a full pill.
  3. One black pill per view or section, beside a white outline pill.
  4. Coral is a mark, never a fill: links, the focus ring, eyebrow dots and chart series 1.
  5. Sentence case and zero tracking on every label.

Colour

Palette

TokenLightDarkRole
canvas (--background)#f5f3f1#181514The page floor
surface-soft#fdfbf9#1f1c1aSection bands, sidebars, table heads
surface-card (--muted)#f6f0ec#1f1c1aTinted fills: inactive tabs, hover rows, code
surface-strong#ebe3e0#120f0ePressed fills, progress tracks
surface-solid (--popover)#ffffff#2d2928Menus, selects, toasts: always opaque
card#ffffff#262321The card fill
surface-dark#181514#0f0e0dThe inverted panel
hairline (--border)#ebe3e0#34312fEvery border and divider
ink (--foreground)#0f0e0d#faf7f7Headings and primary text
body-strong#2b2a29#ebe3e0Emphasised body text
body#44403b#cabfbbRunning text
muted (--muted-foreground)#665f5a#a29793Secondary text, captions
muted-soft#928a85#7a716dPlaceholders, disabled text, icons at rest
primary#0f0e0d#faf7f7The action colour
accent (--accent-fill)#bf3400#f56138The saturated accent: links, the accent badge
accent-soft#fdede6#2e1a13The tint an accent label sits on
danger (--destructive)#ad322d#ef6f64Destructive actions and errors

success, warning and error each come with a -soft tint for the back of a badge or an alert: #006d52, #944d00 and #ad322d in light, #00ac82, #d88035 and #ef6f64 in dark.

Ivory's own variables, read by the landing hooks and the kit: --stage (#efe9e5 light, #1f1c1a dark), --mark (#ed5930 light, #f56138 dark).

How colour is used

  • Ink (#0f0e0d) fills the primary pill, the accent badge, checked controls and the progress bar. Near-white takes that role in dark.
  • Coral text (text-accent, #bf3400) marks links. The brighter coral (#ed5930) draws the focus ring and the eyebrow dots.
  • Text steps down a warm ladder: ink, body-strong, body, muted and muted-soft. Quiet a line by stepping down, never by lowering opacity.
  • The warm sunken tone (bg-surface-card, #f6f0ec) lives only inside white: icon tiles, table heads, hover rows. On the ivory canvas it vanishes.
  • Green, amber and brick red mark status only, as pale warm tints with the status colour as text or icon.

Charts

accent-1 to accent-6 (also chart-1 to chart-6) are six series colours ordered so neighbours stay distinguishable. Six series lead with coral, then blue, deep teal, violet, amber and rose. In dark they brighten to hold their edge on the near-black. Assign them in order; never let colour be the only way to tell two series apart.

Dark mode

The palette is declared twice in src/app/globals.css: light on :root, dark under @media (prefers-color-scheme: dark) and again on .dark, where the class wins in both directions. @theme inline points every utility at those variables, so bg-canvas is one class that follows the mode. src/lib/design.ts sets the theme a first visit opens in: light here, because Ivory is drawn in light first. The theme menu in the header offers light, dark and system and remembers the choice.

Type

Faces

  • Onest (font-display, font-body): headings and display type; running text and interface copy.
  • JetBrains Mono (font-mono): code, ids and tabular labels.

Onest is a round, open grotesque that stays friendly at 60px and clean at 12px, so one face carries headings, labels and body. JetBrains Mono has a tall x-height that sits level with Onest, and it only shows up in code, keys and ids.

Every face loads through next/font/google in src/app/fonts.ts: downloaded at build time and served from this app. Change a face there and here, together.

Scale

TokenSizeLineTrackingWeightUse
text-display-xl60px1.050600The hero headline, desktop
text-display-lg48px1.080600The hero headline, tablet
text-display-md36px1.120600Section headlines, the hero on phones
text-display-sm30px1.20600Section headlines on phones, big numbers
text-title-lg24px1.30600Page titles in the app
text-title-md18px1.440.01em600Card titles
text-title-sm16px1.50600Small headings, table titles
text-body-lg18px1.60400Lead paragraphs
text-body-md16px1.6250400Running text
text-body-sm14px1.430400Interface copy, table cells
text-caption12px1.330500Metadata, helper text
text-caption-uppercase11px1.450.05em600Eyebrows above headings
text-button14px10500Buttons
text-nav-link14px1.430.02em400Header and footer links

Rules: one h1 per page. Display sizes are for marketing pages; the app tops out at text-title-lg. Onest 600 with no tracking for headings: a 60px hero on wide screens (36px on phones), 30 to 36px section titles, 18px card titles. Body is 16px at 400 and interface text is 14px. Emphasis is weight, never slant: Onest has no italic.

Space and layout

  • Spacing tokens: xxs 4px, xs 8px, sm 12px, md 16px, lg 24px, xl 32px, xxl 48px, section 96px (the gap between landing sections).
  • Content sits in max-w-content (1280px) with px-md on phones and px-lg from sm up. Reading text stops at max-w-measure (672px).
  • Spacing steps are 4, 8, 12, 16, 24, 32 and 48px, with 96px between landing sections.
  • Marketing is generous: 64 to 80px inside a white panel, 12px ivory gaps between stat tiles and logo pills.
  • The app is compact: controls 32, 40 and 44px tall, table rows 48px, 14px interface text.
  • The header capsule, the hero tray and every page panel line up on one content column, 16px from the screen edge on phones.

Shape and depth

TokenValueWhere
rounded-xs6pxBreadcrumb, Checkbox, Kbd
rounded-sm8pxAccordion, the landing page
rounded-md12pxDropdownMenu, Input, Select, Skeleton, Tabs, Tooltip, the landing page
rounded-lg16pxAlert, Card, DropdownMenu, Popover, Select, Table, Toaster, the landing page
rounded-xl24pxCard, the landing page
rounded-pill9999pxBadge, Button, Dialog, Input, Progress, Sheet, Switch, Tabs, Toaster, the landing page
rounded-full9999pxAvatar, RadioGroup, Switch

Radii are 6px on the checkbox and Kbd, 12px on fields and menu items, 16px on cards, menus and alerts, 20px on trays, stat tiles and the product window, 24px on page panels and sheets, and 28px on the dialog's outer tray. Borders are 1px solid warm lines that close a shape and never divide a page. Cards, panels, buttons and inputs carry no shadow; the header capsule, menus, popovers, tooltips and toasts take a soft lift, and dialogs and sheets a deeper one.

Components

Every component lives in src/components/ui/ and is written against the tokens above. Import from there; never restyle a kit component inline to make a one-off.

ComponentIn Ivory
ButtonA full pill in Onest 14px/500, sentence case, with a transparent 1px border so every variant matches in size, and a 1px press. Primary is the near-black pill with white text; secondary is a warm quiet pill; outline is the white pill with a warm line; ghost gets a faint ink wash on hover; danger is soft at rest and solid on hover; link is coral text. Sizes are 32, 40 and 44px tall, and the icon button is a 40px circle; large sets its label at 600 and never grows past 14px. Focus is a 2px coral outline, 2px clear.
BadgeA 24px pill with a 12px/500 label and no shadow. Neutral is a warm well with body text; accent is the one solid chip, black in light and near-white in dark; success, warning and danger are pale tints with status text. The uppercase mode (11px/600, 0.05em) is the only tracked capitals the kit writes.
Card16px corners and no shadow in any tone. Default is white with a warm hairline; soft is white with no line, carried by the step from ivory; strong is a warm well; outline is a stronger warm line with no fill; dark is warm charcoal. Large padding switches to 24px corners, because a big card is a panel.
Input, Textarea, Select40px white fields with 12px corners, a 1px warm line and 14px ink text. Focus turns the line coral with a 3px coral halo. An invalid field takes the danger line, and the danger halo on focus. The file button is a small sunken pill. Select content is a white menu with 16px corners, 12px items that highlight to the warm sunken tone, and an ink check.
Checkbox, RadioGroup, SwitchA 16px checkbox with 6px corners and a 16px radio circle, white with a warm grey line; checked fills with the primary (black in light, near-white in dark) and shows a tick or a 6px dot. The switch is a 36 by 20px pill, warm grey when off and primary when on, with a 16px knob that carries a tiny shadow. All three take the coral focus outline.
TabsDefault tabs are 32px pills in a 36px warm pill track; the active one is a white pill with a tiny shadow. Line tabs drop the track and mark the active tab with a 2px ink bar.
AccordionRows split by warm hairline seams, with none after the last. Triggers are 16px/500 ink with a muted chevron that turns 180 degrees; content is 14px body text.
Dialog, AlertDialog, SheetA dialog is a white body inside a 6px warm band with 28px outer corners, and its footer is split off by a 4px band of the same warm, so it reads as two white cards in one tray. The scrim is a light charcoal with a 4px blur. Alert dialogs pair the outline pill with the primary or danger pill. Sheets sit flush to the edge with 24px corners on the open side.
DropdownMenu, Popover, Select content, TooltipWhite surfaces with a warm hairline, 16px corners and a soft lift. Items are 12px rounded rows that highlight to the warm sunken tone; danger items are brick red. Tooltips are not inverted: a white chip with 12px corners, 12px/500 ink text and a white arrow.
TableSits on its own white surface. The head is a sunken warm band with 12px rounded ends and sentence-case 12px labels. Rows are 48px with seams inset 12px from both ends and none after the last. Figures use tabular numbers; ids and keys go in JetBrains Mono.
Alert16px corners, no border and no shadow, with a 16px icon in its own column. Info is a faint ink wash with an ink icon; success, warning and danger are pale tints with the icon in the status colour.
Avatar, Progress, Skeleton, Spinner, Separator, Kbd, Breadcrumb, Pagination, Field, Label, ToasterAvatars are circles at 24, 32 and 40px with a faint ink ring inside. Progress is a 6px pill with a black fill, never coral. Skeletons pulse a faint ink wash with 12px corners, and spinners take the label colour. Separators are 1px warm hairlines. Kbd is JetBrains Mono at 11px on the sunken tone with 6px corners. Breadcrumbs split with a muted chevron; pagination items are 40px pills and the current page is the white outline pill. Labels are 14px/500 ink; field help and errors are 12px. Toasts are white with a hairline and 16px corners, and show status only in the icon.

The landing page

The landing page is the same in every design; the design decides how it looks. Its sections carry data-slot hooks (listed at the top of src/components/marketing/section-heading.tsx) that globals.css may style. Ivory styles these:

  • site-header: a white capsule floating 12px under the top edge, inset to the content column, 56px tall, with the page's one soft shadow and no rule or blur.
  • site-nav: links are pills in body text that fill with the warm hover tone, in ink, on hover and on the current page.
  • brand-mark: a black circle at the capsule's left end.
  • hero-backdrop: one flat warm tray with 20px corners, 12px under the capsule, holding the headline, the buttons and the product window; hero leaves 48px of bare ivory under it.
  • hero-eyebrow and section-eyebrow: white sentence-case chips with muted 14px text, led by a 6px coral dot; inside a white panel the chip sinks to the warm sunken tone.
  • hero-title and section-title: plain ink with balanced lines; hero-subtitle holds a 36rem measure.
  • product-preview: a flat white window with 20px corners and a warm hairline, no shadow; a hero screenshot gets the same frame.
  • section: no rules between sections; how it works and any soft section become a white 24px panel on the ivory.
  • step and step-marker: the connector line goes, and markers are sunken circles with ink numerals.
  • showcase-visual: each picture sits on the same warm 20px tray as the hero.
  • feature-card and testimonial: white cards with no outline; feature-icon is a 12px sunken tile with an ink icon.
  • stat-grid and stat: separate white 20px tiles with 12px ivory gaps and tabular figures.
  • logo-cloud and logo: a quiet sentence-case title over a row of white 56px pills, 12px apart.
  • card (the featured plan): a 1px ink edge in place of the coral ring, flat.
  • faq: the questions sit in one white 24px panel split by warm seams, with none after the last.
  • cta-panel: flat warm charcoal with 24px corners, the page's one dark moment, with no wash, glow or shadow.
  • site-footer: the last white 24px panel, inset like the header and 16px off the bottom edge, with sentence-case column titles.

Everything else is type, space and the kit.

Signed-in screens

The dashboard sits on the ivory canvas beside a near-white sidebar, with white cards on warm hairlines, tables with a sunken head band and one black pill per screen.

Sign-in is one white card centred on the ivory, with 40px fields, a full-width black pill to submit, coral text links and social sign-in as white outline pills.

Do and don't

Do

  • Put white bg-card boxes on the bg-canvas ivory and let the fill step separate them.
  • Make every button, badge, chip, tab and switch a full pill (rounded-pill).
  • Use 12px corners on fields and menu items, 16px on cards and menus, 20px on trays and stat tiles, 24px on page panels.
  • Keep one black primary pill per view or section, beside a white outline pill.
  • Keep coral to links, the focus ring, eyebrow dots and chart series 1.
  • Write every label in sentence case: eyebrows, buttons, table heads, menu labels, footer titles.
  • Step down the text ladder (ink, body-strong, body, muted, muted-soft) to quiet a line. Never lower the opacity.
  • Use bg-surface-card only inside white surfaces (icon tiles, table heads, hover rows), where it reads as a warm sunken step.

Don't

  • Don't put a shadow on a card, panel, button or input. Shadows belong to things that float: menus, popovers, tooltips, toasts, dialogs, sheets and the header capsule.
  • Don't draw a rule between sections, under the header or above the footer. Use space or a fill step.
  • Don't fill a button, band, icon or heading with coral. Coral text is for links.
  • Don't uppercase or letter-space a label. The badge uppercase mode is the one exception in the kit.
  • Don't use a cool grey (zinc, slate, gray, neutral). Every neutral here leans warm.
  • Don't add a gradient, glow, blob, grid or pattern behind a headline.
  • Don't square off a control. Fields and menu items take 12px, buttons, tabs and chips are pills, and the 6px checkbox is the one small corner in the kit.
  • Don't outline a card in colour to feature it. Feature it with the black pill and the black badge.

Working in this design

Pasting from shadcn/ui. The token layer carries shadcn's variable names, so most snippets render unmodified. Two utility names mean something else here: bg-muted becomes bg-surface-card, and bg-accent / text-accent-foreground (a hover surface upstream) become bg-surface-card / text-ink. Here muted is a text colour and accent is the saturated accent.

Adding a token. Add it to all three palette blocks in globals.css (light, the dark media query, .dark), map it in @theme inline, and document it in the palette table above. Check contrast in both modes.

Adding a component. Check the kit first: most needs are a variant of Button, Card or Badge, or a composition on the page. A new component gets its own file in src/components/ui/, token classes only, a data-slot, and a row in the Components table here. The designer subagent owns this.

Build a repo in Ivory

The builder opens with Ivory picked. Pick your batteries and the design is applied to every template before the zip is built.