Today
- My colleague Chris Griffith, with whom I collaborated to put The Effects of Nuclear Weapons, Third Edition (1977) online, is also a spaceflight enthusiast (and an urban trails hiker: check out his new book!). He recently asked me how I would mark up a table with a split diagonal...
This week
- There are a bunch of JavaScript animation libraries out there, and you might have wondered whether there’s a performance cost compared to traditional CSS transitions and keyframe animations. In this blog post, we’ll compare the same animation across several different strategies...
Two weeks ago
- Safari and Firefox change how big sites render based on the domain. TikTok, Netflix, Instagram… even SeatGuru. Chrome doesn’t. Why is that?...
- I’ve been posting about how you can make lots of HTML pages and leverage navigations over in-page, JS-dependent interactions. Now I’m gonna post another example. On my icon sites, I have a little widget that allows you to resize the icons you’re looking at. Previously, I...
About a month ago
- Forgive me, Reader. It’s been five months since my last vibe check. That’s a lot of ground to cover and it’s not possible to get into everything that happened. Like in real life conversations, instead of telling you how I’m doing, I’ll tell you what I’ve been doing these past...
- I wrote about building websites with LLMs — (L)ots of (L)ittle ht(M)l page(s) — and I think it’s time for a post-mortem on that approach: I like it. I’ve tweaked a few things from that original post but the underlying idea is still the same, which I would describe as: Avoid...
- The new Animation Timeline API allows us to create dynamic scroll animations without any JavaScript! It’s honestly a very lovely API, and in this blog post, we’ll explore some of the super cool things we can do with it....
- A practical use case for rendering HTML+CSS to a canvas, an emerging API being previewed in Chrome....
about 1 month ago
- LlamaIndex have a most excellent open source project called LiteParse, which provides a Node.js CLI tool for extracting text from PDFs. I got a version of LiteParse working entirely in …
- Lately, I’ve been talking websites into existence. Not metaphorically, but actually sitting in important meetings with people — clients, collaborators, my wife, friends, neighbors — watching real websites materialize in front of us as we converse. I’ve been half-jokingly call...
- I had to make a modal recently, it happened to be in React, so some of what follows is React specific, but the principles are all good ol' CSS/HTML and JavaScript, so don't necassarily go running just because I'm using React here…. wait, where are you going? Come back… Oh well,...
about 2 months ago
- The Problem When using TanStack Table with TanStack Virtual and many columns that extend beyond the viewport, scrolling horizontally causes the header cells to appear transparent. Body row content ble...
- Introduction Buttons that scale on hover with CSS feel dead. No overshoot. No bounce. No life. Spring physics fix this. The button pops past its target scale and settles back. Feels like it has weight...
- The Problem Vite SPA serves one index.html for all routes. Social crawlers (X, Discord, Slack, LinkedIn, etc.) read the first HTML response and don't run JavaScript. So every shared link shows the sam...
- So I got an email earlier, which you’ll find out about in my next post, which made me think “hey, the reply to this would make a great blog post”, and then I thought “…and it would be even better if people could add their own comments to it”, and so I plugged in the rather...
2 months ago
- Pretext went viral for its beautiful canvas demos. But the community is showcasing the wrong feature....
- 1. Separate what you know once from what changes There is work that depends on data that rarely changes, and work that depends on data that changes constantly. When you mix them together, you pay the...
- Introduction Most React developers have heard of startTransition. Few actually understand what it does. Even fewer know when they need it. Let me explain it from the ground up. How React renders with...
- Introduction Every React tutorial tells you the same thing. "Never use array index as key." It is one of those rules people repeat without thinking about why it exists. And because they never think ab...
- There is a lil’ UI detail on this blog. Most people don’t even notice it, but the ones who do often reach out, asking how on earth it works. It feels like it defies the rules of CSS! In this blog post, I’ll break down the surprisingly-straightforward implementation so you can...
- I shipped some updates to my notes site. Nothing huge. Just small stuff. But what is big stuff except a bunch of small stuff combined? So small stuff is important too. What follows is a bunch of tiny details you probably don’t care about, but they were all decisions I had to...
- Introduction This is the note for future me. This bug was not random. Chrome was correct. We tried to start background music from mousemove. That feels like usage. It is not a real activation event fo...
- Introduction You have a combobox using cmdk (shadcn Command component) inside a Radix Dialog. The list has more items than fit. You expect it to scroll. It does not scroll. You are not alone. This iss...
- Introduction Sonner is the best toast library for React. But the docs barely cover advanced styling. This is everything I learned building a custom dark toast system with colored rails, action buttons...
Rows per page