19 exercises
Kata
Pure-CSS accordion
No JS. <details> is underused.
aria-live, when and how
polite vs assertive, when to use neither.
Responsive card grid
Practicing grid-template-rows: masonry without the polyfill.
Color mixer
Three sliders, one calm result.
Compound-component tabs
Tabs.List, Tabs.Tab, Tabs.Panel — context inside.
Debounce & throttle, by hand
Two utilities I now reach for monthly.
Discriminated unions, two ways
string literals vs. classes.
Tiny event emitter
on, off, emit. Nothing else.
Form state with useReducer
Where reducers actually start to feel worth it.
Infinite scroll list
IntersectionObserver instead of scroll math.
An interview-ready modal
Focus trap, escape, return focus, no library.
Keyboard-first menu
Arrow keys, type-ahead, escape, tab — by the spec.
LRU cache in 40 lines
Map keeps insertion order — let it do the work.
Newsletter signup form
Form validation, the slow way.
Promise pool of N
Limit concurrency without external deps.
QR code component
First Frontend Mentor I ever finished.
satisfies in practice
Three real cases where it earned its keep.
Stats preview card
Two-column at desktop, stacked at mobile.
A better typeof
Object.prototype.toString and friends.