Skip to content

Peach

Heavy black headlines on peach paper, black buttons, one ember accent and hard block shadows.

  • Light by default
  • 35 colours · 14 type steps
  • Inspired by coda.io
Use Peach
localhost:3000

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

What it is

Peach sets heavy black headlines on cream paper and opens every marketing page with a full-width peach band. Actions are black, white cards sit on the cream with a warm hairline, and one ember orange marks eyebrows, links and focus. Its signature is the hard shadow: the product frame, the featured plan, the sign-in card and the closing panel cast a solid block with no blur, like cut paper. Menus, dialogs and toasts float on a soft shadow instead, so the blocks always read as print. Dark mode keeps the same desk at night: espresso paper, cream type, peach buttons and ember blocks.

Maintained by @agentic-studio in the open registry.

Best for

Docs, notes, planning and team workspace tools that want to feel friendly and sure of themselves. Also content-led products (newsletters, course sites, small studios) where one big headline carries the message.

Trade-offs

  • The peach band and cream canvas are a strong warm note. A cold, technical brand (security, infra, trading) will fight it.
  • Hard blocks are loud. Peach keeps them to the product frame, the showcase frames, the featured plan, the sign-in card and the closing panel, plus two tiny ones on the hero chip and the brand mark. Add more and the page turns into a sticker sheet.
  • Public Sans 850 at tight tracking wants short headlines: past about ten words at 72px it becomes a wall of ink. Ember text is deepened to #bc3e10 in light for contrast, so links read rustier than the vivid ember marks.

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

    #bc3e10

  • accent-1

    #ee5a29

  • accent-2

    #2b2b2b

  • accent-3

    #1981c1

  • accent-4

    #d0860b

  • accent-5

    #2f9467

  • accent-6

    #b0457c

  • accent-hover

    #a5350b

  • accent-soft

    #ffe6dc

  • primary

    #000000

Surface

  • canvas

    #fff6ec

  • hairline

    #e9dac9

  • surface-card

    #fee9d2

  • surface-dark

    #1a1511

  • surface-dark-elevated

    #2e2722

  • surface-soft

    #fff0dd

  • surface-solid

    #ffffff

  • surface-strong

    #f7dabd

Text

  • body

    #444444

  • body-strong

    #333333

  • ink

    #212121

  • muted

    #616161

  • muted-soft

    #8e8e8e

  • on-accent

    #ffffff

  • on-dark

    #fff6ec

  • on-primary

    #ffffff

Semantic

  • error

    #ba234c

  • success

    #267543

  • warning

    #945f0e

Other

  • danger

    #ba234c

  • danger-soft

    #ffe7e9

  • error-soft

    #ffe7e9

  • primary-hover

    #2b2b2b

  • success-soft

    #dcf7e2

  • warning-soft

    #fef2c5

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
    4.5rem · 72px · 850 · lh 1 · ls -0.047em
  • Ship faster

    Token
    display-lg
    Values
    3.25rem · 52px · 850 · lh 1.1 · ls -0.037em
  • Ship faster

    Token
    display-md
    Values
    2.375rem · 38px · 850 · lh 1.1 · ls -0.027em
  • Ship faster

    Token
    display-sm
    Values
    2rem · 32px · 800 · lh 1.1 · ls -0.02em
  • Ship faster

    Token
    title-lg
    Values
    1.5rem · 24px · 800 · lh 1.2 · ls -0.015em
  • Ship faster

    Token
    body-lg
    Values
    1.25rem · 20px · 400 · lh 1.45 · ls -0.01em
  • Ship faster

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

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

    Token
    title-sm
    Values
    1rem · 16px · 600 · lh 1.4 · ls -0.01em
  • Ship faster

    Token
    button
    Values
    0.9375rem · 15px · 600 · lh 1 · ls -0.01em
  • Ship faster

    Token
    nav-link
    Values
    0.9375rem · 15px · 600 · lh 1.4 · ls -0.01em
  • Ship faster

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

    Token
    caption
    Values
    0.8125rem · 13px · 400 · lh 1.4 · ls 0
  • SHIP FASTER

    Token
    caption-uppercase
    Values
    0.8125rem · 13px · 600 · lh 1.3 · 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.

  • DisplayPublic Sans, ui-sans-serif, system-ui, -apple-system, "Segoe UI", Roboto, sans-serif
  • BodyInter, ui-sans-serif, system-ui, -apple-system, "Segoe UI", Roboto, sans-serif
  • MonoIBM Plex 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.25rem · 4px
  • sm0.375rem · 6px
  • md0.5rem · 8px
  • lg0.75rem · 12px
  • xl1rem · 16px
  • full9999px
  • pill9999px

