Accessibility
This page is the canonical reference for cross-cutting WCAG 2.2 AA accessibility requirements in the FDIC design system. Every pattern documented here is non-negotiable.
The FDIC design system targets WCAG 2.2 Level AA conformance. These requirements apply across all components, token usage, and content authored within the .prose container. They are not optional refinements — they are compliance baselines.
Token and theme baseline
If you use the supported token entrypoints as documented, the design system gives you this baseline:
- semantic foreground and background tokens are authored with contrast intent across supported light and dark appearance modes
- focus ring tokens remain visible across supported themes when consumers do not override them
- status colors are published as semantic token families so meaning does not depend on brand colors
- component registration warns when the required token runtime stylesheet is missing
Current validation boundary:
- component-level automated tests disable axe-core's
color-contrastrule in happy-dom because that environment does not compute rendered contrast reliably - Storybook browser accessibility audits run against every Storybook story in Chromium and fail the test suite on violations
- browser-based audits now cover color-contrast and other rendered checks that happy-dom cannot verify
- manual review is still required for page-level composition, downstream overrides, zoom/reflow, and forced-colors scenarios that fall outside the shipped story coverage
Those baseline expectations hold only when consumers stay on the documented token and component customization paths.
What the components handle for you
If you use the design system components as documented, you get the following accessibility requirements automatically — no extra work needed:
- Rules 1-6 (focus rings, skip link, sr-only utility, ARIA on callouts, table wrappers, DPUB-ARIA on footnotes) are built into the components and prose styles. You do not need to add these yourself when using the documented HTML patterns.
You are responsible for:
- Rule 7 — spelling out abbreviations on first use in your content.
- Rule 8 — adding screen reader text inside
<del>and<ins>elements you author. - Rule 9 — not adding custom animations that bypass
prefers-reduced-motion. - Rule 10 — not overriding component styles in ways that break
forced-colorsmode.
If you only remember one thing: use the components as documented and write clear content. The system handles the technical accessibility requirements; you handle the content requirements.
Non-negotiable requirements
These ten rules govern every element, component, and pattern in the system. Violating any of them is a conformance failure.
- Focus rings on all interactive elements
Every focusable element must use
:focus-visiblewithoutline: 2px solid var(--fdic-color-border-input-focus, #38b6ff),outline-offset: 2px, andborder-radius: 2px. No exceptions. Never remove or suppress focus indicators. - Skip link
The first element inside
<body>must be a skip link:<a href="#main" class="skip-link sr-only">Skip to content</a>. It becomes visible on focus and bypasses navigation for keyboard users. .sr-onlyutilityVisually hidden text for screen readers uses the clip-rect pattern:
position: absolute; width: 1px; height: 1px; clip: rect(0,0,0,0); overflow: hidden. Use this class whenever visual context is insufficient for assistive technology.- ARIA on callouts
Callout containers require
role="note"(orrole="status"for the danger variant) and anaria-labelmatching the variant name. Icon spans must carryaria-hidden="true"to prevent screen readers from announcing decorative SVGs. - Table wrapper
Tables must be wrapped in
.prose-table-wrapperwithrole="region", a descriptivearia-label, andtabindex="0"for keyboard scrolling. Never applydisplay: blockto the<table>element itself — it destroys screen reader table navigation. - DPUB-ARIA on footnotes
Inline references use
role="doc-noteref". The footnote section usesrole="doc-endnotes". Applyrole="doc-footnote"to the footnote content within each list item rather than to the<li>itself. Back-links userole="doc-backlink". These roles enable assistive technology to navigate bidirectional footnote references without conflicting with list semantics. - Abbreviation expansion
Spell out every abbreviation on first use in visible body text: Federal Deposit Insurance Corporation (FDIC). The
titleattribute alone is not sufficient — screen readers and mobile users may never see it. - Screen reader text for
<del>and<ins>Include
<span class="sr-only">deleted: </span>inside every<del>element and<span class="sr-only">inserted: </span>inside every<ins>element. Screen reader support for these semantics is inconsistent without explicit text. prefers-reduced-motionAll animations and transitions must be suppressed when the user prefers reduced motion. Animated highlights (such as the footnote flash) must fall back to a static visual equivalent. Never assume motion is safe.
forced-colors(Windows High Contrast)Borders must use system colors (
LinkText,ButtonText). Elements that convey meaning via color or background must useforced-color-adjust: noneto remain visible. The<ins>element must fall back to underline instead of background color, since backgrounds are stripped in forced-colors mode.
Element-level accessibility guidance
Use this reference table when implementing or reviewing individual elements.
<h1> per page. Do not use headings for visual sizing alone.1.3.1<mark>Surrounding text must convey the significance of the highlight — color alone is not enough. Screen reader support for role="mark" is inconsistent.1.4.1<blockquote>Use only for quoted content, not visual indentation. Wrap attributions in <footer><cite>.1.3.1<aside>Functions as an ARIA landmark. When multiple asides appear on a page, each must have a distinct aria-label.1.3.1, 2.4.1tabindex="0" for keyboard-accessible overflow scrolling. Use role="region" and aria-label to provide context.2.1.1<address>Use only for contact information. Telephone links must use international format (tel:+1-...).1.3.1<ul>, <ol>, <dl>). Never simulate lists with <br> or <div>.1.3.1aria-label. Add role="list" to <ul> for Safari/VoiceOver, which strips list semantics from styled lists.4.1.2, 1.3.1<output>Has implicit role="status" (ARIA live region). Use the for attribute to associate with input controls.4.1.3<progress>Must have a visible label. Use aria-label including the current value. Provide a text fallback inside the element for older browsers.4.1.2<meter>The color bar alone is insufficient — always include a visible text descriptor alongside the meter.1.4.1, 4.1.2<iframe> requires a title attribute. <video> and <audio> require controls. Video must have captions.4.1.2, 1.2.2<img> must have an alt attribute. Describe the purpose, not the appearance. Use alt="" for purely decorative images.1.1.1lang="en" on the <html> element. Mark foreign-language passages with the appropriate lang attribute.3.1.1, 3.1.2Checklists
Use these checklists when adding new styles or components to the design system.
Adding a new element style
- Scope all rules to
.prose— never add unscoped element styles. - Use design tokens with hardcoded fallback values for every color, spacing, and font property.
- Add a
forced-colorsoverride if the element uses color or background to convey meaning. - Add a print override if background or decoration should be removed on paper.
- Add a
prefers-reduced-motionoverride if the element has transitions or animations. - Add a responsive override at
640pxif the element's layout changes on small screens. - If the element conveys meaning via color alone, add a non-color alternative (text, icon, pattern, or border).
- If screen reader support is inconsistent, document the workaround inline in
index.html.
Adding a new component
- Use
.prose-{name}class naming. - Include appropriate ARIA attributes in the documented HTML pattern.
- Add
forced-colors, print, andprefers-reduced-motionoverrides as needed. - Add responsive overrides at
640pxif the component's layout changes on small screens. - Hide from print if the component is interactive-only.
- Ensure every interactive element within the component has
:focus-visiblestyles using the standard focus ring pattern. - If the component is a landmark element, require
aria-labelwhen multiple instances may appear on a single page. - If the component has scrollable overflow, add
tabindex="0",role="region", and a descriptivearia-label. - Document the accessibility pattern inline in
index.htmlalongside the visual demo.