Designing motion that feels inevitable
Springs, easing and the small details that make an interface feel alive instead of animated.
Search components and blocks
Editorial sections for articles, posts and updates.
A blog grid with capsule category tabs. The tabs reuse the motion Tabs component with a sliding pill; switching category filters the grid with a layout animation, so remaining cards glide into their new slots while others scale out and new ones spring in. Cover photos fade in from a blur as they load, zoom slowly on hover, and each card lifts with a spring while its arrow nudges forward.
pnpm dlx shadcn@latest add @ditherui/blog-sectionNotes on design, engineering and shipping.
Springs, easing and the small details that make an interface feel alive instead of animated.
A walkthrough of layoutId, spring tuning and why the pill never teleports.
Progress, approvals and honest status lines: the UI patterns behind reliable AI agents.
New blocks, a faster docs site and a handful of templates you have been asking for.
Tokens first, hex never. How we keep every component themeable from one stylesheet.
Batching state, stable keys and cheap animations for long-running generations.
className / ...section propsReact.ComponentProps<"section">—One story takes the spotlight: a full-bleed cover with a slow settle-in zoom, a pulsing Featured tag and a staggered text reveal. The rest wait in a strip of numbered cards below. Click any of them and it is promoted into the spotlight with a blur crossfade, while the previous feature drops into the strip with a spring.
pnpm dlx shadcn@latest add @ditherui/featured-blogWhy we are choosing fewer distractions, clearer decisions and a little more breathing room in the tools we build.
className / ...section propsReact.ComponentProps<"section">—A reading-list feed: author line, bold headline, a two-line standfirst and a thumbnail, split by hairlines. Like and Save are live: the heart pops with a spring while its count rolls to the new number, and the bookmark drops into place and feeds a badge on the Saved tab. Switching between the underline tabs blurs the current list out and the next one in, its rows resolving one after another (the same reveal plays on first render), un-saving on the Saved tab slides the story out, and hovering a row dims the rest so you can focus on one.
pnpm dlx shadcn@latest add @ditherui/article-feedThe study loop, the mistakes, and the one habit that actually moved the needle.
Why shipping a component library is not the same as shipping a system.
Hint: not start another coding loop.
Treating animation as part of the interaction model instead of a coat of paint.
className / ...div propsReact.ComponentProps<"div">—A blog grid that opens into a full article page. Click a card and its cover grows into the article hero with a shared-layout transition, the headline and paragraphs resolve in one after another. Back returns to the grid. Posts carry their own body, so swap in your CMS data.
pnpm dlx shadcn@latest add @ditherui/blog-readerClick a story to read it.
postsPost[]four sample postsclassNamestring—