Skip to main content
New: Deck Doctor. Upload your deck, get CPO-level feedback. 7-day free trial.
TemplateFREE⏱️ 60-120 minutes

Screen Reader Optimization Template

Optimize your product for screen readers by structuring headings, landmarks, live regions, reading order, and link text.

By Tim Adair• Last updated 2026-03-05
Screen Reader Optimization Template preview

Screen Reader Optimization Template

Free Screen Reader Optimization Template — open and start using immediately

or use email

Instant access. No spam.

Need a custom version?

Forge AI generates PM documents customized to your product, team, and goals. Get a draft in seconds, then refine with AI chat.

Generate with Forge AI

What This Template Is For

Screen readers convert visual interfaces into audio. The user hears the page content, navigates by headings and landmarks, and interacts with forms and controls through keyboard commands. A product that works well visually can be unusable with a screen reader if the underlying structure is wrong: missing headings, unlabeled buttons, images without alt text, dynamic content that changes silently, and reading order that does not match the visual layout.

This template provides a structured optimization guide for making your product work well with screen readers. It covers seven areas: document structure, headings, landmarks, link and button text, forms, dynamic content, and reading order. For each area, you get the requirements, common mistakes, and a verification checklist.

Use this template after the automated checks in the accessibility audit template have been completed. Automated tools catch missing alt text and contrast failures, but they cannot tell you whether the reading order makes sense or whether your headings create a coherent outline. The ARIA checklist template covers the ARIA attributes that make custom widgets accessible to screen readers. For testing the results of your optimization work, the assistive tech testing template provides structured protocols for VoiceOver, NVDA, and TalkBack.


How to Use This Template

  1. Pick a page or user flow to optimize. Work through one page at a time rather than auditing the entire product at once.
  2. For each of the seven areas below, review the page against the checklist criteria.
  3. Open the page in a screen reader as you audit. VoiceOver on macOS (Cmd+F5) or NVDA on Windows (free download) are the most accessible starting points for teams new to screen reader testing.
  4. Document findings with specific page locations and the expected versus actual screen reader behavior.
  5. Fix issues in priority order: document structure and headings first (they affect every user on every page), then forms and dynamic content (they affect specific interactions), then fine-tuning reading order and announcements.
  6. Retest with a screen reader after fixes. Screen reader behavior depends on the browser, so test in at least two browser and screen reader combinations (Safari+VoiceOver and Chrome+NVDA cover the majority of users).

The Template

Optimization Overview

FieldDetails
Product / Feature[Name]
Optimization Lead[Name]
Date[Date]
Pages/Flows Reviewed[List pages or flows]
Screen Readers Tested[VoiceOver + Safari / NVDA + Chrome / etc.]

Area 1: Document Structure

Why it matters: Screen reader users rely on document structure to understand the page's content hierarchy. Without proper structure, the page is a flat stream of text with no way to skip to relevant sections.

CriterionStatusNotes
Every page has exactly one

that describes the page's primary content

