---
name: dab
description: The private wing of your data library — a sparse control plane for a personal DAV host.
colors:
canvas: "#221f21"
zinc-50: "#fafaf9"
zinc-100: "#f5f4f4"
zinc-200: "#e5e4e5"
zinc-300: "#d6d4d7"
zinc-400: "#a3a1a8"
zinc-500: "#747178"
zinc-600: "#555259"
zinc-700: "#423f42"
zinc-800: "#2a2729"
zinc-900: "#1b181a"
zinc-950: "#0c090b"
accent-50: "#fdf2f8"
accent-100: "#fce7f3"
accent-200: "#fbcfe8"
accent-300: "#f9a8d4"
accent-400: "#f06da6"
accent-500: "#db3a8b"
accent-600: "#b8226e"
accent-700: "#941b58"
accent-800: "#76174a"
accent-900: "#5b143b"
semantic-emerald-400: "#34d399"
semantic-red-400: "#f87171"
semantic-amber-300: "#fcd34d"
typography:
display:
fontFamily: "Fraunces, ui-serif, Georgia, serif"
fontSize: "clamp(1.875rem, 2vw + 1rem, 2.25rem)"
fontWeight: 800
lineHeight: "1.05"
letterSpacing: "-0.025em"
h1:
fontFamily: "Hanken Grotesk, ui-sans-serif, system-ui, sans-serif"
fontSize: "1.5rem"
fontWeight: 700
lineHeight: "1.2"
letterSpacing: "-0.02em"
h2:
fontFamily: "Hanken Grotesk, ui-sans-serif, system-ui, sans-serif"
fontSize: "1.25rem"
fontWeight: 600
lineHeight: "1.3"
h3:
fontFamily: "Hanken Grotesk, ui-sans-serif, system-ui, sans-serif"
fontSize: "1rem"
fontWeight: 600
lineHeight: "1.4"
body:
fontFamily: "Hanken Grotesk, ui-sans-serif, system-ui, sans-serif"
fontSize: "0.875rem"
fontWeight: 450
lineHeight: "1.55"
caption:
fontFamily: "Hanken Grotesk, ui-sans-serif, system-ui, sans-serif"
fontSize: "0.75rem"
fontWeight: 500
lineHeight: "1.4"
letterSpacing: "0.1em"
mono:
fontFamily: "JetBrains Mono, SF Mono, Fira Code, monospace"
fontSize: "0.75rem"
fontWeight: 400
lineHeight: "1.5"
rounded:
sm: "0.5rem"
md: "0.75rem"
lg: "1rem"
xl: "1rem"
"2xl": "1rem"
full: "9999px"
spacing:
"2": "0.5rem"
"3": "0.75rem"
"4": "1rem"
"5": "1.25rem"
"6": "1.5rem"
"8": "2rem"
components:
button-primary:
backgroundColor: "{colors.accent-600}"
textColor: "#ffffff"
rounded: "{rounded.md}"
padding: "0 1rem"
height: "2.5rem"
typography: "{typography.body}"
button-primary-hover:
backgroundColor: "{colors.accent-500}"
textColor: "#ffffff"
rounded: "{rounded.md}"
padding: "0 1rem"
height: "2.5rem"
button-secondary:
backgroundColor: "{colors.zinc-800}"
textColor: "{colors.zinc-200}"
rounded: "{rounded.md}"
padding: "0 1rem"
height: "2.5rem"
typography: "{typography.body}"
button-danger:
backgroundColor: "{colors.zinc-900}"
textColor: "{colors.semantic-red-400}"
rounded: "{rounded.md}"
padding: "0 1rem"
height: "2.5rem"
button-ghost:
backgroundColor: "transparent"
textColor: "{colors.zinc-400}"
rounded: "{rounded.md}"
padding: "0 1rem"
height: "2.5rem"
card-default:
backgroundColor: "{colors.zinc-900}"
textColor: "{colors.zinc-100}"
rounded: "{rounded.2xl}"
padding: "1.25rem"
card-accent:
backgroundColor: "{colors.zinc-900}"
textColor: "{colors.zinc-100}"
rounded: "{rounded.2xl}"
padding: "1.25rem"
input:
backgroundColor: "{colors.zinc-800}"
textColor: "{colors.zinc-100}"
rounded: "{rounded.md}"
padding: "0.625rem 1rem"
typography: "{typography.body}"
input-focus:
backgroundColor: "{colors.zinc-800}"
textColor: "{colors.zinc-100}"
rounded: "{rounded.md}"
padding: "0.625rem 1rem"
badge-neutral:
backgroundColor: "{colors.zinc-800}"
textColor: "{colors.zinc-300}"
rounded: "{rounded.full}"
padding: "0.125rem 0.5rem"
typography: "{typography.caption}"
badge-accent:
backgroundColor: "{colors.accent-900}"
textColor: "{colors.accent-300}"
rounded: "{rounded.full}"
padding: "0.125rem 0.5rem"
typography: "{typography.caption}"
---
# Design System: dab
## 1. Overview
**Creative North Star: "The private wing of the library."**
dab is the small reading room behind tessera's front desk. Each subject's
opaque five-word host is the placard at the entrance to a wing of stacks;
inside, three labeled shelves hold calendars, contacts, and files. The
control-plane UI is a place to organize what is on those shelves, hand
visitors (DAV clients) a shelfmark, and leave. Nothing on this surface wants
your attention longer than necessary.
The aesthetic is institutional-print restraint with a single warm bookmark
slip. Fraunces (warm variable serif) does the ceremonial work on page H1s and
the brand mark, the way a typeset placard sits above a row of stacks. Hanken
Grotesk does the steady labor everywhere else. Coral-magenta (`#db3a8b`)
appears _rarely_, never as decoration — the primary CTA, the active nav
state, the small heart in the footer, the bookmark slip on a hover row. Its
power is rarity.
The whole system explicitly rejects the share-link product (Dropbox / iCloud
/ Drive), the enterprise NAS appliance (Nextcloud / ownCloud / Synology), the
AI-template dark-mode default (neon-on-near-black, gradient meshes,
glassmorphism), and the cheerful-Apple pastel calendar aesthetic. dab is not
a daily driver; the design is sized for the four-times-a-year visit and the
sixty-second task, and every surface should read like a labeled shelf rather
than a marketing tile.
**Key Characteristics:**
- Lifted-canvas dark only (`#221f21`); no light-mode toggle.
- One coral-magenta accent, one warm serif, one warm sans, one mono. Nothing
more.
- Catalog-card density: each row carries display name, internal name (mono),
one timestamp, the URL in a collapsed disclosure.
- Personality budget spent on the Layers glyph `-rotate-6` on hover, the
serif H1, the gold-magenta CTA, and the footer heart. Nowhere else.
- 75ms default transition, scoped to specific properties. Never
`transition-all`.
## 2. Colors: The Library Palette
Warm-shifted zinc neutrals on a lifted canvas, with a single coral-magenta
accent borrowed from a bookmark slip pressed into a closed book.
### Primary
- **Bookmark Coral** (`#db3a8b`, `oklch(60.3% 0.219 357)`): The primary
accent. Appears on the primary CTA fill at `accent-600` (`#b8226e`) with
white text, hovering to `accent-500`. Active nav-state background at
`accent-500/10` with text at `accent-300`. The footer heart fills at
`accent-500`. Active row indicator on hover-state borders. A "you saw me
twice on this page" frequency; if it appears more often, something is being
decorated that should not be.
### Neutral: Warm Zinc
Stock zinc shifted +2–3 R, –1–4 B per stop, so the rest cool cast lifts and
the palette feels like cream-aged paper under low light. Darker stops get the
larger shift; lighter stops barely move so text contrast is unaffected.
- **Canvas** (`#221f21`, ~zinc-850): Body / main content. The brightest
reading surface; the place the eye rests.
- **Chrome** (`#1b181a`, `zinc-900`): Header, recessed wrappers (code blocks,
table headers, disclosure containers). Darker than canvas to frame and
recede.
- **Elevated** (`#2a2729`, `zinc-800`): Menus, dialogs, popovers, dropdowns,
card fill. Lighter than canvas to float over it.
- **Hover-inside-elevated** (`#423f42`, `zinc-700`): Hover state for rows
inside an elevated surface; also the resting border on inputs and
secondary buttons.
- **Body text** (`zinc-100`, `#f5f4f4`): Primary content. Contrast on canvas
14.3:1.
- **Secondary text** (`zinc-300`, `#d6d4d7`): Labels, soft headings.
- **Muted text** (`zinc-400`, `#a3a1a8`): Caption, descriptions, table cells
that aren't the primary value. Contrast 5.9:1 on canvas.
- **Placeholder / disabled** (`zinc-500`, `#747178`): Input placeholders,
inert glyphs.
### Semantic
| Role | Background | Text | Border |
| ------- | ------------------- | ------------------ | ----------------------- |
| Success | `bg-emerald-500/10` | `text-emerald-400` | `border-emerald-500/20` |
| Error | `bg-red-500/10` | `text-red-400` | `border-red-500/20` |
| Warning | `bg-amber-500/10` | `text-amber-300` | `border-amber-500/20` |
| Info | `bg-accent-500/10` | `text-accent-300` | `border-accent-500/20` |
### Named Rules
**The One Bookmark Rule.** Coral-magenta is the primary CTA, the active nav
state, the footer heart, and nothing else. Never a background fill. Never a
gradient. Never a decorative shadow. Never as a row stripe. If a third
coral-magenta element appears on a page, one of the three is wrong.
**The Lifted Canvas Rule.** Body background is `#221f21`, not `zinc-950`,
not `#000`. Lifting prevents halation for astigmatic readers and gives the
surface hierarchy room to express depth without shadows. Don't push canvas
darker for "drama"; it makes the wing feel like a basement.
**The Warm-Shifted Zinc Rule.** Override stock zinc in `@theme` with the
warm-shifted values. Stock zinc leans cool/clinical; the warm shift reads as
"neutral" rather than "cool gray" and rhymes with cream paper. The warmth
should be felt, not seen.
## 3. Typography
**Display Font:** Fraunces (variable serif, opsz 9–144, wght 500–800, SOFT
30–100) with Georgia / serif fallback. Loaded via Google Fonts; CSP allows
fonts.googleapis.com because dab is not a credential surface (tessera is).
**Body Font:** Hanken Grotesk (variable, wght 400–700) with system-ui
fallback. The default `body { font-weight: 450 }` is heavier than 400 to
counteract halation on dark surfaces.
**Mono Font:** JetBrains Mono (variable, wght 400, 500) for IDs, mono input
values, DAV URLs, host labels.
**Character:** Fraunces is warm, slightly opinionated, with the SOFT axis
turned up so the strokes feel hand-cut rather than mechanical. Paired with
Hanken's quiet workhorse sans, the effect is "typeset placard above a row
of stacks" — the H1 carries weight in posture, the body is the steady
labor, the mono is the URL on the catalog card.
### Hierarchy
- **Display** (Fraunces 800, `clamp(1.875rem, 2vw + 1rem, 2.25rem)`,
line-height 1.05, tracking `-0.025em`): Page H1 inside `PageHeader`,
rendered through `font-display`. One per page. Holds the metaphor.
- **H1** (Hanken 700, 1.5rem, tracking `-0.02em`): Section titles below
a page H1. Rare; most surfaces don't need a second tier.
- **H2** (Hanken 600, 1.25rem): Card title, dialog title, sub-section.
- **H3** (Hanken 600, 1rem): List labels, group headers.
- **Body** (Hanken 450, 0.875rem, line-height 1.55): Default body and
control text. Max line length 65–75ch for paragraphs.
- **Caption** (Hanken 500, 0.75rem, tracking `0.1em`, uppercase): Overlines,
meta labels (`
` content in a definition list), table column headers.
This is the "catalog card label" tier.
- **Mono** (JetBrains Mono 400, 0.75rem): IDs, URLs, host labels,
copy-paste-shaped values. Always slightly smaller than body.
### Named Rules
**The Serif Once Rule.** Fraunces appears on the page H1 inside `PageHeader`
and on the brand mark in the header — nowhere else. Section titles, card
titles, dialog titles all use Hanken. Spreading the serif across cards
turns the wing into a museum gift shop. One serif moment per page.
**The 450 Floor Rule.** Body text never drops below `font-weight: 450`. No
`font-light`, no `font-thin`. Light strokes halate on dark surfaces for
~33% of users. The 450 floor is set on `` and cascades; only override
upward.
**The Mono For Mono-Shaped Values Rule.** JetBrains Mono is reserved for
values that are themselves machine-shaped: UUIDs, DAV URLs, host labels,
ETags, sync tokens. Never use mono for "tech feel" — that's the AI-template
reflex. A user-facing display name is not mono.
## 4. Elevation
dab uses **tonal layering, not shadows**, to express depth. The four-tier
warm-zinc hierarchy is the elevation system; `box-shadow` is reserved for
the single context where tonal layering can't carry the load (dialogs).
Surfaces from depth to height:
- **Chrome** (`zinc-900` / `#1b181a`): Header, sidebar (none in dab), table
header rows, code blocks, disclosure containers. Darker than canvas to
frame the content and recede visually.
- **Canvas** (`#221f21`): Body / main content. The brightest reading
surface — the eye rests here.
- **Elevated** (`zinc-800` / `#2a2729`): Cards, menus, popovers, dropdown
panels. Lighter than canvas to float.
- **Hover** (`zinc-700` / `#423f42`): Hover state on rows inside Elevated,
resting borders, secondary button rest.
Shadow vocabulary:
- **Dialog scrim** (`backdrop:bg-zinc-950/60 backdrop:backdrop-blur-sm`):
Native `