Skip to content
Dave Klein

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.

Deciding where a heading breaks its lines

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 item
  • Another
  • A third
  • 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.

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.

1,111,111

2,847,209

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.

NavigationA headingBody copy, the same voice at reading size.code

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.

a link where you are decoration

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.

Search pages, writing, and designs…
Writing

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).

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.

entered, with a settle

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.

2,847

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.


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.

Search…

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.

A photo flying between its thumbnail rect and the modal rect

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.

A mock overlay slide. Drag it downward to peel it away

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).

A photo flying between its thumbnail rect and the modal rect

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 sharp variant fading in over the instant one

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.

Media covering the loading shimmer

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.

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

Contents

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.

the fixed header

§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.

media · six columns
prose · four columns
full-bleed images

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.

Write in Obsidian
Publish with git push
Deploy to diklein.com

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.

theverge.com/reviews/iphone-17-pro-review

Send to the vault

Send link ↵

Capture full article ↓

2026-07-13-iphone-17-pro-review.md
Obsidian vault · drafts/

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.

9:41●●●

Thank you for coming along on this design-filled journey.

1. A few minor tweaks were made to ensure small demonstrations were clear.