Accessibility Auditor skill

Web accessibility specialist for WCAG compliance, ARIA implementation, and inclusive design.

by davila7·MIT license·★ 32,299 Stars on the repo·GitHub ↗

Use now

Files of Accessibility Auditor

davila7/main1 file shown
SKILL.md
Show the full text507 lines

Accessibility Auditor

Comprehensive guidance for creating accessible web experiences that comply with WCAG standards and serve users of all abilities effectively.

When to Use This Skill

Use this skill when:

  • Auditing websites for accessibility compliance
  • Implementing WCAG 2.1 Level AA or AAA standards
  • Fixing accessibility violations and errors
  • Testing with screen readers (NVDA, JAWS, VoiceOver)
  • Ensuring keyboard navigation works correctly
  • Implementing ARIA attributes and landmarks
  • Preparing for ADA or Section 508 compliance audits
  • Designing inclusive user experiences

WCAG 2.1 Principles (POUR)

1. Perceivable

Users must be able to perceive the information being presented.

2. Operable

Users must be able to operate the interface.

3. Understandable

Users must be able to understand the information and interface.

4. Robust

Content must be robust enough to work with current and future technologies.

Common Accessibility Issues & Fixes

1. Missing Alt Text for Images

❌ Problem:

<img src="/products/shoes.jpg">

✅ Solution:

<!-- Informative image -->
<img src="/products/shoes.jpg" alt="Red Nike Air Max running shoes with white swoosh">

<!-- Decorative image -->
<img src="/decorative-pattern.svg" alt="" role="presentation">

<!-- Logo that links -->
<a href="/">
  <img src="/logo.png" alt="Company Name - Home">
</a>

Rules:

  • Informative images: Describe the content/function
  • Decorative images: Use empty alt (alt="")
  • Functional images: Describe the action
  • Complex images: Provide detailed description nearby
2. Low Color Contrast

❌ Problem:

/* Contrast ratio 2.5:1 - Fails WCAG */
.text {
  color: #767676;
  background: #ffffff;
}

✅ Solution:

/* Contrast ratio 4.5:1+ - Passes AA */
.text {
  color: #595959;
  background: #ffffff;
}

/* Contrast ratio 7:1+ - Passes AAA */
.text-high-contrast {
  color: #333333;
  background: #ffffff;
}

Requirements:

  • Normal text (< 18px): 4.5:1 minimum (AA), 7:1 enhanced (AAA)
  • Large text (≥ 18px or ≥ 14px bold): 3:1 minimum (AA), 4.5:1 enhanced (AAA)
  • UI components and graphics: 3:1 minimum
3. Non-Semantic HTML

❌ Problem:

<div class="button" onclick="submitForm()">Submit</div>
<div class="heading">Page Title</div>
<div class="nav-menu">...</div>

✅ Solution:

<button type="submit" onclick="submitForm()">Submit</button>
<h1>Page Title</h1>
<nav aria-label="Main navigation">...</nav>

Semantic Elements:

  • <button> for buttons
  • <a> for links
  • <h1> - <h6> for headings (hierarchical)
  • <nav>, <main>, <aside>, <article>, <section> for landmarks
  • <ul>, <ol>, <li> for lists
  • <table>, <th>, <td> for tabular data
4. Missing Form Labels

❌ Problem:

<input type="email" placeholder="Enter your email">

✅ Solution:

<!-- Explicit label -->
<label for="email">Email Address</label>
<input type="email" id="email" name="email">

<!-- Implicit label -->
<label>
  Email Address
  <input type="email" name="email">
</label>

<!-- Hidden label (for tight layouts) -->
<label for="search" class="sr-only">Search</label>
<input type="text" id="search" placeholder="Search...">

