design/motion-design/skills/motion-accessibility/SKILL.md
This skill should be used when the user needs to make animations safe and compliant for users with motion sensitivities, or wants to audit existing animations for accessibility. Trigger when the user mentions "prefers-reduced-motion", "vestibular disorder", "motion sensitivity", "WCAG animation", "WCAG 2.3.1", "seizure threshold", "flashing content", "parallax accessibility", "dizzy from animation", "animation causes nausea", "motion a11y", "reduce motion", "animation accessibility audit", or asks how to make their animations WCAG compliant. Also trigger when the user is working on a medical, government, or high-compliance product and mentions any animation, or when accessibility is mentioned alongside motion design.
npx skillsauth add harsh040506/claude-code-unified-skill-plugin-library motion-accessibilityInstall this skill globally with one command. Works with Claude Code, Cursor, and Windsurf.
3 of 9 scanners reported clean
Some scanners were skipped, did not run, or reported a non-clean status. Review each row below.
Motion accessibility is not a nice-to-have. For users with vestibular disorders, epilepsy, ADHD, or certain neurological conditions, ignored motion preferences cause genuine physical harm: nausea, vertigo, headaches, and in extreme cases, seizures. This skill provides a systematic audit and remediation workflow.
The key insight: prefers-reduced-motion gets mentioned in every animation article and ignored in every production codebase. This skill treats it as a functional requirement, not a footnote.
| Condition | Problematic animation types | |-----------|----------------------------| | Vestibular disorders | Parallax, spatial translations, zoom transforms, camera-like movement | | Epilepsy / photosensitivity | Rapid flashing, high-frequency strobing, fast blinking | | ADHD / attention conditions | Background animations, infinite loops, peripheral motion | | Motion sickness | Scroll-linked transforms, rotation, 3D perspective | | Low vision | Fast animations that leave no time to read transitional states |
Affected users: approximately 35% of adults experience some form of motion sensitivity. Vestibular disorders affect 1 in 3 people over 40.
Every site with animations must implement this baseline, with no exceptions:
@media (prefers-reduced-motion: reduce) {
*, *::before, *::after {
animation-duration: 0.01ms !important;
animation-iteration-count: 1 !important;
transition-duration: 0.01ms !important;
scroll-behavior: auto !important;
}
}
This is a safe catch-all. The !important ensures library-injected inline styles cannot override it.
In Framer Motion:
import { useReducedMotion } from "framer-motion";
function AnimatedComponent() {
const prefersReducedMotion = useReducedMotion();
return (
<motion.div
initial={prefersReducedMotion ? false : { opacity: 0, y: 16 }}
animate={{ opacity: 1, y: 0 }}
transition={prefersReducedMotion
? { duration: 0 } // Instant — no animation
: { duration: 0.28, ease: [0, 0, 0.58, 1] }
}
/>
);
}
Reduced motion ≠ no motion. Fading is safe. Instant state changes are safe. What to eliminate:
| Eliminate | Acceptable alternative | |-----------|----------------------| | Large translateX/Y (spatial movement) | Opacity fade only | | Scale pulsing (0.95 → 1.05 → ...) | Opacity pulse (0.6 → 1 → ...) | | Parallax depth layers | Static layers, no movement | | Spinning loaders | Non-spinning progress bar | | Background decorative animations | Static background | | Scroll-linked transforms | Remove motion, keep fade |
Rule: No content should flash more than 3 times per second.
Three flashes per second is the threshold at which strobing content can trigger photosensitive epilepsy in susceptible individuals. This applies to ANY on-screen content: animations, video, scrolling text, loading pulses.
In practice:
Test it: PEAT (Photosensitive Epilepsy Analysis Tool) or Harding Test online.
Rule: Any automatically-playing content that lasts more than 5 seconds must have a pause/stop mechanism.
function AutoplayAnimation() {
const [playing, setPlaying] = useState(true);
return (
<>
<motion.div animate={playing ? { rotate: 360 } : {}} />
<button
onClick={() => setPlaying(!playing)}
aria-label={playing ? "Pause animation" : "Resume animation"}
>
{playing ? "Pause" : "Play"}
</button>
</>
);
}
Infinite decorative loops (background hero animations, looping particles, ambient motion) all require this control.
Rule: Motion must never be the only way to communicate state or status.
// ❌ Motion is the only success signal
<motion.button animate={{ scale: [1, 1.1, 1] }} /> // Only visual bounce — no text
// ✅ Motion + text + ARIA
<motion.button
animate={{ scale: [1, 1.1, 1] }}
aria-label="Submitted successfully"
>
<span aria-live="polite">{submitted ? "Done!" : "Submit"}</span>
</motion.button>
Loading spinners must have accompanying text or ARIA:
<div role="status" aria-label="Loading, please wait">
<Spinner aria-hidden="true" />
<span className="sr-only">Loading...</span>
</div>
Use this checklist on any animated page or component:
animation and transition declarationsprefers-reduced-motionaria-live regions used for async status changes?function Modal({ isOpen, onClose }) {
const firstFocusableRef = useRef(null);
const triggerRef = useRef(null);
useEffect(() => {
if (isOpen) {
// Move focus into modal after open animation starts
setTimeout(() => firstFocusableRef.current?.focus(), 50);
} else {
// Return focus to trigger on close
triggerRef.current?.focus();
}
}, [isOpen]);
return (
<AnimatePresence>
{isOpen && (
<motion.dialog
aria-modal="true"
initial={{ opacity: 0, y: 8 }}
animate={{ opacity: 1, y: 0 }}
exit={{ opacity: 0, y: 8 }}
transition={{ duration: 0.2 }}
>
<button ref={firstFocusableRef} onClick={onClose}>Close</button>
{/* modal content */}
</motion.dialog>
)}
</AnimatePresence>
);
}
Trap focus inside open modals — keyboard users should not be able to tab outside the modal while it is open. Use a focus trap library (focus-trap-react) or implement manually with a keydown listener.
references/wcag-motion-audit.md — WCAG 2.3.1 full text and examples, PEAT test tool walkthrough, jurisdiction-specific requirements (ADA, EN 301 549), legal case precedents, complete ARIA role and live region reference for animation-driven state changestesting
Performs quality control on single-cell RNA-seq data (.h5ad or .h5 files) using scverse best practices with MAD-based filtering and comprehensive visualizations. Use when users request QC analysis, filtering low-quality cells, assessing data quality, or following scverse/scanpy best practices for single-cell analysis.
tools
Deep learning for single-cell analysis using scvi-tools. This skill should be used when users need (1) data integration and batch correction with scVI/scANVI, (2) ATAC-seq analysis with PeakVI, (3) CITE-seq multi-modal analysis with totalVI, (4) multiome RNA+ATAC analysis with MultiVI, (5) spatial transcriptomics deconvolution with DestVI, (6) label transfer and reference mapping with scANVI/scArches, (7) RNA velocity with veloVI, or (8) any deep learning-based single-cell method. Triggers include mentions of scVI, scANVI, totalVI, PeakVI, MultiVI, DestVI, veloVI, sysVI, scArches, variational autoencoder, VAE, batch correction, data integration, multi-modal, CITE-seq, multiome, reference mapping, latent space.
testing
This skill should be used when scientists need help with research problem selection, project ideation, troubleshooting stuck projects, or strategic scientific decisions. Use this skill when users ask to pitch a new research idea, work through a project problem, evaluate project risks, plan research strategy, navigate decision trees, or get help choosing what scientific problem to work on. Typical requests include "I have an idea for a project", "I'm stuck on my research", "help me evaluate this project", "what should I work on", or "I need strategic advice about my research".
development
Run nf-core bioinformatics pipelines (rnaseq, sarek, atacseq) on sequencing data. Use when analyzing RNA-seq, WGS/WES, or ATAC-seq data—either local FASTQs or public datasets from GEO/SRA. Triggers on nf-core, Nextflow, FASTQ analysis, variant calling, gene expression, differential expression, GEO reanalysis, GSE/GSM/SRR accessions, or samplesheet creation.