Design system

Every token and component used across danieldelaney.net, in one place. Yes, it's big for a personal site.

Color

Every named colour and surface token from :root. ::selection uses --accent on black; code elements use --accent on --accent-10.

--text-strong#fff
--text-muted#999
--text-faint#666
--ink-line#222
--ink-bg#000
--accent#00FF6F
--accent-40
--accent-10
--shadow-color +
blur(--veil-blur)

Veil tokens

--shadow-color is the one neutral darken: it tints drop shadows on images and provides the background for the .veil recipe (see Lightbox & veil). --veil-blur is the backdrop blur radius the recipe pairs with it.

--shadow-colorrgba(0, 0, 0, 0.75). Tints box-shadow on images.
St Jerome Writing
--veil-blur — backdrop blur radius for .veil

6px

Type tokens

Family, scale, tracking, and line-height. Defined in :root.

--font-body — Source Sans 3: body copy, paragraphs
The quick brown fox jumps over the lazy dog. 0123456789
--font-mono — Source Code Pro: headings, eyebrow, code
The quick brown fox jumps over the lazy dog. 0123456789
Type scale — six steps. --root-size is the body font-size: 18px below the 120em viewport, 22px at and above it. If a design needs a seventh step, the design is wrong before the scale is.
--fs-heroHome titlefluid 2–3.4em
--fs-2xlDisplay3em
--fs-xlH12.2em
--fs-lgH21.5em
--fs-mdH3 / lead1.1em
--fs-baseBody1em
--fs-smCaption / fine print0.75em
--track-caps — 0.08em. Uppercase tracking used by the case-study badge and the home .more-link CTA pill.
Tracked caps
--lh-tight — 1.2: headings, hero titles, quoted display copy
Tight leading is for headings, hero titles, and quoted display copy where lines should pack closely.
--lh-base — 1.5: body copy, paragraphs that run more than a couple of lines
Base leading is for body copy and any paragraph that runs more than a couple of lines, so reading is comfortable.

Spacing

The raw scale. Use these directly only for component padding and other non-rhythm needs. For any vertical gap that creates rhythm, reach for the named tokens in the next section instead.

Spacing scale
--sp-10.3em
--sp-20.6em
--sp-31em
--sp-41.5em
--sp-52em
--sp-63em
--sp-76em
--sp-89em

Rhythm

Vocabulary for vertical rhythm. Four named tokens, each bound to a specific value from the spacing scale. Every vertical margin and gap on the site references one of these — there is no "tighter than pair" tier, since gaps that small (figcaption inner stacking, list-item separators) are noise and we let line-height do the work instead. Bars below show each gap rendered between two stacked blocks.

--rhythm-pair = --sp-2 — between a heading and its content (h1→lede, sample→figcaption, h2→lede)
--rhythm-row = --sp-3 — between siblings (.stack rows, p→p, h2→content in prose)
--rhythm-block = --sp-5 — between distinct blocks (.lede→content, image margins, h2 top margin in prose)
--rhythm-page = --sp-7 — page-level (main edges, .apps→writing, footer top, design-system section breaks)

Layout tokens

Bars rendered at actual size; wider measures overflow the right edge of the page and clip via overflow-x: hidden on the body.

--measure — 38em: prose column max
--measure-wide — 64em: wide layout cap (home grid)
--measure-hero — 16em: home hero text-wrap width
--gutter — 2em

Borders

Two weights. Thin is the standard hairline (cards, dividers, headers). Thick is reserved for emphasis bars on quoted blocks and callouts.

--border-thin — 1px
--border-thick — 3px

Geometry

One aspect ratio for any card-shaped vignette. Used by the home app cards and the case-study carousel.

--aspect-card — 16 / 9
16 / 9

Radius

There is no --radius token. Sharp corners are the baseline. The only exception is demo animations that imitate native OS UI, where rounding helps sell the illusion.

No.

Motion

All durations share one easing curve. Page-level transitions, hover state, and image fade-ins draw from the same handful of tokens.

Durations — three steps. Hover a row to play its duration.
--dur-fast 120ms · state change
--dur-med 220ms · reveal, slide, fade
--dur-slow 420ms · page-level transition
--ease-out — one curve, used everywhere. Standard ease-out: fast start, gentle landing.

cubic-bezier(.2, .7, .2, 1)