Elevation

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

  • insetinset 0 0 0 1.5px rgb(255 255 255 / 0.13)
  • lift8px 8px 0 0 #000000
  • overlay0 18px 36px -6px rgb(0 0 0 / 0.12), 0 6px 12px -6px rgb(0 0 0 / 0.1)
  • ring0 0 0 3px rgb(238 90 41 / 0.22)
  • soft4px 4px 0 0 #000000
  • xs0 0 #0000

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.

Peach is cut paper on a peach desk. Heavy black Public Sans headlines sit on cream paper under a peach band, actions are black, and one ember orange marks eyebrows, links and focus. Its signature is the hard shadow: the product frame, the featured plan, the sign-in card and the closing panel cast a solid block with no blur. Menus, dialogs and toasts float on a soft shadow instead, so the blocks always read as print.

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: cream paper (#fff6ec) under a peach band (#ffe6c8). Dark is the same desk at night: espresso paper, cream type, peach buttons and ember blocks.
TypePublic Sans 850 for headlines (72px at -0.047em) and 800 for titles down to 24px. Inter 400 and 600 for everything you read or click. IBM Plex Mono for code, keys and ids only.
ColourInk (#212121) type, black actions, warm tan hairlines and one ember: #ee5a29 for marks, #bc3e10 for text. Status colours mark status only.
Shape8px on buttons, inputs, cards and menus, 12px on large buttons, dialogs and frames, pills for badges, avatars, switches and progress.
DepthTwo kinds only: solid blocks with no blur (4px and 8px, black; ember in dark) for printed things, a soft two-layer shadow for things that float.
SignatureA peach masthead and hero band, and a white product frame with a 2px ink edge that drops an 8px block over the band's edge onto the cream.

Principles

  1. Ember is punctuation: eyebrows, ticks, underlines, the focus halo and one badge. Never a fill.
  2. Black is the only filled action in light, peach in dark. One primary button per view.
  3. Two kinds of depth: a solid block for printed things, a soft shadow for things that float. Never a blurred offset.
  4. Every block pairs with a line and falls down and to the right. One or two per view.
  5. The heavy face stops at 24px. Everything you read or click is Inter.

Colour

Palette

TokenLightDarkRole
canvas (--background)#fff6ec#150f0bThe page floor
surface-soft#fff0dd#1a140fSection bands, sidebars, table heads
surface-card (--muted)#fee9d2#251c16Tinted fills: inactive tabs, hover rows, code
surface-strong#f7dabd#372b22Pressed fills, progress tracks
surface-solid (--popover)#ffffff#1f1812Menus, selects, toasts: always opaque
card#ffffff#1c1610The card fill
surface-dark#1a1511#090604The inverted panel
hairline (--border)#e9dac9#372d25Every border and divider
ink (--foreground)#212121#fff6ecHeadings and primary text
body-strong#333333#eae1d8Emphasised body text
body#444444#d7cec3Running text
muted (--muted-foreground)#616161#b3a79bSecondary text, captions
muted-soft#8e8e8e#81756aPlaceholders, disabled text, icons at rest
primary#000000#ffe6c8The action colour
accent (--accent-fill)#bc3e10#ee5a29The saturated accent: links, the accent badge
accent-soft#ffe6dc#39150bThe tint an accent label sits on
danger (--destructive)#ba234c#f3798bDestructive actions and errors

success, warning and error each come with a -soft tint for the back of a badge or an alert: #267543, #945f0e and #ba234c in light, #63d18f, #f1bf5b and #f3798b in dark.

Peach's own variables, read by the landing hooks and the kit: --peach (#ffe6c8 light, #2f1b0e dark), --peach-line (#efceab light, #4d301f dark), --ember (#ee5a29 light, #ee5a29 dark), --block (#000000 light, #ee5a29 dark), --edge (#000000 light, #ffe6c8 dark).

How colour is used

  • Ink (#212121) carries headlines and labels. Black (bg-primary) is the only filled button in light; in dark it turns peach with espresso text.
  • Peach (--peach) is the band: the masthead, the hero, how it works, the footer, the showcase stages and the feature-icon discs. Its rules are --peach-line.
  • Ember (--ember, #ee5a29) draws marks: the eyebrow squares, the brand-mark block and the window dot. As text it is text-accent (#bc3e10 in light), which clears 4.5:1 on cream and on peach.
  • Reading text steps from text-body-strong (#333) to text-body (#444) to text-muted (#616161). muted-soft is for placeholders, disabled states and icons at rest.
  • Green, amber and red mark status only, as soft tints with the strong 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 ember, then ink, blue, amber, green and plum (ember, cream, sky, gold, mint and pink in dark). Ember always goes first and ink is the quiet second series. 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 Peach is drawn in light first. The theme menu in the header offers light, dark and system and remembers the choice.

Type

Faces

  • Public Sans (font-display): headings and display type.
  • Inter (font-body): running text and interface copy.
  • IBM Plex Mono (font-mono): code, ids and tabular labels (weights 400, 500).

Public Sans is variable, so headlines sit at a true 850: heavy, tight and sturdy without turning round or wide. Inter carries every word you read or click at plain weights so the display face leads, and IBM Plex Mono gives keys and ids a quiet typewriter feel.

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-xl72px1-0.047em850The hero headline, desktop
text-display-lg52px1.1-0.037em850The hero headline, tablet
text-display-md38px1.1-0.027em850Section headlines, the hero on phones
text-display-sm32px1.1-0.02em800Section headlines on phones, big numbers
text-title-lg24px1.2-0.015em800Page titles in the app
text-title-md18px1.35-0.01em600Card titles
text-title-sm16px1.4-0.01em600Small headings, table titles
text-body-lg20px1.45-0.01em400Lead paragraphs
text-body-md16px1.50400Running text
text-body-sm14px1.50400Interface copy, table cells
text-caption13px1.40400Metadata, helper text
text-caption-uppercase13px1.30.05em600Eyebrows above headings
text-button15px1-0.01em600Buttons
text-nav-link15px1.4-0.01em600Header and footer links

Rules: one h1 per page. Display sizes are for marketing pages; the app tops out at text-title-lg. Headlines are Public Sans 850 at 72, 52 and 38px with tight tracking (-0.047em to -0.027em), and 800 at 32 and 24px; the heavy face stops there. Titles, body, buttons, labels and nav are Inter 400 and 600 in sentence case, with caps only on caption-uppercase eyebrows. No type step renders in mono.

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).
  • A 4px grid: 4, 8, 12, 16, 24, 32 and 48px, with 96px between landing sections.
  • Comfortable density: cards pad 24px, controls are 40px tall and large calls to action 60px.
  • Hero copy and section headings sit left on the content edge like a magazine page. The logo strip, pricing and the closing panel stay centred.

Shape and depth

TokenValueWhere
rounded-xs4pxBreadcrumb, Checkbox, Kbd
rounded-sm6pxAccordion, DropdownMenu, Select, Tabs, Toaster, Tooltip, the landing page
rounded-md8pxAlert, Button, Card, Dialog, DropdownMenu, Input, Popover, Select, Sheet, Skeleton, Table, Tabs, Toaster, the landing page
rounded-lg12pxAlertDialog, Button, Dialog, the landing page
rounded-xl16pxThe landing page
rounded-pill9999pxBadge, Progress, Switch, the landing page
rounded-full9999pxAvatar, RadioGroup, Switch

Radii are 4px on checkboxes and keys, 6px on menu items, tabs and tooltips, 8px on buttons, inputs, cards and menus, and 12px on large buttons, dialogs and frames. Borders are always solid: a 1px warm hairline on cards and rows, a 1px tan line on fields, and a 2px ink edge only on frames that cast a block. Blocks are solid and never blurred: 4px on the sign-in card, 6px on showcase frames, 8px on the product frame, the featured plan and the closing panel, always down and to the right. Menus, dialogs, sheets and toasts float on a soft two-layer shadow.

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 Peach
ButtonInter 600 at 15px, sentence case, 8px corners, flat. Primary is black with white text and a 1.5px pressed-in edge (peach with espresso text in dark); secondary is a peach fill; outline is a white sheet with a tan line that turns ink on hover; ghost gets an ink wash on hover; link is ink with a 2px ember underline. Large is 60px tall with 12px corners and 18px type. Focus is a 2px ink ring with a 2px gap, and a press nudges the button down 1px.
BadgeA borderless pill with 13px 600 text. Neutral is a peach tint with dark text, accent is ember text on a pale ember tint, and status badges are soft tints with the strong colour as text.
Card8px corners: a white sheet with a warm hairline and no shadow. Soft and strong step to peach tints, outline is a tan line on nothing, and dark is espresso with cream text. Titles are Inter 600 at 18px. A block appears only where the page asks for one: the sign-in card and the featured plan.
Input, Textarea, SelectWhite 40px fields with a tan line and 8px corners. Focus turns the line ink and adds a 3px ember halo; invalid turns the line red. Select content is a white menu with a hairline, a soft shadow and an ink check.
Checkbox, RadioGroup, Switch16px boxes and circles with a 1.5px grey line on white. A checked box is black with a white tick; a chosen radio gets an ink ring and an ink dot. Switches are flat pills: a tan track when off, black when on (peach in dark).
TabsDefault tabs sit in a peach-tint track and the active tab is a white chip with a hairline. Line tabs mark the active tab with a 2px ember bar.
AccordionRows split by hairlines, Inter 600 triggers in ink that underline in ember on hover, and a chevron that turns 180 degrees and goes ember when open.
Dialog, AlertDialog, SheetWhite panels with a hairline and the soft shadow over an espresso scrim; dialogs have 12px corners. Titles are Public Sans 800 at 24px. Alert dialogs pair a primary or danger action with an outline cancel.
DropdownMenu, Popover, Select content, TooltipWhite, a hairline, 8px corners and the soft shadow. Items highlight to a peach tint, group labels are caps and shortcuts are IBM Plex Mono. Tooltips are inverted and flat: black with white text, peach with espresso text in dark.
TableA hairline frame with 8px corners, a soft header row in Inter 600 at 13px (not caps), hairline rows, tabular numbers, a peach-tint hover and a pale ember selected row. Right-align number columns.
Alert8px corners and a 1px line. Info is a soft peach sheet with an ink icon; success, warning and danger are soft tints with a status line at 25% and an icon in the status colour.
Avatar, Progress, Skeleton, Spinner, Separator, Kbd, Breadcrumb, Pagination, Field, Label, ToasterAvatars are circles with a hairline ring, a peach fallback and ink initials. Progress is a pill with a black fill on a tan track. Skeletons pulse in a peach tint and spinners take the text colour. Separators are 1px hairlines. Kbd is IBM Plex Mono on a peach tint with a tan line and a 2px bottom lip. Breadcrumbs split with chevrons and the current page in pagination is a black square. Labels are Inter 600 at 14px. Toasts are white sheets with a soft shadow and a status 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. Peach styles these:

  • site-header: peach, with no rule under it and no blur, so the masthead and the hero read as one sheet.
  • site-nav: plain ink links with no hover wash; hover and the current page get a 2px ember underline.
  • brand: the name in Public Sans 800 at 20px, tracked -0.04em.
  • brand-mark: the ink square with 6px corners, a heavy letter and a 2px ember block.
  • hero-backdrop: a flat peach band from the top down to about the middle of the product frame, closed by a peach-line rule. No wash, grid or gradient.
  • hero-title, hero-subtitle, hero-actions, hero-note: left aligned on the content edge, with the two big buttons 16px apart.
  • hero-eyebrow: a white chip with a 1.5px ink edge, 8px corners, a 3px block and an ember square; a linked chip lifts 1px on hover.
  • hero-visual: lets the frame span the full content column and gives a hero image the same ink edge.
  • product-preview: a white sheet with a 2px ink edge, 12px corners and an 8px block that hangs over the band's edge.
  • product-preview-bar: stays white, with ember, amber and green window dots.
  • section how-it-works: the middle peach band, with peach-line rules above and below.
  • step-marker: black circles with heavy white Public Sans numbers (peach with espresso numbers in dark).
  • section-eyebrow: ember text led by an 8px ember square, on cream and on peach.
  • section-heading: left aligned in every section but pricing; section-description stops at 36rem.
  • showcase-copy: puts the row titles back in Public Sans.
  • showcase-visual: a peach stage in a 2px ink frame with 12px corners and a 6px block, always down and to the right.
  • card with data-highlighted (the featured plan): a 2px ink edge and an 8px block in place of an ember outline.
  • feature-icon: a 44px peach disc with a 1.5px ink ring and an ink icon.
  • stat-grid and stat: one 8px frame of white cells split by hairlines; stat-value uses tabular numbers.
  • logo: Public Sans 800 wordmarks tracked tight; image logos go grey at 75%.
  • faq: the open chevron turns ember.
  • cta-panel: an espresso sheet (the dark class) with a 2px peach edge, an 8px ember block and no wash.
  • site-footer: peach again with peach-line rules; footer links get a 2px ember underline on hover.

Everything else is type, space and the kit.

Signed-in screens

The dashboard sits on the cream canvas with a soft sidebar, the active item on a peach tint in ink, Public Sans 800 page titles and white hairline cards with no blocks; ember shows only in links, the focus halo and accent icon tiles.

Sign-in is one white card centred on the cream with a hairline, 32px padding and the 4px black block (ember in dark), white inputs with the ember halo and a full-width black Continue.

Do and don't

Do

  • Open every marketing page with the peach masthead and hero band, and let the product frame hang over the band's edge onto the cream.
  • Set headlines in Public Sans 850, ink, at the scale's tracking, in two or three lines.
  • Keep black (primary) as the only filled action in light and peach in dark. One primary button per view.
  • Keep ember to small marks: eyebrows and their square, link underlines, the brand-mark block, the focus halo and one accent badge.
  • Give a hard block (shadow-soft 4px, shadow-lift 8px) to at most one or two surfaces per view.
  • Pair every block with a line: a 2px --edge on frames, a hairline on the sign-in card. Blocks fall down and to the right.
  • Put white cards (bg-card) on the cream canvas with a warm hairline, 8px corners and 24px padding.
  • Set buttons, labels, tabs and nav in Inter 600, sentence case, and running text in Inter 400 at 16px in text-body.

Don't

  • Don't fill a surface with ember: no ember buttons, bands, cards or switches.
  • Don't blur a block or lower its opacity.
  • Don't put a soft drop shadow on a card that sits on the page. Soft shadows are for menus, dialogs, sheets and toasts.
  • Don't set body copy, labels or card titles in Public Sans. The heavy face stops at 24px.
  • Don't use pill corners on buttons or inputs: 8px, and 12px for large buttons.
  • Don't put a white card on the peach band without a line or a block.
  • Don't add a second accent. Blue, green and amber appear only in charts, status colours and the window dots.
  • Don't use muted-soft for text people must read.

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 Peach

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