Skip to content

Accessible SVGs & Charts β€” Data Visualization for All Users Guide

DodaTech Updated 2026-06-24 10 min read

In this tutorial, you'll learn about Accessible SVGs & Charts. We cover key concepts, practical examples, and best practices to help you understand and apply this topic effectively.

Accessible SVGs and charts use semantic SVG elements with proper title and desc, ARIA roles to expose interactive elements, and fallback data tables so screen reader users can access the same data that sighted users see in the visualization.

What You'll Learn

By the end of this guide, you'll understand how to write accessible inline SVGs with proper text alternatives, how to add ARIA roles to interactive chart elements, how to structure accessible chart data using fallback tables, how to choose accessible chart libraries and color palettes, and how to test chart Accessibility with screen readers.

Why Accessible Charts Matter

Data visualizations are inherently visual. A sighted user sees trends, outliers, and patterns at a glance. A blind or low-vision user needs that same data in an alternative format β€” either through text descriptions, data tables, or both. Without alternatives, charts are decorative images at best and inaccessible barriers at worst. At DodaTech, Durga Antivirus Pro uses accessible SVG charts in its threat dashboard, and Doda Browser renders performance data as both charts and tables.

Chart Accessibility Decision Flow

flowchart TD
  A[Chart or visualization] --> B{Is data representable as text?}
  B -->|Yes| C[Provide data table]
  B -->|No| D[Provide detailed text summary]
  C --> E[Use semantic SVG]
  C --> F[Add aria-label to chart container]
  D --> F
  E --> G{Interactive chart?}
  G -->|Yes| H[Add ARIA roles to interactive elements]
  G -->|No| I[Add title + desc elements]
  H --> J[Ensure keyboard navigation]
  I --> K[Test with screen reader]
  J --> K

{{< callout type="info" icon="sparkles" >}} Prerequisites: Basic HTML and SVG knowledge. Understanding of ARIA roles and WCAG non-text content requirements. {{< /callout >}}

WCAG Requirements for Charts

Several WCAG success criteria apply to data visualizations:

1.1.1 Non-text Content (Level A) β€” All non-text content must have a text alternative. For charts, this means either a data table, a detailed description, or both.

1.3.1 Info and Relationships (Level A) β€” The relationship between data points and their labels must be programmatically determinable.

1.4.1 Use of Color (Level A) β€” Color must not be the only means of conveying information. Charts must use patterns, labels, or textures alongside color.

1.4.11 Non-text Contrast (Level AA) β€” Graphical objects (bars, lines, pie slices) must have at least 3:1 contrast ratio against adjacent colors.

Accessible Inline SVGs

Inline SVGs are preferred over <img> for charts because they allow semantic elements inside the SVG that screen readers can access:

<figure role="figure" aria-label="Durga Antivirus Pro β€” monthly threat detections for Q2 2026">
  <svg viewBox="0 0 600 400" role="img" aria-labelledby="chart-title chart-desc">
    <title id="chart-title">Monthly threat detections β€” Q2 2026</title>
    <desc id="chart-desc">
      Bar chart showing 3,892 threats detected in April, 4,215 in May, and 4,601 in June.
      Ransomware, phishing, and trojan categories are shown in blue, orange, and green.
    </desc>

    <!-- Axes -->
    <g aria-hidden="true">
      <line x1="80" y1="50" x2="80" y2="350" stroke="#333" stroke-width="2"/>
      <line x1="80" y1="350" x2="550" y2="350" stroke="#333" stroke-width="2"/>
    </g>

    <!-- April bar group -->
    <g role="group" aria-label="April: 3,892 total threats">
      <rect x="100" y="200" width="40" height="150" fill="#005fcc"
            role="img" aria-label="Ransomware: 1,247 in April"/>
      <rect x="145" y="150" width="40" height="200" fill="#f90"
            role="img" aria-label="Phishing: 1,892 in April"/>
      <rect x="190" y="180" width="40" height="170" fill="#2e7d32"
            role="img" aria-label="Trojan: 753 in April"/>
      <text x="130" y="370" text-anchor="middle" aria-hidden="true">April</text>
    </g>

    <!-- May bar group -->
    <g role="group" aria-label="May: 4,215 total threats">
      <rect x="270" y="180" width="40" height="170" fill="#005fcc"
            role="img" aria-label="Ransomware: 1,402 in May"/>
      <rect x="315" y="120" width="40" height="230" fill="#f90"
            role="img" aria-label="Phishing: 2,115 in May"/>
      <rect x="360" y="150" width="40" height="200" fill="#2e7d32"
            role="img" aria-label="Trojan: 698 in May"/>
      <text x="300" y="370" text-anchor="middle" aria-hidden="true">May</text>
    </g>
  </svg>

  <figcaption>
    Durga Antivirus Pro detected a total of 12,708 threats across Q2 2026,
    with phishing remaining the most common threat category.
  </figcaption>
