From the journal
Short essays on type, color, layout, and the small details that make an interface feel finished.

Why a short list of spacing steps holds up better than a long one, and how to pick a base unit that keeps components in rhythm when the type changes.
Design systemsSpacing scales that survive a redesign
7 min read
A focus ring has to stand out on every surface you ship. How to test it in light and dark themes, and what to do when it sits on a photo.
AccessibilityFocus rings people can actually see
5 min read
Sizing headings with clamp(), where it breaks down on long words and narrow screens, and the two sizes still worth setting by hand.
TypographyFluid type without a pile of breakpoints
6 min read
Lightness in OKLCH follows what the eye sees, which makes hover states, borders, and a dark theme much easier to tune by number.
ColorChoosing colors in OKLCH
8 min read
Short durations, quick exits, and a reduced motion plan that keeps the meaning of an animation without the movement.
MotionMotion that respects the reader
5 min read
Moving a card from viewport breakpoints to its own width, and the layout bugs that went away once it stopped guessing.
CSSContainer queries in real components
9 min read
Width and height on every picture, lazy loading below the fold, and why the first image on the page should never wait its turn.
PerformanceImages that load in the right order
6 min read
Token names that describe a purpose instead of a value, so a new theme is one file to edit rather than a search across the codebase.
Design systemsNaming design tokens for the long run
7 min read
Tab order, skip links, and arrow key movement in a grid of charts, worked out with the mouse unplugged.
AccessibilityKeyboard paths through a dense dashboard
8 min read