balance
bespoke · surfaceThe signature figure - a large serif balance, calm and confident.
Calm capital - navy dusk and a serif hush.
Vesper is a re-reading of refined business banking: a calm, deep-navy canvas held at dusk, where soft periwinkle light pools on raised surfaces and a quiet indigo carries every action. Headlines are set in an editorial serif that lends gravitas and slows the eye, while the body stays in a clean sans and figures are stamped in mono. Space is generous, edges are softly rounded, shadows are barely there, and motion drifts rather than snaps. It earns trust through restraint - money handled in a hushed, considered room.
re-imagined from https://mercury.com
Pull this design system into any project - it follows the system's tokens, recipes and rules. Run the commands yourself, or let your coding agent set it up and build.
Make Vesper yours
Give it a name and it becomes a system in your account - with your dashboard, the checks your agent sends, and Autopilot. Then two commands bring it into your project.
Or pull the gallery version as it is, without an account:
npx synthesisui@latest init --styles tailwind --ds vespernpx synthesisui@latest connectnpx synthesisui@latest connectUse the "Vesper" design system (slug: vesper) to: build the UI I describe next First make sure it's installed: run `npx synthesisui add vesper` if `_synthesisui/ds/vesper/` isn't in the project yet. Read these files first (highest authority first): - _synthesisui/ds/vesper/rules.md - project rules for this system (if present); obey them above everything else - _synthesisui/ds/vesper/philosophy.md - the mission, voice and principles (if present); let it shape every screen - _synthesisui/ds/vesper/v19/GUIDE.md - how to apply the system, the recipes and the token vocabulary Follow this contract (target framework: next): - First check whether this refers to UI that already exists in the project. If it does, modify only what's needed and keep the rest intact and on-system. If it doesn't, build it new. - Scope the markup with `data-ds="vesper"` (or rely on it at the app root). - Style with the design system only: reuse the `.ds-*` recipe classes and the DS-backed Tailwind utilities (`bg-primary`, `text-foreground`, `p-md`, `rounded-lg`, `font-display`…). Never use raw hex/px outside the system's scale. - Make sure `tokens.css` + `theme.css` are imported in the global CSS (see the GUIDE's "How to apply"). - Implement the behavior yourself (open/close, focus, routing) - the system ships the looks, not the JS. Composition (make it look composed, not just correct): - Cap page content with a max-width container and center it - this DS ships `max-w-app` for dashboards/wide UI and `max-w-prose` for text columns. Don't stretch content edge-to-edge. - Give the page a complete, intentional layout: clear vertical rhythm, sensible density and grouped sections. Never leave a single thin row floating on an empty screen. Deliver senior-level, production-quality code: clean structure, accessible (ARIA + keyboard), and responsive.
Paste into Claude Code, Cursor or any coding agent. From your project you can also run npx synthesisui use vesper "…".
What to install or load so the system renders at full fidelity - it ships token names and recipes, not the assets.
The system ships token names, not the fonts. Load them (Google Fonts, next/font or Fontsource) or type falls back to a generic family and loses the system's identity.
npm i lucide-reactComponents reference Lucide icon names. Install it (or swap in your own icon set) to render them.
Color
Named scales forged by the synthesis; semantic roles only ever point at them.
color.gold
375#dbb374
400#d6a85f
500#b9893a
600#946b27
650#805c21
color.navy
50#f4f5fa
100#ededf3
200#dcdee9
300#b9bdd0
350#b5b9c8
400#8a8fa8
500#5f6480
550#5d617d
600#3c4158
700#272735
800#1e1e2a
900#171721
950#0e0e16
color.rose
375#e7aaaf
400#d97a83
500#c25560
600#a03e49
650#ad313b
color.sage
375#8dc5ac
400#5fae8a
500#3d8a68
550#376d55
600#2c6b50
color.veil
500#09090bb3
color.indigo
300#aeb8f5
350#aeb5f5
380#a2acf4
400#7c87ef
500#5266eb
550#3e4fe7
600#3f4ed1
700#2f3aa0
color.periwinkle
200#dbe3ff
300#b9c4f0
350#a3baea
400#9cb4e8
450#2d5dc3
color.semantic - resolved live via CSS variables
info
{color.indigo.350}
faint
{color.navy.500}
muted
{color.navy.350}
scrim
{color.veil.500}
accent
{color.periwinkle.350}
border
{color.navy.700}
canvas
{color.navy.900}
danger
{color.rose.375}
raised
{color.navy.700}
overlay
{color.navy.700}
primary
{color.indigo.500}
success
{color.sage.375}
surface
{color.navy.800}
warning
{color.gold.375}
foreground
{color.navy.50}
color.series - categorical data-viz palette (bg-series-*)
series-1
series-2
series-3
series-4
series-5
series-6
series-7
series-8
Foundations
Corner radius, spacing rhythm and elevation - the physical feel of the system.
radius
spacing
shadow
Typography
Display: Newsreader · Body: Inter · Mono: IBM Plex Mono
Motion
Every keyframe runs live below, dressed in the system's own colors - durations, easing curves and the interactions they power.
keyframes - 6 live
easings
durations
interaction patterns
A barely-there press.
Content drifts up gently and fades in.
A soft indigo ring settles around the focused control.
Surface lifts a touch on hover with a soft shadow.
Hero elements float slowly, like a calm tide.
Components · 12
Every value below is a token reference resolved by the renderer - hover, toggle and switch tabs to feel the states. Bespoke components are rendered from their anatomy hint.
The signature figure - a large serif balance, calm and confident.
A ledger row - payee on the left, mono amount on the right, hairline below.
Calm navy panel with a soft hairline; lifts a touch on hover.
padding
A card wearing this system.
A card wearing this system.
emphasis
A card wearing this system.
A card wearing this system.
A quiet filter token - hairline border, periwinkle whisper, indigo when chosen (data-active="true"). Nothing shouts at dusk.
active
Inline text link, for words inside sentences - the underline is the affordance, so it reads as a link without relying on colour alone. For standalone actions use button; for navigation chrome use navbar/sidebar items.
Inline message. Tone maps onto the system's own semantic accents.
tone
A message wearing this system.
A message wearing this system.
A message wearing this system.
A message wearing this system.
A message wearing this system.
A message wearing this system.
A message wearing this system.
Soft pill for metadata and status; colored text on a quiet fill.
intent
Quiet field; a soft indigo ring settles in on focus.
A monogram, not a photo bubble - serif initials on raised navy inside a gold hairline, like the clasp of a private ledger. Image via ds-avatar-img.
size
Quiet, softly-rounded action. Primary carries the calm indigo.
intent
Field trigger that reveals a focus ring on interaction.
Monograms in quiet company - overlapping gently, each held by a navy ring so the gold hairlines never touch.
Engagement blocks · 1
Optional gamification blocks the AI advisor can propose - token-only, so they re-skin to any base. A library to compose from, not a parallel product.
Consistency as quiet wealth - the streak glows like a candle at dusk, counted in serif.
Icons · lucide
Icons inherit the system: color via currentColor, a standardized stroke, sizing on the scale. Lucide by default; more libraries can be enabled per system.
Pages
Vesper has no ready-made page. It has 33 sections, and this is what 6 of them make together. Yours starts from the same pieces.
Your main colour buttons and links
#5266EB is too light for the text on a button, so it was darkened to #6476ED - 4.5:1.
The more you say about who it is for and what they should do, the less the agent has to guess.
How much can the agent invent?
In your project, install Vesper once
npx synthesisui@latest init --ds vesperYour agent reads Vesper's tokens and rules from the folder this creates.
Paste this into your agent Claude Code, Cursor, Codex…
Build a landing page with SynthesisUI in the system "vesper".
My request: "a landing page"
Before you start: if this project does not have the vesper design system yet, run `npx synthesisui@latest add vesper`. If any SynthesisUI command asks to sign in (or says the system does not exist), run `npx synthesisui@latest login`, tell me to sign in in the browser, and wait.
Fonts: `add` writes a `fonts.ts` that loads this system's type with next/font. Import it in the root layout and put each export's `.variable` on `<body>`, as `add` prints - the templates read those variables. Don't replace it with a Google Fonts link.
Top to bottom, write each section with its template, then render it in one page, with the content written from my request:
1. npx synthesisui@latest template vesper nav-top-bar
content: write it from my request - my words where I gave them; where I did not, short copy that only says what my request says. Never invent numbers, prices, ratings, reviews, client names or contacts: ask me, or leave that part out
phone menu: npx synthesisui@latest template vesper phone-menu, then pass it as <AppNav PhoneMenu={PhoneMenu} ... /> so the links stay on phones. Every link that starts with # points at a section of this page: give that section the id; if no section matches, leave the item out and tell me.
text limits (characters, the most this design holds on desktop and on phones; a list key applies to every item): {"brand":42,"items.label":60}
2. npx synthesisui@latest template vesper hero
content: write it from my request - my words where I gave them; where I did not, short copy that only says what my request says. Never invent numbers, prices, ratings, reviews, client names or contacts: ask me, or leave that part out
text limits (characters, the most this design holds on desktop and on phones; a list key applies to every item): {"action.label":26,"line":46,"link.label":56,"name":8,"options.name":118,"specs.label":38,"specs.value":40}
3. npx synthesisui@latest template vesper pricing-lead
content: write it from my request - my words where I gave them; where I did not, short copy that only says what my request says. Never invent numbers, prices, ratings, reviews, client names or contacts: ask me, or leave that part out
text limits (characters, the most this design holds on desktop and on phones; a list key applies to every item): {"compare.label":50,"plans.action.label":24,"plans.facts":80,"plans.name":18,"plans.price":7,"plans.who":39,"title":42}
4. npx synthesisui@latest template vesper testimonials-lead
content: write it from my request - my words where I gave them; where I did not, short copy that only says what my request says. Never invent numbers, prices, ratings, reviews, client names or contacts: ask me, or leave that part out
text limits (characters, the most this design holds on desktop and on phones; a list key applies to every item): {"all.label":52,"title":42,"voices.detail":40,"voices.name":33,"voices.quote":118}
5. npx synthesisui@latest template vesper closing-band
content: write it from my request - my words where I gave them; where I did not, short copy that only says what my request says. Never invent numbers, prices, ratings, reviews, client names or contacts: ask me, or leave that part out
text limits (characters, the most this design holds on desktop and on phones; a list key applies to every item): {"action.label":31,"fact":60,"title":40}
6. npx synthesisui@latest template vesper footer-columns
content: write it from my request - my words where I gave them; where I did not, short copy that only says what my request says. Never invent numbers, prices, ratings, reviews, client names or contacts: ask me, or leave that part out
text limits (characters, the most this design holds on desktop and on phones; a list key applies to every item): {"address":98,"brand":29,"columns.links.label":24,"columns.title":35,"email":52,"legal.label":48,"line":112}
Text between asterisks is emphasis: render it as <em>. Keep my words as I wrote them. Where you write the text, stay within each section's text limits.
A button or link whose href is anything other than # goes exactly where I set it - use that address as written. An href of # is yours to point at the right page of this project.
You may go beyond the list: swap a section for another variant of the same kind (`npx synthesisui@latest landing vesper` lists them), reorder the body, or break one layout rule on purpose when my goal calls for it. Tell me which and why.
Main colour: #6476ED. In this project, set the system's primary to it - override `--ds-color-semantic-primary` in the root stylesheet, after the system's - so every button and link uses it.