rules

colour

Tokens live on html in global.css. The values below are read from the stylesheet when the page loads, so they're always current.

surfaces and lines

--background-dark

page

--surface

post panel, pager cards

--borders

borders and rules

--accent-muted

blockquote bar, code, //

text and accent

--text-headings

h2, h3, titles

--text-body

paragraphs

--text-secondary

meta, labels, footer

--accent

h1, nav, actions

ratings

--rating-terrible

--rating-below-average

--rating-good

--rating-above-average

--rating-great

type

Ioskeley Mono, self-hosted in /assets/fonts/ioskeleymono/ at weights 300, 400, 600 and 700, each with an italic. Root size 16px. Paragraphs and list items use a 1.65 line height, and body is capped at 78ch.

h1 · 1.75rem
posts 1.6rem

The quick brown fox

h2 · 1.35rem

The quick brown fox

h3 · 1.125rem

The quick brown fox

h4 · 0.78rem label

The quick brown fox

p · 0.9375rem

The quick brown fox jumps over the lazy dog.

.meta · 0.85rem

3 September 2026 · 422 words

.section-label · 0.78rem

weights

light 300 · regular 400 · semibold 600 · bold 700
light italic · italic · semibold italic · bold italic

heading spacing

h2 has 3rem above it and h3 2.25rem, so a new section reads as a bigger break than a sub-section. On phones they drop to about 2.75rem and 1.75rem.

text

p, a, em, strong, code, .rating

A paragraph with a text link (underlined, highlighted on hover), italic, bold and inline code. Ratings link to the scale: (1/5) (2/5) (3/5) (4/5) (5/5) (?/5)

blockquote

This page highlights what I've been doing recently. Used for the intro note on now pages and for changelog entries, with an inline link.

ul, ol, h4 label

The new

  • first item
  • second item, long enough to show how a list item wraps onto a second line at this width
  1. step one
  2. step two

pre, code

function greet(name) {
    return `hello, ${name}`;
}

hr, figure, figcaption


A figcaption under an image.

.two-col-list

  • consistent weather
  • national parks
  • no snow
  • friends far away

post

A post is an article holding a .page-header--post, which turns it into the panel. The likes and comments block is written by functions/_middleware.js; the markup below copies what it outputs. A .pager straight after the article sits 1rem under it. An optional .post-banner photo can open the panel: 2:1 (4:3 on phones), bled to the panel edges, linking to the photo's page. .post-banner--row (a figure, no link) holds several photos side by side, as on /about/. On phones the panel and pager cards run edge to edge.

article / .page-header--post / .post-social / .pager

.post-banner (optional, first in the article; --high / --low / --left / --right move the crop, on the banner or one photo)

a boat crossing Lake Tahoe

now

Wake Me Up When September Ends

.post-social, empty and already liked

posts

.post-item: written by scripts/sync-posts.mjs between <!-- posts:all --> markers, never by hand

.post-card: the newest post on / and /blog/, via <!-- posts:highlight -->, then .post-feed-more

@danieldaum.net the post's own text, sentence case, four lines at most. 2 images

all posts →

.post-item-media (one image keeps its shape) / .post-item-media--grid (two or more, square crops)

rowing boats lined up for a regatta boat on lake tahoe

.post-item-gif: a klipy gif as a looping mp4, the still img instead with reduced motion. my own videos are a video.post-item-player (controls, preload="none")

Gabby Williams celebrating

.post-item--repost: .post-item-label in the meta row, the original post in .post-item-repost

.post-item-quote, .post-item-video (bluesky's thumbnail, links out), .post-item-note (fallback when the appview lookup fails)

wayfinding

.page-header, for listing pages

.meta.meta-split / .meta-sep (stacks under 600px)

the privacy policy8 October 2026

.breadcrumb, on garden pages

.pager, end of a run: leave out the missing card

.section-label

listings

.recent-writing-list, home page

  1. #now

    Wake Me Up When September Ends

    • 422 words

.archive: /blog/'s list. dotted leader, tag column fixed width, dd mmm yy dates; stacks under 600px

  1. Wake Me Up When September Ends #now
  2. Hard-Boiled Wonderland and the End of the World #book

.table, title / date / tag (garden, ratings)

title date tag
Wake Me Up When September Ends #now
Let Me Introduce Myself #about

.table, title / description

title description
books what I'm reading and what I thought

projects

.project-header / .project-stats, project pages

saturn

a cozy minimalist personal site

stack

html, css

source

tangled.org

.pills / .pill / .pill--dev (dot commented out), project cards and headers

#new #in-development

.commit-log, written by scripts/sync-commits.mjs (banner or /projects/ card)

recent commits all commits →
  1. 3b951c1 feat: add containerization
  2. 4a962de feat: add godot client

.project-banner (the tall gradient banner at the top of a project page) is page-specific and not shown here. .project-banner--log lets it grow around a commit log.

media

.entry-hero, a tracker entry page

Sinners

.photo-wall / .photo-tile / .photo-tile--new (hover a tile for its caption)

Berkeley Aquatic Park new! Berkeley, California 21 August 2026
Neighbor Snail Oakland, California 18 August 2026
Fog Over The Bay Oakland, California 12 August 2026
Redwood Trail Oakland, California 3 August 2026

The .lightbox opens on :target, with no JavaScript. It covers the whole screen, so it isn't shown here; see /photos/ and the tracker walls. On /photos/ each lightbox shows the photo's name and a .lightbox-details link to its page.

Each photo has a page at /photos/<file name>/: .photo-entry puts the whole photo beside an .entry-heading (title, date, place, camera, film), stacked on phones. Clicking the photo opens a single lightbox, #full. Posts and banners link here, never to #view-….

.img-scaled caps an image's height (26rem, or --short 18rem, --medium 24rem, --tall 30rem) and centres it.

responsive

preferences