light · sans · mono · developer · minimal · performance

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.

By webdesignhot · orm.drizzle.team
$ npx @webdesignhot/design-md add drizzle
Learn more about the CLI
Compare to…
try on →
theme
1440 × 900
mobile · 390 × 844
Tokens webdesignhot/0.1
  • 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
Typography
Ship faster than ever.
display-hero ui-sans-serif 80px w700 -0.03em
Ship faster than ever.
display-lg ui-sans-serif 56px w700 -0.02em
Ship faster than ever.
h1 ui-sans-serif 40px w700 -0.018em
Built for teams that ship.
h2 ui-sans-serif 32px w600 -0.012em
The quick brown fox jumps over the lazy dog.
metric ui-sans-serif 28px w700 -0.01em
A complete kit
h3 ui-sans-serif 24px w600 -0.005em
The quick brown fox jumps over the lazy dog.
h4 ui-sans-serif 20px w600 0
The quick brown fox jumps over the lazy dog.
body-lg ui-sans-serif 18px w400 0
The quick brown fox jumps over the lazy dog.
body ui-sans-serif 16px w400 0
The quick brown fox jumps over the lazy dog.
body-sm ui-sans-serif 14px w400 0
The quick brown fox jumps over the lazy dog.
button ui-sans-serif 14px w500 0
The quick brown fox jumps over the lazy dog.
nav-link ui-sans-serif 14px w500 0
npx @webdesignhot/design-md add stripe
code-body ui-monospace 14px w400 0
OUR DESIGN SYSTEM
label ui-sans-serif 13px w500 0
npx @webdesignhot/design-md add stripe
code-inline ui-monospace 13px w500 0
OUR DESIGN SYSTEM
caption ui-sans-serif 12px w500 0.02em
OUR DESIGN SYSTEM
code-label ui-monospace 12px w500 0.02em
Spacing
  • 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
Radius
  • micro 2px
  • sm 4px
  • md 8px
  • lg 12px
  • xl 16px
  • pill 9999px
Components
Text link →
Card preview A complete kit — everything your product needs. Hero, pricing, FAQ, dashboard, docs — every layout your product needs.
New Stable v1.0
Design roles 8/8 mapped · webdesignhot/0.1

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
Lineage & influences

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.
Export 4 formats · paste-ready
Tailwind

theme.extend block for tailwind.config.js

tailwind.config.js
CSS variables

:root { --bg, --text, --brand, … } you can paste anywhere

design.css
DTCG JSON

W3C Design Tokens Community Group format

design.tokens.json
Figma Variables

Importable into Figma → Variables → Import

figma-variables.json
The file
---
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
Prose

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

RoleFontSizeWeightLine HeightLetter SpacingNotes
display-herodisplay807001.0-0.03emhero headline only
display-lgdisplay567001.05-0.02emsection opener
h1display407001.1-0.018empage title
h2display326001.2-0.012emfeature heading (measured #222, 600)
h3display246001.25-0.005emsub-feature
h4body206001.30card title
body-lgbody184001.550hero supporting copy
bodybody164001.550default body (measured 16/400)
body-smbody144001.50dense blocks, metadata
labelbody135001.40form label, field name
captionbody125001.40.02embadge, footnote
buttonbody145001.00button text
nav-linkbody145001.20top nav, sidebar
code-bodymono144001.60code blocks
code-inlinemono135001.40inline code in prose
code-labelmono125001.30.02emtab label, dialect name
metricdisplay287001.1-0.01emstar 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

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

TierPxUse
Micro2inline chips, tight tokens
Standard4inline code, small badges
Comfortable8buttons, inputs, code blocks
Relaxed12cards
Featured16hero shells, large panels
Pill9999badges, 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

LevelTreatmentUse
0flat, no borderhero copy, prose on white
11px solid #e5e7eb border, no shadowresting cards, code blocks
21px border + ambient shadow (0.04)card hover
3standard shadow (0 4px 12px -2px, 0.08)sticky header on scroll
4elevated shadow (0 12px 28px -8px, 0.12)dropdown, popover, tooltip
5deep 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

NameMin WidthUse
Mobiledefault, 1-col
Tablet6402-col grids
Desktop10243-col grids, sidebar docs
Wide1280max page width
Ultra1536hero-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.

  • Vercelhttps://vercel.com — dark-control-on-white-canvas dev-marketing template; 8px buttons, system sans, monochrome restraint
  • Bunhttps://bun.sh — adjacent TypeScript-runtime brand on a light canvas with a single vivid accent and system-font, performance-forward voice
  • GitHubhttps://github.com — black-on-white prose, grey hairlines, the GitHub-green/-red code-token palette
  • Astro / Shikihttps://astro.build — docs syntax-highlighting palette inherited directly into Drizzle’s code blocks
  • Tailwind CSShttps://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 stackui-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
Ship with this

Drop drizzle into your project, then ship the actual sections in an afternoon.

1 · install design
npx @webdesignhot/design-md add drizzle
2 · ship landing page
npx agentkit init --design drizzle
How AgentKit reads DESIGN.md