=============
Accessibility
=============

The Django project is committed to ensuring that websites built with Django are
usable by everyone, including people with disabilities. Django's built-in
components, such as the admin interface and default form rendering, should
adhere to established accessibility standards and meet our own targets for
supporting specific input devices and assistive technologies.

.. _accessibility-standards:

Accessibility standards
=======================

We work to conform with the `Web Content Accessibility Guidelines`_ (WCAG),
version 2.2, at the AA level. WCAG is the most established standard for web
accessibility. `AA-level guidelines`_ are the most common legal compliance
target worldwide.

We also aim to follow other best practices, such as:

* WCAG 2.2 `AAA-level guidelines`_ – stricter criteria that go beyond the AA
  level.
* The upcoming `WCAG 3.0`_ guidelines – a new, evolving standard that aims to
  unify and improve upon previous versions of WCAG.
* `Authoring Tool Accessibility Guidelines`_ (ATAG) 2.0 – guidelines for
  software and services that are used to produce web content.

To learn more about accessibility without diving straight into standards, we
recommend `The A11Y Project`_, a community-driven effort to make digital
accessibility easier.

.. _Web Content Accessibility Guidelines: https://www.w3.org/TR/WCAG22/
.. _AA-level guidelines: https://www.w3.org/WAI/WCAG22/quickref/?currentsidebar=%23col_overview&levels=aaa
.. _AAA-level guidelines: https://www.w3.org/WAI/WCAG22/quickref/?currentsidebar=%23col_overview&levels=a%2Caa
.. _WCAG 3.0: https://www.w3.org/TR/wcag-3.0/
.. _WCAG 3.0: https://www.w3.org/TR/wcag-3.0/
.. _Authoring Tool Accessibility Guidelines: https://www.w3.org/TR/ATAG20/
.. _The A11Y Project: https://www.a11yproject.com/

.. _accessibility-support-targets:

Support targets and testing
===========================

Beyond standards, we want to make sure Django actually works for people using a
wide range of input devices and assistive technologies. This has benefits to
make sure Django works better `for everyone`_. The best way to do this
effectively is to take accessibility considerations into account as part of
designing features. If in doubt, consult with users who rely on assistive
technologies or with accessibility experts. You can reach out to the
`Accessibility team`_ via the `Accessibility Django forum topic`_ or via the
``#accessibility`` channel on the `Django Discord server`_.

.. _for everyone: https://en.wikipedia.org/wiki/Curb_cut_effect

.. _accessibility-testing-baseline:

Testing baseline
----------------

Design the UI with accessibility in mind, and the testing will only be needed
as a final check. For more complex interfaces, confer with other contributors
to decide on testing targets. Reach out to the `Accessibility team`_ for
support and to coordinate testing.

Always test user interface changes with:

* Keyboard-only navigation. Common issues include:

  * An interactive element can't be reached using the Tab or arrow keys.
  * An interactive element "traps" input focus and prevents navigating away.
  * An interactive element doesn't give a visible indication when it has input
    focus.
  * The focus order is inconsistent with the logical order that's communicated
    visually.

* The `Accessibility Insights`_ browser extension's automated checks feature,
  or an equivalent tool with the `Axe`_ checker.

Where the UI changes could affect those modalities, also test with:

* Touch-only navigation. Common issues include:

  * A touch target (interactive element) is too small.
  * Hover-based interaction that does not translate to touch, such as a
    hover-only tooltip.

* 400% browser zoom. Common issues include:

  * Content is cut off or disappears when zoomed.
  * Content that does not inherently require a two-dimensional layout causes
    scrolling in both directions (vertical and horizontal). Two-dimensional
    scrolling is acceptable for content like images, maps, videos, and data
    tables, which require both dimensions to be usable.

* Forced-colors mode (for example Windows Contrast Themes). Note that this can
  be tested via the ``"high_contrast"`` mode in the :ref:`screenshot tests
  <screenshot-tests>`. Common issues include:

  * Over-reliance on color for meaning, which is lost in forced-colors mode.
  * Use of ``!important`` or inline styles may break forced-colors mode.

.. _assistive-technologies:

Recommended assistive technologies
----------------------------------

Where the UI changes could affect assistive technologies, here are popular free
options we recommend testing with.

For Windows:

* `NVDA`_ - recommended with Firefox ESR
* `Narrator`_ - recommended with Microsoft Edge
* Windows Magnifier
* Windows Speech Recognition
* `Contrast themes`_

For macOS:

* `VoiceOver`_ - recommended with Safari
* macOS Zoom
* macOS Voice Control

For Linux:

* `Orca`_ - recommended with Firefox ESR

For mobile or tablet:

* VoiceOver on iOS, or TalkBack on Android

The following are popular licensed options. If you are a user of these, or can
work with a user holding a license, also test against:

* `JAWS`_ on Windows
* `Dragon`_ on Windows

.. _Accessibility Insights: https://accessibilityinsights.io/
.. _Axe: https://github.com/dequelabs/axe-core
.. _NVDA: https://www.nvaccess.org/
.. _Narrator: https://support.microsoft.com/en-us/windows/complete-guide-to-narrator-e4397a0d-ef4f-b386-d8ae-c172f109bdb1
.. _VoiceOver: https://support.apple.com/en-gb/guide/voiceover-guide/welcome/web
.. _TalBack: https://support.google.com/accessibility/android/answer/6283677
.. _Contrast themes: https://support.microsoft.com/en-us/windows/change-color-contrast-in-windows-fedc744c-90ac-69df-aed5-c8a90125e696
.. _JAWS: https://www.freedomscientific.com/products/software/jaws/
.. _Dragon: https://www.nuance.com/en-gb/dragon.html
.. _Orca: https://help.gnome.org/users/orca/stable/

.. _accessibility-known-issues-how-to-help:

Known issues and how to help
============================

There are parts of Django that do not meet our accessibility targets. We
actively work on fixing issues, both as part of ongoing maintenance and bigger
overhauls. To learn about known issues, and get involved, see:

* ``#accessibility`` on the `Django Discord server`_.
* The `Accessibility Django forum topic`_.
* `Accessibility issues on the ticket tracker`_.
* Our `django accessibility improvements`_ project board.
* The `Accessibility team`_.

.. _Django Discord server: https://chat.djangoproject.com
.. _Accessibility Django forum topic: https://forum.djangoproject.com/c/internals/accessibility/26
.. _Accessibility issues on the ticket tracker: https://code.djangoproject.com/query?status=!closed&keywords=~accessibility
.. _django accessibility improvements: https://github.com/orgs/django/projects/7
.. _Accessibility team: https://www.djangoproject.com/foundation/teams/#accessibility-team
