Initial commit
This commit is contained in:
12
.claude-plugin/plugin.json
Normal file
12
.claude-plugin/plugin.json
Normal file
@@ -0,0 +1,12 @@
|
|||||||
|
{
|
||||||
|
"name": "ui-design-review",
|
||||||
|
"description": "Comprehensive UI/UX design review for websites and desktop applications with extensive WCAG 2.1/2.2 accessibility analysis, usability evaluation, and visual design assessment",
|
||||||
|
"version": "1.0.0",
|
||||||
|
"author": {
|
||||||
|
"name": "rknall",
|
||||||
|
"email": "zhongweili@tubi.tv"
|
||||||
|
},
|
||||||
|
"skills": [
|
||||||
|
"./"
|
||||||
|
]
|
||||||
|
}
|
||||||
3
README.md
Normal file
3
README.md
Normal file
@@ -0,0 +1,3 @@
|
|||||||
|
# ui-design-review
|
||||||
|
|
||||||
|
Comprehensive UI/UX design review for websites and desktop applications with extensive WCAG 2.1/2.2 accessibility analysis, usability evaluation, and visual design assessment
|
||||||
774
SKILL.md
Normal file
774
SKILL.md
Normal file
@@ -0,0 +1,774 @@
|
|||||||
|
---
|
||||||
|
name: "UI/UX Design Review"
|
||||||
|
description: "Comprehensive design review for websites and desktop applications with extensive accessibility analysis. Use this skill when users ask you to review UI/UX designs, wireframes, mockups, prototypes, or deployed interfaces for usability, accessibility (WCAG compliance), visual design, interaction patterns, responsive design, and best practices for web and desktop applications."
|
||||||
|
---
|
||||||
|
|
||||||
|
# UI/UX Design Review
|
||||||
|
|
||||||
|
This skill provides comprehensive design review capabilities for websites and desktop applications, with a strong focus on accessibility compliance and best practices.
|
||||||
|
|
||||||
|
## When to Use This Skill
|
||||||
|
|
||||||
|
Activate this skill when the user requests:
|
||||||
|
- Review of UI/UX designs, wireframes, or mockups
|
||||||
|
- Accessibility audit (WCAG 2.1/2.2 compliance)
|
||||||
|
- Usability assessment
|
||||||
|
- Visual design critique
|
||||||
|
- Interaction pattern review
|
||||||
|
- Responsive design evaluation
|
||||||
|
- Design system assessment
|
||||||
|
- Component library review
|
||||||
|
- User flow analysis
|
||||||
|
- Information architecture review
|
||||||
|
- Desktop application UI review
|
||||||
|
|
||||||
|
## Review Framework
|
||||||
|
|
||||||
|
### 1. Initial Analysis
|
||||||
|
|
||||||
|
When a user provides a design or interface, begin by:
|
||||||
|
|
||||||
|
1. **Understanding Context**
|
||||||
|
- Ask clarifying questions about:
|
||||||
|
- Target audience and personas
|
||||||
|
- Platform(s): web, desktop (Windows/Mac/Linux), mobile
|
||||||
|
- Accessibility requirements and compliance level needed
|
||||||
|
- Brand guidelines or design system in use
|
||||||
|
- User research or testing conducted
|
||||||
|
- Technical constraints
|
||||||
|
- Browser/OS support requirements
|
||||||
|
- Key user goals and tasks
|
||||||
|
|
||||||
|
2. **Design Artifact Analysis**
|
||||||
|
- If designs, screenshots, or prototypes are provided, analyze:
|
||||||
|
- Visual hierarchy and layout
|
||||||
|
- Color usage and contrast
|
||||||
|
- Typography and readability
|
||||||
|
- Component patterns and consistency
|
||||||
|
- Navigation structure
|
||||||
|
- Interactive elements
|
||||||
|
- Responsive behavior
|
||||||
|
- State variations (hover, active, disabled, error, etc.)
|
||||||
|
|
||||||
|
### 2. Comprehensive Review Areas
|
||||||
|
|
||||||
|
Evaluate the design across these dimensions:
|
||||||
|
|
||||||
|
#### A. Accessibility (WCAG 2.1/2.2 Compliance)
|
||||||
|
|
||||||
|
This is a CRITICAL area that must be thoroughly reviewed for all interfaces.
|
||||||
|
|
||||||
|
**Level A Requirements (Minimum):**
|
||||||
|
|
||||||
|
**1.1 Text Alternatives**
|
||||||
|
- [ ] All images have appropriate alt text
|
||||||
|
- [ ] Decorative images have empty alt attributes
|
||||||
|
- [ ] Icons have accessible labels
|
||||||
|
- [ ] Complex images have detailed descriptions
|
||||||
|
- [ ] Image buttons have descriptive text
|
||||||
|
|
||||||
|
**1.2 Time-based Media**
|
||||||
|
- [ ] Video content has captions
|
||||||
|
- [ ] Audio content has transcripts
|
||||||
|
- [ ] Pre-recorded media has alternatives
|
||||||
|
|
||||||
|
**1.3 Adaptable**
|
||||||
|
- [ ] Content structure is logical without CSS
|
||||||
|
- [ ] Reading order is meaningful
|
||||||
|
- [ ] Instructions don't rely solely on sensory characteristics
|
||||||
|
- [ ] Semantic HTML is used properly
|
||||||
|
- [ ] Form labels are programmatically associated
|
||||||
|
|
||||||
|
**1.4 Distinguishable**
|
||||||
|
- [ ] Color is not the only visual means of conveying information
|
||||||
|
- [ ] Audio controls are available
|
||||||
|
- [ ] Text has sufficient contrast (4.5:1 for normal text, 3:1 for large text)
|
||||||
|
- [ ] Text can be resized up to 200% without loss of functionality
|
||||||
|
- [ ] Images of text are avoided (except logos)
|
||||||
|
|
||||||
|
**2.1 Keyboard Accessible**
|
||||||
|
- [ ] All functionality is keyboard accessible
|
||||||
|
- [ ] No keyboard traps exist
|
||||||
|
- [ ] Keyboard shortcuts don't conflict with assistive technologies
|
||||||
|
- [ ] Focus order is logical
|
||||||
|
- [ ] Focus is visible at all times
|
||||||
|
|
||||||
|
**2.2 Enough Time**
|
||||||
|
- [ ] Time limits can be adjusted, extended, or turned off
|
||||||
|
- [ ] Moving, blinking, scrolling content can be paused
|
||||||
|
- [ ] Auto-updating content can be paused or controlled
|
||||||
|
|
||||||
|
**2.3 Seizures and Physical Reactions**
|
||||||
|
- [ ] Content doesn't flash more than 3 times per second
|
||||||
|
- [ ] No content violates flash threshold
|
||||||
|
|
||||||
|
**2.4 Navigable**
|
||||||
|
- [ ] Skip links allow bypassing repeated content
|
||||||
|
- [ ] Page titles are descriptive and unique
|
||||||
|
- [ ] Focus order preserves meaning
|
||||||
|
- [ ] Link purpose is clear from context
|
||||||
|
- [ ] Multiple navigation methods exist
|
||||||
|
- [ ] Headings and labels are descriptive
|
||||||
|
|
||||||
|
**2.5 Input Modalities**
|
||||||
|
- [ ] All functionality works with pointer gestures
|
||||||
|
- [ ] Touch targets are sufficiently large (minimum 44x44px)
|
||||||
|
- [ ] Accidental activation is prevented
|
||||||
|
|
||||||
|
**3.1 Readable**
|
||||||
|
- [ ] Page language is identified
|
||||||
|
- [ ] Language changes are marked up
|
||||||
|
|
||||||
|
**3.2 Predictable**
|
||||||
|
- [ ] Focus doesn't trigger unexpected changes
|
||||||
|
- [ ] Input doesn't trigger unexpected changes
|
||||||
|
- [ ] Navigation is consistent across pages
|
||||||
|
- [ ] Components are identified consistently
|
||||||
|
|
||||||
|
**3.3 Input Assistance**
|
||||||
|
- [ ] Form errors are identified and described
|
||||||
|
- [ ] Labels and instructions are provided
|
||||||
|
- [ ] Error suggestions are offered
|
||||||
|
- [ ] Critical actions can be reversed, checked, or confirmed
|
||||||
|
|
||||||
|
**4.1 Compatible**
|
||||||
|
- [ ] HTML is valid and properly nested
|
||||||
|
- [ ] IDs are unique
|
||||||
|
- [ ] ARIA attributes are used correctly
|
||||||
|
- [ ] Status messages are programmatically determinable
|
||||||
|
|
||||||
|
**Level AA Requirements (Recommended):**
|
||||||
|
|
||||||
|
- [ ] Contrast ratio is at least 4.5:1 (3:1 for large text)
|
||||||
|
- [ ] Text can be resized up to 200% without assistive technology
|
||||||
|
- [ ] Images of text are avoided unless customizable
|
||||||
|
- [ ] Visual presentation of text allows customization
|
||||||
|
- [ ] Audio content doesn't interfere with screen readers
|
||||||
|
- [ ] Multiple ways to locate pages exist
|
||||||
|
- [ ] Headings and labels are descriptive
|
||||||
|
- [ ] Focus indicator is visible
|
||||||
|
- [ ] Section headings are used to organize content
|
||||||
|
|
||||||
|
**Level AAA Requirements (Best Practice):**
|
||||||
|
|
||||||
|
- [ ] Contrast ratio is at least 7:1 (4.5:1 for large text)
|
||||||
|
- [ ] No images of text are used
|
||||||
|
- [ ] Text spacing can be adjusted
|
||||||
|
- [ ] Content reflows to 320px without scrolling
|
||||||
|
- [ ] Hover/focus content is dismissible and persistent
|
||||||
|
|
||||||
|
**Provide Feedback On:**
|
||||||
|
- Specific WCAG violations with severity level
|
||||||
|
- Missing ARIA labels and landmarks
|
||||||
|
- Color contrast issues with measured ratios
|
||||||
|
- Keyboard navigation problems
|
||||||
|
- Screen reader compatibility issues
|
||||||
|
- Missing alternative text
|
||||||
|
- Form accessibility issues
|
||||||
|
- Focus management problems
|
||||||
|
- Semantic HTML issues
|
||||||
|
|
||||||
|
**Testing Recommendations:**
|
||||||
|
- Use automated tools: axe DevTools, WAVE, Lighthouse
|
||||||
|
- Manual keyboard navigation testing
|
||||||
|
- Screen reader testing (NVDA, JAWS, VoiceOver)
|
||||||
|
- Color contrast analyzers
|
||||||
|
- Focus indicator visibility
|
||||||
|
- Zoom testing (200%, 400%)
|
||||||
|
|
||||||
|
#### B. Visual Design & Aesthetics
|
||||||
|
|
||||||
|
**Evaluate:**
|
||||||
|
- Visual hierarchy and layout structure
|
||||||
|
- Color palette and color theory application
|
||||||
|
- Typography choices and hierarchy
|
||||||
|
- White space and density
|
||||||
|
- Visual balance and alignment
|
||||||
|
- Consistency with brand guidelines
|
||||||
|
- Modern vs dated design patterns
|
||||||
|
- Visual weight distribution
|
||||||
|
- Grid system usage
|
||||||
|
- Component visual consistency
|
||||||
|
|
||||||
|
**Provide Feedback On:**
|
||||||
|
- Cluttered or overwhelming layouts
|
||||||
|
- Poor visual hierarchy
|
||||||
|
- Inconsistent spacing
|
||||||
|
- Typography issues (too many fonts, poor sizing)
|
||||||
|
- Color palette problems
|
||||||
|
- Lack of visual breathing room
|
||||||
|
- Misaligned elements
|
||||||
|
- Inconsistent component styling
|
||||||
|
- Dated design patterns
|
||||||
|
|
||||||
|
**Design System Considerations:**
|
||||||
|
- Design token usage (colors, spacing, typography)
|
||||||
|
- Component library consistency
|
||||||
|
- Pattern library adherence
|
||||||
|
- Brand guideline compliance
|
||||||
|
|
||||||
|
#### C. User Experience & Usability
|
||||||
|
|
||||||
|
**Evaluate:**
|
||||||
|
- User flow logic and efficiency
|
||||||
|
- Information architecture
|
||||||
|
- Navigation patterns and clarity
|
||||||
|
- Cognitive load
|
||||||
|
- Task completion efficiency
|
||||||
|
- Error prevention and recovery
|
||||||
|
- Feedback mechanisms
|
||||||
|
- Learnability for new users
|
||||||
|
- Efficiency for experienced users
|
||||||
|
- Mental models and user expectations
|
||||||
|
- Consistency with platform conventions
|
||||||
|
|
||||||
|
**Provide Feedback On:**
|
||||||
|
- Confusing navigation
|
||||||
|
- Too many steps to complete tasks
|
||||||
|
- Unclear labeling or terminology
|
||||||
|
- Missing or unclear feedback
|
||||||
|
- Poor error messages
|
||||||
|
- Inconsistent interaction patterns
|
||||||
|
- Violation of established conventions
|
||||||
|
- High cognitive load
|
||||||
|
- Missing confirmation for destructive actions
|
||||||
|
|
||||||
|
**Jakob Nielsen's Usability Heuristics:**
|
||||||
|
1. Visibility of system status
|
||||||
|
2. Match between system and real world
|
||||||
|
3. User control and freedom
|
||||||
|
4. Consistency and standards
|
||||||
|
5. Error prevention
|
||||||
|
6. Recognition rather than recall
|
||||||
|
7. Flexibility and efficiency of use
|
||||||
|
8. Aesthetic and minimalist design
|
||||||
|
9. Help users recognize and recover from errors
|
||||||
|
10. Help and documentation
|
||||||
|
|
||||||
|
#### D. Responsive Design & Layout
|
||||||
|
|
||||||
|
**Evaluate:**
|
||||||
|
- Breakpoint strategy
|
||||||
|
- Mobile-first approach
|
||||||
|
- Touch target sizes (minimum 44x44px)
|
||||||
|
- Content reflow behavior
|
||||||
|
- Layout patterns (sidebar, hamburger menu, etc.)
|
||||||
|
- Image and media responsiveness
|
||||||
|
- Typography scaling
|
||||||
|
- Navigation adaptation
|
||||||
|
- Form layout on mobile
|
||||||
|
- Table handling on small screens
|
||||||
|
|
||||||
|
**Provide Feedback On:**
|
||||||
|
- Missing breakpoints
|
||||||
|
- Horizontal scrolling on mobile
|
||||||
|
- Too-small touch targets
|
||||||
|
- Overlapping content
|
||||||
|
- Poor mobile navigation
|
||||||
|
- Unreadable text on mobile
|
||||||
|
- Missing mobile-specific patterns
|
||||||
|
- Inefficient use of screen space
|
||||||
|
|
||||||
|
**Desktop-Specific Considerations:**
|
||||||
|
- Window resizing behavior
|
||||||
|
- Minimum/maximum window dimensions
|
||||||
|
- Multi-monitor support
|
||||||
|
- Native OS patterns (Windows, macOS, Linux)
|
||||||
|
- Keyboard shortcuts
|
||||||
|
- Context menus
|
||||||
|
- Drag and drop
|
||||||
|
|
||||||
|
#### E. Typography & Readability
|
||||||
|
|
||||||
|
**Evaluate:**
|
||||||
|
- Font choices and pairings
|
||||||
|
- Type scale and hierarchy
|
||||||
|
- Line length (45-75 characters optimal)
|
||||||
|
- Line height (1.5-1.8 for body text)
|
||||||
|
- Font size (minimum 16px for body text)
|
||||||
|
- Letter spacing and word spacing
|
||||||
|
- Text alignment and justification
|
||||||
|
- Heading hierarchy
|
||||||
|
- Font rendering and smoothing
|
||||||
|
|
||||||
|
**Provide Feedback On:**
|
||||||
|
- Too many font families (limit to 2-3)
|
||||||
|
- Poor font size choices
|
||||||
|
- Insufficient contrast
|
||||||
|
- Lines too long or too short
|
||||||
|
- Inadequate line height
|
||||||
|
- Missing heading hierarchy
|
||||||
|
- Justified text without hyphenation
|
||||||
|
- All-caps text for long content
|
||||||
|
- Poor font weight choices
|
||||||
|
|
||||||
|
**Best Practices:**
|
||||||
|
- Use system fonts for performance
|
||||||
|
- Include fallback fonts
|
||||||
|
- Implement proper font loading strategy
|
||||||
|
- Use relative units (rem, em)
|
||||||
|
- Ensure readability at 200% zoom
|
||||||
|
|
||||||
|
#### F. Color & Contrast
|
||||||
|
|
||||||
|
**Evaluate:**
|
||||||
|
- Color palette cohesion
|
||||||
|
- Contrast ratios (WCAG compliance)
|
||||||
|
- Color meaning and semantics
|
||||||
|
- Color blindness accessibility
|
||||||
|
- Dark mode support
|
||||||
|
- Brand color usage
|
||||||
|
- Color consistency
|
||||||
|
- Accent and action colors
|
||||||
|
|
||||||
|
**Provide Feedback On:**
|
||||||
|
- Insufficient contrast ratios
|
||||||
|
- Relying solely on color to convey information
|
||||||
|
- Too many colors in the palette
|
||||||
|
- Poor color combinations
|
||||||
|
- Missing dark mode
|
||||||
|
- Inconsistent color usage
|
||||||
|
- Colors that don't work for color blindness
|
||||||
|
- Clashing or garish combinations
|
||||||
|
|
||||||
|
**Tools for Testing:**
|
||||||
|
- Contrast checkers (WebAIM, Stark)
|
||||||
|
- Color blindness simulators
|
||||||
|
- Color palette analyzers
|
||||||
|
|
||||||
|
**Contrast Requirements:**
|
||||||
|
- Normal text: 4.5:1 (AA), 7:1 (AAA)
|
||||||
|
- Large text (18pt+/14pt bold+): 3:1 (AA), 4.5:1 (AAA)
|
||||||
|
- UI components and graphics: 3:1 (AA)
|
||||||
|
|
||||||
|
#### G. Interactive Elements & Components
|
||||||
|
|
||||||
|
**Evaluate:**
|
||||||
|
- Button styles and states
|
||||||
|
- Form controls and inputs
|
||||||
|
- Links and their appearance
|
||||||
|
- Interactive feedback (hover, active, focus, disabled)
|
||||||
|
- Loading states and skeletons
|
||||||
|
- Error states and validation
|
||||||
|
- Success states and confirmations
|
||||||
|
- Tooltips and popovers
|
||||||
|
- Modals and dialogs
|
||||||
|
- Dropdown and select menus
|
||||||
|
- Toggle switches and checkboxes
|
||||||
|
- Radio buttons
|
||||||
|
- Accordions and collapsible content
|
||||||
|
|
||||||
|
**Provide Feedback On:**
|
||||||
|
- Unclear clickable areas
|
||||||
|
- Missing hover/focus states
|
||||||
|
- Poor button hierarchy
|
||||||
|
- Inconsistent interactive patterns
|
||||||
|
- Missing loading indicators
|
||||||
|
- Unclear disabled states
|
||||||
|
- Poor error messaging
|
||||||
|
- Ambiguous icons without labels
|
||||||
|
- Too many action options
|
||||||
|
- Destructive actions without confirmation
|
||||||
|
|
||||||
|
**Component Checklist:**
|
||||||
|
- [ ] All states are designed (default, hover, focus, active, disabled, error, success)
|
||||||
|
- [ ] Touch targets meet minimum size
|
||||||
|
- [ ] Interactive elements have clear affordances
|
||||||
|
- [ ] Focus indicators are visible
|
||||||
|
- [ ] Loading states prevent multiple submissions
|
||||||
|
- [ ] Error messages are helpful and specific
|
||||||
|
|
||||||
|
#### H. Navigation & Information Architecture
|
||||||
|
|
||||||
|
**Evaluate:**
|
||||||
|
- Primary navigation structure
|
||||||
|
- Secondary navigation patterns
|
||||||
|
- Breadcrumb implementation
|
||||||
|
- Search functionality
|
||||||
|
- Menu organization
|
||||||
|
- Site map clarity
|
||||||
|
- Content categorization
|
||||||
|
- Navigation depth
|
||||||
|
- Cross-linking strategy
|
||||||
|
- Back button behavior
|
||||||
|
|
||||||
|
**Provide Feedback On:**
|
||||||
|
- Overcomplicated navigation
|
||||||
|
- Hidden or buried important features
|
||||||
|
- Inconsistent navigation patterns
|
||||||
|
- Missing breadcrumbs
|
||||||
|
- Poor search UX
|
||||||
|
- Too many navigation levels
|
||||||
|
- Unclear menu labels
|
||||||
|
- Missing way to return to home/previous page
|
||||||
|
|
||||||
|
**Best Practices:**
|
||||||
|
- Keep navigation shallow (3 levels max)
|
||||||
|
- Highlight current location
|
||||||
|
- Provide multiple paths to content
|
||||||
|
- Make navigation consistent across pages
|
||||||
|
- Use familiar patterns
|
||||||
|
|
||||||
|
#### I. Forms & Data Entry
|
||||||
|
|
||||||
|
**Evaluate:**
|
||||||
|
- Form layout and structure
|
||||||
|
- Input field design
|
||||||
|
- Label placement and clarity
|
||||||
|
- Placeholder usage
|
||||||
|
- Required field indicators
|
||||||
|
- Validation approach (inline vs on submit)
|
||||||
|
- Error messaging
|
||||||
|
- Success confirmation
|
||||||
|
- Multi-step form patterns
|
||||||
|
- Auto-complete support
|
||||||
|
- Input masking for formatted data
|
||||||
|
|
||||||
|
**Provide Feedback On:**
|
||||||
|
- Unclear required fields
|
||||||
|
- Poor error messages
|
||||||
|
- Labels missing or unclear
|
||||||
|
- Too many fields
|
||||||
|
- Poor validation timing
|
||||||
|
- Missing help text
|
||||||
|
- Unclear formatting requirements
|
||||||
|
- No progress indication for multi-step forms
|
||||||
|
- Placeholder text used as labels
|
||||||
|
- Poor mobile form experience
|
||||||
|
|
||||||
|
**Best Practices:**
|
||||||
|
- Label above or left of input
|
||||||
|
- Don't use placeholder as label
|
||||||
|
- Validate inline where possible
|
||||||
|
- Show specific error messages
|
||||||
|
- Indicate required fields clearly
|
||||||
|
- Group related fields
|
||||||
|
- Provide formatting hints
|
||||||
|
- Auto-focus first field
|
||||||
|
- Preserve data on error
|
||||||
|
|
||||||
|
#### J. Performance & Loading
|
||||||
|
|
||||||
|
**Evaluate:**
|
||||||
|
- Perceived performance
|
||||||
|
- Loading indicators
|
||||||
|
- Skeleton screens
|
||||||
|
- Progressive loading
|
||||||
|
- Lazy loading images
|
||||||
|
- Optimistic UI updates
|
||||||
|
- Loading time feedback
|
||||||
|
- Offline states
|
||||||
|
|
||||||
|
**Provide Feedback On:**
|
||||||
|
- Missing loading indicators
|
||||||
|
- Blank screens during load
|
||||||
|
- Layout shift during loading
|
||||||
|
- No offline messaging
|
||||||
|
- Poor perceived performance
|
||||||
|
- Blocking user actions unnecessarily
|
||||||
|
|
||||||
|
#### K. Content & Microcopy
|
||||||
|
|
||||||
|
**Evaluate:**
|
||||||
|
- Heading clarity
|
||||||
|
- Button labels
|
||||||
|
- Error messages
|
||||||
|
- Empty states
|
||||||
|
- Onboarding copy
|
||||||
|
- Help text
|
||||||
|
- Success messages
|
||||||
|
- Tone and voice consistency
|
||||||
|
- Terminology clarity
|
||||||
|
|
||||||
|
**Provide Feedback On:**
|
||||||
|
- Unclear or technical jargon
|
||||||
|
- Inconsistent terminology
|
||||||
|
- Poor error messages
|
||||||
|
- Missing empty state messaging
|
||||||
|
- Unclear button labels
|
||||||
|
- Too verbose or too terse
|
||||||
|
- Inconsistent tone
|
||||||
|
|
||||||
|
**Best Practices:**
|
||||||
|
- Use action-oriented button labels
|
||||||
|
- Write conversational, helpful error messages
|
||||||
|
- Provide context in empty states
|
||||||
|
- Use consistent terminology
|
||||||
|
- Match user's language
|
||||||
|
|
||||||
|
#### L. Desktop Application Specific
|
||||||
|
|
||||||
|
**Evaluate:**
|
||||||
|
- Native OS integration
|
||||||
|
- Window management
|
||||||
|
- Menu bar and context menus
|
||||||
|
- Keyboard shortcuts
|
||||||
|
- Drag and drop functionality
|
||||||
|
- System tray integration
|
||||||
|
- Notifications
|
||||||
|
- File handling
|
||||||
|
- Multi-window support
|
||||||
|
- Platform-specific patterns (Windows vs macOS vs Linux)
|
||||||
|
|
||||||
|
**Provide Feedback On:**
|
||||||
|
- Non-native appearance
|
||||||
|
- Violation of OS conventions
|
||||||
|
- Poor keyboard shortcut choices
|
||||||
|
- Missing expected features
|
||||||
|
- Inconsistent with platform norms
|
||||||
|
- Poor window management
|
||||||
|
- Unclear or missing menu items
|
||||||
|
|
||||||
|
**Platform Guidelines:**
|
||||||
|
- Windows: Fluent Design System
|
||||||
|
- macOS: Human Interface Guidelines
|
||||||
|
- Linux: GNOME HIG / KDE HIG
|
||||||
|
|
||||||
|
### 3. Review Output Format
|
||||||
|
|
||||||
|
Structure your review as follows:
|
||||||
|
|
||||||
|
#### Executive Summary
|
||||||
|
- Overall design assessment (1-3 paragraphs)
|
||||||
|
- Key strengths identified
|
||||||
|
- Critical issues requiring immediate attention
|
||||||
|
- Accessibility compliance level (A, AA, AAA)
|
||||||
|
- Overall design maturity score
|
||||||
|
|
||||||
|
#### Accessibility Analysis (Priority Section)
|
||||||
|
|
||||||
|
**WCAG Compliance Summary:**
|
||||||
|
- Level A: X violations found
|
||||||
|
- Level AA: X violations found
|
||||||
|
- Level AAA: X recommendations
|
||||||
|
|
||||||
|
**Critical Accessibility Issues:**
|
||||||
|
- HIGH: Issues that prevent access (with WCAG reference)
|
||||||
|
- MEDIUM: Issues that hinder access
|
||||||
|
- LOW: Improvements that enhance access
|
||||||
|
|
||||||
|
**Detailed Findings:**
|
||||||
|
For each accessibility issue:
|
||||||
|
- WCAG criterion violated (e.g., "1.4.3 Contrast (Minimum)")
|
||||||
|
- Severity: Critical/High/Medium/Low
|
||||||
|
- Description of the issue
|
||||||
|
- User impact (which users are affected)
|
||||||
|
- How to fix it (specific, actionable steps)
|
||||||
|
- Testing method to verify fix
|
||||||
|
|
||||||
|
#### Visual Design Assessment
|
||||||
|
|
||||||
|
**Strengths:**
|
||||||
|
- What works well visually
|
||||||
|
|
||||||
|
**Concerns:**
|
||||||
|
- HIGH: Major visual problems
|
||||||
|
- MEDIUM: Notable issues
|
||||||
|
- LOW: Polish and refinement opportunities
|
||||||
|
|
||||||
|
**Recommendations:**
|
||||||
|
- Specific visual improvements
|
||||||
|
- Design system suggestions
|
||||||
|
- Best practices to follow
|
||||||
|
|
||||||
|
#### UX & Usability Assessment
|
||||||
|
|
||||||
|
**Strengths:**
|
||||||
|
- Positive UX patterns identified
|
||||||
|
|
||||||
|
**Concerns:**
|
||||||
|
- HIGH: Usability blockers
|
||||||
|
- MEDIUM: Friction points
|
||||||
|
- LOW: Nice-to-have improvements
|
||||||
|
|
||||||
|
**Recommendations:**
|
||||||
|
- Specific UX improvements
|
||||||
|
- User flow optimizations
|
||||||
|
- Industry best practices
|
||||||
|
|
||||||
|
#### Responsive Design Assessment
|
||||||
|
|
||||||
|
**Strengths:**
|
||||||
|
- Responsive patterns that work well
|
||||||
|
|
||||||
|
**Concerns:**
|
||||||
|
- Issues at various breakpoints
|
||||||
|
- Mobile-specific problems
|
||||||
|
- Desktop-specific issues
|
||||||
|
|
||||||
|
**Recommendations:**
|
||||||
|
- Breakpoint adjustments
|
||||||
|
- Mobile improvements
|
||||||
|
- Desktop enhancements
|
||||||
|
|
||||||
|
#### Component & Pattern Review
|
||||||
|
|
||||||
|
**Strengths:**
|
||||||
|
- Well-designed components
|
||||||
|
|
||||||
|
**Concerns:**
|
||||||
|
- Inconsistencies
|
||||||
|
- Missing states
|
||||||
|
- Pattern violations
|
||||||
|
|
||||||
|
**Recommendations:**
|
||||||
|
- Component improvements
|
||||||
|
- Design system alignment
|
||||||
|
- Pattern library suggestions
|
||||||
|
|
||||||
|
### 4. Interactive Review Process
|
||||||
|
|
||||||
|
When conducting the review:
|
||||||
|
|
||||||
|
1. **Request design artifacts** if not provided (screenshots, Figma links, prototypes, live URLs)
|
||||||
|
2. **Ask about target users** and accessibility requirements
|
||||||
|
3. **Understand the context** (project stage, constraints, goals)
|
||||||
|
4. **Provide incremental feedback** for large interfaces
|
||||||
|
5. **Offer specific examples** of how to fix issues
|
||||||
|
6. **Reference standards** (WCAG, platform guidelines)
|
||||||
|
7. **Prioritize issues** clearly (critical → low)
|
||||||
|
8. **Suggest tools** for testing and validation
|
||||||
|
9. **Provide code examples** where helpful (HTML, CSS, ARIA)
|
||||||
|
10. **Offer to review specific areas** in more depth
|
||||||
|
|
||||||
|
### 5. Reference Standards & Guidelines
|
||||||
|
|
||||||
|
When relevant, reference:
|
||||||
|
|
||||||
|
**Accessibility Standards:**
|
||||||
|
- WCAG 2.1 Level A (minimum)
|
||||||
|
- WCAG 2.1 Level AA (target)
|
||||||
|
- WCAG 2.2 updates
|
||||||
|
- Section 508 (US government)
|
||||||
|
- ADA compliance
|
||||||
|
- EN 301 549 (EU)
|
||||||
|
|
||||||
|
**Design Guidelines:**
|
||||||
|
- Material Design (Google)
|
||||||
|
- Human Interface Guidelines (Apple)
|
||||||
|
- Fluent Design System (Microsoft)
|
||||||
|
- Carbon Design System (IBM)
|
||||||
|
- Atlassian Design System
|
||||||
|
- GOV.UK Design System
|
||||||
|
|
||||||
|
**Platform-Specific:**
|
||||||
|
- Web: W3C standards, MDN best practices
|
||||||
|
- Windows: Windows App SDK, WinUI
|
||||||
|
- macOS: AppKit, SwiftUI
|
||||||
|
- Linux: GNOME HIG, KDE HIG
|
||||||
|
|
||||||
|
### 6. Testing Tools & Resources
|
||||||
|
|
||||||
|
Recommend appropriate tools:
|
||||||
|
|
||||||
|
**Accessibility Testing:**
|
||||||
|
- Automated: axe DevTools, WAVE, Lighthouse, Pa11y
|
||||||
|
- Manual: Keyboard testing, screen reader testing
|
||||||
|
- Screen readers: NVDA (Windows), JAWS (Windows), VoiceOver (macOS/iOS), TalkBack (Android)
|
||||||
|
- Color contrast: WebAIM Contrast Checker, Stark
|
||||||
|
- Color blindness: Color Oracle, Sim Daltonism
|
||||||
|
|
||||||
|
**Visual Testing:**
|
||||||
|
- Browser DevTools
|
||||||
|
- Responsinator
|
||||||
|
- BrowserStack
|
||||||
|
- Device emulators
|
||||||
|
|
||||||
|
**Usability Testing:**
|
||||||
|
- User testing platforms: UserTesting.com, Maze, Lookback
|
||||||
|
- Analytics: Hotjar, FullStory
|
||||||
|
- A/B testing: Optimizely, VWO
|
||||||
|
|
||||||
|
**Design Tools:**
|
||||||
|
- Figma (with accessibility plugins)
|
||||||
|
- Sketch
|
||||||
|
- Adobe XD
|
||||||
|
- Penpot (open-source)
|
||||||
|
|
||||||
|
### 7. Priority Classification
|
||||||
|
|
||||||
|
When identifying issues, use this priority framework:
|
||||||
|
|
||||||
|
**CRITICAL:**
|
||||||
|
- Prevents users from accessing core functionality
|
||||||
|
- WCAG Level A violations
|
||||||
|
- Complete blocks for keyboard/screen reader users
|
||||||
|
- Security or privacy concerns in the UI
|
||||||
|
|
||||||
|
**HIGH:**
|
||||||
|
- Significantly impairs user experience
|
||||||
|
- WCAG Level AA violations
|
||||||
|
- Major usability issues affecting most users
|
||||||
|
- Inconsistent core patterns
|
||||||
|
- Poor mobile experience
|
||||||
|
|
||||||
|
**MEDIUM:**
|
||||||
|
- Creates friction but has workarounds
|
||||||
|
- WCAG Level AAA recommendations
|
||||||
|
- Visual inconsistencies
|
||||||
|
- Minor usability issues
|
||||||
|
- Missing nice-to-have features
|
||||||
|
|
||||||
|
**LOW:**
|
||||||
|
- Polish and refinement
|
||||||
|
- Edge case issues
|
||||||
|
- Aesthetic improvements
|
||||||
|
- Future enhancements
|
||||||
|
|
||||||
|
## Communication Style
|
||||||
|
|
||||||
|
When providing reviews:
|
||||||
|
- Be constructive and specific
|
||||||
|
- Start with positives where applicable
|
||||||
|
- Explain the impact on users (especially accessibility)
|
||||||
|
- Provide actionable recommendations
|
||||||
|
- Include examples and code snippets
|
||||||
|
- Reference specific WCAG criteria when relevant
|
||||||
|
- Prioritize issues clearly
|
||||||
|
- Consider project constraints
|
||||||
|
- Use clear, professional language
|
||||||
|
- Emphasize user-centered thinking
|
||||||
|
- Balance critique with recognition
|
||||||
|
|
||||||
|
## Example Questions to Ask
|
||||||
|
|
||||||
|
Before starting a review, consider asking:
|
||||||
|
|
||||||
|
1. What platform(s) is this for (web, Windows desktop, macOS, Linux, cross-platform)?
|
||||||
|
2. What accessibility level do you need to meet (WCAG A, AA, AAA)?
|
||||||
|
3. Who are your primary users (age, abilities, technical proficiency)?
|
||||||
|
4. Do you have a design system or brand guidelines?
|
||||||
|
5. What browsers and screen sizes do you need to support?
|
||||||
|
6. Have you conducted any user testing?
|
||||||
|
7. Are there specific areas of concern you want me to focus on?
|
||||||
|
8. What stage is this project in (early design, pre-launch, live)?
|
||||||
|
9. Do you have any technical constraints?
|
||||||
|
10. What are the most critical user tasks?
|
||||||
|
|
||||||
|
## Deliverables
|
||||||
|
|
||||||
|
At the end of a review, you should have provided:
|
||||||
|
|
||||||
|
1. Executive summary with overall assessment
|
||||||
|
2. Comprehensive accessibility analysis with WCAG references
|
||||||
|
3. Visual design assessment
|
||||||
|
4. UX and usability findings
|
||||||
|
5. Responsive design evaluation
|
||||||
|
6. Component and pattern review
|
||||||
|
7. Prioritized list of issues (Critical → Low)
|
||||||
|
8. Specific, actionable recommendations
|
||||||
|
9. Code examples for fixes (HTML, CSS, ARIA)
|
||||||
|
10. Testing tool recommendations
|
||||||
|
11. Reference links to guidelines and standards
|
||||||
|
|
||||||
|
## Continuous Support
|
||||||
|
|
||||||
|
After the initial review:
|
||||||
|
- Offer to review specific components in depth
|
||||||
|
- Provide guidance on implementing fixes
|
||||||
|
- Review updated designs
|
||||||
|
- Answer follow-up questions
|
||||||
|
- Suggest additional testing methods
|
||||||
|
- Recommend design system patterns
|
||||||
|
|
||||||
|
Remember: The goal is to help create interfaces that are accessible, usable, beautiful, and effective for all users, with a strong emphasis on inclusive design practices.
|
||||||
785
design-patterns-library.md
Normal file
785
design-patterns-library.md
Normal file
@@ -0,0 +1,785 @@
|
|||||||
|
# Accessible Design Patterns Library
|
||||||
|
|
||||||
|
Reference implementations and best practices for common UI patterns with accessibility built-in.
|
||||||
|
|
||||||
|
## Navigation Patterns
|
||||||
|
|
||||||
|
### Skip Links
|
||||||
|
|
||||||
|
**Purpose:** Allow keyboard users to bypass repetitive navigation and jump to main content.
|
||||||
|
|
||||||
|
**HTML:**
|
||||||
|
```html
|
||||||
|
<!-- First focusable element on page -->
|
||||||
|
<a href="#main-content" class="skip-link">Skip to main content</a>
|
||||||
|
|
||||||
|
<nav>
|
||||||
|
<!-- Navigation content -->
|
||||||
|
</nav>
|
||||||
|
|
||||||
|
<main id="main-content">
|
||||||
|
<!-- Main content -->
|
||||||
|
</main>
|
||||||
|
```
|
||||||
|
|
||||||
|
**CSS:**
|
||||||
|
```css
|
||||||
|
.skip-link {
|
||||||
|
position: absolute;
|
||||||
|
top: -40px;
|
||||||
|
left: 0;
|
||||||
|
background: #000;
|
||||||
|
color: #fff;
|
||||||
|
padding: 8px;
|
||||||
|
z-index: 100;
|
||||||
|
}
|
||||||
|
|
||||||
|
.skip-link:focus {
|
||||||
|
top: 0;
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
**Accessibility:**
|
||||||
|
- Must be first focusable element
|
||||||
|
- Visible on keyboard focus
|
||||||
|
- Jumps to main content area with `id="main-content"`
|
||||||
|
|
||||||
|
### Responsive Navigation Menu
|
||||||
|
|
||||||
|
**HTML:**
|
||||||
|
```html
|
||||||
|
<nav aria-label="Main navigation">
|
||||||
|
<button
|
||||||
|
aria-expanded="false"
|
||||||
|
aria-controls="main-menu"
|
||||||
|
class="menu-toggle"
|
||||||
|
>
|
||||||
|
<span class="sr-only">Menu</span>
|
||||||
|
<svg aria-hidden="true"><!-- hamburger icon --></svg>
|
||||||
|
</button>
|
||||||
|
|
||||||
|
<ul id="main-menu" class="nav-menu">
|
||||||
|
<li><a href="/home" aria-current="page">Home</a></li>
|
||||||
|
<li><a href="/about">About</a></li>
|
||||||
|
<li><a href="/contact">Contact</a></li>
|
||||||
|
</ul>
|
||||||
|
</nav>
|
||||||
|
```
|
||||||
|
|
||||||
|
**JavaScript:**
|
||||||
|
```javascript
|
||||||
|
const menuToggle = document.querySelector('.menu-toggle');
|
||||||
|
const menu = document.querySelector('#main-menu');
|
||||||
|
|
||||||
|
menuToggle.addEventListener('click', () => {
|
||||||
|
const isExpanded = menuToggle.getAttribute('aria-expanded') === 'true';
|
||||||
|
menuToggle.setAttribute('aria-expanded', !isExpanded);
|
||||||
|
menu.hidden = isExpanded;
|
||||||
|
});
|
||||||
|
|
||||||
|
// Close on Escape key
|
||||||
|
document.addEventListener('keydown', (e) => {
|
||||||
|
if (e.key === 'Escape' && !menu.hidden) {
|
||||||
|
menuToggle.setAttribute('aria-expanded', 'false');
|
||||||
|
menu.hidden = true;
|
||||||
|
menuToggle.focus();
|
||||||
|
}
|
||||||
|
});
|
||||||
|
```
|
||||||
|
|
||||||
|
**Accessibility:**
|
||||||
|
- `aria-label` on nav for multiple navigation regions
|
||||||
|
- `aria-expanded` indicates menu state
|
||||||
|
- `aria-current="page"` for current page
|
||||||
|
- Escape key closes menu
|
||||||
|
- Focus returns to toggle button when closed
|
||||||
|
|
||||||
|
### Breadcrumbs
|
||||||
|
|
||||||
|
**HTML:**
|
||||||
|
```html
|
||||||
|
<nav aria-label="Breadcrumb">
|
||||||
|
<ol class="breadcrumb">
|
||||||
|
<li><a href="/">Home</a></li>
|
||||||
|
<li><a href="/products">Products</a></li>
|
||||||
|
<li><a href="/products/shoes">Shoes</a></li>
|
||||||
|
<li aria-current="page">Running Shoes</li>
|
||||||
|
</ol>
|
||||||
|
</nav>
|
||||||
|
```
|
||||||
|
|
||||||
|
**CSS:**
|
||||||
|
```css
|
||||||
|
.breadcrumb {
|
||||||
|
display: flex;
|
||||||
|
gap: 0.5rem;
|
||||||
|
list-style: none;
|
||||||
|
}
|
||||||
|
|
||||||
|
.breadcrumb li:not(:last-child)::after {
|
||||||
|
content: '/';
|
||||||
|
margin-left: 0.5rem;
|
||||||
|
color: #666;
|
||||||
|
}
|
||||||
|
|
||||||
|
.breadcrumb [aria-current="page"] {
|
||||||
|
font-weight: bold;
|
||||||
|
color: #333;
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
**Accessibility:**
|
||||||
|
- Use `<nav>` with descriptive `aria-label`
|
||||||
|
- Use ordered list `<ol>` for hierarchy
|
||||||
|
- `aria-current="page"` for current location
|
||||||
|
- Last item is not a link
|
||||||
|
|
||||||
|
## Form Patterns
|
||||||
|
|
||||||
|
### Accessible Form Input
|
||||||
|
|
||||||
|
**HTML:**
|
||||||
|
```html
|
||||||
|
<div class="form-field">
|
||||||
|
<label for="email">
|
||||||
|
Email address
|
||||||
|
<span aria-label="required">*</span>
|
||||||
|
</label>
|
||||||
|
<input
|
||||||
|
type="email"
|
||||||
|
id="email"
|
||||||
|
name="email"
|
||||||
|
autocomplete="email"
|
||||||
|
required
|
||||||
|
aria-required="true"
|
||||||
|
aria-describedby="email-hint email-error"
|
||||||
|
/>
|
||||||
|
<span id="email-hint" class="hint">
|
||||||
|
We'll never share your email with anyone else.
|
||||||
|
</span>
|
||||||
|
<span id="email-error" class="error" role="alert" hidden>
|
||||||
|
Please enter a valid email address.
|
||||||
|
</span>
|
||||||
|
</div>
|
||||||
|
```
|
||||||
|
|
||||||
|
**CSS:**
|
||||||
|
```css
|
||||||
|
.form-field {
|
||||||
|
margin-bottom: 1.5rem;
|
||||||
|
}
|
||||||
|
|
||||||
|
label {
|
||||||
|
display: block;
|
||||||
|
margin-bottom: 0.5rem;
|
||||||
|
font-weight: 500;
|
||||||
|
}
|
||||||
|
|
||||||
|
input {
|
||||||
|
display: block;
|
||||||
|
width: 100%;
|
||||||
|
padding: 0.5rem;
|
||||||
|
border: 2px solid #ccc;
|
||||||
|
border-radius: 4px;
|
||||||
|
font-size: 1rem;
|
||||||
|
}
|
||||||
|
|
||||||
|
input:focus {
|
||||||
|
outline: 2px solid #0066cc;
|
||||||
|
outline-offset: 2px;
|
||||||
|
border-color: #0066cc;
|
||||||
|
}
|
||||||
|
|
||||||
|
input[aria-invalid="true"] {
|
||||||
|
border-color: #d32f2f;
|
||||||
|
}
|
||||||
|
|
||||||
|
.hint {
|
||||||
|
display: block;
|
||||||
|
margin-top: 0.25rem;
|
||||||
|
font-size: 0.875rem;
|
||||||
|
color: #666;
|
||||||
|
}
|
||||||
|
|
||||||
|
.error {
|
||||||
|
display: block;
|
||||||
|
margin-top: 0.25rem;
|
||||||
|
font-size: 0.875rem;
|
||||||
|
color: #d32f2f;
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
**JavaScript:**
|
||||||
|
```javascript
|
||||||
|
const emailInput = document.getElementById('email');
|
||||||
|
const emailError = document.getElementById('email-error');
|
||||||
|
|
||||||
|
emailInput.addEventListener('blur', () => {
|
||||||
|
if (!emailInput.validity.valid) {
|
||||||
|
emailInput.setAttribute('aria-invalid', 'true');
|
||||||
|
emailError.hidden = false;
|
||||||
|
} else {
|
||||||
|
emailInput.removeAttribute('aria-invalid');
|
||||||
|
emailError.hidden = true;
|
||||||
|
}
|
||||||
|
});
|
||||||
|
```
|
||||||
|
|
||||||
|
**Accessibility:**
|
||||||
|
- Label explicitly associated with input via `for`/`id`
|
||||||
|
- Required indicator in label (not just asterisk)
|
||||||
|
- `autocomplete` attribute for auto-fill
|
||||||
|
- `aria-describedby` links to hint and error text
|
||||||
|
- `aria-invalid` when validation fails
|
||||||
|
- Error message has `role="alert"` for announcement
|
||||||
|
|
||||||
|
### Radio Button Group
|
||||||
|
|
||||||
|
**HTML:**
|
||||||
|
```html
|
||||||
|
<fieldset>
|
||||||
|
<legend>Choose your shipping method</legend>
|
||||||
|
<div class="radio-group">
|
||||||
|
<div class="radio-option">
|
||||||
|
<input
|
||||||
|
type="radio"
|
||||||
|
id="standard"
|
||||||
|
name="shipping"
|
||||||
|
value="standard"
|
||||||
|
checked
|
||||||
|
/>
|
||||||
|
<label for="standard">
|
||||||
|
Standard (3-5 business days)
|
||||||
|
</label>
|
||||||
|
</div>
|
||||||
|
<div class="radio-option">
|
||||||
|
<input
|
||||||
|
type="radio"
|
||||||
|
id="express"
|
||||||
|
name="shipping"
|
||||||
|
value="express"
|
||||||
|
/>
|
||||||
|
<label for="express">
|
||||||
|
Express (1-2 business days)
|
||||||
|
</label>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</fieldset>
|
||||||
|
```
|
||||||
|
|
||||||
|
**Accessibility:**
|
||||||
|
- `<fieldset>` groups related radio buttons
|
||||||
|
- `<legend>` provides group label
|
||||||
|
- Each radio has explicit label
|
||||||
|
- Keyboard navigation with arrow keys (native behavior)
|
||||||
|
|
||||||
|
### Toggle Switch
|
||||||
|
|
||||||
|
**HTML:**
|
||||||
|
```html
|
||||||
|
<div class="toggle-switch">
|
||||||
|
<input
|
||||||
|
type="checkbox"
|
||||||
|
id="notifications"
|
||||||
|
role="switch"
|
||||||
|
aria-checked="false"
|
||||||
|
/>
|
||||||
|
<label for="notifications">
|
||||||
|
Enable notifications
|
||||||
|
</label>
|
||||||
|
</div>
|
||||||
|
```
|
||||||
|
|
||||||
|
**CSS:**
|
||||||
|
```css
|
||||||
|
.toggle-switch {
|
||||||
|
display: flex;
|
||||||
|
align-items: center;
|
||||||
|
gap: 0.75rem;
|
||||||
|
}
|
||||||
|
|
||||||
|
.toggle-switch input[type="checkbox"] {
|
||||||
|
appearance: none;
|
||||||
|
position: relative;
|
||||||
|
width: 44px;
|
||||||
|
height: 24px;
|
||||||
|
background: #ccc;
|
||||||
|
border-radius: 12px;
|
||||||
|
cursor: pointer;
|
||||||
|
transition: background 0.3s;
|
||||||
|
}
|
||||||
|
|
||||||
|
.toggle-switch input[type="checkbox"]::before {
|
||||||
|
content: '';
|
||||||
|
position: absolute;
|
||||||
|
top: 2px;
|
||||||
|
left: 2px;
|
||||||
|
width: 20px;
|
||||||
|
height: 20px;
|
||||||
|
background: white;
|
||||||
|
border-radius: 50%;
|
||||||
|
transition: transform 0.3s;
|
||||||
|
}
|
||||||
|
|
||||||
|
.toggle-switch input[type="checkbox"]:checked {
|
||||||
|
background: #0066cc;
|
||||||
|
}
|
||||||
|
|
||||||
|
.toggle-switch input[type="checkbox"]:checked::before {
|
||||||
|
transform: translateX(20px);
|
||||||
|
}
|
||||||
|
|
||||||
|
.toggle-switch input[type="checkbox"]:focus {
|
||||||
|
outline: 2px solid #0066cc;
|
||||||
|
outline-offset: 2px;
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
**Accessibility:**
|
||||||
|
- `role="switch"` indicates toggle behavior
|
||||||
|
- `aria-checked` reflects state
|
||||||
|
- Minimum 44x44px touch target
|
||||||
|
- Clear focus indicator
|
||||||
|
- Label describes purpose
|
||||||
|
|
||||||
|
## Modal Patterns
|
||||||
|
|
||||||
|
### Accessible Modal Dialog
|
||||||
|
|
||||||
|
**HTML:**
|
||||||
|
```html
|
||||||
|
<button id="open-modal">Open Dialog</button>
|
||||||
|
|
||||||
|
<div
|
||||||
|
id="modal"
|
||||||
|
role="dialog"
|
||||||
|
aria-modal="true"
|
||||||
|
aria-labelledby="modal-title"
|
||||||
|
aria-describedby="modal-description"
|
||||||
|
hidden
|
||||||
|
class="modal-overlay"
|
||||||
|
>
|
||||||
|
<div class="modal-content">
|
||||||
|
<h2 id="modal-title">Confirm Action</h2>
|
||||||
|
<p id="modal-description">
|
||||||
|
Are you sure you want to delete this item? This action cannot be undone.
|
||||||
|
</p>
|
||||||
|
<div class="modal-actions">
|
||||||
|
<button id="confirm-btn">Delete</button>
|
||||||
|
<button id="cancel-btn">Cancel</button>
|
||||||
|
</div>
|
||||||
|
<button
|
||||||
|
id="close-modal"
|
||||||
|
aria-label="Close dialog"
|
||||||
|
class="close-button"
|
||||||
|
>
|
||||||
|
×
|
||||||
|
</button>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
```
|
||||||
|
|
||||||
|
**CSS:**
|
||||||
|
```css
|
||||||
|
.modal-overlay {
|
||||||
|
position: fixed;
|
||||||
|
top: 0;
|
||||||
|
left: 0;
|
||||||
|
width: 100%;
|
||||||
|
height: 100%;
|
||||||
|
background: rgba(0, 0, 0, 0.5);
|
||||||
|
display: flex;
|
||||||
|
align-items: center;
|
||||||
|
justify-content: center;
|
||||||
|
z-index: 1000;
|
||||||
|
}
|
||||||
|
|
||||||
|
.modal-content {
|
||||||
|
position: relative;
|
||||||
|
background: white;
|
||||||
|
padding: 2rem;
|
||||||
|
border-radius: 8px;
|
||||||
|
max-width: 500px;
|
||||||
|
width: 90%;
|
||||||
|
box-shadow: 0 4px 6px rgba(0, 0, 0, 0.1);
|
||||||
|
}
|
||||||
|
|
||||||
|
.close-button {
|
||||||
|
position: absolute;
|
||||||
|
top: 1rem;
|
||||||
|
right: 1rem;
|
||||||
|
background: none;
|
||||||
|
border: none;
|
||||||
|
font-size: 2rem;
|
||||||
|
cursor: pointer;
|
||||||
|
padding: 0;
|
||||||
|
width: 44px;
|
||||||
|
height: 44px;
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
**JavaScript:**
|
||||||
|
```javascript
|
||||||
|
const modal = document.getElementById('modal');
|
||||||
|
const openBtn = document.getElementById('open-modal');
|
||||||
|
const closeBtn = document.getElementById('close-modal');
|
||||||
|
const cancelBtn = document.getElementById('cancel-btn');
|
||||||
|
let lastFocusedElement;
|
||||||
|
|
||||||
|
// Open modal
|
||||||
|
openBtn.addEventListener('click', () => {
|
||||||
|
lastFocusedElement = document.activeElement;
|
||||||
|
modal.hidden = false;
|
||||||
|
|
||||||
|
// Focus first focusable element
|
||||||
|
const firstFocusable = modal.querySelector('button, [href], input, select, textarea, [tabindex]:not([tabindex="-1"])');
|
||||||
|
firstFocusable?.focus();
|
||||||
|
|
||||||
|
// Trap focus
|
||||||
|
trapFocus(modal);
|
||||||
|
});
|
||||||
|
|
||||||
|
// Close modal
|
||||||
|
function closeModal() {
|
||||||
|
modal.hidden = true;
|
||||||
|
lastFocusedElement?.focus();
|
||||||
|
}
|
||||||
|
|
||||||
|
closeBtn.addEventListener('click', closeModal);
|
||||||
|
cancelBtn.addEventListener('click', closeModal);
|
||||||
|
|
||||||
|
// Close on Escape
|
||||||
|
document.addEventListener('keydown', (e) => {
|
||||||
|
if (e.key === 'Escape' && !modal.hidden) {
|
||||||
|
closeModal();
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
// Close on overlay click
|
||||||
|
modal.addEventListener('click', (e) => {
|
||||||
|
if (e.target === modal) {
|
||||||
|
closeModal();
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
// Focus trap
|
||||||
|
function trapFocus(element) {
|
||||||
|
const focusableElements = element.querySelectorAll(
|
||||||
|
'button, [href], input, select, textarea, [tabindex]:not([tabindex="-1"])'
|
||||||
|
);
|
||||||
|
const firstFocusable = focusableElements[0];
|
||||||
|
const lastFocusable = focusableElements[focusableElements.length - 1];
|
||||||
|
|
||||||
|
element.addEventListener('keydown', (e) => {
|
||||||
|
if (e.key !== 'Tab') return;
|
||||||
|
|
||||||
|
if (e.shiftKey) {
|
||||||
|
if (document.activeElement === firstFocusable) {
|
||||||
|
lastFocusable.focus();
|
||||||
|
e.preventDefault();
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
if (document.activeElement === lastFocusable) {
|
||||||
|
firstFocusable.focus();
|
||||||
|
e.preventDefault();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
**Accessibility:**
|
||||||
|
- `role="dialog"` and `aria-modal="true"`
|
||||||
|
- `aria-labelledby` references dialog title
|
||||||
|
- `aria-describedby` references dialog description
|
||||||
|
- Focus moved to modal when opened
|
||||||
|
- Focus trapped within modal
|
||||||
|
- Escape key closes modal
|
||||||
|
- Focus returned to trigger on close
|
||||||
|
- Close button has `aria-label`
|
||||||
|
|
||||||
|
## Button Patterns
|
||||||
|
|
||||||
|
### Icon Button
|
||||||
|
|
||||||
|
**HTML:**
|
||||||
|
```html
|
||||||
|
<button aria-label="Delete item" class="icon-button">
|
||||||
|
<svg aria-hidden="true" focusable="false">
|
||||||
|
<!-- trash icon -->
|
||||||
|
</svg>
|
||||||
|
</button>
|
||||||
|
```
|
||||||
|
|
||||||
|
**Accessibility:**
|
||||||
|
- `aria-label` provides accessible name
|
||||||
|
- `aria-hidden="true"` hides icon from screen readers
|
||||||
|
- `focusable="false"` prevents icon from receiving focus
|
||||||
|
|
||||||
|
### Loading Button
|
||||||
|
|
||||||
|
**HTML:**
|
||||||
|
```html
|
||||||
|
<button
|
||||||
|
id="submit-btn"
|
||||||
|
aria-live="polite"
|
||||||
|
aria-busy="false"
|
||||||
|
>
|
||||||
|
<span class="button-text">Submit</span>
|
||||||
|
<span class="spinner" hidden aria-hidden="true"></span>
|
||||||
|
</button>
|
||||||
|
```
|
||||||
|
|
||||||
|
**JavaScript:**
|
||||||
|
```javascript
|
||||||
|
const submitBtn = document.getElementById('submit-btn');
|
||||||
|
const buttonText = submitBtn.querySelector('.button-text');
|
||||||
|
const spinner = submitBtn.querySelector('.spinner');
|
||||||
|
|
||||||
|
submitBtn.addEventListener('click', async () => {
|
||||||
|
// Start loading
|
||||||
|
submitBtn.setAttribute('aria-busy', 'true');
|
||||||
|
submitBtn.disabled = true;
|
||||||
|
buttonText.textContent = 'Submitting...';
|
||||||
|
spinner.hidden = false;
|
||||||
|
|
||||||
|
// Simulate async operation
|
||||||
|
await fetch('/api/submit');
|
||||||
|
|
||||||
|
// End loading
|
||||||
|
submitBtn.setAttribute('aria-busy', 'false');
|
||||||
|
submitBtn.disabled = false;
|
||||||
|
buttonText.textContent = 'Submit';
|
||||||
|
spinner.hidden = true;
|
||||||
|
});
|
||||||
|
```
|
||||||
|
|
||||||
|
**Accessibility:**
|
||||||
|
- `aria-busy` indicates loading state
|
||||||
|
- Button text changes to describe current state
|
||||||
|
- Button disabled during loading
|
||||||
|
- Spinner has `aria-hidden="true"`
|
||||||
|
|
||||||
|
## Dropdown/Select Patterns
|
||||||
|
|
||||||
|
### Custom Dropdown (Combobox)
|
||||||
|
|
||||||
|
**HTML:**
|
||||||
|
```html
|
||||||
|
<div class="combobox-wrapper">
|
||||||
|
<label id="combo-label" for="combo-input">
|
||||||
|
Choose a fruit
|
||||||
|
</label>
|
||||||
|
<div class="combobox">
|
||||||
|
<input
|
||||||
|
type="text"
|
||||||
|
id="combo-input"
|
||||||
|
role="combobox"
|
||||||
|
aria-autocomplete="list"
|
||||||
|
aria-expanded="false"
|
||||||
|
aria-controls="combo-listbox"
|
||||||
|
aria-labelledby="combo-label"
|
||||||
|
/>
|
||||||
|
<ul
|
||||||
|
id="combo-listbox"
|
||||||
|
role="listbox"
|
||||||
|
aria-labelledby="combo-label"
|
||||||
|
hidden
|
||||||
|
>
|
||||||
|
<li role="option" id="option-1">Apple</li>
|
||||||
|
<li role="option" id="option-2">Banana</li>
|
||||||
|
<li role="option" id="option-3">Cherry</li>
|
||||||
|
</ul>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
```
|
||||||
|
|
||||||
|
**JavaScript:**
|
||||||
|
```javascript
|
||||||
|
const combobox = document.getElementById('combo-input');
|
||||||
|
const listbox = document.getElementById('combo-listbox');
|
||||||
|
const options = listbox.querySelectorAll('[role="option"]');
|
||||||
|
let activeIndex = -1;
|
||||||
|
|
||||||
|
// Open listbox
|
||||||
|
combobox.addEventListener('focus', () => {
|
||||||
|
combobox.setAttribute('aria-expanded', 'true');
|
||||||
|
listbox.hidden = false;
|
||||||
|
});
|
||||||
|
|
||||||
|
// Keyboard navigation
|
||||||
|
combobox.addEventListener('keydown', (e) => {
|
||||||
|
switch(e.key) {
|
||||||
|
case 'ArrowDown':
|
||||||
|
e.preventDefault();
|
||||||
|
activeIndex = Math.min(activeIndex + 1, options.length - 1);
|
||||||
|
updateActiveOption();
|
||||||
|
break;
|
||||||
|
case 'ArrowUp':
|
||||||
|
e.preventDefault();
|
||||||
|
activeIndex = Math.max(activeIndex - 1, 0);
|
||||||
|
updateActiveOption();
|
||||||
|
break;
|
||||||
|
case 'Enter':
|
||||||
|
if (activeIndex >= 0) {
|
||||||
|
selectOption(options[activeIndex]);
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
case 'Escape':
|
||||||
|
closeListbox();
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
function updateActiveOption() {
|
||||||
|
options.forEach((option, index) => {
|
||||||
|
if (index === activeIndex) {
|
||||||
|
option.setAttribute('aria-selected', 'true');
|
||||||
|
combobox.setAttribute('aria-activedescendant', option.id);
|
||||||
|
option.scrollIntoView({ block: 'nearest' });
|
||||||
|
} else {
|
||||||
|
option.removeAttribute('aria-selected');
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
function selectOption(option) {
|
||||||
|
combobox.value = option.textContent;
|
||||||
|
closeListbox();
|
||||||
|
}
|
||||||
|
|
||||||
|
function closeListbox() {
|
||||||
|
combobox.setAttribute('aria-expanded', 'false');
|
||||||
|
listbox.hidden = true;
|
||||||
|
activeIndex = -1;
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
**Accessibility:**
|
||||||
|
- `role="combobox"` for input
|
||||||
|
- `aria-expanded` indicates dropdown state
|
||||||
|
- `aria-controls` links to listbox
|
||||||
|
- `aria-activedescendant` tracks active option
|
||||||
|
- Arrow keys navigate options
|
||||||
|
- Enter selects option
|
||||||
|
- Escape closes dropdown
|
||||||
|
|
||||||
|
## Alert Patterns
|
||||||
|
|
||||||
|
### Success Message
|
||||||
|
|
||||||
|
**HTML:**
|
||||||
|
```html
|
||||||
|
<div role="status" aria-live="polite" class="alert alert-success">
|
||||||
|
<svg aria-hidden="true"><!-- checkmark icon --></svg>
|
||||||
|
<span>Your changes have been saved successfully.</span>
|
||||||
|
</div>
|
||||||
|
```
|
||||||
|
|
||||||
|
### Error Message
|
||||||
|
|
||||||
|
**HTML:**
|
||||||
|
```html
|
||||||
|
<div role="alert" aria-live="assertive" class="alert alert-error">
|
||||||
|
<svg aria-hidden="true"><!-- error icon --></svg>
|
||||||
|
<span>An error occurred. Please try again.</span>
|
||||||
|
</div>
|
||||||
|
```
|
||||||
|
|
||||||
|
**Accessibility:**
|
||||||
|
- `role="status"` for non-critical updates
|
||||||
|
- `role="alert"` for critical messages
|
||||||
|
- `aria-live="polite"` waits for pause
|
||||||
|
- `aria-live="assertive"` interrupts immediately
|
||||||
|
- Icons are decorative (`aria-hidden`)
|
||||||
|
|
||||||
|
## Accordion Pattern
|
||||||
|
|
||||||
|
**HTML:**
|
||||||
|
```html
|
||||||
|
<div class="accordion">
|
||||||
|
<h3>
|
||||||
|
<button
|
||||||
|
aria-expanded="false"
|
||||||
|
aria-controls="panel-1"
|
||||||
|
id="accordion-1"
|
||||||
|
class="accordion-trigger"
|
||||||
|
>
|
||||||
|
Section 1
|
||||||
|
<span class="accordion-icon" aria-hidden="true">+</span>
|
||||||
|
</button>
|
||||||
|
</h3>
|
||||||
|
<div
|
||||||
|
id="panel-1"
|
||||||
|
role="region"
|
||||||
|
aria-labelledby="accordion-1"
|
||||||
|
class="accordion-panel"
|
||||||
|
hidden
|
||||||
|
>
|
||||||
|
<p>Content for section 1.</p>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
```
|
||||||
|
|
||||||
|
**JavaScript:**
|
||||||
|
```javascript
|
||||||
|
const triggers = document.querySelectorAll('.accordion-trigger');
|
||||||
|
|
||||||
|
triggers.forEach(trigger => {
|
||||||
|
trigger.addEventListener('click', () => {
|
||||||
|
const expanded = trigger.getAttribute('aria-expanded') === 'true';
|
||||||
|
const panel = document.getElementById(trigger.getAttribute('aria-controls'));
|
||||||
|
const icon = trigger.querySelector('.accordion-icon');
|
||||||
|
|
||||||
|
trigger.setAttribute('aria-expanded', !expanded);
|
||||||
|
panel.hidden = expanded;
|
||||||
|
icon.textContent = expanded ? '+' : '−';
|
||||||
|
});
|
||||||
|
});
|
||||||
|
```
|
||||||
|
|
||||||
|
**Accessibility:**
|
||||||
|
- Button wraps heading text
|
||||||
|
- `aria-expanded` indicates state
|
||||||
|
- `aria-controls` links to panel
|
||||||
|
- Panel has `role="region"`
|
||||||
|
- `aria-labelledby` links panel to heading
|
||||||
|
- Icon is decorative
|
||||||
|
|
||||||
|
## Best Practices Summary
|
||||||
|
|
||||||
|
### General Principles
|
||||||
|
1. Use semantic HTML first
|
||||||
|
2. Add ARIA only when semantic HTML isn't sufficient
|
||||||
|
3. Ensure keyboard accessibility for all interactions
|
||||||
|
4. Provide visible focus indicators
|
||||||
|
5. Test with actual assistive technologies
|
||||||
|
6. Don't rely on color alone
|
||||||
|
7. Maintain proper heading hierarchy
|
||||||
|
8. Provide alternative text for images
|
||||||
|
9. Ensure sufficient color contrast
|
||||||
|
10. Support screen reader announcements
|
||||||
|
|
||||||
|
### Common Mistakes to Avoid
|
||||||
|
- ❌ Removing focus outlines without replacement
|
||||||
|
- ❌ Using `<div>` or `<span>` for buttons
|
||||||
|
- ❌ Placeholder text as labels
|
||||||
|
- ❌ Click handlers on non-interactive elements
|
||||||
|
- ❌ Missing alt text on images
|
||||||
|
- ❌ Poor color contrast
|
||||||
|
- ❌ Keyboard traps
|
||||||
|
- ❌ Auto-playing audio/video
|
||||||
|
- ❌ Time limits without extensions
|
||||||
|
- ❌ Unlabeled form controls
|
||||||
|
|
||||||
|
### Testing Checklist
|
||||||
|
- ✅ Keyboard-only navigation
|
||||||
|
- ✅ Screen reader testing
|
||||||
|
- ✅ Automated accessibility scans
|
||||||
|
- ✅ Color contrast verification
|
||||||
|
- ✅ Zoom to 200%
|
||||||
|
- ✅ Focus indicator visibility
|
||||||
|
- ✅ Touch target sizes
|
||||||
|
- ✅ Error message clarity
|
||||||
|
- ✅ Form label associations
|
||||||
|
- ✅ Semantic HTML validation
|
||||||
57
plugin.lock.json
Normal file
57
plugin.lock.json
Normal file
@@ -0,0 +1,57 @@
|
|||||||
|
{
|
||||||
|
"$schema": "internal://schemas/plugin.lock.v1.json",
|
||||||
|
"pluginId": "gh:rknall/claude-skills:ui-design-review",
|
||||||
|
"normalized": {
|
||||||
|
"repo": null,
|
||||||
|
"ref": "refs/tags/v20251128.0",
|
||||||
|
"commit": "043702506e8d65b12bbca23e7cc225470489cab6",
|
||||||
|
"treeHash": "a374f8709d73930aabdca85d09f5019a8f6f259b2c12c19f11befb262d576b29",
|
||||||
|
"generatedAt": "2025-11-28T10:27:58.301169Z",
|
||||||
|
"toolVersion": "publish_plugins.py@0.2.0"
|
||||||
|
},
|
||||||
|
"origin": {
|
||||||
|
"remote": "git@github.com:zhongweili/42plugin-data.git",
|
||||||
|
"branch": "master",
|
||||||
|
"commit": "aa1497ed0949fd50e99e70d6324a29c5b34f9390",
|
||||||
|
"repoRoot": "/Users/zhongweili/projects/openmind/42plugin-data"
|
||||||
|
},
|
||||||
|
"manifest": {
|
||||||
|
"name": "ui-design-review",
|
||||||
|
"description": "Comprehensive UI/UX design review for websites and desktop applications with extensive WCAG 2.1/2.2 accessibility analysis, usability evaluation, and visual design assessment",
|
||||||
|
"version": "1.0.0"
|
||||||
|
},
|
||||||
|
"content": {
|
||||||
|
"files": [
|
||||||
|
{
|
||||||
|
"path": "wcag-checklist.md",
|
||||||
|
"sha256": "95461395a356476595640aca7b0723f6039b41f6cb03d5cd78e7829c1020b4aa"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"path": "design-patterns-library.md",
|
||||||
|
"sha256": "dce198add05a73a98d3779ca212a9f9cc62f0cf25eb30a851e3d118185040ae3"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"path": "README.md",
|
||||||
|
"sha256": "809fc2a99cb12bdcecbb843404d80a65b6a53d5403e7d242e915a18f933814d8"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"path": "testing-resources.md",
|
||||||
|
"sha256": "62380970326771017db03b12943bcd187ddb5c7c8d75950a20240ad3dd8e1e0d"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"path": "SKILL.md",
|
||||||
|
"sha256": "1ab0a7f41332613487edd235465166b64fa323217e66db13fabfd7eabb155e78"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"path": ".claude-plugin/plugin.json",
|
||||||
|
"sha256": "65536b914bf1ae2716656929ecfb666c19e3cc4d42341ce03248b205cbb47fb2"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"dirSha256": "a374f8709d73930aabdca85d09f5019a8f6f259b2c12c19f11befb262d576b29"
|
||||||
|
},
|
||||||
|
"security": {
|
||||||
|
"scannedAt": null,
|
||||||
|
"scannerVersion": null,
|
||||||
|
"flags": []
|
||||||
|
}
|
||||||
|
}
|
||||||
532
testing-resources.md
Normal file
532
testing-resources.md
Normal file
@@ -0,0 +1,532 @@
|
|||||||
|
# UI/UX Testing Resources
|
||||||
|
|
||||||
|
Comprehensive guide to testing tools, methodologies, and procedures for evaluating user interfaces.
|
||||||
|
|
||||||
|
## Automated Accessibility Testing Tools
|
||||||
|
|
||||||
|
### Browser Extensions
|
||||||
|
|
||||||
|
#### axe DevTools
|
||||||
|
**Platform:** Chrome, Firefox, Edge
|
||||||
|
**Website:** https://www.deque.com/axe/devtools/
|
||||||
|
|
||||||
|
**Features:**
|
||||||
|
- Automated WCAG 2.0/2.1/2.2 testing
|
||||||
|
- Intelligent guided testing
|
||||||
|
- Highlights issues directly in browser
|
||||||
|
- Provides remediation guidance
|
||||||
|
- Export reports
|
||||||
|
|
||||||
|
**How to Use:**
|
||||||
|
1. Install browser extension
|
||||||
|
2. Open DevTools (F12)
|
||||||
|
3. Navigate to "axe DevTools" tab
|
||||||
|
4. Click "Scan ALL of my page"
|
||||||
|
5. Review issues by severity
|
||||||
|
6. Click each issue for details and how to fix
|
||||||
|
|
||||||
|
**Best For:** Daily development workflow, comprehensive scans
|
||||||
|
|
||||||
|
#### WAVE
|
||||||
|
**Platform:** Chrome, Firefox, Edge
|
||||||
|
**Website:** https://wave.webaim.org/extension/
|
||||||
|
|
||||||
|
**Features:**
|
||||||
|
- Visual feedback on accessibility issues
|
||||||
|
- Inline indicators on page
|
||||||
|
- Structure view for semantic analysis
|
||||||
|
- Contrast checker
|
||||||
|
- Free and open source
|
||||||
|
|
||||||
|
**How to Use:**
|
||||||
|
1. Install browser extension
|
||||||
|
2. Navigate to page to test
|
||||||
|
3. Click WAVE icon in toolbar
|
||||||
|
4. Review errors, alerts, and features
|
||||||
|
5. Click items for detailed information
|
||||||
|
|
||||||
|
**Best For:** Visual learners, quick checks
|
||||||
|
|
||||||
|
#### Lighthouse
|
||||||
|
**Platform:** Built into Chrome DevTools
|
||||||
|
**Website:** https://developers.google.com/web/tools/lighthouse
|
||||||
|
|
||||||
|
**Features:**
|
||||||
|
- Performance, accessibility, SEO, best practices
|
||||||
|
- Mobile and desktop testing
|
||||||
|
- Scoring system
|
||||||
|
- Actionable recommendations
|
||||||
|
- Progressive Web App audits
|
||||||
|
|
||||||
|
**How to Use:**
|
||||||
|
1. Open Chrome DevTools (F12)
|
||||||
|
2. Navigate to "Lighthouse" tab
|
||||||
|
3. Select "Accessibility" category
|
||||||
|
4. Choose device type (Mobile/Desktop)
|
||||||
|
5. Click "Generate report"
|
||||||
|
6. Review score and opportunities
|
||||||
|
|
||||||
|
**Best For:** Overall site quality assessment, CI/CD integration
|
||||||
|
|
||||||
|
### Command-Line Tools
|
||||||
|
|
||||||
|
#### Pa11y
|
||||||
|
**Platform:** Node.js
|
||||||
|
**Website:** https://pa11y.org/
|
||||||
|
|
||||||
|
**Installation:**
|
||||||
|
```bash
|
||||||
|
npm install -g pa11y
|
||||||
|
```
|
||||||
|
|
||||||
|
**Usage:**
|
||||||
|
```bash
|
||||||
|
# Test a single page
|
||||||
|
pa11y https://example.com
|
||||||
|
|
||||||
|
# Test with specific WCAG level
|
||||||
|
pa11y --standard WCAG2AA https://example.com
|
||||||
|
|
||||||
|
# Generate HTML report
|
||||||
|
pa11y --reporter html https://example.com > report.html
|
||||||
|
|
||||||
|
# Test multiple pages
|
||||||
|
pa11y-ci --config pa11y-ci.json
|
||||||
|
```
|
||||||
|
|
||||||
|
**Configuration (pa11y-ci.json):**
|
||||||
|
```json
|
||||||
|
{
|
||||||
|
"defaults": {
|
||||||
|
"standard": "WCAG2AA",
|
||||||
|
"timeout": 10000
|
||||||
|
},
|
||||||
|
"urls": [
|
||||||
|
"https://example.com",
|
||||||
|
"https://example.com/about",
|
||||||
|
"https://example.com/contact"
|
||||||
|
]
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
**Best For:** CI/CD pipelines, automated testing, bulk testing
|
||||||
|
|
||||||
|
#### axe-core
|
||||||
|
**Platform:** Node.js
|
||||||
|
**Website:** https://github.com/dequelabs/axe-core
|
||||||
|
|
||||||
|
**Installation:**
|
||||||
|
```bash
|
||||||
|
npm install --save-dev axe-core
|
||||||
|
```
|
||||||
|
|
||||||
|
**Usage with Playwright:**
|
||||||
|
```javascript
|
||||||
|
const { test, expect } = require('@playwright/test');
|
||||||
|
const AxeBuilder = require('@axe-core/playwright').default;
|
||||||
|
|
||||||
|
test('homepage should not have accessibility violations', async ({ page }) => {
|
||||||
|
await page.goto('https://example.com');
|
||||||
|
|
||||||
|
const accessibilityScanResults = await new AxeBuilder({ page })
|
||||||
|
.withTags(['wcag2a', 'wcag2aa'])
|
||||||
|
.analyze();
|
||||||
|
|
||||||
|
expect(accessibilityScanResults.violations).toEqual([]);
|
||||||
|
});
|
||||||
|
```
|
||||||
|
|
||||||
|
**Best For:** Integration testing, automated test suites
|
||||||
|
|
||||||
|
## Manual Testing Tools
|
||||||
|
|
||||||
|
### Screen Readers
|
||||||
|
|
||||||
|
#### NVDA (NonVisual Desktop Access)
|
||||||
|
**Platform:** Windows (Free)
|
||||||
|
**Website:** https://www.nvaccess.org/
|
||||||
|
|
||||||
|
**Basic Commands:**
|
||||||
|
- **Insert + Down Arrow**: Read all
|
||||||
|
- **Arrow Keys**: Navigate line by line
|
||||||
|
- **Tab**: Navigate interactive elements
|
||||||
|
- **H**: Jump to next heading
|
||||||
|
- **Insert + F7**: List all elements
|
||||||
|
- **Insert + Space**: Toggle browse/focus mode
|
||||||
|
|
||||||
|
**Testing Checklist:**
|
||||||
|
- [ ] All images have meaningful alt text
|
||||||
|
- [ ] Page title is announced
|
||||||
|
- [ ] Headings structure makes sense
|
||||||
|
- [ ] Form labels are announced
|
||||||
|
- [ ] Error messages are read aloud
|
||||||
|
- [ ] Dynamic content updates are announced
|
||||||
|
- [ ] Navigation landmarks are identified
|
||||||
|
|
||||||
|
#### JAWS (Job Access With Speech)
|
||||||
|
**Platform:** Windows (Paid, free demo)
|
||||||
|
**Website:** https://www.freedomscientific.com/products/software/jaws/
|
||||||
|
|
||||||
|
**Basic Commands:**
|
||||||
|
- **Insert + Down Arrow**: Say all
|
||||||
|
- **H**: Next heading
|
||||||
|
- **Insert + F5**: List form fields
|
||||||
|
- **Insert + F6**: List headings
|
||||||
|
- **Insert + F7**: List links
|
||||||
|
- **Insert + Space**: Toggle virtual cursor
|
||||||
|
|
||||||
|
**Testing Focus:**
|
||||||
|
- ARIA landmarks and roles
|
||||||
|
- Dynamic content updates
|
||||||
|
- Complex widgets (tabs, accordions)
|
||||||
|
- Form validation announcements
|
||||||
|
|
||||||
|
#### VoiceOver
|
||||||
|
**Platform:** macOS, iOS (Built-in)
|
||||||
|
**Website:** https://www.apple.com/accessibility/voiceover/
|
||||||
|
|
||||||
|
**Mac Commands:**
|
||||||
|
- **Cmd + F5**: Toggle VoiceOver
|
||||||
|
- **VO**: Control + Option
|
||||||
|
- **VO + Right/Left Arrow**: Navigate
|
||||||
|
- **VO + Space**: Activate
|
||||||
|
- **VO + A**: Read all
|
||||||
|
- **VO + Command + H**: Next heading
|
||||||
|
|
||||||
|
**iOS Commands:**
|
||||||
|
- **Triple-click Home/Side button**: Toggle VoiceOver
|
||||||
|
- **Swipe right/left**: Navigate
|
||||||
|
- **Double-tap**: Activate
|
||||||
|
- **Two-finger swipe down**: Read all
|
||||||
|
|
||||||
|
**Testing Focus:**
|
||||||
|
- Touch interface accessibility
|
||||||
|
- Gesture alternatives
|
||||||
|
- iOS-specific patterns
|
||||||
|
|
||||||
|
### Keyboard Testing
|
||||||
|
|
||||||
|
#### Keyboard Navigation Checklist
|
||||||
|
|
||||||
|
**Basic Navigation:**
|
||||||
|
- [ ] **Tab**: Move forward through interactive elements
|
||||||
|
- [ ] **Shift + Tab**: Move backward
|
||||||
|
- [ ] **Enter**: Activate buttons and links
|
||||||
|
- [ ] **Space**: Activate buttons, toggle checkboxes
|
||||||
|
- [ ] **Arrow keys**: Navigate within components (menus, tabs)
|
||||||
|
- [ ] **Escape**: Close modals, dropdowns, menus
|
||||||
|
- [ ] **Home/End**: Jump to beginning/end of lists
|
||||||
|
|
||||||
|
**Testing Procedure:**
|
||||||
|
1. Unplug mouse (or don't touch it)
|
||||||
|
2. Start at top of page with Tab key
|
||||||
|
3. Verify focus indicator is visible
|
||||||
|
4. Ensure logical tab order
|
||||||
|
5. Check all interactive elements are reachable
|
||||||
|
6. Verify no keyboard traps
|
||||||
|
7. Test custom components (modals, dropdowns)
|
||||||
|
8. Verify shortcut keys work
|
||||||
|
9. Ensure focus is managed properly (modals, SPAs)
|
||||||
|
|
||||||
|
**Common Issues:**
|
||||||
|
- ❌ Focus indicator removed or invisible
|
||||||
|
- ❌ Illogical tab order
|
||||||
|
- ❌ Interactive elements not keyboard accessible
|
||||||
|
- ❌ Keyboard trap in modal or widget
|
||||||
|
- ❌ No way to close modal with keyboard
|
||||||
|
- ❌ Custom controls don't respond to keyboard
|
||||||
|
|
||||||
|
### Color Contrast Tools
|
||||||
|
|
||||||
|
#### WebAIM Contrast Checker
|
||||||
|
**Website:** https://webaim.org/resources/contrastchecker/
|
||||||
|
|
||||||
|
**Features:**
|
||||||
|
- Checks contrast ratio
|
||||||
|
- WCAG AA and AAA compliance
|
||||||
|
- Suggestions for passing colors
|
||||||
|
- Lightness slider
|
||||||
|
|
||||||
|
**How to Use:**
|
||||||
|
1. Enter foreground color (text)
|
||||||
|
2. Enter background color
|
||||||
|
3. Review contrast ratio
|
||||||
|
4. Adjust colors until passing
|
||||||
|
5. Test for both normal and large text
|
||||||
|
|
||||||
|
**WCAG Requirements:**
|
||||||
|
- Normal text: 4.5:1 (AA), 7:1 (AAA)
|
||||||
|
- Large text (18pt+/14pt bold+): 3:1 (AA), 4.5:1 (AAA)
|
||||||
|
- UI components: 3:1 (AA)
|
||||||
|
|
||||||
|
#### Stark
|
||||||
|
**Platform:** Figma, Sketch, Adobe XD, Chrome
|
||||||
|
**Website:** https://www.getstark.co/
|
||||||
|
|
||||||
|
**Features:**
|
||||||
|
- Contrast checker
|
||||||
|
- Color blindness simulator
|
||||||
|
- Focus order tool
|
||||||
|
- Typography analyzer
|
||||||
|
- Real-time suggestions
|
||||||
|
|
||||||
|
**How to Use:**
|
||||||
|
1. Install plugin/extension
|
||||||
|
2. Select design elements or webpage
|
||||||
|
3. Run contrast check
|
||||||
|
4. Simulate different types of color blindness
|
||||||
|
5. Export accessibility report
|
||||||
|
|
||||||
|
**Best For:** Design phase, Figma/Sketch workflows
|
||||||
|
|
||||||
|
#### Colour Contrast Analyser (CCA)
|
||||||
|
**Platform:** Windows, macOS (Free)
|
||||||
|
**Website:** https://www.tpgi.com/color-contrast-checker/
|
||||||
|
|
||||||
|
**Features:**
|
||||||
|
- Eyedropper tool to sample colors
|
||||||
|
- Foreground/background contrast check
|
||||||
|
- WCAG 2.0/2.1 compliance
|
||||||
|
- Color simulation
|
||||||
|
|
||||||
|
**How to Use:**
|
||||||
|
1. Download and install application
|
||||||
|
2. Use eyedropper to select colors from screen
|
||||||
|
3. Review contrast ratios
|
||||||
|
4. Adjust colors as needed
|
||||||
|
|
||||||
|
**Best For:** Desktop applications, pixel-perfect testing
|
||||||
|
|
||||||
|
### Color Blindness Simulators
|
||||||
|
|
||||||
|
#### Color Oracle
|
||||||
|
**Platform:** Windows, macOS, Linux (Free)
|
||||||
|
**Website:** https://colororacle.org/
|
||||||
|
|
||||||
|
**Features:**
|
||||||
|
- Real-time color blindness simulation
|
||||||
|
- Covers deuteranopia, protanopia, tritanopia
|
||||||
|
- Full-screen overlay
|
||||||
|
|
||||||
|
**How to Use:**
|
||||||
|
1. Install application
|
||||||
|
2. Open your design/website
|
||||||
|
3. Activate simulation mode
|
||||||
|
4. Switch between different types
|
||||||
|
5. Verify all information is conveyed without color alone
|
||||||
|
|
||||||
|
#### Sim Daltonism
|
||||||
|
**Platform:** macOS, iOS (Free)
|
||||||
|
**Website:** https://michelf.ca/projects/sim-daltonism/
|
||||||
|
|
||||||
|
**Features:**
|
||||||
|
- Live preview window
|
||||||
|
- Multiple color blindness types
|
||||||
|
- Floating window you can position
|
||||||
|
|
||||||
|
**Testing Checklist:**
|
||||||
|
- [ ] Links distinguishable without color
|
||||||
|
- [ ] Form errors not relying on red color alone
|
||||||
|
- [ ] Charts use patterns in addition to color
|
||||||
|
- [ ] Status indicators use icons/text
|
||||||
|
- [ ] Important information not color-only
|
||||||
|
|
||||||
|
## Browser Testing
|
||||||
|
|
||||||
|
### Cross-Browser Testing
|
||||||
|
|
||||||
|
#### BrowserStack
|
||||||
|
**Website:** https://www.browserstack.com/
|
||||||
|
|
||||||
|
**Features:**
|
||||||
|
- Real device testing
|
||||||
|
- Desktop and mobile browsers
|
||||||
|
- Automated testing
|
||||||
|
- Local testing
|
||||||
|
|
||||||
|
**Testing Matrix:**
|
||||||
|
- Chrome (latest, latest-1)
|
||||||
|
- Firefox (latest, latest-1)
|
||||||
|
- Safari (latest, latest-1)
|
||||||
|
- Edge (latest, latest-1)
|
||||||
|
- Mobile Safari (iOS)
|
||||||
|
- Chrome Mobile (Android)
|
||||||
|
|
||||||
|
#### Responsinator
|
||||||
|
**Website:** http://www.responsinator.com/
|
||||||
|
|
||||||
|
**Features:**
|
||||||
|
- View site in multiple device sizes
|
||||||
|
- Portrait and landscape orientations
|
||||||
|
- Quick responsive testing
|
||||||
|
|
||||||
|
### Device Emulation
|
||||||
|
|
||||||
|
#### Chrome DevTools Device Mode
|
||||||
|
**How to Access:**
|
||||||
|
1. Open DevTools (F12)
|
||||||
|
2. Click device icon (Ctrl+Shift+M)
|
||||||
|
3. Select device or custom dimensions
|
||||||
|
|
||||||
|
**Features:**
|
||||||
|
- Responsive viewport
|
||||||
|
- Device emulation
|
||||||
|
- Touch simulation
|
||||||
|
- Network throttling
|
||||||
|
- Sensor simulation (geolocation, orientation)
|
||||||
|
|
||||||
|
**Testing Checklist:**
|
||||||
|
- [ ] 320px (small mobile)
|
||||||
|
- [ ] 375px (iPhone)
|
||||||
|
- [ ] 768px (tablet)
|
||||||
|
- [ ] 1024px (small desktop)
|
||||||
|
- [ ] 1440px (large desktop)
|
||||||
|
|
||||||
|
## Usability Testing
|
||||||
|
|
||||||
|
### Remote User Testing
|
||||||
|
|
||||||
|
#### UserTesting.com
|
||||||
|
**Website:** https://www.usertesting.com/
|
||||||
|
|
||||||
|
**Features:**
|
||||||
|
- Real users testing your site
|
||||||
|
- Video recordings of sessions
|
||||||
|
- Targeted demographics
|
||||||
|
- Task-based testing
|
||||||
|
|
||||||
|
**Test Plan Example:**
|
||||||
|
1. "Find and purchase a product"
|
||||||
|
2. "Create an account"
|
||||||
|
3. "Navigate to customer support"
|
||||||
|
4. "Complete the checkout process"
|
||||||
|
|
||||||
|
#### Maze
|
||||||
|
**Website:** https://maze.co/
|
||||||
|
|
||||||
|
**Features:**
|
||||||
|
- Prototype testing
|
||||||
|
- A/B testing
|
||||||
|
- First-click testing
|
||||||
|
- Heatmaps and analytics
|
||||||
|
|
||||||
|
**Metrics Tracked:**
|
||||||
|
- Task completion rate
|
||||||
|
- Time on task
|
||||||
|
- Misclick rate
|
||||||
|
- Path analysis
|
||||||
|
|
||||||
|
### Analytics & Session Recording
|
||||||
|
|
||||||
|
#### Hotjar
|
||||||
|
**Website:** https://www.hotjar.com/
|
||||||
|
|
||||||
|
**Features:**
|
||||||
|
- Heatmaps (click, move, scroll)
|
||||||
|
- Session recordings
|
||||||
|
- Feedback polls
|
||||||
|
- Conversion funnels
|
||||||
|
|
||||||
|
**Insights:**
|
||||||
|
- Where users click most
|
||||||
|
- How far users scroll
|
||||||
|
- Where users get confused
|
||||||
|
- Drop-off points
|
||||||
|
|
||||||
|
#### FullStory
|
||||||
|
**Website:** https://www.fullstory.com/
|
||||||
|
|
||||||
|
**Features:**
|
||||||
|
- Session replay
|
||||||
|
- Funnel analysis
|
||||||
|
- Error tracking
|
||||||
|
- Search and segment sessions
|
||||||
|
|
||||||
|
## Accessibility Testing Checklist
|
||||||
|
|
||||||
|
### Automated Testing (15 minutes)
|
||||||
|
- [ ] Run axe DevTools scan
|
||||||
|
- [ ] Run WAVE evaluation
|
||||||
|
- [ ] Run Lighthouse accessibility audit
|
||||||
|
- [ ] Check HTML validation
|
||||||
|
- [ ] Test with Pa11y (CI/CD)
|
||||||
|
|
||||||
|
### Manual Keyboard Testing (15 minutes)
|
||||||
|
- [ ] Navigate entire page with Tab key
|
||||||
|
- [ ] Verify visible focus indicators
|
||||||
|
- [ ] Check logical tab order
|
||||||
|
- [ ] Test all interactive elements
|
||||||
|
- [ ] Verify no keyboard traps
|
||||||
|
- [ ] Test Escape key behavior
|
||||||
|
- [ ] Check Enter/Space on buttons
|
||||||
|
|
||||||
|
### Screen Reader Testing (30 minutes)
|
||||||
|
- [ ] Test with NVDA or JAWS (Windows)
|
||||||
|
- [ ] Test with VoiceOver (macOS)
|
||||||
|
- [ ] Verify alt text on images
|
||||||
|
- [ ] Check form label associations
|
||||||
|
- [ ] Test dynamic content updates
|
||||||
|
- [ ] Verify ARIA labels on custom controls
|
||||||
|
- [ ] Check heading structure makes sense
|
||||||
|
|
||||||
|
### Visual Testing (15 minutes)
|
||||||
|
- [ ] Check color contrast ratios
|
||||||
|
- [ ] Verify text resizes to 200%
|
||||||
|
- [ ] Test with color blindness simulator
|
||||||
|
- [ ] Check responsive design
|
||||||
|
- [ ] Verify content reflows at 320px
|
||||||
|
- [ ] Test zoom to 400%
|
||||||
|
|
||||||
|
### Mobile Testing (15 minutes)
|
||||||
|
- [ ] Touch target sizes (44x44px minimum)
|
||||||
|
- [ ] Test on actual mobile device
|
||||||
|
- [ ] Verify zoom works
|
||||||
|
- [ ] Test portrait and landscape
|
||||||
|
- [ ] Check mobile navigation
|
||||||
|
- [ ] Verify form usability on mobile
|
||||||
|
|
||||||
|
## Testing Schedule
|
||||||
|
|
||||||
|
### During Development
|
||||||
|
- Automated testing on every build
|
||||||
|
- Manual keyboard testing for new components
|
||||||
|
- Color contrast checks in design phase
|
||||||
|
|
||||||
|
### Before Release
|
||||||
|
- Full WCAG audit
|
||||||
|
- Screen reader testing
|
||||||
|
- Cross-browser testing
|
||||||
|
- Mobile device testing
|
||||||
|
- Usability testing with real users
|
||||||
|
|
||||||
|
### Ongoing
|
||||||
|
- Monitor analytics for usability issues
|
||||||
|
- Collect user feedback
|
||||||
|
- Regular accessibility audits
|
||||||
|
- Stay updated with WCAG standards
|
||||||
|
|
||||||
|
## Tools Quick Reference
|
||||||
|
|
||||||
|
| Category | Tool | Platform | Cost | Best For |
|
||||||
|
|----------|------|----------|------|----------|
|
||||||
|
| Automated | axe DevTools | Browser | Free/Paid | Comprehensive scans |
|
||||||
|
| Automated | WAVE | Browser | Free | Visual feedback |
|
||||||
|
| Automated | Lighthouse | Chrome | Free | CI/CD integration |
|
||||||
|
| Automated | Pa11y | Node.js | Free | Bulk testing |
|
||||||
|
| Screen Reader | NVDA | Windows | Free | Windows testing |
|
||||||
|
| Screen Reader | JAWS | Windows | Paid | Professional testing |
|
||||||
|
| Screen Reader | VoiceOver | macOS/iOS | Free | Apple ecosystem |
|
||||||
|
| Contrast | WebAIM | Web | Free | Quick checks |
|
||||||
|
| Contrast | Stark | Design tools | Free/Paid | Design workflow |
|
||||||
|
| Color Blind | Color Oracle | Desktop | Free | Real-time simulation |
|
||||||
|
| Browser | BrowserStack | Web | Paid | Cross-browser |
|
||||||
|
| Usability | UserTesting | Web | Paid | User research |
|
||||||
|
| Analytics | Hotjar | Web | Free/Paid | Behavior analysis |
|
||||||
|
|
||||||
|
## Resources
|
||||||
|
|
||||||
|
- [W3C WAI Testing Tools List](https://www.w3.org/WAI/test-evaluate/tools/list/)
|
||||||
|
- [WebAIM Articles](https://webaim.org/articles/)
|
||||||
|
- [A11Y Project Resources](https://www.a11yproject.com/resources/)
|
||||||
|
- [Deque University](https://dequeuniversity.com/)
|
||||||
|
- [Google Web Fundamentals - Accessibility](https://developers.google.com/web/fundamentals/accessibility)
|
||||||
373
wcag-checklist.md
Normal file
373
wcag-checklist.md
Normal file
@@ -0,0 +1,373 @@
|
|||||||
|
# WCAG 2.1/2.2 Compliance Checklist
|
||||||
|
|
||||||
|
A comprehensive checklist for evaluating Web Content Accessibility Guidelines compliance.
|
||||||
|
|
||||||
|
## How to Use This Checklist
|
||||||
|
|
||||||
|
- Check each item during design review
|
||||||
|
- Note the WCAG level: A (minimum), AA (recommended), AAA (enhanced)
|
||||||
|
- Document violations with specific examples
|
||||||
|
- Provide remediation steps for each issue
|
||||||
|
|
||||||
|
## Perceivable
|
||||||
|
|
||||||
|
Information and user interface components must be presentable to users in ways they can perceive.
|
||||||
|
|
||||||
|
### 1.1 Text Alternatives (Level A)
|
||||||
|
|
||||||
|
Provide text alternatives for any non-text content.
|
||||||
|
|
||||||
|
- [ ] **1.1.1** All images have appropriate alt text
|
||||||
|
- Informative images describe the content
|
||||||
|
- Functional images (buttons, links) describe the action
|
||||||
|
- Decorative images have empty alt="" attribute
|
||||||
|
- Complex images have long descriptions
|
||||||
|
|
||||||
|
### 1.2 Time-based Media (Level A/AA)
|
||||||
|
|
||||||
|
Provide alternatives for time-based media.
|
||||||
|
|
||||||
|
- [ ] **1.2.1** Audio-only and video-only content has text alternatives (A)
|
||||||
|
- [ ] **1.2.2** Captions are provided for all pre-recorded audio in video (A)
|
||||||
|
- [ ] **1.2.3** Audio description or text alternative for pre-recorded video (A)
|
||||||
|
- [ ] **1.2.4** Captions are provided for all live audio (AA)
|
||||||
|
- [ ] **1.2.5** Audio description for all pre-recorded video (AA)
|
||||||
|
|
||||||
|
### 1.3 Adaptable (Level A/AA)
|
||||||
|
|
||||||
|
Create content that can be presented in different ways without losing information.
|
||||||
|
|
||||||
|
- [ ] **1.3.1** Info and relationships can be programmatically determined
|
||||||
|
- Semantic HTML elements used correctly (headings, lists, tables)
|
||||||
|
- Form labels are associated with inputs
|
||||||
|
- ARIA landmarks identify page regions
|
||||||
|
- Data tables use proper markup (th, scope, headers)
|
||||||
|
|
||||||
|
- [ ] **1.3.2** Meaningful sequence is preserved without CSS
|
||||||
|
- Content order is logical when stylesheets are disabled
|
||||||
|
- Reading order matches visual order
|
||||||
|
- Tab order is logical
|
||||||
|
|
||||||
|
- [ ] **1.3.3** Instructions don't rely solely on sensory characteristics
|
||||||
|
- Don't use "Click the round button" (use "Click the Save button")
|
||||||
|
- Don't use "See the box on the right" (use "See the Related Articles section")
|
||||||
|
- Don't rely only on color ("Click the green button" → "Click the Submit button")
|
||||||
|
|
||||||
|
- [ ] **1.3.4** Content works in portrait and landscape (AA)
|
||||||
|
- No orientation lock (unless essential)
|
||||||
|
- Content adapts to orientation changes
|
||||||
|
|
||||||
|
- [ ] **1.3.5** Input purpose can be programmatically determined (AA)
|
||||||
|
- Autocomplete attributes used for common inputs
|
||||||
|
- `autocomplete="name"`, `autocomplete="email"`, etc.
|
||||||
|
|
||||||
|
### 1.4 Distinguishable (Level A/AA/AAA)
|
||||||
|
|
||||||
|
Make it easier for users to see and hear content.
|
||||||
|
|
||||||
|
- [ ] **1.4.1** Color is not the only visual means of conveying information (A)
|
||||||
|
- Links are distinguishable without color alone (underline or icon)
|
||||||
|
- Form errors use icons or text, not just red color
|
||||||
|
- Charts use patterns or labels in addition to color
|
||||||
|
|
||||||
|
- [ ] **1.4.2** Audio control is available (A)
|
||||||
|
- Auto-playing audio can be paused, stopped, or muted
|
||||||
|
- Auto-play lasts less than 3 seconds
|
||||||
|
|
||||||
|
- [ ] **1.4.3** Contrast ratio is at least 4.5:1 for normal text, 3:1 for large text (AA)
|
||||||
|
- Normal text: 4.5:1 minimum
|
||||||
|
- Large text (18pt+/14pt bold+): 3:1 minimum
|
||||||
|
- UI components and graphics: 3:1 minimum
|
||||||
|
|
||||||
|
- [ ] **1.4.4** Text can be resized up to 200% without loss of content or functionality (AA)
|
||||||
|
- No horizontal scrolling at 200% zoom
|
||||||
|
- Content doesn't overlap or get cut off
|
||||||
|
- All functionality remains available
|
||||||
|
|
||||||
|
- [ ] **1.4.5** Images of text are avoided (AA)
|
||||||
|
- Use actual text instead of text in images
|
||||||
|
- Exceptions: logos, essential images (charts, screenshots)
|
||||||
|
|
||||||
|
- [ ] **1.4.6** Contrast ratio is at least 7:1 for normal text, 4.5:1 for large text (AAA)
|
||||||
|
|
||||||
|
- [ ] **1.4.10** Content reflows without horizontal scrolling at 320px width (AA)
|
||||||
|
- Content adapts to small viewports
|
||||||
|
- No two-dimensional scrolling required
|
||||||
|
- Exceptions: images, maps, data tables, complex interfaces
|
||||||
|
|
||||||
|
- [ ] **1.4.11** Non-text contrast is at least 3:1 (AA)
|
||||||
|
- UI components (buttons, inputs, controls)
|
||||||
|
- Graphical objects (icons, charts)
|
||||||
|
- Focus indicators
|
||||||
|
|
||||||
|
- [ ] **1.4.12** Text spacing can be adjusted without loss of content (AA)
|
||||||
|
- Line height: 1.5x font size minimum
|
||||||
|
- Paragraph spacing: 2x font size minimum
|
||||||
|
- Letter spacing: 0.12x font size minimum
|
||||||
|
- Word spacing: 0.16x font size minimum
|
||||||
|
|
||||||
|
- [ ] **1.4.13** Content on hover or focus is dismissible, hoverable, and persistent (AA)
|
||||||
|
- Tooltips/popovers can be dismissed (Esc key)
|
||||||
|
- Mouse can hover over the tooltip content
|
||||||
|
- Content remains visible until user dismisses it
|
||||||
|
|
||||||
|
## Operable
|
||||||
|
|
||||||
|
User interface components and navigation must be operable.
|
||||||
|
|
||||||
|
### 2.1 Keyboard Accessible (Level A)
|
||||||
|
|
||||||
|
Make all functionality available from a keyboard.
|
||||||
|
|
||||||
|
- [ ] **2.1.1** All functionality is keyboard accessible
|
||||||
|
- No mouse-only interactions
|
||||||
|
- Custom controls have keyboard support
|
||||||
|
- All interactive elements can be activated via keyboard
|
||||||
|
|
||||||
|
- [ ] **2.1.2** No keyboard traps exist
|
||||||
|
- Users can tab through all content and back out
|
||||||
|
- If focus is trapped (e.g., modal), there's a documented way to escape
|
||||||
|
- Instructions provided if non-standard keyboard navigation
|
||||||
|
|
||||||
|
- [ ] **2.1.4** Single-character keyboard shortcuts can be turned off or remapped (A)
|
||||||
|
- Shortcuts only active when component has focus
|
||||||
|
- Can be disabled or customized
|
||||||
|
|
||||||
|
### 2.2 Enough Time (Level A/AAA)
|
||||||
|
|
||||||
|
Provide users enough time to read and use content.
|
||||||
|
|
||||||
|
- [ ] **2.2.1** Time limits can be adjusted (A)
|
||||||
|
- User can turn off, adjust, or extend time limits
|
||||||
|
- Warning given before time expires
|
||||||
|
- At least 20 seconds to respond to warning
|
||||||
|
|
||||||
|
- [ ] **2.2.2** Moving, blinking, scrolling content can be paused (A)
|
||||||
|
- Carousels have pause button
|
||||||
|
- Auto-scrolling can be stopped
|
||||||
|
- Exceptions: essential animations under 5 seconds
|
||||||
|
|
||||||
|
### 2.3 Seizures and Physical Reactions (Level A/AAA)
|
||||||
|
|
||||||
|
Do not design content that can cause seizures.
|
||||||
|
|
||||||
|
- [ ] **2.3.1** Content doesn't flash more than 3 times per second (A)
|
||||||
|
- No rapidly flashing content
|
||||||
|
- Animation effects are below threshold
|
||||||
|
|
||||||
|
### 2.4 Navigable (Level A/AA/AAA)
|
||||||
|
|
||||||
|
Provide ways to help users navigate and find content.
|
||||||
|
|
||||||
|
- [ ] **2.4.1** Skip links allow bypassing repeated content (A)
|
||||||
|
- "Skip to main content" link is first focusable element
|
||||||
|
- Skip links to bypass navigation, search, etc.
|
||||||
|
|
||||||
|
- [ ] **2.4.2** Page titles are descriptive and unique (A)
|
||||||
|
- Every page has a unique, descriptive `<title>`
|
||||||
|
- Title identifies page purpose
|
||||||
|
- Format: "Page Name - Site Name"
|
||||||
|
|
||||||
|
- [ ] **2.4.3** Focus order preserves meaning and operability (A)
|
||||||
|
- Tab order is logical
|
||||||
|
- Focus order matches visual order
|
||||||
|
- No unexpected focus changes
|
||||||
|
|
||||||
|
- [ ] **2.4.4** Link purpose is clear from link text or context (A)
|
||||||
|
- Avoid "Click here" or "Read more"
|
||||||
|
- Link text describes destination
|
||||||
|
- Context provides clarity if needed
|
||||||
|
|
||||||
|
- [ ] **2.4.5** Multiple ways to locate pages exist (AA)
|
||||||
|
- Search functionality
|
||||||
|
- Site map
|
||||||
|
- Navigation menu
|
||||||
|
- Breadcrumbs
|
||||||
|
|
||||||
|
- [ ] **2.4.6** Headings and labels are descriptive (AA)
|
||||||
|
- Headings clearly describe content
|
||||||
|
- Form labels are clear and descriptive
|
||||||
|
|
||||||
|
- [ ] **2.4.7** Focus indicator is visible (AA)
|
||||||
|
- Clear outline or highlight on focused elements
|
||||||
|
- 3:1 contrast ratio for focus indicators
|
||||||
|
- Not removed with `outline: none` without replacement
|
||||||
|
|
||||||
|
- [ ] **2.4.8** Information about user's location is available (AAA)
|
||||||
|
- Breadcrumbs show current location
|
||||||
|
- Current nav item is highlighted
|
||||||
|
- Page title indicates location
|
||||||
|
|
||||||
|
### 2.5 Input Modalities (Level A/AAA)
|
||||||
|
|
||||||
|
Make it easier for users to operate functionality through various inputs.
|
||||||
|
|
||||||
|
- [ ] **2.5.1** All functionality works with pointer gestures (A)
|
||||||
|
- Multi-point or path-based gestures have single-pointer alternatives
|
||||||
|
- Pinch-to-zoom has zoom buttons
|
||||||
|
- Swipe gestures have button alternatives
|
||||||
|
|
||||||
|
- [ ] **2.5.2** Pointer cancellation prevents accidental activation (A)
|
||||||
|
- Actions occur on up-event (mouseup/touchend), not down-event
|
||||||
|
- Or action can be aborted/undone
|
||||||
|
|
||||||
|
- [ ] **2.5.3** Labels match accessible names (A)
|
||||||
|
- Visible label text is included in accessible name
|
||||||
|
- "Submit" button has accessible name "Submit"
|
||||||
|
|
||||||
|
- [ ] **2.5.4** Motion actuation can be disabled (A)
|
||||||
|
- Shaking device to undo can be turned off
|
||||||
|
- UI alternatives provided
|
||||||
|
|
||||||
|
- [ ] **2.5.5** Target size is at least 44x44 CSS pixels (AAA)
|
||||||
|
- Touch targets meet minimum size
|
||||||
|
- Sufficient spacing between targets
|
||||||
|
|
||||||
|
## Understandable
|
||||||
|
|
||||||
|
Information and user interface operation must be understandable.
|
||||||
|
|
||||||
|
### 3.1 Readable (Level A/AA/AAA)
|
||||||
|
|
||||||
|
Make text content readable and understandable.
|
||||||
|
|
||||||
|
- [ ] **3.1.1** Page language is identified (A)
|
||||||
|
- `<html lang="en">` attribute is set
|
||||||
|
- Correct language code used
|
||||||
|
|
||||||
|
- [ ] **3.1.2** Language changes are marked up (AA)
|
||||||
|
- `lang` attribute used for content in different language
|
||||||
|
- `<span lang="es">Hola</span>`
|
||||||
|
|
||||||
|
- [ ] **3.1.3** Unusual words are defined (AAA)
|
||||||
|
- Jargon, idioms, and slang are explained
|
||||||
|
- Glossary or inline definitions provided
|
||||||
|
|
||||||
|
### 3.2 Predictable (Level A/AA)
|
||||||
|
|
||||||
|
Make web pages appear and operate in predictable ways.
|
||||||
|
|
||||||
|
- [ ] **3.2.1** Focus doesn't trigger unexpected changes (A)
|
||||||
|
- Receiving focus doesn't open popups
|
||||||
|
- Focus doesn't redirect to another page
|
||||||
|
- Focus doesn't change context without warning
|
||||||
|
|
||||||
|
- [ ] **3.2.2** Input doesn't trigger unexpected changes (A)
|
||||||
|
- Entering data doesn't automatically submit forms
|
||||||
|
- Selecting radio button doesn't redirect
|
||||||
|
- Changes require explicit submit/save action
|
||||||
|
- Or users are warned before context changes
|
||||||
|
|
||||||
|
- [ ] **3.2.3** Navigation is consistent across pages (AA)
|
||||||
|
- Navigation appears in same location on each page
|
||||||
|
- Menu items in same order
|
||||||
|
|
||||||
|
- [ ] **3.2.4** Components are identified consistently (AA)
|
||||||
|
- Same icons/labels used for same functions
|
||||||
|
- Search icon always means search
|
||||||
|
- "Save" button always labeled "Save"
|
||||||
|
|
||||||
|
### 3.3 Input Assistance (Level A/AA/AAA)
|
||||||
|
|
||||||
|
Help users avoid and correct mistakes.
|
||||||
|
|
||||||
|
- [ ] **3.3.1** Form errors are identified (A)
|
||||||
|
- Error messages clearly identify which field has error
|
||||||
|
- Error is described in text, not just color
|
||||||
|
|
||||||
|
- [ ] **3.3.2** Labels and instructions are provided (A)
|
||||||
|
- Every input has a label
|
||||||
|
- Required fields are marked
|
||||||
|
- Format requirements are explained
|
||||||
|
|
||||||
|
- [ ] **3.3.3** Error suggestions are offered (AA)
|
||||||
|
- Provide helpful suggestions to fix errors
|
||||||
|
- "Email format incorrect. Example: user@example.com"
|
||||||
|
- Suggest corrections for misspellings
|
||||||
|
|
||||||
|
- [ ] **3.3.4** Critical actions can be reversed, checked, or confirmed (AA)
|
||||||
|
- Financial transactions can be reversed
|
||||||
|
- Data deletion requires confirmation
|
||||||
|
- Form data can be reviewed before submission
|
||||||
|
|
||||||
|
## Robust
|
||||||
|
|
||||||
|
Content must be robust enough to work with current and future technologies.
|
||||||
|
|
||||||
|
### 4.1 Compatible (Level A/AA)
|
||||||
|
|
||||||
|
Maximize compatibility with current and future user agents, including assistive technologies.
|
||||||
|
|
||||||
|
- [ ] **4.1.1** HTML is valid and properly nested (A)
|
||||||
|
- Opening and closing tags match
|
||||||
|
- Elements nested correctly
|
||||||
|
- IDs are unique
|
||||||
|
|
||||||
|
- [ ] **4.1.2** Name, role, value are programmatically determinable (A)
|
||||||
|
- Form inputs have labels
|
||||||
|
- Custom controls have ARIA roles
|
||||||
|
- State changes are communicated (aria-expanded, aria-checked)
|
||||||
|
|
||||||
|
- [ ] **4.1.3** Status messages can be perceived without focus (AA)
|
||||||
|
- Success messages use `role="status"` or `aria-live="polite"`
|
||||||
|
- Urgent messages use `role="alert"` or `aria-live="assertive"`
|
||||||
|
- Loading states announced to screen readers
|
||||||
|
|
||||||
|
## Additional Best Practices
|
||||||
|
|
||||||
|
Beyond WCAG requirements, consider these best practices:
|
||||||
|
|
||||||
|
### Screen Reader Support
|
||||||
|
- [ ] ARIA landmarks define page structure (banner, navigation, main, contentinfo)
|
||||||
|
- [ ] Headings are used hierarchically (h1 → h2 → h3, no skipping)
|
||||||
|
- [ ] Images in links are given appropriate alt text
|
||||||
|
- [ ] Icon-only buttons have accessible labels
|
||||||
|
- [ ] Visually hidden text provides context where needed
|
||||||
|
|
||||||
|
### Keyboard Navigation
|
||||||
|
- [ ] Tab order is logical and efficient
|
||||||
|
- [ ] Escape key closes modals and dropdowns
|
||||||
|
- [ ] Arrow keys navigate within component groups
|
||||||
|
- [ ] Enter/Space activate buttons and links
|
||||||
|
- [ ] Custom keyboard shortcuts are documented
|
||||||
|
|
||||||
|
### Forms
|
||||||
|
- [ ] Field labels are above or left of inputs (not placeholder text)
|
||||||
|
- [ ] Error messages appear near the field with the error
|
||||||
|
- [ ] Required fields marked with asterisk AND text "(required)"
|
||||||
|
- [ ] Success confirmation after form submission
|
||||||
|
- [ ] Form data preserved if validation fails
|
||||||
|
|
||||||
|
### Focus Management
|
||||||
|
- [ ] Focus moved to modal when opened
|
||||||
|
- [ ] Focus returned to trigger when modal closes
|
||||||
|
- [ ] Focus not lost when content updates dynamically
|
||||||
|
- [ ] Focus visible and meets 3:1 contrast ratio
|
||||||
|
|
||||||
|
### Content Structure
|
||||||
|
- [ ] Only one h1 per page
|
||||||
|
- [ ] Headings don't skip levels
|
||||||
|
- [ ] Lists used for list content (ul, ol, dl)
|
||||||
|
- [ ] Tables used for tabular data only
|
||||||
|
- [ ] Table headers (th) identify rows and columns
|
||||||
|
|
||||||
|
## Testing Checklist
|
||||||
|
|
||||||
|
- [ ] Automated testing with axe DevTools
|
||||||
|
- [ ] Automated testing with WAVE
|
||||||
|
- [ ] Lighthouse accessibility audit
|
||||||
|
- [ ] Keyboard-only navigation test
|
||||||
|
- [ ] Screen reader test (NVDA/JAWS/VoiceOver)
|
||||||
|
- [ ] Color contrast verification
|
||||||
|
- [ ] 200% zoom test
|
||||||
|
- [ ] Responsive design test (320px width minimum)
|
||||||
|
- [ ] Color blindness simulation
|
||||||
|
- [ ] Touch target size verification
|
||||||
|
|
||||||
|
## Resources
|
||||||
|
|
||||||
|
- [WCAG 2.1 Official Guidelines](https://www.w3.org/WAI/WCAG21/quickref/)
|
||||||
|
- [WCAG 2.2 Updates](https://www.w3.org/WAI/WCAG22/quickref/)
|
||||||
|
- [WebAIM WCAG Checklist](https://webaim.org/standards/wcag/checklist)
|
||||||
|
- [A11Y Project Checklist](https://www.a11yproject.com/checklist/)
|
||||||
|
- [axe DevTools Browser Extension](https://www.deque.com/axe/devtools/)
|
||||||
Reference in New Issue
Block a user