Pass / Fail
The </code> element accurately describes the page (announced on page load)</td><td style="padding:0.875rem 1.25rem;color:#d1d5db;border-bottom:1px solid rgba(255,255,255,0.05)"><span class="text-gray-500">☐</span> Pass / <span class="text-gray-500">☐</span> Fail</td></tr><tr style=""><td style="padding:0.875rem 1.25rem;color:#ffffff;font-weight:500;border-bottom:1px solid rgba(255,255,255,0.05)">The <code class="bg-dark-800 px-2 py-1 rounded text-primary text-sm"><html></code> element has a <code class="bg-dark-800 px-2 py-1 rounded text-primary text-sm">lang</code> attribute matching the page language</td><td style="padding:0.875rem 1.25rem;color:#d1d5db;border-bottom:1px solid rgba(255,255,255,0.05)"><span class="text-gray-500">☐</span> Pass / <span class="text-gray-500">☐</span> Fail</td></tr><tr style="background:rgba(255,255,255,0.02)"><td style="padding:0.875rem 1.25rem;color:#ffffff;font-weight:500;border-bottom:1px solid rgba(255,255,255,0.05)">Lists use <code class="bg-dark-800 px-2 py-1 rounded text-primary text-sm"><ul></code>, <code class="bg-dark-800 px-2 py-1 rounded text-primary text-sm"><ol></code>, or <code class="bg-dark-800 px-2 py-1 rounded text-primary text-sm"><dl></code> elements (not styled <code class="bg-dark-800 px-2 py-1 rounded text-primary text-sm"><div></code> elements)</td><td style="padding:0.875rem 1.25rem;color:#d1d5db;border-bottom:1px solid rgba(255,255,255,0.05)"><span class="text-gray-500">☐</span> Pass / <span class="text-gray-500">☐</span> Fail</td></tr><tr style=""><td style="padding:0.875rem 1.25rem;color:#ffffff;font-weight:500;border-bottom:1px solid rgba(255,255,255,0.05)">Data tables use <code class="bg-dark-800 px-2 py-1 rounded text-primary text-sm"><table></code> with <code class="bg-dark-800 px-2 py-1 rounded text-primary text-sm"><th></code> for headers and <code class="bg-dark-800 px-2 py-1 rounded text-primary text-sm"><caption></code> for the table title</td><td style="padding:0.875rem 1.25rem;color:#d1d5db;border-bottom:1px solid rgba(255,255,255,0.05)"><span class="text-gray-500">☐</span> Pass / <span class="text-gray-500">☐</span> Fail</td></tr><tr style="background:rgba(255,255,255,0.02)"><td style="padding:0.875rem 1.25rem;color:#ffffff;font-weight:500;border-bottom:1px solid rgba(255,255,255,0.05)">Layout tables are not used (use CSS grid or flexbox instead)</td><td style="padding:0.875rem 1.25rem;color:#d1d5db;border-bottom:1px solid rgba(255,255,255,0.05)"><span class="text-gray-500">☐</span> Pass / <span class="text-gray-500">☐</span> Fail</td></tr><tr style=""><td style="padding:0.875rem 1.25rem;color:#ffffff;font-weight:500;border-bottom:1px solid rgba(255,255,255,0.05)"><code class="bg-dark-800 px-2 py-1 rounded text-primary text-sm"><main></code>, <code class="bg-dark-800 px-2 py-1 rounded text-primary text-sm"><nav></code>, <code class="bg-dark-800 px-2 py-1 rounded text-primary text-sm"><header></code>, <code class="bg-dark-800 px-2 py-1 rounded text-primary text-sm"><footer></code>, and <code class="bg-dark-800 px-2 py-1 rounded text-primary text-sm"><aside></code> elements define page regions</td><td style="padding:0.875rem 1.25rem;color:#d1d5db;border-bottom:1px solid rgba(255,255,255,0.05)"><span class="text-gray-500">☐</span> Pass / <span class="text-gray-500">☐</span> Fail</td></tr><tr style="background:rgba(255,255,255,0.02)"><td style="padding:0.875rem 1.25rem;color:#ffffff;font-weight:500;border-bottom:1px solid rgba(255,255,255,0.05)">Sections of different languages are marked with <code class="bg-dark-800 px-2 py-1 rounded text-primary text-sm">lang</code> attributes</td><td style="padding:0.875rem 1.25rem;color:#d1d5db;border-bottom:1px solid rgba(255,255,255,0.05)"><span class="text-gray-500">☐</span> Pass / <span class="text-gray-500">☐</span> Fail</td></tr></tbody></table></div> <hr class="my-12 border-white/10" /> <h3 id="area-2-heading-hierarchy" class="text-2xl font-bold mt-8 mb-4 text-white">Area 2: Heading Hierarchy</h3> <p class="mb-4 leading-relaxed text-gray-300"><strong class="text-white">Why it matters:</strong> Screen reader users navigate by headings more than any other method. The WebAIM <a href="/glossary/survey" class="text-primary hover:text-primary-light underline" title="Survey">survey</a> found that 67.5% of screen reader users use headings as their primary navigation method. A correct heading hierarchy lets users jump to the section they want in seconds.</p> <p class="mb-4 leading-relaxed text-gray-300"><strong class="text-white">Rules:</strong></p> <ul class="my-4 list-disc"> <li class="ml-6 mb-2 text-gray-300">One <code class="bg-dark-800 px-2 py-1 rounded text-primary text-sm"><h1></code> per page (the page title)</li> <li class="ml-6 mb-2 text-gray-300">No skipped levels (no <code class="bg-dark-800 px-2 py-1 rounded text-primary text-sm"><h2></code> followed by <code class="bg-dark-800 px-2 py-1 rounded text-primary text-sm"><h4></code>)</li> <li class="ml-6 mb-2 text-gray-300">Headings describe the content that follows (not decorative text)</li> <li class="ml-6 mb-2 text-gray-300">Every major section starts with a heading</li> </ul> <div style="overflow-x:auto;margin:2rem 0;border-radius:0.75rem;border:1px solid rgba(255,255,255,0.1);background:rgba(255,255,255,0.03)"><table style="width:100%;border-collapse:collapse;margin:0"><thead><tr style="background:rgba(255,255,255,0.06)"><th style="text-align:left;padding:0.875rem 1.25rem;font-size:0.875rem;font-weight:600;text-transform:uppercase;letter-spacing:0.05em;color:#06b6d4;border-bottom:1px solid rgba(255,255,255,0.1)">Check</th><th style="text-align:left;padding:0.875rem 1.25rem;font-size:0.875rem;font-weight:600;text-transform:uppercase;letter-spacing:0.05em;color:#06b6d4;border-bottom:1px solid rgba(255,255,255,0.1)">Status</th><th style="text-align:left;padding:0.875rem 1.25rem;font-size:0.875rem;font-weight:600;text-transform:uppercase;letter-spacing:0.05em;color:#06b6d4;border-bottom:1px solid rgba(255,255,255,0.1)">Notes</th></tr></thead><tbody><tr style=""><td style="padding:0.875rem 1.25rem;color:#ffffff;font-weight:500;border-bottom:1px solid rgba(255,255,255,0.05)">Only one <code class="bg-dark-800 px-2 py-1 rounded text-primary text-sm"><h1></code> on the page</td><td style="padding:0.875rem 1.25rem;color:#d1d5db;border-bottom:1px solid rgba(255,255,255,0.05)"><span class="text-gray-500">☐</span> Pass / <span class="text-gray-500">☐</span> Fail</td></tr><tr style="background:rgba(255,255,255,0.02)"><td style="padding:0.875rem 1.25rem;color:#ffffff;font-weight:500;border-bottom:1px solid rgba(255,255,255,0.05)">No skipped heading levels (h1 > h2 > h3 > ...)</td><td style="padding:0.875rem 1.25rem;color:#d1d5db;border-bottom:1px solid rgba(255,255,255,0.05)"><span class="text-gray-500">☐</span> Pass / <span class="text-gray-500">☐</span> Fail</td></tr><tr style=""><td style="padding:0.875rem 1.25rem;color:#ffffff;font-weight:500;border-bottom:1px solid rgba(255,255,255,0.05)">Every section of content has a heading</td><td style="padding:0.875rem 1.25rem;color:#d1d5db;border-bottom:1px solid rgba(255,255,255,0.05)"><span class="text-gray-500">☐</span> Pass / <span class="text-gray-500">☐</span> Fail</td></tr><tr style="background:rgba(255,255,255,0.02)"><td style="padding:0.875rem 1.25rem;color:#ffffff;font-weight:500;border-bottom:1px solid rgba(255,255,255,0.05)">Headings are descriptive (not "Section 1" or styled paragraphs)</td><td style="padding:0.875rem 1.25rem;color:#d1d5db;border-bottom:1px solid rgba(255,255,255,0.05)"><span class="text-gray-500">☐</span> Pass / <span class="text-gray-500">☐</span> Fail</td></tr><tr style=""><td style="padding:0.875rem 1.25rem;color:#ffffff;font-weight:500;border-bottom:1px solid rgba(255,255,255,0.05)">Visual headings use actual heading elements (not bold <code class="bg-dark-800 px-2 py-1 rounded text-primary text-sm"><p></code> or <code class="bg-dark-800 px-2 py-1 rounded text-primary text-sm"><div></code>)</td><td style="padding:0.875rem 1.25rem;color:#d1d5db;border-bottom:1px solid rgba(255,255,255,0.05)"><span class="text-gray-500">☐</span> Pass / <span class="text-gray-500">☐</span> Fail</td></tr><tr style="background:rgba(255,255,255,0.02)"><td style="padding:0.875rem 1.25rem;color:#ffffff;font-weight:500;border-bottom:1px solid rgba(255,255,255,0.05)">Hidden headings (for screen reader navigation) use <code class="bg-dark-800 px-2 py-1 rounded text-primary text-sm">.sr-only</code> class, not <code class="bg-dark-800 px-2 py-1 rounded text-primary text-sm">display:none</code></td><td style="padding:0.875rem 1.25rem;color:#d1d5db;border-bottom:1px solid rgba(255,255,255,0.05)"><span class="text-gray-500">☐</span> Pass / <span class="text-gray-500">☐</span> Fail</td></tr></tbody></table></div> <p class="mb-4 leading-relaxed text-gray-300"><strong class="text-white">Heading outline for this page:</strong></p> <pre class="bg-dark-800 rounded-xl p-4 my-6 overflow-x-auto border border-white/10"><code class="text-sm text-gray-300">h1: [Page title] h2: [Section 1] h3: [Subsection 1.1] h3: [Subsection 1.2] h2: [Section 2] h3: [Subsection 2.1] h2: [Section 3]</code></pre> <p class="mb-4 leading-relaxed text-gray-300">Document the current heading outline above. Flag any deviations from a clean hierarchy.</p> <hr class="my-12 border-white/10" /> <h3 id="area-3-landmarks" class="text-2xl font-bold mt-8 mb-4 text-white">Area 3: Landmarks</h3> <p class="mb-4 leading-relaxed text-gray-300"><strong class="text-white">Why it matters:</strong> Landmarks are the screen reader equivalent of a page layout. Users jump between landmarks to quickly reach the navigation, main content, search, or footer without Tabbing through every element.</p> <p class="mb-4 leading-relaxed text-gray-300"><strong class="text-white">Required landmarks:</strong></p> <div style="overflow-x:auto;margin:2rem 0;border-radius:0.75rem;border:1px solid rgba(255,255,255,0.1);background:rgba(255,255,255,0.03)"><table style="width:100%;border-collapse:collapse;margin:0"><thead><tr style="background:rgba(255,255,255,0.06)"><th style="text-align:left;padding:0.875rem 1.25rem;font-size:0.875rem;font-weight:600;text-transform:uppercase;letter-spacing:0.05em;color:#06b6d4;border-bottom:1px solid rgba(255,255,255,0.1)">Landmark</th><th style="text-align:left;padding:0.875rem 1.25rem;font-size:0.875rem;font-weight:600;text-transform:uppercase;letter-spacing:0.05em;color:#06b6d4;border-bottom:1px solid rgba(255,255,255,0.1)">HTML Element</th><th style="text-align:left;padding:0.875rem 1.25rem;font-size:0.875rem;font-weight:600;text-transform:uppercase;letter-spacing:0.05em;color:#06b6d4;border-bottom:1px solid rgba(255,255,255,0.1)">Required?</th><th style="text-align:left;padding:0.875rem 1.25rem;font-size:0.875rem;font-weight:600;text-transform:uppercase;letter-spacing:0.05em;color:#06b6d4;border-bottom:1px solid rgba(255,255,255,0.1)">Content</th></tr></thead><tbody><tr style=""><td style="padding:0.875rem 1.25rem;color:#ffffff;font-weight:500;border-bottom:1px solid rgba(255,255,255,0.05)">Banner</td><td style="padding:0.875rem 1.25rem;color:#d1d5db;border-bottom:1px solid rgba(255,255,255,0.05)"><code class="bg-dark-800 px-2 py-1 rounded text-primary text-sm"><header></code></td><td style="padding:0.875rem 1.25rem;color:#d1d5db;border-bottom:1px solid rgba(255,255,255,0.05)">Yes (one per page)</td><td style="padding:0.875rem 1.25rem;color:#d1d5db;border-bottom:1px solid rgba(255,255,255,0.05)">Site header with logo and navigation</td></tr><tr style="background:rgba(255,255,255,0.02)"><td style="padding:0.875rem 1.25rem;color:#ffffff;font-weight:500;border-bottom:1px solid rgba(255,255,255,0.05)">Navigation</td><td style="padding:0.875rem 1.25rem;color:#d1d5db;border-bottom:1px solid rgba(255,255,255,0.05)"><code class="bg-dark-800 px-2 py-1 rounded text-primary text-sm"><nav></code></td><td style="padding:0.875rem 1.25rem;color:#d1d5db;border-bottom:1px solid rgba(255,255,255,0.05)">Yes (one or more)</td><td style="padding:0.875rem 1.25rem;color:#d1d5db;border-bottom:1px solid rgba(255,255,255,0.05)">Primary and secondary navigation menus</td></tr><tr style=""><td style="padding:0.875rem 1.25rem;color:#ffffff;font-weight:500;border-bottom:1px solid rgba(255,255,255,0.05)">Main</td><td style="padding:0.875rem 1.25rem;color:#d1d5db;border-bottom:1px solid rgba(255,255,255,0.05)"><code class="bg-dark-800 px-2 py-1 rounded text-primary text-sm"><main></code></td><td style="padding:0.875rem 1.25rem;color:#d1d5db;border-bottom:1px solid rgba(255,255,255,0.05)">Yes (one per page)</td><td style="padding:0.875rem 1.25rem;color:#d1d5db;border-bottom:1px solid rgba(255,255,255,0.05)">The page's primary content</td></tr><tr style="background:rgba(255,255,255,0.02)"><td style="padding:0.875rem 1.25rem;color:#ffffff;font-weight:500;border-bottom:1px solid rgba(255,255,255,0.05)">Complementary</td><td style="padding:0.875rem 1.25rem;color:#d1d5db;border-bottom:1px solid rgba(255,255,255,0.05)"><code class="bg-dark-800 px-2 py-1 rounded text-primary text-sm"><aside></code></td><td style="padding:0.875rem 1.25rem;color:#d1d5db;border-bottom:1px solid rgba(255,255,255,0.05)">If applicable</td><td style="padding:0.875rem 1.25rem;color:#d1d5db;border-bottom:1px solid rgba(255,255,255,0.05)">Sidebar content, related links</td></tr><tr style=""><td style="padding:0.875rem 1.25rem;color:#ffffff;font-weight:500;border-bottom:1px solid rgba(255,255,255,0.05)">Search</td><td style="padding:0.875rem 1.25rem;color:#d1d5db;border-bottom:1px solid rgba(255,255,255,0.05)"><code class="bg-dark-800 px-2 py-1 rounded text-primary text-sm"><search></code> or <code class="bg-dark-800 px-2 py-1 rounded text-primary text-sm">role="search"</code></td><td style="padding:0.875rem 1.25rem;color:#d1d5db;border-bottom:1px solid rgba(255,255,255,0.05)">If applicable</td><td style="padding:0.875rem 1.25rem;color:#d1d5db;border-bottom:1px solid rgba(255,255,255,0.05)">Site search form</td></tr><tr style="background:rgba(255,255,255,0.02)"><td style="padding:0.875rem 1.25rem;color:#ffffff;font-weight:500;border-bottom:1px solid rgba(255,255,255,0.05)">Content Info</td><td style="padding:0.875rem 1.25rem;color:#d1d5db;border-bottom:1px solid rgba(255,255,255,0.05)"><code class="bg-dark-800 px-2 py-1 rounded text-primary text-sm"><footer></code></td><td style="padding:0.875rem 1.25rem;color:#d1d5db;border-bottom:1px solid rgba(255,255,255,0.05)">Yes (one per page)</td><td style="padding:0.875rem 1.25rem;color:#d1d5db;border-bottom:1px solid rgba(255,255,255,0.05)">Site footer with links and copyright</td></tr></tbody></table></div> <div style="overflow-x:auto;margin:2rem 0;border-radius:0.75rem;border:1px solid rgba(255,255,255,0.1);background:rgba(255,255,255,0.03)"><table style="width:100%;border-collapse:collapse;margin:0"><thead><tr style="background:rgba(255,255,255,0.06)"><th style="text-align:left;padding:0.875rem 1.25rem;font-size:0.875rem;font-weight:600;text-transform:uppercase;letter-spacing:0.05em;color:#06b6d4;border-bottom:1px solid rgba(255,255,255,0.1)">Check</th><th style="text-align:left;padding:0.875rem 1.25rem;font-size:0.875rem;font-weight:600;text-transform:uppercase;letter-spacing:0.05em;color:#06b6d4;border-bottom:1px solid rgba(255,255,255,0.1)">Status</th><th style="text-align:left;padding:0.875rem 1.25rem;font-size:0.875rem;font-weight:600;text-transform:uppercase;letter-spacing:0.05em;color:#06b6d4;border-bottom:1px solid rgba(255,255,255,0.1)">Notes</th></tr></thead><tbody><tr style=""><td style="padding:0.875rem 1.25rem;color:#ffffff;font-weight:500;border-bottom:1px solid rgba(255,255,255,0.05)"><code class="bg-dark-800 px-2 py-1 rounded text-primary text-sm"><main></code> element wraps the primary content</td><td style="padding:0.875rem 1.25rem;color:#d1d5db;border-bottom:1px solid rgba(255,255,255,0.05)"><span class="text-gray-500">☐</span> Pass / <span class="text-gray-500">☐</span> Fail</td></tr><tr style="background:rgba(255,255,255,0.02)"><td style="padding:0.875rem 1.25rem;color:#ffffff;font-weight:500;border-bottom:1px solid rgba(255,255,255,0.05)"><code class="bg-dark-800 px-2 py-1 rounded text-primary text-sm"><header></code> element wraps the site header</td><td style="padding:0.875rem 1.25rem;color:#d1d5db;border-bottom:1px solid rgba(255,255,255,0.05)"><span class="text-gray-500">☐</span> Pass / <span class="text-gray-500">☐</span> Fail</td></tr><tr style=""><td style="padding:0.875rem 1.25rem;color:#ffffff;font-weight:500;border-bottom:1px solid rgba(255,255,255,0.05)"><code class="bg-dark-800 px-2 py-1 rounded text-primary text-sm"><nav></code> elements wrap navigation menus</td><td style="padding:0.875rem 1.25rem;color:#d1d5db;border-bottom:1px solid rgba(255,255,255,0.05)"><span class="text-gray-500">☐</span> Pass / <span class="text-gray-500">☐</span> Fail</td></tr><tr style="background:rgba(255,255,255,0.02)"><td style="padding:0.875rem 1.25rem;color:#ffffff;font-weight:500;border-bottom:1px solid rgba(255,255,255,0.05)">Multiple <code class="bg-dark-800 px-2 py-1 rounded text-primary text-sm"><nav></code> elements each have a unique <code class="bg-dark-800 px-2 py-1 rounded text-primary text-sm">aria-label</code></td><td style="padding:0.875rem 1.25rem;color:#d1d5db;border-bottom:1px solid rgba(255,255,255,0.05)"><span class="text-gray-500">☐</span> Pass / <span class="text-gray-500">☐</span> Fail</td></tr><tr style=""><td style="padding:0.875rem 1.25rem;color:#ffffff;font-weight:500;border-bottom:1px solid rgba(255,255,255,0.05)"><code class="bg-dark-800 px-2 py-1 rounded text-primary text-sm"><footer></code> element wraps the site footer</td><td style="padding:0.875rem 1.25rem;color:#d1d5db;border-bottom:1px solid rgba(255,255,255,0.05)"><span class="text-gray-500">☐</span> Pass / <span class="text-gray-500">☐</span> Fail</td></tr><tr style="background:rgba(255,255,255,0.02)"><td style="padding:0.875rem 1.25rem;color:#ffffff;font-weight:500;border-bottom:1px solid rgba(255,255,255,0.05)">Search form is wrapped in <code class="bg-dark-800 px-2 py-1 rounded text-primary text-sm"><search></code> or <code class="bg-dark-800 px-2 py-1 rounded text-primary text-sm">role="search"</code></td><td style="padding:0.875rem 1.25rem;color:#d1d5db;border-bottom:1px solid rgba(255,255,255,0.05)"><span class="text-gray-500">☐</span> Pass / <span class="text-gray-500">☐</span> Fail</td></tr><tr style=""><td style="padding:0.875rem 1.25rem;color:#ffffff;font-weight:500;border-bottom:1px solid rgba(255,255,255,0.05)">Landmarks do not overlap or nest incorrectly</td><td style="padding:0.875rem 1.25rem;color:#d1d5db;border-bottom:1px solid rgba(255,255,255,0.05)"><span class="text-gray-500">☐</span> Pass / <span class="text-gray-500">☐</span> Fail</td></tr></tbody></table></div> <hr class="my-12 border-white/10" /> <h3 id="area-4-links-and-buttons" class="text-2xl font-bold mt-8 mb-4 text-white">Area 4: Links and Buttons</h3> <p class="mb-4 leading-relaxed text-gray-300"><strong class="text-white">Why it matters:</strong> Screen reader users can pull up a list of all links or buttons on a page. Each link's text must make sense out of context. "Click here," "Read more," and "Learn more" are useless in a link list because they do not describe the destination.</p> <div style="overflow-x:auto;margin:2rem 0;border-radius:0.75rem;border:1px solid rgba(255,255,255,0.1);background:rgba(255,255,255,0.03)"><table style="width:100%;border-collapse:collapse;margin:0"><thead><tr style="background:rgba(255,255,255,0.06)"><th style="text-align:left;padding:0.875rem 1.25rem;font-size:0.875rem;font-weight:600;text-transform:uppercase;letter-spacing:0.05em;color:#06b6d4;border-bottom:1px solid rgba(255,255,255,0.1)">Check</th><th style="text-align:left;padding:0.875rem 1.25rem;font-size:0.875rem;font-weight:600;text-transform:uppercase;letter-spacing:0.05em;color:#06b6d4;border-bottom:1px solid rgba(255,255,255,0.1)">Status</th><th style="text-align:left;padding:0.875rem 1.25rem;font-size:0.875rem;font-weight:600;text-transform:uppercase;letter-spacing:0.05em;color:#06b6d4;border-bottom:1px solid rgba(255,255,255,0.1)">Notes</th></tr></thead><tbody><tr style=""><td style="padding:0.875rem 1.25rem;color:#ffffff;font-weight:500;border-bottom:1px solid rgba(255,255,255,0.05)">Every link's text describes the destination or action</td><td style="padding:0.875rem 1.25rem;color:#d1d5db;border-bottom:1px solid rgba(255,255,255,0.05)"><span class="text-gray-500">☐</span> Pass / <span class="text-gray-500">☐</span> Fail</td></tr><tr style="background:rgba(255,255,255,0.02)"><td style="padding:0.875rem 1.25rem;color:#ffffff;font-weight:500;border-bottom:1px solid rgba(255,255,255,0.05)">No links with generic text ("click here", "read more", "learn more") without <code class="bg-dark-800 px-2 py-1 rounded text-primary text-sm">aria-label</code> context</td><td style="padding:0.875rem 1.25rem;color:#d1d5db;border-bottom:1px solid rgba(255,255,255,0.05)"><span class="text-gray-500">☐</span> Pass / <span class="text-gray-500">☐</span> Fail</td></tr><tr style=""><td style="padding:0.875rem 1.25rem;color:#ffffff;font-weight:500;border-bottom:1px solid rgba(255,255,255,0.05)">Links that open in new tabs/windows indicate this (<code class="bg-dark-800 px-2 py-1 rounded text-primary text-sm">aria-label</code> including "opens in new tab" or visual indicator)</td><td style="padding:0.875rem 1.25rem;color:#d1d5db;border-bottom:1px solid rgba(255,255,255,0.05)"><span class="text-gray-500">☐</span> Pass / <span class="text-gray-500">☐</span> Fail</td></tr><tr style="background:rgba(255,255,255,0.02)"><td style="padding:0.875rem 1.25rem;color:#ffffff;font-weight:500;border-bottom:1px solid rgba(255,255,255,0.05)">Image links have alt text describing the link destination (not the image)</td><td style="padding:0.875rem 1.25rem;color:#d1d5db;border-bottom:1px solid rgba(255,255,255,0.05)"><span class="text-gray-500">☐</span> Pass / <span class="text-gray-500">☐</span> Fail</td></tr><tr style=""><td style="padding:0.875rem 1.25rem;color:#ffffff;font-weight:500;border-bottom:1px solid rgba(255,255,255,0.05)">Buttons use <code class="bg-dark-800 px-2 py-1 rounded text-primary text-sm"><button></code> or <code class="bg-dark-800 px-2 py-1 rounded text-primary text-sm">role="button"</code>, not <code class="bg-dark-800 px-2 py-1 rounded text-primary text-sm"><a></code> without href or <code class="bg-dark-800 px-2 py-1 rounded text-primary text-sm"><div></code></td><td style="padding:0.875rem 1.25rem;color:#d1d5db;border-bottom:1px solid rgba(255,255,255,0.05)"><span class="text-gray-500">☐</span> Pass / <span class="text-gray-500">☐</span> Fail</td></tr><tr style="background:rgba(255,255,255,0.02)"><td style="padding:0.875rem 1.25rem;color:#ffffff;font-weight:500;border-bottom:1px solid rgba(255,255,255,0.05)">Button text describes the action ("Save project" not just "Save" when multiple save actions exist)</td><td style="padding:0.875rem 1.25rem;color:#d1d5db;border-bottom:1px solid rgba(255,255,255,0.05)"><span class="text-gray-500">☐</span> Pass / <span class="text-gray-500">☐</span> Fail</td></tr><tr style=""><td style="padding:0.875rem 1.25rem;color:#ffffff;font-weight:500;border-bottom:1px solid rgba(255,255,255,0.05)">Adjacent links to the same destination are combined (not "Product Image" link + "Product Name" link)</td><td style="padding:0.875rem 1.25rem;color:#d1d5db;border-bottom:1px solid rgba(255,255,255,0.05)"><span class="text-gray-500">☐</span> Pass / <span class="text-gray-500">☐</span> Fail</td></tr><tr style="background:rgba(255,255,255,0.02)"><td style="padding:0.875rem 1.25rem;color:#ffffff;font-weight:500;border-bottom:1px solid rgba(255,255,255,0.05)">Skip-to-content link is the first focusable element on every page</td><td style="padding:0.875rem 1.25rem;color:#d1d5db;border-bottom:1px solid rgba(255,255,255,0.05)"><span class="text-gray-500">☐</span> Pass / <span class="text-gray-500">☐</span> Fail</td></tr></tbody></table></div> <p class="mb-4 leading-relaxed text-gray-300"><strong class="text-white">Common fixes:</strong></p> <div style="overflow-x:auto;margin:2rem 0;border-radius:0.75rem;border:1px solid rgba(255,255,255,0.1);background:rgba(255,255,255,0.03)"><table style="width:100%;border-collapse:collapse;margin:0"><thead><tr style="background:rgba(255,255,255,0.06)"><th style="text-align:left;padding:0.875rem 1.25rem;font-size:0.875rem;font-weight:600;text-transform:uppercase;letter-spacing:0.05em;color:#06b6d4;border-bottom:1px solid rgba(255,255,255,0.1)">Problem</th><th style="text-align:left;padding:0.875rem 1.25rem;font-size:0.875rem;font-weight:600;text-transform:uppercase;letter-spacing:0.05em;color:#06b6d4;border-bottom:1px solid rgba(255,255,255,0.1)">Fix</th></tr></thead><tbody><tr style=""><td style="padding:0.875rem 1.25rem;color:#ffffff;font-weight:500;border-bottom:1px solid rgba(255,255,255,0.05)">"Read more" link</td><td style="padding:0.875rem 1.25rem;color:#d1d5db;border-bottom:1px solid rgba(255,255,255,0.05)">Change to "Read more about [topic]" or use <code class="bg-dark-800 px-2 py-1 rounded text-primary text-sm">aria-label="Read more about [topic]"</code></td></tr><tr style="background:rgba(255,255,255,0.02)"><td style="padding:0.875rem 1.25rem;color:#ffffff;font-weight:500;border-bottom:1px solid rgba(255,255,255,0.05)">Icon-only button</td><td style="padding:0.875rem 1.25rem;color:#d1d5db;border-bottom:1px solid rgba(255,255,255,0.05)">Add <code class="bg-dark-800 px-2 py-1 rounded text-primary text-sm">aria-label="Search"</code> (or whatever the action is)</td></tr><tr style=""><td style="padding:0.875rem 1.25rem;color:#ffffff;font-weight:500;border-bottom:1px solid rgba(255,255,255,0.05)">"Click here"</td><td style="padding:0.875rem 1.25rem;color:#d1d5db;border-bottom:1px solid rgba(255,255,255,0.05)">Rewrite: "Download the Q3 report" instead of "Click here to download"</td></tr><tr style="background:rgba(255,255,255,0.02)"><td style="padding:0.875rem 1.25rem;color:#ffffff;font-weight:500;border-bottom:1px solid rgba(255,255,255,0.05)">Image inside a link</td><td style="padding:0.875rem 1.25rem;color:#d1d5db;border-bottom:1px solid rgba(255,255,255,0.05)">Set alt text to the link destination: "Product <a href="/glossary/roadmap" class="text-primary hover:text-primary-light underline" title="Roadmap">roadmap</a> guide"</td></tr></tbody></table></div> <hr class="my-12 border-white/10" /> <h3 id="area-5-forms" class="text-2xl font-bold mt-8 mb-4 text-white">Area 5: Forms</h3> <p class="mb-4 leading-relaxed text-gray-300"><strong class="text-white">Why it matters:</strong> Forms are where screen reader users perform actions: logging in, searching, filling out profiles, making purchases. A form without proper labels is like a paper form where someone erased all the questions but left the blank lines.</p> <div style="overflow-x:auto;margin:2rem 0;border-radius:0.75rem;border:1px solid rgba(255,255,255,0.1);background:rgba(255,255,255,0.03)"><table style="width:100%;border-collapse:collapse;margin:0"><thead><tr style="background:rgba(255,255,255,0.06)"><th style="text-align:left;padding:0.875rem 1.25rem;font-size:0.875rem;font-weight:600;text-transform:uppercase;letter-spacing:0.05em;color:#06b6d4;border-bottom:1px solid rgba(255,255,255,0.1)">Check</th><th style="text-align:left;padding:0.875rem 1.25rem;font-size:0.875rem;font-weight:600;text-transform:uppercase;letter-spacing:0.05em;color:#06b6d4;border-bottom:1px solid rgba(255,255,255,0.1)">Status</th><th style="text-align:left;padding:0.875rem 1.25rem;font-size:0.875rem;font-weight:600;text-transform:uppercase;letter-spacing:0.05em;color:#06b6d4;border-bottom:1px solid rgba(255,255,255,0.1)">Notes</th></tr></thead><tbody><tr style=""><td style="padding:0.875rem 1.25rem;color:#ffffff;font-weight:500;border-bottom:1px solid rgba(255,255,255,0.05)">Every form field has a visible <code class="bg-dark-800 px-2 py-1 rounded text-primary text-sm"><label></code> element associated via <code class="bg-dark-800 px-2 py-1 rounded text-primary text-sm">for</code>/<code class="bg-dark-800 px-2 py-1 rounded text-primary text-sm">id</code></td><td style="padding:0.875rem 1.25rem;color:#d1d5db;border-bottom:1px solid rgba(255,255,255,0.05)"><span class="text-gray-500">☐</span> Pass / <span class="text-gray-500">☐</span> Fail</td></tr><tr style="background:rgba(255,255,255,0.02)"><td style="padding:0.875rem 1.25rem;color:#ffffff;font-weight:500;border-bottom:1px solid rgba(255,255,255,0.05)">Required fields are indicated in the label (not just by asterisk color)</td><td style="padding:0.875rem 1.25rem;color:#d1d5db;border-bottom:1px solid rgba(255,255,255,0.05)"><span class="text-gray-500">☐</span> Pass / <span class="text-gray-500">☐</span> Fail</td></tr><tr style=""><td style="padding:0.875rem 1.25rem;color:#ffffff;font-weight:500;border-bottom:1px solid rgba(255,255,255,0.05)">Form groups use <code class="bg-dark-800 px-2 py-1 rounded text-primary text-sm"><fieldset></code> and <code class="bg-dark-800 px-2 py-1 rounded text-primary text-sm"><legend></code> (radio groups, checkbox groups, address blocks)</td><td style="padding:0.875rem 1.25rem;color:#d1d5db;border-bottom:1px solid rgba(255,255,255,0.05)"><span class="text-gray-500">☐</span> Pass / <span class="text-gray-500">☐</span> Fail</td></tr><tr style="background:rgba(255,255,255,0.02)"><td style="padding:0.875rem 1.25rem;color:#ffffff;font-weight:500;border-bottom:1px solid rgba(255,255,255,0.05)">Error messages are associated with their fields via <code class="bg-dark-800 px-2 py-1 rounded text-primary text-sm">aria-describedby</code></td><td style="padding:0.875rem 1.25rem;color:#d1d5db;border-bottom:1px solid rgba(255,255,255,0.05)"><span class="text-gray-500">☐</span> Pass / <span class="text-gray-500">☐</span> Fail</td></tr><tr style=""><td style="padding:0.875rem 1.25rem;color:#ffffff;font-weight:500;border-bottom:1px solid rgba(255,255,255,0.05)">Error messages are announced when they appear (via <code class="bg-dark-800 px-2 py-1 rounded text-primary text-sm">aria-live</code> or <code class="bg-dark-800 px-2 py-1 rounded text-primary text-sm">role="alert"</code>)</td><td style="padding:0.875rem 1.25rem;color:#d1d5db;border-bottom:1px solid rgba(255,255,255,0.05)"><span class="text-gray-500">☐</span> Pass / <span class="text-gray-500">☐</span> Fail</td></tr><tr style="background:rgba(255,255,255,0.02)"><td style="padding:0.875rem 1.25rem;color:#ffffff;font-weight:500;border-bottom:1px solid rgba(255,255,255,0.05)">Form validation errors identify the field and describe the error</td><td style="padding:0.875rem 1.25rem;color:#d1d5db;border-bottom:1px solid rgba(255,255,255,0.05)"><span class="text-gray-500">☐</span> Pass / <span class="text-gray-500">☐</span> Fail</td></tr><tr style=""><td style="padding:0.875rem 1.25rem;color:#ffffff;font-weight:500;border-bottom:1px solid rgba(255,255,255,0.05)">Autocomplete attributes are set for common fields (name, email, address, phone)</td><td style="padding:0.875rem 1.25rem;color:#d1d5db;border-bottom:1px solid rgba(255,255,255,0.05)"><span class="text-gray-500">☐</span> Pass / <span class="text-gray-500">☐</span> Fail</td></tr><tr style="background:rgba(255,255,255,0.02)"><td style="padding:0.875rem 1.25rem;color:#ffffff;font-weight:500;border-bottom:1px solid rgba(255,255,255,0.05)">Submit button text describes the action ("Create account", not just "Submit")</td><td style="padding:0.875rem 1.25rem;color:#d1d5db;border-bottom:1px solid rgba(255,255,255,0.05)"><span class="text-gray-500">☐</span> Pass / <span class="text-gray-500">☐</span> Fail</td></tr><tr style=""><td style="padding:0.875rem 1.25rem;color:#ffffff;font-weight:500;border-bottom:1px solid rgba(255,255,255,0.05)">Placeholder text is not the only label (screen readers may not announce it reliably)</td><td style="padding:0.875rem 1.25rem;color:#d1d5db;border-bottom:1px solid rgba(255,255,255,0.05)"><span class="text-gray-500">☐</span> Pass / <span class="text-gray-500">☐</span> Fail</td></tr><tr style="background:rgba(255,255,255,0.02)"><td style="padding:0.875rem 1.25rem;color:#ffffff;font-weight:500;border-bottom:1px solid rgba(255,255,255,0.05)">Form instructions appear before the form, not after</td><td style="padding:0.875rem 1.25rem;color:#d1d5db;border-bottom:1px solid rgba(255,255,255,0.05)"><span class="text-gray-500">☐</span> Pass / <span class="text-gray-500">☐</span> Fail</td></tr></tbody></table></div> <hr class="my-12 border-white/10" /> <h3 id="area-6-dynamic-content" class="text-2xl font-bold mt-8 mb-4 text-white">Area 6: Dynamic Content</h3> <p class="mb-4 leading-relaxed text-gray-300"><strong class="text-white">Why it matters:</strong> Screen readers read a snapshot of the page at load time. When content changes dynamically (search results update, a toast appears, a counter increments, new chat messages arrive), the screen reader does not know about it unless ARIA live regions announce the change.</p> <div style="overflow-x:auto;margin:2rem 0;border-radius:0.75rem;border:1px solid rgba(255,255,255,0.1);background:rgba(255,255,255,0.03)"><table style="width:100%;border-collapse:collapse;margin:0"><thead><tr style="background:rgba(255,255,255,0.06)"><th style="text-align:left;padding:0.875rem 1.25rem;font-size:0.875rem;font-weight:600;text-transform:uppercase;letter-spacing:0.05em;color:#06b6d4;border-bottom:1px solid rgba(255,255,255,0.1)">Check</th><th style="text-align:left;padding:0.875rem 1.25rem;font-size:0.875rem;font-weight:600;text-transform:uppercase;letter-spacing:0.05em;color:#06b6d4;border-bottom:1px solid rgba(255,255,255,0.1)">Status</th><th style="text-align:left;padding:0.875rem 1.25rem;font-size:0.875rem;font-weight:600;text-transform:uppercase;letter-spacing:0.05em;color:#06b6d4;border-bottom:1px solid rgba(255,255,255,0.1)">Notes</th></tr></thead><tbody><tr style=""><td style="padding:0.875rem 1.25rem;color:#ffffff;font-weight:500;border-bottom:1px solid rgba(255,255,255,0.05)">Success and error notifications use <code class="bg-dark-800 px-2 py-1 rounded text-primary text-sm">aria-live</code> regions or <code class="bg-dark-800 px-2 py-1 rounded text-primary text-sm">role="alert"</code>/<code class="bg-dark-800 px-2 py-1 rounded text-primary text-sm">role="status"</code></td><td style="padding:0.875rem 1.25rem;color:#d1d5db;border-bottom:1px solid rgba(255,255,255,0.05)"><span class="text-gray-500">☐</span> Pass / <span class="text-gray-500">☐</span> Fail</td></tr><tr style="background:rgba(255,255,255,0.02)"><td style="padding:0.875rem 1.25rem;color:#ffffff;font-weight:500;border-bottom:1px solid rgba(255,255,255,0.05)">Live regions exist in the DOM at page load (not dynamically created)</td><td style="padding:0.875rem 1.25rem;color:#d1d5db;border-bottom:1px solid rgba(255,255,255,0.05)"><span class="text-gray-500">☐</span> Pass / <span class="text-gray-500">☐</span> Fail</td></tr><tr style=""><td style="padding:0.875rem 1.25rem;color:#ffffff;font-weight:500;border-bottom:1px solid rgba(255,255,255,0.05)">Search results count is announced when results update ("12 results found")</td><td style="padding:0.875rem 1.25rem;color:#d1d5db;border-bottom:1px solid rgba(255,255,255,0.05)"><span class="text-gray-500">☐</span> Pass / <span class="text-gray-500">☐</span> Fail</td></tr><tr style="background:rgba(255,255,255,0.02)"><td style="padding:0.875rem 1.25rem;color:#ffffff;font-weight:500;border-bottom:1px solid rgba(255,255,255,0.05)">Loading states are announced ("Loading..." when starting, "Content loaded" when done)</td><td style="padding:0.875rem 1.25rem;color:#d1d5db;border-bottom:1px solid rgba(255,255,255,0.05)"><span class="text-gray-500">☐</span> Pass / <span class="text-gray-500">☐</span> Fail</td></tr><tr style=""><td style="padding:0.875rem 1.25rem;color:#ffffff;font-weight:500;border-bottom:1px solid rgba(255,255,255,0.05)">Chat messages or real-time updates use <code class="bg-dark-800 px-2 py-1 rounded text-primary text-sm">aria-live="polite"</code> (not <code class="bg-dark-800 px-2 py-1 rounded text-primary text-sm">assertive</code>)</td><td style="padding:0.875rem 1.25rem;color:#d1d5db;border-bottom:1px solid rgba(255,255,255,0.05)"><span class="text-gray-500">☐</span> Pass / <span class="text-gray-500">☐</span> Fail</td></tr><tr style="background:rgba(255,255,255,0.02)"><td style="padding:0.875rem 1.25rem;color:#ffffff;font-weight:500;border-bottom:1px solid rgba(255,255,255,0.05)">Page content that changes without a full reload updates the <code class="bg-dark-800 px-2 py-1 rounded text-primary text-sm"><title></code> and focus position</td><td style="padding:0.875rem 1.25rem;color:#d1d5db;border-bottom:1px solid rgba(255,255,255,0.05)"><span class="text-gray-500">☐</span> Pass / <span class="text-gray-500">☐</span> Fail</td></tr><tr style=""><td style="padding:0.875rem 1.25rem;color:#ffffff;font-weight:500;border-bottom:1px solid rgba(255,255,255,0.05)">Modals, drawers, and popovers manage focus correctly (see focus management patterns)</td><td style="padding:0.875rem 1.25rem;color:#d1d5db;border-bottom:1px solid rgba(255,255,255,0.05)"><span class="text-gray-500">☐</span> Pass / <span class="text-gray-500">☐</span> Fail</td></tr><tr style="background:rgba(255,255,255,0.02)"><td style="padding:0.875rem 1.25rem;color:#ffffff;font-weight:500;border-bottom:1px solid rgba(255,255,255,0.05)">Content removed from the page does not orphan the user's focus position</td><td style="padding:0.875rem 1.25rem;color:#d1d5db;border-bottom:1px solid rgba(255,255,255,0.05)"><span class="text-gray-500">☐</span> Pass / <span class="text-gray-500">☐</span> Fail</td></tr></tbody></table></div> <hr class="my-12 border-white/10" /> <h3 id="area-7-reading-order" class="text-2xl font-bold mt-8 mb-4 text-white">Area 7: Reading Order</h3> <p class="mb-4 leading-relaxed text-gray-300"><strong class="text-white">Why it matters:</strong> Screen readers read the DOM in source order, not visual order. If CSS positions a sidebar visually on the right but the sidebar's HTML comes before the main content in the source, screen reader users hear the sidebar first. Similarly, CSS <code class="bg-dark-800 px-2 py-1 rounded text-primary text-sm">order</code> in flexbox can create visual reordering that does not match the DOM order.</p> <div style="overflow-x:auto;margin:2rem 0;border-radius:0.75rem;border:1px solid rgba(255,255,255,0.1);background:rgba(255,255,255,0.03)"><table style="width:100%;border-collapse:collapse;margin:0"><thead><tr style="background:rgba(255,255,255,0.06)"><th style="text-align:left;padding:0.875rem 1.25rem;font-size:0.875rem;font-weight:600;text-transform:uppercase;letter-spacing:0.05em;color:#06b6d4;border-bottom:1px solid rgba(255,255,255,0.1)">Check</th><th style="text-align:left;padding:0.875rem 1.25rem;font-size:0.875rem;font-weight:600;text-transform:uppercase;letter-spacing:0.05em;color:#06b6d4;border-bottom:1px solid rgba(255,255,255,0.1)">Status</th><th style="text-align:left;padding:0.875rem 1.25rem;font-size:0.875rem;font-weight:600;text-transform:uppercase;letter-spacing:0.05em;color:#06b6d4;border-bottom:1px solid rgba(255,255,255,0.1)">Notes</th></tr></thead><tbody><tr style=""><td style="padding:0.875rem 1.25rem;color:#ffffff;font-weight:500;border-bottom:1px solid rgba(255,255,255,0.05)">DOM order matches the visual reading order (top-to-bottom, left-to-right for LTR)</td><td style="padding:0.875rem 1.25rem;color:#d1d5db;border-bottom:1px solid rgba(255,255,255,0.05)"><span class="text-gray-500">☐</span> Pass / <span class="text-gray-500">☐</span> Fail</td></tr><tr style="background:rgba(255,255,255,0.02)"><td style="padding:0.875rem 1.25rem;color:#ffffff;font-weight:500;border-bottom:1px solid rgba(255,255,255,0.05)">CSS <code class="bg-dark-800 px-2 py-1 rounded text-primary text-sm">order</code>, <code class="bg-dark-800 px-2 py-1 rounded text-primary text-sm">position: absolute</code>, and flexbox/grid reordering do not create confusing sequences</td><td style="padding:0.875rem 1.25rem;color:#d1d5db;border-bottom:1px solid rgba(255,255,255,0.05)"><span class="text-gray-500">☐</span> Pass / <span class="text-gray-500">☐</span> Fail</td></tr><tr style=""><td style="padding:0.875rem 1.25rem;color:#ffffff;font-weight:500;border-bottom:1px solid rgba(255,255,255,0.05)">Visually hidden content (<code class="bg-dark-800 px-2 py-1 rounded text-primary text-sm">.sr-only</code>) appears in a logical position in the DOM</td><td style="padding:0.875rem 1.25rem;color:#d1d5db;border-bottom:1px solid rgba(255,255,255,0.05)"><span class="text-gray-500">☐</span> Pass / <span class="text-gray-500">☐</span> Fail</td></tr><tr style="background:rgba(255,255,255,0.02)"><td style="padding:0.875rem 1.25rem;color:#ffffff;font-weight:500;border-bottom:1px solid rgba(255,255,255,0.05)">Content injected via JavaScript appears in the correct DOM position</td><td style="padding:0.875rem 1.25rem;color:#d1d5db;border-bottom:1px solid rgba(255,255,255,0.05)"><span class="text-gray-500">☐</span> Pass / <span class="text-gray-500">☐</span> Fail</td></tr><tr style=""><td style="padding:0.875rem 1.25rem;color:#ffffff;font-weight:500;border-bottom:1px solid rgba(255,255,255,0.05)"><code class="bg-dark-800 px-2 py-1 rounded text-primary text-sm">tabindex</code> values do not override the natural tab order (no <code class="bg-dark-800 px-2 py-1 rounded text-primary text-sm">tabindex</code> > 0)</td><td style="padding:0.875rem 1.25rem;color:#d1d5db;border-bottom:1px solid rgba(255,255,255,0.05)"><span class="text-gray-500">☐</span> Pass / <span class="text-gray-500">☐</span> Fail</td></tr></tbody></table></div> <p class="mb-4 leading-relaxed text-gray-300"><strong class="text-white">How to verify:</strong> Use the browser's accessibility tree (Chrome DevTools > Elements > Accessibility tab) to see the order screen readers will follow. Compare it to the visual layout.</p> <hr class="my-12 border-white/10" /> <h3 id="page-optimization-summary" class="text-2xl font-bold mt-8 mb-4 text-white">Page Optimization Summary</h3> <div style="overflow-x:auto;margin:2rem 0;border-radius:0.75rem;border:1px solid rgba(255,255,255,0.1);background:rgba(255,255,255,0.03)"><table style="width:100%;border-collapse:collapse;margin:0"><thead><tr style="background:rgba(255,255,255,0.06)"><th style="text-align:left;padding:0.875rem 1.25rem;font-size:0.875rem;font-weight:600;text-transform:uppercase;letter-spacing:0.05em;color:#06b6d4;border-bottom:1px solid rgba(255,255,255,0.1)">Area</th><th style="text-align:left;padding:0.875rem 1.25rem;font-size:0.875rem;font-weight:600;text-transform:uppercase;letter-spacing:0.05em;color:#06b6d4;border-bottom:1px solid rgba(255,255,255,0.1)">Criteria</th><th style="text-align:left;padding:0.875rem 1.25rem;font-size:0.875rem;font-weight:600;text-transform:uppercase;letter-spacing:0.05em;color:#06b6d4;border-bottom:1px solid rgba(255,255,255,0.1)">Pass</th><th style="text-align:left;padding:0.875rem 1.25rem;font-size:0.875rem;font-weight:600;text-transform:uppercase;letter-spacing:0.05em;color:#06b6d4;border-bottom:1px solid rgba(255,255,255,0.1)">Fail</th><th style="text-align:left;padding:0.875rem 1.25rem;font-size:0.875rem;font-weight:600;text-transform:uppercase;letter-spacing:0.05em;color:#06b6d4;border-bottom:1px solid rgba(255,255,255,0.1)">Priority Fixes</th></tr></thead><tbody><tr style=""><td style="padding:0.875rem 1.25rem;color:#ffffff;font-weight:500;border-bottom:1px solid rgba(255,255,255,0.05)">Document Structure</td><td style="padding:0.875rem 1.25rem;color:#d1d5db;border-bottom:1px solid rgba(255,255,255,0.05)">8</td></tr><tr style="background:rgba(255,255,255,0.02)"><td style="padding:0.875rem 1.25rem;color:#ffffff;font-weight:500;border-bottom:1px solid rgba(255,255,255,0.05)">Heading Hierarchy</td><td style="padding:0.875rem 1.25rem;color:#d1d5db;border-bottom:1px solid rgba(255,255,255,0.05)">6</td></tr><tr style=""><td style="padding:0.875rem 1.25rem;color:#ffffff;font-weight:500;border-bottom:1px solid rgba(255,255,255,0.05)">Landmarks</td><td style="padding:0.875rem 1.25rem;color:#d1d5db;border-bottom:1px solid rgba(255,255,255,0.05)">7</td></tr><tr style="background:rgba(255,255,255,0.02)"><td style="padding:0.875rem 1.25rem;color:#ffffff;font-weight:500;border-bottom:1px solid rgba(255,255,255,0.05)">Links and Buttons</td><td style="padding:0.875rem 1.25rem;color:#d1d5db;border-bottom:1px solid rgba(255,255,255,0.05)">8</td></tr><tr style=""><td style="padding:0.875rem 1.25rem;color:#ffffff;font-weight:500;border-bottom:1px solid rgba(255,255,255,0.05)">Forms</td><td style="padding:0.875rem 1.25rem;color:#d1d5db;border-bottom:1px solid rgba(255,255,255,0.05)">10</td></tr><tr style="background:rgba(255,255,255,0.02)"><td style="padding:0.875rem 1.25rem;color:#ffffff;font-weight:500;border-bottom:1px solid rgba(255,255,255,0.05)">Dynamic Content</td><td style="padding:0.875rem 1.25rem;color:#d1d5db;border-bottom:1px solid rgba(255,255,255,0.05)">8</td></tr><tr style=""><td style="padding:0.875rem 1.25rem;color:#ffffff;font-weight:500;border-bottom:1px solid rgba(255,255,255,0.05)">Reading Order</td><td style="padding:0.875rem 1.25rem;color:#d1d5db;border-bottom:1px solid rgba(255,255,255,0.05)">5</td></tr><tr style="background:rgba(255,255,255,0.02)"><td style="padding:0.875rem 1.25rem;color:#ffffff;font-weight:500;border-bottom:1px solid rgba(255,255,255,0.05)"><strong class="text-white">Total</strong></td><td style="padding:0.875rem 1.25rem;color:#d1d5db;border-bottom:1px solid rgba(255,255,255,0.05)"><strong class="text-white">52</strong></td></tr></tbody></table></div> <hr class="my-12 border-white/10" /> <h3 id="screen-reader-compatibility-notes" class="text-2xl font-bold mt-8 mb-4 text-white">Screen Reader Compatibility Notes</h3> <div style="overflow-x:auto;margin:2rem 0;border-radius:0.75rem;border:1px solid rgba(255,255,255,0.1);background:rgba(255,255,255,0.03)"><table style="width:100%;border-collapse:collapse;margin:0"><thead><tr style="background:rgba(255,255,255,0.06)"><th style="text-align:left;padding:0.875rem 1.25rem;font-size:0.875rem;font-weight:600;text-transform:uppercase;letter-spacing:0.05em;color:#06b6d4;border-bottom:1px solid rgba(255,255,255,0.1)">Feature</th><th style="text-align:left;padding:0.875rem 1.25rem;font-size:0.875rem;font-weight:600;text-transform:uppercase;letter-spacing:0.05em;color:#06b6d4;border-bottom:1px solid rgba(255,255,255,0.1)">VoiceOver (Safari)</th><th style="text-align:left;padding:0.875rem 1.25rem;font-size:0.875rem;font-weight:600;text-transform:uppercase;letter-spacing:0.05em;color:#06b6d4;border-bottom:1px solid rgba(255,255,255,0.1)">NVDA (Chrome)</th><th style="text-align:left;padding:0.875rem 1.25rem;font-size:0.875rem;font-weight:600;text-transform:uppercase;letter-spacing:0.05em;color:#06b6d4;border-bottom:1px solid rgba(255,255,255,0.1)">NVDA (Firefox)</th><th style="text-align:left;padding:0.875rem 1.25rem;font-size:0.875rem;font-weight:600;text-transform:uppercase;letter-spacing:0.05em;color:#06b6d4;border-bottom:1px solid rgba(255,255,255,0.1)">JAWS (Chrome)</th></tr></thead><tbody><tr style=""><td style="padding:0.875rem 1.25rem;color:#ffffff;font-weight:500;border-bottom:1px solid rgba(255,255,255,0.05)"><code class="bg-dark-800 px-2 py-1 rounded text-primary text-sm">aria-live="polite"</code></td><td style="padding:0.875rem 1.25rem;color:#d1d5db;border-bottom:1px solid rgba(255,255,255,0.05)">Supported</td><td style="padding:0.875rem 1.25rem;color:#d1d5db;border-bottom:1px solid rgba(255,255,255,0.05)">Supported</td><td style="padding:0.875rem 1.25rem;color:#d1d5db;border-bottom:1px solid rgba(255,255,255,0.05)">Supported</td><td style="padding:0.875rem 1.25rem;color:#d1d5db;border-bottom:1px solid rgba(255,255,255,0.05)">Supported</td></tr><tr style="background:rgba(255,255,255,0.02)"><td style="padding:0.875rem 1.25rem;color:#ffffff;font-weight:500;border-bottom:1px solid rgba(255,255,255,0.05)"><code class="bg-dark-800 px-2 py-1 rounded text-primary text-sm">role="switch"</code></td><td style="padding:0.875rem 1.25rem;color:#d1d5db;border-bottom:1px solid rgba(255,255,255,0.05)">Supported</td><td style="padding:0.875rem 1.25rem;color:#d1d5db;border-bottom:1px solid rgba(255,255,255,0.05)">Supported</td><td style="padding:0.875rem 1.25rem;color:#d1d5db;border-bottom:1px solid rgba(255,255,255,0.05)">Supported (recent)</td><td style="padding:0.875rem 1.25rem;color:#d1d5db;border-bottom:1px solid rgba(255,255,255,0.05)">Supported</td></tr><tr style=""><td style="padding:0.875rem 1.25rem;color:#ffffff;font-weight:500;border-bottom:1px solid rgba(255,255,255,0.05)"><code class="bg-dark-800 px-2 py-1 rounded text-primary text-sm"><search></code> landmark</td><td style="padding:0.875rem 1.25rem;color:#d1d5db;border-bottom:1px solid rgba(255,255,255,0.05)">Supported (Safari 17+)</td><td style="padding:0.875rem 1.25rem;color:#d1d5db;border-bottom:1px solid rgba(255,255,255,0.05)">Supported (Chrome 118+)</td><td style="padding:0.875rem 1.25rem;color:#d1d5db;border-bottom:1px solid rgba(255,255,255,0.05)">Supported</td><td style="padding:0.875rem 1.25rem;color:#d1d5db;border-bottom:1px solid rgba(255,255,255,0.05)">Partial</td></tr><tr style="background:rgba(255,255,255,0.02)"><td style="padding:0.875rem 1.25rem;color:#ffffff;font-weight:500;border-bottom:1px solid rgba(255,255,255,0.05)"><code class="bg-dark-800 px-2 py-1 rounded text-primary text-sm">inert</code> attribute</td><td style="padding:0.875rem 1.25rem;color:#d1d5db;border-bottom:1px solid rgba(255,255,255,0.05)">Supported</td><td style="padding:0.875rem 1.25rem;color:#d1d5db;border-bottom:1px solid rgba(255,255,255,0.05)">Supported</td><td style="padding:0.875rem 1.25rem;color:#d1d5db;border-bottom:1px solid rgba(255,255,255,0.05)">Supported</td><td style="padding:0.875rem 1.25rem;color:#d1d5db;border-bottom:1px solid rgba(255,255,255,0.05)">Partial</td></tr><tr style=""><td style="padding:0.875rem 1.25rem;color:#ffffff;font-weight:500;border-bottom:1px solid rgba(255,255,255,0.05)"><code class="bg-dark-800 px-2 py-1 rounded text-primary text-sm">aria-description</code></td><td style="padding:0.875rem 1.25rem;color:#d1d5db;border-bottom:1px solid rgba(255,255,255,0.05)">Supported (Safari 16+)</td><td style="padding:0.875rem 1.25rem;color:#d1d5db;border-bottom:1px solid rgba(255,255,255,0.05)">Supported</td><td style="padding:0.875rem 1.25rem;color:#d1d5db;border-bottom:1px solid rgba(255,255,255,0.05)">Supported</td><td style="padding:0.875rem 1.25rem;color:#d1d5db;border-bottom:1px solid rgba(255,255,255,0.05)">Not supported (use <code class="bg-dark-800 px-2 py-1 rounded text-primary text-sm">aria-describedby</code>)</td></tr><tr style="background:rgba(255,255,255,0.02)"><td style="padding:0.875rem 1.25rem;color:#ffffff;font-weight:500;border-bottom:1px solid rgba(255,255,255,0.05)">CSS <code class="bg-dark-800 px-2 py-1 rounded text-primary text-sm">content</code> in <code class="bg-dark-800 px-2 py-1 rounded text-primary text-sm">::before</code>/<code class="bg-dark-800 px-2 py-1 rounded text-primary text-sm">::after</code></td><td style="padding:0.875rem 1.25rem;color:#d1d5db;border-bottom:1px solid rgba(255,255,255,0.05)">Announced</td><td style="padding:0.875rem 1.25rem;color:#d1d5db;border-bottom:1px solid rgba(255,255,255,0.05)">Announced</td><td style="padding:0.875rem 1.25rem;color:#d1d5db;border-bottom:1px solid rgba(255,255,255,0.05)">Announced</td><td style="padding:0.875rem 1.25rem;color:#d1d5db;border-bottom:1px solid rgba(255,255,255,0.05)">Announced</td></tr></tbody></table></div> <p class="mb-4 leading-relaxed text-gray-300">Check the latest support tables at a11ysupport.io before relying on newer ARIA features.</p></article><section class="mt-16"><h2 class="text-3xl font-bold mb-8 text-white">Frequently Asked Questions</h2><div class="space-y-4"><details class="glass rounded-xl group"><summary class="cursor-pointer p-6 font-semibold text-white flex items-center justify-between list-none"><span>Which screen reader should we prioritize for testing?</span><span class="text-primary ml-4 group-open:rotate-45 transition-transform text-xl">+</span></summary><div class="px-6 pb-6 text-gray-300 leading-relaxed">Prioritize VoiceOver with Safari on macOS and NVDA with Chrome on Windows. These two combinations cover the majority of screen reader users in the 2025 WebAIM survey. If you can only test with one, use NVDA with Chrome because it is free, runs on the most common OS (Windows), and Chrome is the most popular browser. The [accessibility compliance template](/templates/accessibility-compliance-template) includes a decision matrix for choosing your test matrix based on your user demographics.</div></details><details class="glass rounded-xl group"><summary class="cursor-pointer p-6 font-semibold text-white flex items-center justify-between list-none"><span>How do we handle screen reader support for single-page applications?</span><span class="text-primary ml-4 group-open:rotate-45 transition-transform text-xl">+</span></summary><div class="px-6 pb-6 text-gray-300 leading-relaxed">SPAs create unique challenges because page navigations do not trigger a full page load event. Screen readers do not automatically announce the new page. Three things need to happen on every client-side route change: update `document.title` to reflect the new page, move focus to the main content area or page heading, and optionally announce the page transition via an `aria-live` region. The [focus management template](/templates/focus-management-template) covers the focus restoration pattern in detail.</div></details><details class="glass rounded-xl group"><summary class="cursor-pointer p-6 font-semibold text-white flex items-center justify-between list-none"><span>Should we add visually hidden text for screen readers?</span><span class="text-primary ml-4 group-open:rotate-45 transition-transform text-xl">+</span></summary><div class="px-6 pb-6 text-gray-300 leading-relaxed">Use visually hidden text (`.sr-only` or `clip-path` technique) when the visual context provides information that the audio context lacks. Examples: a star rating that shows 4 filled stars needs `.sr-only` text saying "4 out of 5 stars." An icon button needs `.sr-only` text or `aria-label` describing the action. However, do not add hidden text as a band-aid for poor structure. If a heading or label is needed, make it visible rather than hiding it.</div></details><details class="glass rounded-xl group"><summary class="cursor-pointer p-6 font-semibold text-white flex items-center justify-between list-none"><span>How do screen readers handle CSS-generated content?</span><span class="text-primary ml-4 group-open:rotate-45 transition-transform text-xl">+</span></summary><div class="px-6 pb-6 text-gray-300 leading-relaxed">Content inserted via CSS `::before` and `::after` pseudo-elements with the `content` property is announced by all major screen readers. This means decorative CSS content (arrows, bullets, icons via `content: "\2022"`) will be read aloud. Use `content: "" / ""` with `aria-hidden="true"` on the parent or the pseudo-element to suppress the announcement, or use SVG icons with `aria-hidden="true"` instead of CSS content.</div></details><details class="glass rounded-xl group"><summary class="cursor-pointer p-6 font-semibold text-white flex items-center justify-between list-none"><span>What is the difference between aria-label and aria-labelledby for screen readers?</span><span class="text-primary ml-4 group-open:rotate-45 transition-transform text-xl">+</span></summary><div class="px-6 pb-6 text-gray-300 leading-relaxed">Both provide an accessible name. `aria-label` takes a string value directly. `aria-labelledby` takes one or more element IDs and reads their text content as the label. `aria-labelledby` is preferred when visible text exists because it stays in sync automatically. `aria-label` is preferred when no visible text exists. Note that `aria-label` on non-interactive elements (like `<div>` or `<span>`) is inconsistently supported. Use it on interactive elements (buttons, inputs, links, landmarks) where support is reliable. The [ARIA checklist template](/templates/aria-checklist-template) covers the full set of ARIA attributes and their correct usage.</div></details></div></section><div class="mt-20 glass rounded-3xl p-12"><h3 class="text-2xl font-bold mb-4">Explore More Templates</h3><p class="text-gray-400 mb-6">Browse our full library of PM templates, or generate a custom version with AI.</p><div class="flex gap-4 flex-wrap"><a class="btn-primary" href="/templates">All Templates</a><a class="px-6 py-3 rounded-full border border-accent-purple text-accent-purple hover:bg-accent-purple/10 transition-all" href="/tools/forge">Generate with AI</a><a class="px-6 py-3 rounded-full border border-white/10 text-gray-400 hover:text-white hover:border-white/20 transition-all" href="/roadmap-templates">Roadmap Templates</a></div></div><div class="mt-16 glass rounded-3xl p-12 text-center"><div class="inline-flex items-center gap-2 bg-primary/20 text-primary px-4 py-2 rounded-full text-sm font-semibold mb-6">Free PDF</div><h3 class="text-2xl md:text-3xl font-bold mb-3 text-white">Like This Template?</h3><p class="text-gray-400 mb-8 max-w-lg mx-auto">Subscribe to get new templates, frameworks, and PM strategies delivered to your inbox.</p><button type="button" class="inline-flex items-center justify-center gap-2 px-6 py-3 rounded-xl bg-white text-gray-800 font-semibold hover:bg-gray-100 transition-all disabled:opacity-50 whitespace-nowrap mb-4"><svg class="w-5 h-5" viewBox="0 0 24 24"><path d="M22.56 12.25c0-.78-.07-1.53-.2-2.25H12v4.26h5.92a5.06 5.06 0 01-2.2 3.32v2.77h3.57c2.08-1.92 3.28-4.74 3.28-8.1z" fill="#4285F4"></path><path d="M12 23c2.97 0 5.46-.98 7.28-2.66l-3.57-2.77c-.98.66-2.23 1.06-3.71 1.06-2.86 0-5.29-1.93-6.16-4.53H2.18v2.84C3.99 20.53 7.7 23 12 23z" fill="#34A853"></path><path d="M5.84 14.09c-.22-.66-.35-1.36-.35-2.09s.13-1.43.35-2.09V7.07H2.18C1.43 8.55 1 10.22 1 12s.43 3.45 1.18 4.93l2.85-2.22.81-.62z" fill="#FBBC05"></path><path d="M12 5.38c1.62 0 3.06.56 4.21 1.64l3.15-3.15C17.45 2.09 14.97 1 12 1 7.7 1 3.99 3.47 2.18 7.07l3.66 2.84c.87-2.6 3.3-4.53 6.16-4.53z" fill="#EA4335"></path></svg>Continue with Google</button><div class="flex items-center gap-3 max-w-lg mx-auto mb-4"><div class="flex-1 border-t border-white/10"></div><span class="text-gray-500 text-xs">or use email</span><div class="flex-1 border-t border-white/10"></div></div><form class="flex flex-col sm:flex-row gap-3 justify-center max-w-lg mx-auto"><input type="text" placeholder="First name" class="sm:w-32 px-5 py-3 rounded-full bg-white/5 border border-white/10 text-white placeholder-gray-500 focus:outline-none focus:border-primary transition-colors" value=""/><input type="email" placeholder="you@company.com" required="" class="flex-1 px-5 py-3 rounded-full bg-white/5 border border-white/10 text-white placeholder-gray-500 focus:outline-none focus:border-primary transition-colors" value=""/><button type="submit" class="btn-primary whitespace-nowrap disabled:opacity-50">Download Free PDF</button></form><p class="text-gray-600 text-xs mt-4">Join 10,000+ product leaders. Instant PDF download.</p><div class="mt-8 pt-8 border-t border-white/10"><p class="text-gray-400 mb-4 text-sm">Want full SaaS idea playbooks with market research?</p><a href="https://ideaplan.outseta.com/auth?widgetMode=register&planUid=aWxLlpWV#o-anonymous" class="btn-secondary text-sm">Explore Ideas Pro →</a></div></div></div><div class="hidden xl:block w-64 flex-shrink-0"><nav class="sticky top-24"><p class="text-xs font-semibold text-gray-500 uppercase tracking-wider mb-4">On this page</p><ul class="space-y-1 border-l border-white/10"><li><button class="block text-sm text-left w-full py-1 transition-colors border-l-2 -ml-px pl-4 border-transparent text-gray-500 hover:text-gray-300 hover:border-white/20">What This Template Is For</button></li><li><button class="block text-sm text-left w-full py-1 transition-colors border-l-2 -ml-px pl-4 border-transparent text-gray-500 hover:text-gray-300 hover:border-white/20">How to Use This Template</button></li><li><button class="block text-sm text-left w-full py-1 transition-colors border-l-2 -ml-px pl-4 border-transparent text-gray-500 hover:text-gray-300 hover:border-white/20">The Template</button></li><li><button class="block text-sm text-left w-full py-1 transition-colors border-l-2 -ml-px pl-6 border-transparent text-gray-500 hover:text-gray-300 hover:border-white/20">Optimization Overview</button></li><li><button class="block text-sm text-left w-full py-1 transition-colors border-l-2 -ml-px pl-6 border-transparent text-gray-500 hover:text-gray-300 hover:border-white/20">Area 1: Document Structure</button></li><li><button class="block text-sm text-left w-full py-1 transition-colors border-l-2 -ml-px pl-6 border-transparent text-gray-500 hover:text-gray-300 hover:border-white/20">Area 2: Heading Hierarchy</button></li><li><button class="block text-sm text-left w-full py-1 transition-colors border-l-2 -ml-px pl-6 border-transparent text-gray-500 hover:text-gray-300 hover:border-white/20">Area 3: Landmarks</button></li><li><button class="block text-sm text-left w-full py-1 transition-colors border-l-2 -ml-px pl-6 border-transparent text-gray-500 hover:text-gray-300 hover:border-white/20">Area 4: Links and Buttons</button></li><li><button class="block text-sm text-left w-full py-1 transition-colors border-l-2 -ml-px pl-6 border-transparent text-gray-500 hover:text-gray-300 hover:border-white/20">Area 5: Forms</button></li><li><button class="block text-sm text-left w-full py-1 transition-colors border-l-2 -ml-px pl-6 border-transparent text-gray-500 hover:text-gray-300 hover:border-white/20">Area 6: Dynamic Content</button></li><li><button class="block text-sm text-left w-full py-1 transition-colors border-l-2 -ml-px pl-6 border-transparent text-gray-500 hover:text-gray-300 hover:border-white/20">Area 7: Reading Order</button></li><li><button class="block text-sm text-left w-full py-1 transition-colors border-l-2 -ml-px pl-6 border-transparent text-gray-500 hover:text-gray-300 hover:border-white/20">Page Optimization Summary</button></li><li><button class="block text-sm text-left w-full py-1 transition-colors border-l-2 -ml-px pl-6 border-transparent text-gray-500 hover:text-gray-300 hover:border-white/20">Screen Reader Compatibility Notes</button></li></ul></nav></div></div></div></div></main><footer class="border-t border-white/10 bg-dark-900"><div class="max-w-7xl mx-auto px-6 py-16"><div class="grid grid-cols-2 md:grid-cols-3 lg:grid-cols-8 gap-12"><div class="col-span-2 md:col-span-3 lg:col-span-2"><a class="flex items-center gap-2 group mb-4" href="/"><div class="w-10 h-10 rounded-xl bg-gradient-primary flex items-center justify-center text-xl font-bold text-white">I</div><span class="text-xl font-bold text-white group-hover:text-primary transition-colors">IdeaPlan</span></a><p class="text-gray-400 text-sm leading-relaxed max-w-xs">Free PM tools, templates, and guides plus the Notion Product OS — everything product managers need in one place.</p></div><div><h3 class="text-white font-semibold text-sm mb-4">Tools & AI</h3><ul class="space-y-3"><li><a class="text-gray-400 hover:text-primary text-sm transition-colors" href="/tools">All 69 Tools</a></li><li><a class="text-gray-400 hover:text-primary text-sm transition-colors" href="/tools/forge">Forge AI Docs</a></li><li><a class="text-gray-400 hover:text-primary text-sm transition-colors" href="/tools/compass">Compass</a></li><li><a class="text-gray-400 hover:text-primary text-sm transition-colors" href="/tools/deck-doctor">Deck Doctor</a></li><li><a class="text-gray-400 hover:text-primary text-sm transition-colors" href="/tools/form-builder">AI Form Builder</a></li><li><a class="text-gray-400 hover:text-primary text-sm transition-colors" href="/loop">Loop PM Assistant</a></li><li><a class="text-gray-400 hover:text-primary text-sm transition-colors" href="/tools/rice-calculator">RICE Calculator</a></li><li><a class="text-gray-400 hover:text-primary text-sm transition-colors" href="/tools/resume-scorer">Resume Scorer</a></li><li><a class="text-gray-400 hover:text-primary text-sm transition-colors" href="/code-templates">Admin Templates</a></li><li><a class="text-gray-400 hover:text-primary text-sm transition-colors" href="/pm-tools">PM Software Directory</a></li><li><a class="text-gray-400 hover:text-primary text-sm transition-colors" href="/compare">Tool Comparisons</a></li><li><a class="text-gray-400 hover:text-primary text-sm transition-colors" href="/alternatives">Alternatives</a></li><li><a class="text-gray-400 hover:text-primary text-sm transition-colors" href="/prompts">PM Prompts</a></li><li><a class="text-gray-400 hover:text-primary text-sm transition-colors" href="/tools/embed">Embed Widgets</a></li></ul></div><div><h3 class="text-white font-semibold text-sm mb-4">Learn</h3><ul class="space-y-3"><li><a class="text-gray-400 hover:text-primary text-sm transition-colors" href="/blog">Blog</a></li><li><a class="text-gray-400 hover:text-primary text-sm transition-colors" href="/guides">Guides</a></li><li><a class="text-gray-400 hover:text-primary text-sm transition-colors" href="/courses">Courses</a></li><li><a class="text-gray-400 hover:text-primary text-sm transition-colors" href="/handbooks">Handbooks</a></li><li><a class="text-gray-400 hover:text-primary text-sm transition-colors" href="/frameworks">Frameworks</a></li><li><a class="text-gray-400 hover:text-primary text-sm transition-colors" href="/case-studies">Case Studies</a></li><li><a class="text-gray-400 hover:text-primary text-sm transition-colors" href="/glossary">Glossary</a></li><li><a class="text-gray-400 hover:text-primary text-sm transition-colors" href="/metrics">Metrics</a></li><li><a class="text-gray-400 hover:text-primary text-sm transition-colors" href="/playbooks">Industry Playbooks</a></li><li><a class="text-gray-400 hover:text-primary text-sm transition-colors" href="/lists">Top Lists</a></li><li><a class="text-gray-400 hover:text-primary text-sm transition-colors" href="/learning-paths">Learning Paths</a></li><li><a class="text-gray-400 hover:text-primary text-sm transition-colors" href="/resources">All Resources</a></li></ul></div><div><h3 class="text-white font-semibold text-sm mb-4">Topic Hubs</h3><ul class="space-y-3"><li><a class="text-gray-400 hover:text-primary text-sm transition-colors" href="/product-management-frameworks">PM Frameworks</a></li><li><a class="text-gray-400 hover:text-primary text-sm transition-colors" href="/product-analytics">Product Analytics</a></li><li><a class="text-gray-400 hover:text-primary text-sm transition-colors" href="/product-led-growth">Product-Led Growth</a></li><li><a class="text-gray-400 hover:text-primary text-sm transition-colors" href="/agile-product-management">Agile PM</a></li><li><a class="text-gray-400 hover:text-primary text-sm transition-colors" href="/saas-metrics">SaaS Metrics</a></li><li><a class="text-gray-400 hover:text-primary text-sm transition-colors" href="/user-research">User Research</a></li><li><a class="text-gray-400 hover:text-primary text-sm transition-colors" href="/product-management-career">PM Career</a></li><li><a class="text-gray-400 hover:text-primary text-sm transition-colors" href="/templates">Templates</a></li><li><a class="text-gray-400 hover:text-primary text-sm transition-colors" href="/roadmap-templates">Roadmap Templates</a></li><li><a class="text-gray-400 hover:text-primary text-sm transition-colors" href="/strategy">Strategy</a></li><li><a class="text-gray-400 hover:text-primary text-sm transition-colors" href="/ai-sdlc">AI SDLC</a></li><li><a class="text-gray-400 hover:text-primary text-sm transition-colors" href="/pm-writing-tools">PM Writing Tools</a></li><li><a class="text-gray-400 hover:text-primary text-sm transition-colors" href="/customer-interview-tools">Interview Tools</a></li></ul></div><div><h3 class="text-white font-semibold text-sm mb-4">Discover</h3><ul class="space-y-3"><li><a class="text-gray-400 hover:text-primary text-sm transition-colors" href="/ideas">SaaS Idea Lab</a></li><li><a class="text-gray-400 hover:text-primary text-sm transition-colors" href="/ideas/trends">Market Trends</a></li><li><a class="text-gray-400 hover:text-primary text-sm transition-colors" href="/interview-questions">Interview Prep</a></li><li><a class="text-gray-400 hover:text-primary text-sm transition-colors" href="/product-manager-salary">PM Salary Guide</a></li><li><a class="text-gray-400 hover:text-primary text-sm transition-colors" href="/jobs">PM Jobs</a></li><li><a class="text-gray-400 hover:text-primary text-sm transition-colors" href="/companies">Company Profiles</a></li><li><a class="text-gray-400 hover:text-primary text-sm transition-colors" href="/games">Daily PM Games</a></li><li><a class="text-gray-400 hover:text-primary text-sm transition-colors" href="/stories">Founder Stories</a></li><li><a class="text-gray-400 hover:text-primary text-sm transition-colors" href="/skill-levels">Skills by Level</a></li><li><a class="text-gray-400 hover:text-primary text-sm transition-colors" href="/industry-salaries">Salary by Industry</a></li><li><a class="text-gray-400 hover:text-primary text-sm transition-colors" href="/industry-tools">Tools by Industry</a></li><li><a class="text-gray-400 hover:text-primary text-sm transition-colors" href="/integrations">Integrations</a></li><li><a class="text-gray-400 hover:text-primary text-sm transition-colors" href="/qa">PM Q&A</a></li><li><a class="text-gray-400 hover:text-primary text-sm transition-colors" href="/state-of-pm">State of PM Report</a></li><li><a class="text-gray-400 hover:text-primary text-sm transition-colors" href="/tools/pm-certification">PM Certification</a></li></ul></div><div><h3 class="text-white font-semibold text-sm mb-4">Developer Tools</h3><ul class="space-y-3"><li><a class="text-gray-400 hover:text-primary text-sm transition-colors" href="/tools/css-gradient-generator">CSS Gradient Generator</a></li><li><a class="text-gray-400 hover:text-primary text-sm transition-colors" href="/tools/css-shadow-generator">CSS Shadow Generator</a></li><li><a class="text-gray-400 hover:text-primary text-sm transition-colors" href="/tools/css-button-generator">CSS Button Generator</a></li><li><a class="text-gray-400 hover:text-primary text-sm transition-colors" href="/tools/color-palette-generator">Color Palette Generator</a></li><li><a class="text-gray-400 hover:text-primary text-sm transition-colors" href="/tools/tailwind-color-generator">Tailwind Color Generator</a></li><li><a class="text-gray-400 hover:text-primary text-sm transition-colors" href="/tools/border-radius-generator">Border Radius Generator</a></li><li><a class="text-gray-400 hover:text-primary text-sm transition-colors" href="/tools/tailwind-css-components">Tailwind CSS Components</a></li><li><a class="text-gray-400 hover:text-primary text-sm transition-colors" href="/tools/tailwind-css-blocks">Tailwind CSS Blocks</a></li><li><a class="text-gray-400 hover:text-primary text-sm transition-colors" href="/tools/utility-css">All Utility CSS</a></li><li><a class="text-gray-400 hover:text-primary text-sm transition-colors" href="/tools/shadcn-resources">All Shadcn Resources</a></li><li><a class="text-gray-400 hover:text-primary text-sm transition-colors" href="/tools/shadcn-components">Shadcn Components</a></li><li><a class="text-gray-400 hover:text-primary text-sm transition-colors" href="/tools/bootstrap-cheatsheet">Bootstrap CheatSheet</a></li><li><a class="text-gray-400 hover:text-primary text-sm transition-colors" href="/tools/vue-cheatsheet">Vue Cheatsheet</a></li><li><a class="text-gray-400 hover:text-primary text-sm transition-colors" href="/tools/figma-tailwind-ui">Figma Tailwind UI</a></li></ul></div><div><h3 class="text-white font-semibold text-sm mb-4">Company</h3><ul class="space-y-3"><li><a class="text-gray-400 hover:text-primary text-sm transition-colors" href="/product-os">Product OS</a></li><li><a class="text-gray-400 hover:text-primary text-sm transition-colors" href="/pricing">Pricing</a></li><li><a class="text-gray-400 hover:text-primary text-sm transition-colors" href="/for/saas-product-managers">For SaaS PMs</a></li><li><a class="text-gray-400 hover:text-primary text-sm transition-colors" href="/for/vp-product">For VPs of Product</a></li><li><a class="text-gray-400 hover:text-primary text-sm transition-colors" href="/for/pm-job-seekers">For PM Job Seekers</a></li><li><a class="text-gray-400 hover:text-primary text-sm transition-colors" href="/state-of-product-management">State of PM 2026</a></li><li><a class="text-gray-400 hover:text-primary text-sm transition-colors" href="/state-of-pm-tools">PM Tools Report</a></li><li><a class="text-gray-400 hover:text-primary text-sm transition-colors" href="/method">The Method</a></li><li><a class="text-gray-400 hover:text-primary text-sm transition-colors" href="/methodology">Data Methodology</a></li><li><a class="text-gray-400 hover:text-primary text-sm transition-colors" href="/changelog">Changelog</a></li><li><a class="text-gray-400 hover:text-primary text-sm transition-colors" href="/newsletter">Newsletter</a></li></ul></div></div><div class="mt-16 pt-8 border-t border-white/10 flex flex-col sm:flex-row items-center justify-between gap-4"><p class="text-gray-400 text-sm">© <!-- -->2026<!-- --> IdeaPlan. All rights reserved.</p><div class="flex items-center gap-6"><a class="text-gray-400 hover:text-primary text-sm transition-colors" href="/feed.xml">RSS Feed</a><a class="text-gray-400 hover:text-primary text-sm transition-colors" href="/sitemap.xml">Sitemap</a></div></div></div></footer><!--$!--><template data-dgst="BAILOUT_TO_CLIENT_SIDE_RENDERING"></template><!--/$--><!--$!--><template data-dgst="BAILOUT_TO_CLIENT_SIDE_RENDERING"></template><!--/$--><!--$!--><template data-dgst="BAILOUT_TO_CLIENT_SIDE_RENDERING"></template><!--/$--><!--$!--><template data-dgst="BAILOUT_TO_CLIENT_SIDE_RENDERING"></template><!--/$--><!--$!--><template data-dgst="BAILOUT_TO_CLIENT_SIDE_RENDERING"></template><!--/$--><script src="/_next/static/chunks/webpack-970a80e21b1d283e.js" async=""></script><script>(self.__next_f=self.__next_f||[]).push([0]);self.__next_f.push([2,null])</script><script>self.__next_f.push([1,"1:HL[\"/_next/static/css/145148df8ad5605a.css\",\"style\"]\n"])</script><script>self.__next_f.push([1,"2:I[12846,[],\"\"]\n5:I[4707,[],\"\"]\n7:I[36423,[],\"\"]\n8:I[27244,[\"2972\",\"static/chunks/2972-18fd1b49b929e6cc.js\",\"29\",\"static/chunks/29-d4c94ceb52581c8f.js\",\"4352\",\"static/chunks/4352-aa5e249d3549fad3.js\",\"7244\",\"static/chunks/7244-3af31be0e4c03916.js\",\"3185\",\"static/chunks/app/layout-9f00bdf11490e278.js\"],\"OutsetaProvider\"]\n9:I[14389,[\"2972\",\"static/chunks/2972-18fd1b49b929e6cc.js\",\"29\",\"static/chunks/29-d4c94ceb52581c8f.js\",\"4352\",\"static/chunks/4352-aa5e249d3549fad3.js\",\"7244\",\"static/chunks/7244-3af31be0e4c03916.js\",\"3185\",\"static/chunks/app/layout-9f00bdf11490e278.js\"],\"default\"]\na:I[20465,[\"2972\",\"static/chunks/2972-18fd1b49b929e6cc.js\",\"29\",\"static/chunks/29-d4c94ceb52581c8f.js\",\"4352\",\"static/chunks/4352-aa5e249d3549fad3.js\",\"7244\",\"static/chunks/7244-3af31be0e4c03916.js\",\"3185\",\"static/chunks/app/layout-9f00bdf11490e278.js\"],\"default\"]\nb:I[14389,[\"2972\",\"static/chunks/2972-18fd1b49b929e6cc.js\",\"29\",\"static/chunks/29-d4c94ceb52581c8f.js\",\"4352\",\"static/chunks/4352-aa5e249d3549fad3.js\",\"7244\",\"static/chunks/7244-3af31be0e4c03916.js\",\"3185\",\"static/chunks/app/layout-9f00bdf11490e278.js\"],\"MainContent\"]\nc:I[72972,[\"2972\",\"static/chunks/2972-18fd1b49b929e6cc.js\",\"29\",\"static/chunks/29-d4c94ceb52581c8f.js\",\"5878\",\"static/chunks/5878-a13f9ad6abef0868.js\",\"7244\",\"static/chunks/7244-3af31be0e4c03916.js\",\"4287\",\"static/chunks/4287-14350f54c06970ce.js\",\"9742\",\"static/chunks/9742-89fc544a2f208867.js\",\"6454\",\"static/chunks/6454-1713bb3dcbe42c11.js\",\"5626\",\"static/chunks/app/(marketing)/templates/%5Bslug%5D/page-a91375ae33733373.js\"],\"\"]\nd:\"$Sreact.suspense\"\ne:I[81523,[\"2972\",\"static/chunks/2972-18fd1b49b929e6cc.js\",\"29\",\"static/chunks/29-d4c94ceb52581c8f.js\",\"4352\",\"static/chunks/4352-aa5e249d3549fad3.js\",\"7244\",\"static/chunks/7244-3af31be0e4c03916.js\",\"3185\",\"static/chunks/app/layout-9f00bdf11490e278.js\"],\"BailoutToCSR\"]\nf:I[92843,[\"2972\",\"static/chunks/2972-18fd1b49b929e6cc.js\",\"29\",\"static/chunks/29-d4c94ceb52581c8f.js\",\"4352\",\"static/chunks/4352-aa5e249d3549fad3.js\",\"7244\",\"static/chunks/7244-3af31be0e4c03916.js\",\"31"])</script><script>self.__next_f.push([1,"85\",\"static/chunks/app/layout-9f00bdf11490e278.js\"],\"default\"]\n10:I[31031,[\"2972\",\"static/chunks/2972-18fd1b49b929e6cc.js\",\"29\",\"static/chunks/29-d4c94ceb52581c8f.js\",\"4352\",\"static/chunks/4352-aa5e249d3549fad3.js\",\"7244\",\"static/chunks/7244-3af31be0e4c03916.js\",\"3185\",\"static/chunks/app/layout-9f00bdf11490e278.js\"],\"default\"]\n11:I[91744,[\"2972\",\"static/chunks/2972-18fd1b49b929e6cc.js\",\"29\",\"static/chunks/29-d4c94ceb52581c8f.js\",\"4352\",\"static/chunks/4352-aa5e249d3549fad3.js\",\"7244\",\"static/chunks/7244-3af31be0e4c03916.js\",\"3185\",\"static/chunks/app/layout-9f00bdf11490e278.js\"],\"default\"]\n12:I[11816,[\"2972\",\"static/chunks/2972-18fd1b49b929e6cc.js\",\"29\",\"static/chunks/29-d4c94ceb52581c8f.js\",\"4352\",\"static/chunks/4352-aa5e249d3549fad3.js\",\"7244\",\"static/chunks/7244-3af31be0e4c03916.js\",\"3185\",\"static/chunks/app/layout-9f00bdf11490e278.js\"],\"default\"]\n13:I[49197,[\"2972\",\"static/chunks/2972-18fd1b49b929e6cc.js\",\"29\",\"static/chunks/29-d4c94ceb52581c8f.js\",\"4352\",\"static/chunks/4352-aa5e249d3549fad3.js\",\"7244\",\"static/chunks/7244-3af31be0e4c03916.js\",\"3185\",\"static/chunks/app/layout-9f00bdf11490e278.js\"],\"Analytics\"]\n14:I[1952,[\"2972\",\"static/chunks/2972-18fd1b49b929e6cc.js\",\"29\",\"static/chunks/29-d4c94ceb52581c8f.js\",\"4352\",\"static/chunks/4352-aa5e249d3549fad3.js\",\"7244\",\"static/chunks/7244-3af31be0e4c03916.js\",\"3185\",\"static/chunks/app/layout-9f00bdf11490e278.js\"],\"SpeedInsights\"]\n16:I[61060,[],\"\"]\n6:[\"slug\",\"screen-reader-template\",\"d\"]\n17:[]\n"])</script><script>self.__next_f.push([1,"0:[\"$\",\"$L2\",null,{\"buildId\":\"3Y7j95uqt08aOHmBWQ1io\",\"assetPrefix\":\"\",\"urlParts\":[\"\",\"templates\",\"screen-reader-template\"],\"initialTree\":[\"\",{\"children\":[\"(marketing)\",{\"children\":[\"templates\",{\"children\":[[\"slug\",\"screen-reader-template\",\"d\"],{\"children\":[\"__PAGE__?{\\\"slug\\\":\\\"screen-reader-template\\\"}\",{}]}]}]}]},\"$undefined\",\"$undefined\",true],\"initialSeedData\":[\"\",{\"children\":[\"(marketing)\",{\"children\":[\"templates\",{\"children\":[[\"slug\",\"screen-reader-template\",\"d\"],{\"children\":[\"__PAGE__\",{},[[\"$L3\",\"$L4\",null],null],null]},[null,[\"$\",\"$L5\",null,{\"parallelRouterKey\":\"children\",\"segmentPath\":[\"children\",\"(marketing)\",\"children\",\"templates\",\"children\",\"$6\",\"children\"],\"error\":\"$undefined\",\"errorStyles\":\"$undefined\",\"errorScripts\":\"$undefined\",\"template\":[\"$\",\"$L7\",null,{}],\"templateStyles\":\"$undefined\",\"templateScripts\":\"$undefined\",\"notFound\":\"$undefined\",\"notFoundStyles\":\"$undefined\"}]],null]},[null,[\"$\",\"$L5\",null,{\"parallelRouterKey\":\"children\",\"segmentPath\":[\"children\",\"(marketing)\",\"children\",\"templates\",\"children\"],\"error\":\"$undefined\",\"errorStyles\":\"$undefined\",\"errorScripts\":\"$undefined\",\"template\":[\"$\",\"$L7\",null,{}],\"templateStyles\":\"$undefined\",\"templateScripts\":\"$undefined\",\"notFound\":\"$undefined\",\"notFoundStyles\":\"$undefined\"}]],null]},[null,[\"$\",\"$L5\",null,{\"parallelRouterKey\":\"children\",\"segmentPath\":[\"children\",\"(marketing)\",\"children\"],\"error\":\"$undefined\",\"errorStyles\":\"$undefined\",\"errorScripts\":\"$undefined\",\"template\":[\"$\",\"$L7\",null,{}],\"templateStyles\":\"$undefined\",\"templateScripts\":\"$undefined\",\"notFound\":\"$undefined\",\"notFoundStyles\":\"$undefined\"}]],null]},[[[[\"$\",\"link\",\"0\",{\"rel\":\"stylesheet\",\"href\":\"/_next/static/css/145148df8ad5605a.css\",\"precedence\":\"next\",\"crossOrigin\":\"$undefined\"}]],[\"$\",\"html\",null,{\"lang\":\"en\",\"className\":\"scroll-smooth\",\"children\":[[\"$\",\"head\",null,{\"children\":[[\"$\",\"link\",null,{\"rel\":\"preconnect\",\"href\":\"https://cdn.outseta.com\"}],[\"$\",\"link\",null,{\"rel\":\"preconnect\",\"href\":\"https://www.googletagmanager.com\"}],[\"$\",\"link\",null,{\"rel\":\"dns-prefetch\",\"href\":\"https://cdn.outseta.com\"}],[\"$\",\"link\",null,{\"rel\":\"dns-prefetch\",\"href\":\"https://www.googletagmanager.com\"}],[\"$\",\"link\",null,{\"rel\":\"dns-prefetch\",\"href\":\"https://accounts.google.com\"}]]}],[\"$\",\"body\",null,{\"className\":\"antialiased\",\"children\":[[\"$\",\"script\",null,{\"dangerouslySetInnerHTML\":{\"__html\":\"var o_options = { domain: 'ideaplan.outseta.com', load: 'auth,customForm,emailList,leadCapture,nocode,profile,support', tokenStorage: 'local' };\\n(function(){\\n function loadOutseta(){\\n var s=document.createElement('script');\\n s.src='https://cdn.outseta.com/outseta.min.js';\\n s.dataset.options='o_options';\\n document.head.appendChild(s);\\n }\\n if(document.readyState==='complete'){loadOutseta();}\\n else{window.addEventListener('load',loadOutseta);}\\n})();\"}}],[\"$\",\"script\",null,{\"async\":true,\"src\":\"https://www.googletagmanager.com/gtag/js?id=G-3W604JB33Y\"}],[\"$\",\"script\",null,{\"dangerouslySetInnerHTML\":{\"__html\":\"window.dataLayer = window.dataLayer || [];\\nfunction gtag(){dataLayer.push(arguments);}\\ngtag('js', new Date());\\ngtag('config', 'G-3W604JB33Y');\"}}],[\"$\",\"script\",null,{\"type\":\"application/ld+json\",\"dangerouslySetInnerHTML\":{\"__html\":\"{\\\"@context\\\":\\\"https://schema.org\\\",\\\"@type\\\":\\\"Organization\\\",\\\"name\\\":\\\"IdeaPlan\\\",\\\"url\\\":\\\"https://www.ideaplan.io\\\",\\\"description\\\":\\\"IdeaPlan is a free product management platform with 69 interactive tools, 880+ templates, and 2,000+ guides covering prioritization, roadmapping, SaaS metrics, and product strategy.\\\",\\\"logo\\\":{\\\"@type\\\":\\\"ImageObject\\\",\\\"url\\\":\\\"https://www.ideaplan.io/opengraph-image\\\",\\\"width\\\":1200,\\\"height\\\":630},\\\"founder\\\":{\\\"@type\\\":\\\"Person\\\",\\\"name\\\":\\\"Tim Adair\\\",\\\"url\\\":\\\"https://www.ideaplan.io/about/tim-adair\\\"},\\\"sameAs\\\":[\\\"https://www.linkedin.com/in/timothyadair/\\\"],\\\"knowsAbout\\\":[\\\"Product Management\\\",\\\"Feature Prioritization\\\",\\\"SaaS Metrics\\\",\\\"Product Roadmaps\\\",\\\"AI Product Management\\\",\\\"Product Strategy\\\",\\\"Product-Led Growth\\\",\\\"User Research\\\",\\\"Product Discovery\\\"],\\\"areaServed\\\":\\\"Worldwide\\\"}\"}}],[\"$\",\"script\",null,{\"type\":\"application/ld+json\",\"dangerouslySetInnerHTML\":{\"__html\":\"{\\\"@context\\\":\\\"https://schema.org\\\",\\\"@type\\\":\\\"WebSite\\\",\\\"name\\\":\\\"IdeaPlan\\\",\\\"url\\\":\\\"https://www.ideaplan.io\\\",\\\"description\\\":\\\"IdeaPlan is a free product management platform with interactive tools, templates, frameworks, metrics guides, and strategy playbooks.\\\",\\\"inLanguage\\\":\\\"en\\\",\\\"publisher\\\":{\\\"@type\\\":\\\"Organization\\\",\\\"name\\\":\\\"IdeaPlan\\\"},\\\"potentialAction\\\":{\\\"@type\\\":\\\"SearchAction\\\",\\\"target\\\":\\\"https://www.ideaplan.io/resources?q={search_term_string}\\\",\\\"query-input\\\":\\\"required name=search_term_string\\\"}}\"}}],[\"$\",\"script\",null,{\"type\":\"application/ld+json\",\"dangerouslySetInnerHTML\":{\"__html\":\"{\\\"@context\\\":\\\"https://schema.org\\\",\\\"@type\\\":\\\"ItemList\\\",\\\"name\\\":\\\"Site Navigation\\\",\\\"itemListElement\\\":[{\\\"@type\\\":\\\"SiteNavigationElement\\\",\\\"position\\\":1,\\\"name\\\":\\\"Interactive Tools\\\",\\\"url\\\":\\\"https://www.ideaplan.io/tools\\\"},{\\\"@type\\\":\\\"SiteNavigationElement\\\",\\\"position\\\":2,\\\"name\\\":\\\"Roadmap Templates\\\",\\\"url\\\":\\\"https://www.ideaplan.io/roadmap-templates\\\"},{\\\"@type\\\":\\\"SiteNavigationElement\\\",\\\"position\\\":3,\\\"name\\\":\\\"PM Handbooks\\\",\\\"url\\\":\\\"https://www.ideaplan.io/handbooks\\\"},{\\\"@type\\\":\\\"SiteNavigationElement\\\",\\\"position\\\":4,\\\"name\\\":\\\"Blog\\\",\\\"url\\\":\\\"https://www.ideaplan.io/blog\\\"},{\\\"@type\\\":\\\"SiteNavigationElement\\\",\\\"position\\\":5,\\\"name\\\":\\\"PM Frameworks\\\",\\\"url\\\":\\\"https://www.ideaplan.io/frameworks\\\"},{\\\"@type\\\":\\\"SiteNavigationElement\\\",\\\"position\\\":6,\\\"name\\\":\\\"SaaS Idea Lab\\\",\\\"url\\\":\\\"https://www.ideaplan.io/ideas\\\"},{\\\"@type\\\":\\\"SiteNavigationElement\\\",\\\"position\\\":7,\\\"name\\\":\\\"PM Salary Guide\\\",\\\"url\\\":\\\"https://www.ideaplan.io/product-manager-salary\\\"},{\\\"@type\\\":\\\"SiteNavigationElement\\\",\\\"position\\\":8,\\\"name\\\":\\\"All Resources\\\",\\\"url\\\":\\\"https://www.ideaplan.io/resources\\\"}]}\"}}],[\"$\",\"script\",null,{\"type\":\"application/ld+json\",\"dangerouslySetInnerHTML\":{\"__html\":\"{\\\"@context\\\":\\\"https://schema.org\\\",\\\"@type\\\":\\\"Person\\\",\\\"name\\\":\\\"Tim Adair\\\",\\\"url\\\":\\\"https://www.ideaplan.io/about/tim-adair\\\",\\\"description\\\":\\\"Product management expert, founder of IdeaPlan, and author of 2,000+ PM guides, frameworks, and strategy resources.\\\",\\\"jobTitle\\\":\\\"Product Management Expert\\\",\\\"worksFor\\\":{\\\"@type\\\":\\\"Organization\\\",\\\"name\\\":\\\"IdeaPlan\\\",\\\"url\\\":\\\"https://www.ideaplan.io\\\"},\\\"sameAs\\\":[\\\"https://www.linkedin.com/in/timothyadair/\\\",\\\"https://timadair.com\\\"],\\\"knowsAbout\\\":[\\\"Product Management\\\",\\\"Feature Prioritization\\\",\\\"RICE Framework\\\",\\\"SaaS Metrics\\\",\\\"Product Roadmaps\\\",\\\"AI Product Management\\\",\\\"Product Strategy\\\",\\\"Product-Led Growth\\\",\\\"User Research\\\",\\\"Product Discovery\\\"],\\\"alumniOf\\\":{\\\"@type\\\":\\\"EducationalOrganization\\\",\\\"name\\\":\\\"Bethel University\\\"}}\"}}],[\"$\",\"$L8\",null,{\"children\":[[\"$\",\"$L9\",null,{\"children\":[\"$\",\"$La\",null,{}]}],[\"$\",\"$Lb\",null,{\"children\":[\"$\",\"$L5\",null,{\"parallelRouterKey\":\"children\",\"segmentPath\":[\"children\"],\"error\":\"$undefined\",\"errorStyles\":\"$undefined\",\"errorScripts\":\"$undefined\",\"template\":[\"$\",\"$L7\",null,{}],\"templateStyles\":\"$undefined\",\"templateScripts\":\"$undefined\",\"notFound\":[\"$\",\"div\",null,{\"className\":\"min-h-screen\",\"children\":[[\"$\",\"div\",null,{\"className\":\"absolute inset-0 bg-gradient-glow pointer-events-none\"}],[\"$\",\"section\",null,{\"className\":\"relative py-20 md:py-28 px-6 text-center\",\"children\":[\"$\",\"div\",null,{\"className\":\"max-w-3xl mx-auto\",\"children\":[[\"$\",\"div\",null,{\"className\":\"badge mb-6\",\"children\":\"404 — Page not found\"}],[\"$\",\"h1\",null,{\"className\":\"text-4xl md:text-5xl lg:text-6xl font-bold mb-6 leading-tight\",\"children\":[\"This page was\",\" \",[\"$\",\"span\",null,{\"className\":\"gradient-text\",\"children\":\"deprioritized\"}]]}],[\"$\",\"p\",null,{\"className\":\"text-lg md:text-xl text-gray-400 leading-relaxed max-w-2xl mx-auto\",\"children\":\"The URL you followed may have moved or been removed. Pick up where you left off with one of these sections.\"}]]}]}],[\"$\",\"section\",null,{\"className\":\"relative px-6 pb-16\",\"children\":[\"$\",\"div\",null,{\"className\":\"max-w-5xl mx-auto\",\"children\":[\"$\",\"div\",null,{\"className\":\"glass rounded-2xl p-6 md:p-10\",\"children\":[\"$\",\"div\",null,{\"className\":\"grid md:grid-cols-3 gap-8 md:gap-10\",\"children\":[[\"$\",\"div\",\"Build \u0026 Plan\",{\"children\":[[\"$\",\"h2\",null,{\"className\":\"text-[11px] font-semibold uppercase tracking-wider text-gray-400 mb-4 px-3\",\"children\":\"Build \u0026 Plan\"}],[\"$\",\"div\",null,{\"className\":\"space-y-1\",\"children\":[[\"$\",\"$Lc\",\"/tools\",{\"href\":\"/tools\",\"className\":\"flex items-start gap-3 px-3 py-2.5 rounded-xl hover:bg-white/5 transition-all duration-200 group\",\"children\":[[\"$\",\"span\",null,{\"className\":\"text-lg mt-0.5 group-hover:scale-110 transition-transform duration-200\",\"children\":\"🧮\"}],[\"$\",\"div\",null,{\"className\":\"min-w-0\",\"children\":[[\"$\",\"div\",null,{\"className\":\"text-white font-semibold text-sm group-hover:text-primary transition-colors\",\"children\":\"Interactive Tools\"}],[\"$\",\"div\",null,{\"className\":\"text-gray-400 text-xs mt-0.5 leading-snug\",\"children\":\"45 free calculators and assessments\"}]]}]]}],[\"$\",\"$Lc\",\"/templates\",{\"href\":\"/templates\",\"className\":\"flex items-start gap-3 px-3 py-2.5 rounded-xl hover:bg-white/5 transition-all duration-200 group\",\"children\":[[\"$\",\"span\",null,{\"className\":\"text-lg mt-0.5 group-hover:scale-110 transition-transform duration-200\",\"children\":\"📄\"}],[\"$\",\"div\",null,{\"className\":\"min-w-0\",\"children\":[[\"$\",\"div\",null,{\"className\":\"text-white font-semibold text-sm group-hover:text-primary transition-colors\",\"children\":\"PM Templates\"}],[\"$\",\"div\",null,{\"className\":\"text-gray-400 text-xs mt-0.5 leading-snug\",\"children\":\"Ready-to-use planning docs\"}]]}]]}],[\"$\",\"$Lc\",\"/roadmap-templates\",{\"href\":\"/roadmap-templates\",\"className\":\"flex items-start gap-3 px-3 py-2.5 rounded-xl hover:bg-white/5 transition-all duration-200 group\",\"children\":[[\"$\",\"span\",null,{\"className\":\"text-lg mt-0.5 group-hover:scale-110 transition-transform duration-200\",\"children\":\"🗺️\"}],[\"$\",\"div\",null,{\"className\":\"min-w-0\",\"children\":[[\"$\",\"div\",null,{\"className\":\"text-white font-semibold text-sm group-hover:text-primary transition-colors\",\"children\":\"Roadmap Templates\"}],[\"$\",\"div\",null,{\"className\":\"text-gray-400 text-xs mt-0.5 leading-snug\",\"children\":\"25 roadmap formats and examples\"}]]}]]}],[\"$\",\"$Lc\",\"/strategy\",{\"href\":\"/strategy\",\"className\":\"flex items-start gap-3 px-3 py-2.5 rounded-xl hover:bg-white/5 transition-all duration-200 group\",\"children\":[[\"$\",\"span\",null,{\"className\":\"text-lg mt-0.5 group-hover:scale-110 transition-transform duration-200\",\"children\":\"🎯\"}],[\"$\",\"div\",null,{\"className\":\"min-w-0\",\"children\":[[\"$\",\"div\",null,{\"className\":\"text-white font-semibold text-sm group-hover:text-primary transition-colors\",\"children\":\"Strategy Guides\"}],[\"$\",\"div\",null,{\"className\":\"text-gray-400 text-xs mt-0.5 leading-snug\",\"children\":\"Strategic planning resources\"}]]}]]}]]}]]}],[\"$\",\"div\",\"Analyze \u0026 Decide\",{\"children\":[[\"$\",\"h2\",null,{\"className\":\"text-[11px] font-semibold uppercase tracking-wider text-gray-400 mb-4 px-3\",\"children\":\"Analyze \u0026 Decide\"}],[\"$\",\"div\",null,{\"className\":\"space-y-1\",\"children\":[[\"$\",\"$Lc\",\"/frameworks\",{\"href\":\"/frameworks\",\"className\":\"flex items-start gap-3 px-3 py-2.5 rounded-xl hover:bg-white/5 transition-all duration-200 group\",\"children\":[[\"$\",\"span\",null,{\"className\":\"text-lg mt-0.5 group-hover:scale-110 transition-transform duration-200\",\"children\":\"🧩\"}],[\"$\",\"div\",null,{\"className\":\"min-w-0\",\"children\":[[\"$\",\"div\",null,{\"className\":\"text-white font-semibold text-sm group-hover:text-primary transition-colors\",\"children\":\"PM Frameworks\"}],[\"$\",\"div\",null,{\"className\":\"text-gray-400 text-xs mt-0.5 leading-snug\",\"children\":\"RICE, MoSCoW, JTBD, Kano \u0026 more\"}]]}]]}],[\"$\",\"$Lc\",\"/metrics\",{\"href\":\"/metrics\",\"className\":\"flex items-start gap-3 px-3 py-2.5 rounded-xl hover:bg-white/5 transition-all duration-200 group\",\"children\":[[\"$\",\"span\",null,{\"className\":\"text-lg mt-0.5 group-hover:scale-110 transition-transform duration-200\",\"children\":\"📊\"}],[\"$\",\"div\",null,{\"className\":\"min-w-0\",\"children\":[[\"$\",\"div\",null,{\"className\":\"text-white font-semibold text-sm group-hover:text-primary transition-colors\",\"children\":\"Product Metrics\"}],[\"$\",\"div\",null,{\"className\":\"text-gray-400 text-xs mt-0.5 leading-snug\",\"children\":\"124 SaaS and AI metric guides\"}]]}]]}],[\"$\",\"$Lc\",\"/compare\",{\"href\":\"/compare\",\"className\":\"flex items-start gap-3 px-3 py-2.5 rounded-xl hover:bg-white/5 transition-all duration-200 group\",\"children\":[[\"$\",\"span\",null,{\"className\":\"text-lg mt-0.5 group-hover:scale-110 transition-transform duration-200\",\"children\":\"⚖️\"}],[\"$\",\"div\",null,{\"className\":\"min-w-0\",\"children\":[[\"$\",\"div\",null,{\"className\":\"text-white font-semibold text-sm group-hover:text-primary transition-colors\",\"children\":\"Comparisons\"}],[\"$\",\"div\",null,{\"className\":\"text-gray-400 text-xs mt-0.5 leading-snug\",\"children\":\"Framework and methodology face-offs\"}]]}]]}],[\"$\",\"$Lc\",\"/pm-tools\",{\"href\":\"/pm-tools\",\"className\":\"flex items-start gap-3 px-3 py-2.5 rounded-xl hover:bg-white/5 transition-all duration-200 group\",\"children\":[[\"$\",\"span\",null,{\"className\":\"text-lg mt-0.5 group-hover:scale-110 transition-transform duration-200\",\"children\":\"🔧\"}],[\"$\",\"div\",null,{\"className\":\"min-w-0\",\"children\":[[\"$\",\"div\",null,{\"className\":\"text-white font-semibold text-sm group-hover:text-primary transition-colors\",\"children\":\"PM Software\"}],[\"$\",\"div\",null,{\"className\":\"text-gray-400 text-xs mt-0.5 leading-snug\",\"children\":\"Find the right tool for your team\"}]]}]]}]]}]]}],[\"$\",\"div\",\"Learn\",{\"children\":[[\"$\",\"h2\",null,{\"className\":\"text-[11px] font-semibold uppercase tracking-wider text-gray-400 mb-4 px-3\",\"children\":\"Learn\"}],[\"$\",\"div\",null,{\"className\":\"space-y-1\",\"children\":[[\"$\",\"$Lc\",\"/guides\",{\"href\":\"/guides\",\"className\":\"flex items-start gap-3 px-3 py-2.5 rounded-xl hover:bg-white/5 transition-all duration-200 group\",\"children\":[[\"$\",\"span\",null,{\"className\":\"text-lg mt-0.5 group-hover:scale-110 transition-transform duration-200\",\"children\":\"📚\"}],[\"$\",\"div\",null,{\"className\":\"min-w-0\",\"children\":[[\"$\",\"div\",null,{\"className\":\"text-white font-semibold text-sm group-hover:text-primary transition-colors\",\"children\":\"How-To Guides\"}],[\"$\",\"div\",null,{\"className\":\"text-gray-400 text-xs mt-0.5 leading-snug\",\"children\":\"Step-by-step PM processes\"}]]}]]}],[\"$\",\"$Lc\",\"/blog\",{\"href\":\"/blog\",\"className\":\"flex items-start gap-3 px-3 py-2.5 rounded-xl hover:bg-white/5 transition-all duration-200 group\",\"children\":[[\"$\",\"span\",null,{\"className\":\"text-lg mt-0.5 group-hover:scale-110 transition-transform duration-200\",\"children\":\"✏️\"}],[\"$\",\"div\",null,{\"className\":\"min-w-0\",\"children\":[[\"$\",\"div\",null,{\"className\":\"text-white font-semibold text-sm group-hover:text-primary transition-colors\",\"children\":\"Blog\"}],[\"$\",\"div\",null,{\"className\":\"text-gray-400 text-xs mt-0.5 leading-snug\",\"children\":\"PM, AI, strategy, and career articles\"}]]}]]}],[\"$\",\"$Lc\",\"/glossary\",{\"href\":\"/glossary\",\"className\":\"flex items-start gap-3 px-3 py-2.5 rounded-xl hover:bg-white/5 transition-all duration-200 group\",\"children\":[[\"$\",\"span\",null,{\"className\":\"text-lg mt-0.5 group-hover:scale-110 transition-transform duration-200\",\"children\":\"📖\"}],[\"$\",\"div\",null,{\"className\":\"min-w-0\",\"children\":[[\"$\",\"div\",null,{\"className\":\"text-white font-semibold text-sm group-hover:text-primary transition-colors\",\"children\":\"PM Glossary\"}],[\"$\",\"div\",null,{\"className\":\"text-gray-400 text-xs mt-0.5 leading-snug\",\"children\":\"234 product management terms defined\"}]]}]]}],[\"$\",\"$Lc\",\"/case-studies\",{\"href\":\"/case-studies\",\"className\":\"flex items-start gap-3 px-3 py-2.5 rounded-xl hover:bg-white/5 transition-all duration-200 group\",\"children\":[[\"$\",\"span\",null,{\"className\":\"text-lg mt-0.5 group-hover:scale-110 transition-transform duration-200\",\"children\":\"📋\"}],[\"$\",\"div\",null,{\"className\":\"min-w-0\",\"children\":[[\"$\",\"div\",null,{\"className\":\"text-white font-semibold text-sm group-hover:text-primary transition-colors\",\"children\":\"Case Studies\"}],[\"$\",\"div\",null,{\"className\":\"text-gray-400 text-xs mt-0.5 leading-snug\",\"children\":\"Spotify, Slack, Figma \u0026 more\"}]]}]]}]]}]]}]]}]}]}]}],[\"$\",\"section\",null,{\"className\":\"relative px-6 pb-28 text-center\",\"children\":[\"$\",\"div\",null,{\"className\":\"flex flex-col sm:flex-row gap-4 justify-center\",\"children\":[[\"$\",\"$Lc\",null,{\"href\":\"/\",\"className\":\"btn-primary\",\"children\":[\"Go to Homepage\",[\"$\",\"span\",null,{\"className\":\"ml-2\",\"children\":\"→\"}]]}],[\"$\",\"$Lc\",null,{\"href\":\"/resources\",\"className\":\"btn-secondary\",\"children\":\"Browse All Resources\"}]]}]}]]}],\"notFoundStyles\":[]}]}],[\"$\",\"$L9\",null,{\"children\":[[\"$\",\"footer\",null,{\"className\":\"border-t border-white/10 bg-dark-900\",\"children\":[\"$\",\"div\",null,{\"className\":\"max-w-7xl mx-auto px-6 py-16\",\"children\":[[\"$\",\"div\",null,{\"className\":\"grid grid-cols-2 md:grid-cols-3 lg:grid-cols-8 gap-12\",\"children\":[[\"$\",\"div\",null,{\"className\":\"col-span-2 md:col-span-3 lg:col-span-2\",\"children\":[[\"$\",\"$Lc\",null,{\"href\":\"/\",\"className\":\"flex items-center gap-2 group mb-4\",\"children\":[[\"$\",\"div\",null,{\"className\":\"w-10 h-10 rounded-xl bg-gradient-primary flex items-center justify-center text-xl font-bold text-white\",\"children\":\"I\"}],[\"$\",\"span\",null,{\"className\":\"text-xl font-bold text-white group-hover:text-primary transition-colors\",\"children\":\"IdeaPlan\"}]]}],[\"$\",\"p\",null,{\"className\":\"text-gray-400 text-sm leading-relaxed max-w-xs\",\"children\":\"Free PM tools, templates, and guides plus the Notion Product OS — everything product managers need in one place.\"}]]}],[[\"$\",\"div\",\"Tools \u0026 AI\",{\"children\":[[\"$\",\"h3\",null,{\"className\":\"text-white font-semibold text-sm mb-4\",\"children\":\"Tools \u0026 AI\"}],[\"$\",\"ul\",null,{\"className\":\"space-y-3\",\"children\":[[\"$\",\"li\",\"/tools\",{\"children\":[\"$\",\"$Lc\",null,{\"href\":\"/tools\",\"className\":\"text-gray-400 hover:text-primary text-sm transition-colors\",\"children\":\"All 69 Tools\"}]}],[\"$\",\"li\",\"/tools/forge\",{\"children\":[\"$\",\"$Lc\",null,{\"href\":\"/tools/forge\",\"className\":\"text-gray-400 hover:text-primary text-sm transition-colors\",\"children\":\"Forge AI Docs\"}]}],[\"$\",\"li\",\"/tools/compass\",{\"children\":[\"$\",\"$Lc\",null,{\"href\":\"/tools/compass\",\"className\":\"text-gray-400 hover:text-primary text-sm transition-colors\",\"children\":\"Compass\"}]}],[\"$\",\"li\",\"/tools/deck-doctor\",{\"children\":[\"$\",\"$Lc\",null,{\"href\":\"/tools/deck-doctor\",\"className\":\"text-gray-400 hover:text-primary text-sm transition-colors\",\"children\":\"Deck Doctor\"}]}],[\"$\",\"li\",\"/tools/form-builder\",{\"children\":[\"$\",\"$Lc\",null,{\"href\":\"/tools/form-builder\",\"className\":\"text-gray-400 hover:text-primary text-sm transition-colors\",\"children\":\"AI Form Builder\"}]}],[\"$\",\"li\",\"/loop\",{\"children\":[\"$\",\"$Lc\",null,{\"href\":\"/loop\",\"className\":\"text-gray-400 hover:text-primary text-sm transition-colors\",\"children\":\"Loop PM Assistant\"}]}],[\"$\",\"li\",\"/tools/rice-calculator\",{\"children\":[\"$\",\"$Lc\",null,{\"href\":\"/tools/rice-calculator\",\"className\":\"text-gray-400 hover:text-primary text-sm transition-colors\",\"children\":\"RICE Calculator\"}]}],[\"$\",\"li\",\"/tools/resume-scorer\",{\"children\":[\"$\",\"$Lc\",null,{\"href\":\"/tools/resume-scorer\",\"className\":\"text-gray-400 hover:text-primary text-sm transition-colors\",\"children\":\"Resume Scorer\"}]}],[\"$\",\"li\",\"/code-templates\",{\"children\":[\"$\",\"$Lc\",null,{\"href\":\"/code-templates\",\"className\":\"text-gray-400 hover:text-primary text-sm transition-colors\",\"children\":\"Admin Templates\"}]}],[\"$\",\"li\",\"/pm-tools\",{\"children\":[\"$\",\"$Lc\",null,{\"href\":\"/pm-tools\",\"className\":\"text-gray-400 hover:text-primary text-sm transition-colors\",\"children\":\"PM Software Directory\"}]}],[\"$\",\"li\",\"/compare\",{\"children\":[\"$\",\"$Lc\",null,{\"href\":\"/compare\",\"className\":\"text-gray-400 hover:text-primary text-sm transition-colors\",\"children\":\"Tool Comparisons\"}]}],[\"$\",\"li\",\"/alternatives\",{\"children\":[\"$\",\"$Lc\",null,{\"href\":\"/alternatives\",\"className\":\"text-gray-400 hover:text-primary text-sm transition-colors\",\"children\":\"Alternatives\"}]}],[\"$\",\"li\",\"/prompts\",{\"children\":[\"$\",\"$Lc\",null,{\"href\":\"/prompts\",\"className\":\"text-gray-400 hover:text-primary text-sm transition-colors\",\"children\":\"PM Prompts\"}]}],[\"$\",\"li\",\"/tools/embed\",{\"children\":[\"$\",\"$Lc\",null,{\"href\":\"/tools/embed\",\"className\":\"text-gray-400 hover:text-primary text-sm transition-colors\",\"children\":\"Embed Widgets\"}]}]]}]]}],[\"$\",\"div\",\"Learn\",{\"children\":[[\"$\",\"h3\",null,{\"className\":\"text-white font-semibold text-sm mb-4\",\"children\":\"Learn\"}],[\"$\",\"ul\",null,{\"className\":\"space-y-3\",\"children\":[[\"$\",\"li\",\"/blog\",{\"children\":[\"$\",\"$Lc\",null,{\"href\":\"/blog\",\"className\":\"text-gray-400 hover:text-primary text-sm transition-colors\",\"children\":\"Blog\"}]}],[\"$\",\"li\",\"/guides\",{\"children\":[\"$\",\"$Lc\",null,{\"href\":\"/guides\",\"className\":\"text-gray-400 hover:text-primary text-sm transition-colors\",\"children\":\"Guides\"}]}],[\"$\",\"li\",\"/courses\",{\"children\":[\"$\",\"$Lc\",null,{\"href\":\"/courses\",\"className\":\"text-gray-400 hover:text-primary text-sm transition-colors\",\"children\":\"Courses\"}]}],[\"$\",\"li\",\"/handbooks\",{\"children\":[\"$\",\"$Lc\",null,{\"href\":\"/handbooks\",\"className\":\"text-gray-400 hover:text-primary text-sm transition-colors\",\"children\":\"Handbooks\"}]}],[\"$\",\"li\",\"/frameworks\",{\"children\":[\"$\",\"$Lc\",null,{\"href\":\"/frameworks\",\"className\":\"text-gray-400 hover:text-primary text-sm transition-colors\",\"children\":\"Frameworks\"}]}],[\"$\",\"li\",\"/case-studies\",{\"children\":[\"$\",\"$Lc\",null,{\"href\":\"/case-studies\",\"className\":\"text-gray-400 hover:text-primary text-sm transition-colors\",\"children\":\"Case Studies\"}]}],[\"$\",\"li\",\"/glossary\",{\"children\":[\"$\",\"$Lc\",null,{\"href\":\"/glossary\",\"className\":\"text-gray-400 hover:text-primary text-sm transition-colors\",\"children\":\"Glossary\"}]}],[\"$\",\"li\",\"/metrics\",{\"children\":[\"$\",\"$Lc\",null,{\"href\":\"/metrics\",\"className\":\"text-gray-400 hover:text-primary text-sm transition-colors\",\"children\":\"Metrics\"}]}],[\"$\",\"li\",\"/playbooks\",{\"children\":[\"$\",\"$Lc\",null,{\"href\":\"/playbooks\",\"className\":\"text-gray-400 hover:text-primary text-sm transition-colors\",\"children\":\"Industry Playbooks\"}]}],[\"$\",\"li\",\"/lists\",{\"children\":[\"$\",\"$Lc\",null,{\"href\":\"/lists\",\"className\":\"text-gray-400 hover:text-primary text-sm transition-colors\",\"children\":\"Top Lists\"}]}],[\"$\",\"li\",\"/learning-paths\",{\"children\":[\"$\",\"$Lc\",null,{\"href\":\"/learning-paths\",\"className\":\"text-gray-400 hover:text-primary text-sm transition-colors\",\"children\":\"Learning Paths\"}]}],[\"$\",\"li\",\"/resources\",{\"children\":[\"$\",\"$Lc\",null,{\"href\":\"/resources\",\"className\":\"text-gray-400 hover:text-primary text-sm transition-colors\",\"children\":\"All Resources\"}]}]]}]]}],[\"$\",\"div\",\"Topic Hubs\",{\"children\":[[\"$\",\"h3\",null,{\"className\":\"text-white font-semibold text-sm mb-4\",\"children\":\"Topic Hubs\"}],[\"$\",\"ul\",null,{\"className\":\"space-y-3\",\"children\":[[\"$\",\"li\",\"/product-management-frameworks\",{\"children\":[\"$\",\"$Lc\",null,{\"href\":\"/product-management-frameworks\",\"className\":\"text-gray-400 hover:text-primary text-sm transition-colors\",\"children\":\"PM Frameworks\"}]}],[\"$\",\"li\",\"/product-analytics\",{\"children\":[\"$\",\"$Lc\",null,{\"href\":\"/product-analytics\",\"className\":\"text-gray-400 hover:text-primary text-sm transition-colors\",\"children\":\"Product Analytics\"}]}],[\"$\",\"li\",\"/product-led-growth\",{\"children\":[\"$\",\"$Lc\",null,{\"href\":\"/product-led-growth\",\"className\":\"text-gray-400 hover:text-primary text-sm transition-colors\",\"children\":\"Product-Led Growth\"}]}],[\"$\",\"li\",\"/agile-product-management\",{\"children\":[\"$\",\"$Lc\",null,{\"href\":\"/agile-product-management\",\"className\":\"text-gray-400 hover:text-primary text-sm transition-colors\",\"children\":\"Agile PM\"}]}],[\"$\",\"li\",\"/saas-metrics\",{\"children\":[\"$\",\"$Lc\",null,{\"href\":\"/saas-metrics\",\"className\":\"text-gray-400 hover:text-primary text-sm transition-colors\",\"children\":\"SaaS Metrics\"}]}],[\"$\",\"li\",\"/user-research\",{\"children\":[\"$\",\"$Lc\",null,{\"href\":\"/user-research\",\"className\":\"text-gray-400 hover:text-primary text-sm transition-colors\",\"children\":\"User Research\"}]}],[\"$\",\"li\",\"/product-management-career\",{\"children\":[\"$\",\"$Lc\",null,{\"href\":\"/product-management-career\",\"className\":\"text-gray-400 hover:text-primary text-sm transition-colors\",\"children\":\"PM Career\"}]}],[\"$\",\"li\",\"/templates\",{\"children\":[\"$\",\"$Lc\",null,{\"href\":\"/templates\",\"className\":\"text-gray-400 hover:text-primary text-sm transition-colors\",\"children\":\"Templates\"}]}],[\"$\",\"li\",\"/roadmap-templates\",{\"children\":[\"$\",\"$Lc\",null,{\"href\":\"/roadmap-templates\",\"className\":\"text-gray-400 hover:text-primary text-sm transition-colors\",\"children\":\"Roadmap Templates\"}]}],[\"$\",\"li\",\"/strategy\",{\"children\":[\"$\",\"$Lc\",null,{\"href\":\"/strategy\",\"className\":\"text-gray-400 hover:text-primary text-sm transition-colors\",\"children\":\"Strategy\"}]}],[\"$\",\"li\",\"/ai-sdlc\",{\"children\":[\"$\",\"$Lc\",null,{\"href\":\"/ai-sdlc\",\"className\":\"text-gray-400 hover:text-primary text-sm transition-colors\",\"children\":\"AI SDLC\"}]}],[\"$\",\"li\",\"/pm-writing-tools\",{\"children\":[\"$\",\"$Lc\",null,{\"href\":\"/pm-writing-tools\",\"className\":\"text-gray-400 hover:text-primary text-sm transition-colors\",\"children\":\"PM Writing Tools\"}]}],[\"$\",\"li\",\"/customer-interview-tools\",{\"children\":[\"$\",\"$Lc\",null,{\"href\":\"/customer-interview-tools\",\"className\":\"text-gray-400 hover:text-primary text-sm transition-colors\",\"children\":\"Interview Tools\"}]}]]}]]}],[\"$\",\"div\",\"Discover\",{\"children\":[[\"$\",\"h3\",null,{\"className\":\"text-white font-semibold text-sm mb-4\",\"children\":\"Discover\"}],[\"$\",\"ul\",null,{\"className\":\"space-y-3\",\"children\":[[\"$\",\"li\",\"/ideas\",{\"children\":[\"$\",\"$Lc\",null,{\"href\":\"/ideas\",\"className\":\"text-gray-400 hover:text-primary text-sm transition-colors\",\"children\":\"SaaS Idea Lab\"}]}],[\"$\",\"li\",\"/ideas/trends\",{\"children\":[\"$\",\"$Lc\",null,{\"href\":\"/ideas/trends\",\"className\":\"text-gray-400 hover:text-primary text-sm transition-colors\",\"children\":\"Market Trends\"}]}],[\"$\",\"li\",\"/interview-questions\",{\"children\":[\"$\",\"$Lc\",null,{\"href\":\"/interview-questions\",\"className\":\"text-gray-400 hover:text-primary text-sm transition-colors\",\"children\":\"Interview Prep\"}]}],[\"$\",\"li\",\"/product-manager-salary\",{\"children\":[\"$\",\"$Lc\",null,{\"href\":\"/product-manager-salary\",\"className\":\"text-gray-400 hover:text-primary text-sm transition-colors\",\"children\":\"PM Salary Guide\"}]}],[\"$\",\"li\",\"/jobs\",{\"children\":[\"$\",\"$Lc\",null,{\"href\":\"/jobs\",\"className\":\"text-gray-400 hover:text-primary text-sm transition-colors\",\"children\":\"PM Jobs\"}]}],[\"$\",\"li\",\"/companies\",{\"children\":[\"$\",\"$Lc\",null,{\"href\":\"/companies\",\"className\":\"text-gray-400 hover:text-primary text-sm transition-colors\",\"children\":\"Company Profiles\"}]}],[\"$\",\"li\",\"/games\",{\"children\":[\"$\",\"$Lc\",null,{\"href\":\"/games\",\"className\":\"text-gray-400 hover:text-primary text-sm transition-colors\",\"children\":\"Daily PM Games\"}]}],[\"$\",\"li\",\"/stories\",{\"children\":[\"$\",\"$Lc\",null,{\"href\":\"/stories\",\"className\":\"text-gray-400 hover:text-primary text-sm transition-colors\",\"children\":\"Founder Stories\"}]}],[\"$\",\"li\",\"/skill-levels\",{\"children\":[\"$\",\"$Lc\",null,{\"href\":\"/skill-levels\",\"className\":\"text-gray-400 hover:text-primary text-sm transition-colors\",\"children\":\"Skills by Level\"}]}],[\"$\",\"li\",\"/industry-salaries\",{\"children\":[\"$\",\"$Lc\",null,{\"href\":\"/industry-salaries\",\"className\":\"text-gray-400 hover:text-primary text-sm transition-colors\",\"children\":\"Salary by Industry\"}]}],[\"$\",\"li\",\"/industry-tools\",{\"children\":[\"$\",\"$Lc\",null,{\"href\":\"/industry-tools\",\"className\":\"text-gray-400 hover:text-primary text-sm transition-colors\",\"children\":\"Tools by Industry\"}]}],[\"$\",\"li\",\"/integrations\",{\"children\":[\"$\",\"$Lc\",null,{\"href\":\"/integrations\",\"className\":\"text-gray-400 hover:text-primary text-sm transition-colors\",\"children\":\"Integrations\"}]}],[\"$\",\"li\",\"/qa\",{\"children\":[\"$\",\"$Lc\",null,{\"href\":\"/qa\",\"className\":\"text-gray-400 hover:text-primary text-sm transition-colors\",\"children\":\"PM Q\u0026A\"}]}],[\"$\",\"li\",\"/state-of-pm\",{\"children\":[\"$\",\"$Lc\",null,{\"href\":\"/state-of-pm\",\"className\":\"text-gray-400 hover:text-primary text-sm transition-colors\",\"children\":\"State of PM Report\"}]}],[\"$\",\"li\",\"/tools/pm-certification\",{\"children\":[\"$\",\"$Lc\",null,{\"href\":\"/tools/pm-certification\",\"className\":\"text-gray-400 hover:text-primary text-sm transition-colors\",\"children\":\"PM Certification\"}]}]]}]]}],[\"$\",\"div\",\"Developer Tools\",{\"children\":[[\"$\",\"h3\",null,{\"className\":\"text-white font-semibold text-sm mb-4\",\"children\":\"Developer Tools\"}],[\"$\",\"ul\",null,{\"className\":\"space-y-3\",\"children\":[[\"$\",\"li\",\"/tools/css-gradient-generator\",{\"children\":[\"$\",\"$Lc\",null,{\"href\":\"/tools/css-gradient-generator\",\"className\":\"text-gray-400 hover:text-primary text-sm transition-colors\",\"children\":\"CSS Gradient Generator\"}]}],[\"$\",\"li\",\"/tools/css-shadow-generator\",{\"children\":[\"$\",\"$Lc\",null,{\"href\":\"/tools/css-shadow-generator\",\"className\":\"text-gray-400 hover:text-primary text-sm transition-colors\",\"children\":\"CSS Shadow Generator\"}]}],[\"$\",\"li\",\"/tools/css-button-generator\",{\"children\":[\"$\",\"$Lc\",null,{\"href\":\"/tools/css-button-generator\",\"className\":\"text-gray-400 hover:text-primary text-sm transition-colors\",\"children\":\"CSS Button Generator\"}]}],[\"$\",\"li\",\"/tools/color-palette-generator\",{\"children\":[\"$\",\"$Lc\",null,{\"href\":\"/tools/color-palette-generator\",\"className\":\"text-gray-400 hover:text-primary text-sm transition-colors\",\"children\":\"Color Palette Generator\"}]}],[\"$\",\"li\",\"/tools/tailwind-color-generator\",{\"children\":[\"$\",\"$Lc\",null,{\"href\":\"/tools/tailwind-color-generator\",\"className\":\"text-gray-400 hover:text-primary text-sm transition-colors\",\"children\":\"Tailwind Color Generator\"}]}],[\"$\",\"li\",\"/tools/border-radius-generator\",{\"children\":[\"$\",\"$Lc\",null,{\"href\":\"/tools/border-radius-generator\",\"className\":\"text-gray-400 hover:text-primary text-sm transition-colors\",\"children\":\"Border Radius Generator\"}]}],[\"$\",\"li\",\"/tools/tailwind-css-components\",{\"children\":[\"$\",\"$Lc\",null,{\"href\":\"/tools/tailwind-css-components\",\"className\":\"text-gray-400 hover:text-primary text-sm transition-colors\",\"children\":\"Tailwind CSS Components\"}]}],[\"$\",\"li\",\"/tools/tailwind-css-blocks\",{\"children\":[\"$\",\"$Lc\",null,{\"href\":\"/tools/tailwind-css-blocks\",\"className\":\"text-gray-400 hover:text-primary text-sm transition-colors\",\"children\":\"Tailwind CSS Blocks\"}]}],[\"$\",\"li\",\"/tools/utility-css\",{\"children\":[\"$\",\"$Lc\",null,{\"href\":\"/tools/utility-css\",\"className\":\"text-gray-400 hover:text-primary text-sm transition-colors\",\"children\":\"All Utility CSS\"}]}],[\"$\",\"li\",\"/tools/shadcn-resources\",{\"children\":[\"$\",\"$Lc\",null,{\"href\":\"/tools/shadcn-resources\",\"className\":\"text-gray-400 hover:text-primary text-sm transition-colors\",\"children\":\"All Shadcn Resources\"}]}],[\"$\",\"li\",\"/tools/shadcn-components\",{\"children\":[\"$\",\"$Lc\",null,{\"href\":\"/tools/shadcn-components\",\"className\":\"text-gray-400 hover:text-primary text-sm transition-colors\",\"children\":\"Shadcn Components\"}]}],[\"$\",\"li\",\"/tools/bootstrap-cheatsheet\",{\"children\":[\"$\",\"$Lc\",null,{\"href\":\"/tools/bootstrap-cheatsheet\",\"className\":\"text-gray-400 hover:text-primary text-sm transition-colors\",\"children\":\"Bootstrap CheatSheet\"}]}],[\"$\",\"li\",\"/tools/vue-cheatsheet\",{\"children\":[\"$\",\"$Lc\",null,{\"href\":\"/tools/vue-cheatsheet\",\"className\":\"text-gray-400 hover:text-primary text-sm transition-colors\",\"children\":\"Vue Cheatsheet\"}]}],[\"$\",\"li\",\"/tools/figma-tailwind-ui\",{\"children\":[\"$\",\"$Lc\",null,{\"href\":\"/tools/figma-tailwind-ui\",\"className\":\"text-gray-400 hover:text-primary text-sm transition-colors\",\"children\":\"Figma Tailwind UI\"}]}]]}]]}],[\"$\",\"div\",\"Company\",{\"children\":[[\"$\",\"h3\",null,{\"className\":\"text-white font-semibold text-sm mb-4\",\"children\":\"Company\"}],[\"$\",\"ul\",null,{\"className\":\"space-y-3\",\"children\":[[\"$\",\"li\",\"/product-os\",{\"children\":[\"$\",\"$Lc\",null,{\"href\":\"/product-os\",\"className\":\"text-gray-400 hover:text-primary text-sm transition-colors\",\"children\":\"Product OS\"}]}],[\"$\",\"li\",\"/pricing\",{\"children\":[\"$\",\"$Lc\",null,{\"href\":\"/pricing\",\"className\":\"text-gray-400 hover:text-primary text-sm transition-colors\",\"children\":\"Pricing\"}]}],[\"$\",\"li\",\"/for/saas-product-managers\",{\"children\":[\"$\",\"$Lc\",null,{\"href\":\"/for/saas-product-managers\",\"className\":\"text-gray-400 hover:text-primary text-sm transition-colors\",\"children\":\"For SaaS PMs\"}]}],[\"$\",\"li\",\"/for/vp-product\",{\"children\":[\"$\",\"$Lc\",null,{\"href\":\"/for/vp-product\",\"className\":\"text-gray-400 hover:text-primary text-sm transition-colors\",\"children\":\"For VPs of Product\"}]}],[\"$\",\"li\",\"/for/pm-job-seekers\",{\"children\":[\"$\",\"$Lc\",null,{\"href\":\"/for/pm-job-seekers\",\"className\":\"text-gray-400 hover:text-primary text-sm transition-colors\",\"children\":\"For PM Job Seekers\"}]}],[\"$\",\"li\",\"/state-of-product-management\",{\"children\":[\"$\",\"$Lc\",null,{\"href\":\"/state-of-product-management\",\"className\":\"text-gray-400 hover:text-primary text-sm transition-colors\",\"children\":\"State of PM 2026\"}]}],[\"$\",\"li\",\"/state-of-pm-tools\",{\"children\":[\"$\",\"$Lc\",null,{\"href\":\"/state-of-pm-tools\",\"className\":\"text-gray-400 hover:text-primary text-sm transition-colors\",\"children\":\"PM Tools Report\"}]}],[\"$\",\"li\",\"/method\",{\"children\":[\"$\",\"$Lc\",null,{\"href\":\"/method\",\"className\":\"text-gray-400 hover:text-primary text-sm transition-colors\",\"children\":\"The Method\"}]}],[\"$\",\"li\",\"/methodology\",{\"children\":[\"$\",\"$Lc\",null,{\"href\":\"/methodology\",\"className\":\"text-gray-400 hover:text-primary text-sm transition-colors\",\"children\":\"Data Methodology\"}]}],[\"$\",\"li\",\"/changelog\",{\"children\":[\"$\",\"$Lc\",null,{\"href\":\"/changelog\",\"className\":\"text-gray-400 hover:text-primary text-sm transition-colors\",\"children\":\"Changelog\"}]}],[\"$\",\"li\",\"/newsletter\",{\"children\":[\"$\",\"$Lc\",null,{\"href\":\"/newsletter\",\"className\":\"text-gray-400 hover:text-primary text-sm transition-colors\",\"children\":\"Newsletter\"}]}]]}]]}]]]}],[\"$\",\"div\",null,{\"className\":\"mt-16 pt-8 border-t border-white/10 flex flex-col sm:flex-row items-center justify-between gap-4\",\"children\":[[\"$\",\"p\",null,{\"className\":\"text-gray-400 text-sm\",\"children\":[\"© \",2026,\" IdeaPlan. All rights reserved.\"]}],[\"$\",\"div\",null,{\"className\":\"flex items-center gap-6\",\"children\":[[\"$\",\"$Lc\",null,{\"href\":\"/feed.xml\",\"className\":\"text-gray-400 hover:text-primary text-sm transition-colors\",\"children\":\"RSS Feed\"}],[\"$\",\"$Lc\",null,{\"href\":\"/sitemap.xml\",\"className\":\"text-gray-400 hover:text-primary text-sm transition-colors\",\"children\":\"Sitemap\"}]]}]]}]]}]}],[\"$\",\"$d\",null,{\"fallback\":null,\"children\":[\"$\",\"$Le\",null,{\"reason\":\"next/dynamic\",\"children\":[\"$\",\"$Lf\",null,{}]}]}],[\"$\",\"$d\",null,{\"fallback\":null,\"children\":[\"$\",\"$Le\",null,{\"reason\":\"next/dynamic\",\"children\":[\"$\",\"$L10\",null,{}]}]}]]}]]}],[\"$\",\"$L11\",null,{}],[\"$\",\"$d\",null,{\"fallback\":null,\"children\":[\"$\",\"$Le\",null,{\"reason\":\"next/dynamic\",\"children\":[\"$\",\"$L12\",null,{}]}]}],[\"$\",\"$L13\",null,{}],[\"$\",\"$L14\",null,{}]]}]]}]],null],null],\"couldBeIntercepted\":false,\"initialHead\":[null,\"$L15\"],\"globalErrorComponent\":\"$16\",\"missingSlots\":\"$W17\"}]\n"])</script><script>self.__next_f.push([1,"1b:I[65878,[\"2972\",\"static/chunks/2972-18fd1b49b929e6cc.js\",\"29\",\"static/chunks/29-d4c94ceb52581c8f.js\",\"5878\",\"static/chunks/5878-a13f9ad6abef0868.js\",\"7244\",\"static/chunks/7244-3af31be0e4c03916.js\",\"4287\",\"static/chunks/4287-14350f54c06970ce.js\",\"9742\",\"static/chunks/9742-89fc544a2f208867.js\",\"6454\",\"static/chunks/6454-1713bb3dcbe42c11.js\",\"5626\",\"static/chunks/app/(marketing)/templates/%5Bslug%5D/page-a91375ae33733373.js\"],\"Image\"]\n1c:I[7568,[\"2972\",\"static/chunks/2972-18fd1b49b929e6cc.js\",\"29\",\"static/chunks/29-d4c94ceb52581c8f.js\",\"5878\",\"static/chunks/5878-a13f9ad6abef0868.js\",\"7244\",\"static/chunks/7244-3af31be0e4c03916.js\",\"4287\",\"static/chunks/4287-14350f54c06970ce.js\",\"9742\",\"static/chunks/9742-89fc544a2f208867.js\",\"6454\",\"static/chunks/6454-1713bb3dcbe42c11.js\",\"5626\",\"static/chunks/app/(marketing)/templates/%5Bslug%5D/page-a91375ae33733373.js\"],\"default\"]\n1d:I[58424,[\"2972\",\"static/chunks/2972-18fd1b49b929e6cc.js\",\"29\",\"static/chunks/29-d4c94ceb52581c8f.js\",\"5878\",\"static/chunks/5878-a13f9ad6abef0868.js\",\"7244\",\"static/chunks/7244-3af31be0e4c03916.js\",\"4287\",\"static/chunks/4287-14350f54c06970ce.js\",\"9742\",\"static/chunks/9742-89fc544a2f208867.js\",\"6454\",\"static/chunks/6454-1713bb3dcbe42c11.js\",\"5626\",\"static/chunks/app/(marketing)/templates/%5Bslug%5D/page-a91375ae33733373.js\"],\"default\"]\n1e:I[58926,[\"2972\",\"static/chunks/2972-18fd1b49b929e6cc.js\",\"29\",\"static/chunks/29-d4c94ceb52581c8f.js\",\"5878\",\"static/chunks/5878-a13f9ad6abef0868.js\",\"7244\",\"static/chunks/7244-3af31be0e4c03916.js\",\"4287\",\"static/chunks/4287-14350f54c06970ce.js\",\"9742\",\"static/chunks/9742-89fc544a2f208867.js\",\"6454\",\"static/chunks/6454-1713bb3dcbe42c11.js\",\"5626\",\"static/chunks/app/(marketing)/templates/%5Bslug%5D/page-a91375ae33733373.js\"],\"default\"]\n20:I[94287,[\"2972\",\"static/chunks/2972-18fd1b49b929e6cc.js\",\"29\",\"static/chunks/29-d4c94ceb52581c8f.js\",\"5878\",\"static/chunks/5878-a13f9ad6abef0868.js\",\"7244\",\"static/chunks/7244-3af31be0e4c03916.js\",\"4287\",\"static/chunks/4287-14350f54c06970ce.js\",\"9742\",\"static/chunks/9742-89fc544a2f20"])</script><script>self.__next_f.push([1,"8867.js\",\"6454\",\"static/chunks/6454-1713bb3dcbe42c11.js\",\"5626\",\"static/chunks/app/(marketing)/templates/%5Bslug%5D/page-a91375ae33733373.js\"],\"default\"]\n2f:I[79742,[\"2972\",\"static/chunks/2972-18fd1b49b929e6cc.js\",\"29\",\"static/chunks/29-d4c94ceb52581c8f.js\",\"5878\",\"static/chunks/5878-a13f9ad6abef0868.js\",\"7244\",\"static/chunks/7244-3af31be0e4c03916.js\",\"4287\",\"static/chunks/4287-14350f54c06970ce.js\",\"9742\",\"static/chunks/9742-89fc544a2f208867.js\",\"6454\",\"static/chunks/6454-1713bb3dcbe42c11.js\",\"5626\",\"static/chunks/app/(marketing)/templates/%5Bslug%5D/page-a91375ae33733373.js\"],\"default\"]\n18:T505,{\"@context\":\"https://schema.org\",\"@type\":\"Article\",\"headline\":\"Screen Reader Optimization Template\",\"description\":\"Optimize your product for screen readers by structuring headings, landmarks, live regions, reading order, and link text.\",\"datePublished\":\"2026-03-05\",\"dateModified\":\"2026-03-05\",\"author\":{\"@type\":\"Person\",\"name\":\"Tim Adair\",\"url\":\"https://www.ideaplan.io/about/tim-adair\",\"jobTitle\":\"Strategic Executive Leader\",\"alumniOf\":{\"@type\":\"EducationalOrganization\",\"name\":\"Bethel University\"},\"sameAs\":[\"https://www.linkedin.com/in/timothyadair/\",\"https://timadair.com\"]},\"publisher\":{\"@type\":\"Organization\",\"name\":\"IdeaPlan\",\"url\":\"https://www.ideaplan.io\",\"logo\":{\"@type\":\"ImageObject\",\"url\":\"https://www.ideaplan.io/images/logos/ideaplan-logo.png\"},\"sameAs\":[\"https://www.linkedin.com/in/timothyadair/\",\"https://timadair.com\"],\"founder\":{\"@type\":\"Person\",\"name\":\"Tim Adair\",\"url\":\"https://www.ideaplan.io/about/tim-adair\"}},\"mainEntityOfPage\":{\"@type\":\"WebPage\",\"@id\":\"https://www.ideaplan.io/templates/screen-reader-template\"},\"image\":{\"@type\":\"ImageObject\",\"url\":\"https://www.ideaplan.io/images/previews/templates/screen-reader-template-preview.png\"},\"inLanguage\":\"en\",\"speakable\":{\"@type\":\"SpeakableSpecification\",\"cssSelector\":[\"h1\",\"h2\",\"meta[name=\\\"description\\\"]\"]}}19:T50c,{\"@context\":\"https://schema.org\",\"@type\":\"HowTo\",\"name\":\"Screen Reader Optimization Template\",\"description\":\"Optimize your product for screen readers by"])</script><script>self.__next_f.push([1," structuring headings, landmarks, live regions, reading order, and link text.\",\"datePublished\":\"2026-03-05\",\"dateModified\":\"2026-03-05\",\"author\":{\"@type\":\"Person\",\"name\":\"Tim Adair\",\"url\":\"https://www.ideaplan.io/about/tim-adair\",\"jobTitle\":\"Strategic Executive Leader\",\"alumniOf\":{\"@type\":\"EducationalOrganization\",\"name\":\"Bethel University\"},\"sameAs\":[\"https://www.linkedin.com/in/timothyadair/\",\"https://timadair.com\"]},\"totalTime\":\"PT60-120Mutes\",\"step\":[{\"@type\":\"HowToStep\",\"position\":1,\"name\":\"Review the template structure\",\"text\":\"Read through the Screen Reader Optimization Template to understand each section and its purpose.\"},{\"@type\":\"HowToStep\",\"position\":2,\"name\":\"Customize for your context\",\"text\":\"Replace placeholder text with your product details, team specifics, and organizational context.\"},{\"@type\":\"HowToStep\",\"position\":3,\"name\":\"Fill in key sections\",\"text\":\"Complete each section using the built-in prompts and examples as guides for what to include.\"},{\"@type\":\"HowToStep\",\"position\":4,\"name\":\"Review and share\",\"text\":\"Review the completed document for accuracy, then share with stakeholders for feedback.\"}]}1a:Tceb,"])</script><script>self.__next_f.push([1,"{\"@context\":\"https://schema.org\",\"@type\":\"FAQPage\",\"mainEntity\":[{\"@type\":\"Question\",\"name\":\"Which screen reader should we prioritize for testing?\",\"acceptedAnswer\":{\"@type\":\"Answer\",\"text\":\"Prioritize VoiceOver with Safari on macOS and NVDA with Chrome on Windows. These two combinations cover the majority of screen reader users in the 2025 WebAIM survey. If you can only test with one, use NVDA with Chrome because it is free, runs on the most common OS (Windows), and Chrome is the most popular browser. The [accessibility compliance template](/templates/accessibility-compliance-template) includes a decision matrix for choosing your test matrix based on your user demographics.\"}},{\"@type\":\"Question\",\"name\":\"How do we handle screen reader support for single-page applications?\",\"acceptedAnswer\":{\"@type\":\"Answer\",\"text\":\"SPAs create unique challenges because page navigations do not trigger a full page load event. Screen readers do not automatically announce the new page. Three things need to happen on every client-side route change: update `document.title` to reflect the new page, move focus to the main content area or page heading, and optionally announce the page transition via an `aria-live` region. The [focus management template](/templates/focus-management-template) covers the focus restoration pattern in detail.\"}},{\"@type\":\"Question\",\"name\":\"Should we add visually hidden text for screen readers?\",\"acceptedAnswer\":{\"@type\":\"Answer\",\"text\":\"Use visually hidden text (`.sr-only` or `clip-path` technique) when the visual context provides information that the audio context lacks. Examples: a star rating that shows 4 filled stars needs `.sr-only` text saying \\\"4 out of 5 stars.\\\" An icon button needs `.sr-only` text or `aria-label` describing the action. However, do not add hidden text as a band-aid for poor structure. If a heading or label is needed, make it visible rather than hiding it.\"}},{\"@type\":\"Question\",\"name\":\"How do screen readers handle CSS-generated content?\",\"acceptedAnswer\":{\"@type\":\"Answer\",\"text\":\"Content inserted via CSS `::before` and `::after` pseudo-elements with the `content` property is announced by all major screen readers. This means decorative CSS content (arrows, bullets, icons via `content: \\\"\\\\2022\\\"`) will be read aloud. Use `content: \\\"\\\" / \\\"\\\"` with `aria-hidden=\\\"true\\\"` on the parent or the pseudo-element to suppress the announcement, or use SVG icons with `aria-hidden=\\\"true\\\"` instead of CSS content.\"}},{\"@type\":\"Question\",\"name\":\"What is the difference between aria-label and aria-labelledby for screen readers?\",\"acceptedAnswer\":{\"@type\":\"Answer\",\"text\":\"Both provide an accessible name. `aria-label` takes a string value directly. `aria-labelledby` takes one or more element IDs and reads their text content as the label. `aria-labelledby` is preferred when visible text exists because it stays in sync automatically. `aria-label` is preferred when no visible text exists. Note that `aria-label` on non-interactive elements (like `\\u003cdiv\\u003e` or `\\u003cspan\\u003e`) is inconsistently supported. Use it on interactive elements (buttons, inputs, links, landmarks) where support is reliable. The [ARIA checklist template](/templates/aria-checklist-template) covers the full set of ARIA attributes and their correct usage.\"}}]}"])</script><script>self.__next_f.push([1,"1f:Tec61,"])</script><script>self.__next_f.push([1,"\u003ch2 id=\"what-this-template-is-for\" class=\"text-3xl font-bold mt-12 mb-6 text-white\"\u003eWhat This Template Is For\u003c/h2\u003e\n\u003cp class=\"mb-4 leading-relaxed text-gray-300\"\u003eScreen readers convert visual interfaces into audio. The user hears the page content, navigates by headings and landmarks, and interacts with forms and controls through keyboard commands. A product that works well visually can be unusable with a screen reader if the underlying structure is wrong: missing headings, unlabeled buttons, images without alt text, dynamic content that changes silently, and reading order that does not match the visual layout.\u003c/p\u003e\n\u003cp class=\"mb-4 leading-relaxed text-gray-300\"\u003eThis template provides a structured optimization guide for making your product work well with screen readers. It covers seven areas: document structure, headings, landmarks, link and button text, forms, dynamic content, and reading order. For each area, you get the requirements, common mistakes, and a verification checklist.\u003c/p\u003e\n\u003cp class=\"mb-4 leading-relaxed text-gray-300\"\u003eUse this template after the automated checks in the \u003ca href=\"/templates/accessibility-audit-template\" class=\"text-primary hover:text-primary-light underline\"\u003eaccessibility audit template\u003c/a\u003e have been completed. Automated tools catch missing alt text and contrast failures, but they cannot tell you whether the reading order makes sense or whether your headings create a coherent outline. The \u003ca href=\"/templates/aria-checklist-template\" class=\"text-primary hover:text-primary-light underline\"\u003eARIA checklist template\u003c/a\u003e covers the ARIA attributes that make custom widgets accessible to screen readers. For testing the results of your optimization work, the \u003ca href=\"/templates/assistive-tech-testing-template\" class=\"text-primary hover:text-primary-light underline\"\u003eassistive tech testing template\u003c/a\u003e provides structured protocols for VoiceOver, NVDA, and TalkBack.\u003c/p\u003e\n\u003chr class=\"my-12 border-white/10\" /\u003e\n\u003ch2 id=\"how-to-use-this-template\" class=\"text-3xl font-bold mt-12 mb-6 text-white\"\u003eHow to Use This Template\u003c/h2\u003e\n\u003col class=\"my-4 list-decimal\"\u003e\n\u003cli class=\"ml-6 mb-2 text-gray-300\"\u003ePick a page or \u003ca href=\"/glossary/user-flow\" class=\"text-primary hover:text-primary-light underline\" title=\"User Flow\"\u003euser flow\u003c/a\u003e to optimize. Work through one page at a time rather than auditing the entire product at once.\u003c/li\u003e\n\u003cli class=\"ml-6 mb-2 text-gray-300\"\u003eFor each of the seven areas below, review the page against the checklist criteria.\u003c/li\u003e\n\u003cli class=\"ml-6 mb-2 text-gray-300\"\u003eOpen the page in a screen reader as you audit. VoiceOver on macOS (Cmd+F5) or NVDA on Windows (free download) are the most accessible starting points for teams new to screen reader testing.\u003c/li\u003e\n\u003cli class=\"ml-6 mb-2 text-gray-300\"\u003eDocument findings with specific page locations and the expected versus actual screen reader behavior.\u003c/li\u003e\n\u003cli class=\"ml-6 mb-2 text-gray-300\"\u003eFix issues in priority order: document structure and headings first (they affect every user on every page), then forms and dynamic content (they affect specific interactions), then \u003ca href=\"/glossary/fine-tuning\" class=\"text-primary hover:text-primary-light underline\" title=\"Fine-Tuning\"\u003efine-tuning\u003c/a\u003e reading order and announcements.\u003c/li\u003e\n\u003cli class=\"ml-6 mb-2 text-gray-300\"\u003eRetest with a screen reader after fixes. Screen reader behavior depends on the browser, so test in at least two browser and screen reader combinations (Safari+VoiceOver and Chrome+NVDA cover the majority of users).\u003c/li\u003e\n\u003c/ol\u003e\n\u003chr class=\"my-12 border-white/10\" /\u003e\n\u003ch2 id=\"the-template\" class=\"text-3xl font-bold mt-12 mb-6 text-white\"\u003eThe Template\u003c/h2\u003e\n\u003ch3 id=\"optimization-overview\" class=\"text-2xl font-bold mt-8 mb-4 text-white\"\u003eOptimization Overview\u003c/h3\u003e\n\u003cdiv style=\"overflow-x:auto;margin:2rem 0;border-radius:0.75rem;border:1px solid rgba(255,255,255,0.1);background:rgba(255,255,255,0.03)\"\u003e\u003ctable style=\"width:100%;border-collapse:collapse;margin:0\"\u003e\u003cthead\u003e\u003ctr style=\"background:rgba(255,255,255,0.06)\"\u003e\u003cth style=\"text-align:left;padding:0.875rem 1.25rem;font-size:0.875rem;font-weight:600;text-transform:uppercase;letter-spacing:0.05em;color:#06b6d4;border-bottom:1px solid rgba(255,255,255,0.1)\"\u003eField\u003c/th\u003e\u003cth style=\"text-align:left;padding:0.875rem 1.25rem;font-size:0.875rem;font-weight:600;text-transform:uppercase;letter-spacing:0.05em;color:#06b6d4;border-bottom:1px solid rgba(255,255,255,0.1)\"\u003eDetails\u003c/th\u003e\u003c/tr\u003e\u003c/thead\u003e\u003ctbody\u003e\u003ctr style=\"\"\u003e\u003ctd style=\"padding:0.875rem 1.25rem;color:#ffffff;font-weight:500;border-bottom:1px solid rgba(255,255,255,0.05)\"\u003e\u003cstrong class=\"text-white\"\u003eProduct / Feature\u003c/strong\u003e\u003c/td\u003e\u003ctd style=\"padding:0.875rem 1.25rem;color:#d1d5db;border-bottom:1px solid rgba(255,255,255,0.05)\"\u003e[Name]\u003c/td\u003e\u003c/tr\u003e\u003ctr style=\"background:rgba(255,255,255,0.02)\"\u003e\u003ctd style=\"padding:0.875rem 1.25rem;color:#ffffff;font-weight:500;border-bottom:1px solid rgba(255,255,255,0.05)\"\u003e\u003cstrong class=\"text-white\"\u003eOptimization Lead\u003c/strong\u003e\u003c/td\u003e\u003ctd style=\"padding:0.875rem 1.25rem;color:#d1d5db;border-bottom:1px solid rgba(255,255,255,0.05)\"\u003e[Name]\u003c/td\u003e\u003c/tr\u003e\u003ctr style=\"\"\u003e\u003ctd style=\"padding:0.875rem 1.25rem;color:#ffffff;font-weight:500;border-bottom:1px solid rgba(255,255,255,0.05)\"\u003e\u003cstrong class=\"text-white\"\u003eDate\u003c/strong\u003e\u003c/td\u003e\u003ctd style=\"padding:0.875rem 1.25rem;color:#d1d5db;border-bottom:1px solid rgba(255,255,255,0.05)\"\u003e[Date]\u003c/td\u003e\u003c/tr\u003e\u003ctr style=\"background:rgba(255,255,255,0.02)\"\u003e\u003ctd style=\"padding:0.875rem 1.25rem;color:#ffffff;font-weight:500;border-bottom:1px solid rgba(255,255,255,0.05)\"\u003e\u003cstrong class=\"text-white\"\u003ePages/Flows Reviewed\u003c/strong\u003e\u003c/td\u003e\u003ctd style=\"padding:0.875rem 1.25rem;color:#d1d5db;border-bottom:1px solid rgba(255,255,255,0.05)\"\u003e[List pages or flows]\u003c/td\u003e\u003c/tr\u003e\u003ctr style=\"\"\u003e\u003ctd style=\"padding:0.875rem 1.25rem;color:#ffffff;font-weight:500;border-bottom:1px solid rgba(255,255,255,0.05)\"\u003e\u003cstrong class=\"text-white\"\u003eScreen Readers Tested\u003c/strong\u003e\u003c/td\u003e\u003ctd style=\"padding:0.875rem 1.25rem;color:#d1d5db;border-bottom:1px solid rgba(255,255,255,0.05)\"\u003e[VoiceOver + Safari / NVDA + Chrome / etc.]\u003c/td\u003e\u003c/tr\u003e\u003c/tbody\u003e\u003c/table\u003e\u003c/div\u003e\n\u003chr class=\"my-12 border-white/10\" /\u003e\n\u003ch3 id=\"area-1-document-structure\" class=\"text-2xl font-bold mt-8 mb-4 text-white\"\u003eArea 1: Document Structure\u003c/h3\u003e\n\u003cp class=\"mb-4 leading-relaxed text-gray-300\"\u003e\u003cstrong class=\"text-white\"\u003eWhy it matters:\u003c/strong\u003e Screen reader users rely on document structure to understand the page's content hierarchy. Without proper structure, the page is a flat stream of text with no way to skip to relevant sections.\u003c/p\u003e\n\u003cdiv style=\"overflow-x:auto;margin:2rem 0;border-radius:0.75rem;border:1px solid rgba(255,255,255,0.1);background:rgba(255,255,255,0.03)\"\u003e\u003ctable style=\"width:100%;border-collapse:collapse;margin:0\"\u003e\u003cthead\u003e\u003ctr style=\"background:rgba(255,255,255,0.06)\"\u003e\u003cth style=\"text-align:left;padding:0.875rem 1.25rem;font-size:0.875rem;font-weight:600;text-transform:uppercase;letter-spacing:0.05em;color:#06b6d4;border-bottom:1px solid rgba(255,255,255,0.1)\"\u003eCriterion\u003c/th\u003e\u003cth style=\"text-align:left;padding:0.875rem 1.25rem;font-size:0.875rem;font-weight:600;text-transform:uppercase;letter-spacing:0.05em;color:#06b6d4;border-bottom:1px solid rgba(255,255,255,0.1)\"\u003eStatus\u003c/th\u003e\u003cth style=\"text-align:left;padding:0.875rem 1.25rem;font-size:0.875rem;font-weight:600;text-transform:uppercase;letter-spacing:0.05em;color:#06b6d4;border-bottom:1px solid rgba(255,255,255,0.1)\"\u003eNotes\u003c/th\u003e\u003c/tr\u003e\u003c/thead\u003e\u003ctbody\u003e\u003ctr style=\"\"\u003e\u003ctd style=\"padding:0.875rem 1.25rem;color:#ffffff;font-weight:500;border-bottom:1px solid rgba(255,255,255,0.05)\"\u003eEvery page has exactly one \u003ccode class=\"bg-dark-800 px-2 py-1 rounded text-primary text-sm\"\u003e\u003ch1\u003e\u003c/code\u003e that describes the page's primary content\u003c/td\u003e\u003ctd style=\"padding:0.875rem 1.25rem;color:#d1d5db;border-bottom:1px solid rgba(255,255,255,0.05)\"\u003e\u003cspan class=\"text-gray-500\"\u003e\u0026#9744;\u003c/span\u003e Pass / \u003cspan class=\"text-gray-500\"\u003e\u0026#9744;\u003c/span\u003e Fail\u003c/td\u003e\u003c/tr\u003e\u003ctr style=\"background:rgba(255,255,255,0.02)\"\u003e\u003ctd style=\"padding:0.875rem 1.25rem;color:#ffffff;font-weight:500;border-bottom:1px solid rgba(255,255,255,0.05)\"\u003eThe \u003ccode class=\"bg-dark-800 px-2 py-1 rounded text-primary text-sm\"\u003e\u003ctitle\u003e\u003c/code\u003e element accurately describes the page (announced on page load)\u003c/td\u003e\u003ctd style=\"padding:0.875rem 1.25rem;color:#d1d5db;border-bottom:1px solid rgba(255,255,255,0.05)\"\u003e\u003cspan class=\"text-gray-500\"\u003e\u0026#9744;\u003c/span\u003e Pass / \u003cspan class=\"text-gray-500\"\u003e\u0026#9744;\u003c/span\u003e Fail\u003c/td\u003e\u003c/tr\u003e\u003ctr style=\"\"\u003e\u003ctd style=\"padding:0.875rem 1.25rem;color:#ffffff;font-weight:500;border-bottom:1px solid rgba(255,255,255,0.05)\"\u003eThe \u003ccode class=\"bg-dark-800 px-2 py-1 rounded text-primary text-sm\"\u003e\u003chtml\u003e\u003c/code\u003e element has a \u003ccode class=\"bg-dark-800 px-2 py-1 rounded text-primary text-sm\"\u003elang\u003c/code\u003e attribute matching the page language\u003c/td\u003e\u003ctd style=\"padding:0.875rem 1.25rem;color:#d1d5db;border-bottom:1px solid rgba(255,255,255,0.05)\"\u003e\u003cspan class=\"text-gray-500\"\u003e\u0026#9744;\u003c/span\u003e Pass / \u003cspan class=\"text-gray-500\"\u003e\u0026#9744;\u003c/span\u003e Fail\u003c/td\u003e\u003c/tr\u003e\u003ctr style=\"background:rgba(255,255,255,0.02)\"\u003e\u003ctd style=\"padding:0.875rem 1.25rem;color:#ffffff;font-weight:500;border-bottom:1px solid rgba(255,255,255,0.05)\"\u003eLists use \u003ccode class=\"bg-dark-800 px-2 py-1 rounded text-primary text-sm\"\u003e\u003cul\u003e\u003c/code\u003e, \u003ccode class=\"bg-dark-800 px-2 py-1 rounded text-primary text-sm\"\u003e\u003col\u003e\u003c/code\u003e, or \u003ccode class=\"bg-dark-800 px-2 py-1 rounded text-primary text-sm\"\u003e\u003cdl\u003e\u003c/code\u003e elements (not styled \u003ccode class=\"bg-dark-800 px-2 py-1 rounded text-primary text-sm\"\u003e\u003cdiv\u003e\u003c/code\u003e elements)\u003c/td\u003e\u003ctd style=\"padding:0.875rem 1.25rem;color:#d1d5db;border-bottom:1px solid rgba(255,255,255,0.05)\"\u003e\u003cspan class=\"text-gray-500\"\u003e\u0026#9744;\u003c/span\u003e Pass / \u003cspan class=\"text-gray-500\"\u003e\u0026#9744;\u003c/span\u003e Fail\u003c/td\u003e\u003c/tr\u003e\u003ctr style=\"\"\u003e\u003ctd style=\"padding:0.875rem 1.25rem;color:#ffffff;font-weight:500;border-bottom:1px solid rgba(255,255,255,0.05)\"\u003eData tables use \u003ccode class=\"bg-dark-800 px-2 py-1 rounded text-primary text-sm\"\u003e\u003ctable\u003e\u003c/code\u003e with \u003ccode class=\"bg-dark-800 px-2 py-1 rounded text-primary text-sm\"\u003e\u003cth\u003e\u003c/code\u003e for headers and \u003ccode class=\"bg-dark-800 px-2 py-1 rounded text-primary text-sm\"\u003e\u003ccaption\u003e\u003c/code\u003e for the table title\u003c/td\u003e\u003ctd style=\"padding:0.875rem 1.25rem;color:#d1d5db;border-bottom:1px solid rgba(255,255,255,0.05)\"\u003e\u003cspan class=\"text-gray-500\"\u003e\u0026#9744;\u003c/span\u003e Pass / \u003cspan class=\"text-gray-500\"\u003e\u0026#9744;\u003c/span\u003e Fail\u003c/td\u003e\u003c/tr\u003e\u003ctr style=\"background:rgba(255,255,255,0.02)\"\u003e\u003ctd style=\"padding:0.875rem 1.25rem;color:#ffffff;font-weight:500;border-bottom:1px solid rgba(255,255,255,0.05)\"\u003eLayout tables are not used (use CSS grid or flexbox instead)\u003c/td\u003e\u003ctd style=\"padding:0.875rem 1.25rem;color:#d1d5db;border-bottom:1px solid rgba(255,255,255,0.05)\"\u003e\u003cspan class=\"text-gray-500\"\u003e\u0026#9744;\u003c/span\u003e Pass / \u003cspan class=\"text-gray-500\"\u003e\u0026#9744;\u003c/span\u003e Fail\u003c/td\u003e\u003c/tr\u003e\u003ctr style=\"\"\u003e\u003ctd style=\"padding:0.875rem 1.25rem;color:#ffffff;font-weight:500;border-bottom:1px solid rgba(255,255,255,0.05)\"\u003e\u003ccode class=\"bg-dark-800 px-2 py-1 rounded text-primary text-sm\"\u003e\u003cmain\u003e\u003c/code\u003e, \u003ccode class=\"bg-dark-800 px-2 py-1 rounded text-primary text-sm\"\u003e\u003cnav\u003e\u003c/code\u003e, \u003ccode class=\"bg-dark-800 px-2 py-1 rounded text-primary text-sm\"\u003e\u003cheader\u003e\u003c/code\u003e, \u003ccode class=\"bg-dark-800 px-2 py-1 rounded text-primary text-sm\"\u003e\u003cfooter\u003e\u003c/code\u003e, and \u003ccode class=\"bg-dark-800 px-2 py-1 rounded text-primary text-sm\"\u003e\u003caside\u003e\u003c/code\u003e elements define page regions\u003c/td\u003e\u003ctd style=\"padding:0.875rem 1.25rem;color:#d1d5db;border-bottom:1px solid rgba(255,255,255,0.05)\"\u003e\u003cspan class=\"text-gray-500\"\u003e\u0026#9744;\u003c/span\u003e Pass / \u003cspan class=\"text-gray-500\"\u003e\u0026#9744;\u003c/span\u003e Fail\u003c/td\u003e\u003c/tr\u003e\u003ctr style=\"background:rgba(255,255,255,0.02)\"\u003e\u003ctd style=\"padding:0.875rem 1.25rem;color:#ffffff;font-weight:500;border-bottom:1px solid rgba(255,255,255,0.05)\"\u003eSections of different languages are marked with \u003ccode class=\"bg-dark-800 px-2 py-1 rounded text-primary text-sm\"\u003elang\u003c/code\u003e attributes\u003c/td\u003e\u003ctd style=\"padding:0.875rem 1.25rem;color:#d1d5db;border-bottom:1px solid rgba(255,255,255,0.05)\"\u003e\u003cspan class=\"text-gray-500\"\u003e\u0026#9744;\u003c/span\u003e Pass / \u003cspan class=\"text-gray-500\"\u003e\u0026#9744;\u003c/span\u003e Fail\u003c/td\u003e\u003c/tr\u003e\u003c/tbody\u003e\u003c/table\u003e\u003c/div\u003e\n\u003chr class=\"my-12 border-white/10\" /\u003e\n\u003ch3 id=\"area-2-heading-hierarchy\" class=\"text-2xl font-bold mt-8 mb-4 text-white\"\u003eArea 2: Heading Hierarchy\u003c/h3\u003e\n\u003cp class=\"mb-4 leading-relaxed text-gray-300\"\u003e\u003cstrong class=\"text-white\"\u003eWhy it matters:\u003c/strong\u003e Screen reader users navigate by headings more than any other method. The WebAIM \u003ca href=\"/glossary/survey\" class=\"text-primary hover:text-primary-light underline\" title=\"Survey\"\u003esurvey\u003c/a\u003e found that 67.5% of screen reader users use headings as their primary navigation method. A correct heading hierarchy lets users jump to the section they want in seconds.\u003c/p\u003e\n\u003cp class=\"mb-4 leading-relaxed text-gray-300\"\u003e\u003cstrong class=\"text-white\"\u003eRules:\u003c/strong\u003e\u003c/p\u003e\n\u003cul class=\"my-4 list-disc\"\u003e\n\u003cli class=\"ml-6 mb-2 text-gray-300\"\u003eOne \u003ccode class=\"bg-dark-800 px-2 py-1 rounded text-primary text-sm\"\u003e\u003ch1\u003e\u003c/code\u003e per page (the page title)\u003c/li\u003e\n\u003cli class=\"ml-6 mb-2 text-gray-300\"\u003eNo skipped levels (no \u003ccode class=\"bg-dark-800 px-2 py-1 rounded text-primary text-sm\"\u003e\u003ch2\u003e\u003c/code\u003e followed by \u003ccode class=\"bg-dark-800 px-2 py-1 rounded text-primary text-sm\"\u003e\u003ch4\u003e\u003c/code\u003e)\u003c/li\u003e\n\u003cli class=\"ml-6 mb-2 text-gray-300\"\u003eHeadings describe the content that follows (not decorative text)\u003c/li\u003e\n\u003cli class=\"ml-6 mb-2 text-gray-300\"\u003eEvery major section starts with a heading\u003c/li\u003e\n\u003c/ul\u003e\n\u003cdiv style=\"overflow-x:auto;margin:2rem 0;border-radius:0.75rem;border:1px solid rgba(255,255,255,0.1);background:rgba(255,255,255,0.03)\"\u003e\u003ctable style=\"width:100%;border-collapse:collapse;margin:0\"\u003e\u003cthead\u003e\u003ctr style=\"background:rgba(255,255,255,0.06)\"\u003e\u003cth style=\"text-align:left;padding:0.875rem 1.25rem;font-size:0.875rem;font-weight:600;text-transform:uppercase;letter-spacing:0.05em;color:#06b6d4;border-bottom:1px solid rgba(255,255,255,0.1)\"\u003eCheck\u003c/th\u003e\u003cth style=\"text-align:left;padding:0.875rem 1.25rem;font-size:0.875rem;font-weight:600;text-transform:uppercase;letter-spacing:0.05em;color:#06b6d4;border-bottom:1px solid rgba(255,255,255,0.1)\"\u003eStatus\u003c/th\u003e\u003cth style=\"text-align:left;padding:0.875rem 1.25rem;font-size:0.875rem;font-weight:600;text-transform:uppercase;letter-spacing:0.05em;color:#06b6d4;border-bottom:1px solid rgba(255,255,255,0.1)\"\u003eNotes\u003c/th\u003e\u003c/tr\u003e\u003c/thead\u003e\u003ctbody\u003e\u003ctr style=\"\"\u003e\u003ctd style=\"padding:0.875rem 1.25rem;color:#ffffff;font-weight:500;border-bottom:1px solid rgba(255,255,255,0.05)\"\u003eOnly one \u003ccode class=\"bg-dark-800 px-2 py-1 rounded text-primary text-sm\"\u003e\u003ch1\u003e\u003c/code\u003e on the page\u003c/td\u003e\u003ctd style=\"padding:0.875rem 1.25rem;color:#d1d5db;border-bottom:1px solid rgba(255,255,255,0.05)\"\u003e\u003cspan class=\"text-gray-500\"\u003e\u0026#9744;\u003c/span\u003e Pass / \u003cspan class=\"text-gray-500\"\u003e\u0026#9744;\u003c/span\u003e Fail\u003c/td\u003e\u003c/tr\u003e\u003ctr style=\"background:rgba(255,255,255,0.02)\"\u003e\u003ctd style=\"padding:0.875rem 1.25rem;color:#ffffff;font-weight:500;border-bottom:1px solid rgba(255,255,255,0.05)\"\u003eNo skipped heading levels (h1 \u003e h2 \u003e h3 \u003e ...)\u003c/td\u003e\u003ctd style=\"padding:0.875rem 1.25rem;color:#d1d5db;border-bottom:1px solid rgba(255,255,255,0.05)\"\u003e\u003cspan class=\"text-gray-500\"\u003e\u0026#9744;\u003c/span\u003e Pass / \u003cspan class=\"text-gray-500\"\u003e\u0026#9744;\u003c/span\u003e Fail\u003c/td\u003e\u003c/tr\u003e\u003ctr style=\"\"\u003e\u003ctd style=\"padding:0.875rem 1.25rem;color:#ffffff;font-weight:500;border-bottom:1px solid rgba(255,255,255,0.05)\"\u003eEvery section of content has a heading\u003c/td\u003e\u003ctd style=\"padding:0.875rem 1.25rem;color:#d1d5db;border-bottom:1px solid rgba(255,255,255,0.05)\"\u003e\u003cspan class=\"text-gray-500\"\u003e\u0026#9744;\u003c/span\u003e Pass / \u003cspan class=\"text-gray-500\"\u003e\u0026#9744;\u003c/span\u003e Fail\u003c/td\u003e\u003c/tr\u003e\u003ctr style=\"background:rgba(255,255,255,0.02)\"\u003e\u003ctd style=\"padding:0.875rem 1.25rem;color:#ffffff;font-weight:500;border-bottom:1px solid rgba(255,255,255,0.05)\"\u003eHeadings are descriptive (not \"Section 1\" or styled paragraphs)\u003c/td\u003e\u003ctd style=\"padding:0.875rem 1.25rem;color:#d1d5db;border-bottom:1px solid rgba(255,255,255,0.05)\"\u003e\u003cspan class=\"text-gray-500\"\u003e\u0026#9744;\u003c/span\u003e Pass / \u003cspan class=\"text-gray-500\"\u003e\u0026#9744;\u003c/span\u003e Fail\u003c/td\u003e\u003c/tr\u003e\u003ctr style=\"\"\u003e\u003ctd style=\"padding:0.875rem 1.25rem;color:#ffffff;font-weight:500;border-bottom:1px solid rgba(255,255,255,0.05)\"\u003eVisual headings use actual heading elements (not bold \u003ccode class=\"bg-dark-800 px-2 py-1 rounded text-primary text-sm\"\u003e\u003cp\u003e\u003c/code\u003e or \u003ccode class=\"bg-dark-800 px-2 py-1 rounded text-primary text-sm\"\u003e\u003cdiv\u003e\u003c/code\u003e)\u003c/td\u003e\u003ctd style=\"padding:0.875rem 1.25rem;color:#d1d5db;border-bottom:1px solid rgba(255,255,255,0.05)\"\u003e\u003cspan class=\"text-gray-500\"\u003e\u0026#9744;\u003c/span\u003e Pass / \u003cspan class=\"text-gray-500\"\u003e\u0026#9744;\u003c/span\u003e Fail\u003c/td\u003e\u003c/tr\u003e\u003ctr style=\"background:rgba(255,255,255,0.02)\"\u003e\u003ctd style=\"padding:0.875rem 1.25rem;color:#ffffff;font-weight:500;border-bottom:1px solid rgba(255,255,255,0.05)\"\u003eHidden headings (for screen reader navigation) use \u003ccode class=\"bg-dark-800 px-2 py-1 rounded text-primary text-sm\"\u003e.sr-only\u003c/code\u003e class, not \u003ccode class=\"bg-dark-800 px-2 py-1 rounded text-primary text-sm\"\u003edisplay:none\u003c/code\u003e\u003c/td\u003e\u003ctd style=\"padding:0.875rem 1.25rem;color:#d1d5db;border-bottom:1px solid rgba(255,255,255,0.05)\"\u003e\u003cspan class=\"text-gray-500\"\u003e\u0026#9744;\u003c/span\u003e Pass / \u003cspan class=\"text-gray-500\"\u003e\u0026#9744;\u003c/span\u003e Fail\u003c/td\u003e\u003c/tr\u003e\u003c/tbody\u003e\u003c/table\u003e\u003c/div\u003e\n\u003cp class=\"mb-4 leading-relaxed text-gray-300\"\u003e\u003cstrong class=\"text-white\"\u003eHeading outline for this page:\u003c/strong\u003e\u003c/p\u003e\n\u003cpre class=\"bg-dark-800 rounded-xl p-4 my-6 overflow-x-auto border border-white/10\"\u003e\u003ccode class=\"text-sm text-gray-300\"\u003eh1: [Page title]\n h2: [Section 1]\n h3: [Subsection 1.1]\n h3: [Subsection 1.2]\n h2: [Section 2]\n h3: [Subsection 2.1]\n h2: [Section 3]\u003c/code\u003e\u003c/pre\u003e\n\u003cp class=\"mb-4 leading-relaxed text-gray-300\"\u003eDocument the current heading outline above. Flag any deviations from a clean hierarchy.\u003c/p\u003e\n\u003chr class=\"my-12 border-white/10\" /\u003e\n\u003ch3 id=\"area-3-landmarks\" class=\"text-2xl font-bold mt-8 mb-4 text-white\"\u003eArea 3: Landmarks\u003c/h3\u003e\n\u003cp class=\"mb-4 leading-relaxed text-gray-300\"\u003e\u003cstrong class=\"text-white\"\u003eWhy it matters:\u003c/strong\u003e Landmarks are the screen reader equivalent of a page layout. Users jump between landmarks to quickly reach the navigation, main content, search, or footer without Tabbing through every element.\u003c/p\u003e\n\u003cp class=\"mb-4 leading-relaxed text-gray-300\"\u003e\u003cstrong class=\"text-white\"\u003eRequired landmarks:\u003c/strong\u003e\u003c/p\u003e\n\u003cdiv style=\"overflow-x:auto;margin:2rem 0;border-radius:0.75rem;border:1px solid rgba(255,255,255,0.1);background:rgba(255,255,255,0.03)\"\u003e\u003ctable style=\"width:100%;border-collapse:collapse;margin:0\"\u003e\u003cthead\u003e\u003ctr style=\"background:rgba(255,255,255,0.06)\"\u003e\u003cth style=\"text-align:left;padding:0.875rem 1.25rem;font-size:0.875rem;font-weight:600;text-transform:uppercase;letter-spacing:0.05em;color:#06b6d4;border-bottom:1px solid rgba(255,255,255,0.1)\"\u003eLandmark\u003c/th\u003e\u003cth style=\"text-align:left;padding:0.875rem 1.25rem;font-size:0.875rem;font-weight:600;text-transform:uppercase;letter-spacing:0.05em;color:#06b6d4;border-bottom:1px solid rgba(255,255,255,0.1)\"\u003eHTML Element\u003c/th\u003e\u003cth style=\"text-align:left;padding:0.875rem 1.25rem;font-size:0.875rem;font-weight:600;text-transform:uppercase;letter-spacing:0.05em;color:#06b6d4;border-bottom:1px solid rgba(255,255,255,0.1)\"\u003eRequired?\u003c/th\u003e\u003cth style=\"text-align:left;padding:0.875rem 1.25rem;font-size:0.875rem;font-weight:600;text-transform:uppercase;letter-spacing:0.05em;color:#06b6d4;border-bottom:1px solid rgba(255,255,255,0.1)\"\u003eContent\u003c/th\u003e\u003c/tr\u003e\u003c/thead\u003e\u003ctbody\u003e\u003ctr style=\"\"\u003e\u003ctd style=\"padding:0.875rem 1.25rem;color:#ffffff;font-weight:500;border-bottom:1px solid rgba(255,255,255,0.05)\"\u003eBanner\u003c/td\u003e\u003ctd style=\"padding:0.875rem 1.25rem;color:#d1d5db;border-bottom:1px solid rgba(255,255,255,0.05)\"\u003e\u003ccode class=\"bg-dark-800 px-2 py-1 rounded text-primary text-sm\"\u003e\u003cheader\u003e\u003c/code\u003e\u003c/td\u003e\u003ctd style=\"padding:0.875rem 1.25rem;color:#d1d5db;border-bottom:1px solid rgba(255,255,255,0.05)\"\u003eYes (one per page)\u003c/td\u003e\u003ctd style=\"padding:0.875rem 1.25rem;color:#d1d5db;border-bottom:1px solid rgba(255,255,255,0.05)\"\u003eSite header with logo and navigation\u003c/td\u003e\u003c/tr\u003e\u003ctr style=\"background:rgba(255,255,255,0.02)\"\u003e\u003ctd style=\"padding:0.875rem 1.25rem;color:#ffffff;font-weight:500;border-bottom:1px solid rgba(255,255,255,0.05)\"\u003eNavigation\u003c/td\u003e\u003ctd style=\"padding:0.875rem 1.25rem;color:#d1d5db;border-bottom:1px solid rgba(255,255,255,0.05)\"\u003e\u003ccode class=\"bg-dark-800 px-2 py-1 rounded text-primary text-sm\"\u003e\u003cnav\u003e\u003c/code\u003e\u003c/td\u003e\u003ctd style=\"padding:0.875rem 1.25rem;color:#d1d5db;border-bottom:1px solid rgba(255,255,255,0.05)\"\u003eYes (one or more)\u003c/td\u003e\u003ctd style=\"padding:0.875rem 1.25rem;color:#d1d5db;border-bottom:1px solid rgba(255,255,255,0.05)\"\u003ePrimary and secondary navigation menus\u003c/td\u003e\u003c/tr\u003e\u003ctr style=\"\"\u003e\u003ctd style=\"padding:0.875rem 1.25rem;color:#ffffff;font-weight:500;border-bottom:1px solid rgba(255,255,255,0.05)\"\u003eMain\u003c/td\u003e\u003ctd style=\"padding:0.875rem 1.25rem;color:#d1d5db;border-bottom:1px solid rgba(255,255,255,0.05)\"\u003e\u003ccode class=\"bg-dark-800 px-2 py-1 rounded text-primary text-sm\"\u003e\u003cmain\u003e\u003c/code\u003e\u003c/td\u003e\u003ctd style=\"padding:0.875rem 1.25rem;color:#d1d5db;border-bottom:1px solid rgba(255,255,255,0.05)\"\u003eYes (one per page)\u003c/td\u003e\u003ctd style=\"padding:0.875rem 1.25rem;color:#d1d5db;border-bottom:1px solid rgba(255,255,255,0.05)\"\u003eThe page's primary content\u003c/td\u003e\u003c/tr\u003e\u003ctr style=\"background:rgba(255,255,255,0.02)\"\u003e\u003ctd style=\"padding:0.875rem 1.25rem;color:#ffffff;font-weight:500;border-bottom:1px solid rgba(255,255,255,0.05)\"\u003eComplementary\u003c/td\u003e\u003ctd style=\"padding:0.875rem 1.25rem;color:#d1d5db;border-bottom:1px solid rgba(255,255,255,0.05)\"\u003e\u003ccode class=\"bg-dark-800 px-2 py-1 rounded text-primary text-sm\"\u003e\u003caside\u003e\u003c/code\u003e\u003c/td\u003e\u003ctd style=\"padding:0.875rem 1.25rem;color:#d1d5db;border-bottom:1px solid rgba(255,255,255,0.05)\"\u003eIf applicable\u003c/td\u003e\u003ctd style=\"padding:0.875rem 1.25rem;color:#d1d5db;border-bottom:1px solid rgba(255,255,255,0.05)\"\u003eSidebar content, related links\u003c/td\u003e\u003c/tr\u003e\u003ctr style=\"\"\u003e\u003ctd style=\"padding:0.875rem 1.25rem;color:#ffffff;font-weight:500;border-bottom:1px solid rgba(255,255,255,0.05)\"\u003eSearch\u003c/td\u003e\u003ctd style=\"padding:0.875rem 1.25rem;color:#d1d5db;border-bottom:1px solid rgba(255,255,255,0.05)\"\u003e\u003ccode class=\"bg-dark-800 px-2 py-1 rounded text-primary text-sm\"\u003e\u003csearch\u003e\u003c/code\u003e or \u003ccode class=\"bg-dark-800 px-2 py-1 rounded text-primary text-sm\"\u003erole=\"search\"\u003c/code\u003e\u003c/td\u003e\u003ctd style=\"padding:0.875rem 1.25rem;color:#d1d5db;border-bottom:1px solid rgba(255,255,255,0.05)\"\u003eIf applicable\u003c/td\u003e\u003ctd style=\"padding:0.875rem 1.25rem;color:#d1d5db;border-bottom:1px solid rgba(255,255,255,0.05)\"\u003eSite search form\u003c/td\u003e\u003c/tr\u003e\u003ctr style=\"background:rgba(255,255,255,0.02)\"\u003e\u003ctd style=\"padding:0.875rem 1.25rem;color:#ffffff;font-weight:500;border-bottom:1px solid rgba(255,255,255,0.05)\"\u003eContent Info\u003c/td\u003e\u003ctd style=\"padding:0.875rem 1.25rem;color:#d1d5db;border-bottom:1px solid rgba(255,255,255,0.05)\"\u003e\u003ccode class=\"bg-dark-800 px-2 py-1 rounded text-primary text-sm\"\u003e\u003cfooter\u003e\u003c/code\u003e\u003c/td\u003e\u003ctd style=\"padding:0.875rem 1.25rem;color:#d1d5db;border-bottom:1px solid rgba(255,255,255,0.05)\"\u003eYes (one per page)\u003c/td\u003e\u003ctd style=\"padding:0.875rem 1.25rem;color:#d1d5db;border-bottom:1px solid rgba(255,255,255,0.05)\"\u003eSite footer with links and copyright\u003c/td\u003e\u003c/tr\u003e\u003c/tbody\u003e\u003c/table\u003e\u003c/div\u003e\n\u003cdiv style=\"overflow-x:auto;margin:2rem 0;border-radius:0.75rem;border:1px solid rgba(255,255,255,0.1);background:rgba(255,255,255,0.03)\"\u003e\u003ctable style=\"width:100%;border-collapse:collapse;margin:0\"\u003e\u003cthead\u003e\u003ctr style=\"background:rgba(255,255,255,0.06)\"\u003e\u003cth style=\"text-align:left;padding:0.875rem 1.25rem;font-size:0.875rem;font-weight:600;text-transform:uppercase;letter-spacing:0.05em;color:#06b6d4;border-bottom:1px solid rgba(255,255,255,0.1)\"\u003eCheck\u003c/th\u003e\u003cth style=\"text-align:left;padding:0.875rem 1.25rem;font-size:0.875rem;font-weight:600;text-transform:uppercase;letter-spacing:0.05em;color:#06b6d4;border-bottom:1px solid rgba(255,255,255,0.1)\"\u003eStatus\u003c/th\u003e\u003cth style=\"text-align:left;padding:0.875rem 1.25rem;font-size:0.875rem;font-weight:600;text-transform:uppercase;letter-spacing:0.05em;color:#06b6d4;border-bottom:1px solid rgba(255,255,255,0.1)\"\u003eNotes\u003c/th\u003e\u003c/tr\u003e\u003c/thead\u003e\u003ctbody\u003e\u003ctr style=\"\"\u003e\u003ctd style=\"padding:0.875rem 1.25rem;color:#ffffff;font-weight:500;border-bottom:1px solid rgba(255,255,255,0.05)\"\u003e\u003ccode class=\"bg-dark-800 px-2 py-1 rounded text-primary text-sm\"\u003e\u003cmain\u003e\u003c/code\u003e element wraps the primary content\u003c/td\u003e\u003ctd style=\"padding:0.875rem 1.25rem;color:#d1d5db;border-bottom:1px solid rgba(255,255,255,0.05)\"\u003e\u003cspan class=\"text-gray-500\"\u003e\u0026#9744;\u003c/span\u003e Pass / \u003cspan class=\"text-gray-500\"\u003e\u0026#9744;\u003c/span\u003e Fail\u003c/td\u003e\u003c/tr\u003e\u003ctr style=\"background:rgba(255,255,255,0.02)\"\u003e\u003ctd style=\"padding:0.875rem 1.25rem;color:#ffffff;font-weight:500;border-bottom:1px solid rgba(255,255,255,0.05)\"\u003e\u003ccode class=\"bg-dark-800 px-2 py-1 rounded text-primary text-sm\"\u003e\u003cheader\u003e\u003c/code\u003e element wraps the site header\u003c/td\u003e\u003ctd style=\"padding:0.875rem 1.25rem;color:#d1d5db;border-bottom:1px solid rgba(255,255,255,0.05)\"\u003e\u003cspan class=\"text-gray-500\"\u003e\u0026#9744;\u003c/span\u003e Pass / \u003cspan class=\"text-gray-500\"\u003e\u0026#9744;\u003c/span\u003e Fail\u003c/td\u003e\u003c/tr\u003e\u003ctr style=\"\"\u003e\u003ctd style=\"padding:0.875rem 1.25rem;color:#ffffff;font-weight:500;border-bottom:1px solid rgba(255,255,255,0.05)\"\u003e\u003ccode class=\"bg-dark-800 px-2 py-1 rounded text-primary text-sm\"\u003e\u003cnav\u003e\u003c/code\u003e elements wrap navigation menus\u003c/td\u003e\u003ctd style=\"padding:0.875rem 1.25rem;color:#d1d5db;border-bottom:1px solid rgba(255,255,255,0.05)\"\u003e\u003cspan class=\"text-gray-500\"\u003e\u0026#9744;\u003c/span\u003e Pass / \u003cspan class=\"text-gray-500\"\u003e\u0026#9744;\u003c/span\u003e Fail\u003c/td\u003e\u003c/tr\u003e\u003ctr style=\"background:rgba(255,255,255,0.02)\"\u003e\u003ctd style=\"padding:0.875rem 1.25rem;color:#ffffff;font-weight:500;border-bottom:1px solid rgba(255,255,255,0.05)\"\u003eMultiple \u003ccode class=\"bg-dark-800 px-2 py-1 rounded text-primary text-sm\"\u003e\u003cnav\u003e\u003c/code\u003e elements each have a unique \u003ccode class=\"bg-dark-800 px-2 py-1 rounded text-primary text-sm\"\u003earia-label\u003c/code\u003e\u003c/td\u003e\u003ctd style=\"padding:0.875rem 1.25rem;color:#d1d5db;border-bottom:1px solid rgba(255,255,255,0.05)\"\u003e\u003cspan class=\"text-gray-500\"\u003e\u0026#9744;\u003c/span\u003e Pass / \u003cspan class=\"text-gray-500\"\u003e\u0026#9744;\u003c/span\u003e Fail\u003c/td\u003e\u003c/tr\u003e\u003ctr style=\"\"\u003e\u003ctd style=\"padding:0.875rem 1.25rem;color:#ffffff;font-weight:500;border-bottom:1px solid rgba(255,255,255,0.05)\"\u003e\u003ccode class=\"bg-dark-800 px-2 py-1 rounded text-primary text-sm\"\u003e\u003cfooter\u003e\u003c/code\u003e element wraps the site footer\u003c/td\u003e\u003ctd style=\"padding:0.875rem 1.25rem;color:#d1d5db;border-bottom:1px solid rgba(255,255,255,0.05)\"\u003e\u003cspan class=\"text-gray-500\"\u003e\u0026#9744;\u003c/span\u003e Pass / \u003cspan class=\"text-gray-500\"\u003e\u0026#9744;\u003c/span\u003e Fail\u003c/td\u003e\u003c/tr\u003e\u003ctr style=\"background:rgba(255,255,255,0.02)\"\u003e\u003ctd style=\"padding:0.875rem 1.25rem;color:#ffffff;font-weight:500;border-bottom:1px solid rgba(255,255,255,0.05)\"\u003eSearch form is wrapped in \u003ccode class=\"bg-dark-800 px-2 py-1 rounded text-primary text-sm\"\u003e\u003csearch\u003e\u003c/code\u003e or \u003ccode class=\"bg-dark-800 px-2 py-1 rounded text-primary text-sm\"\u003erole=\"search\"\u003c/code\u003e\u003c/td\u003e\u003ctd style=\"padding:0.875rem 1.25rem;color:#d1d5db;border-bottom:1px solid rgba(255,255,255,0.05)\"\u003e\u003cspan class=\"text-gray-500\"\u003e\u0026#9744;\u003c/span\u003e Pass / \u003cspan class=\"text-gray-500\"\u003e\u0026#9744;\u003c/span\u003e Fail\u003c/td\u003e\u003c/tr\u003e\u003ctr style=\"\"\u003e\u003ctd style=\"padding:0.875rem 1.25rem;color:#ffffff;font-weight:500;border-bottom:1px solid rgba(255,255,255,0.05)\"\u003eLandmarks do not overlap or nest incorrectly\u003c/td\u003e\u003ctd style=\"padding:0.875rem 1.25rem;color:#d1d5db;border-bottom:1px solid rgba(255,255,255,0.05)\"\u003e\u003cspan class=\"text-gray-500\"\u003e\u0026#9744;\u003c/span\u003e Pass / \u003cspan class=\"text-gray-500\"\u003e\u0026#9744;\u003c/span\u003e Fail\u003c/td\u003e\u003c/tr\u003e\u003c/tbody\u003e\u003c/table\u003e\u003c/div\u003e\n\u003chr class=\"my-12 border-white/10\" /\u003e\n\u003ch3 id=\"area-4-links-and-buttons\" class=\"text-2xl font-bold mt-8 mb-4 text-white\"\u003eArea 4: Links and Buttons\u003c/h3\u003e\n\u003cp class=\"mb-4 leading-relaxed text-gray-300\"\u003e\u003cstrong class=\"text-white\"\u003eWhy it matters:\u003c/strong\u003e Screen reader users can pull up a list of all links or buttons on a page. Each link's text must make sense out of context. \"Click here,\" \"Read more,\" and \"Learn more\" are useless in a link list because they do not describe the destination.\u003c/p\u003e\n\u003cdiv style=\"overflow-x:auto;margin:2rem 0;border-radius:0.75rem;border:1px solid rgba(255,255,255,0.1);background:rgba(255,255,255,0.03)\"\u003e\u003ctable style=\"width:100%;border-collapse:collapse;margin:0\"\u003e\u003cthead\u003e\u003ctr style=\"background:rgba(255,255,255,0.06)\"\u003e\u003cth style=\"text-align:left;padding:0.875rem 1.25rem;font-size:0.875rem;font-weight:600;text-transform:uppercase;letter-spacing:0.05em;color:#06b6d4;border-bottom:1px solid rgba(255,255,255,0.1)\"\u003eCheck\u003c/th\u003e\u003cth style=\"text-align:left;padding:0.875rem 1.25rem;font-size:0.875rem;font-weight:600;text-transform:uppercase;letter-spacing:0.05em;color:#06b6d4;border-bottom:1px solid rgba(255,255,255,0.1)\"\u003eStatus\u003c/th\u003e\u003cth style=\"text-align:left;padding:0.875rem 1.25rem;font-size:0.875rem;font-weight:600;text-transform:uppercase;letter-spacing:0.05em;color:#06b6d4;border-bottom:1px solid rgba(255,255,255,0.1)\"\u003eNotes\u003c/th\u003e\u003c/tr\u003e\u003c/thead\u003e\u003ctbody\u003e\u003ctr style=\"\"\u003e\u003ctd style=\"padding:0.875rem 1.25rem;color:#ffffff;font-weight:500;border-bottom:1px solid rgba(255,255,255,0.05)\"\u003eEvery link's text describes the destination or action\u003c/td\u003e\u003ctd style=\"padding:0.875rem 1.25rem;color:#d1d5db;border-bottom:1px solid rgba(255,255,255,0.05)\"\u003e\u003cspan class=\"text-gray-500\"\u003e\u0026#9744;\u003c/span\u003e Pass / \u003cspan class=\"text-gray-500\"\u003e\u0026#9744;\u003c/span\u003e Fail\u003c/td\u003e\u003c/tr\u003e\u003ctr style=\"background:rgba(255,255,255,0.02)\"\u003e\u003ctd style=\"padding:0.875rem 1.25rem;color:#ffffff;font-weight:500;border-bottom:1px solid rgba(255,255,255,0.05)\"\u003eNo links with generic text (\"click here\", \"read more\", \"learn more\") without \u003ccode class=\"bg-dark-800 px-2 py-1 rounded text-primary text-sm\"\u003earia-label\u003c/code\u003e context\u003c/td\u003e\u003ctd style=\"padding:0.875rem 1.25rem;color:#d1d5db;border-bottom:1px solid rgba(255,255,255,0.05)\"\u003e\u003cspan class=\"text-gray-500\"\u003e\u0026#9744;\u003c/span\u003e Pass / \u003cspan class=\"text-gray-500\"\u003e\u0026#9744;\u003c/span\u003e Fail\u003c/td\u003e\u003c/tr\u003e\u003ctr style=\"\"\u003e\u003ctd style=\"padding:0.875rem 1.25rem;color:#ffffff;font-weight:500;border-bottom:1px solid rgba(255,255,255,0.05)\"\u003eLinks that open in new tabs/windows indicate this (\u003ccode class=\"bg-dark-800 px-2 py-1 rounded text-primary text-sm\"\u003earia-label\u003c/code\u003e including \"opens in new tab\" or visual indicator)\u003c/td\u003e\u003ctd style=\"padding:0.875rem 1.25rem;color:#d1d5db;border-bottom:1px solid rgba(255,255,255,0.05)\"\u003e\u003cspan class=\"text-gray-500\"\u003e\u0026#9744;\u003c/span\u003e Pass / \u003cspan class=\"text-gray-500\"\u003e\u0026#9744;\u003c/span\u003e Fail\u003c/td\u003e\u003c/tr\u003e\u003ctr style=\"background:rgba(255,255,255,0.02)\"\u003e\u003ctd style=\"padding:0.875rem 1.25rem;color:#ffffff;font-weight:500;border-bottom:1px solid rgba(255,255,255,0.05)\"\u003eImage links have alt text describing the link destination (not the image)\u003c/td\u003e\u003ctd style=\"padding:0.875rem 1.25rem;color:#d1d5db;border-bottom:1px solid rgba(255,255,255,0.05)\"\u003e\u003cspan class=\"text-gray-500\"\u003e\u0026#9744;\u003c/span\u003e Pass / \u003cspan class=\"text-gray-500\"\u003e\u0026#9744;\u003c/span\u003e Fail\u003c/td\u003e\u003c/tr\u003e\u003ctr style=\"\"\u003e\u003ctd style=\"padding:0.875rem 1.25rem;color:#ffffff;font-weight:500;border-bottom:1px solid rgba(255,255,255,0.05)\"\u003eButtons use \u003ccode class=\"bg-dark-800 px-2 py-1 rounded text-primary text-sm\"\u003e\u003cbutton\u003e\u003c/code\u003e or \u003ccode class=\"bg-dark-800 px-2 py-1 rounded text-primary text-sm\"\u003erole=\"button\"\u003c/code\u003e, not \u003ccode class=\"bg-dark-800 px-2 py-1 rounded text-primary text-sm\"\u003e\u003ca\u003e\u003c/code\u003e without href or \u003ccode class=\"bg-dark-800 px-2 py-1 rounded text-primary text-sm\"\u003e\u003cdiv\u003e\u003c/code\u003e\u003c/td\u003e\u003ctd style=\"padding:0.875rem 1.25rem;color:#d1d5db;border-bottom:1px solid rgba(255,255,255,0.05)\"\u003e\u003cspan class=\"text-gray-500\"\u003e\u0026#9744;\u003c/span\u003e Pass / \u003cspan class=\"text-gray-500\"\u003e\u0026#9744;\u003c/span\u003e Fail\u003c/td\u003e\u003c/tr\u003e\u003ctr style=\"background:rgba(255,255,255,0.02)\"\u003e\u003ctd style=\"padding:0.875rem 1.25rem;color:#ffffff;font-weight:500;border-bottom:1px solid rgba(255,255,255,0.05)\"\u003eButton text describes the action (\"Save project\" not just \"Save\" when multiple save actions exist)\u003c/td\u003e\u003ctd style=\"padding:0.875rem 1.25rem;color:#d1d5db;border-bottom:1px solid rgba(255,255,255,0.05)\"\u003e\u003cspan class=\"text-gray-500\"\u003e\u0026#9744;\u003c/span\u003e Pass / \u003cspan class=\"text-gray-500\"\u003e\u0026#9744;\u003c/span\u003e Fail\u003c/td\u003e\u003c/tr\u003e\u003ctr style=\"\"\u003e\u003ctd style=\"padding:0.875rem 1.25rem;color:#ffffff;font-weight:500;border-bottom:1px solid rgba(255,255,255,0.05)\"\u003eAdjacent links to the same destination are combined (not \"Product Image\" link + \"Product Name\" link)\u003c/td\u003e\u003ctd style=\"padding:0.875rem 1.25rem;color:#d1d5db;border-bottom:1px solid rgba(255,255,255,0.05)\"\u003e\u003cspan class=\"text-gray-500\"\u003e\u0026#9744;\u003c/span\u003e Pass / \u003cspan class=\"text-gray-500\"\u003e\u0026#9744;\u003c/span\u003e Fail\u003c/td\u003e\u003c/tr\u003e\u003ctr style=\"background:rgba(255,255,255,0.02)\"\u003e\u003ctd style=\"padding:0.875rem 1.25rem;color:#ffffff;font-weight:500;border-bottom:1px solid rgba(255,255,255,0.05)\"\u003eSkip-to-content link is the first focusable element on every page\u003c/td\u003e\u003ctd style=\"padding:0.875rem 1.25rem;color:#d1d5db;border-bottom:1px solid rgba(255,255,255,0.05)\"\u003e\u003cspan class=\"text-gray-500\"\u003e\u0026#9744;\u003c/span\u003e Pass / \u003cspan class=\"text-gray-500\"\u003e\u0026#9744;\u003c/span\u003e Fail\u003c/td\u003e\u003c/tr\u003e\u003c/tbody\u003e\u003c/table\u003e\u003c/div\u003e\n\u003cp class=\"mb-4 leading-relaxed text-gray-300\"\u003e\u003cstrong class=\"text-white\"\u003eCommon fixes:\u003c/strong\u003e\u003c/p\u003e\n\u003cdiv style=\"overflow-x:auto;margin:2rem 0;border-radius:0.75rem;border:1px solid rgba(255,255,255,0.1);background:rgba(255,255,255,0.03)\"\u003e\u003ctable style=\"width:100%;border-collapse:collapse;margin:0\"\u003e\u003cthead\u003e\u003ctr style=\"background:rgba(255,255,255,0.06)\"\u003e\u003cth style=\"text-align:left;padding:0.875rem 1.25rem;font-size:0.875rem;font-weight:600;text-transform:uppercase;letter-spacing:0.05em;color:#06b6d4;border-bottom:1px solid rgba(255,255,255,0.1)\"\u003eProblem\u003c/th\u003e\u003cth style=\"text-align:left;padding:0.875rem 1.25rem;font-size:0.875rem;font-weight:600;text-transform:uppercase;letter-spacing:0.05em;color:#06b6d4;border-bottom:1px solid rgba(255,255,255,0.1)\"\u003eFix\u003c/th\u003e\u003c/tr\u003e\u003c/thead\u003e\u003ctbody\u003e\u003ctr style=\"\"\u003e\u003ctd style=\"padding:0.875rem 1.25rem;color:#ffffff;font-weight:500;border-bottom:1px solid rgba(255,255,255,0.05)\"\u003e\"Read more\" link\u003c/td\u003e\u003ctd style=\"padding:0.875rem 1.25rem;color:#d1d5db;border-bottom:1px solid rgba(255,255,255,0.05)\"\u003eChange to \"Read more about [topic]\" or use \u003ccode class=\"bg-dark-800 px-2 py-1 rounded text-primary text-sm\"\u003earia-label=\"Read more about [topic]\"\u003c/code\u003e\u003c/td\u003e\u003c/tr\u003e\u003ctr style=\"background:rgba(255,255,255,0.02)\"\u003e\u003ctd style=\"padding:0.875rem 1.25rem;color:#ffffff;font-weight:500;border-bottom:1px solid rgba(255,255,255,0.05)\"\u003eIcon-only button\u003c/td\u003e\u003ctd style=\"padding:0.875rem 1.25rem;color:#d1d5db;border-bottom:1px solid rgba(255,255,255,0.05)\"\u003eAdd \u003ccode class=\"bg-dark-800 px-2 py-1 rounded text-primary text-sm\"\u003earia-label=\"Search\"\u003c/code\u003e (or whatever the action is)\u003c/td\u003e\u003c/tr\u003e\u003ctr style=\"\"\u003e\u003ctd style=\"padding:0.875rem 1.25rem;color:#ffffff;font-weight:500;border-bottom:1px solid rgba(255,255,255,0.05)\"\u003e\"Click here\"\u003c/td\u003e\u003ctd style=\"padding:0.875rem 1.25rem;color:#d1d5db;border-bottom:1px solid rgba(255,255,255,0.05)\"\u003eRewrite: \"Download the Q3 report\" instead of \"Click here to download\"\u003c/td\u003e\u003c/tr\u003e\u003ctr style=\"background:rgba(255,255,255,0.02)\"\u003e\u003ctd style=\"padding:0.875rem 1.25rem;color:#ffffff;font-weight:500;border-bottom:1px solid rgba(255,255,255,0.05)\"\u003eImage inside a link\u003c/td\u003e\u003ctd style=\"padding:0.875rem 1.25rem;color:#d1d5db;border-bottom:1px solid rgba(255,255,255,0.05)\"\u003eSet alt text to the link destination: \"Product \u003ca href=\"/glossary/roadmap\" class=\"text-primary hover:text-primary-light underline\" title=\"Roadmap\"\u003eroadmap\u003c/a\u003e guide\"\u003c/td\u003e\u003c/tr\u003e\u003c/tbody\u003e\u003c/table\u003e\u003c/div\u003e\n\u003chr class=\"my-12 border-white/10\" /\u003e\n\u003ch3 id=\"area-5-forms\" class=\"text-2xl font-bold mt-8 mb-4 text-white\"\u003eArea 5: Forms\u003c/h3\u003e\n\u003cp class=\"mb-4 leading-relaxed text-gray-300\"\u003e\u003cstrong class=\"text-white\"\u003eWhy it matters:\u003c/strong\u003e Forms are where screen reader users perform actions: logging in, searching, filling out profiles, making purchases. A form without proper labels is like a paper form where someone erased all the questions but left the blank lines.\u003c/p\u003e\n\u003cdiv style=\"overflow-x:auto;margin:2rem 0;border-radius:0.75rem;border:1px solid rgba(255,255,255,0.1);background:rgba(255,255,255,0.03)\"\u003e\u003ctable style=\"width:100%;border-collapse:collapse;margin:0\"\u003e\u003cthead\u003e\u003ctr style=\"background:rgba(255,255,255,0.06)\"\u003e\u003cth style=\"text-align:left;padding:0.875rem 1.25rem;font-size:0.875rem;font-weight:600;text-transform:uppercase;letter-spacing:0.05em;color:#06b6d4;border-bottom:1px solid rgba(255,255,255,0.1)\"\u003eCheck\u003c/th\u003e\u003cth style=\"text-align:left;padding:0.875rem 1.25rem;font-size:0.875rem;font-weight:600;text-transform:uppercase;letter-spacing:0.05em;color:#06b6d4;border-bottom:1px solid rgba(255,255,255,0.1)\"\u003eStatus\u003c/th\u003e\u003cth style=\"text-align:left;padding:0.875rem 1.25rem;font-size:0.875rem;font-weight:600;text-transform:uppercase;letter-spacing:0.05em;color:#06b6d4;border-bottom:1px solid rgba(255,255,255,0.1)\"\u003eNotes\u003c/th\u003e\u003c/tr\u003e\u003c/thead\u003e\u003ctbody\u003e\u003ctr style=\"\"\u003e\u003ctd style=\"padding:0.875rem 1.25rem;color:#ffffff;font-weight:500;border-bottom:1px solid rgba(255,255,255,0.05)\"\u003eEvery form field has a visible \u003ccode class=\"bg-dark-800 px-2 py-1 rounded text-primary text-sm\"\u003e\u003clabel\u003e\u003c/code\u003e element associated via \u003ccode class=\"bg-dark-800 px-2 py-1 rounded text-primary text-sm\"\u003efor\u003c/code\u003e/\u003ccode class=\"bg-dark-800 px-2 py-1 rounded text-primary text-sm\"\u003eid\u003c/code\u003e\u003c/td\u003e\u003ctd style=\"padding:0.875rem 1.25rem;color:#d1d5db;border-bottom:1px solid rgba(255,255,255,0.05)\"\u003e\u003cspan class=\"text-gray-500\"\u003e\u0026#9744;\u003c/span\u003e Pass / \u003cspan class=\"text-gray-500\"\u003e\u0026#9744;\u003c/span\u003e Fail\u003c/td\u003e\u003c/tr\u003e\u003ctr style=\"background:rgba(255,255,255,0.02)\"\u003e\u003ctd style=\"padding:0.875rem 1.25rem;color:#ffffff;font-weight:500;border-bottom:1px solid rgba(255,255,255,0.05)\"\u003eRequired fields are indicated in the label (not just by asterisk color)\u003c/td\u003e\u003ctd style=\"padding:0.875rem 1.25rem;color:#d1d5db;border-bottom:1px solid rgba(255,255,255,0.05)\"\u003e\u003cspan class=\"text-gray-500\"\u003e\u0026#9744;\u003c/span\u003e Pass / \u003cspan class=\"text-gray-500\"\u003e\u0026#9744;\u003c/span\u003e Fail\u003c/td\u003e\u003c/tr\u003e\u003ctr style=\"\"\u003e\u003ctd style=\"padding:0.875rem 1.25rem;color:#ffffff;font-weight:500;border-bottom:1px solid rgba(255,255,255,0.05)\"\u003eForm groups use \u003ccode class=\"bg-dark-800 px-2 py-1 rounded text-primary text-sm\"\u003e\u003cfieldset\u003e\u003c/code\u003e and \u003ccode class=\"bg-dark-800 px-2 py-1 rounded text-primary text-sm\"\u003e\u003clegend\u003e\u003c/code\u003e (radio groups, checkbox groups, address blocks)\u003c/td\u003e\u003ctd style=\"padding:0.875rem 1.25rem;color:#d1d5db;border-bottom:1px solid rgba(255,255,255,0.05)\"\u003e\u003cspan class=\"text-gray-500\"\u003e\u0026#9744;\u003c/span\u003e Pass / \u003cspan class=\"text-gray-500\"\u003e\u0026#9744;\u003c/span\u003e Fail\u003c/td\u003e\u003c/tr\u003e\u003ctr style=\"background:rgba(255,255,255,0.02)\"\u003e\u003ctd style=\"padding:0.875rem 1.25rem;color:#ffffff;font-weight:500;border-bottom:1px solid rgba(255,255,255,0.05)\"\u003eError messages are associated with their fields via \u003ccode class=\"bg-dark-800 px-2 py-1 rounded text-primary text-sm\"\u003earia-describedby\u003c/code\u003e\u003c/td\u003e\u003ctd style=\"padding:0.875rem 1.25rem;color:#d1d5db;border-bottom:1px solid rgba(255,255,255,0.05)\"\u003e\u003cspan class=\"text-gray-500\"\u003e\u0026#9744;\u003c/span\u003e Pass / \u003cspan class=\"text-gray-500\"\u003e\u0026#9744;\u003c/span\u003e Fail\u003c/td\u003e\u003c/tr\u003e\u003ctr style=\"\"\u003e\u003ctd style=\"padding:0.875rem 1.25rem;color:#ffffff;font-weight:500;border-bottom:1px solid rgba(255,255,255,0.05)\"\u003eError messages are announced when they appear (via \u003ccode class=\"bg-dark-800 px-2 py-1 rounded text-primary text-sm\"\u003earia-live\u003c/code\u003e or \u003ccode class=\"bg-dark-800 px-2 py-1 rounded text-primary text-sm\"\u003erole=\"alert\"\u003c/code\u003e)\u003c/td\u003e\u003ctd style=\"padding:0.875rem 1.25rem;color:#d1d5db;border-bottom:1px solid rgba(255,255,255,0.05)\"\u003e\u003cspan class=\"text-gray-500\"\u003e\u0026#9744;\u003c/span\u003e Pass / \u003cspan class=\"text-gray-500\"\u003e\u0026#9744;\u003c/span\u003e Fail\u003c/td\u003e\u003c/tr\u003e\u003ctr style=\"background:rgba(255,255,255,0.02)\"\u003e\u003ctd style=\"padding:0.875rem 1.25rem;color:#ffffff;font-weight:500;border-bottom:1px solid rgba(255,255,255,0.05)\"\u003eForm validation errors identify the field and describe the error\u003c/td\u003e\u003ctd style=\"padding:0.875rem 1.25rem;color:#d1d5db;border-bottom:1px solid rgba(255,255,255,0.05)\"\u003e\u003cspan class=\"text-gray-500\"\u003e\u0026#9744;\u003c/span\u003e Pass / \u003cspan class=\"text-gray-500\"\u003e\u0026#9744;\u003c/span\u003e Fail\u003c/td\u003e\u003c/tr\u003e\u003ctr style=\"\"\u003e\u003ctd style=\"padding:0.875rem 1.25rem;color:#ffffff;font-weight:500;border-bottom:1px solid rgba(255,255,255,0.05)\"\u003eAutocomplete attributes are set for common fields (name, email, address, phone)\u003c/td\u003e\u003ctd style=\"padding:0.875rem 1.25rem;color:#d1d5db;border-bottom:1px solid rgba(255,255,255,0.05)\"\u003e\u003cspan class=\"text-gray-500\"\u003e\u0026#9744;\u003c/span\u003e Pass / \u003cspan class=\"text-gray-500\"\u003e\u0026#9744;\u003c/span\u003e Fail\u003c/td\u003e\u003c/tr\u003e\u003ctr style=\"background:rgba(255,255,255,0.02)\"\u003e\u003ctd style=\"padding:0.875rem 1.25rem;color:#ffffff;font-weight:500;border-bottom:1px solid rgba(255,255,255,0.05)\"\u003eSubmit button text describes the action (\"Create account\", not just \"Submit\")\u003c/td\u003e\u003ctd style=\"padding:0.875rem 1.25rem;color:#d1d5db;border-bottom:1px solid rgba(255,255,255,0.05)\"\u003e\u003cspan class=\"text-gray-500\"\u003e\u0026#9744;\u003c/span\u003e Pass / \u003cspan class=\"text-gray-500\"\u003e\u0026#9744;\u003c/span\u003e Fail\u003c/td\u003e\u003c/tr\u003e\u003ctr style=\"\"\u003e\u003ctd style=\"padding:0.875rem 1.25rem;color:#ffffff;font-weight:500;border-bottom:1px solid rgba(255,255,255,0.05)\"\u003ePlaceholder text is not the only label (screen readers may not announce it reliably)\u003c/td\u003e\u003ctd style=\"padding:0.875rem 1.25rem;color:#d1d5db;border-bottom:1px solid rgba(255,255,255,0.05)\"\u003e\u003cspan class=\"text-gray-500\"\u003e\u0026#9744;\u003c/span\u003e Pass / \u003cspan class=\"text-gray-500\"\u003e\u0026#9744;\u003c/span\u003e Fail\u003c/td\u003e\u003c/tr\u003e\u003ctr style=\"background:rgba(255,255,255,0.02)\"\u003e\u003ctd style=\"padding:0.875rem 1.25rem;color:#ffffff;font-weight:500;border-bottom:1px solid rgba(255,255,255,0.05)\"\u003eForm instructions appear before the form, not after\u003c/td\u003e\u003ctd style=\"padding:0.875rem 1.25rem;color:#d1d5db;border-bottom:1px solid rgba(255,255,255,0.05)\"\u003e\u003cspan class=\"text-gray-500\"\u003e\u0026#9744;\u003c/span\u003e Pass / \u003cspan class=\"text-gray-500\"\u003e\u0026#9744;\u003c/span\u003e Fail\u003c/td\u003e\u003c/tr\u003e\u003c/tbody\u003e\u003c/table\u003e\u003c/div\u003e\n\u003chr class=\"my-12 border-white/10\" /\u003e\n\u003ch3 id=\"area-6-dynamic-content\" class=\"text-2xl font-bold mt-8 mb-4 text-white\"\u003eArea 6: Dynamic Content\u003c/h3\u003e\n\u003cp class=\"mb-4 leading-relaxed text-gray-300\"\u003e\u003cstrong class=\"text-white\"\u003eWhy it matters:\u003c/strong\u003e Screen readers read a snapshot of the page at load time. When content changes dynamically (search results update, a toast appears, a counter increments, new chat messages arrive), the screen reader does not know about it unless ARIA live regions announce the change.\u003c/p\u003e\n\u003cdiv style=\"overflow-x:auto;margin:2rem 0;border-radius:0.75rem;border:1px solid rgba(255,255,255,0.1);background:rgba(255,255,255,0.03)\"\u003e\u003ctable style=\"width:100%;border-collapse:collapse;margin:0\"\u003e\u003cthead\u003e\u003ctr style=\"background:rgba(255,255,255,0.06)\"\u003e\u003cth style=\"text-align:left;padding:0.875rem 1.25rem;font-size:0.875rem;font-weight:600;text-transform:uppercase;letter-spacing:0.05em;color:#06b6d4;border-bottom:1px solid rgba(255,255,255,0.1)\"\u003eCheck\u003c/th\u003e\u003cth style=\"text-align:left;padding:0.875rem 1.25rem;font-size:0.875rem;font-weight:600;text-transform:uppercase;letter-spacing:0.05em;color:#06b6d4;border-bottom:1px solid rgba(255,255,255,0.1)\"\u003eStatus\u003c/th\u003e\u003cth style=\"text-align:left;padding:0.875rem 1.25rem;font-size:0.875rem;font-weight:600;text-transform:uppercase;letter-spacing:0.05em;color:#06b6d4;border-bottom:1px solid rgba(255,255,255,0.1)\"\u003eNotes\u003c/th\u003e\u003c/tr\u003e\u003c/thead\u003e\u003ctbody\u003e\u003ctr style=\"\"\u003e\u003ctd style=\"padding:0.875rem 1.25rem;color:#ffffff;font-weight:500;border-bottom:1px solid rgba(255,255,255,0.05)\"\u003eSuccess and error notifications use \u003ccode class=\"bg-dark-800 px-2 py-1 rounded text-primary text-sm\"\u003earia-live\u003c/code\u003e regions or \u003ccode class=\"bg-dark-800 px-2 py-1 rounded text-primary text-sm\"\u003erole=\"alert\"\u003c/code\u003e/\u003ccode class=\"bg-dark-800 px-2 py-1 rounded text-primary text-sm\"\u003erole=\"status\"\u003c/code\u003e\u003c/td\u003e\u003ctd style=\"padding:0.875rem 1.25rem;color:#d1d5db;border-bottom:1px solid rgba(255,255,255,0.05)\"\u003e\u003cspan class=\"text-gray-500\"\u003e\u0026#9744;\u003c/span\u003e Pass / \u003cspan class=\"text-gray-500\"\u003e\u0026#9744;\u003c/span\u003e Fail\u003c/td\u003e\u003c/tr\u003e\u003ctr style=\"background:rgba(255,255,255,0.02)\"\u003e\u003ctd style=\"padding:0.875rem 1.25rem;color:#ffffff;font-weight:500;border-bottom:1px solid rgba(255,255,255,0.05)\"\u003eLive regions exist in the DOM at page load (not dynamically created)\u003c/td\u003e\u003ctd style=\"padding:0.875rem 1.25rem;color:#d1d5db;border-bottom:1px solid rgba(255,255,255,0.05)\"\u003e\u003cspan class=\"text-gray-500\"\u003e\u0026#9744;\u003c/span\u003e Pass / \u003cspan class=\"text-gray-500\"\u003e\u0026#9744;\u003c/span\u003e Fail\u003c/td\u003e\u003c/tr\u003e\u003ctr style=\"\"\u003e\u003ctd style=\"padding:0.875rem 1.25rem;color:#ffffff;font-weight:500;border-bottom:1px solid rgba(255,255,255,0.05)\"\u003eSearch results count is announced when results update (\"12 results found\")\u003c/td\u003e\u003ctd style=\"padding:0.875rem 1.25rem;color:#d1d5db;border-bottom:1px solid rgba(255,255,255,0.05)\"\u003e\u003cspan class=\"text-gray-500\"\u003e\u0026#9744;\u003c/span\u003e Pass / \u003cspan class=\"text-gray-500\"\u003e\u0026#9744;\u003c/span\u003e Fail\u003c/td\u003e\u003c/tr\u003e\u003ctr style=\"background:rgba(255,255,255,0.02)\"\u003e\u003ctd style=\"padding:0.875rem 1.25rem;color:#ffffff;font-weight:500;border-bottom:1px solid rgba(255,255,255,0.05)\"\u003eLoading states are announced (\"Loading...\" when starting, \"Content loaded\" when done)\u003c/td\u003e\u003ctd style=\"padding:0.875rem 1.25rem;color:#d1d5db;border-bottom:1px solid rgba(255,255,255,0.05)\"\u003e\u003cspan class=\"text-gray-500\"\u003e\u0026#9744;\u003c/span\u003e Pass / \u003cspan class=\"text-gray-500\"\u003e\u0026#9744;\u003c/span\u003e Fail\u003c/td\u003e\u003c/tr\u003e\u003ctr style=\"\"\u003e\u003ctd style=\"padding:0.875rem 1.25rem;color:#ffffff;font-weight:500;border-bottom:1px solid rgba(255,255,255,0.05)\"\u003eChat messages or real-time updates use \u003ccode class=\"bg-dark-800 px-2 py-1 rounded text-primary text-sm\"\u003earia-live=\"polite\"\u003c/code\u003e (not \u003ccode class=\"bg-dark-800 px-2 py-1 rounded text-primary text-sm\"\u003eassertive\u003c/code\u003e)\u003c/td\u003e\u003ctd style=\"padding:0.875rem 1.25rem;color:#d1d5db;border-bottom:1px solid rgba(255,255,255,0.05)\"\u003e\u003cspan class=\"text-gray-500\"\u003e\u0026#9744;\u003c/span\u003e Pass / \u003cspan class=\"text-gray-500\"\u003e\u0026#9744;\u003c/span\u003e Fail\u003c/td\u003e\u003c/tr\u003e\u003ctr style=\"background:rgba(255,255,255,0.02)\"\u003e\u003ctd style=\"padding:0.875rem 1.25rem;color:#ffffff;font-weight:500;border-bottom:1px solid rgba(255,255,255,0.05)\"\u003ePage content that changes without a full reload updates the \u003ccode class=\"bg-dark-800 px-2 py-1 rounded text-primary text-sm\"\u003e\u003ctitle\u003e\u003c/code\u003e and focus position\u003c/td\u003e\u003ctd style=\"padding:0.875rem 1.25rem;color:#d1d5db;border-bottom:1px solid rgba(255,255,255,0.05)\"\u003e\u003cspan class=\"text-gray-500\"\u003e\u0026#9744;\u003c/span\u003e Pass / \u003cspan class=\"text-gray-500\"\u003e\u0026#9744;\u003c/span\u003e Fail\u003c/td\u003e\u003c/tr\u003e\u003ctr style=\"\"\u003e\u003ctd style=\"padding:0.875rem 1.25rem;color:#ffffff;font-weight:500;border-bottom:1px solid rgba(255,255,255,0.05)\"\u003eModals, drawers, and popovers manage focus correctly (see focus management patterns)\u003c/td\u003e\u003ctd style=\"padding:0.875rem 1.25rem;color:#d1d5db;border-bottom:1px solid rgba(255,255,255,0.05)\"\u003e\u003cspan class=\"text-gray-500\"\u003e\u0026#9744;\u003c/span\u003e Pass / \u003cspan class=\"text-gray-500\"\u003e\u0026#9744;\u003c/span\u003e Fail\u003c/td\u003e\u003c/tr\u003e\u003ctr style=\"background:rgba(255,255,255,0.02)\"\u003e\u003ctd style=\"padding:0.875rem 1.25rem;color:#ffffff;font-weight:500;border-bottom:1px solid rgba(255,255,255,0.05)\"\u003eContent removed from the page does not orphan the user's focus position\u003c/td\u003e\u003ctd style=\"padding:0.875rem 1.25rem;color:#d1d5db;border-bottom:1px solid rgba(255,255,255,0.05)\"\u003e\u003cspan class=\"text-gray-500\"\u003e\u0026#9744;\u003c/span\u003e Pass / \u003cspan class=\"text-gray-500\"\u003e\u0026#9744;\u003c/span\u003e Fail\u003c/td\u003e\u003c/tr\u003e\u003c/tbody\u003e\u003c/table\u003e\u003c/div\u003e\n\u003chr class=\"my-12 border-white/10\" /\u003e\n\u003ch3 id=\"area-7-reading-order\" class=\"text-2xl font-bold mt-8 mb-4 text-white\"\u003eArea 7: Reading Order\u003c/h3\u003e\n\u003cp class=\"mb-4 leading-relaxed text-gray-300\"\u003e\u003cstrong class=\"text-white\"\u003eWhy it matters:\u003c/strong\u003e Screen readers read the DOM in source order, not visual order. If CSS positions a sidebar visually on the right but the sidebar's HTML comes before the main content in the source, screen reader users hear the sidebar first. Similarly, CSS \u003ccode class=\"bg-dark-800 px-2 py-1 rounded text-primary text-sm\"\u003eorder\u003c/code\u003e in flexbox can create visual reordering that does not match the DOM order.\u003c/p\u003e\n\u003cdiv style=\"overflow-x:auto;margin:2rem 0;border-radius:0.75rem;border:1px solid rgba(255,255,255,0.1);background:rgba(255,255,255,0.03)\"\u003e\u003ctable style=\"width:100%;border-collapse:collapse;margin:0\"\u003e\u003cthead\u003e\u003ctr style=\"background:rgba(255,255,255,0.06)\"\u003e\u003cth style=\"text-align:left;padding:0.875rem 1.25rem;font-size:0.875rem;font-weight:600;text-transform:uppercase;letter-spacing:0.05em;color:#06b6d4;border-bottom:1px solid rgba(255,255,255,0.1)\"\u003eCheck\u003c/th\u003e\u003cth style=\"text-align:left;padding:0.875rem 1.25rem;font-size:0.875rem;font-weight:600;text-transform:uppercase;letter-spacing:0.05em;color:#06b6d4;border-bottom:1px solid rgba(255,255,255,0.1)\"\u003eStatus\u003c/th\u003e\u003cth style=\"text-align:left;padding:0.875rem 1.25rem;font-size:0.875rem;font-weight:600;text-transform:uppercase;letter-spacing:0.05em;color:#06b6d4;border-bottom:1px solid rgba(255,255,255,0.1)\"\u003eNotes\u003c/th\u003e\u003c/tr\u003e\u003c/thead\u003e\u003ctbody\u003e\u003ctr style=\"\"\u003e\u003ctd style=\"padding:0.875rem 1.25rem;color:#ffffff;font-weight:500;border-bottom:1px solid rgba(255,255,255,0.05)\"\u003eDOM order matches the visual reading order (top-to-bottom, left-to-right for LTR)\u003c/td\u003e\u003ctd style=\"padding:0.875rem 1.25rem;color:#d1d5db;border-bottom:1px solid rgba(255,255,255,0.05)\"\u003e\u003cspan class=\"text-gray-500\"\u003e\u0026#9744;\u003c/span\u003e Pass / \u003cspan class=\"text-gray-500\"\u003e\u0026#9744;\u003c/span\u003e Fail\u003c/td\u003e\u003c/tr\u003e\u003ctr style=\"background:rgba(255,255,255,0.02)\"\u003e\u003ctd style=\"padding:0.875rem 1.25rem;color:#ffffff;font-weight:500;border-bottom:1px solid rgba(255,255,255,0.05)\"\u003eCSS \u003ccode class=\"bg-dark-800 px-2 py-1 rounded text-primary text-sm\"\u003eorder\u003c/code\u003e, \u003ccode class=\"bg-dark-800 px-2 py-1 rounded text-primary text-sm\"\u003eposition: absolute\u003c/code\u003e, and flexbox/grid reordering do not create confusing sequences\u003c/td\u003e\u003ctd style=\"padding:0.875rem 1.25rem;color:#d1d5db;border-bottom:1px solid rgba(255,255,255,0.05)\"\u003e\u003cspan class=\"text-gray-500\"\u003e\u0026#9744;\u003c/span\u003e Pass / \u003cspan class=\"text-gray-500\"\u003e\u0026#9744;\u003c/span\u003e Fail\u003c/td\u003e\u003c/tr\u003e\u003ctr style=\"\"\u003e\u003ctd style=\"padding:0.875rem 1.25rem;color:#ffffff;font-weight:500;border-bottom:1px solid rgba(255,255,255,0.05)\"\u003eVisually hidden content (\u003ccode class=\"bg-dark-800 px-2 py-1 rounded text-primary text-sm\"\u003e.sr-only\u003c/code\u003e) appears in a logical position in the DOM\u003c/td\u003e\u003ctd style=\"padding:0.875rem 1.25rem;color:#d1d5db;border-bottom:1px solid rgba(255,255,255,0.05)\"\u003e\u003cspan class=\"text-gray-500\"\u003e\u0026#9744;\u003c/span\u003e Pass / \u003cspan class=\"text-gray-500\"\u003e\u0026#9744;\u003c/span\u003e Fail\u003c/td\u003e\u003c/tr\u003e\u003ctr style=\"background:rgba(255,255,255,0.02)\"\u003e\u003ctd style=\"padding:0.875rem 1.25rem;color:#ffffff;font-weight:500;border-bottom:1px solid rgba(255,255,255,0.05)\"\u003eContent injected via JavaScript appears in the correct DOM position\u003c/td\u003e\u003ctd style=\"padding:0.875rem 1.25rem;color:#d1d5db;border-bottom:1px solid rgba(255,255,255,0.05)\"\u003e\u003cspan class=\"text-gray-500\"\u003e\u0026#9744;\u003c/span\u003e Pass / \u003cspan class=\"text-gray-500\"\u003e\u0026#9744;\u003c/span\u003e Fail\u003c/td\u003e\u003c/tr\u003e\u003ctr style=\"\"\u003e\u003ctd style=\"padding:0.875rem 1.25rem;color:#ffffff;font-weight:500;border-bottom:1px solid rgba(255,255,255,0.05)\"\u003e\u003ccode class=\"bg-dark-800 px-2 py-1 rounded text-primary text-sm\"\u003etabindex\u003c/code\u003e values do not override the natural tab order (no \u003ccode class=\"bg-dark-800 px-2 py-1 rounded text-primary text-sm\"\u003etabindex\u003c/code\u003e \u003e 0)\u003c/td\u003e\u003ctd style=\"padding:0.875rem 1.25rem;color:#d1d5db;border-bottom:1px solid rgba(255,255,255,0.05)\"\u003e\u003cspan class=\"text-gray-500\"\u003e\u0026#9744;\u003c/span\u003e Pass / \u003cspan class=\"text-gray-500\"\u003e\u0026#9744;\u003c/span\u003e Fail\u003c/td\u003e\u003c/tr\u003e\u003c/tbody\u003e\u003c/table\u003e\u003c/div\u003e\n\u003cp class=\"mb-4 leading-relaxed text-gray-300\"\u003e\u003cstrong class=\"text-white\"\u003eHow to verify:\u003c/strong\u003e Use the browser's accessibility tree (Chrome DevTools \u003e Elements \u003e Accessibility tab) to see the order screen readers will follow. Compare it to the visual layout.\u003c/p\u003e\n\u003chr class=\"my-12 border-white/10\" /\u003e\n\u003ch3 id=\"page-optimization-summary\" class=\"text-2xl font-bold mt-8 mb-4 text-white\"\u003ePage Optimization Summary\u003c/h3\u003e\n\u003cdiv style=\"overflow-x:auto;margin:2rem 0;border-radius:0.75rem;border:1px solid rgba(255,255,255,0.1);background:rgba(255,255,255,0.03)\"\u003e\u003ctable style=\"width:100%;border-collapse:collapse;margin:0\"\u003e\u003cthead\u003e\u003ctr style=\"background:rgba(255,255,255,0.06)\"\u003e\u003cth style=\"text-align:left;padding:0.875rem 1.25rem;font-size:0.875rem;font-weight:600;text-transform:uppercase;letter-spacing:0.05em;color:#06b6d4;border-bottom:1px solid rgba(255,255,255,0.1)\"\u003eArea\u003c/th\u003e\u003cth style=\"text-align:left;padding:0.875rem 1.25rem;font-size:0.875rem;font-weight:600;text-transform:uppercase;letter-spacing:0.05em;color:#06b6d4;border-bottom:1px solid rgba(255,255,255,0.1)\"\u003eCriteria\u003c/th\u003e\u003cth style=\"text-align:left;padding:0.875rem 1.25rem;font-size:0.875rem;font-weight:600;text-transform:uppercase;letter-spacing:0.05em;color:#06b6d4;border-bottom:1px solid rgba(255,255,255,0.1)\"\u003ePass\u003c/th\u003e\u003cth style=\"text-align:left;padding:0.875rem 1.25rem;font-size:0.875rem;font-weight:600;text-transform:uppercase;letter-spacing:0.05em;color:#06b6d4;border-bottom:1px solid rgba(255,255,255,0.1)\"\u003eFail\u003c/th\u003e\u003cth style=\"text-align:left;padding:0.875rem 1.25rem;font-size:0.875rem;font-weight:600;text-transform:uppercase;letter-spacing:0.05em;color:#06b6d4;border-bottom:1px solid rgba(255,255,255,0.1)\"\u003ePriority Fixes\u003c/th\u003e\u003c/tr\u003e\u003c/thead\u003e\u003ctbody\u003e\u003ctr style=\"\"\u003e\u003ctd style=\"padding:0.875rem 1.25rem;color:#ffffff;font-weight:500;border-bottom:1px solid rgba(255,255,255,0.05)\"\u003eDocument Structure\u003c/td\u003e\u003ctd style=\"padding:0.875rem 1.25rem;color:#d1d5db;border-bottom:1px solid rgba(255,255,255,0.05)\"\u003e8\u003c/td\u003e\u003c/tr\u003e\u003ctr style=\"background:rgba(255,255,255,0.02)\"\u003e\u003ctd style=\"padding:0.875rem 1.25rem;color:#ffffff;font-weight:500;border-bottom:1px solid rgba(255,255,255,0.05)\"\u003eHeading Hierarchy\u003c/td\u003e\u003ctd style=\"padding:0.875rem 1.25rem;color:#d1d5db;border-bottom:1px solid rgba(255,255,255,0.05)\"\u003e6\u003c/td\u003e\u003c/tr\u003e\u003ctr style=\"\"\u003e\u003ctd style=\"padding:0.875rem 1.25rem;color:#ffffff;font-weight:500;border-bottom:1px solid rgba(255,255,255,0.05)\"\u003eLandmarks\u003c/td\u003e\u003ctd style=\"padding:0.875rem 1.25rem;color:#d1d5db;border-bottom:1px solid rgba(255,255,255,0.05)\"\u003e7\u003c/td\u003e\u003c/tr\u003e\u003ctr style=\"background:rgba(255,255,255,0.02)\"\u003e\u003ctd style=\"padding:0.875rem 1.25rem;color:#ffffff;font-weight:500;border-bottom:1px solid rgba(255,255,255,0.05)\"\u003eLinks and Buttons\u003c/td\u003e\u003ctd style=\"padding:0.875rem 1.25rem;color:#d1d5db;border-bottom:1px solid rgba(255,255,255,0.05)\"\u003e8\u003c/td\u003e\u003c/tr\u003e\u003ctr style=\"\"\u003e\u003ctd style=\"padding:0.875rem 1.25rem;color:#ffffff;font-weight:500;border-bottom:1px solid rgba(255,255,255,0.05)\"\u003eForms\u003c/td\u003e\u003ctd style=\"padding:0.875rem 1.25rem;color:#d1d5db;border-bottom:1px solid rgba(255,255,255,0.05)\"\u003e10\u003c/td\u003e\u003c/tr\u003e\u003ctr style=\"background:rgba(255,255,255,0.02)\"\u003e\u003ctd style=\"padding:0.875rem 1.25rem;color:#ffffff;font-weight:500;border-bottom:1px solid rgba(255,255,255,0.05)\"\u003eDynamic Content\u003c/td\u003e\u003ctd style=\"padding:0.875rem 1.25rem;color:#d1d5db;border-bottom:1px solid rgba(255,255,255,0.05)\"\u003e8\u003c/td\u003e\u003c/tr\u003e\u003ctr style=\"\"\u003e\u003ctd style=\"padding:0.875rem 1.25rem;color:#ffffff;font-weight:500;border-bottom:1px solid rgba(255,255,255,0.05)\"\u003eReading Order\u003c/td\u003e\u003ctd style=\"padding:0.875rem 1.25rem;color:#d1d5db;border-bottom:1px solid rgba(255,255,255,0.05)\"\u003e5\u003c/td\u003e\u003c/tr\u003e\u003ctr style=\"background:rgba(255,255,255,0.02)\"\u003e\u003ctd style=\"padding:0.875rem 1.25rem;color:#ffffff;font-weight:500;border-bottom:1px solid rgba(255,255,255,0.05)\"\u003e\u003cstrong class=\"text-white\"\u003eTotal\u003c/strong\u003e\u003c/td\u003e\u003ctd style=\"padding:0.875rem 1.25rem;color:#d1d5db;border-bottom:1px solid rgba(255,255,255,0.05)\"\u003e\u003cstrong class=\"text-white\"\u003e52\u003c/strong\u003e\u003c/td\u003e\u003c/tr\u003e\u003c/tbody\u003e\u003c/table\u003e\u003c/div\u003e\n\u003chr class=\"my-12 border-white/10\" /\u003e\n\u003ch3 id=\"screen-reader-compatibility-notes\" class=\"text-2xl font-bold mt-8 mb-4 text-white\"\u003eScreen Reader Compatibility Notes\u003c/h3\u003e\n\u003cdiv style=\"overflow-x:auto;margin:2rem 0;border-radius:0.75rem;border:1px solid rgba(255,255,255,0.1);background:rgba(255,255,255,0.03)\"\u003e\u003ctable style=\"width:100%;border-collapse:collapse;margin:0\"\u003e\u003cthead\u003e\u003ctr style=\"background:rgba(255,255,255,0.06)\"\u003e\u003cth style=\"text-align:left;padding:0.875rem 1.25rem;font-size:0.875rem;font-weight:600;text-transform:uppercase;letter-spacing:0.05em;color:#06b6d4;border-bottom:1px solid rgba(255,255,255,0.1)\"\u003eFeature\u003c/th\u003e\u003cth style=\"text-align:left;padding:0.875rem 1.25rem;font-size:0.875rem;font-weight:600;text-transform:uppercase;letter-spacing:0.05em;color:#06b6d4;border-bottom:1px solid rgba(255,255,255,0.1)\"\u003eVoiceOver (Safari)\u003c/th\u003e\u003cth style=\"text-align:left;padding:0.875rem 1.25rem;font-size:0.875rem;font-weight:600;text-transform:uppercase;letter-spacing:0.05em;color:#06b6d4;border-bottom:1px solid rgba(255,255,255,0.1)\"\u003eNVDA (Chrome)\u003c/th\u003e\u003cth style=\"text-align:left;padding:0.875rem 1.25rem;font-size:0.875rem;font-weight:600;text-transform:uppercase;letter-spacing:0.05em;color:#06b6d4;border-bottom:1px solid rgba(255,255,255,0.1)\"\u003eNVDA (Firefox)\u003c/th\u003e\u003cth style=\"text-align:left;padding:0.875rem 1.25rem;font-size:0.875rem;font-weight:600;text-transform:uppercase;letter-spacing:0.05em;color:#06b6d4;border-bottom:1px solid rgba(255,255,255,0.1)\"\u003eJAWS (Chrome)\u003c/th\u003e\u003c/tr\u003e\u003c/thead\u003e\u003ctbody\u003e\u003ctr style=\"\"\u003e\u003ctd style=\"padding:0.875rem 1.25rem;color:#ffffff;font-weight:500;border-bottom:1px solid rgba(255,255,255,0.05)\"\u003e\u003ccode class=\"bg-dark-800 px-2 py-1 rounded text-primary text-sm\"\u003earia-live=\"polite\"\u003c/code\u003e\u003c/td\u003e\u003ctd style=\"padding:0.875rem 1.25rem;color:#d1d5db;border-bottom:1px solid rgba(255,255,255,0.05)\"\u003eSupported\u003c/td\u003e\u003ctd style=\"padding:0.875rem 1.25rem;color:#d1d5db;border-bottom:1px solid rgba(255,255,255,0.05)\"\u003eSupported\u003c/td\u003e\u003ctd style=\"padding:0.875rem 1.25rem;color:#d1d5db;border-bottom:1px solid rgba(255,255,255,0.05)\"\u003eSupported\u003c/td\u003e\u003ctd style=\"padding:0.875rem 1.25rem;color:#d1d5db;border-bottom:1px solid rgba(255,255,255,0.05)\"\u003eSupported\u003c/td\u003e\u003c/tr\u003e\u003ctr style=\"background:rgba(255,255,255,0.02)\"\u003e\u003ctd style=\"padding:0.875rem 1.25rem;color:#ffffff;font-weight:500;border-bottom:1px solid rgba(255,255,255,0.05)\"\u003e\u003ccode class=\"bg-dark-800 px-2 py-1 rounded text-primary text-sm\"\u003erole=\"switch\"\u003c/code\u003e\u003c/td\u003e\u003ctd style=\"padding:0.875rem 1.25rem;color:#d1d5db;border-bottom:1px solid rgba(255,255,255,0.05)\"\u003eSupported\u003c/td\u003e\u003ctd style=\"padding:0.875rem 1.25rem;color:#d1d5db;border-bottom:1px solid rgba(255,255,255,0.05)\"\u003eSupported\u003c/td\u003e\u003ctd style=\"padding:0.875rem 1.25rem;color:#d1d5db;border-bottom:1px solid rgba(255,255,255,0.05)\"\u003eSupported (recent)\u003c/td\u003e\u003ctd style=\"padding:0.875rem 1.25rem;color:#d1d5db;border-bottom:1px solid rgba(255,255,255,0.05)\"\u003eSupported\u003c/td\u003e\u003c/tr\u003e\u003ctr style=\"\"\u003e\u003ctd style=\"padding:0.875rem 1.25rem;color:#ffffff;font-weight:500;border-bottom:1px solid rgba(255,255,255,0.05)\"\u003e\u003ccode class=\"bg-dark-800 px-2 py-1 rounded text-primary text-sm\"\u003e\u003csearch\u003e\u003c/code\u003e landmark\u003c/td\u003e\u003ctd style=\"padding:0.875rem 1.25rem;color:#d1d5db;border-bottom:1px solid rgba(255,255,255,0.05)\"\u003eSupported (Safari 17+)\u003c/td\u003e\u003ctd style=\"padding:0.875rem 1.25rem;color:#d1d5db;border-bottom:1px solid rgba(255,255,255,0.05)\"\u003eSupported (Chrome 118+)\u003c/td\u003e\u003ctd style=\"padding:0.875rem 1.25rem;color:#d1d5db;border-bottom:1px solid rgba(255,255,255,0.05)\"\u003eSupported\u003c/td\u003e\u003ctd style=\"padding:0.875rem 1.25rem;color:#d1d5db;border-bottom:1px solid rgba(255,255,255,0.05)\"\u003ePartial\u003c/td\u003e\u003c/tr\u003e\u003ctr style=\"background:rgba(255,255,255,0.02)\"\u003e\u003ctd style=\"padding:0.875rem 1.25rem;color:#ffffff;font-weight:500;border-bottom:1px solid rgba(255,255,255,0.05)\"\u003e\u003ccode class=\"bg-dark-800 px-2 py-1 rounded text-primary text-sm\"\u003einert\u003c/code\u003e attribute\u003c/td\u003e\u003ctd style=\"padding:0.875rem 1.25rem;color:#d1d5db;border-bottom:1px solid rgba(255,255,255,0.05)\"\u003eSupported\u003c/td\u003e\u003ctd style=\"padding:0.875rem 1.25rem;color:#d1d5db;border-bottom:1px solid rgba(255,255,255,0.05)\"\u003eSupported\u003c/td\u003e\u003ctd style=\"padding:0.875rem 1.25rem;color:#d1d5db;border-bottom:1px solid rgba(255,255,255,0.05)\"\u003eSupported\u003c/td\u003e\u003ctd style=\"padding:0.875rem 1.25rem;color:#d1d5db;border-bottom:1px solid rgba(255,255,255,0.05)\"\u003ePartial\u003c/td\u003e\u003c/tr\u003e\u003ctr style=\"\"\u003e\u003ctd style=\"padding:0.875rem 1.25rem;color:#ffffff;font-weight:500;border-bottom:1px solid rgba(255,255,255,0.05)\"\u003e\u003ccode class=\"bg-dark-800 px-2 py-1 rounded text-primary text-sm\"\u003earia-description\u003c/code\u003e\u003c/td\u003e\u003ctd style=\"padding:0.875rem 1.25rem;color:#d1d5db;border-bottom:1px solid rgba(255,255,255,0.05)\"\u003eSupported (Safari 16+)\u003c/td\u003e\u003ctd style=\"padding:0.875rem 1.25rem;color:#d1d5db;border-bottom:1px solid rgba(255,255,255,0.05)\"\u003eSupported\u003c/td\u003e\u003ctd style=\"padding:0.875rem 1.25rem;color:#d1d5db;border-bottom:1px solid rgba(255,255,255,0.05)\"\u003eSupported\u003c/td\u003e\u003ctd style=\"padding:0.875rem 1.25rem;color:#d1d5db;border-bottom:1px solid rgba(255,255,255,0.05)\"\u003eNot supported (use \u003ccode class=\"bg-dark-800 px-2 py-1 rounded text-primary text-sm\"\u003earia-describedby\u003c/code\u003e)\u003c/td\u003e\u003c/tr\u003e\u003ctr style=\"background:rgba(255,255,255,0.02)\"\u003e\u003ctd style=\"padding:0.875rem 1.25rem;color:#ffffff;font-weight:500;border-bottom:1px solid rgba(255,255,255,0.05)\"\u003eCSS \u003ccode class=\"bg-dark-800 px-2 py-1 rounded text-primary text-sm\"\u003econtent\u003c/code\u003e in \u003ccode class=\"bg-dark-800 px-2 py-1 rounded text-primary text-sm\"\u003e::before\u003c/code\u003e/\u003ccode class=\"bg-dark-800 px-2 py-1 rounded text-primary text-sm\"\u003e::after\u003c/code\u003e\u003c/td\u003e\u003ctd style=\"padding:0.875rem 1.25rem;color:#d1d5db;border-bottom:1px solid rgba(255,255,255,0.05)\"\u003eAnnounced\u003c/td\u003e\u003ctd style=\"padding:0.875rem 1.25rem;color:#d1d5db;border-bottom:1px solid rgba(255,255,255,0.05)\"\u003eAnnounced\u003c/td\u003e\u003ctd style=\"padding:0.875rem 1.25rem;color:#d1d5db;border-bottom:1px solid rgba(255,255,255,0.05)\"\u003eAnnounced\u003c/td\u003e\u003ctd style=\"padding:0.875rem 1.25rem;color:#d1d5db;border-bottom:1px solid rgba(255,255,255,0.05)\"\u003eAnnounced\u003c/td\u003e\u003c/tr\u003e\u003c/tbody\u003e\u003c/table\u003e\u003c/div\u003e\n\u003cp class=\"mb-4 leading-relaxed text-gray-300\"\u003eCheck the latest support tables at a11ysupport.io before relying on newer ARIA features.\u003c/p\u003e"])</script><script>self.__next_f.push([1,"22:{\"id\":\"what-this-template-is-for\",\"text\":\"What This Template Is For\",\"level\":2}\n23:{\"id\":\"how-to-use-this-template\",\"text\":\"How to Use This Template\",\"level\":2}\n24:{\"id\":\"the-template\",\"text\":\"The Template\",\"level\":2}\n25:{\"id\":\"optimization-overview\",\"text\":\"Optimization Overview\",\"level\":3}\n26:{\"id\":\"area-1-document-structure\",\"text\":\"Area 1: Document Structure\",\"level\":3}\n27:{\"id\":\"area-2-heading-hierarchy\",\"text\":\"Area 2: Heading Hierarchy\",\"level\":3}\n28:{\"id\":\"area-3-landmarks\",\"text\":\"Area 3: Landmarks\",\"level\":3}\n29:{\"id\":\"area-4-links-and-buttons\",\"text\":\"Area 4: Links and Buttons\",\"level\":3}\n2a:{\"id\":\"area-5-forms\",\"text\":\"Area 5: Forms\",\"level\":3}\n2b:{\"id\":\"area-6-dynamic-content\",\"text\":\"Area 6: Dynamic Content\",\"level\":3}\n2c:{\"id\":\"area-7-reading-order\",\"text\":\"Area 7: Reading Order\",\"level\":3}\n2d:{\"id\":\"page-optimization-summary\",\"text\":\"Page Optimization Summary\",\"level\":3}\n2e:{\"id\":\"screen-reader-compatibility-notes\",\"text\":\"Screen Reader Compatibility Notes\",\"level\":3}\n21:[\"$22\",\"$23\",\"$24\",\"$25\",\"$26\",\"$27\",\"$28\",\"$29\",\"$2a\",\"$2b\",\"$2c\",\"$2d\",\"$2e\"]\n"])</script><script>self.__next_f.push([1,"4:[\"$\",\"div\",null,{\"className\":\"min-h-screen py-14 md:py-20 px-6\",\"children\":[[[\"$\",\"script\",\"jsonld-0\",{\"type\":\"application/ld+json\",\"dangerouslySetInnerHTML\":{\"__html\":\"{\\\"@context\\\":\\\"https://schema.org\\\",\\\"@type\\\":\\\"BreadcrumbList\\\",\\\"itemListElement\\\":[{\\\"@type\\\":\\\"ListItem\\\",\\\"position\\\":1,\\\"name\\\":\\\"Home\\\",\\\"item\\\":\\\"https://www.ideaplan.io/\\\"},{\\\"@type\\\":\\\"ListItem\\\",\\\"position\\\":2,\\\"name\\\":\\\"Templates\\\",\\\"item\\\":\\\"https://www.ideaplan.io/templates\\\"},{\\\"@type\\\":\\\"ListItem\\\",\\\"position\\\":3,\\\"name\\\":\\\"Screen Reader Optimization Template\\\"}]}\"},\"suppressHydrationWarning\":true}],[\"$\",\"script\",\"jsonld-1\",{\"type\":\"application/ld+json\",\"dangerouslySetInnerHTML\":{\"__html\":\"$18\"},\"suppressHydrationWarning\":true}],[\"$\",\"script\",\"jsonld-2\",{\"type\":\"application/ld+json\",\"dangerouslySetInnerHTML\":{\"__html\":\"$19\"},\"suppressHydrationWarning\":true}],[\"$\",\"script\",\"jsonld-3\",{\"type\":\"application/ld+json\",\"dangerouslySetInnerHTML\":{\"__html\":\"$1a\"},\"suppressHydrationWarning\":true}]],[\"$\",\"div\",null,{\"className\":\"max-w-7xl mx-auto\",\"children\":[[\"$\",\"div\",null,{\"className\":\"max-w-4xl\",\"children\":[[\"$\",\"nav\",null,{\"aria-label\":\"Breadcrumb\",\"className\":\"mb-8\",\"children\":[\"$\",\"ol\",null,{\"className\":\"flex items-center gap-2 text-sm text-gray-400\",\"children\":[[\"$\",\"li\",\"0\",{\"className\":\"flex items-center gap-2\",\"children\":[false,[\"$\",\"$Lc\",null,{\"href\":\"/\",\"className\":\"hover:text-primary transition-colors\",\"children\":\"Home\"}]]}],[\"$\",\"li\",\"1\",{\"className\":\"flex items-center gap-2\",\"children\":[[\"$\",\"span\",null,{\"className\":\"text-gray-600\",\"children\":\"/\"}],[\"$\",\"$Lc\",null,{\"href\":\"/templates\",\"className\":\"hover:text-primary transition-colors\",\"children\":\"Templates\"}]]}],[\"$\",\"li\",\"2\",{\"className\":\"flex items-center gap-2\",\"children\":[[\"$\",\"span\",null,{\"className\":\"text-gray-600\",\"children\":\"/\"}],[\"$\",\"span\",null,{\"className\":\"text-gray-300\",\"children\":\"Screen Reader Optimization Template\"}]]}]]}]}],[\"$\",\"div\",null,{\"className\":\"mb-8 md:mb-12\",\"children\":[[\"$\",\"div\",null,{\"className\":\"flex items-center gap-3 mb-6\",\"children\":[[\"$\",\"span\",null,{\"className\":\"text-xs font-semibold px-3 py-1 rounded-full bg-primary/20 text-primary\",\"children\":\"Template\"}],[\"$\",\"span\",null,{\"className\":\"text-xs font-semibold px-3 py-1 rounded-full bg-green-500/20 text-green-400\",\"children\":\"FREE\"}],[\"$\",\"span\",null,{\"className\":\"text-gray-500 text-sm\",\"children\":[\"⏱️ \",\"60-120 minutes\"]}]]}],[\"$\",\"h1\",null,{\"className\":\"text-3xl md:text-5xl lg:text-6xl font-bold mb-6 gradient-text\",\"children\":\"Screen Reader Optimization Template\"}],[\"$\",\"p\",null,{\"className\":\"text-xl text-gray-400 leading-relaxed\",\"children\":\"Optimize your product for screen readers by structuring headings, landmarks, live regions, reading order, and link text.\"}],[\"$\",\"div\",null,{\"className\":\"flex items-center gap-4 mt-6 text-sm text-gray-500\",\"children\":[[\"$\",\"span\",null,{\"children\":[\"By \",[\"$\",\"a\",null,{\"href\":\"/about/tim-adair\",\"className\":\"text-primary hover:underline\",\"children\":\"Tim Adair\"}]]}],[\"$\",\"span\",null,{\"children\":[\"• Last updated \",\"2026-03-05\"]}]]}]]}]]}],[\"$\",\"div\",null,{\"className\":\"max-w-4xl mb-10\",\"children\":[[\"$\",\"div\",null,{\"className\":\"rounded-2xl overflow-hidden border border-white/10 mb-6\",\"children\":[\"$\",\"$L1b\",null,{\"src\":\"/images/previews/templates/screen-reader-template-preview.png\",\"alt\":\"Screen Reader Optimization Template preview\",\"width\":1200,\"height\":675,\"className\":\"w-full h-auto\"}]}],[\"$\",\"$L1c\",null,{\"fileName\":\"Screen Reader Optimization Template\",\"fileUrl\":\"/downloads/templates/screen-reader-template.pptx\",\"description\":\"Free Screen Reader Optimization Template — open and start using immediately\"}],[\"$\",\"div\",null,{\"className\":\"rounded-2xl border border-accent-purple/20 bg-accent-purple/5 p-6 mt-6\",\"children\":[\"$\",\"div\",null,{\"className\":\"flex items-start gap-4\",\"children\":[[\"$\",\"div\",null,{\"className\":\"w-10 h-10 rounded-lg bg-accent-purple/20 flex items-center justify-center flex-shrink-0\",\"children\":[\"$\",\"svg\",null,{\"className\":\"w-5 h-5 text-accent-purple\",\"fill\":\"none\",\"viewBox\":\"0 0 24 24\",\"stroke\":\"currentColor\",\"children\":[\"$\",\"path\",null,{\"strokeLinecap\":\"round\",\"strokeLinejoin\":\"round\",\"strokeWidth\":1.5,\"d\":\"M9.813 15.904L9 18.75l-.813-2.846a4.5 4.5 0 00-3.09-3.09L2.25 12l2.846-.813a4.5 4.5 0 003.09-3.09L9 5.25l.813 2.846a4.5 4.5 0 003.09 3.09L15.75 12l-2.846.813a4.5 4.5 0 00-3.09 3.09zM18.259 8.715L18 9.75l-.259-1.035a3.375 3.375 0 00-2.455-2.456L14.25 6l1.036-.259a3.375 3.375 0 002.455-2.456L18 2.25l.259 1.035a3.375 3.375 0 002.455 2.456L21.75 6l-1.036.259a3.375 3.375 0 00-2.455 2.456z\"}]}]}],[\"$\",\"div\",null,{\"className\":\"flex-1\",\"children\":[[\"$\",\"h3\",null,{\"className\":\"font-bold text-white text-sm mb-1\",\"children\":\"Need a custom version?\"}],[\"$\",\"p\",null,{\"className\":\"text-gray-400 text-sm mb-3\",\"children\":\"Forge AI generates PM documents customized to your product, team, and goals. Get a draft in seconds, then refine with AI chat.\"}],[\"$\",\"$Lc\",null,{\"href\":\"/tools/forge\",\"className\":\"inline-flex items-center gap-2 px-4 py-2 rounded-lg bg-accent-purple/20 text-accent-purple text-sm font-semibold hover:bg-accent-purple/30 transition-colors\",\"children\":[[\"$\",\"svg\",null,{\"className\":\"w-4 h-4\",\"fill\":\"none\",\"viewBox\":\"0 0 24 24\",\"stroke\":\"currentColor\",\"children\":[\"$\",\"path\",null,{\"strokeLinecap\":\"round\",\"strokeLinejoin\":\"round\",\"strokeWidth\":2,\"d\":\"M13 10V3L4 14h7v7l9-11h-7z\"}]}],\"Generate with Forge AI\"]}]]}]]}]}]]}],[\"$\",\"div\",null,{\"className\":\"flex gap-10\",\"children\":[[\"$\",\"div\",null,{\"className\":\"max-w-4xl flex-1 min-w-0\",\"children\":[[\"$\",\"$L1d\",null,{\"headings\":[{\"id\":\"what-this-template-is-for\",\"text\":\"What This Template Is For\",\"level\":2},{\"id\":\"how-to-use-this-template\",\"text\":\"How to Use This Template\",\"level\":2},{\"id\":\"the-template\",\"text\":\"The Template\",\"level\":2},{\"id\":\"optimization-overview\",\"text\":\"Optimization Overview\",\"level\":3},{\"id\":\"area-1-document-structure\",\"text\":\"Area 1: Document Structure\",\"level\":3},{\"id\":\"area-2-heading-hierarchy\",\"text\":\"Area 2: Heading Hierarchy\",\"level\":3},{\"id\":\"area-3-landmarks\",\"text\":\"Area 3: Landmarks\",\"level\":3},{\"id\":\"area-4-links-and-buttons\",\"text\":\"Area 4: Links and Buttons\",\"level\":3},{\"id\":\"area-5-forms\",\"text\":\"Area 5: Forms\",\"level\":3},{\"id\":\"area-6-dynamic-content\",\"text\":\"Area 6: Dynamic Content\",\"level\":3},{\"id\":\"area-7-reading-order\",\"text\":\"Area 7: Reading Order\",\"level\":3},{\"id\":\"page-optimization-summary\",\"text\":\"Page Optimization Summary\",\"level\":3},{\"id\":\"screen-reader-compatibility-notes\",\"text\":\"Screen Reader Compatibility Notes\",\"level\":3}],\"variant\":\"mobile\"}],[\"$\",\"$L1e\",null,{\"html\":\"$1f\",\"className\":\"prose prose-invert prose-lg max-w-none\"}],[\"$\",\"section\",null,{\"className\":\"mt-16\",\"children\":[[\"$\",\"h2\",null,{\"className\":\"text-3xl font-bold mb-8 text-white\",\"children\":\"Frequently Asked Questions\"}],[\"$\",\"div\",null,{\"className\":\"space-y-4\",\"children\":[[\"$\",\"details\",\"0\",{\"className\":\"glass rounded-xl group\",\"children\":[[\"$\",\"summary\",null,{\"className\":\"cursor-pointer p-6 font-semibold text-white flex items-center justify-between list-none\",\"children\":[[\"$\",\"span\",null,{\"children\":\"Which screen reader should we prioritize for testing?\"}],[\"$\",\"span\",null,{\"className\":\"text-primary ml-4 group-open:rotate-45 transition-transform text-xl\",\"children\":\"+\"}]]}],[\"$\",\"div\",null,{\"className\":\"px-6 pb-6 text-gray-300 leading-relaxed\",\"children\":\"Prioritize VoiceOver with Safari on macOS and NVDA with Chrome on Windows. These two combinations cover the majority of screen reader users in the 2025 WebAIM survey. If you can only test with one, use NVDA with Chrome because it is free, runs on the most common OS (Windows), and Chrome is the most popular browser. The [accessibility compliance template](/templates/accessibility-compliance-template) includes a decision matrix for choosing your test matrix based on your user demographics.\"}]]}],[\"$\",\"details\",\"1\",{\"className\":\"glass rounded-xl group\",\"children\":[[\"$\",\"summary\",null,{\"className\":\"cursor-pointer p-6 font-semibold text-white flex items-center justify-between list-none\",\"children\":[[\"$\",\"span\",null,{\"children\":\"How do we handle screen reader support for single-page applications?\"}],[\"$\",\"span\",null,{\"className\":\"text-primary ml-4 group-open:rotate-45 transition-transform text-xl\",\"children\":\"+\"}]]}],[\"$\",\"div\",null,{\"className\":\"px-6 pb-6 text-gray-300 leading-relaxed\",\"children\":\"SPAs create unique challenges because page navigations do not trigger a full page load event. Screen readers do not automatically announce the new page. Three things need to happen on every client-side route change: update `document.title` to reflect the new page, move focus to the main content area or page heading, and optionally announce the page transition via an `aria-live` region. The [focus management template](/templates/focus-management-template) covers the focus restoration pattern in detail.\"}]]}],[\"$\",\"details\",\"2\",{\"className\":\"glass rounded-xl group\",\"children\":[[\"$\",\"summary\",null,{\"className\":\"cursor-pointer p-6 font-semibold text-white flex items-center justify-between list-none\",\"children\":[[\"$\",\"span\",null,{\"children\":\"Should we add visually hidden text for screen readers?\"}],[\"$\",\"span\",null,{\"className\":\"text-primary ml-4 group-open:rotate-45 transition-transform text-xl\",\"children\":\"+\"}]]}],[\"$\",\"div\",null,{\"className\":\"px-6 pb-6 text-gray-300 leading-relaxed\",\"children\":\"Use visually hidden text (`.sr-only` or `clip-path` technique) when the visual context provides information that the audio context lacks. Examples: a star rating that shows 4 filled stars needs `.sr-only` text saying \\\"4 out of 5 stars.\\\" An icon button needs `.sr-only` text or `aria-label` describing the action. However, do not add hidden text as a band-aid for poor structure. If a heading or label is needed, make it visible rather than hiding it.\"}]]}],[\"$\",\"details\",\"3\",{\"className\":\"glass rounded-xl group\",\"children\":[[\"$\",\"summary\",null,{\"className\":\"cursor-pointer p-6 font-semibold text-white flex items-center justify-between list-none\",\"children\":[[\"$\",\"span\",null,{\"children\":\"How do screen readers handle CSS-generated content?\"}],[\"$\",\"span\",null,{\"className\":\"text-primary ml-4 group-open:rotate-45 transition-transform text-xl\",\"children\":\"+\"}]]}],[\"$\",\"div\",null,{\"className\":\"px-6 pb-6 text-gray-300 leading-relaxed\",\"children\":\"Content inserted via CSS `::before` and `::after` pseudo-elements with the `content` property is announced by all major screen readers. This means decorative CSS content (arrows, bullets, icons via `content: \\\"\\\\2022\\\"`) will be read aloud. Use `content: \\\"\\\" / \\\"\\\"` with `aria-hidden=\\\"true\\\"` on the parent or the pseudo-element to suppress the announcement, or use SVG icons with `aria-hidden=\\\"true\\\"` instead of CSS content.\"}]]}],[\"$\",\"details\",\"4\",{\"className\":\"glass rounded-xl group\",\"children\":[[\"$\",\"summary\",null,{\"className\":\"cursor-pointer p-6 font-semibold text-white flex items-center justify-between list-none\",\"children\":[[\"$\",\"span\",null,{\"children\":\"What is the difference between aria-label and aria-labelledby for screen readers?\"}],[\"$\",\"span\",null,{\"className\":\"text-primary ml-4 group-open:rotate-45 transition-transform text-xl\",\"children\":\"+\"}]]}],[\"$\",\"div\",null,{\"className\":\"px-6 pb-6 text-gray-300 leading-relaxed\",\"children\":\"Both provide an accessible name. `aria-label` takes a string value directly. `aria-labelledby` takes one or more element IDs and reads their text content as the label. `aria-labelledby` is preferred when visible text exists because it stays in sync automatically. `aria-label` is preferred when no visible text exists. Note that `aria-label` on non-interactive elements (like `\u003cdiv\u003e` or `\u003cspan\u003e`) is inconsistently supported. Use it on interactive elements (buttons, inputs, links, landmarks) where support is reliable. The [ARIA checklist template](/templates/aria-checklist-template) covers the full set of ARIA attributes and their correct usage.\"}]]}]]}]]}],[\"$\",\"div\",null,{\"className\":\"mt-20 glass rounded-3xl p-12\",\"children\":[[\"$\",\"h3\",null,{\"className\":\"text-2xl font-bold mb-4\",\"children\":\"Explore More Templates\"}],[\"$\",\"p\",null,{\"className\":\"text-gray-400 mb-6\",\"children\":\"Browse our full library of PM templates, or generate a custom version with AI.\"}],[\"$\",\"div\",null,{\"className\":\"flex gap-4 flex-wrap\",\"children\":[[\"$\",\"$Lc\",null,{\"href\":\"/templates\",\"className\":\"btn-primary\",\"children\":\"All Templates\"}],[\"$\",\"$Lc\",null,{\"href\":\"/tools/forge\",\"className\":\"px-6 py-3 rounded-full border border-accent-purple text-accent-purple hover:bg-accent-purple/10 transition-all\",\"children\":\"Generate with AI\"}],[\"$\",\"$Lc\",null,{\"href\":\"/roadmap-templates\",\"className\":\"px-6 py-3 rounded-full border border-white/10 text-gray-400 hover:text-white hover:border-white/20 transition-all\",\"children\":\"Roadmap Templates\"}]]}]]}],[\"$\",\"$L20\",null,{\"heading\":\"Like This Template?\",\"description\":\"Subscribe to get new templates, frameworks, and PM strategies delivered to your inbox.\",\"source\":\"template\"}]]}],[\"$\",\"div\",null,{\"className\":\"hidden xl:block w-64 flex-shrink-0\",\"children\":[\"$\",\"$L1d\",null,{\"headings\":\"$21\",\"variant\":\"sidebar\"}]}]]}]]}],[\"$\",\"$L2f\",null,{\"source\":\"template-scroll\",\"minScrollPercent\":50}]]}]\n"])</script><script>self.__next_f.push([1,"15:[[\"$\",\"meta\",\"0\",{\"name\":\"viewport\",\"content\":\"width=device-width, initial-scale=1\"}],[\"$\",\"meta\",\"1\",{\"charSet\":\"utf-8\"}],[\"$\",\"title\",\"2\",{\"children\":\"Screen Reader Optimization Template | IdeaPlan\"}],[\"$\",\"meta\",\"3\",{\"name\":\"description\",\"content\":\"Optimize your product for screen readers by structuring headings, landmarks, live regions, reading order, and link text.\"}],[\"$\",\"link\",\"4\",{\"rel\":\"author\",\"href\":\"https://www.ideaplan.io/about/tim-adair\"}],[\"$\",\"meta\",\"5\",{\"name\":\"author\",\"content\":\"Tim Adair\"}],[\"$\",\"link\",\"6\",{\"rel\":\"canonical\",\"href\":\"https://www.ideaplan.io/templates/screen-reader-template\"}],[\"$\",\"meta\",\"7\",{\"property\":\"og:title\",\"content\":\"Screen Reader Optimization Template\"}],[\"$\",\"meta\",\"8\",{\"property\":\"og:description\",\"content\":\"Optimize your product for screen readers by structuring headings, landmarks, live regions, reading order, and link text.\"}],[\"$\",\"meta\",\"9\",{\"property\":\"og:url\",\"content\":\"https://www.ideaplan.io/templates/screen-reader-template\"}],[\"$\",\"meta\",\"10\",{\"property\":\"og:site_name\",\"content\":\"IdeaPlan\"}],[\"$\",\"meta\",\"11\",{\"property\":\"og:locale\",\"content\":\"en_US\"}],[\"$\",\"meta\",\"12\",{\"property\":\"og:image\",\"content\":\"https://www.ideaplan.io/images/previews/templates/screen-reader-template-preview.png\"}],[\"$\",\"meta\",\"13\",{\"property\":\"og:type\",\"content\":\"article\"}],[\"$\",\"meta\",\"14\",{\"property\":\"article:published_time\",\"content\":\"2026-03-05\"}],[\"$\",\"meta\",\"15\",{\"property\":\"article:modified_time\",\"content\":\"2026-03-05\"}],[\"$\",\"meta\",\"16\",{\"property\":\"article:author\",\"content\":\"Tim Adair\"}],[\"$\",\"meta\",\"17\",{\"name\":\"twitter:card\",\"content\":\"summary_large_image\"}],[\"$\",\"meta\",\"18\",{\"name\":\"twitter:title\",\"content\":\"Screen Reader Optimization Template\"}],[\"$\",\"meta\",\"19\",{\"name\":\"twitter:description\",\"content\":\"Optimize your product for screen readers by structuring headings, landmarks, live regions, reading order, and link text.\"}],[\"$\",\"meta\",\"20\",{\"name\":\"twitter:image\",\"content\":\"https://www.ideaplan.io/images/previews/templates/screen-reader-template-preview.png\"}],[\"$\",\"link\",\"21\",{\"rel\":\"icon\",\"href\":\"/icon.svg?e8fd172d1cfc9b3e\",\"type\":\"image/svg+xml\",\"sizes\":\"any\"}]]\n"])</script><script>self.__next_f.push([1,"3:null\n"])</script></body></html>