Why it matters
Non-passive wheel/touch listeners force the browser to wait for JavaScript before scrolling, which causes visible scroll jank on mobile.
How to fix it
Pass { passive: true }. If you truly need preventDefault(), pass { passive: false } explicitly and scope the listener to the smallest element. For scroll-linked effects prefer IntersectionObserver or CSS scroll-driven animations.
Example
el.addEventListener('touchmove', onMove, { passive: true })References
More lint rules
void lint reports 67 rules in this category. Static source checks with no browser: Tailwind v4 silent failures, Next.js 16 API traps, React render-body bugs, accessibility markup, SEO files and motion hygiene.
motionvalue-subscribe-in-renderMotionValue `.on("change")` subscription in a component bodywebgl-in-mapWebGL canvas rendered inside `.map()`raf-without-cancel`requestAnimationFrame` loop in an effect without `cancelAnimationFrame`listener-without-cleanupEvent listener or interval added in an effect without cleanupunload-listener`unload` event listeneruseeffect-fetchPage fetches its data in `useEffect`div-buttonClickable `<div>`/`<span>` without button semanticsdangerously-set-jsonld-unescapedJSON-LD injected with `JSON.stringify` without escaping `<`