DESIGN.md inspired by Drizzle ORM
Near-monochrome white canvas, dark #282b3b controls, and one signature lime-green serpent (#c5f74f) — a no-magic TypeScript ORM.
Compare to…
- bg
#ffffff - bg-subtle
#fbfbfc - surface
#ffffff - surface-alt
#f6f6f7 - surface-faint
#f1f2f3 - brand — · 1.3
#c5f74f - brand-hover
#b9ee3c - brand-pressed
#a9dd2f - brand-soft
#eefbcf - on-brand
#000000 - control
#282b3b - control-hover
#34384c - control-pressed
#1f2230 - on-control
#ffffff - link
#000000 - link-hover
#282b3b - link-code
#22863a - selected
#c5f74f59 - disabled
#f1f2f3 - disabled-text
#b0b3b8 - text AAA · 21.0
#000000 - text-heading
#222222 - text-muted
#555555 - text-soft
#6b7280 - text-code
#414141 - text-faint — · 2.6
#9aa0a6 - border — · 1.2
#e5e7eb - border-soft
#f0f1f2 - border-strong — · 1.5
#d0d3d8 - border-dark
#282b3b - shadow-ambient
rgba(17,24,39,0.04) - shadow-standard
rgba(17,24,39,0.08) - shadow-elevated
rgba(17,24,39,0.12) - shadow-deep
rgba(17,24,39,0.16) - success
#22863a - success-bg
#e9f6ec - warning
#b45309 - warning-bg
#fdf3e7 - danger
#cf222e - danger-bg
#fbeaec - info
#282b3b - info-bg
#f6f6f7
- step-0 0px
- step-1 4px
- step-2 8px
- step-3 12px
- step-4 16px
- step-5 24px
- step-6 32px
- step-7 48px
- step-8 64px
- step-9 96px
- micro
2px - sm
4px - md
8px - lg
12px - xl
16px - pill
9999px
Maps the 8 canonical role names to this entry's actual tokens. Use these to plug the design into role-aware tools — shadcn/ui themes, role-aware Tailwind plugins, atelier-lint — without hard-coding token names.
- background → bg
- foreground → text
- primary → brand
- primary-foreground → on-brand
- accent → brand
- muted → text-muted
- border → border
- ring → brand
Drizzle's visual identity is GitHub-README minimalism crossed with the Vercel/Bun school of dark-control-on-light-canvas dev marketing. The page is aggressively monochrome — pure white `#ffffff`, pure-black `#000` body copy, slate-graphite `#282b3b` for the only filled buttons — and the entire chromatic identity is carried by a single hue: the lime-green serpent logo (`#c5f74f`). That restraint is the point. Drizzle markets itself as "TypeScript-first, lightweight, no-magic," and the design is the argument: no gradients, no glassmorphism, no decorative colour, just clean type, generous whitespace, and well-typeset code samples. Type is the platform system sans (`ui-sans-serif`) and a system mono (`ui-monospace`) for code — Drizzle ships no custom webfont, matching its zero-dependency ethos. Code blocks lean on the Astro/Shiki token palette (text `#414141`, GitHub-green links `#22863a`), which gives the docs a familiar source-control register. Where Bun adds a warm cream canvas and a pink accent, and Biome adds a confident blue, Drizzle commits to near-zero chroma plus one acid lime — the cleanest, most code-forward posture in the dev-tools cohort.
- Dark-control-on-white-canvas dev-marketing template — 8px buttons, system sans, generous vertical rhythm, monochrome restraint.
- Adjacent TypeScript-runtime brand built on a light canvas with a single vivid accent and system-font, performance-forward voice.
- README/source-control aesthetic — black-on-white prose, grey hairlines, the GitHub-green (#22863a) and -red (#cf222e) code-token palette echoed in the docs.
- Docs syntax-highlighting palette (--astro-code-color-text #414141, --astro-code-token-link #22863a) inherited directly into Drizzle's code blocks.
- Light, hairline-bordered, utility-clean component geometry and the convention of a near-grayscale surface scale punctuated by one brand hue.
theme.extend block for tailwind.config.js
:root { --bg, --text, --brand, … } you can paste anywhere
W3C Design Tokens Community Group format
Importable into Figma → Variables → Import
---
name: Drizzle ORM
tagline: 'Near-monochrome white canvas, dark #282b3b controls, and one signature lime-green serpent (#c5f74f) — a no-magic TypeScript ORM.'
updated_at: 2026-05-30T00:00:00.000Z
published_at: 2026-05-29T21:44:14.064Z
author: webdesignhot
source_url: https://orm.drizzle.team
spec: webdesignhot/0.1
quality: curated
featured: false
categories: [dev-tools]
tags: [light, sans, mono, developer, minimal, performance]
preview_swatch: ['#ffffff', '#c5f74f', '#282b3b']
related: [bun, biome, turso]
description: 'Drizzle ORM runs an aggressively plain white canvas (`#ffffff`) with pure-black body copy (`#000`) and dark slate-graphite controls (`#282b3b`) — the marketing site is near-monochrome on purpose. The one piece of colour is the brand''s signature lime-green serpent (`#c5f74f`), reserved for the logo and the occasional accent fill. Type is a clean system sans paired with a system mono for code; geometry is restrained, 8px on controls, no decorative gradients. The whole identity reads "TypeScript-first, lightweight, no-magic" — performance and code clarity over visual flourish.'
# Canonical 8-role aliases (bg / text / brand / border / accent / muted / surface / danger).
# Maps role names to this entry's actual token names so role-aware
# downstream tools resolve `theme.background` → entry's `bg`, etc.
# Auto-generated by scripts/add-aliases.mjs — do not edit manually;
# regenerate after changing color token names.
aliases:
background: bg
foreground: text
primary: brand
primary-foreground: on-brand
accent: brand
muted: text-muted
border: border
ring: brand
colors:
# Primary
bg: '#ffffff' # plain white canvas — the brand's substrate
bg-subtle: '#fbfbfc' # barely-there off-white for alternating bands
surface: '#ffffff' # cards sit flush on white, defined by border
surface-alt: '#f6f6f7' # tinted panel / code-tab strip / secondary fill
surface-faint: '#f1f2f3' # faint chip / 33%-alpha-on-white callout (#f1f2f3 ~0.27a)
# Brand
brand: '#c5f74f' # signature lime-green serpent — logo + accent fill
brand-hover: '#b9ee3c' # slightly deeper lime on hover
brand-pressed: '#a9dd2f' # pressed lime
brand-soft: '#eefbcf' # 20% lime wash for highlight backgrounds
on-brand: '#000000' # black text on lime fill — 16.8:1 AAA
# Dark control family (Drizzle's "primary button" colour)
control: '#282b3b' # dark slate-graphite — primary button / dark band
control-hover: '#34384c' # lifted slate on hover
control-pressed: '#1f2230' # pressed slate
on-control: '#ffffff' # white text on the dark control — 14.0:1 AAA
# Interactive
link: '#000000' # links are black, underline-driven (monochrome system)
link-hover: '#282b3b' # hover shifts to slate
link-code: '#22863a' # GitHub-flavoured green for code-token links (astro-code)
selected: '#c5f74f59' # 35% lime text selection wash
disabled: '#f1f2f3' # disabled bg
disabled-text: '#b0b3b8' # disabled text
# Neutral Scale
text: '#000000' # primary body copy — pure black
text-heading: '#222222' # headings render slightly softened (#222 measured)
text-muted: '#555555' # secondary copy — 7.5:1 AAA
text-soft: '#6b7280' # tertiary / captions — 4.8:1 AA
text-code: '#414141' # default code-block text colour (astro-code-color-text)
text-faint: '#9aa0a6' # quaternary / placeholder hints
# Surface & Borders
border: '#e5e7eb' # standard hairline — light grey on white
border-soft: '#f0f1f2' # faintest divider
border-strong: '#d0d3d8' # emphasised border on hover / active
border-dark: '#282b3b' # dark border on the slate control family
# Shadow
shadow-ambient: 'rgba(17,24,39,0.04)' # barely-there resting shadow
shadow-standard: 'rgba(17,24,39,0.08)' # card hover
shadow-elevated: 'rgba(17,24,39,0.12)' # popover / dropdown
shadow-deep: 'rgba(17,24,39,0.16)' # modal
# Semantic
success: '#22863a' # GitHub green — reuses the code-link hue
success-bg: '#e9f6ec' # pale green surface
warning: '#b45309' # amber-brown — only warm tone outside lime
warning-bg: '#fdf3e7' # pale amber surface
danger: '#cf222e' # GitHub-flavoured red
danger-bg: '#fbeaec' # pale red surface
info: '#282b3b' # info reuses the slate control colour
info-bg: '#f6f6f7' # neutral info surface
typography:
display:
family: 'ui-sans-serif, system-ui, -apple-system, "Segoe UI", Roboto, "Helvetica Neue", Arial, sans-serif'
weights: [500, 600, 700]
opentype-features: ['kern', 'liga']
body:
family: 'ui-sans-serif, system-ui, -apple-system, "Segoe UI", Roboto, "Helvetica Neue", Arial, sans-serif'
weights: [400, 500, 600]
opentype-features: ['kern', 'liga']
mono:
family: 'ui-monospace, SFMono-Regular, "SF Mono", Menlo, Consolas, "Liberation Mono", monospace'
weights: [400, 500]
opentype-features: ['liga', 'calt']
scale:
display-hero: { size: 80, weight: 700, lineHeight: 1.0, tracking: '-0.03em', family: display }
display-lg: { size: 56, weight: 700, lineHeight: 1.05, tracking: '-0.02em', family: display }
h1: { size: 40, weight: 700, lineHeight: 1.1, tracking: '-0.018em', family: display }
h2: { size: 32, weight: 600, lineHeight: 1.2, tracking: '-0.012em', family: display }
h3: { size: 24, weight: 600, lineHeight: 1.25, tracking: '-0.005em', family: display }
h4: { size: 20, weight: 600, lineHeight: 1.3, tracking: '0', family: body }
body-lg: { size: 18, weight: 400, lineHeight: 1.55, tracking: '0', family: body }
body: { size: 16, weight: 400, lineHeight: 1.55, tracking: '0', family: body }
body-sm: { size: 14, weight: 400, lineHeight: 1.5, tracking: '0', family: body }
label: { size: 13, weight: 500, lineHeight: 1.4, tracking: '0', family: body }
caption: { size: 12, weight: 500, lineHeight: 1.4, tracking: '0.02em', family: body }
button: { size: 14, weight: 500, lineHeight: 1.0, tracking: '0', family: body }
nav-link: { size: 14, weight: 500, lineHeight: 1.2, tracking: '0', family: body }
code-body: { size: 14, weight: 400, lineHeight: 1.6, tracking: '0', family: mono }
code-inline: { size: 13, weight: 500, lineHeight: 1.4, tracking: '0', family: mono }
code-label: { size: 12, weight: 500, lineHeight: 1.3, tracking: '0.02em', family: mono }
metric: { size: 28, weight: 700, lineHeight: 1.1, tracking: '-0.01em', family: display }
radius:
micro: 2
sm: 4
md: 8
lg: 12
xl: 16
pill: 9999
spacing:
base: 4
scale: [0, 4, 8, 12, 16, 24, 32, 48, 64, 96]
xs: 4
sm: 8
md: 16
lg: 24
xl: 32
xxl: 48
section-sm: 64
section: 96
layout:
page-width: 1280
prose-width: 720
header-height: 64
motion:
ease-standard: 'cubic-bezier(0.4, 0, 0.2, 1)'
ease-decelerate: 'cubic-bezier(0, 0, 0.2, 1)'
duration-fast: 150
duration-standard: 240
duration-slow: 320
reduced-motion: 'respects prefers-reduced-motion: reduce — code-sample crossfades become instant, hover lifts removed, transitions reduce to opacity.'
breakpoints:
mobile: 640
tablet: 1024
desktop: 1280
wide: 1536
shadows:
ambient: 'rgba(17,24,39,0.04) 0 1px 2px'
standard: 'rgba(17,24,39,0.08) 0 4px 12px -2px'
elevated: 'rgba(17,24,39,0.12) 0 12px 28px -8px'
deep: 'rgba(17,24,39,0.16) 0 24px 48px -12px'
ring: '0 0 0 3px rgba(197,247,79,0.4)'
accessibility:
contrast-text-on-bg: 21.0 # AAA — black #000 on white #ffffff
contrast-heading-on-bg: 15.9 # AAA — #222222 on #ffffff
contrast-on-control: 14.0 # AAA — white on slate #282b3b
contrast-on-brand: 16.8 # AAA — black on lime #c5f74f
contrast-muted-on-bg: 7.5 # AAA — #555555 on #ffffff
contrast-soft-on-bg: 4.8 # AA — #6b7280 on #ffffff
focus-ring: '3px solid rgba(197,247,79,0.4)'
focus-offset: '2px'
reduced-motion-honored: true
min-touch-target: 44
keyboard-nav: 'standard tab order; lime focus ring on all interactive controls; black/slate underline links'
components:
button-primary:
bg: '#282b3b'
text: '#ffffff'
padding: '10px 16px'
radius: 8
font: 'button (14/500)'
border: 'none'
hover: 'bg → #34384c'
active: 'bg → #1f2230'
use: 'primary CTA — Get Started, Documentation'
button-secondary:
bg: '#f6f6f7'
text: '#222222'
padding: '10px 16px'
radius: 8
font: 'button (14/500)'
border: '1px solid #e5e7eb'
hover: 'bg → #f1f2f3; border → #d0d3d8'
use: 'secondary action — GitHub, version pill'
button-brand:
bg: '#c5f74f'
text: '#000000'
padding: '10px 16px'
radius: 8
font: 'button (14/600)'
border: 'none'
hover: 'bg → #b9ee3c'
active: 'bg → #a9dd2f'
use: 'rare high-emphasis accent — sparingly, never more than one per view'
button-ghost:
bg: 'transparent'
text: '#000000'
padding: '10px 16px'
radius: 8
font: 'button (14/500)'
border: '1px solid transparent'
hover: 'bg → #f6f6f7'
use: 'tertiary / nav-adjacent action'
card:
bg: '#ffffff'
text: '#000000'
padding: '24px'
radius: 12
border: '1px solid #e5e7eb'
shadow: 'none at rest; ambient on hover'
hover: 'border → #d0d3d8; shadow → ambient'
use: 'feature card, dialect card, integration card'
card-tinted:
bg: '#f6f6f7'
text: '#000000'
padding: '24px'
radius: 12
border: 'none'
use: 'code-sample shell, comparison panel'
input:
bg: '#ffffff'
text: '#000000'
placeholder: '#9aa0a6'
padding: '8px 12px'
radius: 8
border: '1px solid #e5e7eb'
focus: 'border → #282b3b; ring 3px solid rgba(197,247,79,0.4)'
use: 'docs search, filter'
badge:
bg: '#f6f6f7'
text: '#222222'
padding: '2px 10px'
radius: 9999
font: 'caption (12/500)'
border: '1px solid #e5e7eb'
use: 'version tag, dialect pill, star count'
badge-brand:
bg: '#eefbcf'
text: '#000000'
padding: '2px 10px'
radius: 9999
font: 'caption (12/500)'
border: 'none'
use: 'new / highlight pill — lime wash, not full lime'
nav-link:
bg: 'transparent'
text: '#555555'
padding: '8px 12px'
font: 'nav-link (14/500)'
hover: 'text → #000000'
active: 'text → #000000; underline'
use: 'top nav, sidebar'
lineage:
summary: |
Drizzle's visual identity is GitHub-README minimalism crossed with the
Vercel/Bun school of dark-control-on-light-canvas dev marketing. The
page is aggressively monochrome — pure white `#ffffff`, pure-black `#000`
body copy, slate-graphite `#282b3b` for the only filled buttons — and
the entire chromatic identity is carried by a single hue: the lime-green
serpent logo (`#c5f74f`). That restraint is the point. Drizzle markets
itself as "TypeScript-first, lightweight, no-magic," and the design is
the argument: no gradients, no glassmorphism, no decorative colour, just
clean type, generous whitespace, and well-typeset code samples. Type is
the platform system sans (`ui-sans-serif`) and a system mono
(`ui-monospace`) for code — Drizzle ships no custom webfont, matching its
zero-dependency ethos. Code blocks lean on the Astro/Shiki token palette
(text `#414141`, GitHub-green links `#22863a`), which gives the docs a
familiar source-control register. Where Bun adds a warm cream canvas and
a pink accent, and Biome adds a confident blue, Drizzle commits to
near-zero chroma plus one acid lime — the cleanest, most code-forward
posture in the dev-tools cohort.
influences:
- name: 'Vercel'
role: 'Dark-control-on-white-canvas dev-marketing template — 8px buttons, system sans, generous vertical rhythm, monochrome restraint.'
url: https://vercel.com
- name: 'Bun'
role: 'Adjacent TypeScript-runtime brand built on a light canvas with a single vivid accent and system-font, performance-forward voice.'
url: https://bun.sh
- name: 'GitHub'
role: 'README/source-control aesthetic — black-on-white prose, grey hairlines, the GitHub-green (#22863a) and -red (#cf222e) code-token palette echoed in the docs.'
url: https://github.com
- name: 'Astro / Shiki'
role: 'Docs syntax-highlighting palette (--astro-code-color-text #414141, --astro-code-token-link #22863a) inherited directly into Drizzle''s code blocks.'
url: https://astro.build
- name: 'Tailwind CSS'
role: 'Light, hairline-bordered, utility-clean component geometry and the convention of a near-grayscale surface scale punctuated by one brand hue.'
url: https://tailwindcss.com
dark-mode: optional # light is the marketing default; the docs offer a dark theme toggle (theme-context-selector + localStorage-theme detected)
---
## 1. Visual Theme & Atmosphere
Drizzle ORM's home page opens on plain white — `#ffffff`, no off-white wash,
no tint — with pure-black body copy (`#000`) and headings that render a hair
softer at `#222222`. There is almost no colour on the page. The first
impression is **a well-typeset README that happens to be a marketing site**:
black text, grey hairlines, generous whitespace, and code samples doing most
of the heavy lifting. This is deliberate. Drizzle's pitch is "TypeScript-first,
lightweight, no-magic," and the design refuses to add visual magic where the
product refuses to add runtime magic. The canvas is the substrate; the code is
the hero.
The single piece of chroma is the brand's **signature lime-green serpent**
(`#c5f74f`) — an acid, almost-fluorescent green that lives in the logo and
shows up as the occasional accent fill. It is so saturated and so light that it
fails as text on white (1.25:1 — see §9); the brand never uses it that way.
Lime appears as a *fill* with black text on top (16.8:1 AAA), as a soft wash
behind a "new" pill, or as the focus-ring colour. It is a punctuation mark, not
a paragraph. A homepage re-probe surfaced chart and sponsor swatches rather
than a single clean accent stripe, which is itself telling: the lime is the
*logo's* colour, not a colour Drizzle paints the UI with. We keep `#c5f74f` as
the documented brand because it is the one hue the identity is built on, but the
working palette a designer reaches for daily is white, black, and slate.
The only "filled" interactive element is the dark control family — a
slate-graphite `#282b3b` that carries the primary buttons and the occasional
dark band. White text on that slate is a clean 14.0:1. This is the
Vercel/Bun-school move: a near-monochrome light page where the one filled,
high-contrast object is a dark pill, and everything else is defined by thin
grey borders and type weight. There are no drop-shadows at rest, no gradients,
no glassmorphism, no rounded-everything softness — geometry is tight (8px on
controls, 12px on cards) and decoration is essentially zero.
Typographically, Drizzle ships **no custom webfont**. It uses the platform
system sans (`ui-sans-serif`) for everything and a system mono
(`ui-monospace`) for code. That is on-brand: a zero-dependency ORM markets
itself with zero font dependencies. Code blocks adopt the Astro/Shiki token
palette (`#414141` text, `#22863a` for token links), so the docs read with the
same register as a GitHub file view — which is exactly the audience Drizzle is
talking to.
The overall mood is **performance and code clarity over flourish**. Where most
dev brands lean on a dark canvas and a glowing accent, Drizzle inverts it:
bright white, black ink, one acid-lime mark, and a single dark control. It is
the most restrained, most source-control-native posture in the dev-tools
cohort — a brand confident enough to let the code samples be the design.
**Key Characteristics**
- Plain white canvas (`#ffffff`) — no off-white wash, no tint, no gradient
- Pure-black body copy (`#000`), headings softened to `#222222`
- Single brand hue: the acid lime-green serpent (`#c5f74f`), used as fill only
- Lime fails as text on white (1.25:1) — always black-on-lime, never lime-on-white
- One filled control colour: dark slate-graphite `#282b3b` with white text (14.0:1)
- System sans (`ui-sans-serif`) + system mono (`ui-monospace`) — zero custom webfont
- Code blocks inherit the Astro/Shiki / GitHub token palette (`#414141`, `#22863a`)
- Grey hairline borders (`#e5e7eb`) define structure; near-zero shadow at rest
- Tight geometry — 8px controls, 12px cards — and no decorative effects
- Near-monochrome by design: white + black + slate, lime as punctuation
## 2. Color Palette & Roles
### Primary
- **Background** (`#ffffff`) [→ `bg`]: plain white canvas — the brand's substrate
- **Background Subtle** (`#fbfbfc`) [→ `bg-subtle`]: barely-there off-white for alternating section bands
- **Surface** (`#ffffff`) [→ `surface`]: cards sit flush on white, defined by border not fill
- **Surface Alt** (`#f6f6f7`) [→ `surface-alt`]: tinted panel, code-tab strip, secondary button fill
- **Surface Faint** (`#f1f2f3`) [→ `surface-faint`]: faint chip / low-alpha callout (the `~0.27a` star-count badge)
- **Primary Text** (`#000000`): pure-black body copy
### Brand
- **Brand Lime** (`#c5f74f`) [→ `brand`]: the signature serpent green — logo + accent fill
- **Brand Hover** (`#b9ee3c`) [→ `brand-hover`]: slightly deeper lime on hover
- **Brand Pressed** (`#a9dd2f`) [→ `brand-pressed`]: pressed lime
- **Brand Soft** (`#eefbcf`) [→ `brand-soft`]: 20% lime wash for highlight backgrounds and "new" pills
- **On-Brand Text** (`#000000`) [→ `on-brand`]: black text on lime fill — 16.8:1 AAA
### Dark Control Family
- **Control** (`#282b3b`) [→ `control`]: dark slate-graphite — the primary button and dark bands
- **Control Hover** (`#34384c`) [→ `control-hover`]: lifted slate on hover
- **Control Pressed** (`#1f2230`) [→ `control-pressed`]: pressed slate
- **On-Control Text** (`#ffffff`) [→ `on-control`]: white text on slate — 14.0:1 AAA
### Interactive
- **Link** (`#000000`) [→ `link`]: links are black, underline-driven (monochrome system)
- **Link Hover** (`#282b3b`) [→ `link-hover`]: hover shifts toward slate
- **Link Code** (`#22863a`) [→ `link-code`]: GitHub-green for code-token links (Astro/Shiki `--astro-code-token-link`)
- **Selected** (`#c5f74f59`) [→ `selected`]: 35% lime text-selection wash
- **Disabled** (`#f1f2f3`) [→ `disabled`]: disabled background
- **Disabled Text** (`#b0b3b8`) [→ `disabled-text`]: disabled text
### Neutral Scale
- **Text** (`#000000`): pure-black primary copy — 21:1 AAA
- **Text Heading** (`#222222`) [→ `text-heading`]: headings render slightly softened (measured `#222`)
- **Text Muted** (`#555555`) [→ `text-muted`]: secondary copy — 7.5:1 AAA
- **Text Soft** (`#6b7280`) [→ `text-soft`]: tertiary / captions — 4.8:1 AA
- **Text Code** (`#414141`) [→ `text-code`]: default code-block text (Astro/Shiki `--astro-code-color-text`)
- **Text Faint** (`#9aa0a6`) [→ `text-faint`]: quaternary / placeholder hints
### Surface & Borders
- **Border** (`#e5e7eb`) [→ `border`]: standard hairline — light grey on white
- **Border Soft** (`#f0f1f2`) [→ `border-soft`]: faintest divider
- **Border Strong** (`#d0d3d8`) [→ `border-strong`]: emphasised border on hover/active
- **Border Dark** (`#282b3b`) [→ `border-dark`]: dark border on the slate control family
### Shadow Colors
Shadows are cool-neutral (`rgba(17,24,39,…)`) at very low alpha. Drizzle barely
uses elevation — cards rest flat and are defined by their hairline border;
shadow appears only on hover and in overlays. Depth never carries colour:
- **Ambient** (`rgba(17,24,39,0.04)`): barely-there resting / hover shadow
- **Standard** (`rgba(17,24,39,0.08)`): card hover lift
- **Elevated** (`rgba(17,24,39,0.12)`): popover, dropdown
- **Deep** (`rgba(17,24,39,0.16)`): modal
### Semantic
- **Success** (`#22863a`): GitHub-green — reuses the code-link hue
- **Success Bg** (`#e9f6ec`): pale green surface
- **Warning** (`#b45309`): amber-brown — the only warm tone outside lime
- **Warning Bg** (`#fdf3e7`): pale amber surface
- **Danger** (`#cf222e`): GitHub-flavoured red
- **Danger Bg** (`#fbeaec`): pale red surface
- **Info** (`#282b3b`): info reuses the slate control colour
- **Info Bg** (`#f6f6f7`): neutral info surface
## 3. Typography Rules
### Font Family
- **Display & Body**: `ui-sans-serif` — the platform system sans (San Francisco on
Apple, Segoe UI on Windows, Roboto on Android/ChromeOS). Drizzle ships **no
custom webfont**, matching its zero-dependency ethos.
- **Mono**: `ui-monospace` — the platform system mono (SF Mono / Menlo /
Consolas / Liberation Mono). Used for all code samples, inline code, and
technical labels.
- **OpenType**: standard `kern`/`liga` on sans; `liga`/`calt` on mono for clean
code rendering. No stylistic-set experiments — Drizzle takes the system
default rendering as-is.
### Hierarchy
| Role | Font | Size | Weight | Line Height | Letter Spacing | Notes |
|------|------|------|--------|-------------|----------------|-------|
| display-hero | display | 80 | 700 | 1.0 | -0.03em | hero headline only |
| display-lg | display | 56 | 700 | 1.05 | -0.02em | section opener |
| h1 | display | 40 | 700 | 1.1 | -0.018em | page title |
| h2 | display | 32 | 600 | 1.2 | -0.012em | feature heading (measured `#222`, 600) |
| h3 | display | 24 | 600 | 1.25 | -0.005em | sub-feature |
| h4 | body | 20 | 600 | 1.3 | 0 | card title |
| body-lg | body | 18 | 400 | 1.55 | 0 | hero supporting copy |
| body | body | 16 | 400 | 1.55 | 0 | default body (measured 16/400) |
| body-sm | body | 14 | 400 | 1.5 | 0 | dense blocks, metadata |
| label | body | 13 | 500 | 1.4 | 0 | form label, field name |
| caption | body | 12 | 500 | 1.4 | 0.02em | badge, footnote |
| button | body | 14 | 500 | 1.0 | 0 | button text |
| nav-link | body | 14 | 500 | 1.2 | 0 | top nav, sidebar |
| code-body | mono | 14 | 400 | 1.6 | 0 | code blocks |
| code-inline | mono | 13 | 500 | 1.4 | 0 | inline `code` in prose |
| code-label | mono | 12 | 500 | 1.3 | 0.02em | tab label, dialect name |
| metric | display | 28 | 700 | 1.1 | -0.01em | star count, benchmark number |
### Principles
- **System fonts only**: no webfont request, no FOUT/FOIT, no font budget — the
type story is "the OS already has good defaults; we use them."
- **Weight does the hierarchy work**: with no colour and one family, weight
(400 → 500 → 600 → 700) and size carry the entire hierarchy.
- **Tight display tracking**: -0.012em to -0.03em compresses headlines for a
confident, modern dev-marketing feel; body stays at 0.
- **Headings soften to `#222`, not `#000`**: the measured h2 colour is `#222222`,
a subtle softening that keeps long headlines from feeling heavy.
- **Mono carries all code**: 14px `ui-monospace` at 1.6 line-height — comfortable
for multi-line query examples, the page's primary content.
- **Code-token palette inherited from Astro/Shiki**: code text `#414141`, token
links `#22863a` — the docs read like a syntax-highlighted source file.
- **No serif anywhere**: Drizzle is committedly sans + mono; there are no
editorial-serif moments.
- **Body at 16px, not 15**: full system-default reading size — the brand
prioritises legibility over dense-tooling compression.
## 4. Component Stylings
### Buttons
**button-primary** — Dark slate control
- Background: `#282b3b`
- Text: `#ffffff` at 14/500
- Padding: 10px 16px
- Radius: 8
- Border: none
- Hover: bg → `#34384c`
- Active: bg → `#1f2230`
- Focus: 3px lime ring `rgba(197,247,79,0.4)`, 2px offset
- Use: primary CTA — "Get Started", "Documentation"
**button-secondary** — Tinted neutral
- Background: `#f6f6f7`
- Text: `#222222` at 14/500
- Padding: 10px 16px
- Radius: 8
- Border: 1px solid `#e5e7eb`
- Hover: bg → `#f1f2f3`, border → `#d0d3d8`
- Use: secondary action — "GitHub", version pill, "Examples"
**button-brand** — Lime accent (rare)
- Background: `#c5f74f`
- Text: `#000000` at 14/600
- Padding: 10px 16px
- Radius: 8
- Border: none
- Hover: bg → `#b9ee3c`
- Active: bg → `#a9dd2f`
- Use: high-emphasis accent — used sparingly, never more than one per view. Black-on-lime only; never lime text.
**button-ghost** — Bare
- Background: transparent
- Text: `#000000` at 14/500
- Padding: 10px 16px
- Radius: 8
- Border: 1px solid transparent
- Hover: bg → `#f6f6f7`
- Use: tertiary / nav-adjacent action
### Cards
**card-default**
- Background: `#ffffff`
- Padding: 24px
- Radius: 12
- Border: 1px solid `#e5e7eb`
- Shadow: none at rest
- Hover: border → `#d0d3d8`, shadow → ambient
- Use: feature card, dialect card, integration card
**card-tinted** — Code-sample shell
- Background: `#f6f6f7`
- Padding: 24px
- Radius: 12
- Border: none
- Use: code-sample wrapper, comparison panel, callout block
### Badges / Tags / Pills
**badge-default**
- Background: `#f6f6f7`
- Text: `#222222` at 12/500
- Padding: 2px 10px
- Radius: pill (9999)
- Border: 1px solid `#e5e7eb`
- Use: version tag, dialect pill, star count ("33k+")
**badge-brand** — Lime wash highlight
- Background: `#eefbcf` (20% lime wash, not full lime)
- Text: `#000000` at 12/500
- Padding: 2px 10px
- Radius: pill
- Border: none
- Use: "new", "beta", highlight pill — soft wash keeps the acid lime calm at small sizes
### Inputs / Forms
**input-text**
- Background: `#ffffff`
- Text: `#000000` at 14/400
- Placeholder: `#9aa0a6`
- Padding: 8px 12px
- Radius: 8
- Border: 1px solid `#e5e7eb`
- Focus: border → `#282b3b`, ring 3px solid `rgba(197,247,79,0.4)`
- Use: docs search, dialect filter
### Navigation
**nav-link**
- Background: transparent
- Text: `#555555` at 14/500
- Padding: 8px 12px
- Hover: text → `#000000`
- Active: text → `#000000` + 2px underline
- Use: top nav, docs sidebar
### Decorative / Code
**code-block**
- Background: `#f6f6f7` (or `#ffffff` with border in tighter contexts)
- Text: `#414141` at 14/400 `ui-monospace`, 1.6 line-height
- Token links: `#22863a` (GitHub-green)
- Padding: 16px 20px
- Radius: 8
- Tab strip: `#f6f6f7` with `code-label` mono tabs (dialect names: PostgreSQL / MySQL / SQLite)
- Use: the page's primary content — query examples, schema definitions
**inline-code**
- Background: `#f6f6f7`
- Text: `#000000` at 13/500 `ui-monospace`
- Padding: 2px 6px
- Radius: 4
- Use: `code` spans within prose
**logo-mark** — The serpent
- The lime-green (`#c5f74f`) serpent is the one place full-saturation lime appears
- Renders on white at intrinsic size; never recoloured, never gradient-filled
## 5. Layout Principles
### Spacing System
- **Base unit**: 4px
- **Scale**: 0, 4, 8, 12, 16, 24, 32, 48, 64, 96
- **Density observation**: Drizzle is **moderate-to-spacious** — generous
whitespace between sections (64–96px), comfortable padding inside cards
(24px), but content-dense within code samples where line-height (1.6) keeps
long queries readable. The whitespace is the design.
### Grid & Container
- **Page width**: 1280px max
- **Prose / docs width**: 720px (long-form documentation and marketing body)
- **Header height**: 64px
- **Hero treatment**: white-canvas hero with the headline, a one-line subhead,
two buttons (dark primary + tinted secondary), and a tabbed code sample below
- **Feature grid**: 3-col at desktop, 2-col at tablet, 1-col at mobile
### Whitespace Philosophy
- Whitespace is the primary structural device — with almost no colour and no
shadow, empty space and hairline borders carry the layout
- Sections breathe at 64–96px; the page never feels crowded
- Code samples are the densest moment on the page; everything around them is air
### Section Cadence
- Hero (white + tabbed code sample) → feature grid → dialect/integration cards →
comparison / code-heavy section → community (stars, sponsors) → footer
- Alternating bands use `#fbfbfc` or `#f6f6f7` at most — never a dark band on the
marketing page (dark `#282b3b` is reserved for controls)
- The lime appears at most once or twice per viewport — logo, plus maybe one
accent pill or focus ring
## 6. Shapes & Radius Scale
| Tier | Px | Use |
|------|----|----|
| Micro | 2 | inline chips, tight tokens |
| Standard | 4 | inline code, small badges |
| Comfortable | 8 | buttons, inputs, code blocks |
| Relaxed | 12 | cards |
| Featured | 16 | hero shells, large panels |
| Pill | 9999 | badges, version pills, star count |
Radius is consistent and modest — Drizzle never goes fully rounded on
rectangular surfaces. The 8px control radius and 12px card radius are the
workhorses; pills are reserved for tag-like metadata. Compound radii are rare;
code-tab strips merge with the block below by dropping the bottom radius
(`8 8 0 0`).
## 7. Depth & Elevation
| Level | Treatment | Use |
|-------|-----------|----|
| 0 | flat, no border | hero copy, prose on white |
| 1 | 1px solid `#e5e7eb` border, no shadow | resting cards, code blocks |
| 2 | 1px border + ambient shadow (`0.04`) | card hover |
| 3 | standard shadow (`0 4px 12px -2px`, `0.08`) | sticky header on scroll |
| 4 | elevated shadow (`0 12px 28px -8px`, `0.12`) | dropdown, popover, tooltip |
| 5 | deep shadow (`0 24px 48px -12px`, `0.16`) | modal, command palette |
**Shadow Philosophy**: Drizzle is a near-flat brand. Cards rest with **no
shadow at all** — they are defined entirely by a light-grey hairline border on
white. Elevation appears only when something genuinely floats (dropdown, modal)
or on hover, and even then the shadow is cool-neutral (`rgba(17,24,39,…)`) and
very low-alpha (0.04–0.16). Depth never carries colour — the lime is foreground
brand, never a glow. This flat-on-white, border-defined approach is the GitHub /
Tailwind register: structure through hairlines, not drop-shadows.
## 8. Interaction & Motion
### Easing
- **Standard**: `cubic-bezier(0.4, 0, 0.2, 1)` — default for hovers and lifts
- **Decelerate**: `cubic-bezier(0, 0, 0.2, 1)` — entering overlays, tooltips
### Durations
- **Fast** (150ms): hover, focus, button press
- **Standard** (240ms): card border/shadow lift, dropdown open
- **Slow** (320ms): modal enter, code-sample tab crossfade
### Per-Component Recipes
- **Button hover**: background colour transitions over 150ms; no scale, no lift
- **Card hover**: border `#e5e7eb` → `#d0d3d8` and ambient shadow fade in over 240ms
- **Code-tab switch**: crossfade the sample body over 240–320ms when switching
dialect (PostgreSQL / MySQL / SQLite)
- **Link hover**: underline appears / text shifts black → slate over 150ms
- **Focus**: 3px lime ring `rgba(197,247,79,0.4)` appears instantly on keyboard focus
- **Star count / metric**: optional count-up animation on first scroll into view
### Page Transitions
- Default: opacity-only fade over 320ms — no slide, no parallax. The brand's
motion is as restrained as its colour.
### Reduced Motion
When `prefers-reduced-motion: reduce` is set:
- Code-sample tab crossfades become instant swaps
- Card hover lifts removed (border colour change retained for affordance)
- Metric count-up animations disabled (final value shown immediately)
- All transitions reduce to opacity
## 9. Accessibility & A11y
### Contrast Pairs
- **Black `#000` on white `#ffffff`**: 21.0:1 (AAA — maximum)
- **Heading `#222222` on white**: 15.9:1 (AAA)
- **White on slate control `#282b3b`**: 14.0:1 (AAA)
- **Black on lime brand `#c5f74f`**: 16.8:1 (AAA) — the only safe way to use lime
- **Slate `#282b3b` on lime `#c5f74f`**: 11.2:1 (AAA) — alternate on-brand pairing
- **Muted `#555555` on white**: 7.5:1 (AAA)
- **Code text `#414141` on white**: 10.2:1 (AAA)
- **Soft `#6b7280` on white**: 4.8:1 (AA at body sizes)
- **Code link `#22863a` on white**: 4.6:1 (AA at body sizes)
> ⚠️ **Lime is never a text colour.** `#c5f74f` on white is **1.25:1** — far
> below any threshold. The brand always uses lime as a *fill* (black or slate
> text on top) or as the focus-ring colour. Never set lime as `color:` on a
> white surface.
### Focus Indicators
- Default: 3px solid `rgba(197,247,79,0.4)` lime ring, 2px offset
- Inputs: focus border → `#282b3b` + 3px lime ring
- The lime ring is the one place the brand colour earns its keep in the UI —
high-visibility against both white surfaces and dark controls
### ARIA Patterns
- **Code-tab group**: `role="tablist"` with `aria-selected` on the active dialect
tab; arrow-key navigation between PostgreSQL / MySQL / SQLite
- **Dialog / command palette**: `aria-labelledby` + `aria-describedby`; trap
focus; ESC to close
- **Search combobox**: standard listbox pattern with `aria-activedescendant`
- **Version / star badges**: include text labels; never colour-only meaning
### Keyboard Navigation
- Tab order follows visual order
- Skip-link at page top
- Enter/Space activates buttons and tabs
- Cmd/Ctrl+K opens docs search
- Arrow keys move within the dialect tablist
### Screen Reader Hints
- The lime serpent logo carries `alt="Drizzle ORM"`
- Code blocks use `<pre><code>` semantics; copy-button has `aria-label="Copy code"`
- Star count exposes a label ("33k+ GitHub stars"), not a bare number
### Reduced Motion
`prefers-reduced-motion: reduce` honored — see §8.
## 10. Responsive Behavior
### Breakpoints
| Name | Min Width | Use |
|------|-----------|----|
| Mobile | — | default, 1-col |
| Tablet | 640 | 2-col grids |
| Desktop | 1024 | 3-col grids, sidebar docs |
| Wide | 1280 | max page width |
| Ultra | 1536 | hero-only breathing room |
### Touch Targets
- Minimum 44×44px for primary controls and tabs
- Dialect tabs expand hit-area on touch even where the visual label is compact
### Collapsing Strategy
- **Nav**: collapses to hamburger ≤ 768px; docs sidebar becomes a drawer
- **Feature grid**: 3-col → 2-col @ 1024 → 1-col @ 640
- **Hero**: display-hero (80px) reduces to ~40px @ 640
- **Code samples**: scroll horizontally on overflow rather than wrap query syntax
- **Dialect tabs**: stay as a tablist; scroll horizontally if they overflow
### Image Behavior
- The serpent logo is SVG, scales crisp at any size
- Code samples are live text, never images — they reflow and remain selectable
- Integration logos lock at intrinsic size in a grey-on-white grid
## 11. Content & Voice
### Tone
Technical, precise, performance-forward, and quietly confident. Drizzle writes
for TypeScript developers who want SQL they can read, not an ORM that hides the
database behind magic. The copy is direct and benefit-led — "TypeScript-first,
lightweight, no-magic" — and it leans on code samples to make its case rather
than adjectives. No hype, no exclamation marks, no enterprise jargon; the voice
matches the design's restraint.
### Microcopy Patterns
- **Button verbs**: "Get Started", "Documentation", "View on GitHub",
"Examples" — short, literal, no marketing flourish
- **Section headers**: feature-statement style ("Everything you expect from an
ORM. And more.") — plain claims backed by code below
- **Error message recipe**: `[what failed]: [why]` — e.g.,
"Migration failed: column already exists"
- **Empty states**: "No results. [CTA: Browse the docs]"
### CTA Verb Conventions
- Top-level: "Get Started"
- Docs: "Documentation", "Read the docs"
- Source: "View on GitHub", "Star us"
- Examples: "Examples", "See it in action"
## 12. Dark Mode & Theming
Drizzle is **light by default** for marketing — the white-canvas, black-ink,
lime-mark identity is the brand's public face. The documentation, however,
offers a **dark theme toggle** (a theme-context selector with `localStorage`
persistence was detected on the page), so the brand is `optional`, not
light-only.
In dark mode the inversion is straightforward because the palette is nearly
grayscale:
- `bg`: `#ffffff` → `#0d0e12` (near-black, with the same cool undertone as the slate control)
- `surface`: `#ffffff` → `#16171d`
- `surface-alt`: `#f6f6f7` → `#1d1f27`
- `text`: `#000000` → `#ededf0`
- `text-muted`: `#555555` → `#9aa0a6`
- `border`: `#e5e7eb` → `#2a2c36`
- `control`: `#282b3b` → `#ededf0` (the dark button inverts to a light pill in dark mode)
- `on-control`: `#ffffff` → `#0d0e12`
- `brand` stays `#c5f74f` — the lime works on both white and near-black, and gains
even more punch on the dark canvas (lime on `#282b3b` is 11.2:1 AAA)
The lime is the constant across both themes; it is the only colour that never
changes. Everything else is a grayscale inversion.
## 13. Lineage & Influences
Drizzle's design is GitHub-README minimalism crossed with the Vercel/Bun school
of dark-control-on-light-canvas dev marketing. The page is aggressively
monochrome — pure white, pure-black copy, a single slate-graphite control colour
— and the entire chromatic identity is carried by one hue: the lime-green
serpent logo (`#c5f74f`). That restraint *is* the argument. Drizzle markets
itself as "TypeScript-first, lightweight, no-magic," and the visual language
refuses to add magic where the product refuses to: no gradients, no
glassmorphism, no decorative colour, just clean system type, generous
whitespace, and well-typeset code.
The type story reinforces the ethos — Drizzle ships **no custom webfont**, using
the platform `ui-sans-serif` and `ui-monospace`, the same way it ships a
lightweight, low-dependency runtime. Code blocks inherit the Astro/Shiki token
palette (text `#414141`, GitHub-green links `#22863a`), which gives the docs the
register of a syntax-highlighted source file — exactly the audience Drizzle
talks to. Where Bun adds a warm cream canvas and a pink accent, and Biome
commits to a confident blue, Drizzle stakes out the cleanest, most
code-forward, near-zero-chroma corner of the dev-tools cohort: white, black,
slate, and one acid lime.
- **Vercel** — https://vercel.com — dark-control-on-white-canvas dev-marketing template; 8px buttons, system sans, monochrome restraint
- **Bun** — https://bun.sh — adjacent TypeScript-runtime brand on a light canvas with a single vivid accent and system-font, performance-forward voice
- **GitHub** — https://github.com — black-on-white prose, grey hairlines, the GitHub-green/-red code-token palette
- **Astro / Shiki** — https://astro.build — docs syntax-highlighting palette inherited directly into Drizzle's code blocks
- **Tailwind CSS** — https://tailwindcss.com — light, hairline-bordered, utility-clean geometry and the near-grayscale-plus-one-hue convention
## 14. Do's and Don'ts
### Do
- **Do** keep the canvas pure white (`#ffffff`) — no tint, no gradient, no off-white wash beyond the faint `#fbfbfc` band
- **Do** use the dark slate `#282b3b` as the single filled "primary button" colour, white text on top
- **Do** treat lime (`#c5f74f`) as a fill or focus-ring colour only — always black or slate text on top
- **Do** carry hierarchy with weight and size, since there is one font family and almost no colour
- **Do** define cards with a light-grey hairline (`#e5e7eb`), not a shadow
- **Do** keep code samples as live, selectable text in `ui-monospace` at 1.6 line-height
- **Do** inherit the Astro/Shiki / GitHub code-token palette (`#414141`, `#22863a`) in code blocks
- **Do** keep section rhythm spacious (64–96px) — whitespace is the design
- **Do** soften headings to `#222222` rather than pure black for long titles
- **Do** limit lime to once or twice per viewport — logo plus, at most, one accent
### Don't
- **Don't** set lime as a text colour on white — it is 1.25:1 and unreadable
- **Don't** add a second brand hue; the identity is monochrome-plus-one-lime
- **Don't** introduce a dark marketing canvas — dark `#282b3b` is for controls, not section backgrounds (dark mode is a docs toggle, not a marketing band)
- **Don't** add drop-shadows to resting cards; structure comes from hairlines
- **Don't** use gradients, glassmorphism, or glow effects anywhere
- **Don't** load a custom webfont — the system-font choice is on-brand and intentional
- **Don't** use serif type anywhere; Drizzle is committedly sans + mono
- **Don't** flood the page with lime fills — one acid-lime pill per view is the ceiling
- **Don't** colour code-block text with the brand lime; code uses the neutral `#414141` token palette
- **Don't** round rectangular surfaces beyond 12px (cards) — keep geometry tight, not pill-soft
## 15. Agent Prompt Guide
### Quick Color Reference
```
bg: #ffffff
surface-alt: #f6f6f7
text: #000000
text-heading: #222222
text-muted: #555555
brand (lime, fill-only): #c5f74f
on-brand: #000000
control (dark button): #282b3b
on-control: #ffffff
border: #e5e7eb
code-text: #414141
code-link: #22863a
```
### Example Component Prompts
1. "Create a hero section: pure-white `#ffffff` background, an 80px headline in the
system sans (`ui-sans-serif`) at 700 weight with -0.03em tracking, colour `#000`
(or `#222` if the headline is long), and an 18px subhead in `#555555`. Add a dark
primary button (`#282b3b` fill, white text, 8px radius, 10px 16px padding) saying
'Get Started' and a tinted secondary button 'Documentation' (`#f6f6f7` fill, `#222`
text, 1px `#e5e7eb` border). Below, a tabbed code sample shell."
2. "Design a tabbed code sample: a `#f6f6f7` tab strip with three mono labels
(PostgreSQL / MySQL / SQLite) in 12px `ui-monospace`, active tab black with a 2px
bottom indicator. Below it a code block on `#f6f6f7`, 14px `ui-monospace` text in
`#414141` at 1.6 line-height, token links in `#22863a`, 16px 20px padding, 8px
radius merging with the tab strip above. Add a copy button with `aria-label='Copy code'`."
3. "Build a feature card: white `#ffffff` background, 24px padding, 12px radius, 1px
`#e5e7eb` hairline border, no shadow at rest. Inside: a 20px title in `#000` at 600,
a 16px body in `#555555`. On hover, border shifts to `#d0d3d8` and a faint ambient
shadow (`rgba(17,24,39,0.04)`) fades in over 240ms."
4. "Create a version / dialect badge row: pill badges (radius 9999) on `#f6f6f7` with
1px `#e5e7eb` border, 12px text in `#222222`, 2px 10px padding. One badge is a 'new'
highlight: lime *wash* background `#eefbcf` (not full lime), black text, no border."
5. "Design a focus state demo: any input on white with a 1px `#e5e7eb` border; on focus
the border becomes `#282b3b` and a 3px lime ring `rgba(197,247,79,0.4)` appears at 2px
offset. Note: the lime ring is the only place the brand colour appears in the UI chrome."
6. "Build a community / metrics strip on white: a large 28px metric number in the system
sans at 700 ('33k+'), with a `#f6f6f7` low-alpha chip behind it (radius 8), and a
`#555555` caption 'GitHub stars'. Optional count-up animation on scroll-into-view,
disabled under reduced-motion."
### Iteration Guide
1. **Start on white** — `#ffffff`, not off-white, not grey. The plain canvas is the brand
2. **Make the only filled button slate `#282b3b`** with white text — that is the "primary," not a coloured button
3. **Use lime only as a fill or ring** — black-on-`#c5f74f`, or the `rgba(197,247,79,0.4)` focus ring. Never lime text on white (1.25:1)
4. **Count the lime** — if more than one lime element is visible per viewport (beyond the logo), demote one to slate or the `#eefbcf` wash
5. **Define cards with borders, not shadows** — 1px `#e5e7eb` hairline; shadow only on hover/overlay
6. **Keep type to the system stack** — `ui-sans-serif` + `ui-monospace`; do not introduce a webfont
7. **Let code carry the page** — generous, selectable mono code samples with the `#414141`/`#22863a` token palette are the primary content
8. **Hold the whitespace** — 64–96px between sections; resist the urge to fill empty space with colour or decoration
1. Visual Theme & Atmosphere
Drizzle ORM’s home page opens on plain white — #ffffff, no off-white wash,
no tint — with pure-black body copy (#000) and headings that render a hair
softer at #222222. There is almost no colour on the page. The first
impression is a well-typeset README that happens to be a marketing site:
black text, grey hairlines, generous whitespace, and code samples doing most
of the heavy lifting. This is deliberate. Drizzle’s pitch is “TypeScript-first,
lightweight, no-magic,” and the design refuses to add visual magic where the
product refuses to add runtime magic. The canvas is the substrate; the code is
the hero.
The single piece of chroma is the brand’s signature lime-green serpent
(#c5f74f) — an acid, almost-fluorescent green that lives in the logo and
shows up as the occasional accent fill. It is so saturated and so light that it
fails as text on white (1.25:1 — see §9); the brand never uses it that way.
Lime appears as a fill with black text on top (16.8:1 AAA), as a soft wash
behind a “new” pill, or as the focus-ring colour. It is a punctuation mark, not
a paragraph. A homepage re-probe surfaced chart and sponsor swatches rather
than a single clean accent stripe, which is itself telling: the lime is the
logo’s colour, not a colour Drizzle paints the UI with. We keep #c5f74f as
the documented brand because it is the one hue the identity is built on, but the
working palette a designer reaches for daily is white, black, and slate.
The only “filled” interactive element is the dark control family — a
slate-graphite #282b3b that carries the primary buttons and the occasional
dark band. White text on that slate is a clean 14.0:1. This is the
Vercel/Bun-school move: a near-monochrome light page where the one filled,
high-contrast object is a dark pill, and everything else is defined by thin
grey borders and type weight. There are no drop-shadows at rest, no gradients,
no glassmorphism, no rounded-everything softness — geometry is tight (8px on
controls, 12px on cards) and decoration is essentially zero.
Typographically, Drizzle ships no custom webfont. It uses the platform
system sans (ui-sans-serif) for everything and a system mono
(ui-monospace) for code. That is on-brand: a zero-dependency ORM markets
itself with zero font dependencies. Code blocks adopt the Astro/Shiki token
palette (#414141 text, #22863a for token links), so the docs read with the
same register as a GitHub file view — which is exactly the audience Drizzle is
talking to.
The overall mood is performance and code clarity over flourish. Where most dev brands lean on a dark canvas and a glowing accent, Drizzle inverts it: bright white, black ink, one acid-lime mark, and a single dark control. It is the most restrained, most source-control-native posture in the dev-tools cohort — a brand confident enough to let the code samples be the design.
Key Characteristics
- Plain white canvas (
#ffffff) — no off-white wash, no tint, no gradient - Pure-black body copy (
#000), headings softened to#222222 - Single brand hue: the acid lime-green serpent (
#c5f74f), used as fill only - Lime fails as text on white (1.25:1) — always black-on-lime, never lime-on-white
- One filled control colour: dark slate-graphite
#282b3bwith white text (14.0:1) - System sans (
ui-sans-serif) + system mono (ui-monospace) — zero custom webfont - Code blocks inherit the Astro/Shiki / GitHub token palette (
#414141,#22863a) - Grey hairline borders (
#e5e7eb) define structure; near-zero shadow at rest - Tight geometry — 8px controls, 12px cards — and no decorative effects
- Near-monochrome by design: white + black + slate, lime as punctuation
2. Color Palette & Roles
Primary
- Background (
#ffffff) [→bg]: plain white canvas — the brand’s substrate - Background Subtle (
#fbfbfc) [→bg-subtle]: barely-there off-white for alternating section bands - Surface (
#ffffff) [→surface]: cards sit flush on white, defined by border not fill - Surface Alt (
#f6f6f7) [→surface-alt]: tinted panel, code-tab strip, secondary button fill - Surface Faint (
#f1f2f3) [→surface-faint]: faint chip / low-alpha callout (the~0.27astar-count badge) - Primary Text (
#000000): pure-black body copy
Brand
- Brand Lime (
#c5f74f) [→brand]: the signature serpent green — logo + accent fill - Brand Hover (
#b9ee3c) [→brand-hover]: slightly deeper lime on hover - Brand Pressed (
#a9dd2f) [→brand-pressed]: pressed lime - Brand Soft (
#eefbcf) [→brand-soft]: 20% lime wash for highlight backgrounds and “new” pills - On-Brand Text (
#000000) [→on-brand]: black text on lime fill — 16.8:1 AAA
Dark Control Family
- Control (
#282b3b) [→control]: dark slate-graphite — the primary button and dark bands - Control Hover (
#34384c) [→control-hover]: lifted slate on hover - Control Pressed (
#1f2230) [→control-pressed]: pressed slate - On-Control Text (
#ffffff) [→on-control]: white text on slate — 14.0:1 AAA
Interactive
- Link (
#000000) [→link]: links are black, underline-driven (monochrome system) - Link Hover (
#282b3b) [→link-hover]: hover shifts toward slate - Link Code (
#22863a) [→link-code]: GitHub-green for code-token links (Astro/Shiki--astro-code-token-link) - Selected (
#c5f74f59) [→selected]: 35% lime text-selection wash - Disabled (
#f1f2f3) [→disabled]: disabled background - Disabled Text (
#b0b3b8) [→disabled-text]: disabled text
Neutral Scale
- Text (
#000000): pure-black primary copy — 21:1 AAA - Text Heading (
#222222) [→text-heading]: headings render slightly softened (measured#222) - Text Muted (
#555555) [→text-muted]: secondary copy — 7.5:1 AAA - Text Soft (
#6b7280) [→text-soft]: tertiary / captions — 4.8:1 AA - Text Code (
#414141) [→text-code]: default code-block text (Astro/Shiki--astro-code-color-text) - Text Faint (
#9aa0a6) [→text-faint]: quaternary / placeholder hints
Surface & Borders
- Border (
#e5e7eb) [→border]: standard hairline — light grey on white - Border Soft (
#f0f1f2) [→border-soft]: faintest divider - Border Strong (
#d0d3d8) [→border-strong]: emphasised border on hover/active - Border Dark (
#282b3b) [→border-dark]: dark border on the slate control family
Shadow Colors
Shadows are cool-neutral (rgba(17,24,39,…)) at very low alpha. Drizzle barely
uses elevation — cards rest flat and are defined by their hairline border;
shadow appears only on hover and in overlays. Depth never carries colour:
- Ambient (
rgba(17,24,39,0.04)): barely-there resting / hover shadow - Standard (
rgba(17,24,39,0.08)): card hover lift - Elevated (
rgba(17,24,39,0.12)): popover, dropdown - Deep (
rgba(17,24,39,0.16)): modal
Semantic
- Success (
#22863a): GitHub-green — reuses the code-link hue - Success Bg (
#e9f6ec): pale green surface - Warning (
#b45309): amber-brown — the only warm tone outside lime - Warning Bg (
#fdf3e7): pale amber surface - Danger (
#cf222e): GitHub-flavoured red - Danger Bg (
#fbeaec): pale red surface - Info (
#282b3b): info reuses the slate control colour - Info Bg (
#f6f6f7): neutral info surface
3. Typography Rules
Font Family
- Display & Body:
ui-sans-serif— the platform system sans (San Francisco on Apple, Segoe UI on Windows, Roboto on Android/ChromeOS). Drizzle ships no custom webfont, matching its zero-dependency ethos. - Mono:
ui-monospace— the platform system mono (SF Mono / Menlo / Consolas / Liberation Mono). Used for all code samples, inline code, and technical labels. - OpenType: standard
kern/ligaon sans;liga/calton mono for clean code rendering. No stylistic-set experiments — Drizzle takes the system default rendering as-is.
Hierarchy
| Role | Font | Size | Weight | Line Height | Letter Spacing | Notes |
|---|---|---|---|---|---|---|
| display-hero | display | 80 | 700 | 1.0 | -0.03em | hero headline only |
| display-lg | display | 56 | 700 | 1.05 | -0.02em | section opener |
| h1 | display | 40 | 700 | 1.1 | -0.018em | page title |
| h2 | display | 32 | 600 | 1.2 | -0.012em | feature heading (measured #222, 600) |
| h3 | display | 24 | 600 | 1.25 | -0.005em | sub-feature |
| h4 | body | 20 | 600 | 1.3 | 0 | card title |
| body-lg | body | 18 | 400 | 1.55 | 0 | hero supporting copy |
| body | body | 16 | 400 | 1.55 | 0 | default body (measured 16/400) |
| body-sm | body | 14 | 400 | 1.5 | 0 | dense blocks, metadata |
| label | body | 13 | 500 | 1.4 | 0 | form label, field name |
| caption | body | 12 | 500 | 1.4 | 0.02em | badge, footnote |
| button | body | 14 | 500 | 1.0 | 0 | button text |
| nav-link | body | 14 | 500 | 1.2 | 0 | top nav, sidebar |
| code-body | mono | 14 | 400 | 1.6 | 0 | code blocks |
| code-inline | mono | 13 | 500 | 1.4 | 0 | inline code in prose |
| code-label | mono | 12 | 500 | 1.3 | 0.02em | tab label, dialect name |
| metric | display | 28 | 700 | 1.1 | -0.01em | star count, benchmark number |
Principles
- System fonts only: no webfont request, no FOUT/FOIT, no font budget — the type story is “the OS already has good defaults; we use them.”
- Weight does the hierarchy work: with no colour and one family, weight (400 → 500 → 600 → 700) and size carry the entire hierarchy.
- Tight display tracking: -0.012em to -0.03em compresses headlines for a confident, modern dev-marketing feel; body stays at 0.
- Headings soften to
#222, not#000: the measured h2 colour is#222222, a subtle softening that keeps long headlines from feeling heavy. - Mono carries all code: 14px
ui-monospaceat 1.6 line-height — comfortable for multi-line query examples, the page’s primary content. - Code-token palette inherited from Astro/Shiki: code text
#414141, token links#22863a— the docs read like a syntax-highlighted source file. - No serif anywhere: Drizzle is committedly sans + mono; there are no editorial-serif moments.
- Body at 16px, not 15: full system-default reading size — the brand prioritises legibility over dense-tooling compression.
4. Component Stylings
Buttons
button-primary — Dark slate control
- Background:
#282b3b - Text:
#ffffffat 14/500 - Padding: 10px 16px
- Radius: 8
- Border: none
- Hover: bg →
#34384c - Active: bg →
#1f2230 - Focus: 3px lime ring
rgba(197,247,79,0.4), 2px offset - Use: primary CTA — “Get Started”, “Documentation”
button-secondary — Tinted neutral
- Background:
#f6f6f7 - Text:
#222222at 14/500 - Padding: 10px 16px
- Radius: 8
- Border: 1px solid
#e5e7eb - Hover: bg →
#f1f2f3, border →#d0d3d8 - Use: secondary action — “GitHub”, version pill, “Examples”
button-brand — Lime accent (rare)
- Background:
#c5f74f - Text:
#000000at 14/600 - Padding: 10px 16px
- Radius: 8
- Border: none
- Hover: bg →
#b9ee3c - Active: bg →
#a9dd2f - Use: high-emphasis accent — used sparingly, never more than one per view. Black-on-lime only; never lime text.
button-ghost — Bare
- Background: transparent
- Text:
#000000at 14/500 - Padding: 10px 16px
- Radius: 8
- Border: 1px solid transparent
- Hover: bg →
#f6f6f7 - Use: tertiary / nav-adjacent action
Cards
card-default
- Background:
#ffffff - Padding: 24px
- Radius: 12
- Border: 1px solid
#e5e7eb - Shadow: none at rest
- Hover: border →
#d0d3d8, shadow → ambient - Use: feature card, dialect card, integration card
card-tinted — Code-sample shell
- Background:
#f6f6f7 - Padding: 24px
- Radius: 12
- Border: none
- Use: code-sample wrapper, comparison panel, callout block
Badges / Tags / Pills
badge-default
- Background:
#f6f6f7 - Text:
#222222at 12/500 - Padding: 2px 10px
- Radius: pill (9999)
- Border: 1px solid
#e5e7eb - Use: version tag, dialect pill, star count (“33k+”)
badge-brand — Lime wash highlight
- Background:
#eefbcf(20% lime wash, not full lime) - Text:
#000000at 12/500 - Padding: 2px 10px
- Radius: pill
- Border: none
- Use: “new”, “beta”, highlight pill — soft wash keeps the acid lime calm at small sizes
Inputs / Forms
input-text
- Background:
#ffffff - Text:
#000000at 14/400 - Placeholder:
#9aa0a6 - Padding: 8px 12px
- Radius: 8
- Border: 1px solid
#e5e7eb - Focus: border →
#282b3b, ring 3px solidrgba(197,247,79,0.4) - Use: docs search, dialect filter
Navigation
nav-link
- Background: transparent
- Text:
#555555at 14/500 - Padding: 8px 12px
- Hover: text →
#000000 - Active: text →
#000000+ 2px underline - Use: top nav, docs sidebar
Decorative / Code
code-block
- Background:
#f6f6f7(or#ffffffwith border in tighter contexts) - Text:
#414141at 14/400ui-monospace, 1.6 line-height - Token links:
#22863a(GitHub-green) - Padding: 16px 20px
- Radius: 8
- Tab strip:
#f6f6f7withcode-labelmono tabs (dialect names: PostgreSQL / MySQL / SQLite) - Use: the page’s primary content — query examples, schema definitions
inline-code
- Background:
#f6f6f7 - Text:
#000000at 13/500ui-monospace - Padding: 2px 6px
- Radius: 4
- Use:
codespans within prose
logo-mark — The serpent
- The lime-green (
#c5f74f) serpent is the one place full-saturation lime appears - Renders on white at intrinsic size; never recoloured, never gradient-filled
5. Layout Principles
Spacing System
- Base unit: 4px
- Scale: 0, 4, 8, 12, 16, 24, 32, 48, 64, 96
- Density observation: Drizzle is moderate-to-spacious — generous whitespace between sections (64–96px), comfortable padding inside cards (24px), but content-dense within code samples where line-height (1.6) keeps long queries readable. The whitespace is the design.
Grid & Container
- Page width: 1280px max
- Prose / docs width: 720px (long-form documentation and marketing body)
- Header height: 64px
- Hero treatment: white-canvas hero with the headline, a one-line subhead, two buttons (dark primary + tinted secondary), and a tabbed code sample below
- Feature grid: 3-col at desktop, 2-col at tablet, 1-col at mobile
Whitespace Philosophy
- Whitespace is the primary structural device — with almost no colour and no shadow, empty space and hairline borders carry the layout
- Sections breathe at 64–96px; the page never feels crowded
- Code samples are the densest moment on the page; everything around them is air
Section Cadence
- Hero (white + tabbed code sample) → feature grid → dialect/integration cards → comparison / code-heavy section → community (stars, sponsors) → footer
- Alternating bands use
#fbfbfcor#f6f6f7at most — never a dark band on the marketing page (dark#282b3bis reserved for controls) - The lime appears at most once or twice per viewport — logo, plus maybe one accent pill or focus ring
6. Shapes & Radius Scale
| Tier | Px | Use |
|---|---|---|
| Micro | 2 | inline chips, tight tokens |
| Standard | 4 | inline code, small badges |
| Comfortable | 8 | buttons, inputs, code blocks |
| Relaxed | 12 | cards |
| Featured | 16 | hero shells, large panels |
| Pill | 9999 | badges, version pills, star count |
Radius is consistent and modest — Drizzle never goes fully rounded on
rectangular surfaces. The 8px control radius and 12px card radius are the
workhorses; pills are reserved for tag-like metadata. Compound radii are rare;
code-tab strips merge with the block below by dropping the bottom radius
(8 8 0 0).
7. Depth & Elevation
| Level | Treatment | Use |
|---|---|---|
| 0 | flat, no border | hero copy, prose on white |
| 1 | 1px solid #e5e7eb border, no shadow | resting cards, code blocks |
| 2 | 1px border + ambient shadow (0.04) | card hover |
| 3 | standard shadow (0 4px 12px -2px, 0.08) | sticky header on scroll |
| 4 | elevated shadow (0 12px 28px -8px, 0.12) | dropdown, popover, tooltip |
| 5 | deep shadow (0 24px 48px -12px, 0.16) | modal, command palette |
Shadow Philosophy: Drizzle is a near-flat brand. Cards rest with no
shadow at all — they are defined entirely by a light-grey hairline border on
white. Elevation appears only when something genuinely floats (dropdown, modal)
or on hover, and even then the shadow is cool-neutral (rgba(17,24,39,…)) and
very low-alpha (0.04–0.16). Depth never carries colour — the lime is foreground
brand, never a glow. This flat-on-white, border-defined approach is the GitHub /
Tailwind register: structure through hairlines, not drop-shadows.
8. Interaction & Motion
Easing
- Standard:
cubic-bezier(0.4, 0, 0.2, 1)— default for hovers and lifts - Decelerate:
cubic-bezier(0, 0, 0.2, 1)— entering overlays, tooltips
Durations
- Fast (150ms): hover, focus, button press
- Standard (240ms): card border/shadow lift, dropdown open
- Slow (320ms): modal enter, code-sample tab crossfade
Per-Component Recipes
- Button hover: background colour transitions over 150ms; no scale, no lift
- Card hover: border
#e5e7eb→#d0d3d8and ambient shadow fade in over 240ms - Code-tab switch: crossfade the sample body over 240–320ms when switching dialect (PostgreSQL / MySQL / SQLite)
- Link hover: underline appears / text shifts black → slate over 150ms
- Focus: 3px lime ring
rgba(197,247,79,0.4)appears instantly on keyboard focus - Star count / metric: optional count-up animation on first scroll into view
Page Transitions
- Default: opacity-only fade over 320ms — no slide, no parallax. The brand’s motion is as restrained as its colour.
Reduced Motion
When prefers-reduced-motion: reduce is set:
- Code-sample tab crossfades become instant swaps
- Card hover lifts removed (border colour change retained for affordance)
- Metric count-up animations disabled (final value shown immediately)
- All transitions reduce to opacity
9. Accessibility & A11y
Contrast Pairs
- Black
#000on white#ffffff: 21.0:1 (AAA — maximum) - Heading
#222222on white: 15.9:1 (AAA) - White on slate control
#282b3b: 14.0:1 (AAA) - Black on lime brand
#c5f74f: 16.8:1 (AAA) — the only safe way to use lime - Slate
#282b3bon lime#c5f74f: 11.2:1 (AAA) — alternate on-brand pairing - Muted
#555555on white: 7.5:1 (AAA) - Code text
#414141on white: 10.2:1 (AAA) - Soft
#6b7280on white: 4.8:1 (AA at body sizes) - Code link
#22863aon white: 4.6:1 (AA at body sizes)
⚠️ Lime is never a text colour.
#c5f74fon white is 1.25:1 — far below any threshold. The brand always uses lime as a fill (black or slate text on top) or as the focus-ring colour. Never set lime ascolor:on a white surface.
Focus Indicators
- Default: 3px solid
rgba(197,247,79,0.4)lime ring, 2px offset - Inputs: focus border →
#282b3b+ 3px lime ring - The lime ring is the one place the brand colour earns its keep in the UI — high-visibility against both white surfaces and dark controls
ARIA Patterns
- Code-tab group:
role="tablist"witharia-selectedon the active dialect tab; arrow-key navigation between PostgreSQL / MySQL / SQLite - Dialog / command palette:
aria-labelledby+aria-describedby; trap focus; ESC to close - Search combobox: standard listbox pattern with
aria-activedescendant - Version / star badges: include text labels; never colour-only meaning
Keyboard Navigation
- Tab order follows visual order
- Skip-link at page top
- Enter/Space activates buttons and tabs
- Cmd/Ctrl+K opens docs search
- Arrow keys move within the dialect tablist
Screen Reader Hints
- The lime serpent logo carries
alt="Drizzle ORM" - Code blocks use
<pre><code>semantics; copy-button hasaria-label="Copy code" - Star count exposes a label (“33k+ GitHub stars”), not a bare number
Reduced Motion
prefers-reduced-motion: reduce honored — see §8.
10. Responsive Behavior
Breakpoints
| Name | Min Width | Use |
|---|---|---|
| Mobile | — | default, 1-col |
| Tablet | 640 | 2-col grids |
| Desktop | 1024 | 3-col grids, sidebar docs |
| Wide | 1280 | max page width |
| Ultra | 1536 | hero-only breathing room |
Touch Targets
- Minimum 44×44px for primary controls and tabs
- Dialect tabs expand hit-area on touch even where the visual label is compact
Collapsing Strategy
- Nav: collapses to hamburger ≤ 768px; docs sidebar becomes a drawer
- Feature grid: 3-col → 2-col @ 1024 → 1-col @ 640
- Hero: display-hero (80px) reduces to ~40px @ 640
- Code samples: scroll horizontally on overflow rather than wrap query syntax
- Dialect tabs: stay as a tablist; scroll horizontally if they overflow
Image Behavior
- The serpent logo is SVG, scales crisp at any size
- Code samples are live text, never images — they reflow and remain selectable
- Integration logos lock at intrinsic size in a grey-on-white grid
11. Content & Voice
Tone
Technical, precise, performance-forward, and quietly confident. Drizzle writes for TypeScript developers who want SQL they can read, not an ORM that hides the database behind magic. The copy is direct and benefit-led — “TypeScript-first, lightweight, no-magic” — and it leans on code samples to make its case rather than adjectives. No hype, no exclamation marks, no enterprise jargon; the voice matches the design’s restraint.
Microcopy Patterns
- Button verbs: “Get Started”, “Documentation”, “View on GitHub”, “Examples” — short, literal, no marketing flourish
- Section headers: feature-statement style (“Everything you expect from an ORM. And more.”) — plain claims backed by code below
- Error message recipe:
[what failed]: [why]— e.g., “Migration failed: column already exists” - Empty states: “No results. [CTA: Browse the docs]“
CTA Verb Conventions
- Top-level: “Get Started”
- Docs: “Documentation”, “Read the docs”
- Source: “View on GitHub”, “Star us”
- Examples: “Examples”, “See it in action”
12. Dark Mode & Theming
Drizzle is light by default for marketing — the white-canvas, black-ink,
lime-mark identity is the brand’s public face. The documentation, however,
offers a dark theme toggle (a theme-context selector with localStorage
persistence was detected on the page), so the brand is optional, not
light-only.
In dark mode the inversion is straightforward because the palette is nearly grayscale:
bg:#ffffff→#0d0e12(near-black, with the same cool undertone as the slate control)surface:#ffffff→#16171dsurface-alt:#f6f6f7→#1d1f27text:#000000→#ededf0text-muted:#555555→#9aa0a6border:#e5e7eb→#2a2c36control:#282b3b→#ededf0(the dark button inverts to a light pill in dark mode)on-control:#ffffff→#0d0e12brandstays#c5f74f— the lime works on both white and near-black, and gains even more punch on the dark canvas (lime on#282b3bis 11.2:1 AAA)
The lime is the constant across both themes; it is the only colour that never changes. Everything else is a grayscale inversion.
13. Lineage & Influences
Drizzle’s design is GitHub-README minimalism crossed with the Vercel/Bun school
of dark-control-on-light-canvas dev marketing. The page is aggressively
monochrome — pure white, pure-black copy, a single slate-graphite control colour
— and the entire chromatic identity is carried by one hue: the lime-green
serpent logo (#c5f74f). That restraint is the argument. Drizzle markets
itself as “TypeScript-first, lightweight, no-magic,” and the visual language
refuses to add magic where the product refuses to: no gradients, no
glassmorphism, no decorative colour, just clean system type, generous
whitespace, and well-typeset code.
The type story reinforces the ethos — Drizzle ships no custom webfont, using
the platform ui-sans-serif and ui-monospace, the same way it ships a
lightweight, low-dependency runtime. Code blocks inherit the Astro/Shiki token
palette (text #414141, GitHub-green links #22863a), which gives the docs the
register of a syntax-highlighted source file — exactly the audience Drizzle
talks to. Where Bun adds a warm cream canvas and a pink accent, and Biome
commits to a confident blue, Drizzle stakes out the cleanest, most
code-forward, near-zero-chroma corner of the dev-tools cohort: white, black,
slate, and one acid lime.
- Vercel — https://vercel.com — dark-control-on-white-canvas dev-marketing template; 8px buttons, system sans, monochrome restraint
- Bun — https://bun.sh — adjacent TypeScript-runtime brand on a light canvas with a single vivid accent and system-font, performance-forward voice
- GitHub — https://github.com — black-on-white prose, grey hairlines, the GitHub-green/-red code-token palette
- Astro / Shiki — https://astro.build — docs syntax-highlighting palette inherited directly into Drizzle’s code blocks
- Tailwind CSS — https://tailwindcss.com — light, hairline-bordered, utility-clean geometry and the near-grayscale-plus-one-hue convention
14. Do’s and Don’ts
Do
- Do keep the canvas pure white (
#ffffff) — no tint, no gradient, no off-white wash beyond the faint#fbfbfcband - Do use the dark slate
#282b3bas the single filled “primary button” colour, white text on top - Do treat lime (
#c5f74f) as a fill or focus-ring colour only — always black or slate text on top - Do carry hierarchy with weight and size, since there is one font family and almost no colour
- Do define cards with a light-grey hairline (
#e5e7eb), not a shadow - Do keep code samples as live, selectable text in
ui-monospaceat 1.6 line-height - Do inherit the Astro/Shiki / GitHub code-token palette (
#414141,#22863a) in code blocks - Do keep section rhythm spacious (64–96px) — whitespace is the design
- Do soften headings to
#222222rather than pure black for long titles - Do limit lime to once or twice per viewport — logo plus, at most, one accent
Don’t
- Don’t set lime as a text colour on white — it is 1.25:1 and unreadable
- Don’t add a second brand hue; the identity is monochrome-plus-one-lime
- Don’t introduce a dark marketing canvas — dark
#282b3bis for controls, not section backgrounds (dark mode is a docs toggle, not a marketing band) - Don’t add drop-shadows to resting cards; structure comes from hairlines
- Don’t use gradients, glassmorphism, or glow effects anywhere
- Don’t load a custom webfont — the system-font choice is on-brand and intentional
- Don’t use serif type anywhere; Drizzle is committedly sans + mono
- Don’t flood the page with lime fills — one acid-lime pill per view is the ceiling
- Don’t colour code-block text with the brand lime; code uses the neutral
#414141token palette - Don’t round rectangular surfaces beyond 12px (cards) — keep geometry tight, not pill-soft
15. Agent Prompt Guide
Quick Color Reference
bg: #ffffff
surface-alt: #f6f6f7
text: #000000
text-heading: #222222
text-muted: #555555
brand (lime, fill-only): #c5f74f
on-brand: #000000
control (dark button): #282b3b
on-control: #ffffff
border: #e5e7eb
code-text: #414141
code-link: #22863a
Example Component Prompts
-
“Create a hero section: pure-white
#ffffffbackground, an 80px headline in the system sans (ui-sans-serif) at 700 weight with -0.03em tracking, colour#000(or#222if the headline is long), and an 18px subhead in#555555. Add a dark primary button (#282b3bfill, white text, 8px radius, 10px 16px padding) saying ‘Get Started’ and a tinted secondary button ‘Documentation’ (#f6f6f7fill,#222text, 1px#e5e7ebborder). Below, a tabbed code sample shell.” -
“Design a tabbed code sample: a
#f6f6f7tab strip with three mono labels (PostgreSQL / MySQL / SQLite) in 12pxui-monospace, active tab black with a 2px bottom indicator. Below it a code block on#f6f6f7, 14pxui-monospacetext in#414141at 1.6 line-height, token links in#22863a, 16px 20px padding, 8px radius merging with the tab strip above. Add a copy button witharia-label='Copy code'.” -
“Build a feature card: white
#ffffffbackground, 24px padding, 12px radius, 1px#e5e7ebhairline border, no shadow at rest. Inside: a 20px title in#000at 600, a 16px body in#555555. On hover, border shifts to#d0d3d8and a faint ambient shadow (rgba(17,24,39,0.04)) fades in over 240ms.” -
“Create a version / dialect badge row: pill badges (radius 9999) on
#f6f6f7with 1px#e5e7ebborder, 12px text in#222222, 2px 10px padding. One badge is a ‘new’ highlight: lime wash background#eefbcf(not full lime), black text, no border.” -
“Design a focus state demo: any input on white with a 1px
#e5e7ebborder; on focus the border becomes#282b3band a 3px lime ringrgba(197,247,79,0.4)appears at 2px offset. Note: the lime ring is the only place the brand colour appears in the UI chrome.” -
“Build a community / metrics strip on white: a large 28px metric number in the system sans at 700 (‘33k+’), with a
#f6f6f7low-alpha chip behind it (radius 8), and a#555555caption ‘GitHub stars’. Optional count-up animation on scroll-into-view, disabled under reduced-motion.”
Iteration Guide
- Start on white —
#ffffff, not off-white, not grey. The plain canvas is the brand - Make the only filled button slate
#282b3bwith white text — that is the “primary,” not a coloured button - Use lime only as a fill or ring — black-on-
#c5f74f, or thergba(197,247,79,0.4)focus ring. Never lime text on white (1.25:1) - Count the lime — if more than one lime element is visible per viewport (beyond the logo), demote one to slate or the
#eefbcfwash - Define cards with borders, not shadows — 1px
#e5e7ebhairline; shadow only on hover/overlay - Keep type to the system stack —
ui-sans-serif+ui-monospace; do not introduce a webfont - Let code carry the page — generous, selectable mono code samples with the
#414141/#22863atoken palette are the primary content - Hold the whitespace — 64–96px between sections; resist the urge to fill empty space with colour or decoration
Drop drizzle into your project, then ship the actual sections in an afternoon.
npx @webdesignhot/design-md add drizzle npx agentkit init --design drizzle