# WCAG 2.2 AAA Compliance Design **Date:** 2026-02-18 **Scope:** `break-timer/` (frontend + CSS only, no Rust backend changes) **Goal:** Achieve WCAG 2.2 AAA conformance while preserving the existing dark-theme visual identity. ## Audit Summary 42 issues found (8 Critical, 14 Major, 20 Minor) across 28 source files. The app already has solid AA foundations: focus indicators, reduced motion support, forced colors mode, ARIA roles on custom widgets, screen-reader text, and keyboard support for complex components. ## Design Decisions 1. **Secondary text color:** `#8a8a8a` -> `#a8a8a8` (7.28:1 ratio, minimal visual change) 2. **Target sizes:** Enlarge controls to 44px (visual + padding), including 20px traffic lights, 28px swatches, 36px steppers 3. **Auto-dismiss toasts:** Persist until dismissed when user hovers/focuses; auto-fade only if untouched --- ## Section 1: Color & Contrast System ### Theme Token Changes (`app.css`) | Token | Current | New | Ratio on #000 | |-------|---------|-----|---------------| | `--color-text-sec` | `#8a8a8a` | `#a8a8a8` | 7.28:1 | | `--color-text-dim` | `#3a3a3a` | `#5c5c5c` | 3.5:1 (decorative) | | `--color-border` | `#222222` | `#3a3a3a` | 2.63:1 (non-text) | | New: `--color-input-border` | — | `#444444` | 3.14:1 | | New: `--color-surface-lt` | — | `#1e1e1e` | 1.28:1 (bg-to-bg) | ### Hardcoded Color Replacements - All `text-[#8a8a8a]` -> `text-text-sec` (Tailwind theme token) - All `border-[#222]` -> `border-border` - All `border-[#161616]` -> `border-[#333]` (card dividers: 3:1) - All `bg-[#141414]` (stepper bg) -> `bg-[#1a1a1a]` with `border border-[#3a3a3a]` - Toggle OFF knob: `#444` -> `#666` - Mini paused text: `#555` -> `#a8a8a8` - Placeholder text: `#2a2a2a` -> `#555` (3.37:1) - Danger color: `#f85149` -> `#ff6b6b` (7.41:1) ### Focus Indicator Safety When accent color is too dark, add white outer shadow fallback: ```css :focus-visible { outline: 2px solid var(--color-accent); outline-offset: 2px; box-shadow: 0 0 0 4px rgba(255,255,255,0.3); } ``` --- ## Section 2: Target Size Enlargement | Component | Current | New Visual | Hit Area | |-----------|---------|-----------|----------| | Titlebar traffic lights | 15x15px | 20x20px | 44x44px (padding) | | Color swatches | 22x22px | 28x28px | 44px spacing | | Stepper +/- buttons | 28x28px | 36x36px | 44x44px (padding) | | Toggle switch | 48x24px | 52x28px | 52x44px (padding) | | Back button | 32x32px | 40x40px | 44x44px | | Stats tab buttons | ~60x30px | ~60x40px | 44px height | | Activity star/remove | 32x32px | 36x36px | 44x44px (padding) | | Time range buttons | 32x32px | 36x36px | 44x44px (padding) | Strategy: Use `min-h-[44px] min-w-[44px]` on interactive elements with padding for visual sizing. --- ## Section 3: Heading Hierarchy & Document Structure ### Heading Fixes - Each view keeps `

` - Settings/Stats: Change all `

` to `

` - Working Hours section: Add missing heading - BreakScreen `

` stays correct ### Landmark Regions - Titlebar: Wrap in `
` - Dashboard bottom buttons: Wrap in `