</figure>

Why this works: The <title> and <desc> elements provide a text alternative that screen readers announce. Each bar has role="img" with aria-label so users can explore individual data points. The axes and labels are marked aria-hidden="true" since they are decorative. A <figcaption> provides a summary-level description.

Fallback Data Tables

Every chart should be accompanied by a data table. This is the most reliable way to make chart data accessible:

<figure role="group" aria-label="Threat detection data with chart and table">
  <!-- SVG chart here -->

  <details>
    <summary>View data table for this chart</summary>
    <table aria-label="Monthly threat detections by category β€” Q2 2026">
      <caption>Durga Antivirus Pro threat detections, Aprilβ€”June 2026</caption>
      <thead>
        <tr>
          <th scope="col">Month</th>
          <th scope="col">Ransomware</th>
          <th scope="col">Phishing</th>
          <th scope="col">Trojan</th>
          <th scope="col">Total</th>
        </tr>
      </thead>
      <tbody>
        <tr>
          <th scope="row">April</th>
          <td>1,247</td>
          <td>1,892</td>
          <td>753</td>
          <td>3,892</td>
        </tr>
        <tr>
          <th scope="row">May</th>
          <td>1,402</td>
          <td>2,115</td>
          <td>698</td>
          <td>4,215</td>
        </tr>
        <tr>
          <th scope="row">June</th>
          <td>1,563</td>
          <td>2,301</td>
          <td>737</td>
          <td>4,601</td>
        </tr>
        <tr>
          <th scope="row">Total</th>
          <td>4,212</td>
          <td>6,308</td>
          <td>2,188</td>
          <td>12,708</td>
        </tr>
      </tbody>
    </table>
  </details>
</figure>

Why this works: The data table provides precise numbers that screen reader users can navigate with table navigation commands. Using <details> keeps the table accessible but visually hidden until requested, reducing clutter.

Accessible Chart Colors

Color is the most common way to distinguish chart categories, but WCAG 1.4.1 requires that information not be conveyed by color alone:

/* Accessible chart colors with pattern fallbacks */
.bar-ransomware {
  fill: #005fcc;
  /* Add pattern for color-blind users */
  stroke: #003d80;
  stroke-dasharray: none;
}

.bar-phishing {
  fill: #f90;
  /* Pattern overlay for color-blind users */
  stroke: #b36b00;
  stroke-dasharray: 4 2;
}

.bar-trojan {
  fill: #2e7d32;
  stroke: #1b5e20;
  stroke-dasharray: 2 2;
}

