Why it matters
Array(repeat).fill(0).map(() => (Magic UI marquee, Skiper TextRoll) makes screen readers announce the content N times and adds N× tab stops for every link inside. Crawlers also see duplicated text.{children})
How to fix it
Render the first copy normally and mark every duplicate aria-hidden and inert (both: aria-hidden alone leaves focusable links). Add a pause control and stop the animation under prefers-reduced-motion.
Example
{Array.from({ length: repeat }, (_, i) => (
<div key={i} aria-hidden={i > 0 || undefined} inert={i > 0 || undefined} className="animate-marquee">
{children}
</div>
))}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.
jsonld-deprecated-typeJSON-LD type that no longer produces rich resultsroute-js-budgetRoute first-load JS over budget (from `.next` build output)animate-undefined`animate-*` class with no matching `--animate-*` theme variable or `@keyframes`random-in-render`Math.random()` / `Date.now()` / `new Date()` evaluated in a component render bodyconditional-hookHook called inside a JSX expression, `&&`, ternary or callbacksvg-global-idHardcoded `id` on an SVG `<filter>`, gradient, `<clipPath>` or `<mask>` inside a reusable componentallocation-per-frame`new Intl.NumberFormat` / `Intl.NumberFormat(` / `new Color(` inside an animation-frame callbacksetstate-per-pointer-moveReact state set inside a `mousemove` / `pointermove` / `scroll` handler