Runtime jank comes from long tasks blocking the main thread — the single thread that handles JS, layout, paint, and input. When a task runs too long, input can't be processed, so interactions feel frozen and INP climbs.
The core model: the main thread
text
Main thread: [ event handler 180ms ] input queued... rendered ─▶ INP = time until next paint
└── a "long task" (>50ms) blocks everything, including responding to the click
INP measures the delay from a user interaction to the next paint. It has three parts: (main thread busy when you click), (your handler), and (style/layout/paint after).