/* High-contrast mode support */
@media (prefers-contrast: high) {
  .bar-ransomware { fill: #000; stroke: #fff; }
  .bar-phishing { fill: #666; stroke: #fff; }
  .bar-trojan { fill: #999; stroke: #fff; }
}

Color contrast check: Each bar color must have at least 3:1 contrast against adjacent bars. Use WebAIM's contrast checker to verify your palette.

Interactive Charts with ARIA

Interactive charts β€” tooltips on hover, clickable segments, zoom β€” need keyboard equivalents and ARIA roles:

class AccessibleChart {
  constructor(svgElement) {
    this.svg = svgElement;
    this.dataPoints = svgElement.querySelectorAll('[role="img"][tabindex]');
    this.tooltip = document.getElementById('chart-tooltip');

    this.dataPoints.forEach(point => {
      point.addEventListener('focus', (e) => this.showTooltip(e));
      point.addEventListener('blur', () => this.hideTooltip());
      point.addEventListener('mouseenter', (e) => this.showTooltip(e));
      point.addEventListener('mouseleave', () => this.hideTooltip());
      point.addEventListener('keydown', (e) => {
        if (e.key === 'Escape') this.hideTooltip();
      });
    });
  }

  showTooltip(e) {
    const point = e.currentTarget;
    const label = point.getAttribute('aria-label');
    this.tooltip.textContent = label;
    this.tooltip.hidden = false;
  }

  hideTooltip() {
    this.tooltip.hidden = true;
  }
}
<!-- Interactive chart tooltip -->
<div id="chart-tooltip" role="status" aria-live="polite"
     class="chart-tooltip" hidden>
</div>

<style>
.chart-tooltip {
  position: absolute;
  background: #333;
  color: #fff;
  padding: 8px 12px;
  border-radius: 4px;
  font-size: 0.9rem;
  pointer-events: none;
}

[tabindex]:focus {
  outline: 2px solid #005fcc;
  outline-offset: 2px;
}
</style>

Why this works: Each data point is focusable via tabindex="0". Focus and hover both trigger the tooltip. role="status" with aria-live="polite" announces tooltip changes to screen readers. Escape dismisses the tooltip.

Chart Library Selection

When choosing a charting library, prioritize Accessibility support:

Library Screen Reader Support Keyboard Support ARIA Support
Highcharts Built-in table fallback, aria-label on points Tab navigation, arrow keys Good
Chart.js Requires manual ARIA None built-in Manual
D3.js Manual implementation Manual implementation Full control
Recharts (React) role and aria-label props None built-in Manual
Vega-Lite Data table export None built-in Manual

For internal DodaTech dashboards, Highcharts is recommended for its built-in Accessibility support. For custom implementations, D3.js with manual ARIA gives the most control.

Common Mistakes

1. Charts as Images Without Alt Text

An <img> tag wrapping a chart PNG without alt text is completely invisible to screen readers. Use inline SVG or provide a data table.

2. Color-Only Category Distinction

Using red and green bars without text labels or patterns excludes color-blind users. Always label segments directly.

3. No Keyboard Access for Interactive Charts

Tooltips and drill-downs that only work on mouse hover are inaccessible to keyboard users. Add focus event listeners.

4. Over-Nesting ARIA Roles

Applying role="img" to every <rect> in an SVG creates a noisy experience. Group related elements and label the group.

5. Missing Data Table for Complex Charts

A pie chart with 15 slices cannot be described adequately in alt text. Always provide a data table for complex visualizations.

6. Low Contrast in Chart Elements

Light-colored bars on a white background fail 3:1 non-text contrast. Use dark or saturated colors for all graphical elements.

7. Dynamic Charts Without Live Regions

If chart data updates in real time (like Durga Antivirus Pro's live threat feed), use aria-live="polite" to announce changes without disrupting the user.

Practice Questions

1. What is the minimum contrast ratio for graphical objects in a chart?

3:1. WCAG 1.4.11 Non-text Contrast requires that graphical objects (bars, lines, pie slices) have at least 3:1 contrast against adjacent colors.

2. Why is inline SVG preferred over <img> for accessible charts?

Inline SVG allows semantic elements like <title>, <desc>, and aria-label inside the SVG that screen readers can access. An <img> only supports the alt attribute.

3. What is the most reliable fallback for chart data?

A data table. Tables provide precise, navigable data that screen reader users can explore cell by cell.

4. What ARIA attribute should you use for a chart tooltip that appears on focus?

role="status" with aria-live="polite" announces tooltip content updates to screen readers without interrupting their current task.

5. Challenge: Take an existing Chart.js or D3.js chart. Add aria-label to each data point, a role="img" on the SVG, a <title> and <desc>, and a fallback data table. Test both keyboard navigation and screen reader announcement.

Real-World Task

Audit a dashboard that uses charts (Google Analytics, Tableau, or a custom dashboard). For each chart, determine: is there a text alternative? Can you navigate the data with a keyboard? Can a screen reader access the data? Document your findings.

FAQ

Can a screen reader read SVG charts directly? Yes, if the SVG uses proper ``, `<desc>`, and `aria-label` attributes. Screen readers in browse mode can access <a href="/design/svg/">SVG</a> content if it is inline in the <a href="/frontend/html/">HTML</a>.</summary><div style="padding:14px 18px;color:#475569;line-height:1.7;background:#fff"><p>What about animated or real-time charts? Animated charts should respect <code>prefers-reduced-motion</code>. Real-time charts should use <code>aria-live="polite"</code> to announce data updates. Provide a pause button for auto-refreshing charts.</p> <p>Should I hide decorative chart elements from screen readers? Yes. Grid lines, axes, labels, and legends that duplicate information already in the data table can be marked <code>aria-hidden="true"</code>.</p> <p>Can I use a <a href="/frontend/html/">Canvas</a> element for charts? <code><canvas></code> is not accessible. The rendered content is not part of the <a href="/programming-glossary/ui-ux-frontend/dom/">Dom</a>. If you must use <a href="/frontend/html/">Canvas</a>, provide a data table equivalent.</p> <p>How do I handle pie charts with many slices? Group small slices into an "Other" category. Provide the full breakdown in the data table. Limit slices to 5-7 for clarity.</p> </div></details> <h2>Try It Yourself</h2> <p>Create an accessible bar chart showing DodaZIP compression ratios using inline <a href="/design/svg/">SVG</a>:</p> <div class="highlight"><pre style="line-height: 125%;"><span></span><<span style="color: #062873; font-weight: bold">figure</span>> <<span style="color: #062873; font-weight: bold"><a href="/design/svg/">SVG</a></span> <span style="color: #4070a0">viewBox</span><span style="color: #666666">=</span><span style="color: #4070a0">"0 0 500 300"</span> <span style="color: #4070a0">role</span><span style="color: #666666">=</span><span style="color: #4070a0">"img"</span> <span style="color: #4070a0">aria-labelledby</span><span style="color: #666666">=</span><span style="color: #4070a0">"zip-title zip-desc"</span>> <<span style="color: #062873; font-weight: bold">title</span> <span style="color: #4070a0">id</span><span style="color: #666666">=</span><span style="color: #4070a0">"zip-title"</span>>DodaZIP compression ratios by format</<span style="color: #062873; font-weight: bold">title</span>> <<span style="color: #062873; font-weight: bold">desc</span> <span style="color: #4070a0">id</span><span style="color: #666666">=</span><span style="color: #4070a0">"zip-desc"</span>>Bar chart showing ZIP achieves 65% compression, RAR 72%, 7z 78%, TAR 45%, GZ 60%.</<span style="color: #062873; font-weight: bold">desc</span>> <<span style="color: #062873; font-weight: bold">g</span> <span style="color: #4070a0">aria-hidden</span><span style="color: #666666">=</span><span style="color: #4070a0">"true"</span>> <<span style="color: #062873; font-weight: bold">line</span> <span style="color: #4070a0">x1</span><span style="color: #666666">=</span><span style="color: #4070a0">"60"</span> <span style="color: #4070a0">y1</span><span style="color: #666666">=</span><span style="color: #4070a0">"30"</span> <span style="color: #4070a0">x2</span><span style="color: #666666">=</span><span style="color: #4070a0">"60"</span> <span style="color: #4070a0">y2</span><span style="color: #666666">=</span><span style="color: #4070a0">"250"</span> <span style="color: #4070a0">stroke</span><span style="color: #666666">=</span><span style="color: #4070a0">"#333"</span>/> <<span style="color: #062873; font-weight: bold">line</span> <span style="color: #4070a0">x1</span><span style="color: #666666">=</span><span style="color: #4070a0">"60"</span> <span style="color: #4070a0">y1</span><span style="color: #666666">=</span><span style="color: #4070a0">"250"</span> <span style="color: #4070a0">x2</span><span style="color: #666666">=</span><span style="color: #4070a0">"480"</span> <span style="color: #4070a0">y2</span><span style="color: #666666">=</span><span style="color: #4070a0">"250"</span> <span style="color: #4070a0">stroke</span><span style="color: #666666">=</span><span style="color: #4070a0">"#333"</span>/> <<span style="color: #062873; font-weight: bold">text</span> <span style="color: #4070a0">x</span><span style="color: #666666">=</span><span style="color: #4070a0">"30"</span> <span style="color: #4070a0">y</span><span style="color: #666666">=</span><span style="color: #4070a0">"60"</span>>100%</<span style="color: #062873; font-weight: bold">text</span>> <<span style="color: #062873; font-weight: bold">text</span> <span style="color: #4070a0">x</span><span style="color: #666666">=</span><span style="color: #4070a0">"30"</span> <span style="color: #4070a0">y</span><span style="color: #666666">=</span><span style="color: #4070a0">"135"</span>>50%</<span style="color: #062873; font-weight: bold">text</span>> <<span style="color: #062873; font-weight: bold">text</span> <span style="color: #4070a0">x</span><span style="color: #666666">=</span><span style="color: #4070a0">"30"</span> <span style="color: #4070a0">y</span><span style="color: #666666">=</span><span style="color: #4070a0">"250"</span>>0%</<span style="color: #062873; font-weight: bold">text</span>> </<span style="color: #062873; font-weight: bold">g</span>> <<span style="color: #062873; font-weight: bold">rect</span> <span style="color: #4070a0">x</span><span style="color: #666666">=</span><span style="color: #4070a0">"80"</span> <span style="color: #4070a0">y</span><span style="color: #666666">=</span><span style="color: #4070a0">"87"</span> <span style="color: #4070a0">width</span><span style="color: #666666">=</span><span style="color: #4070a0">"50"</span> <span style="color: #4070a0">height</span><span style="color: #666666">=</span><span style="color: #4070a0">"163"</span> <span style="color: #4070a0">fill</span><span style="color: #666666">=</span><span style="color: #4070a0">"#005fcc"</span> <span style="color: #4070a0">role</span><span style="color: #666666">=</span><span style="color: #4070a0">"img"</span> <span style="color: #4070a0">aria-label</span><span style="color: #666666">=</span><span style="color: #4070a0">"ZIP: 65% compression"</span>/> <<span style="color: #062873; font-weight: bold">rect</span> <span style="color: #4070a0">x</span><span style="color: #666666">=</span><span style="color: #4070a0">"150"</span> <span style="color: #4070a0">y</span><span style="color: #666666">=</span><span style="color: #4070a0">"70"</span> <span style="color: #4070a0">width</span><span style="color: #666666">=</span><span style="color: #4070a0">"50"</span> <span style="color: #4070a0">height</span><span style="color: #666666">=</span><span style="color: #4070a0">"180"</span> <span style="color: #4070a0">fill</span><span style="color: #666666">=</span><span style="color: #4070a0">"#f90"</span> <span style="color: #4070a0">role</span><span style="color: #666666">=</span><span style="color: #4070a0">"img"</span> <span style="color: #4070a0">aria-label</span><span style="color: #666666">=</span><span style="color: #4070a0">"RAR: 72% compression"</span>/> <<span style="color: #062873; font-weight: bold">rect</span> <span style="color: #4070a0">x</span><span style="color: #666666">=</span><span style="color: #4070a0">"220"</span> <span style="color: #4070a0">y</span><span style="color: #666666">=</span><span style="color: #4070a0">"55"</span> <span style="color: #4070a0">width</span><span style="color: #666666">=</span><span style="color: #4070a0">"50"</span> <span style="color: #4070a0">height</span><span style="color: #666666">=</span><span style="color: #4070a0">"195"</span> <span style="color: #4070a0">fill</span><span style="color: #666666">=</span><span style="color: #4070a0">"#2e7d32"</span> <span style="color: #4070a0">role</span><span style="color: #666666">=</span><span style="color: #4070a0">"img"</span> <span style="color: #4070a0">aria-label</span><span style="color: #666666">=</span><span style="color: #4070a0">"7z: 78% compression"</span>/> <<span style="color: #062873; font-weight: bold">rect</span> <span style="color: #4070a0">x</span><span style="color: #666666">=</span><span style="color: #4070a0">"290"</span> <span style="color: #4070a0">y</span><span style="color: #666666">=</span><span style="color: #4070a0">"137"</span> <span style="color: #4070a0">width</span><span style="color: #666666">=</span><span style="color: #4070a0">"50"</span> <span style="color: #4070a0">height</span><span style="color: #666666">=</span><span style="color: #4070a0">"113"</span> <span style="color: #4070a0">fill</span><span style="color: #666666">=</span><span style="color: #4070a0">"#888"</span> <span style="color: #4070a0">role</span><span style="color: #666666">=</span><span style="color: #4070a0">"img"</span> <span style="color: #4070a0">aria-label</span><span style="color: #666666">=</span><span style="color: #4070a0">"TAR: 45% compression"</span>/> <<span style="color: #062873; font-weight: bold">rect</span> <span style="color: #4070a0">x</span><span style="color: #666666">=</span><span style="color: #4070a0">"360"</span> <span style="color: #4070a0">y</span><span style="color: #666666">=</span><span style="color: #4070a0">"100"</span> <span style="color: #4070a0">width</span><span style="color: #666666">=</span><span style="color: #4070a0">"50"</span> <span style="color: #4070a0">height</span><span style="color: #666666">=</span><span style="color: #4070a0">"150"</span> <span style="color: #4070a0">fill</span><span style="color: #666666">=</span><span style="color: #4070a0">"#9c27b0"</span> <span style="color: #4070a0">role</span><span style="color: #666666">=</span><span style="color: #4070a0">"img"</span> <span style="color: #4070a0">aria-label</span><span style="color: #666666">=</span><span style="color: #4070a0">"GZ: 60% compression"</span>/> </<span style="color: #062873; font-weight: bold"><a href="/design/svg/">SVG</a></span>> <<span style="color: #062873; font-weight: bold">figcaption</span>>DodaZIP achieves the highest compression ratio with 7z format at 78%.</<span style="color: #062873; font-weight: bold">figcaption</span>> </<span style="color: #062873; font-weight: bold">figure</span>> </pre></div> <h2>What's Next</h2> <div style="display:grid;grid-template-columns:repeat(3,1fr);gap:16px;margin:20px 0"><a href="/accessibility/accessibility-laws/" class="not-prose hextra-card" style="display:block;padding:20px;border-top:3px solid #2563eb;border-left:1px solid #e2e8f0;border-right:1px solid #e2e8f0;border-bottom:1px solid #e2e8f0;border-radius:12px;text-decoration:none;color:inherit;background:#fff;box-shadow:0 1px 3px rgba(0,0,0,0.06)"><div style="font-weight:600;font-size:1.05rem;color:#1e293b">Accessibility Laws & Regulations</div><div style="font-size:0.85rem;color:#64748b;margin-top:4px"></div></a><a href="/accessibility/accessible-images/" class="not-prose hextra-card" style="display:block;padding:20px;border-top:3px solid #16a34a;border-left:1px solid #e2e8f0;border-right:1px solid #e2e8f0;border-bottom:1px solid #e2e8f0;border-radius:12px;text-decoration:none;color:inherit;background:#fff;box-shadow:0 1px 3px rgba(0,0,0,0.06)"><div style="font-weight:600;font-size:1.05rem;color:#1e293b">Accessible Images Guide</div><div style="font-size:0.85rem;color:#64748b;margin-top:4px"></div></a><a href="/accessibility/color-contrast/" class="not-prose hextra-card" style="display:block;padding:20px;border-top:3px solid #7c3aed;border-left:1px solid #e2e8f0;border-right:1px solid #e2e8f0;border-bottom:1px solid #e2e8f0;border-radius:12px;text-decoration:none;color:inherit;background:#fff;box-shadow:0 1px 3px rgba(0,0,0,0.06)"><div style="font-weight:600;font-size:1.05rem;color:#1e293b">Color Contrast Guide</div><div style="font-size:0.85rem;color:#64748b;margin-top:4px"></div></a></div> <p>Congratulations on completing this Accessible SVGs and Charts tutorial! Here is where to <a href="/programming-languages/go/">Go</a> from here:</p> <ul> <li><strong>Practice daily</strong> β€” Add ARIA labels to one <a href="/design/svg/">SVG</a> chart per day</li> <li><strong>Build a project</strong> β€” Build an accessible dashboard with interactive charts</li> <li><strong>Explore related topics</strong> β€” Learn <a href="/programming-glossary/ui-ux-frontend/accessibility/">Accessibility</a> laws next</li> <li><strong>Join the community</strong> β€” Discuss with other learners and share your progress</li> </ul> <p>Remember: every expert was once a beginner. Keep coding!</p> </div> <div class="hx:mt-16"></div> <div class="hx:mb-8 hx:grid hx:grid-cols-2 hx:gap-4 not-prose"> <a href="/accessibility/pdf-document-accessibility/" class="hx:flex hx:flex-col hx:rounded-xl hx:border hx:border-gray-200 hx:p-4 hx:hover:border-primary-500 hx:transition-colors"> <span class="hx:text-xs hx:text-gray-500 hx:flex hx:items-center hx:gap-1">← Previous</span> <span class="hx:text-sm hx:font-medium hx:text-gray-700 hx:mt-1">PDF & Document Accessibility β€” Tagged PDF, Word & PowerPoint Guide</span> </a> <a href="/accessibility/accessibility-laws/" class="hx:flex hx:flex-col hx:rounded-xl hx:border hx:border-gray-200 hx:p-4 hx:hover:border-primary-500 hx:transition-colors hx:text-right"> <span class="hx:text-xs hx:text-gray-500 hx:flex hx:items-center hx:gap-1 hx:justify-end">Next β†’</span> <span class="hx:text-sm hx:font-medium hx:text-gray-700 hx:mt-1">Accessibility Laws & Regulations β€” Section 508, ADA & EN 301 549 Guide</span> </a> </div> <div class="not-prose hx:mt-12 hx:p-6 hx:rounded-xl hx:border" style="background:linear-gradient(135deg,#fef2f2,#ffe4e6);border-color:#fecaca"> <div class="hx:flex hx:items-center hx:gap-3 hx:mb-3"> <div class="hx:w-10 hx:h-10 hx:rounded-lg hx:flex hx:items-center hx:justify-center hx:shrink-0" style="background:#ef4444;color:white"> <svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"><path d="M22 11.08V12a10 10 0 1 1-5.93-9.14"/><polyline points="22 4 12 14.01 9 11.01"/></svg> </div> <div> <p class="hx:text-sm hx:font-semibold hx:m-0" style="color:#991b1b">Built by the developers of DodaTech</p> <p class="hx:text-xs hx:m-0" style="color:#b91c1c">Doda Browser, DodaZIP & Durga Antivirus Pro</p> </div> </div> <div class="hx:flex hx:flex-wrap hx:gap-2 hx:mt-3"> <a href="/" class="hx:inline-flex hx:items-center hx:rounded-full hx:px-3 hx:py-1.5 hx:text-xs hx:font-medium hx:transition-all" style="background:#fff;color:#dc2626;border:1px solid #fecaca">Home</a> <a href="/accessibility/" class="hx:inline-flex hx:items-center hx:rounded-full hx:px-3 hx:py-1.5 hx:text-xs hx:font-medium hx:transition-all" style="background:#fff;color:#dc2626;border:1px solid #fecaca">Browse Accessibility</a> <button onclick="window.print()" class="hx:inline-flex hx:items-center hx:rounded-full hx:px-3 hx:py-1.5 hx:text-xs hx:font-medium hx:cursor-pointer" style="background:#fff;color:#dc2626;border:1px solid #fecaca">Print</button> </div> </div> </main> </article> </div> <footer class="hextra-footer hx:bg-gray-100 hx:pb-[env(safe-area-inset-bottom)] hx:dark:bg-neutral-900 hx:print:bg-transparent"> <div class="hextra-custom-footer hextra-max-footer-width hx:mx-auto hx:pl-[max(env(safe-area-inset-left),1.5rem)] hx:pr-[max(env(safe-area-inset-right),1.5rem)] hx:text-gray-600 hx:dark:text-gray-400 hx:py-12"> <div class="hx:text-center hx:text-sm"> Built by the developers of <strong>Doda Browser</strong>, <strong>DodaZIP</strong>, and <strong>Durga Antivirus Pro</strong>.<br/> <span class="hx:text-xs">© 2026 DodaTech. All rights reserved.</span> </div> </div> </footer> <script defer src="/js/main.js"></script> </body> </html>