Best Practices:

  • Every form field must have an associated label
  • Labels should be visible (don't rely on placeholder)
  • Use aria-label only when visual label isn't possible
  • Group related fields with <fieldset> and <legend>
5. Keyboard Navigation Issues

❌ Problem:

<div onclick="handleClick()">Click me</div>
<a href="javascript:void(0)" onclick="doSomething()">Action</a>

✅ Solution:

<!-- Use proper button -->
<button onclick="handleClick()">Click me</button>

<!-- If div required, make it accessible -->
<div
  role="button"
  tabindex="0"
  onclick="handleClick()"
  onkeydown="handleKeyPress(event)"
>
  Click me
</div>

<script>
function handleKeyPress(event) {
  if (event.key === 'Enter' || event.key === ' ') {
    event.preventDefault();
    handleClick();
  }
}
</script>

Keyboard Requirements:

  • All interactive elements must be keyboard accessible
  • Visible focus indicators (outline or custom styling)
  • Logical tab order (matches visual flow)
  • Skip links for repetitive content
  • No keyboard traps (users can navigate away)
6. Missing ARIA Landmarks

❌ Problem:

<div class="header">...</div>
<div class="main-content">...</div>
<div class="sidebar">...</div>
<div class="footer">...</div>

✅ Solution:

<header role="banner">
  <nav aria-label="Main navigation">...</nav>
</header>

<main role="main">
  <h1>Page Title</h1>
  <article>...</article>
</main>

<aside role="complementary" aria-label="Related articles">
  ...
</aside>

<footer role="contentinfo">
  ...
</footer>

Common Landmarks:

  • banner - Site header
  • navigation - Navigation menus
  • main - Primary content (one per page)
  • complementary - Supporting content
  • contentinfo - Site footer
  • search - Search functionality
  • form - Form regions
7. Inaccessible Modals/Dialogs

❌ Problem:

<div class="modal">
  <div class="content">
    Modal content
    <button onclick="closeModal()">Close</button>
  </div>
</div>

✅ Solution:

<div
  role="dialog"
  aria-modal="true"
  aria-labelledby="modal-title"
  aria-describedby="modal-desc"
>
  <h2 id="modal-title">Confirm Action</h2>
  <p id="modal-desc">Are you sure you want to delete this item?</p>

  <button onclick="confirmAction()">Confirm</button>
  <button onclick="closeModal()">Cancel</button>
</div>

<script>
// Focus management
function openModal() {
  const modal = document.querySelector('[role="dialog"]');
  const focusableElements = modal.querySelectorAll(
    'button, [href], input, select, textarea, [tabindex]:not([tabindex="-1"])'
  );

  // Store previous focus
  previousFocus = document.activeElement;

  // Focus first element
  focusableElements[0].focus();

  // Trap focus
  modal.addEventListener('keydown', trapFocus);
}

function closeModal() {
  // Return focus
  if (previousFocus) previousFocus.focus();
}

function trapFocus(event) {
  if (event.key !== 'Tab') return;

  const focusableElements = Array.from(
    modal.querySelectorAll('button, [href], input, select, textarea, [tabindex]:not([tabindex="-1"])')
  );

  const firstElement = focusableElements[0];
  const lastElement = focusableElements[focusableElements.length - 1];

  if (event.shiftKey && document.activeElement === firstElement) {
    lastElement.focus();
    event.preventDefault();
  } else if (!event.shiftKey && document.activeElement === lastElement) {
    firstElement.focus();
    event.preventDefault();
  }
}
</script>

Modal Requirements:

  • role="dialog" or role="alertdialog"
  • aria-modal="true" to indicate modal behavior
  • aria-labelledby pointing to title
  • aria-describedby for description (optional)
  • Focus management (trap and restore)
  • Close on Escape key
  • Prevent background scrolling

✅ Solution:

<a href="#main-content" class="skip-link">
  Skip to main content
</a>

<header>
  <nav>...</nav>
</header>

<main id="main-content" tabindex="-1">
  <!-- Page content -->
</main>

<style>
.skip-link {
  position: absolute;
  top: -40px;
  left: 0;
  background: #000;
  color: #fff;
  padding: 8px;
  text-decoration: none;
  z-index: 100;
}

.skip-link:focus {
  top: 0;
}
</style>

ARIA Best Practices

ARIA Attributes Reference

States:

  • aria-checked - Checkbox/radio state
  • aria-disabled - Disabled state
  • aria-expanded - Expanded/collapsed state
  • aria-hidden - Hidden from assistive technology
  • aria-pressed - Toggle button state
  • aria-selected - Selected state

Properties:

  • aria-label - Accessible name
  • aria-labelledby - ID reference for label
  • aria-describedby - ID reference for description
  • aria-live - Live region updates
  • aria-required - Required field
  • aria-invalid - Validation state
Live Regions
<!-- Polite: Wait for pause in speech -->
<div aria-live="polite" aria-atomic="true">
  Item added to cart
</div>

<!-- Assertive: Interrupt immediately -->
<div aria-live="assertive" role="alert">
  Error: Payment failed
</div>

<!-- Status message -->
<div role="status" aria-live="polite">
  Saving changes...
</div>
Custom Components

Accordion:

<div class="accordion">
  <button
    aria-expanded="false"
    aria-controls="panel-1"
    id="accordion-1"
  >
    Section 1
  </button>
  <div id="panel-1" role="region" aria-labelledby="accordion-1" hidden>
    Panel content
  </div>
</div>

Tabs:

<div role="tablist" aria-label="Content sections">
  <button
    role="tab"
    aria-selected="true"
    aria-controls="panel-1"
    id="tab-1"
  >
    Tab 1
  </button>
  <button
    role="tab"
    aria-selected="false"
    aria-controls="panel-2"
    id="tab-2"
    tabindex="-1"
  >
    Tab 2
  </button>
</div>

<div role="tabpanel" id="panel-1" aria-labelledby="tab-1">
  Panel 1 content
</div>
<div role="tabpanel" id="panel-2" aria-labelledby="tab-2" hidden>
  Panel 2 content
</div>

Testing Checklist

Automated Testing
  • Run axe DevTools or WAVE browser extension
  • Check HTML validation (W3C Validator)
  • Test color contrast ratios
  • Verify heading hierarchy
  • Check for missing alt text
Manual Testing
  • Navigate entire site using only keyboard (Tab, Enter, Escape, Arrow keys)
  • Test with screen reader (NVDA, JAWS, or VoiceOver)
  • Verify focus indicators are visible
  • Check form validation messages are announced
  • Test modal focus trapping
  • Verify skip links work
  • Test with browser zoom at 200%
  • Check page reflow at different viewport sizes
  • Disable JavaScript and verify core functionality
  • Test with Windows High Contrast mode
Screen Reader Testing

VoiceOver (Mac):

  • Enable: Cmd + F5
  • Navigate: Control + Option + Arrow keys
  • Read all: Control + Option + A

NVDA (Windows):

  • Navigate: Arrow keys (browse mode) or Tab (focus mode)
  • Read all: NVDA + Down Arrow
  • Elements list: NVDA + F7

Test Scenarios:

  • Can users understand page structure?
  • Are headings descriptive and hierarchical?
  • Are form labels clear and associated?
  • Are error messages announced?
  • Can users complete key tasks without vision?

Accessibility Statement

Include on website:

# Accessibility Statement

We are committed to ensuring digital accessibility for people with disabilities. We continually improve the user experience for everyone and apply relevant accessibility standards.

## Conformance Status
This website is partially conformant with WCAG 2.1 Level AA. "Partially conformant" means that some parts of the content do not fully conform to the accessibility standard.

## Feedback
We welcome your feedback on the accessibility of this site. Please contact us:
- Email: [email protected]
- Phone: +1-555-0123

## Known Issues
- [List any known accessibility issues and planned fixes]

Last updated: [Date]

Resources

Tools:

  • axe DevTools (browser extension)
  • WAVE (web accessibility evaluation tool)
  • Lighthouse (Chrome DevTools)
  • Colour Contrast Analyser
  • Screen readers: NVDA, JAWS, VoiceOver

Guidelines:

Accessibility is not optional—it's a fundamental requirement for creating inclusive web experiences. Prioritize it from the start of every project, not as an afterthought.

1---
2name: Accessibility Auditor
3description: Web accessibility specialist for WCAG compliance, ARIA implementation, and inclusive design. Use when auditing websites for accessibility issues, implementing WCAG 2.1 AA/AAA standards, testing with screen readers, or ensuring ADA compliance. Expert in semantic HTML, keyboard navigation, and assistive technology compatibility.
4---
5 
6# Accessibility Auditor
7 
8Comprehensive guidance for creating accessible web experiences that comply with WCAG standards and serve users of all abilities effectively.
9 
10## When to Use This Skill
11 
12Use this skill when:
13- Auditing websites for accessibility compliance
14- Implementing WCAG 2.1 Level AA or AAA standards
15- Fixing accessibility violations and errors
16- Testing with screen readers (NVDA, JAWS, VoiceOver)
17- Ensuring keyboard navigation works correctly
18- Implementing ARIA attributes and landmarks
19- Preparing for ADA or Section 508 compliance audits
20- Designing inclusive user experiences
21 
22## WCAG 2.1 Principles (POUR)
23 
24### 1. Perceivable
25Users must be able to perceive the information being presented.
26 
27### 2. Operable
28Users must be able to operate the interface.
29 
30### 3. Understandable
31Users must be able to understand the information and interface.
32 
33### 4. Robust
34Content must be robust enough to work with current and future technologies.
35 
36## Common Accessibility Issues & Fixes
37 
38### 1. Missing Alt Text for Images
39 
40**❌ Problem:**
41```html
42<img src="/products/shoes.jpg">
43```
44 
45**✅ Solution:**
46```html
47<!-- Informative image -->
48<img src="/products/shoes.jpg" alt="Red Nike Air Max running shoes with white swoosh">
49 
50<!-- Decorative image -->
51<img src="/decorative-pattern.svg" alt="" role="presentation">
52 
53<!-- Logo that links -->
54<a href="/">
55 <img src="/logo.png" alt="Company Name - Home">
56</a>
57```
58 
59**Rules:**
60- Informative images: Describe the content/function
61- Decorative images: Use empty alt (alt="")
62- Functional images: Describe the action
63- Complex images: Provide detailed description nearby
64 
65### 2. Low Color Contrast
66 
67**❌ Problem:**
68```css
69/* Contrast ratio 2.5:1 - Fails WCAG */
70.text {
71 color: #767676;
72 background: #ffffff;
73}
74```
75 
76**✅ Solution:**
77```css
78/* Contrast ratio 4.5:1+ - Passes AA */
79.text {
80 color: #595959;
81 background: #ffffff;
82}
83 
84/* Contrast ratio 7:1+ - Passes AAA */
85.text-high-contrast {
86 color: #333333;
87 background: #ffffff;
88}
89```
90 
91**Requirements:**
92- Normal text (< 18px): 4.5:1 minimum (AA), 7:1 enhanced (AAA)
93- Large text (≥ 18px or ≥ 14px bold): 3:1 minimum (AA), 4.5:1 enhanced (AAA)
94- UI components and graphics: 3:1 minimum
95 
96### 3. Non-Semantic HTML
97 
98**❌ Problem:**
99```html
100<div class="button" onclick="submitForm()">Submit</div>
101<div class="heading">Page Title</div>
102<div class="nav-menu">...</div>
103```
104 
105**✅ Solution:**
106```html
107<button type="submit" onclick="submitForm()">Submit</button>
108<h1>Page Title</h1>
109<nav aria-label="Main navigation">...</nav>
110```
111 
112**Semantic Elements:**
113- `<button>` for buttons
114- `<a>` for links
115- `<h1>` - `<h6>` for headings (hierarchical)
116- `<nav>`, `<main>`, `<aside>`, `<article>`, `<section>` for landmarks
117- `<ul>`, `<ol>`, `<li>` for lists
118- `<table>`, `<th>`, `<td>` for tabular data
119 
120### 4. Missing Form Labels
121 
122**❌ Problem:**
123```html
124<input type="email" placeholder="Enter your email">
125```
126 
127**✅ Solution:**
128```html
129<!-- Explicit label -->
130<label for="email">Email Address</label>
131<input type="email" id="email" name="email">
132 
133<!-- Implicit label -->
134<label>
135 Email Address
136 <input type="email" name="email">
137</label>
138 
139<!-- Hidden label (for tight layouts) -->
140<label for="search" class="sr-only">Search</label>
141<input type="text" id="search" placeholder="Search...">
142```
143 
144**Best Practices:**
145- Every form field must have an associated label
146- Labels should be visible (don't rely on placeholder)
147- Use aria-label only when visual label isn't possible
148- Group related fields with `<fieldset>` and `<legend>`
149 
150### 5. Keyboard Navigation Issues
151 
152**❌ Problem:**
153```html
154<div onclick="handleClick()">Click me</div>
155<a href="javascript:void(0)" onclick="doSomething()">Action</a>
156```
157 
158**✅ Solution:**
159```html
160<!-- Use proper button -->
161<button onclick="handleClick()">Click me</button>
162 
163<!-- If div required, make it accessible -->
164<div
165 role="button"
166 tabindex="0"
167 onclick="handleClick()"
168 onkeydown="handleKeyPress(event)"
169>
170 Click me
171</div>
172 
173<script>
174function handleKeyPress(event) {
175 if (event.key === 'Enter' || event.key === ' ') {
176 event.preventDefault();
177 handleClick();
178 }
179}
180</script>
181```
182 
183**Keyboard Requirements:**
184- All interactive elements must be keyboard accessible
185- Visible focus indicators (outline or custom styling)
186- Logical tab order (matches visual flow)
187- Skip links for repetitive content
188- No keyboard traps (users can navigate away)
189 
190### 6. Missing ARIA Landmarks
191 
192**❌ Problem:**
193```html
194<div class="header">...</div>
195<div class="main-content">...</div>
196<div class="sidebar">...</div>
197<div class="footer">...</div>
198```
199 
200**✅ Solution:**
201```html
202<header role="banner">
203 <nav aria-label="Main navigation">...</nav>
204</header>
205 
206<main role="main">
207 <h1>Page Title</h1>
208 <article>...</article>
209</main>
210 
211<aside role="complementary" aria-label="Related articles">
212 ...
213</aside>
214 
215<footer role="contentinfo">
216 ...
217</footer>
218```
219 
220**Common Landmarks:**
221- `banner` - Site header
222- `navigation` - Navigation menus
223- `main` - Primary content (one per page)
224- `complementary` - Supporting content
225- `contentinfo` - Site footer
226- `search` - Search functionality
227- `form` - Form regions
228 
229### 7. Inaccessible Modals/Dialogs
230 
231**❌ Problem:**
232```html
233<div class="modal">
234 <div class="content">
235 Modal content
236 <button onclick="closeModal()">Close</button>
237 </div>
238</div>
239```
240 
241**✅ Solution:**
242```html
243<div
244 role="dialog"
245 aria-modal="true"
246 aria-labelledby="modal-title"
247 aria-describedby="modal-desc"
248>
249 <h2 id="modal-title">Confirm Action</h2>
250 <p id="modal-desc">Are you sure you want to delete this item?</p>
251 
252 <button onclick="confirmAction()">Confirm</button>
253 <button onclick="closeModal()">Cancel</button>
254</div>
255 
256<script>
257// Focus management
258function openModal() {
259 const modal = document.querySelector('[role="dialog"]');
260 const focusableElements = modal.querySelectorAll(
261 'button, [href], input, select, textarea, [tabindex]:not([tabindex="-1"])'
262 );
263 
264 // Store previous focus
265 previousFocus = document.activeElement;
266 
267 // Focus first element
268 focusableElements[0].focus();
269 
270 // Trap focus
271 modal.addEventListener('keydown', trapFocus);
272}
273 
274function closeModal() {
275 // Return focus
276 if (previousFocus) previousFocus.focus();
277}
278 
279function trapFocus(event) {
280 if (event.key !== 'Tab') return;
281 
282 const focusableElements = Array.from(
283 modal.querySelectorAll('button, [href], input, select, textarea, [tabindex]:not([tabindex="-1"])')
284 );
285 
286 const firstElement = focusableElements[0];
287 const lastElement = focusableElements[focusableElements.length - 1];
288 
289 if (event.shiftKey && document.activeElement === firstElement) {
290 lastElement.focus();
291 event.preventDefault();
292 } else if (!event.shiftKey && document.activeElement === lastElement) {
293 firstElement.focus();
294 event.preventDefault();
295 }
296}
297</script>
298```
299 
300**Modal Requirements:**
301- `role="dialog"` or `role="alertdialog"`
302- `aria-modal="true"` to indicate modal behavior
303- `aria-labelledby` pointing to title
304- `aria-describedby` for description (optional)
305- Focus management (trap and restore)
306- Close on Escape key
307- Prevent background scrolling
308 
309### 8. Missing Skip Links
310 
311**✅ Solution:**
312```html
313<a href="#main-content" class="skip-link">
314 Skip to main content
315</a>
316 
317<header>
318 <nav>...</nav>
319</header>
320 
321<main id="main-content" tabindex="-1">
322 <!-- Page content -->
323</main>
324 
325<style>
326.skip-link {
327 position: absolute;
328 top: -40px;
329 left: 0;
330 background: #000;
331 color: #fff;
332 padding: 8px;
333 text-decoration: none;
334 z-index: 100;
335}
336 
337.skip-link:focus {
338 top: 0;
339}
340</style>
341```
342 
343## ARIA Best Practices
344 
345### ARIA Attributes Reference
346 
347**States:**
348- `aria-checked` - Checkbox/radio state
349- `aria-disabled` - Disabled state
350- `aria-expanded` - Expanded/collapsed state
351- `aria-hidden` - Hidden from assistive technology
352- `aria-pressed` - Toggle button state
353- `aria-selected` - Selected state
354 
355**Properties:**
356- `aria-label` - Accessible name
357- `aria-labelledby` - ID reference for label
358- `aria-describedby` - ID reference for description
359- `aria-live` - Live region updates
360- `aria-required` - Required field
361- `aria-invalid` - Validation state
362 
363### Live Regions
364 
365```html
366<!-- Polite: Wait for pause in speech -->
367<div aria-live="polite" aria-atomic="true">
368 Item added to cart
369</div>
370 
371<!-- Assertive: Interrupt immediately -->
372<div aria-live="assertive" role="alert">
373 Error: Payment failed
374</div>
375 
376<!-- Status message -->
377<div role="status" aria-live="polite">
378 Saving changes...
379</div>
380```
381 
382### Custom Components
383 
384**Accordion:**
385```html
386<div class="accordion">
387 <button
388 aria-expanded="false"
389 aria-controls="panel-1"
390 id="accordion-1"
391 >
392 Section 1
393 </button>
394 <div id="panel-1" role="region" aria-labelledby="accordion-1" hidden>
395 Panel content
396 </div>
397</div>
398```
399 
400**Tabs:**
401```html
402<div role="tablist" aria-label="Content sections">
403 <button
404 role="tab"
405 aria-selected="true"
406 aria-controls="panel-1"
407 id="tab-1"
408 >
409 Tab 1
410 </button>
411 <button
412 role="tab"
413 aria-selected="false"
414 aria-controls="panel-2"
415 id="tab-2"
416 tabindex="-1"
417 >
418 Tab 2
419 </button>
420</div>
421 
422<div role="tabpanel" id="panel-1" aria-labelledby="tab-1">
423 Panel 1 content
424</div>
425<div role="tabpanel" id="panel-2" aria-labelledby="tab-2" hidden>
426 Panel 2 content
427</div>
428```
429 
430## Testing Checklist
431 
432### Automated Testing
433- [ ] Run axe DevTools or WAVE browser extension
434- [ ] Check HTML validation (W3C Validator)
435- [ ] Test color contrast ratios
436- [ ] Verify heading hierarchy
437- [ ] Check for missing alt text
438 
439### Manual Testing
440- [ ] Navigate entire site using only keyboard (Tab, Enter, Escape, Arrow keys)
441- [ ] Test with screen reader (NVDA, JAWS, or VoiceOver)
442- [ ] Verify focus indicators are visible
443- [ ] Check form validation messages are announced
444- [ ] Test modal focus trapping
445- [ ] Verify skip links work
446- [ ] Test with browser zoom at 200%
447- [ ] Check page reflow at different viewport sizes
448- [ ] Disable JavaScript and verify core functionality
449- [ ] Test with Windows High Contrast mode
450 
451### Screen Reader Testing
452 
453**VoiceOver (Mac):**
454- Enable: Cmd + F5
455- Navigate: Control + Option + Arrow keys
456- Read all: Control + Option + A
457 
458**NVDA (Windows):**
459- Navigate: Arrow keys (browse mode) or Tab (focus mode)
460- Read all: NVDA + Down Arrow
461- Elements list: NVDA + F7
462 
463**Test Scenarios:**
464- Can users understand page structure?
465- Are headings descriptive and hierarchical?
466- Are form labels clear and associated?
467- Are error messages announced?
468- Can users complete key tasks without vision?
469 
470## Accessibility Statement
471 
472Include on website:
473 
474```markdown
475# Accessibility Statement
476 
477We are committed to ensuring digital accessibility for people with disabilities. We continually improve the user experience for everyone and apply relevant accessibility standards.
478 
479## Conformance Status
480This website is partially conformant with WCAG 2.1 Level AA. "Partially conformant" means that some parts of the content do not fully conform to the accessibility standard.
481 
482## Feedback
483We welcome your feedback on the accessibility of this site. Please contact us:
484- Email: [email protected]
485- Phone: +1-555-0123
486 
487## Known Issues
488- [List any known accessibility issues and planned fixes]
489 
490Last updated: [Date]
491```
492 
493## Resources
494 
495**Tools:**
496- axe DevTools (browser extension)
497- WAVE (web accessibility evaluation tool)
498- Lighthouse (Chrome DevTools)
499- Colour Contrast Analyser
500- Screen readers: NVDA, JAWS, VoiceOver
501 
502**Guidelines:**
503- WCAG 2.1: https://www.w3.org/WAI/WCAG21/quickref/
504- ARIA Authoring Practices: https://www.w3.org/WAI/ARIA/apg/
505 
506Accessibility is not optional—it's a fundamental requirement for creating inclusive web experiences. Prioritize it from the start of every project, not as an afterthought.
507 

Discussion

Alternatives