.fade — page enter: opacity 0 → 1 with an upward translate of --page-enter-y (8px), over --dur-slow. Applied to <main> in the base layout (every layout except home, which stages a per-block stagger instead).
--lifttranslateY(-2px) over --dur-med. Hover transform applied to every .card. The card recipe (see Cards) combines this with a border and background change; this row isolates the lift itself.
Hover me
--hover-dim — opacity 0.6 on hover, transition over --dur-fast. Opacity target for icon-only buttons (carousel arrows, lightbox close). Used instead of card chrome where the affordance is the icon itself.
Image fade-in — images with loading="lazy" start at opacity: 0 and fade to 1 over --dur-slow when a .loaded class is added on the load event (inline script in _layouts/base.html). Prevents the snap-in flash that lazy decoding otherwise causes. Carousel slides have their own variant: same transition, but the visible frame is gated by .active.

Typography

h1 — page title

A page title in mono

h2 — section heading

A section heading

h4 — accent green, used inside cards

A green card title

.lede — intro paragraph after a heading

A lede paragraph that introduces a section. Capped at the body measure, with muted text.

.meta — small mono caption for dates and eyebrows
October 2025
.section-label — large section label on the home page

Prose elements

Paragraph with inline link, <strong>, <em>, and inline code

This is a paragraph. It contains an inline link with the animated underline, then bold text in white, plus italic text, and inline code rendered in mono on a faint accent panel.

<ul> — unordered list (square bullets)
  • One thing
  • Another thing
  • A third thing
<ol> — ordered list
  1. Step one
  2. Step two
  3. Step three
<blockquote> — default pull quote
“A standard blockquote: muted text, generous padding, thick neutral rule on the left. The .callout variant just swaps the rule colour and adds an accent fill.”

Layout primitives

.stack — vertical flex with rhythm gap
St Jerome Writing St Jerome Writing

Media & images

Plain article image (block, full-column, with rhythm-block top/bottom margin)
St Jerome Writing
img.bordered — surface-coloured 1px border
St Jerome Writing
img.int-icon — small centered icon (defined in case-studies/intention.css; case-study-only, 260px wide, auto-margins)
St Jerome Writing
<video autoplay loop muted> — looping silent video block. Renders the same as a regular image: full-width block with rhythm-block vertical margin. (Still shown in place of a video below; the video element behaves identically.)
St Jerome Writing

Callout

.callout — accent-coloured prominence block (applied to a <blockquote>)
Key outcome: A callout looks like a blockquote, but with an accent rule, faint accent fill, and accent-coloured strong text.

Hero

.hero — typography statement on the home page
I turn problems into products.

Pills & badges

Header logo pill — accent rectangle, mono, hover swaps to white
.more-link a — accent CTA pill used under home sections

Default .more-link wrapper has margin: var(--rhythm-page) 0 (6em top & bottom). On the home page, .apps > .more-link overrides the top to var(--rhythm-block) (2em) so the first more-link sits closer to the app cards. The Case-study-return section below shows the centred variant.

.badge — case-study eyebrow (static)
Portfolio
.badge-link — back-link version, used at the top of a case study (composed with .badge for the visual chrome)

Cards

.card — generic card primitive (hover lifts and shifts to accent)
ul.writing-list > li > a.card — writing index list rows. Reuses .card for the box, border, and lift hover; the wrapping .writing-list just resets the list and (on wide screens) floats .date to the right.
.app-card — home-page product card (vignette + label area, no border on text). The bordered region is .app-vignette.

Case-study return

.more-link.more-link--center — centered variant at the foot of every case study; same accent pill, just centered, with extra room below (margin-bottom: var(--sp-8)) before the footer.

Git log figure

figure.git-log — terminal-style commit log with fade-out mask
$ git log --oneline --reverse
  1. 7185e162025-04-16Initial Commit
  2. 6e4384e2025-04-19Rename folder to Docs for GH pages
  3. 67c3fe62025-04-30Released
  4. 60485f42025-10-31Small visual tweaks
  5. 354e4842025-11-02Multi-monitor support, prevent closing while no timer running
  6. a7867c72025-11-04Fixed crash when laptop closed
  7. c99a8512026-04-25mobile enhancements and tiny typography things

Cascading version stack

.lw-tabs-stack — old version top-left, new version overlapping into bottom-right
St Jerome Writing St Jerome Writing

Home vignettes

The three product vignettes used on the home page. Each runs an autonomous animation loop driven by /js/home-vignettes.js.

.lw-vignette — listening bars that swap to the transcribed phrase
.int-vignette — typed-prompt morphs into a green-bar countdown
.mb-vignette — file drag arc + dashed drop zone + progress + done check

Intention hero demo

The interactive macOS-style hero from the Intention case study. Four activity templates cycle behind a dim/blur veil while the Intention popup card prompts and confirms.

.intention-hero-scope

LanWhisper hero demo

The voice-pill + window animation from the LanWhisper case study, in its hero size. Cycles through three windows (terminal, Messages, editor) with the pill rising, listening, and dropping a transcribed phrase at the caret.

.lw-demo-scope.lw-demo-scope--hero