diff --git a/src/app/globals.css b/src/app/globals.css index 4194d31d..786b838d 100644 --- a/src/app/globals.css +++ b/src/app/globals.css @@ -349,3 +349,20 @@ a { .markdown-body [width] { width: auto; } + +/* + ACCESSIBILITY: Respect prefers-reduced-motion OS preference + WCAG 2.3.3 — Animation from Interactions + This is a CSS-level safety net that works even before JS loads, + catching Tailwind animate classes and any CSS transitions. + */ +@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; + } +} diff --git a/src/app/layout.tsx b/src/app/layout.tsx index e9a8aeee..2593bfc8 100644 --- a/src/app/layout.tsx +++ b/src/app/layout.tsx @@ -15,6 +15,7 @@ import 'github-markdown-css/github-markdown.css'; import PageTrackerInit from '@/components/PageTrackerInit'; import './globals.css'; import '@/styles/resume-print.css'; +import { MotionConfig } from 'framer-motion'; const inter = Inter({ subsets: ['latin'], variable: '--font-inter' }); const spaceGrotesk = Space_Grotesk({ @@ -123,30 +124,32 @@ export default function RootLayout({ className={`${inter.variable} ${spaceGrotesk.variable} ${barlowCondensed.variable}`} suppressHydrationWarning > - - - -