From 6a4fc86387a2b993683cbb48f3497e9486b5b57c Mon Sep 17 00:00:00 2001 From: A Charlwood Date: Fri, 13 Feb 2026 18:04:52 +0000 Subject: [PATCH] Task 20: Accessibility audit improvements MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Semantic HTML: - Changed Card component from div to article element - Added id="main-content" to main element for skip link target Keyboard Navigation & ARIA: - Added skip link to TopBar (visible only on focus, navigates to #main-content) - Added aria-label="Active session information" to session info container - Added aria-hidden="true" to all decorative colored dots (CardHeader, CareerActivity, Projects, Sidebar status badge) - All expandable items already have role="button", tabIndex={0}, aria-expanded - All KPI cards already have proper aria-label describing flip state - Command palette already has full ARIA implementation (combobox, listbox, dialog) Focus Management: - Added global focus-visible styles in index.css (2px accent outline, 2px offset) - Buttons, links, inputs all have proper focus rings with accent color - Command palette focus trap already implemented Reduced Motion: - All components already check prefers-reduced-motion at module scope - Dashboard entrance, tile expansion, KPI flip, palette animations respect reduced motion - Added reduced motion override for pulse animation (disables pulse, keeps static dot) Color Contrast: - All color tokens already meet WCAG AA standards per ref spec - Tertiary text (#8DA8A5) used only for supplementary labels where information is conveyed elsewhere Quality checks: typecheck ✓, lint ✓ (1 pre-existing warning), build ✓ --- src/components/Card.tsx | 6 ++-- src/components/DashboardLayout.tsx | 1 + src/components/Sidebar.tsx | 1 + src/components/TopBar.tsx | 31 +++++++++++++++++- src/components/tiles/CareerActivityTile.tsx | 1 + src/components/tiles/ProjectsTile.tsx | 1 + src/index.css | 36 +++++++++++++++++++++ 7 files changed, 73 insertions(+), 4 deletions(-) diff --git a/src/components/Card.tsx b/src/components/Card.tsx index 094e88f..4d39d2e 100644 --- a/src/components/Card.tsx +++ b/src/components/Card.tsx @@ -23,7 +23,7 @@ export function Card({ children, full, className, tileId }: CardProps) { } return ( -
setIsHovered(false)} > {children} -
+ ) } @@ -85,7 +85,7 @@ export function CardHeader({ dotColor, title, rightText }: CardHeaderProps) { return (
-
+ diff --git a/src/components/DashboardLayout.tsx b/src/components/DashboardLayout.tsx index d5de37b..18b0d08 100644 --- a/src/components/DashboardLayout.tsx +++ b/src/components/DashboardLayout.tsx @@ -135,6 +135,7 @@ export function DashboardLayout() { {/* Main content — scrollable card grid */}
diff --git a/src/components/TopBar.tsx b/src/components/TopBar.tsx index 0c81f58..4770ffc 100644 --- a/src/components/TopBar.tsx +++ b/src/components/TopBar.tsx @@ -26,6 +26,32 @@ export function TopBar({ onSearchClick }: TopBarProps) { zIndex: 100, }} > + {/* Skip to main content link (only visible on focus) */} + { + e.currentTarget.style.top = '0' + }} + onBlur={(e) => { + e.currentTarget.style.top = '-40px' + }} + > + Skip to main content + {/* Brand */}
{/* Session info (right) */} -
+
= ({ entry, isExpanded, onToggle flexShrink: 0, marginTop: '2px', }} + aria-hidden="true" />