{
  "evaluationData": {
    "web-based-accessible-wcag": {
      "id": "web-based-accessible-wcag",
      "num": "A.1.1.1",
      "handle": "Web-Based Accessible (WCAG)",
      "result": "Failed",
      "observations": "Wagtail [currently targets WCAG 2.2 AA and ATAG 2.0 AA conformance](https://wagtail.org/accessibility/) for the administrative interface of the CMS. Though a lot of progress has been made, there are still [known conformance issues and possible improvements](https://github.com/orgs/wagtail/projects/9/views/1).\n\nAs a representation of the state of Wagtail’s WCAG 2.2 AA conformance, here is a summary of WCAG 2.2 AA and best practice issues across releases, for the page editor UI (tested with [Welcome to the Wagtail bakery!](https://static-wagtail-v7-4.netlify.app/admin/pages/60/edit/)):\n\n- v7.0: 2 issues\n- v6.4: 2 issues\n- v6.3: 2 issues\n- v6.2: 2 issues\n- v6.1: 2 issues\n- v6.0: 2 issues\n- v5.2: 6 issues\n- v5.1: 6 issues\n- v5.0: 7 issues\n- v4.2: 13 issues\n- v4.1: 12 issues\n- v4.0: 7 issues\n- v3.0: 24 issues\n- v2.16: 30 issues\n\nFor a full tabular view of types of issues per release, see [A.1.1.1 Web-Based Accessible (WCAG) - Wagtail ATAG 2.0 report](https://wagtail.org/accessibility/atag-audit/#a111-web-based-accessible-wcag)\n\nSuggested next steps:\n\n- More test coverage for automated accessibility tests\n- More feedback from users of assistive technologies\n\nReferences:\n\n- [WCAG 2.2 & ATAG 2.0 CMS admin](https://github.com/orgs/wagtail/projects/9/views/1)\n\nView the full list of [currently-tracked accessibility issues](https://github.com/wagtail/wagtail/issues?q=sort%3Aupdated-desc%20is%3Aissue%20label%3AAccessibility%20label%3Atype%3ABug%20is%3Aopen) in GitHub.",
      "level": "A, AA, AAA",
      "evaluatedLevel": "Level AA",
      "evaluated": true
    },
    "non-web-a11y-guidelines": {
      "id": "non-web-a11y-guidelines",
      "num": "A.1.2.1",
      "handle": "Accessibility Guidelines",
      "result": "Not applicable",
      "observations": "Wagtail is a web-based CMS.",
      "level": "A",
      "evaluatedLevel": "Level A",
      "evaluated": true
    },
    "non-web-platform-a11y-services": {
      "id": "non-web-platform-a11y-services",
      "num": "A.1.2.2",
      "handle": "Platform Accessibility Services",
      "result": "Not applicable",
      "observations": "Wagtail is a web-based CMS.",
      "level": "A",
      "evaluatedLevel": "Level A",
      "evaluated": true
    },
    "alts-for-non-text": {
      "id": "alts-for-non-text",
      "num": "A.2.1.1",
      "handle": "Text Alternatives for Rendered Non-Text Content",
      "result": "Failed",
      "observations": "For icons within the CMS, all have appropriate alt text. For CMS-managed images, Wagtail renders non-text content in nine scenarios, five of which are related to editing views and would require changes:\n\n- Fail: Image upload fields in the image edit/create form. The image’s title displays as a field next to the visuals. The title acts as alt text by default in Wagtail. This is missing a programmatic association between the title or description text, and the image.\n  - Example: [Editing image Boston Cream Pie](https://static-wagtail-v7-4.netlify.app/admin/images/43/)\n  - Current: The alt text is permanently set to the contents of the Title field on page load.\n  - Proposed actions:\n    - The image could be more clearly associated with the live title and description fields with an `aria-labelledby`.\n    - The description field could have help text to clarify its use as the image’s alt text (at least in the CMS).\n- Fail: Image chooser fields in forms. The selected image’s title displays next to the visuals. The description acts as alt text by default in Wagtail. This is missing a programmatic association between the title text and image.\n  - Example: [Editing Blog Page: Desserts with Benefits, Image field](https://static-wagtail-v7-4.netlify.app/admin/pages/77/edit/#panel-child-content-image-section)\n  - Current: Alt text set to `alt=\"\"`, with title displayed after the image.\n  - Proposed actions:\n    - Associate the visible text with the image with `aria-labelledby`.\n    - Switch to the description field as alt text in the CMS.\n- Fail: Image chooser fields with a custom alt text field next to them. The custom alt text field is not programmatically associated with the image.\n  - Example (with Caption field): [Editing Blog Page: Desserts with Benefits, Image block](https://static-wagtail-v7-4.netlify.app/admin/pages/77/edit/#block-556e76b0-0f5a-42bb-b039-653f3d6b1f0b-section)\n  - Alt text set to `alt=\"\"`, with title displayed after the image, and custom field further down.\n  - Proposed actions:\n    - Implement this pattern in the bakerydemo website, based on the built-in ImageBlock.\n    - Associate both the title of the image, and the custom field, with `aria-labelledby`, or a combination of it and `aria-describedby`.\n- Fail: Images within rich text fields. Here the image’s title is displayed in a tooltip associated with the image, but there is no programmatic association.\n  - Example: unavailable\n  - Proposed actions:\n    - Add demo content following this pattern in bakerydemo.\n    - Add a programmatic association between tooltip text and image with `aria-labelledby`.\n    - Make sure the image has alt text accessible even when the tooltip is closed.\n- Fail: Embeds within rich text fields. Here we display the embed’s thumbnail if there is one. The embed’s title is displayed in a tooltip associated with the embed, but there is no programmatic association.\n  - Example: [Editing Blog Page: Desserts with Benefits, Paragraph block](https://static-wagtail-v7-4.netlify.app/admin/pages/77/edit/#block-ac48af95-b3be-4602-8c2f-5c43fc080f17-section)\n  - Current: Alt text set to `alt=\"\"`, with no text displayed near the image.\n  - Proposed actions:\n    - Add a programmatic association between tooltip text and image with `aria-labelledby`.\n    - Make sure the thumbnail image has alt text accessible even when the tooltip is closed.\n\nOutside editing views (possibly not part of ATAG requirements), Wagtail renders images in the following scenarios:\n\n- Revisions comparison with images. The image’s title is used as alt text. The title should be visible to the user in the UI, but it is not.\n  - Example: [Comparing Bread and Circuses](https://static-wagtail-v7-4.netlify.app/admin/pages/68/revisions/compare/46...108/)\n  - Current: the image title is used as `alt` attribute.\n  - Proposed actions:\n    - Add demo content following this pattern in bakerydemo.\n    - Display the images’ titles in the UI, with programmatic `aria-labelledby` associations.\n    - Switch to the `description` field as alt text.\n- Revisions comparison with images or embeds in rich text: currently unimplemented.\n- Snippets listings. When there is an image column, its alt text is set but invisible in the UI.\n  - Example: [Snippets People](https://static-wagtail-v7-4.netlify.app/admin/snippets/base/person/)\n  - Current: the image title is used as `alt` attribute.\n  - Proposed actions:\n    - Display the images’ titles in the UI, with programmatic `aria-labelledby` associations.\n    - Switch to the `description` field as alt text.\n- Image gallery. Here we display the title underneath the image as alt text, in a `figcaption`.\n  - Example: [Images](https://static-wagtail-v7-4.netlify.app/admin/images/)\n  - Current: Alt text set to `alt=\"\"`, but the image is within a `figure` with the image’s title as `figcaption`.\n  - Proposed actions:\n    - Associate the text and the image with `aria-labelledby`.\n    - Switch to the `description` field as alt text.\n\nRecommendation for Wagtail: Consider how best to sign-post the Description field as the image’s alt text in the CMS, and potentially also in the frontend (with clear options to mark images as decorative or define alt text in context).",
      "level": "A",
      "evaluatedLevel": "Level A",
      "evaluated": true
    },
    "alts-for-time-based": {
      "id": "alts-for-time-based",
      "num": "A.2.1.2",
      "handle": "Alternatives for Rendered Time-Based Media",
      "result": "Failed",
      "observations": "Wagtail’s only time-based media is animated GIFs. Their text alternatives work identically to other images in Wagtail, with the same characteristics listed in SC A.2.1.1.",
      "level": "A",
      "evaluatedLevel": "Level A",
      "evaluated": true
    },
    "editing-view-status-indicators": {
      "id": "editing-view-status-indicators",
      "num": "A.2.2.1",
      "handle": "Editing-View Status Indicators",
      "result": "Failed",
      "observations": "Wagtail uses the following status indicators in editing views:\n\n- Fail: Comments on fields. Comments are displayed as a \"speech bubble\" icon next to the field they are associated with. The association isn’t programmatically exposed. Even visually, the presence of a comment can only be identified on hover/focus within the field’s area.\n  - Example: [Editing Home Page: Welcome to the Wagtail bakery!](https://static-wagtail-v7-4.netlify.app/admin/pages/60/edit/)\n  - Proposed actions:\n    - Add a programmatic association between fields and their comment presence indicator\n    - Make the comment presence indicator visible at all times, either for all users or users of \"prefers contrast\" theming.\n    - (WCAG issue) Make the comment addition buttons visible at all times in commenting mode.\n- Fail: Comments in rich text. Comments are displayed as highlighted text within the rich text field. The association isn’t programmatically exposed.\n  - Example: none available\n  - Proposed actions:\n    - Add demo content following this pattern in bakerydemo.\n    - Research how other WYSIWYG interfaces programmatically associate comments with runs of text.\n- Pass: Character count for rich text fields. The character count is displayed as a number next to the field it is associated with. The association is programmatically exposed with `aria-describedby` (\"Character count: 18/120\").\n  - Example [Editing Recipe page: Southern Cornbread, Preface field](https://static-wagtail-v7-4.netlify.app/admin/pages/82/edit/#panel-child-content-preface-section)\n- Pass: Concurrent editing notifications. The notification status is associated with a `aria-label` and tooltip on the status button.\n- TBC (work in progress): content quality checks within page editor.\n\nOutside editing views (possibly not part of ATAG requirements), Wagtail renders status indicators in the following scenarios:\n\n- Accessibility checks in Wagtail userbar. They are currently not programmatically associated with the content they are for.",
      "level": "A",
      "evaluatedLevel": "Level A",
      "evaluated": true
    },
    "access-rendered-text-props": {
      "id": "access-rendered-text-props",
      "num": "A.2.2.2",
      "handle": "Access to Rendered Text Properties",
      "result": "Not applicable",
      "observations": "Wagtail doesn’t allow editing of any text properties associated with the content.",
      "level": "AA",
      "evaluatedLevel": "Level AA",
      "evaluated": true
    },
    "keyboard-access-minimum": {
      "id": "keyboard-access-minimum",
      "num": "A.3.1.1",
      "handle": "Keyboard Access (Minimum)",
      "result": "Failed",
      "observations": "Though the majority of the authoring tool’s functionality is keyboard accessible, there are specific areas that aren’t:\n\n- In rich text fields, pin/unpin of the rich text toolbar.\n  - Example: [Editing Blog Page: Tracking Wild Yeast](https://static-wagtail-v7-4.netlify.app/admin/pages/62/edit/)\n  - Proposed actions:\n    - Research how other WYSIWYG interfaces allow keyboard interactions with all toolbar controls.\n- In rich text fields, Edit functionality for links, documents, images, embeds.\n  - Examples:\n    - Links: [Editing Standard page: About](https://static-wagtail-v7-4.netlify.app/admin/pages/76/edit/#panel-child-content-body-section)\n    - Documents: [Editing Recipe page: Southern Cornbread](https://static-wagtail-v7-4.netlify.app/admin/pages/82/edit/#block-910c5024-a47a-45b1-a3a3-8f8bb5a8fa70-section)\n    - Images: no example\n    - Embeds: [Editing Blog page: Desserts with Benefits](https://static-wagtail-v7-4.netlify.app/admin/pages/77/edit/)\n  - Proposed actions:\n    - Research how other WYSIWYG interfaces allow keyboard interactions with all toolbar controls.\n    - Possibly support selection of all those content types and press \"Enter\" to move focus to their UI.\n    - See [Rich text ctrl + K keyboard shortcut should open the link or document tooltip #11627](https://github.com/wagtail/wagtail/issues/11627)\n- In image/document/page/task/snippet choosers, the chooser dialog.\n  - See [Making Wagtail Accessible for users with disabilities #4199](https://github.com/wagtail/wagtail/issues/4199)\n  - See also [Implement focus management for chooser modals #5338](https://github.com/wagtail/wagtail/issues/5338)\n  - Examples:\n    - Images: [Editing Bread page: Arepa](https://static-wagtail-v7-4.netlify.app/admin/pages/37/edit/#panel-child-content-image-section)\n    - Snippets: [Editing Bread page: Arepa](https://static-wagtail-v7-4.netlify.app/admin/pages/37/edit/#panel-child-content-origin-section)\n    - Documents: no example\n    - Pages: [Editing workflow Moderator approval](https://static-wagtail-v7-4.netlify.app/admin/workflows/edit/1/#workflow-pages-section)\n    - Tasks: [Editing workflow Moderator approval](https://static-wagtail-v7-4.netlify.app/admin/workflows/edit/1/#inline_child_workflow_tasks-0-panel-section)\n  - Proposed actions:\n    - Complete [Re-implement chooser modals with new design #9246](https://github.com/wagtail/wagtail/pull/9246)\n- In image create/edit forms, creation or editing of a focal area.\n  - Current: it’s impossible to set a focal area without a mouse.\n  - Example: [Editing Boston Cream Pie](https://static-wagtail-v7-4.netlify.app/admin/images/43/)\n  - Proposed actions:\n    - Add keyboard support with a new implementation\n    - Factor in [possible requirements](https://github.com/wagtail/wagtail/issues/10947#issuecomment-1746464044) for other types of image manipulation.\n- In table blocks, editing of the table.\n  - Example: [Editing Recipe page: Hot Cross Bun](https://static-wagtail-v7-4.netlify.app/admin/pages/81/edit/#block-2b9b59cb-4dd7-4ebf-ac66-1ed43471609b-section)",
      "level": "A",
      "evaluatedLevel": "Level A",
      "evaluated": true
    },
    "no-keyboard-traps": {
      "id": "no-keyboard-traps",
      "num": "A.3.1.2",
      "handle": "No Keyboard Traps",
      "result": "Passed",
      "observations": "There are no known keyboard traps in the administrative interface.",
      "level": "A",
      "evaluatedLevel": "Level A",
      "evaluated": true
    },
    "efficient-keyboard-access": {
      "id": "efficient-keyboard-access",
      "num": "A.3.1.3",
      "handle": "Efficient Keyboard Access",
      "result": "Passed",
      "observations": "The administrative interface provides the following mechanisms to improve keyboard navigation:\n\n- A skip link, across all views, to skip the sidebar.\n- Collapsible sections on long views to avoid having to tab through all of the content.\n- A mechanism to link to specific collapsible sections, for direct access via bookmarks.\n- A \"Collapse/expand all sections\" button on long forms to navigate more easily to a specific section.\n- The \"minimap\" skip-menu on long forms to navigate more easily to a specific section.",
      "level": "AA",
      "evaluatedLevel": "Level AA",
      "evaluated": true
    },
    "keyboard-access-enhanced": {
      "id": "keyboard-access-enhanced",
      "num": "A.3.1.4",
      "handle": "Keyboard Access (Enhanced)",
      "result": "Failed",
      "observations": "See _A.3.1.1 Keyboard Access_. We would expect addressing all aspects listed in _A.3.1.1_ to also address this criterion.",
      "level": "AAA",
      "evaluatedLevel": "Level AAA",
      "evaluated": true
    },
    "customise-keyboard-access": {
      "id": "customise-keyboard-access",
      "num": "A.3.1.5",
      "handle": "Customize Keyboard Access",
      "result": "Failed",
      "observations": "None of Wagtail’s keyboard commands can be customized.\n\nProposed actions:\n\n- Document all keyboard commands (SC _A.3.1.6 Present Keyboard Commands_)\n- Implement a \"key map\" for Wagtail’s keyboard commands and-or command palette, with a way to upload a new key map as JSON.",
      "level": "AAA",
      "evaluatedLevel": "Level AAA",
      "evaluated": true
    },
    "present-keyboard-commands": {
      "id": "present-keyboard-commands",
      "num": "A.3.1.6",
      "handle": "Present Keyboard Commands",
      "result": "Passed",
      "observations": "Across specific areas:\n\n- Pass: In rich text fields, Markdown keyboard commands or keyboard shortcuts are displayed within tooltips for specific toolbar buttons.\n- Pass: In rich text fields, \"command palette\" commands are displayed in the block chooser, and the command palette trigger is displayed in the fields’ placeholder.\n- Pass: Wagtail’s other traditional \"key combinations\" keyboard shortcuts are displayed in the \"Keyboard shortcuts\" dialog. This includes:\n  - Save draft\n  - Preview\n\nProposed actions:\n\n- View possible improvements in [Keyboard shortcut documentation for editor in the Wagtail UI #12050](https://github.com/wagtail/wagtail/discussions/12050)\n- Consider a \"Command palette\" concept for Wagtail",
      "level": "AAA",
      "evaluatedLevel": "Level AAA",
      "evaluated": true
    },
    "auto-save-minimum": {
      "id": "auto-save-minimum",
      "num": "A.3.2.1",
      "handle": "Auto-Save (minimum)",
      "result": "Passed",
      "observations": "Wagtail provides auto-save functionality for pages and snippets, which are the two content types with the most demanding editing tasks. For Wagtail sites, the default session time limit is 2 weeks.",
      "level": "A",
      "evaluatedLevel": "Level A",
      "evaluated": true
    },
    "timing-adjustable": {
      "id": "timing-adjustable",
      "num": "A.3.2.2",
      "handle": "Timing Adjustable",
      "result": "Passed",
      "observations": "For Wagtail sites, the default session time limit is 2 weeks.",
      "level": "A",
      "evaluatedLevel": "Level A",
      "evaluated": true
    },
    "static-input-components": {
      "id": "static-input-components",
      "num": "A.3.2.3",
      "handle": "Static Input Components",
      "result": "Passed",
      "observations": "There are no moving input components in the CMS.",
      "level": "A",
      "evaluatedLevel": "Level A",
      "evaluated": true
    },
    "content-edits-saved": {
      "id": "content-edits-saved",
      "num": "A.3.2.4",
      "handle": "Content Edits Saved (Extended)",
      "result": "Passed",
      "observations": "See _A.3.2.1 Auto-Save (Minimum)_.",
      "level": "AAA",
      "evaluatedLevel": "Level AAA",
      "evaluated": true
    },
    "static-view-option": {
      "id": "static-view-option",
      "num": "A.3.3.1",
      "handle": "Static View Option",
      "result": "Failed",
      "observations": "Animated GIFs auto-play when rendered, with no option to pause them.\n\nProposed actions:\n\n- Research accessibility best practices on animated GIFs\n- Design a new interface for how CMS users interact with animated GIFs\n- Implement the new interface according to ATAG, WCAG standards, and accessibility best practices.",
      "level": "A",
      "evaluatedLevel": "Level A",
      "evaluated": true
    },
    "navigate-by-structure": {
      "id": "navigate-by-structure",
      "num": "A.3.4.1",
      "handle": "Navigate by structure",
      "result": "Not applicable",
      "observations": "Markup elements aren’t exposed in the CMS.",
      "level": "AA",
      "evaluatedLevel": "Level AA",
      "evaluated": true
    },
    "navigate-by-relationships": {
      "id": "navigate-by-relationships",
      "num": "A.3.4.2",
      "handle": "Navigate by Programmatic Relationships",
      "result": "Passed",
      "observations": "The only editable programmatic relationships are headings and element nesting in rich text fields, which can be navigated via the keyboard.",
      "level": "AAA",
      "evaluatedLevel": "Level AAA",
      "evaluated": true
    },
    "text-search": {
      "id": "text-search",
      "num": "A.3.5.1",
      "handle": "Text Search",
      "result": "Failed",
      "observations": "Wagtail supports browsers’ built-in text search which meets all criteria, but only allows searching within the currently-active tab of the editing view. For example, for pages, content under the \"Promote\" tab will only be searchable when this tab is active.\n\nProposed actions:\n\n- Implement [hidden=\"until-found\"](https://developer.mozilla.org/en-US/docs/Web/HTML/Global_attributes/hidden).\n- Research how other content management systems cater for this requirement.\n- Fix [Activating a tab based on the URL hash should also set focus to the corresponding tabpanel #8483](https://github.com/wagtail/wagtail/issues/8483)",
      "level": "AA",
      "evaluatedLevel": "Level AA",
      "evaluated": true
    },
    "independence-of-display": {
      "id": "independence-of-display",
      "num": "A.3.6.1",
      "handle": "Independence of Display",
      "result": "Passed",
      "observations": "All of Wagtail’s UI settings can be adjusted without modifying the content.",
      "level": "A",
      "evaluatedLevel": "Level A",
      "evaluated": true
    },
    "save-settings": {
      "id": "save-settings",
      "num": "A.3.6.2",
      "handle": "Save Settings",
      "result": "Passed",
      "observations": "Specific settings are saved differently. The following settings are persistent for a given user profile, across all sessions of said user:\n\n- Language\n- Time zone\n- Notification settings\n- Admin interface theme\n- UI density\n- Contrast theme\n\nThe following settings are persistent for a given browser, across all sessions within said browser:\n\n- Sidebar expanded/collapsed\n- Rich text toolbar pinned/unpinned\n- Minimap opened/closed\n- Currently-open side panel",
      "level": "AA",
      "evaluatedLevel": "Level AA",
      "evaluated": true
    },
    "apply-platform-settings": {
      "id": "apply-platform-settings",
      "num": "A.3.6.3",
      "handle": "Apply Platform Settings",
      "result": "Passed",
      "observations": "Wagtail’s language, time zone, and theme settings default to respecting platform settings until set to a specific value by the user.",
      "level": "AA",
      "evaluatedLevel": "Level AA",
      "evaluated": true
    },
    "preview-minimum": {
      "id": "preview-minimum",
      "num": "A.3.7.1",
      "handle": "Preview (Minimum)",
      "result": "Passed",
      "observations": "Wagtail’s live preview for pages and snippets and its draft renders within the user’s browser.",
      "level": "A",
      "evaluatedLevel": "Level A",
      "evaluated": true
    },
    "preview-enhanced": {
      "id": "preview-enhanced",
      "num": "A.3.7.2",
      "handle": "Preview (Enhanced)",
      "result": "Passed",
      "observations": "Wagtail’s live preview for pages and snippets can only display within the user’s browser, but all saved draft content can be previewed in any browser/device the user is logged in.",
      "level": "AAA",
      "evaluatedLevel": "Level AAA",
      "evaluated": true
    },
    "content-changes-reversible": {
      "id": "content-changes-reversible",
      "num": "A.4.1.1",
      "handle": "Content Changes Reversible (Minimum)",
      "result": "Failed",
      "observations": "Though a large number of authoring actions are reversible, not all are. The following actions are reversible:\n\n- Plain text and rich text content editing within specific fields, reversible until the user submits the form.\n- Editing of page or snippets content supporting revisions, reversible for the whole page/snippet at any later point in the site’s history.\n\nThe following actions are not reversible but do require confirmation to proceed:\n\n- Permanent deletion of any content which has its own dedicated creation/editing views.\n- Unpublishing of pages and snippets.\n- Deletion of comments within page content.\n\nThe following actions are not reversible and do not require confirmation to proceed:\n\n- StreamField / InlinePanel block-based content editing, reversible only as part of support for content revisions.\n  - Consider implementing an in-browser undo-redo stack for those interactions.\n- Image / Document / Page / Task / Snippet / Embed chooser fields, reversible only as part of support for content revisions.\n  - Consider implementing an in-browser undo-redo stack for those interactions.\n- Authoring actions on content that does not support revisions such as images, documents, etc.\n  - Implement either a confirmation step for those actions, or revisions/versioning support.\n- Reordering of pages within list views\n  - Implement either a confirmation step for those actions, or revisions/versioning support.",
      "level": "A",
      "evaluatedLevel": "Level A",
      "evaluated": true
    },
    "settings-change-confirm": {
      "id": "settings-change-confirm",
      "num": "A.4.1.2",
      "handle": "Settings Change Confirmation",
      "result": "Passed",
      "observations": "All of Wagtail’s UI settings saved at the browser level can be reversed by the user directly within the UI. All of the settings saved at the user profile level can be set to an \"unset\" default value.\n\nRecommendation for Wagtail:\n\n- Reset all browser-level settings when users intentionally log out (not on session timeouts)\n- Add a way to \"Reset preferences\" – reverse all browser-level and user profile settings to their default value within the user’s profile form.",
      "level": "A",
      "evaluatedLevel": "Level A",
      "evaluated": true
    },
    "content-changes-reversible-enhanced": {
      "id": "content-changes-reversible-enhanced",
      "num": "A.4.1.3",
      "handle": "Content Changes Reversible (Enhanced)",
      "result": "Passed",
      "observations": "Reversible plain text and rich text content changes can be reversed sequentially while the user remains on the page. Content supporting revisions can be restored at any point in the content’s history.",
      "level": "AAA",
      "evaluatedLevel": "Level AAA",
      "evaluated": true
    },
    "describe-features": {
      "id": "describe-features",
      "num": "A.4.2.1",
      "handle": "Describe Accessibility Features",
      "result": "Passed",
      "observations": "The following functionality would be used to meet Part A and needs to be described either in the documentation or in the user interface:\n\nThe following functionality is described in the user interface:\n\n- Restore revisions\n- Command palette trigger\n- Keyboard shortcuts\n  - Page-level keyboard shortcuts\n  - Rich text formatting\n  - Markdown commands for rich text\n  - Comment in rich text\n\nThe following functionality is described in the documentation:\n\n- Images’ alt text management\n- Skip link\n- Collapsible sections\n- Link to specific collapsible sections\n- Collapse/expand all\n- Minimap\n- Session time limit\n- Editing of headings and elements nesting in rich text fields\n- Text search\n- Browser-level UI settings\n  - Sidebar expanded/collapsed\n  - Rich text toolbar pinned/unpinned\n  - Minimap opened/closed\n  - Currently-open side panel\n- Profile-level UI settings\n  - Language\n  - Time zone\n  - Notification settings\n  - Admin interface theme\n  - Density\n  - Contrast theme\n- Live preview\n- Command palette available commands\n- Keyboard shortcuts\n  - Page-level keyboard shortcuts\n  - Rich text formatting\n  - Markdown commands for rich text\n  - Comment in rich text\n\nThe following functionality is provided by the underlying platform:\n\n- Embeds titles as alt text for embedded content",
      "level": "A",
      "evaluatedLevel": "Level A",
      "evaluated": true
    },
    "document-all-features": {
      "id": "document-all-features",
      "num": "A.4.2.2",
      "handle": "Document All Features",
      "result": "Failed",
      "observations": "Here is a high-level record of whether given functionality is documented. As a summary:\n\n- For 19 high-level functional areas, 9 are partially documented and 4 are fully documented.\n- For 148 specific features, 55 are documented.\n\nThis record does not cover functionality provided by the underlying platform (for example; automated embed creation) or unused by authors.\n\nFor a full record of documentation status across 145 features divided in 19 functional areas, see [A.4.2.2 Document All Features - Wagtail ATAG 2.0 report](https://wagtail.org/accessibility/atag-audit/#a422-document-all-features).",
      "level": "AA",
      "evaluatedLevel": "Level AA",
      "evaluated": true
    },
    "content-after-authoring-session": {
      "id": "content-after-authoring-session",
      "num": "B.1.1.1",
      "handle": "Content Auto-Generation After Authoring Sessions (WCAG)",
      "result": "Passed",
      "observations": "Wagtail doesn’t automatically generate content after authoring sessions. Processes that operate after authoring sessions and could alter the content are [scheduled publishing](https://docs.wagtail.org/en/stable/reference/pages/theory.html#id2) and [search index](https://docs.wagtail.org/en/stable/topics/search/indexing.html#wagtailsearch-indexing-update) updates, but in both cases any automatically-generated content would already be present during the session.",
      "level": "A, AA, AAA",
      "evaluatedLevel": "Level AAA",
      "evaluated": true
    },
    "content-during-authoring-session": {
      "id": "content-during-authoring-session",
      "num": "B.1.1.2",
      "handle": "Content Auto-Generation During Authoring Sessions (WCAG)",
      "result": "Passed",
      "observations": "Wagtail automatically generates content in a few scenarios. In the following scenarios, markup is accessible without further work:\n\n- Pass: Links markup for links to pages, documents, external URLs, email addresses, phone numbers, and internal anchors within rich text fields.\n- Pass: Embeds for external resources within rich text fields.\n- Pass: Embeds for external resources in StreamField.\n- Pass: Image markup for images in rich text fields. Images are rendered with alt text from an editable field, and a checkbox to mark the image as decorative.\n- Pass: Image markup for images in StreamField. The Image block is rendered with alt text from an editable field, and a checkbox to mark the image as decorative.\n- Pass: Table markup from TableBlock.\n- Pass: Table markup for TypedTableBlock.",
      "level": "A, AA, AAA",
      "evaluatedLevel": "Level AA",
      "evaluated": true
    },
    "restructuring-recording-transformations": {
      "id": "restructuring-recording-transformations",
      "num": "B.1.2.1",
      "handle": "Restructuring and Recoding Transformations",
      "result": "Not applicable",
      "observations": "The only transformation present in Wagtail is processing of clipboard paste information in rich text fields to sanitize the content, which preserves accessibility semantics for preserved content, but isn’t considered a content transformation per ATAG.\n\nIf it was considered a content transformation – rich paste processing preserves all formatting supported in rich text fields. Heading levels, bullet lists, and image alt text are preserved in particular.",
      "level": "A, AA, AAA",
      "evaluatedLevel": "Level AA",
      "evaluated": true
    },
    "copy-paste-in-authoring-tool": {
      "id": "copy-paste-in-authoring-tool",
      "num": "B.1.2.2",
      "handle": "Copy-Paste Inside Authoring Tool (WCAG)",
      "result": "Passed",
      "observations": "Wagtail supports copy-paste of rich text content, which is fully preserved when copy-pasting between fields configured to support the same formatting. Fields configured differently will accordingly have their formatting stripped as needed.",
      "level": "A, AA, AAA",
      "evaluatedLevel": "Level AA",
      "evaluated": true
    },
    "optimizations-preserve-accessibility": {
      "id": "optimizations-preserve-accessibility",
      "num": "B.1.2.3",
      "handle": "Optimizations Preserve Accessibility",
      "result": "Not applicable",
      "observations": "Wagtail doesn’t perform any optimizations that would affect accessibility.",
      "level": "A",
      "evaluatedLevel": "Level A",
      "evaluated": true
    },
    "text-alts-for-non-text-preserved": {
      "id": "text-alts-for-non-text-preserved",
      "num": "B.1.2.4",
      "handle": "Text Alternatives for Non-Text Content are Preserved",
      "result": "Not applicable",
      "observations": "See _B.1.2.1 Restructuring and Recoding Transformations (WCAG)_.",
      "level": "A",
      "evaluatedLevel": "Level A",
      "evaluated": true
    },
    "accessible-content-possible": {
      "id": "accessible-content-possible",
      "num": "B.2.1.1",
      "handle": "Ensure that accessible content production is possible. ",
      "result": "Failed",
      "observations": "Wagtail places extensive restrictions on the production of web content, which all nonetheless allow for the production of accessible content, with the exception of:\n\n- Missing support for setting `lang` attributes within rich text. This could be worked around by using other types of content modeling for multilingual content, which is possible but unlikely.\n\nProposed actions:\n\n- Implement [Feature request: Support for declaring language on elements in rich text. #4694](https://github.com/wagtail/wagtail/issues/4694)",
      "level": "A, AA, AAA",
      "evaluatedLevel": "Level AA",
      "evaluated": true
    },
    "accessible-option-prominence": {
      "id": "accessible-option-prominence",
      "num": "B.2.2.1",
      "handle": "Accessible Option Prominence (WCAG)",
      "result": "Passed",
      "observations": "Where text styling options are available, they are presented alongside semantic formatting options such as headings. This is for example the case in rich text formatting options.\n\nFor StreamField block formats, the order is up to each site implementer to decide on. There are no built-in formats that are automatically included.",
      "level": "A, AA, AAA",
      "evaluatedLevel": "Level AA",
      "evaluated": true
    },
    "setting-accessibility-props": {
      "id": "setting-accessibility-props",
      "num": "B.2.2.2",
      "handle": "Setting Accessibility Properties (WCAG)",
      "result": "Not applicable",
      "observations": "Wagtail doesn’t support setting web content attribute values. This has been discussed extensively for links, as well as an option to set `aria-label`, but hasn’t been implemented yet.\n\nSee:\n\n- [Feature request: Support for declaring language on elements in rich text. #4694](https://github.com/wagtail/wagtail/issues/4694)\n- [Feature: ability to set links as \"nofollow\" rel via the WYSIWG editor's link chooser #4474](https://github.com/wagtail/wagtail/issues/4474)",
      "level": "A, AA, AAA",
      "evaluatedLevel": "Level AA",
      "evaluated": true
    },
    "alternative-content-editable": {
      "id": "alternative-content-editable",
      "num": "B.2.3.1",
      "handle": "Alternative Content is Editable (WCAG)",
      "result": "Passed",
      "observations": "All areas where images can be used support providing alt text. This includes:\n\n- Global alt text via the built-in \"Description\" field.\n- Contextual alt text within rich text via the \"Alt text\" field and \"Decorative\" checkbox.\n- Contextual alt text in blocks via the \"Alt text\" field and \"Decorative\" checkbox.\n",
      "level": "A, AA, AAA",
      "evaluatedLevel": "Level AA",
      "evaluated": true
    },
    "automatic-repair-of-text-alts": {
      "id": "automatic-repair-of-text-alts",
      "num": "B.2.3.2",
      "handle": "Automating Repair of Text Alternatives",
      "result": "Passed",
      "observations": "Wagtail doesn’t attempt to repair text alternatives. It does use the image’s file name as the default value for the image’s title field when creating a new image, which is used for alt text, but this is part of the upload/editing process (In-Session Repairs) and not an automated process. Said file name is filtered by default to remove the file extension.",
      "level": "A",
      "evaluatedLevel": "Level A",
      "evaluated": true
    },
    "save-for-reuse": {
      "id": "save-for-reuse",
      "num": "B.2.3.3",
      "handle": "Save for Reuse",
      "result": "Failed",
      "observations": "By default, Wagtail saves each image’s text alternative and reuses it everywhere the image is reused (\"Save and Suggest\"). It is possible to replace this text alternative with a new one, but it isn’t possible to delete it.\n\nSuggested action: incorporate this requirement into the contextual alt text support.",
      "level": "AAA",
      "evaluatedLevel": "Level AAA",
      "evaluated": true
    },
    "accessible-template-options": {
      "id": "accessible-template-options",
      "num": "B.2.4.1",
      "handle": "Accessible Template Options (WCAG)",
      "result": "Passed",
      "observations": "With rich text formatting and StreamField blocks, Wagtail provides templates for basic text content as well as complex formatting like tables. Wagtail also provides templates for form fields within its forms module. As of now, none of those templates have accessibility issues.\n\n- For rich text formats: no issues.\n- For Field block types: no issues.\n- For Structural block types: no issues\n- For form builder field types: no issues.\n\nThere are no issues with the latest Django 5.2. In past versions, error messages weren’t [programmatically associated with the field](https://code.djangoproject.com/ticket/32819).",
      "level": "A, AA, AAA",
      "evaluatedLevel": "Level AA",
      "evaluated": true
    },
    "identify-template-accessibility": {
      "id": "identify-template-accessibility",
      "num": "B.2.4.2",
      "handle": "Identify Template Accessibility",
      "result": "Passed",
      "observations": "Wagtail’s template selection mechanism is the block chooser (or field chooser for form builder fields). In both cases, there would be no options defined unless configured by site implementers, which can customize block icons or labels / names to indicate accessible block types.",
      "level": "AA",
      "evaluatedLevel": "Level AA",
      "evaluated": true
    },
    "author-created-templates": {
      "id": "author-created-templates",
      "num": "B.2.4.3",
      "handle": "Author-Created Templates",
      "result": "Not applicable",
      "observations": "Wagtail doesn’t allow authors to create custom block templates.",
      "level": "AA",
      "evaluatedLevel": "Level AA",
      "evaluated": true
    },
    "accessible-template-options-enhanced": {
      "id": "accessible-template-options-enhanced",
      "num": "B.2.4.4",
      "handle": "Accessible Template Options (Enhanced)",
      "result": "Passed",
      "observations": "All of the template options are accessible. See _B.2.4.1 Accessible Template Options_.",
      "level": "AAA",
      "evaluatedLevel": "Level AAA",
      "evaluated": true
    },
    "accessible-pre-authored-content-options": {
      "id": "accessible-pre-authored-content-options",
      "num": "B.2.5.1",
      "handle": "Accessible Pre-Authored Content Options",
      "result": "Not applicable",
      "observations": "Wagtail doesn’t provide pre-authored content.",
      "level": "AA",
      "evaluatedLevel": "Level AA",
      "evaluated": true
    },
    "identify-pre-authored-content-accessibility": {
      "id": "identify-pre-authored-content-accessibility",
      "num": "B.2.5.2",
      "handle": "Identify Pre-Authored Content Accessibility",
      "result": "Not applicable",
      "observations": "Wagtail doesn’t provide pre-authored content.",
      "level": "AA",
      "evaluatedLevel": "Level AA",
      "evaluated": true
    },
    "checking-assistance": {
      "id": "checking-assistance",
      "num": "B.3.1.1",
      "handle": "Checking Assistance (WCAG)",
      "result": "Passed",
      "observations": "There are a number of formatting / content entry options in the CMS that can lead to accessibility issues. The built-in accessibility checker provides automated tests for a number of possible issues, but not all. Available checks are:\n\n- `button-name`: `<button>` elements must always have a text label.\n- `empty-heading`: This rule checks for headings with no text content. Empty headings are confusing to screen readers users and should be avoided.\n- `empty-table-header`: Table header text should not be empty\n- `frame-title`: `<iframe>` elements must always have a text label.\n- `heading-order`: This rule checks for incorrect heading order. Headings should be ordered in a logical and consistent manner, with the main heading (h1) followed by subheadings (h2, h3, etc.).\n- `input-button-name`: `<input>` button elements must always have a text label.\n- `link-name`: `<a>` link elements must always have a text label.\n- `p-as-heading`: This rule checks for paragraphs that are styled as headings. Paragraphs should not be styled as headings, as they don’t help users who rely on headings to navigate content.\n- `alt-text-quality`: A custom rule ensures that image alt texts don’t contain anti-patterns like file extensions and underscores.\n\nThere are a number of success criteria that do not have automated checks nor instructions for manual checking:\n\n- 2.4.4 Link Purpose (In Context) (AA) – instructions and potentially limited automated checks on correct link text (avoid \"click here\")\n- 1.4.5 Images of Text (AA) – instructions on avoiding images of text except for scenarios where there is no alternative\n- 2.4.9 Link Purpose (Link Only) (AAA) – see above\n- 1.4.9 Images of Text (No Exception) (AAA) – see above\n- 3.1.5 Reading Level (AAA) – instructions for manual checking or automated checks\n- 2.4.10 Section Headings (AAA) – instructions for manual checking or automated checks\n- 3.3.5 Help (AAA) – instructions for manual checking or automated checks for the form builder\n\nProposed actions:\n\n- Implement more automated checks for WCAG SCs in question. [Content quality checkers #11063](https://github.com/wagtail/wagtail/discussions/11063)\n- Implement a manual check process for WCAG SCs in question. [Content quality checkers #11063](https://github.com/wagtail/wagtail/discussions/11063)\n- Roadmap: [Readability checks #50](https://github.com/wagtail/roadmap/issues/50)\n- Content quality API integrations for text quality and image computer vision\n- Improve options for organizations to embed their own instructions within the CMS, via HelpBlock and help text.",
      "level": "A, AA, AAA",
      "evaluatedLevel": "Level A",
      "evaluated": true
    },
    "help-authors-decide": {
      "id": "help-authors-decide",
      "num": "B.3.1.2",
      "handle": "Help Authors Decide",
      "result": "Not applicable",
      "observations": "Currently all of Wagtail’s automated checks are pass/fail with no author input required. Discussion on further checks: [Content quality checkers #11063](https://github.com/wagtail/wagtail/discussions/11063)",
      "level": "A",
      "evaluatedLevel": "Level A",
      "evaluated": true
    },
    "help-authors-locate": {
      "id": "help-authors-locate",
      "num": "B.3.1.3",
      "handle": "Help Authors Locate",
      "result": "Not applicable",
      "observations": "Currently all of Wagtail’s automated checks are pass/fail with no author input required. Those checks do indicate which elements they are flagging. Proposed improvements:\n\n- [Content quality checkers #11063](https://github.com/wagtail/wagtail/discussions/11063)\n- [Accessibility checker in page editor #10136](https://github.com/wagtail/wagtail/issues/10136)\n- Correct identification of Wagtail content so errors are only reported on CMS-managed content",
      "level": "A",
      "evaluatedLevel": "Level A",
      "evaluated": true
    },
    "status-report": {
      "id": "status-report",
      "num": "B.3.1.4",
      "handle": "Status Report",
      "result": "Passed",
      "observations": "Wagtail’s accessibility checker reports on the number of detected issues, and upon interaction lists all rules that detected problems and where on the page.\n\nPossible improvements:\n\n- [Content quality checkers #11063](https://github.com/wagtail/wagtail/discussions/11063) – making this data available in more readily accessible reports\n- Consider making the information easily copy-pasteable",
      "level": "AA",
      "evaluatedLevel": "Level AA",
      "evaluated": true
    },
    "programmatic-association-of-rules": {
      "id": "programmatic-association-of-rules",
      "num": "B.3.1.5",
      "handle": "Programmatic Association of Results",
      "result": "Failed",
      "observations": "Currently the association isn’t programmatic, due to expected compatibility issues.\n\nPossible resolution: Correct identification of Wagtail content so errors are only reported on CMS-managed content.",
      "level": "AA",
      "evaluatedLevel": "Level AA",
      "evaluated": true
    },
    "repair-assistance": {
      "id": "repair-assistance",
      "num": "B.3.2.1",
      "handle": "Repair Assistance (WCAG",
      "result": "Failed",
      "observations": "Currently Wagtail’s 9 rules report the presence of a problem but do not suggest specific solutions.\n\nProposed improvements:\n\n- [Content quality checkers #11063](https://github.com/wagtail/wagtail/discussions/11063)\n- Correct identification of Wagtail content so errors are only reported on CMS-managed content",
      "level": "A, AA, AAA",
      "evaluatedLevel": "Level AA",
      "evaluated": true
    },
    "features-active-by-default": {
      "id": "features-active-by-default",
      "num": "B.4.1.1",
      "handle": "Features Active by Default",
      "result": "Passed",
      "observations": "Wagtail’s accessibility checker is on by default and cannot be turned off unless site implementers make CMS customizations in code.",
      "level": "A",
      "evaluatedLevel": "Level A",
      "evaluated": true
    },
    "option-to-reactivate-features": {
      "id": "option-to-reactivate-features",
      "num": "B.4.1.2",
      "handle": "Option to Reactivate Features",
      "result": "Passed",
      "observations": "See _B.4.1.1 Features Active by Default_.",
      "level": "A",
      "evaluatedLevel": "Level A",
      "evaluated": true
    },
    "feature-deactivation-warning": {
      "id": "feature-deactivation-warning",
      "num": "B.4.1.3",
      "handle": "Feature Deactivation Warning",
      "result": "Passed",
      "observations": "See _B.4.1.1 Features Active by Default_.",
      "level": "AA",
      "evaluatedLevel": "Level AA",
      "evaluated": true
    },
    "feature-prominence": {
      "id": "feature-prominence",
      "num": "B.4.1.4",
      "handle": "Feature Prominence",
      "result": "Passed",
      "observations": "Wagtail currently has no features relating to invalid markup, syntax errors, spelling errors, grammar errors. Possible future changes:\n\n- Implement more automated checks for WCAG SCs in question. [Content quality checkers #11063](https://github.com/wagtail/wagtail/discussions/11063)\n- Implement a manual check process for WCAG SCs in question. [Content quality checkers #11063](https://github.com/wagtail/wagtail/discussions/11063)\n- Roadmap: [Readability checks #50](https://github.com/wagtail/roadmap/issues/50)",
      "level": "AA",
      "evaluatedLevel": "Level AA",
      "evaluated": true
    },
    "model-practice": {
      "id": "model-practice",
      "num": "B.4.2.1",
      "handle": "Model Practice (WCAG)",
      "result": "Failed",
      "observations": "Wagtail’s documentation for content authors does not demonstrate accessible authoring practices. The documentation for developers does: [Accessibility considerations](https://docs.wagtail.org/en/stable/advanced_topics/accessibility_considerations.html).\n\nProposed actions:\n\n- [Tutorial: accessible content with Wagtail](https://github.com/wagtail/guide/issues/396)\n- Add accessibility criteria to contributor documentation for documentation writing\n- Review developer documentation for accessibility improvements in examples",
      "level": "A, AA, AAA",
      "evaluatedLevel": "Level AA",
      "evaluated": true
    },
    "feature-instructions": {
      "id": "feature-instructions",
      "num": "B.4.2.2",
      "handle": "Feature Instructions",
      "result": "Passed",
      "observations": "Wagtail’s accessibility checker, heading levels, and alt text implementation are documented in the guide for content authors. The [documentation for developers](https://docs.wagtail.org/en/stable/advanced_topics/accessibility_considerations.html) also cover this.\n\nProposed actions:\n\n- Create a single page summarizing all accessibility-related information.",
      "level": "A",
      "evaluatedLevel": "Level A",
      "evaluated": true
    },
    "tutorial": {
      "id": "tutorial",
      "num": "B.4.2.3",
      "handle": "Tutorial",
      "result": "Failed",
      "observations": "Wagtail’s accessibility features doesn’t have a tutorial.\n\nProposed actions:\n\n- In the editor guide: [Tutorial: accessible content with Wagtail](https://github.com/wagtail/guide/issues/396).\n- Create a video tutorial in addition to the user guide website.",
      "level": "AAA",
      "evaluatedLevel": "Level AAA",
      "evaluated": true
    },
    "instruction-index": {
      "id": "instruction-index",
      "num": "B.4.2.4",
      "handle": "Instruction Index",
      "result": "Failed",
      "observations": "Wagtail’s documentation for content author does not have such an index. The documentation for developers does.\n\nProposed actions:\n\n- Add an index of accessibility features to the user guide.\n- [Outreachy: Accessibility features documentation](https://wagtail.org/blog/our-outreachy-projects-in-2023/)",
      "level": "AAA",
      "evaluatedLevel": "Level AAA",
      "evaluated": true
    }
  },
  "meta": {
    "name": { "id": "name", "value": "Wagtail" },
    "website": { "id": "website", "value": "https://wagtail.org/" },
    "executiveSummary": {
      "id": "executiveSummary",
      "value": "Wagtail’s second comprehensive ATAG audit, with the goal of driving next year’s roadmap for accessibility. A lot of progress has been made over the years, in particular recently with the addition of an accessibility checker built into the CMS.\n\nAll of the audit was conducted on Wagtail 7.4 released on 2026-05-05, on the demo site [Static Wagtail 7.4 demo](https://static-wagtail-v7-4.netlify.app/admin/) unless indicated otherwise.\n\nThe full audit is available at [wagtail.org/accessibility/atag-audit/](https://wagtail.org/accessibility/atag-audit/)"
    },
    "evaluatorName": { "id": "evaluatorName", "value": "Thibaud Colas" },
    "evaluatorOrg": { "id": "evaluatorOrg", "value": "Wagtail" },
    "evaluationId": { "id": "evaluationId", "value": "Fri Dec 06 2024" },
    "conformanceTarget": { "id": "conformanceTarget", "value": "AAA" },
    "createdWith": { "id": "createdWith", "value": "0.6.0" }
  }
}
