Break Up the Long Task
Decide what you would build from the brief alone. Everything below it is available, but the exercise stops working if you open it first.
Applying a filter to a large in-memory dataset blocks the tab for a noticeable moment. Clicks during that window are queued and fire afterwards, sometimes on elements that have since moved. Make the page stay responsive.
Wrapping the work in an async function and awaiting a resolved promise every few hundred items, because the code now looks non-blocking and the pattern is everywhere. Promise continuations are microtasks, and the microtask queue is drained to empty before the browser is allowed to render — so the loop yields to itself, thousands of times, and the frame still never happens. It is the most convincing wrong fix in the domain: the code reads as asynchronous, the profiler still shows one continuous long task, and the tab still freezes for exactly as long.