Design details
This site is full of details you feel more than you notice, and this page demonstrates them. Every demo is live code, not a screenshot, running exactly1 as it does on the production site.
Reading
Every line pulls its weight
Every heading balances its lines, and every paragraph refuses to strand its last word.
Inspired by Jakub Krehel, interfaces.dev.
Plain wrapping
Deciding where a heading breaks its lines
Balanced
Deciding where a heading breaks its lines
Punctuation hangs into the margin
Opening quotes hang outside the text edge so the letters keep a straight optical left.
Inspired by Marcin Wichary, unsung.aresluna.org.
“The letters keep a straight optical left.”
“The letters keep a straight optical left.”
The red line is where the text column begins. In the first example the quote mark sits inside it and pushes the letters over. In the second it hangs into the margin, so every letter stays flush.
Long lists breathe while short lists stay tight
A list that runs long gets wider spacing between its items.
Inspired by Marcin Wichary, unsung.aresluna.org.
Short
- Short item
- Another
- A third
Long
- Items that run long enough to wrap to multiple lines get real air between them
- So three paragraphs-as-items stop reading as one grey slab
Rules hang from the type
Blockquotes are trimmed to the type, while a plain border spans the full line boxes and overshoots at both ends.
Inspired by Marcin Wichary, unsung.aresluna.org.
The rule beside this quote stops at the cap height and the baseline instead of spilling past both.
Visited links remember
Read pages and posts drop from accent to text color with a faint underline.
Inspired by Marcin Wichary, unsung.aresluna.org.
- An essay you have not read
- An essay you read last week (simulated)
Numbers that change are tabular
Anything that ticks or aligns, like dashboard stats, changelog dates, and EXIF readouts, uses tabular figures.
Inspired by Jakub Krehel, interfaces.dev.
Proportional
1,111,111
2,847,209
Tabular
1,111,111
2,847,209
One family, every role
Söhne handles navigation, headings, and body, with Söhne Mono for code. I briefly experimented with a few different sans serif typefaces and also a combination of sans serif and serif, but ultimately landed on this single typeface because I adore it so much.
Inspired by the Steve Jobs Archive's editorial restraint.
The ⌘ is geometry, not a glyph
The header keycap's ⌘ is an SVG because Söhne's own character sat higher in Safari than in Chrome and read small.
Size and baseline vary per browser with the font's glyph.
Pure geometry, identical everywhere with the SVG.
Color & theme
Red is the interactive voice
Red indicates two related things: what you can do (links, buttons) and where you are (the nav's current page, the TOC's active section). Pure decoration never wears it, so the signal stays undiluted.
Red is wider than sRGB
On wide-gamut screens the accent's chroma steps up while neutrals stay sRGB.
Identical values in sRGB terms, but on a P3 display the right swatch is visibly richer.
Selection is the accent
Text selection uses the accent token directly. If the red ever moves, selection moves with it.
Inspired by Jacob Paris.
Select this sentence.
Dark panels get lighter, not outlined
A shadow can't separate black from black. In dark mode a floating panel like the ⌘K palette is simply a step lighter than the page, the way a macOS window reads in dark mode. In light mode, a soft shadow does the same job.
The theme flips from the toggle outward
Switching themes plays a circular reveal growing from the toggle's own position. Try it in the top right corner.
Motion
One spring, two temperaments
Everything that moves shares one spring: the lightbox fly-in, paging between photos, a released swipe settling back, and the Contents sheet rising on a phone. Items that are thrown like a swiped photo arrive with momentum so they settle past the mark and come back. Items that appear like a panel or menu do not have momentum so they simply arrive and stop.
Inspired by Apple, Designing Fluid Interfaces (WWDC 2018).
Thrown
Appeared
Exits never bounce
Enter overshoots into place while exit is a plain accelerating fade at 60% of the duration. You see the pair of animations when the ⌘K palette and lightbox on /photos open and close.
Inspired by Emil Kowalski's enter/exit timing rules.
Icons swap with a breath of blur
The theme icon cross-fades through a small scale and blur instead of hard-swapping.
Inspired by Emil Kowalski's icon-swap recipe.
The wrong password shakes
Protected case studies refuse a bad entry the way the Mac does: one sharp shake with an eased return.
Inspired by macOS's login window.
Numbers roll into place
The dashboard's stats arrive like a mechanical odometer. Each digit is a strip that rolls to its value.
Charts draw themselves when you arrive
The dashboard's rolling-average lines draw in left to right once their chart is mostly in view. The line reads as a value being traced rather than wallpaper that was already finished.
The hero arrives word by word, and lands on the point
The homepage statement fades up one word at a time in pure CSS. The last sentence then arrives whole and unbroken because a punchline shouldn't wrap.
Thepersonalsiteofadesignerwhosweatsthedetails.Every pixel counts.
Reduced motion keeps the move
Turn on reduced motion and spatial moves still happen, just without the bounce. Decorative animations become simple fades.
Full motion
Reduced motion
Touch & input
A press is instant, not a fast hover
On a phone, buttons and links respond the moment your finger touches down instead of easing into it. The press state also goes further than hover because a fingertip hides more of the screen than a cursor.
Inspired by Apple's respond on touch-down, Fluid Interfaces.
Click both quickly. The left button fades toward its pressed state and the tap is over before you ever see it. The right one lands instantly.
Targets are bigger than they look
Icon controls in the header and the footer keep their small visual boxes while invisible extensions take the touch target to 44px.
Inspired by Apple's 44pt minimum.
The dashed line is the real target, invisible in production but drawn here.
A keyboard's grand entrance
When the user taps on the search button, the keyboard automatically appears.
The photo & video overlay
The flying clone
Photos and clips open by flying the clicked element's rectangle to the modal's.
Inspired by the shared-element “hero” transition, shown in Apple's Designing Fluid Interfaces.

The video never stops playing
Click a running clip and it keeps playing through the flight and into the modal. There is no pause and no restart. The same moment simply gets bigger.
Leaving is even easier than arriving
Escape, a click anywhere outside, the close button, or a swipe down all close the overlay. The swipe peels it, tracking your finger while the page returns in step underneath.

Drag the photo downward and the page returns in step with your pointer. Release past a third and it commits. Release closer to home and it springs back. A quick flick throws it out at your speed.
Shift-click, for the connoisseur
Hold shift while clicking any image or video and the open plays in slow motion, a built-in mode for watching the choreography frame by frame. It's an homage to Exposé, which shipped with exactly this trick in 2003. Holding shift just to watch the windows glide was half the joy of Panther.
Inspired by Exposé, Mac OS X 10.3 Panther (2003).

Instant first, sharp second
Every slide is two layers. The small file the grid already loaded shows instantly and a sharper version fades in above it when it lands.


The shimmer sits behind
The loading shimmer never cross-fades over media. It sits behind, and the opaque image or poster simply covers it as it paints. Nothing shimmers behind a transparent image where it would show straight through.

Photo edges are drawn, faintly
Photography carries a hairline outline (black at 10% in light, white at 10% in dark) on the /photos grid and inside its lightbox, so a near-white sky never melts into the page.
Inspired by Jakub Krehel, interfaces.dev.
Melts into the page
With the hairline
One clip, baked twice
Every iPhone clip is rendered twice, once with corners matching the light theme's page color and once matching dark, and the site swaps them when the theme changes. They run at 60fps, and screens with high pixel density get a 3x resolution file.
Inspired by Marcin Wichary's framed videos.
Prefetch photos
While the overlay on /photos is open, the neighbouring photos are fetched at the exact size and quality the slide will request to make paging feel smooth.
Click as fast as you like. The photos are ready to go.
Chrome & wayfinding
Utility links are actions, not annotations
Back links, the header's last-updated text, and hashtags are set in full text color because muted reads as disabled. The underline marks them as links and darkens on hover.
The dot sits on the first line
The table of contents marks the active section with one travelling dot beside the first line of a wrapped title. Centering against the whole block would float it in the middle of nowhere. On a phone the same dot lives in the Contents sheet which is up next.
- Intro
- A section title long enough that it wraps to a second line
- Wrapping up
The Contents sheet, on a phone
On mobile the table of contents rises as a sheet and tracks your finger 1:1 on the swipe down.
Contents
Intro
The details
Wrapping up
Anchor jumps clear the header
Click a Contents entry or a heading permalink and the target rests below the fixed header instead of hiding underneath it.
§1 · a section heading
§2 · a section heading
§3 · a section heading
§4 · a section heading
Twelve columns carry every page
A 12-column grid sits under everything.
Inspired by Müller-Brockmann and Vignelli's Unigrid.
The grid is one keypress away
Press G and the grid draws itself over the page. This is also in the ⌘K palette as “Activate grid.”
The header dates itself
“Last updated 2h ago” sits at the top right of every page and is read from git at build. The goal is to indicate the site's freshness and provide a link to what changed.
Publishing
Obsidian to edit and git to publish
Posts are written in Obsidian against the repository itself so committing is publishing. There is no CMS and no admin interface.
A browser extension feeds the vault
A Chrome extension captures from anywhere. It can send a link, a selection, an image, or the whole article, which it converts to clean markdown with the same engine as Obsidian's own Web Clipper. Captures land in the vault as drafts.
Send to the vault
Send link ↵
Capture full article ↓
iPhone captures frame themselves
Drop any iPhone screenshot or recording into a watched folder and it comes out framed in a device bezel. Detection is by shape rather than model, so the script will work with future iPhones (although maybe not the foldable model). Light and dark versions are generated automatically.
Thank you for coming along on this design-filled journey.
1. A few minor tweaks were made to ensure small demonstrations were clear. ↩