Created
March 30, 2026 02:53
-
-
Save usirin/d728df05ff1af47465e6f3335d7cd2b2 to your computer and use it in GitHub Desktop.
a11y fix-agent: manifest + knowledge (2026-03-29)
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| { | |
| "fix_patterns": [ | |
| { | |
| "id": "contrast_fix_text_token_category_mismatch", | |
| "description": "Replace a background/surface semantic color token with a text color token where the property controls text rendering, causing near-zero contrast in light mode", | |
| "wcag_rules": [ | |
| "1.4.3" | |
| ], | |
| "platforms": [ | |
| "android" | |
| ], | |
| "verification": "Open affected screen in light mode, verify text is visible against its background. Confirm no regression in dark/ash/onyx themes.", | |
| "example_ticket": "1213600918158063", | |
| "example_pr": null | |
| }, | |
| { | |
| "id": "contrast_fix_opacity_removal", | |
| "description": "Remove explicit opacity values (0.5, 0.6, 0.8) that reduce contrast below WCAG thresholds, relying on semantic color tokens that already provide appropriate contrast", | |
| "wcag_rules": [ | |
| "1.4.11", | |
| "1.4.3" | |
| ], | |
| "platforms": [ | |
| "android", | |
| "ios" | |
| ], | |
| "verification": "Open affected screens in light mode, verify elements render at full opacity. Confirm no visual changes in dark/ash/onyx themes.", | |
| "example_ticket": "1213502972724145", | |
| "example_pr": "https://github.com/discord/discord/pull/271160" | |
| }, | |
| { | |
| "id": "contrast_fix_token_swap_brand_text", | |
| "description": "Bump text-brand token from brand.500 to brand.530 in light mode to meet 4.5:1 contrast ratio for normal text against light backgrounds", | |
| "wcag_rules": [ | |
| "1.4.3" | |
| ], | |
| "platforms": [ | |
| "android", | |
| "ios" | |
| ], | |
| "verification": "Open Edit Profile in light mode, verify blurple text is slightly darker. No visual changes in dark/ash/onyx themes or for mobile-visual-refresh experiment users.", | |
| "example_ticket": "1213195179780112", | |
| "example_pr": "https://github.com/discord/discord/pull/271196" | |
| }, | |
| { | |
| "id": "contrast_fix_background_token_swap", | |
| "description": "Replace semi-transparent background token (BACKGROUND_MOD_STRONG) with opaque dark overlay token (ICON_OVERLAY_DARK) to ensure icon-on-badge contrast meets 3:1 in light mode", | |
| "wcag_rules": [ | |
| "1.4.11" | |
| ], | |
| "platforms": [ | |
| "android", | |
| "ios", | |
| "web" | |
| ], | |
| "verification": "Find a guild with active voice users in light mode, verify voice badge on guild icon has dark background with visible white speaker icon.", | |
| "example_ticket": "1213485391151936", | |
| "example_pr": "https://github.com/discord/discord/pull/271201" | |
| }, | |
| { | |
| "id": "contrast_fix_icon_token_migration", | |
| "description": "Replace TAB_LABEL_TEXT tokens with 0.5 opacity on inactive tab bar icons with ICON_MUTED/ICON_STRONG tokens that provide proper contrast without opacity hacks", | |
| "wcag_rules": [ | |
| "1.4.11" | |
| ], | |
| "platforms": [ | |
| "android", | |
| "ios" | |
| ], | |
| "verification": "Verify inactive tab bar icons are visibly darker in light mode. No visual changes for mobile-visual-refresh experiment users.", | |
| "example_ticket": "1213502972724145", | |
| "example_pr": "https://github.com/discord/discord/pull/271160" | |
| }, | |
| { | |
| "id": "missing_label_accessibility_value_split", | |
| "description": "Set accessibilityLabel to the button's purpose and accessibilityValue to the current selection, instead of using only the selection value as the label. Add busy state to accessibilityState when loading.", | |
| "wcag_rules": [ | |
| "4.1.2" | |
| ], | |
| "platforms": [ | |
| "android", | |
| "ios" | |
| ], | |
| "verification": "Enable VoiceOver/TalkBack, navigate to buttons, verify each announces both its purpose and current selection value.", | |
| "example_ticket": "1213685087554936", | |
| "example_pr": "https://github.com/discord/discord/pull/271488" | |
| }, | |
| { | |
| "id": "missing_label_category_list_grouping", | |
| "description": "Add accessibilityLabel with descriptive category names to lists and buttons, add accessibilityRole='list' to FlatList/FlashList containers, split action text into accessibilityHint", | |
| "wcag_rules": [ | |
| "1.3.1" | |
| ], | |
| "platforms": [ | |
| "android" | |
| ], | |
| "verification": "Enable TalkBack, navigate through categories. Verify lists announce category name and role.", | |
| "example_ticket": "1213685087554948", | |
| "example_pr": "https://github.com/discord/discord/pull/270816" | |
| }, | |
| { | |
| "id": "missing_state_aria_current_selected", | |
| "description": "Add aria-current='page' to selected/active navigation items (channels, tabs). The selected prop is often already available but only used for visual styling, not ARIA attributes.", | |
| "wcag_rules": [ | |
| "4.1.2" | |
| ], | |
| "platforms": [ | |
| "desktop" | |
| ], | |
| "verification": "Enable VoiceOver, navigate to selected channel in sidebar, confirm screen reader announces 'current page' or selected state.", | |
| "example_ticket": "1213754454042974", | |
| "example_pr": "https://github.com/discord/discord/pull/270830" | |
| }, | |
| { | |
| "id": "missing_role_heading_markup", | |
| "description": "Mark visually prominent text as headings using accessibilityRole='header'. Replace raw Text components with Header components that bake in the role.", | |
| "wcag_rules": [ | |
| "1.3.1" | |
| ], | |
| "platforms": [ | |
| "android", | |
| "ios" | |
| ], | |
| "verification": "Enable TalkBack/VoiceOver, navigate to section headers, confirm they are announced as headings.", | |
| "example_ticket": "1213685087554945", | |
| "example_pr": "https://github.com/discord/discord/pull/270180" | |
| }, | |
| { | |
| "id": "missing_label_icon_button_role", | |
| "description": "Add accessibilityLabel and accessibilityRole='button' to interactive elements that only have a close icon or generic label. Label should describe the action (e.g. 'Remove member, Username').", | |
| "wcag_rules": [ | |
| "4.1.2", | |
| "2.4.3", | |
| "2.1.1" | |
| ], | |
| "platforms": [ | |
| "ios", | |
| "android" | |
| ], | |
| "verification": "Enable VoiceOver/TalkBack, navigate to the button, confirm it announces the correct label and 'button' role.", | |
| "example_ticket": "1213685087554954", | |
| "example_pr": "https://github.com/discord/discord/pull/270528" | |
| }, | |
| { | |
| "id": "missing_label_preview_decorative_content", | |
| "description": "Add accessibilityLabel on preview/decorative containers with collectible name and type so screen readers can describe what is visually shown.", | |
| "wcag_rules": [ | |
| "1.1.1", | |
| "2.4.3" | |
| ], | |
| "platforms": [ | |
| "android", | |
| "ios" | |
| ], | |
| "verification": "Enable TalkBack/VoiceOver, navigate to preview content, confirm it is in focus order and announces a meaningful description.", | |
| "example_ticket": "1213424853201504", | |
| "example_pr": "https://github.com/discord/discord/pull/269933" | |
| }, | |
| { | |
| "id": "missing_aria_label_web", | |
| "description": "Add aria-label to interactive web elements (icon buttons, cog buttons, counters) that lack accessible names for screen readers.", | |
| "wcag_rules": [ | |
| "4.1.2", | |
| "1.1.1", | |
| "1.3.1" | |
| ], | |
| "platforms": [ | |
| "web", | |
| "desktop" | |
| ], | |
| "verification": "Enable screen reader, focus the element, confirm descriptive label is announced instead of silence or generic text.", | |
| "example_ticket": "1212803717433936", | |
| "example_pr": "https://github.com/discord/discord/pull/258900" | |
| }, | |
| { | |
| "id": "focus_visibility_css", | |
| "description": "Add :focus-within CSS selector alongside :hover so keyboard-focused elements reveal the same interactive content (buttons, overlays) that hover reveals.", | |
| "wcag_rules": [ | |
| "2.4.7" | |
| ], | |
| "platforms": [ | |
| "web" | |
| ], | |
| "verification": "Tab to the card with keyboard, confirm child buttons become visible on focus just like on hover.", | |
| "example_ticket": "1212803717433940", | |
| "example_pr": "https://github.com/discord/discord/pull/260900" | |
| }, | |
| { | |
| "id": "heading_role_rn_prop_threading", | |
| "description": "Add accessibilityRole='header' to display name or title text by threading a new prop (displayNameAccessibilityRole or textAccessibilityRole) through component hierarchy.", | |
| "wcag_rules": [ | |
| "1.3.1" | |
| ], | |
| "platforms": [ | |
| "android", | |
| "ios" | |
| ], | |
| "verification": "Enable TalkBack/VoiceOver, swipe to the text element, confirm it is announced as a heading.", | |
| "example_ticket": "1213017468936095", | |
| "example_pr": "https://github.com/discord/discord/pull/260979" | |
| }, | |
| { | |
| "id": "heading_role_legacy_text_migration", | |
| "description": "Replace LegacyText with design system Text component and add accessibilityRole='header' via prop, often requiring component interface changes.", | |
| "wcag_rules": [ | |
| "1.3.1" | |
| ], | |
| "platforms": [ | |
| "android", | |
| "ios" | |
| ], | |
| "verification": "Enable screen reader, navigate to server settings title, confirm heading role is announced.", | |
| "example_ticket": "1212979116976582", | |
| "example_pr": "https://github.com/discord/discord/pull/261358" | |
| }, | |
| { | |
| "id": "contextual_clear_button_label", | |
| "description": "Replace generic 'Clear' accessibilityLabel on text field clear buttons with contextual label including field name via fieldLabel prop and intl string with parameter.", | |
| "wcag_rules": [ | |
| "2.4.6" | |
| ], | |
| "platforms": [ | |
| "android", | |
| "ios" | |
| ], | |
| "verification": "Enable screen reader, focus clear button on a text field, confirm announcement includes the field name.", | |
| "example_ticket": "1213195179780092", | |
| "example_pr": "https://github.com/discord/discord/pull/262941" | |
| }, | |
| { | |
| "id": "heading_role_native_platform_specific", | |
| "description": "Add heading accessibility traits to text using platform-specific APIs: ViewCompat.setAccessibilityHeading (Android Kotlin), accessibilityTraits=.header (iOS Swift).", | |
| "wcag_rules": [ | |
| "1.3.1" | |
| ], | |
| "platforms": [ | |
| "android", | |
| "ios" | |
| ], | |
| "verification": "Enable TalkBack/VoiceOver, navigate to a poll in chat, confirm question text is announced as a heading.", | |
| "example_ticket": "1213195179780094", | |
| "example_pr": "https://github.com/discord/discord/pull/263189" | |
| }, | |
| { | |
| "id": "locked_channel_label", | |
| "description": "Add 'Private Channel (locked)' to channel accessibility label by checking isRoleRequired() and appending a new intl string.", | |
| "wcag_rules": [ | |
| "1.1.1" | |
| ], | |
| "platforms": [ | |
| "android", | |
| "ios" | |
| ], | |
| "verification": "Enable screen reader, navigate to a role-locked channel, confirm 'Private Channel (locked)' is included.", | |
| "example_ticket": "1213195179780102", | |
| "example_pr": "https://github.com/discord/discord/pull/263865" | |
| }, | |
| { | |
| "id": "state_announcement_badge", | |
| "description": "Prepend existing intl string to accessibilityLabel when badge/indicator is visible, and hide the badge View from accessibility tree with importantForAccessibility='no-hide-descendants'.", | |
| "wcag_rules": [ | |
| "1.1.1" | |
| ], | |
| "platforms": [ | |
| "android", | |
| "ios" | |
| ], | |
| "verification": "Enable screen reader, navigate to icon with badge, confirm state is announced; dismiss events, confirm label reverts.", | |
| "example_ticket": "1213315847360279", | |
| "example_pr": "https://github.com/discord/discord/pull/263887" | |
| }, | |
| { | |
| "id": "unique_repeated_button_labels", | |
| "description": "Build unique accessibilityLabel for repeated buttons by appending contextual data (event name, date/time) from existing hooks/utils.", | |
| "wcag_rules": [ | |
| "1.3.1" | |
| ], | |
| "platforms": [ | |
| "android", | |
| "ios" | |
| ], | |
| "verification": "Enable screen reader, swipe through repeated items, confirm each announces distinct context.", | |
| "example_ticket": "1213315847360261", | |
| "example_pr": "https://github.com/discord/discord/pull/263971" | |
| }, | |
| { | |
| "id": "contextual_remove_button_label", | |
| "description": "Replace generic 'Remove Attachment' accessibilityLabel with parameterized intl string that includes the filename.", | |
| "wcag_rules": [ | |
| "2.4.6" | |
| ], | |
| "platforms": [ | |
| "android", | |
| "ios" | |
| ], | |
| "verification": "Enable screen reader, attach multiple files, focus each remove button, confirm each announces specific filename.", | |
| "example_ticket": "1213315847360267", | |
| "example_pr": "https://github.com/discord/discord/pull/263988" | |
| }, | |
| { | |
| "id": "add_accessibility_label_to_media", | |
| "description": "Add accessibilityLabel prop to media components (Video, Image) that lack descriptive text, using i18n strings with interpolated context.", | |
| "wcag_rules": [ | |
| "2.4.6" | |
| ], | |
| "platforms": [ | |
| "android", | |
| "ios" | |
| ], | |
| "verification": "Enable TalkBack/VoiceOver, navigate to media element, confirm descriptive label instead of 'unlabelled'.", | |
| "example_ticket": "1213315847360291", | |
| "example_pr": "https://github.com/discord/discord/pull/264216" | |
| }, | |
| { | |
| "id": "fix_missing_status_in_label", | |
| "description": "Replace direct settings reads with store-backed defaults so accessibility labels never produce empty strings for status values.", | |
| "wcag_rules": [ | |
| "1.3.1" | |
| ], | |
| "platforms": [ | |
| "android", | |
| "ios" | |
| ], | |
| "verification": "Enable TalkBack, navigate to profile header, confirm status label reads 'Online' instead of being blank.", | |
| "example_ticket": "1213195179780114", | |
| "example_pr": "https://github.com/discord/discord/pull/264256" | |
| }, | |
| { | |
| "id": "fix_i18n_key_mismatch_native", | |
| "description": "Correct native i18n key names in nativeModuleI18nKeys.json and Swift I18nMessage constants to match canonical en-US.messages.js keys.", | |
| "wcag_rules": [ | |
| "2.4.6" | |
| ], | |
| "platforms": [ | |
| "android", | |
| "ios" | |
| ], | |
| "verification": "Enable VoiceOver/TalkBack, navigate to voice message player, confirm duration is announced.", | |
| "example_ticket": "1213195179780098", | |
| "example_pr": "https://github.com/discord/discord/pull/264266" | |
| }, | |
| { | |
| "id": "add_selected_state_to_radio", | |
| "description": "Add accessibilityRole='radio' and accessibilityState={{selected}} to selectable list items that act as radio buttons but lack programmatic state.", | |
| "wcag_rules": [ | |
| "4.1.2" | |
| ], | |
| "platforms": [ | |
| "android", | |
| "ios" | |
| ], | |
| "verification": "Enable TalkBack/VoiceOver, navigate to selectable items, confirm 'selected' or 'not selected' is announced.", | |
| "example_ticket": "1213315847360276", | |
| "example_pr": "https://github.com/discord/discord/pull/264437" | |
| }, | |
| { | |
| "id": "add_label_to_collectible_item", | |
| "description": "Forward the item.label to the accessibilityLabel on collectible display components so screen readers announce the item name.", | |
| "wcag_rules": [ | |
| "1.1.1" | |
| ], | |
| "platforms": [ | |
| "android", | |
| "ios" | |
| ], | |
| "verification": "Enable TalkBack/VoiceOver, navigate to reward picker grid, confirm each item announces its name.", | |
| "example_ticket": "1213315847360282", | |
| "example_pr": "https://github.com/discord/discord/pull/264448" | |
| }, | |
| { | |
| "id": "expose_voice_user_focus_and_status", | |
| "description": "Break voice channel from single accessible group into individually focusable user items, each with accessibilityLabel and accessibilityHint for mute/deaf status.", | |
| "wcag_rules": [ | |
| "2.4.6", | |
| "2.4.3" | |
| ], | |
| "platforms": [ | |
| "android", | |
| "ios" | |
| ], | |
| "verification": "Enable TalkBack/VoiceOver, swipe through voice channel members, confirm each user is individually focusable.", | |
| "example_ticket": "1213315847360273", | |
| "example_pr": "https://github.com/discord/discord/pull/265089" | |
| }, | |
| { | |
| "id": "fix_disabled_state_and_locked_hint", | |
| "description": "Correct accessibilityState.disabled to only apply to truly locked items, and add accessibilityHint explaining why an item is locked.", | |
| "wcag_rules": [ | |
| "2.4.6", | |
| "4.1.2" | |
| ], | |
| "platforms": [ | |
| "android", | |
| "ios" | |
| ], | |
| "verification": "Enable TalkBack/VoiceOver, navigate to theme picker, confirm standard theme is not announced as disabled.", | |
| "example_ticket": "1213221560521726", | |
| "example_pr": "https://github.com/discord/discord/pull/265731" | |
| }, | |
| { | |
| "id": "add_a11y_custom_action_for_long_press", | |
| "description": "Add a named accessibility custom action that triggers the same handler as long-press, making long-press-only functionality available to screen reader users.", | |
| "wcag_rules": [ | |
| "2.1.1" | |
| ], | |
| "platforms": [ | |
| "android", | |
| "ios" | |
| ], | |
| "verification": "Enable TalkBack/VoiceOver, focus a message, open custom actions menu, confirm action is listed.", | |
| "example_ticket": "1213315847360270", | |
| "example_pr": "https://github.com/discord/discord/pull/266240" | |
| }, | |
| { | |
| "id": "add_label_to_guild_icon", | |
| "description": "Add accessibilityRole='image' and accessibilityLabel with guild name to guild icon components (both image-based and acronym fallback).", | |
| "wcag_rules": [ | |
| "2.4.6" | |
| ], | |
| "platforms": [ | |
| "android" | |
| ], | |
| "verification": "Enable TalkBack, navigate to server invite guild icons, confirm each announces the server name.", | |
| "example_ticket": "1213366283228716", | |
| "example_pr": "https://github.com/discord/discord/pull/266398" | |
| }, | |
| { | |
| "id": "group_icon_and_label_for_focus", | |
| "description": "Wrap icon and adjacent text label in a single accessible View with combined accessibilityLabel so the icon is not skipped in focus order.", | |
| "wcag_rules": [ | |
| "1.1.1", | |
| "2.4.3" | |
| ], | |
| "platforms": [ | |
| "android", | |
| "ios" | |
| ], | |
| "verification": "Enable TalkBack/VoiceOver, navigate to channel invite entries, confirm icon and name are announced together.", | |
| "example_ticket": "1213366283228721", | |
| "example_pr": "https://github.com/discord/discord/pull/266410" | |
| }, | |
| { | |
| "id": "add_content_description_native_android", | |
| "description": "Set contentDescription on native Android ImageView using Kotlin i18nFormat with username, for independently tappable elements.", | |
| "wcag_rules": [ | |
| "4.1.2" | |
| ], | |
| "platforms": [ | |
| "android" | |
| ], | |
| "verification": "Enable TalkBack, navigate to avatar, confirm it announces '{username} avatar'.", | |
| "example_ticket": "1213485391151912", | |
| "example_pr": "https://github.com/discord/discord/pull/266841" | |
| }, | |
| { | |
| "id": "remove_max_line_height_for_text_resize", | |
| "description": "Remove maximumLineHeight constraint from NSParagraphStyle so text can grow with iOS Larger Text settings without overlapping.", | |
| "wcag_rules": [ | |
| "1.4.10" | |
| ], | |
| "platforms": [ | |
| "ios" | |
| ], | |
| "verification": "Set iOS Larger Text to maximum, navigate to interaction headers, confirm text lines do not overlap.", | |
| "example_ticket": "1213432608777899", | |
| "example_pr": "https://github.com/discord/discord/pull/266844" | |
| }, | |
| { | |
| "id": "disable_font_scaling_in_fixed_container", | |
| "description": "Set allowFontScaling to false for emoji text inside fixed-size containers to prevent clipping at large text sizes.", | |
| "wcag_rules": [ | |
| "1.4.10" | |
| ], | |
| "platforms": [ | |
| "ios" | |
| ], | |
| "verification": "Set iOS Larger Text to maximum, view poll with emoji, confirm emoji is not clipped.", | |
| "example_ticket": "1213432608777902", | |
| "example_pr": "https://github.com/discord/discord/pull/266852" | |
| }, | |
| { | |
| "id": "missing_label_native_button", | |
| "description": "Add accessibilityLabel/contentDescription to native platform buttons (Kotlin/Swift) that only had visual icon indicators, using i18n string keys.", | |
| "wcag_rules": [ | |
| "4.1.2" | |
| ], | |
| "platforms": [ | |
| "android", | |
| "ios" | |
| ], | |
| "verification": "Enable TalkBack/VoiceOver, focus the button, confirm screen reader announces the label text.", | |
| "example_ticket": "1213315847360252", | |
| "example_pr": "https://github.com/discord/discord/pull/266873" | |
| }, | |
| { | |
| "id": "text_resize_max_font_multiplier", | |
| "description": "Prevent text truncation at large font sizes by reducing maxFontSizeMultiplier on buttons in constrained layouts.", | |
| "wcag_rules": [ | |
| "1.4.4" | |
| ], | |
| "platforms": [ | |
| "android", | |
| "ios" | |
| ], | |
| "verification": "Enable largest text size, navigate to activity drawer buttons, confirm text is not truncated.", | |
| "example_ticket": "1213432608777896", | |
| "example_pr": "https://github.com/discord/discord/pull/266902" | |
| }, | |
| { | |
| "id": "grouping_nested_button_android", | |
| "description": "Group nested button with parent embed for TalkBack by hiding button from a11y tree and adding replaceAccessibilityAction on container.", | |
| "wcag_rules": [ | |
| "1.3.1" | |
| ], | |
| "platforms": [ | |
| "android" | |
| ], | |
| "verification": "Enable TalkBack, focus invite embed, confirm grouped announcement and double-tap activates.", | |
| "example_ticket": "1213315847360255", | |
| "example_pr": "https://github.com/discord/discord/pull/266943" | |
| }, | |
| { | |
| "id": "descriptive_label_voice_channel_members", | |
| "description": "Replace generic user count with member names (up to 3) plus overflow text in voice channel accessibility labels.", | |
| "wcag_rules": [ | |
| "2.4.6" | |
| ], | |
| "platforms": [ | |
| "android", | |
| "ios", | |
| "web" | |
| ], | |
| "verification": "Enable screen reader, focus voice channel, confirm individual member names are read.", | |
| "example_ticket": "1213485391151933", | |
| "example_pr": "https://github.com/discord/discord/pull/267086" | |
| }, | |
| { | |
| "id": "descriptive_label_online_status", | |
| "description": "Append humanized online status to username accessibilityLabel in UserRow via humanizeStatus utility.", | |
| "wcag_rules": [ | |
| "2.4.6" | |
| ], | |
| "platforms": [ | |
| "android", | |
| "ios" | |
| ], | |
| "verification": "Enable screen reader, navigate to member list, confirm each user's status is announced.", | |
| "example_ticket": "1213366283228739", | |
| "example_pr": "https://github.com/discord/discord/pull/267240" | |
| }, | |
| { | |
| "id": "heading_role_legacy_text_to_heading", | |
| "description": "Replace LegacyText or Text with Heading component from @app/design/native to add accessibilityRole='header' to titles.", | |
| "wcag_rules": [ | |
| "1.3.1" | |
| ], | |
| "platforms": [ | |
| "android", | |
| "ios" | |
| ], | |
| "verification": "Enable screen reader, navigate to screen, confirm title is announced as heading.", | |
| "example_ticket": "1213221560521722", | |
| "example_pr": "https://github.com/discord/discord/pull/267258" | |
| }, | |
| { | |
| "id": "heading_role_add_accessibility_role", | |
| "description": "Add accessibilityRole='header' to existing Text component that visually serves as a heading but lacks semantic markup.", | |
| "wcag_rules": [ | |
| "1.3.1" | |
| ], | |
| "platforms": [ | |
| "android", | |
| "ios" | |
| ], | |
| "verification": "Enable screen reader, navigate to widget heading, confirm heading role announced.", | |
| "example_ticket": "1213221560521718", | |
| "example_pr": "https://github.com/discord/discord/pull/267265" | |
| }, | |
| { | |
| "id": "descriptive_label_channel_activities", | |
| "description": "Add activity count and names (both embedded and non-embedded) to channel accessibility labels. On native, read from EmbeddedActivitiesStore. On web/desktop, pass useNonEmbeddedActivities data to getChannelAriaDescribedBy.", | |
| "wcag_rules": [ | |
| "2.4.6" | |
| ], | |
| "platforms": [ | |
| "android", | |
| "ios", | |
| "web", | |
| "desktop" | |
| ], | |
| "verification": "Enable screen reader, navigate to channel with activities, confirm activity count is announced.", | |
| "example_ticket": "1213366283228708", | |
| "example_pr": "https://github.com/discord/discord/pull/267505" | |
| }, | |
| { | |
| "id": "grouping_guild_invite_button_android", | |
| "description": "Group guild invite Join button with parent container for TalkBack using ViewCompat.replaceAccessibilityAction in Kotlin.", | |
| "wcag_rules": [ | |
| "1.3.1" | |
| ], | |
| "platforms": [ | |
| "android" | |
| ], | |
| "verification": "Enable TalkBack, navigate to DM server invite, confirm Join is grouped with content.", | |
| "example_ticket": "1213315847360258", | |
| "example_pr": "https://github.com/discord/discord/pull/267923" | |
| }, | |
| { | |
| "id": "heading_role_text_to_heading_component", | |
| "description": "Replace Text with Heading component on community server onboarding title to add heading semantics.", | |
| "wcag_rules": [ | |
| "1.3.1" | |
| ], | |
| "platforms": [ | |
| "android", | |
| "ios" | |
| ], | |
| "verification": "Enable screen reader, open onboarding flow, confirm welcome title announced as heading.", | |
| "example_ticket": "1213485391151888", | |
| "example_pr": "https://github.com/discord/discord/pull/267954" | |
| }, | |
| { | |
| "id": "heading_role_member_verification_alert", | |
| "description": "Replace Text with Heading component in MemberVerificationAlert for community server confirmation title.", | |
| "wcag_rules": [ | |
| "1.3.1" | |
| ], | |
| "platforms": [ | |
| "android", | |
| "ios" | |
| ], | |
| "verification": "Enable screen reader, accept community invite with verification, confirm title announced as heading.", | |
| "example_ticket": "1213485391151891", | |
| "example_pr": "https://github.com/discord/discord/pull/268053" | |
| }, | |
| { | |
| "id": "heading_markup_web_settings_useTitle", | |
| "description": "Add useTitle hook to web settings categories so SettingCategoryHeader renders semantic Heading. For non-category section headers, replace Field with Heading component.", | |
| "wcag_rules": [ | |
| "1.3.1" | |
| ], | |
| "platforms": [ | |
| "web", | |
| "desktop" | |
| ], | |
| "verification": "Enable VoiceOver on macOS, navigate to affected settings pages, confirm section headings announced as headings.", | |
| "example_ticket": "1213664353495682", | |
| "example_pr": null | |
| }, | |
| { | |
| "id": "focus_order_segmented_control_preview", | |
| "description": "Fix screen reader focus order for tabbed preview content by using setAccessibilityFocus on tab change and conditionally rendering only active page when screen reader is enabled.", | |
| "wcag_rules": [ | |
| "2.4.3", | |
| "1.1.1" | |
| ], | |
| "platforms": [ | |
| "android", | |
| "ios" | |
| ], | |
| "verification": "Enable TalkBack/VoiceOver, switch tabs, confirm focus moves to active preview and announces its label.", | |
| "example_ticket": "1213424853201504", | |
| "example_pr": "https://github.com/discord/discord/pull/268121" | |
| }, | |
| { | |
| "id": "state_announcement_checkbox_onboarding", | |
| "description": "Add accessibilityRole='checkbox' and accessibilityState with selected to onboarding option buttons, hide decorative badge from accessibility tree.", | |
| "wcag_rules": [ | |
| "2.1.1", | |
| "4.1.2" | |
| ], | |
| "platforms": [ | |
| "android", | |
| "ios" | |
| ], | |
| "verification": "Enable screen reader, join server with onboarding, confirm each option announces as checkbox with checked state.", | |
| "example_ticket": "1213485391151925", | |
| "example_pr": "https://github.com/discord/discord/pull/268211" | |
| }, | |
| { | |
| "id": "descriptive_label_animation", | |
| "description": "Add accessibilityLabel and accessibilityRole to decorative animation components that lack alt text, using localized i18n strings.", | |
| "wcag_rules": [ | |
| "1.1.1" | |
| ], | |
| "platforms": [ | |
| "android", | |
| "ios" | |
| ], | |
| "verification": "Enable TalkBack/VoiceOver, navigate to animation element, confirm descriptive label announced.", | |
| "example_ticket": "1213485391151906", | |
| "example_pr": "https://github.com/discord/discord/pull/268236" | |
| }, | |
| { | |
| "id": "focus_restore_after_picker", | |
| "description": "Use setAccessibilityFocus with a ref to restore screen reader focus to triggering element after closing a picker/action sheet.", | |
| "wcag_rules": [ | |
| "2.4.3" | |
| ], | |
| "platforms": [ | |
| "android", | |
| "ios" | |
| ], | |
| "verification": "Enable screen reader, open picker, select or dismiss, confirm focus returns to trigger button.", | |
| "example_ticket": "1213366283228708", | |
| "example_pr": "https://github.com/discord/discord/pull/268568" | |
| }, | |
| { | |
| "id": "activity_status_hint", | |
| "description": "Add accessibilityHint strings describing guild activity state (voice, video, stage, event) to guild bar items.", | |
| "wcag_rules": [ | |
| "1.1.1", | |
| "4.1.2" | |
| ], | |
| "platforms": [ | |
| "android", | |
| "ios", | |
| "web", | |
| "desktop" | |
| ], | |
| "verification": "Enable TalkBack, swipe to server with active voice/stage, confirm hint announces activity type.", | |
| "example_ticket": "1213485391151917", | |
| "example_pr": "https://github.com/discord/discord/pull/268929" | |
| }, | |
| { | |
| "id": "focus_order_absolute_header", | |
| "description": "Fix focus order when absolutely-positioned header renders after content in DOM. On native, replace absolute positioning with document flow. On web, reorder DOM elements while keeping absolute positioning (CSS layout is independent of DOM order).", | |
| "wcag_rules": [ | |
| "2.4.3", | |
| "1.3.2" | |
| ], | |
| "platforms": [ | |
| "android", | |
| "ios", | |
| "web", | |
| "desktop" | |
| ], | |
| "verification": "Enable screen reader, open surface, confirm header buttons are reachable before scrollable content.", | |
| "example_ticket": "1213424853201509", | |
| "example_pr": "https://github.com/discord/discord/pull/269050" | |
| }, | |
| { | |
| "id": "text_resize_truncation", | |
| "description": "Remove fixed width constraints and allow button/label containers to grow so text is not truncated at larger font sizes.", | |
| "wcag_rules": [ | |
| "1.4.4" | |
| ], | |
| "platforms": [ | |
| "android", | |
| "ios" | |
| ], | |
| "verification": "Set text size to largest, navigate to element, confirm full label text visible.", | |
| "example_ticket": "1213502972724154", | |
| "example_pr": "https://github.com/discord/discord/pull/269384" | |
| }, | |
| { | |
| "id": "text_resize_layout_overflow_clipping", | |
| "description": "Add flexShrink:1 to text containers and flexShrink:0 to icon/button siblings so scaled text wraps instead of pushing fixed-size elements out of overflow:hidden parents.", | |
| "wcag_rules": [ | |
| "1.4.4" | |
| ], | |
| "platforms": [ | |
| "android", | |
| "ios" | |
| ], | |
| "verification": "Set text size to 200%, navigate to element, confirm icon/button is fully visible and tappable. Verify no regression at default text size.", | |
| "example_ticket": "1213637683912083", | |
| "example_pr": null | |
| }, | |
| { | |
| "id": "preview_alt_text_and_tree_hiding", | |
| "description": "Add accessible={true}, accessibilityRole='image', and accessibilityLabel to preview components; hide redundant previews from a11y tree.", | |
| "wcag_rules": [ | |
| "1.1.1", | |
| "2.4.3" | |
| ], | |
| "platforms": [ | |
| "android", | |
| "ios" | |
| ], | |
| "verification": "Enable screen reader, navigate to shop cards, confirm preview reads descriptive label.", | |
| "example_ticket": "1213424853201504", | |
| "example_pr": "https://github.com/discord/discord/pull/269503" | |
| }, | |
| { | |
| "id": "edit_collectible_preview_label", | |
| "description": "Add accessibilityLabel with item name to edit profile preview containers including 'None applied' state.", | |
| "wcag_rules": [ | |
| "1.1.1" | |
| ], | |
| "platforms": [ | |
| "android", | |
| "ios" | |
| ], | |
| "verification": "Enable screen reader, open edit avatar decoration screen, confirm preview announces current selection.", | |
| "example_ticket": "1213366283228729", | |
| "example_pr": "https://github.com/discord/discord/pull/269818" | |
| }, | |
| { | |
| "id": "focus_reset_audio_playback", | |
| "description": "Guard native duration setter to avoid redundant state updates that reset VoiceOver focus during audio playback.", | |
| "wcag_rules": [ | |
| "2.4.3" | |
| ], | |
| "platforms": [ | |
| "ios" | |
| ], | |
| "verification": "Enable VoiceOver, play audio file in DMs, confirm focus stays on play/pause button.", | |
| "example_ticket": "1213502972724151", | |
| "example_pr": "https://github.com/discord/discord/pull/270342" | |
| }, | |
| { | |
| "id": "text_resize_wrap", | |
| "description": "Add flexWrap:'wrap' and gap to containers with horizontally-laid-out pills/buttons so content wraps instead of being clipped at large text.", | |
| "wcag_rules": [ | |
| "1.4.4" | |
| ], | |
| "platforms": [ | |
| "android", | |
| "ios" | |
| ], | |
| "verification": "Set text size to largest, open server info sheet, confirm pills wrap to next line.", | |
| "example_ticket": "1213432608777905", | |
| "example_pr": "https://github.com/discord/discord/pull/270606" | |
| }, | |
| { | |
| "id": "text_resize_remove_font_cap", | |
| "description": "Remove or increase maxFontSizeMultiplier={1} on Text components that cap font scaling below 200%, violating WCAG 1.4.4. Verify parent layout (ScrollView, flex) handles overflow.", | |
| "wcag_rules": [ | |
| "1.4.4" | |
| ], | |
| "platforms": [ | |
| "android", | |
| "ios" | |
| ], | |
| "verification": "Set device text size to 200%, navigate to affected screen, confirm text scales up. Check other screens using the same component for layout regressions.", | |
| "example_ticket": "1213600918158071", | |
| "example_pr": null | |
| }, | |
| { | |
| "id": "screen_reader_individual_items", | |
| "description": "Restructure rows so each item is individually focusable by wrapping content in PressableOpacity with accessible={true}.", | |
| "wcag_rules": [ | |
| "1.3.1", | |
| "2.4.3" | |
| ], | |
| "platforms": [ | |
| "android", | |
| "ios" | |
| ], | |
| "verification": "Enable screen reader, navigate to list, confirm each item is individually focusable.", | |
| "example_ticket": "1213485391151922", | |
| "example_pr": "https://github.com/discord/discord/pull/270612" | |
| }, | |
| { | |
| "id": "contextual_button_labels", | |
| "description": "Append parent context (event name) to accessibilityLabel of action buttons so screen reader users know which item a button relates to.", | |
| "wcag_rules": [ | |
| "1.3.1", | |
| "2.4.6" | |
| ], | |
| "platforms": [ | |
| "android", | |
| "ios" | |
| ], | |
| "verification": "Enable screen reader, navigate to event card buttons, confirm each announces action and event name.", | |
| "example_ticket": "1213485391151909", | |
| "example_pr": "https://github.com/discord/discord/pull/270617" | |
| }, | |
| { | |
| "id": "aria_disabled_state", | |
| "description": "Add aria-disabled={disabled} to interactive icon buttons so assistive technology announces dimmed/disabled state.", | |
| "wcag_rules": [ | |
| "4.1.2" | |
| ], | |
| "platforms": [ | |
| "desktop" | |
| ], | |
| "verification": "Open channel header with screen reader, navigate to disabled button, confirm it announces as disabled.", | |
| "example_ticket": "1213739371508562", | |
| "example_pr": "https://github.com/discord/discord/pull/270943" | |
| }, | |
| { | |
| "id": "tab_position_announcement", | |
| "description": "Add accessibilityHint with localized '{position} of {tabCount}' string to TabItem and SegmentedControlItem components.", | |
| "wcag_rules": [ | |
| "1.3.1" | |
| ], | |
| "platforms": [ | |
| "android", | |
| "ios" | |
| ], | |
| "verification": "Enable TalkBack, navigate to tab bar, confirm screen reader announces tab position.", | |
| "example_ticket": "1213366283228726", | |
| "example_pr": "https://github.com/discord/discord/pull/271082" | |
| }, | |
| { | |
| "id": "contextual_caret_aria_label_web", | |
| "description": "Add a caretAriaLabel prop to shared button components so caret/dropdown buttons receive context-specific aria-labels instead of a generic hardcoded label like 'More Options'.", | |
| "wcag_rules": [ | |
| "1.3.1" | |
| ], | |
| "platforms": [ | |
| "web", | |
| "desktop" | |
| ], | |
| "verification": "Enable NVDA or VoiceOver on desktop, join a voice channel, Tab to caret buttons and confirm each announces a distinct contextual label.", | |
| "example_ticket": "1213687482319441", | |
| "example_pr": null | |
| }, | |
| { | |
| "id": "add_progressbar_role_web", | |
| "description": "Add role=progressbar with aria-valuenow, aria-valuemin, aria-valuemax, and aria-label to visual progress/meter components that lack ARIA attributes on web.", | |
| "wcag_rules": [ | |
| "1.1.1" | |
| ], | |
| "platforms": [ | |
| "web" | |
| ], | |
| "verification": "Enable screen reader, navigate to the progress indicator, confirm value is announced and updates are communicated.", | |
| "example_ticket": "1213687482319445", | |
| "example_pr": null | |
| }, | |
| { | |
| "id": "aria_live_persistent_container", | |
| "description": "Keep aria-live region always in the DOM (render empty instead of returning null) so screen readers detect content changes rather than element insertion.", | |
| "wcag_rules": [ | |
| "4.1.3" | |
| ], | |
| "platforms": [ | |
| "web", | |
| "desktop" | |
| ], | |
| "verification": "Enable NVDA/VoiceOver, trigger the status message (e.g. typing indicator), confirm screen reader announces the status without focus change. Inspect DOM to confirm aria-live span persists when empty.", | |
| "example_ticket": "1213687482319449", | |
| "example_pr": null | |
| }, | |
| { | |
| "id": "missing_announcer_action_success", | |
| "description": "Add AccessibilityAnnouncer.announce() call on action success, matching the pattern used by sibling actions in the same file. For actions that show a visual status message but lack an a11y announcement.", | |
| "wcag_rules": [ | |
| "4.1.3" | |
| ], | |
| "platforms": [ | |
| "web", | |
| "desktop", | |
| "android", | |
| "ios" | |
| ], | |
| "verification": "Enable VoiceOver/NVDA/TalkBack, trigger the action, confirm screen reader announces the success message without requiring focus change.", | |
| "example_ticket": "1213689999853820", | |
| "example_pr": null | |
| }, | |
| { | |
| "id": "redundant_focusable_intl_anchor", | |
| "description": "Remove onClick from intl.format calls where the markdown link creates a redundant focusable Anchor next to a button that serves the same purpose, eliminating duplicate keyboard tab stops.", | |
| "wcag_rules": [ | |
| "2.1.1" | |
| ], | |
| "platforms": [ | |
| "web", | |
| "desktop" | |
| ], | |
| "verification": "Tab through the area with keyboard, confirm each interactive element receives focus exactly once.", | |
| "example_ticket": "1213719433710596", | |
| "example_pr": null | |
| }, | |
| { | |
| "id": "listbox_option_focus_tracking", | |
| "description": "Add JS-managed isFocused prop and styles.focused class to listbox Option components where FocusRing is disabled, mirroring VoidSearchableSelect pattern.", | |
| "wcag_rules": [ | |
| "2.4.7" | |
| ], | |
| "platforms": [ | |
| "web", | |
| "desktop" | |
| ], | |
| "verification": "Open dropdown with keyboard, use arrow keys to navigate options, confirm focused option has visible background highlight.", | |
| "example_ticket": "1213719437486601", | |
| "example_pr": null | |
| }, | |
| { | |
| "id": "css_reflow_grid_responsive", | |
| "description": "Replace fixed CSS grid minmax minimums with min(Npx, 100%) so cards reflow to single column at narrow viewports (200% zoom). Also check banner/content max-width containers for overflow.", | |
| "wcag_rules": [ | |
| "1.4.10" | |
| ], | |
| "platforms": [ | |
| "web", | |
| "desktop" | |
| ], | |
| "verification": "Set Discord zoom to 200%, open affected page, confirm no horizontal scrollbar and content reflows properly.", | |
| "example_ticket": "1213719433710600", | |
| "example_pr": null | |
| }, | |
| { | |
| "id": "focus_order_remove_autofocus_dialog", | |
| "description": "Remove autoFocus prop from buttons in informational dialogs so the FocusLock system places focus at the top of the dialog content instead of a specific button.", | |
| "wcag_rules": [ | |
| "2.4.3" | |
| ], | |
| "platforms": [ | |
| "desktop", | |
| "web" | |
| ], | |
| "verification": "Open the dialog with keyboard navigation, confirm focus starts at the heading or first content element, not a button at the bottom.", | |
| "example_ticket": "1213688763200081", | |
| "example_pr": null | |
| }, | |
| { | |
| "id": "aria_activedescendant_deferred_initial", | |
| "description": "Defer setting aria-activedescendant on combobox search inputs until user begins keyboard navigation into the associated grid, preventing screen readers from announcing the first grid item as active on open.", | |
| "wcag_rules": [ | |
| "2.4.3" | |
| ], | |
| "platforms": [ | |
| "desktop", | |
| "web" | |
| ], | |
| "verification": "Open picker with screen reader, confirm focus announces search field. Arrow into grid, confirm aria-activedescendant activates and grid nav works.", | |
| "example_ticket": "1213688763200123", | |
| "example_pr": null | |
| }, | |
| { | |
| "id": "tablist_focus_order_roving_tabindex", | |
| "description": "Add tabIndex={0} to tablist container div so NVDA focus mode (Tab key) can reach the roving tabindex tabs. Arrow key navigation already implemented via FocusManager.", | |
| "wcag_rules": [ | |
| "2.4.3" | |
| ], | |
| "platforms": [ | |
| "web", | |
| "desktop" | |
| ], | |
| "verification": "Enable NVDA on Windows, Tab through the page, confirm tablist receives focus. Use arrow keys to navigate between tabs. Confirm no double tab-stop.", | |
| "example_ticket": "1213719384773553", | |
| "example_pr": null | |
| }, | |
| { | |
| "id": "stepper_aria_current_step_web", | |
| "description": "Add aria-current=step to active wizard/stepper step, role=list on container, aria-label with step position (Step N of M), and override default button role on step items.", | |
| "wcag_rules": [ | |
| "4.1.2", | |
| "1.3.1" | |
| ], | |
| "platforms": [ | |
| "web", | |
| "desktop" | |
| ], | |
| "verification": "Enable NVDA, navigate to stepper, confirm active step announces aria-current=step and position info. Confirm steps are not announced as buttons.", | |
| "example_ticket": "1213719416539029", | |
| "example_pr": null | |
| }, | |
| { | |
| "id": "missing_aria_labelledby_field_context", | |
| "description": "Add aria-labelledby={control?.labelId} to web form components that use FieldContext but only wire up controlId, leaving the label association missing for non-native elements like div[role=button].", | |
| "wcag_rules": [ | |
| "4.1.2" | |
| ], | |
| "platforms": [ | |
| "web", | |
| "desktop" | |
| ], | |
| "verification": "Enable NVDA/VoiceOver, focus the form control, confirm the field label is announced before the control value.", | |
| "example_ticket": "1213719416539043", | |
| "example_pr": null | |
| }, | |
| { | |
| "id": "focus_return_modal_returnref", | |
| "description": "Capture document.activeElement before openModalLazy async call and pass as returnRef to the modal component, which forwards it to BaseModal/Dialog for focus restoration on close.", | |
| "wcag_rules": [ | |
| "2.4.3" | |
| ], | |
| "platforms": [ | |
| "web", | |
| "desktop" | |
| ], | |
| "verification": "Enable screen reader, trigger the modal, close it, verify focus returns to the original trigger element instead of resetting to top of content.", | |
| "example_ticket": "1213719416539025", | |
| "example_pr": null | |
| }, | |
| { | |
| "id": "aria_hidden_prop_threading_web", | |
| "description": "Thread aria-hidden through intermediate React component layers so hidden file inputs are removed from screen reader focus order. Add to interface, destructure in render, forward to child.", | |
| "wcag_rules": [ | |
| "2.4.3" | |
| ], | |
| "platforms": [ | |
| "web", | |
| "desktop" | |
| ], | |
| "verification": "Enable NVDA on Windows, Tab through the dialog, confirm hidden file input no longer receives focus. Confirm styled button still triggers file picker.", | |
| "example_ticket": "1213719416539047", | |
| "example_pr": null | |
| }, | |
| { | |
| "id": "missing_aria_required_form_components", | |
| "description": "Add aria-required attribute to focusable elements in form components (DateInput, Select, ComboBox) that receive required via FieldOptions but do not expose it to assistive tech. Follow TextInput.tsx reference pattern.", | |
| "wcag_rules": [ | |
| "3.3.2", | |
| "1.3.1" | |
| ], | |
| "platforms": [ | |
| "web", | |
| "desktop" | |
| ], | |
| "verification": "Enable NVDA on Windows, navigate to form with required fields, confirm each required input is announced as required by screen reader.", | |
| "example_ticket": "1213719416539051", | |
| "example_pr": null | |
| }, | |
| { | |
| "id": "forward_aria_popup_attrs_through_wrapper", | |
| "description": "Forward aria-expanded, aria-haspopup, aria-controls through wrapper component props interface to inner interactive element when ARIA popup attributes are silently dropped by intermediary components.", | |
| "wcag_rules": [ | |
| "4.1.2" | |
| ], | |
| "platforms": [ | |
| "web", | |
| "desktop" | |
| ], | |
| "verification": "Enable NVDA/VoiceOver on desktop, focus the select/menu trigger button, confirm expanded/collapsed state, listbox role, and current value are announced.", | |
| "example_ticket": "1213719416539099", | |
| "example_pr": null | |
| }, | |
| { | |
| "id": "aria_labelledby_poll_accessories", | |
| "description": "Add message.isPoll() to hasAccessories check in getMessageAriaLabelledBy so poll content is included in the message aria-labelledby attribute for screen readers.", | |
| "wcag_rules": [ | |
| "1.3.1" | |
| ], | |
| "platforms": [ | |
| "web", | |
| "desktop" | |
| ], | |
| "verification": "Enable NVDA on Windows, navigate to a poll message, confirm screen reader announces poll question and answers as part of the message description.", | |
| "example_ticket": "1213719416539103", | |
| "example_pr": null | |
| }, | |
| { | |
| "id": "tooltip_emoji_accessible_name", | |
| "description": "Ensure emoji images wrapped in Mana Tooltip have explicit alt text by passing alt prop from ActivityEmoji, and fix ref chain so Tooltip can properly track the DOM element for aria-describedby injection.", | |
| "wcag_rules": [ | |
| "2.5.3" | |
| ], | |
| "platforms": [ | |
| "web", | |
| "desktop" | |
| ], | |
| "verification": "Enable NVDA on Windows, navigate to custom status emoji in user overview panel, confirm emoji name is announced without unlabeled prefix.", | |
| "example_ticket": "1213688763200105", | |
| "example_pr": null | |
| }, | |
| { | |
| "id": "aria_label_include_visible_text", | |
| "description": "When an interactive element has visible text content (e.g. filename) but aria-label only describes the action (e.g. Download), the aria-label overrides the visible text for screen readers. Fix by including visible text in aria-label (e.g. Download {fileName}) or removing aria-label to let visible text serve as accessible name.", | |
| "wcag_rules": [ | |
| "2.5.3" | |
| ], | |
| "platforms": [ | |
| "web", | |
| "desktop" | |
| ], | |
| "verification": "Enable NVDA on Windows, navigate to the element, confirm screen reader announces the visible text content as part of the accessible name.", | |
| "example_ticket": "1213719416539095", | |
| "example_pr": null | |
| }, | |
| { | |
| "id": "missing_accessibility_announcer_on_copy", | |
| "description": "Add AccessibilityAnnouncer.announce() call with i18n Copied string when copy actions succeed, so screen readers announce the state change instead of only updating visual text.", | |
| "wcag_rules": [ | |
| "4.1.2" | |
| ], | |
| "platforms": [ | |
| "web", | |
| "desktop" | |
| ], | |
| "verification": "Enable NVDA on Windows, trigger copy action, confirm screen reader announces Copied status message.", | |
| "example_ticket": "1213719416539065", | |
| "example_pr": null | |
| }, | |
| { | |
| "id": "contextual_aria_label_web_buttons", | |
| "description": "Add optional ariaLabel prop to web ActionButton component (falling back to tooltip) and pass user-contextual aria-labels from caller components using existing i18n strings with name interpolation.", | |
| "wcag_rules": [ | |
| "2.4.6" | |
| ], | |
| "platforms": [ | |
| "web", | |
| "desktop" | |
| ], | |
| "verification": "Enable NVDA on Windows, navigate to Friends list buttons, confirm each announces with user context (e.g. Accept Friend Request from Username).", | |
| "example_ticket": "1213719384773559", | |
| "example_pr": null | |
| }, | |
| { | |
| "id": "missing_aria_expanded_collapsible_web", | |
| "description": "Add aria-expanded={isOpen} and aria-controls={contentId} to Clickable components that toggle collapsible sections. Generate contentId with React.useId() and apply to the expandable content container. Reference: UserProfileSidebarListSection.tsx.", | |
| "wcag_rules": [ | |
| "4.1.2", | |
| "2.4.3" | |
| ], | |
| "platforms": [ | |
| "web", | |
| "desktop" | |
| ], | |
| "verification": "Enable NVDA on Windows, tab to collapsible section header, confirm expanded/collapsed state is announced when toggling.", | |
| "example_ticket": "1213719416539003", | |
| "example_pr": null | |
| }, | |
| { | |
| "id": "combobox_aria_autocomplete_web", | |
| "description": "Add combobox ARIA attributes (role=combobox, aria-controls, aria-expanded, aria-activedescendant, aria-autocomplete=list) to TextInput that drives an autocomplete listbox but lacks screen reader association.", | |
| "wcag_rules": [ | |
| "3.2.2" | |
| ], | |
| "platforms": [ | |
| "web", | |
| "desktop" | |
| ], | |
| "verification": "Enable NVDA/VoiceOver, type in the search field, confirm screen reader announces results appearing and tracks focused result.", | |
| "example_ticket": "1213719416539007", | |
| "example_pr": null | |
| }, | |
| { | |
| "id": "search_results_live_region_web", | |
| "description": "Add role=status and aria-live=polite to search results containers so screen readers announce when results change or no results are found.", | |
| "wcag_rules": [ | |
| "3.2.2", | |
| "1.3.1" | |
| ], | |
| "platforms": [ | |
| "web", | |
| "desktop" | |
| ], | |
| "verification": "Enable NVDA on Windows, type in search field, confirm screen reader announces result changes or no-results message.", | |
| "example_ticket": "1213719416538999", | |
| "example_pr": null | |
| }, | |
| { | |
| "id": "unique_repeated_button_labels_web", | |
| "description": "Build unique aria-label for repeated web buttons by appending contextual data (username) via i18n string parameters.", | |
| "wcag_rules": [ | |
| "2.4.3" | |
| ], | |
| "platforms": [ | |
| "web", | |
| "desktop" | |
| ], | |
| "verification": "Enable NVDA on Windows, tab through repeated buttons in a list, confirm each announces unique context (e.g. username).", | |
| "example_ticket": "1213719416539017", | |
| "example_pr": null | |
| }, | |
| { | |
| "id": "dynamic_aria_label_state_web", | |
| "description": "Replace static aria-label on interactive web controls with dynamic label that includes current component state (muted/unmuted, volume level, on/off) using conditional i18n strings.", | |
| "wcag_rules": [ | |
| "4.1.2" | |
| ], | |
| "platforms": [ | |
| "web", | |
| "desktop" | |
| ], | |
| "verification": "Enable NVDA on Windows, focus the control, confirm screen reader announces current state. Toggle state and confirm label updates.", | |
| "example_ticket": "1213719416539115", | |
| "example_pr": null | |
| }, | |
| { | |
| "id": "divider_role_separator_in_listbox", | |
| "description": "Override role=option on non-selectable listbox children (like dividers) with role=separator so screen readers report correct item counts.", | |
| "wcag_rules": [ | |
| "1.3.1" | |
| ], | |
| "platforms": [ | |
| "web", | |
| "desktop" | |
| ], | |
| "verification": "Enable NVDA on Windows, trigger autocomplete with mixed sections (e.g. @mention), confirm announced item count matches visible options excluding dividers.", | |
| "example_ticket": "1213719416539081", | |
| "example_pr": null | |
| }, | |
| { | |
| "id": "list_navigator_focus_integration", | |
| "description": "Add useListItem hook to non-message elements in the message list (dividers, separators) so they receive focus via the ListNavigator keyboard navigation system.", | |
| "wcag_rules": [ | |
| "2.4.3" | |
| ], | |
| "platforms": [ | |
| "web", | |
| "desktop" | |
| ], | |
| "verification": "Enable NVDA on Windows, navigate through messages with arrow keys, confirm date separators receive focus and announce the date.", | |
| "example_ticket": "1213719416539089", | |
| "example_pr": null | |
| }, | |
| { | |
| "id": "accessible_container_grouping", | |
| "description": "Add accessible={true} and accessibilityLabel to a parent View to group visually related elements (URL, buttons, status text) into a single screen reader focusable unit. Use accessibilityActions for child buttons that need to remain independently actionable.", | |
| "wcag_rules": [ | |
| "1.3.1" | |
| ], | |
| "platforms": [ | |
| "android", | |
| "ios" | |
| ], | |
| "verification": "Enable VoiceOver/TalkBack, navigate to the grouped element, confirm all children are announced as one unit with a descriptive label. Confirm actionable children are still triggerable via accessibility actions.", | |
| "example_ticket": "1213647751360314", | |
| "example_pr": null | |
| }, | |
| { | |
| "id": "add_expanded_state_native", | |
| "description": "Add accessibilityState={{expanded: isOpen}} to TouchableWithoutFeedback or Pressable components that toggle expandable content but lack programmatic expanded/collapsed state.", | |
| "wcag_rules": [ | |
| "4.1.2" | |
| ], | |
| "platforms": [ | |
| "android", | |
| "ios" | |
| ], | |
| "verification": "Enable TalkBack/VoiceOver, navigate to expandable button, confirm expanded/collapsed state is announced on toggle.", | |
| "example_ticket": "1213647751360310", | |
| "example_pr": null | |
| }, | |
| { | |
| "id": "missing_label_form_field_web", | |
| "description": "Add label prop (with optional hideLabel={true}) to web TextInput form fields that lack an accessible name. The label prop generates a proper <label> association for screen readers.", | |
| "wcag_rules": [ | |
| "4.1.2" | |
| ], | |
| "platforms": [ | |
| "web", | |
| "desktop" | |
| ], | |
| "verification": "Enable NVDA or VoiceOver, tab to the text field, confirm screen reader announces the field label instead of just placeholder text.", | |
| "example_ticket": "1213664353495752", | |
| "example_pr": null | |
| }, | |
| { | |
| "id": "missing_accessibilitylabel_design_system_textinput", | |
| "description": "Add accessibilityLabel to native design system TextInput components where the visual label prop is not programmatically connected to the input. The Input/BaseTextField component chain renders a visual label but does not wire accessibilityLabelledBy or accessibilityLabel to the underlying NativeTextInput.", | |
| "wcag_rules": [ | |
| "4.1.2" | |
| ], | |
| "platforms": [ | |
| "ios", | |
| "android" | |
| ], | |
| "verification": "Enable VoiceOver/TalkBack, navigate to the text field, confirm screen reader announces the field label before the current value.", | |
| "example_ticket": "1213249079695820", | |
| "example_pr": null | |
| }, | |
| { | |
| "id": "focus_order_img_tabindex_web", | |
| "description": "Add tabIndex={0}, role='img', and aria-label to non-interactive visual elements (QR codes, images) that should be in the keyboard focus order but are currently skipped by screen readers.", | |
| "wcag_rules": [ | |
| "2.4.3" | |
| ], | |
| "platforms": [ | |
| "web", | |
| "desktop" | |
| ], | |
| "verification": "Enable NVDA or VoiceOver, Tab through the page, confirm the element receives focus and is announced with its descriptive label and img role.", | |
| "example_ticket": "1213664353495712", | |
| "example_pr": null | |
| }, | |
| { | |
| "id": "aria_required_form_control", | |
| "description": "Add aria-required to interactive form control elements (select buttons, dropdowns) that are inside required Field wrappers but do not propagate the required state to the ARIA tree.", | |
| "wcag_rules": [ | |
| "4.1.2", | |
| "1.3.1" | |
| ], | |
| "platforms": [ | |
| "web", | |
| "desktop" | |
| ], | |
| "verification": "Enable NVDA or VoiceOver, tab to the form control, confirm screen reader announces required state.", | |
| "example_ticket": "1213664353495720", | |
| "example_pr": null | |
| }, | |
| { | |
| "id": "positive_tabindex_removal_web", | |
| "description": "Remove positive tabIndex values (1, 2, 3...) from wrapper divs that interfere with natural DOM focus order and cause screen readers to reset focus unexpectedly after selection.", | |
| "wcag_rules": [ | |
| "2.4.3" | |
| ], | |
| "platforms": [ | |
| "web", | |
| "desktop" | |
| ], | |
| "verification": "Enable NVDA, interact with dropdowns/selects, confirm focus stays on or near the element after selection instead of jumping to beginning of form.", | |
| "example_ticket": "1213664353495728", | |
| "example_pr": null | |
| }, | |
| { | |
| "id": "aria_hidden_decorative_svg_web", | |
| "description": "Add aria-hidden=true and focusable=false to decorative SVG elements inside composite widgets (radio buttons, checkboxes) where the parent already provides semantic ARIA role, preventing screen readers from announcing the SVG as a separate image element.", | |
| "wcag_rules": [ | |
| "2.4.3", | |
| "1.1.1" | |
| ], | |
| "platforms": [ | |
| "web", | |
| "desktop" | |
| ], | |
| "verification": "Enable VoiceOver/NVDA, navigate to the composite widget, confirm each element receives focus exactly once without the SVG indicator being announced separately.", | |
| "example_ticket": "1213664353495674", | |
| "example_pr": null | |
| }, | |
| { | |
| "id": "select_aria_label_include_value", | |
| "description": "Modify Select component aria-label to include both the field label and the currently selected option text, so screen readers announce the full context.", | |
| "wcag_rules": [ | |
| "2.4.6" | |
| ], | |
| "platforms": [ | |
| "web", | |
| "desktop" | |
| ], | |
| "verification": "Enable VoiceOver/NVDA, focus a Select dropdown, confirm screen reader announces both the label and the selected value.", | |
| "example_ticket": "1213645822428393", | |
| "example_pr": null | |
| }, | |
| { | |
| "id": "slider_keyboard_all_arrows", | |
| "description": "Modify Slider handleKeyDown to accept all four arrow keys regardless of orientation, so screen readers (VoiceOver, TalkBack) that use Up/Down arrows can operate horizontal sliders.", | |
| "wcag_rules": [ | |
| "2.1.1" | |
| ], | |
| "platforms": [ | |
| "web", | |
| "desktop" | |
| ], | |
| "verification": "Enable VoiceOver on macOS, focus a horizontal slider in Settings, use VO+Up/Down arrows to adjust value. Confirm Left/Right still work.", | |
| "example_ticket": "1213645822428377", | |
| "example_pr": null | |
| }, | |
| { | |
| "id": "platform_specific_a11y_hiding", | |
| "description": "Use Platform.OS to conditionally apply accessibility hiding props (accessibilityElementsHidden, accessible={false}) only on the platform with the bug, instead of hiding from all screen readers.", | |
| "wcag_rules": [ | |
| "2.4.3" | |
| ], | |
| "platforms": [ | |
| "ios", | |
| "android" | |
| ], | |
| "verification": "Enable VoiceOver on iOS, confirm previously hidden element is now focusable. Enable TalkBack on Android, confirm element remains hidden if the workaround was Android-specific.", | |
| "example_ticket": "1213607573712890", | |
| "example_pr": null | |
| }, | |
| { | |
| "id": "focus_order_flex_row_margin_auto", | |
| "description": "Remove redundant marginLeft: auto from flex row children when a sibling has flex: 1, as auto margins can disrupt VoiceOver spatial ordering on iOS. Also remove unnecessary View wrappers that add nesting depth.", | |
| "wcag_rules": [ | |
| "2.4.3" | |
| ], | |
| "platforms": [ | |
| "ios" | |
| ], | |
| "verification": "Enable VoiceOver on iOS, swipe through the flex row elements, confirm heading/label receives focus before the action button.", | |
| "example_ticket": "1213606624089053", | |
| "example_pr": null | |
| }, | |
| { | |
| "id": "skip_programmatic_focus_when_screen_reader", | |
| "description": "Guard programmatic .focus() calls with useIsScreenReaderEnabled so VoiceOver follows natural document focus order instead of being overridden by code that auto-focuses inputs after navigation transitions.", | |
| "wcag_rules": [ | |
| "2.4.3" | |
| ], | |
| "platforms": [ | |
| "ios" | |
| ], | |
| "verification": "Enable VoiceOver on iOS, navigate to the screen, confirm focus lands on the first element (header text) and stays until user manually advances. Disable VoiceOver and confirm text input still auto-focuses for sighted users.", | |
| "example_ticket": "1213607573712882", | |
| "example_pr": null | |
| }, | |
| { | |
| "id": "tab_role_replace_heading_web", | |
| "description": "Replace HeaderBar.Title (which renders h1 headings) with Clickable elements using role=tab, aria-selected, and a role=tablist container when the elements function as navigation tabs, not headings.", | |
| "wcag_rules": [ | |
| "2.4.6" | |
| ], | |
| "platforms": [ | |
| "web", | |
| "desktop" | |
| ], | |
| "verification": "Enable NVDA, navigate to tabs, confirm they announce as tabs not headings. Verify only one h1 on the page.", | |
| "example_ticket": "1213799926539562", | |
| "example_pr": null | |
| }, | |
| { | |
| "id": "voiceover_reading_order_height_equalization", | |
| "description": "Equalize element heights in a flexDirection row with alignItems center so VoiceOver announces elements in left-to-right order instead of by top Y position.", | |
| "wcag_rules": [ | |
| "1.3.2", | |
| "2.4.3" | |
| ], | |
| "platforms": [ | |
| "ios" | |
| ], | |
| "verification": "Enable VoiceOver on iOS, swipe through the row elements, confirm the visually leftmost element is announced first.", | |
| "example_ticket": "1213442441798033", | |
| "example_pr": null | |
| }, | |
| { | |
| "id": "focus_order_defer_center_calculation_web", | |
| "description": "Defer center-item focus calculation in scrollable containers until user explicitly navigates with keyboard, defaulting to index 0 on initial focus entry.", | |
| "wcag_rules": [ | |
| "2.4.3" | |
| ], | |
| "platforms": [ | |
| "web", | |
| "desktop" | |
| ], | |
| "verification": "Enable NVDA on Windows, Tab into carousel, confirm focus lands on first item. Use arrow keys to navigate, Tab away and back, confirm correct item is focused.", | |
| "example_ticket": "1213799926539570", | |
| "example_pr": null | |
| }, | |
| { | |
| "id": "nested_button_role_presentation", | |
| "description": "Add role=presentation to outer Clickable wrapper that contains a Mana Button, eliminating duplicate button role announcements by screen readers.", | |
| "wcag_rules": [ | |
| "2.4.6", | |
| "4.1.2" | |
| ], | |
| "platforms": [ | |
| "web", | |
| "desktop" | |
| ], | |
| "verification": "Enable screen reader (NVDA/VoiceOver), focus the button, confirm button role is announced only once. Verify keyboard and mouse click still work.", | |
| "example_ticket": "1213799926539572", | |
| "example_pr": null | |
| }, | |
| { | |
| "id": "missing_tab_role_web", | |
| "description": "Replace Clickable components (which default to role=button) with TabBar/TabBar.Item components for tab-like navigation, or add role=tab, aria-selected, and role=tablist wrapper.", | |
| "wcag_rules": [ | |
| "4.1.2", | |
| "1.3.1" | |
| ], | |
| "platforms": [ | |
| "web", | |
| "desktop" | |
| ], | |
| "verification": "Enable screen reader, navigate to tabs, confirm each announces as tab with selected state instead of button.", | |
| "example_ticket": "1213799926539580", | |
| "example_pr": null | |
| }, | |
| { | |
| "id": "heading_level_force_h1_web", | |
| "description": "Wrap page content with HeadingLevel forceLevel={1} so the main Heading component renders as h1 instead of defaulting to h2.", | |
| "wcag_rules": [ | |
| "2.4.6" | |
| ], | |
| "platforms": [ | |
| "web", | |
| "desktop" | |
| ], | |
| "verification": "Enable screen reader (NVDA/VoiceOver), navigate by headings (H key), confirm main page title is announced as h1. Verify subsequent headings render at h2 or deeper.", | |
| "example_ticket": "1213799926539576", | |
| "example_pr": null | |
| }, | |
| { | |
| "id": "aria_hidden_decorative_animation_web", | |
| "description": "Add aria-hidden=true to container divs wrapping purely decorative animations (Wumpus, trinkets, etc.) to hide them from the accessibility tree", | |
| "wcag_rules": [ | |
| "2.1.1" | |
| ], | |
| "platforms": [ | |
| "web", | |
| "desktop" | |
| ], | |
| "verification": "Enable NVDA on Windows, navigate to the page, confirm decorative animations are not announced. Check browser Accessibility panel to confirm elements are hidden.", | |
| "example_ticket": "1213799926539584", | |
| "example_pr": null | |
| }, | |
| { | |
| "id": "heading_level_hierarchy_web", | |
| "description": "Wrap category/section content with HeadingLevel to demote headings from h1 to h2 when a parent component (e.g. LayerModal) sets forceLevel={1}.", | |
| "wcag_rules": [ | |
| "2.4.6" | |
| ], | |
| "platforms": [ | |
| "web", | |
| "desktop" | |
| ], | |
| "verification": "Enable screen reader (NVDA/VoiceOver), navigate by headings (H key), confirm only one h1 exists and section headers render as h2.", | |
| "example_ticket": "1213799926554540", | |
| "example_pr": null | |
| }, | |
| { | |
| "id": "aria_hidden_decorative_text_web", | |
| "description": "Add aria-hidden=true to container divs that render icon type strings as visually-hidden text (via text-indent: -9999em) which screen readers still announce, causing duplicate name announcements when the icon is inside a labeled button", | |
| "wcag_rules": [ | |
| "4.1.2" | |
| ], | |
| "platforms": [ | |
| "web", | |
| "desktop" | |
| ], | |
| "verification": "Enable NVDA on Windows, navigate to the affected buttons, verify each name is announced only once", | |
| "example_ticket": "1213799926554548", | |
| "example_pr": null | |
| }, | |
| { | |
| "id": "aria_hidden_decorative_icon_text", | |
| "description": "Add aria-hidden=true to icon containers that render type strings as hidden text (via text-indent CSS trick) which screen readers still announce.", | |
| "wcag_rules": [ | |
| "4.1.2" | |
| ], | |
| "platforms": [ | |
| "web", | |
| "desktop" | |
| ], | |
| "verification": "Enable NVDA on Windows, navigate to the icon's parent button, confirm screen reader does not announce the icon type text (e.g. 'unknown', 'visa').", | |
| "example_ticket": "1213799926554544", | |
| "example_pr": null | |
| }, | |
| { | |
| "id": "add_duration_to_voice_channel_label", | |
| "description": "Add call duration to the voice channel aria-label by passing startTime to getChannelA11yLabel and formatting it with formatActiveA11yTimestamp.", | |
| "wcag_rules": [ | |
| "1.3.1" | |
| ], | |
| "platforms": [ | |
| "web", | |
| "desktop" | |
| ], | |
| "verification": "Enable NVDA on Windows, focus a voice channel with active call, confirm duration is announced alongside channel name and connected users.", | |
| "example_ticket": "1213799926554560", | |
| "example_pr": null | |
| }, | |
| { | |
| "id": "step_indicator_tablist_role_web", | |
| "description": "Override Clickable default role=button with role=tab and add role=tablist to container for step indicator components that control content panels.", | |
| "wcag_rules": [ | |
| "1.3.1" | |
| ], | |
| "platforms": [ | |
| "web", | |
| "desktop" | |
| ], | |
| "verification": "Enable NVDA on Windows, navigate to step indicators, confirm announced as tabs with position (e.g. tab, Location, 1 of 3, selected) instead of buttons.", | |
| "example_ticket": "1213799926554564", | |
| "example_pr": null | |
| }, | |
| { | |
| "id": "select_aria_label_includes_value_web", | |
| "description": "Include selected value text in the accessible name of Select button components where aria-label only contains the field label, overriding child content per ARIA spec.", | |
| "wcag_rules": [ | |
| "4.1.2" | |
| ], | |
| "platforms": [ | |
| "web", | |
| "desktop" | |
| ], | |
| "verification": "Enable NVDA on Windows (or VoiceOver on macOS), focus the Select dropdown, confirm screen reader announces both the label and the current selection value.", | |
| "example_ticket": "1213799926554572", | |
| "example_pr": null | |
| }, | |
| { | |
| "id": "character_count_accessible_association", | |
| "description": "Add HiddenVisually or aria-live announcement to CharacterCount component so screen readers announce remaining characters when approaching or reaching the limit", | |
| "wcag_rules": [ | |
| "1.3.1" | |
| ], | |
| "platforms": [ | |
| "web", | |
| "desktop" | |
| ], | |
| "verification": "Enable NVDA/VoiceOver, type past character limit in a TextArea with showCharacterCount. Confirm screen reader announces remaining count or at-limit state.", | |
| "example_ticket": "1213738805832117", | |
| "example_pr": null | |
| }, | |
| { | |
| "id": "focus_management_slide_ready_web", | |
| "description": "Add isSlideReady prop and useEffect+ref focus logic to slide components that lack focus management, matching the pattern used by sibling slides in the same Slides container.", | |
| "wcag_rules": [ | |
| "2.4.3" | |
| ], | |
| "platforms": [ | |
| "web", | |
| "desktop" | |
| ], | |
| "verification": "Enable NVDA on Windows, navigate through multi-step modal slides, confirm focus moves to the first content element on each slide transition.", | |
| "example_ticket": "1213799926554576", | |
| "example_pr": null | |
| }, | |
| { | |
| "id": "anchor_role_link_override", | |
| "description": "Add role=link to Anchor component when rendering via Clickable, overriding Clickable defaultProps.role=button so anchor elements are announced as links by screen readers.", | |
| "wcag_rules": [ | |
| "4.1.2" | |
| ], | |
| "platforms": [ | |
| "web", | |
| "desktop" | |
| ], | |
| "verification": "Enable NVDA, navigate to a link in a DM message, confirm it announces as link instead of button.", | |
| "example_ticket": "1213738805832101", | |
| "example_pr": null | |
| }, | |
| { | |
| "id": "aria_describedby_context_association_web", | |
| "description": "Add aria-describedby association between a text input and a contextual bar (reply bar, edit bar) so screen readers announce the additional context when the input is focused. Requires adding an ID to the context element and composing aria-describedby on the input.", | |
| "wcag_rules": [ | |
| "1.3.1" | |
| ], | |
| "platforms": [ | |
| "web", | |
| "desktop" | |
| ], | |
| "verification": "Enable NVDA on Windows + Chrome, focus the text input while context bar is visible, confirm screen reader announces the context. Dismiss the context, confirm it is no longer announced.", | |
| "example_ticket": "1213738805832085", | |
| "example_pr": null | |
| }, | |
| { | |
| "id": "missing_aria_label_voice_message_web", | |
| "description": "Replace generic Play/Pause aria-labels with media-type-specific labels (e.g. PLAY_VOICE_MESSAGE_A11Y_LABEL) on web media player components, and add aria-label with role=region to the container div to identify the media type.", | |
| "wcag_rules": [ | |
| "1.3.1" | |
| ], | |
| "platforms": [ | |
| "web", | |
| "desktop" | |
| ], | |
| "verification": "Enable NVDA on Windows with Chrome, navigate to a voice message in DM, confirm screen reader announces Voice Message region and Play/Pause voice message for the button.", | |
| "example_ticket": "1213738805832069", | |
| "example_pr": null | |
| }, | |
| { | |
| "id": "add_aria_pressed_toggle_web", | |
| "description": "Add aria-pressed={toggled} to web toggle buttons that visually swap variant/icon on toggle but lack programmatic pressed state for screen readers.", | |
| "wcag_rules": [ | |
| "4.1.2" | |
| ], | |
| "platforms": [ | |
| "web", | |
| "desktop" | |
| ], | |
| "verification": "Enable NVDA + Chrome, focus the toggle button, activate it, confirm screen reader announces pressed/not pressed state.", | |
| "example_ticket": "1213738805832053", | |
| "example_pr": null | |
| }, | |
| { | |
| "id": "hide_native_file_input_from_sr", | |
| "description": "Hide native file input from screen readers with aria-hidden and tabIndex=-1, use a separate accessible button to trigger the file upload programmatically. Prevents screen readers from announcing misleading native input state (e.g. No file chosen).", | |
| "wcag_rules": [ | |
| "2.4.6" | |
| ], | |
| "platforms": [ | |
| "web", | |
| "desktop" | |
| ], | |
| "verification": "Enable NVDA + Chrome, focus the image upload trigger, confirm screen reader does not announce No file chosen or native file input state.", | |
| "example_ticket": "1213738805832029", | |
| "example_pr": null | |
| }, | |
| { | |
| "id": "descriptive_alt_text_web_img_role", | |
| "description": "Expand minimal aria-label on role=img containers to describe the visual content (e.g. profile card with avatar, username, status bubble) instead of just naming the element type or placeholder text. Add a new i18n string with interpolated context.", | |
| "wcag_rules": [ | |
| "2.4.6" | |
| ], | |
| "platforms": [ | |
| "web", | |
| "desktop" | |
| ], | |
| "verification": "Enable VoiceOver on macOS, focus the image container, confirm screen reader describes visual contents not just a generic label.", | |
| "example_ticket": "1213637683912285", | |
| "example_pr": null | |
| }, | |
| { | |
| "id": "focus_order_modal_stacking_web", | |
| "description": "Add stackNextByDefault: true to parent modal options or stackingBehavior: stack to child openModalLazy calls, so child modals stack instead of replacing the parent. Without stacking, closing the child returns focus to the element before the parent modal, not the parent itself.", | |
| "wcag_rules": [ | |
| "2.4.3" | |
| ], | |
| "platforms": [ | |
| "web", | |
| "desktop" | |
| ], | |
| "verification": "Open the parent modal, trigger the child modal action, close the child modal, confirm keyboard focus returns to the parent modal (not the main page behind it). Test with NVDA + Chrome on Windows.", | |
| "example_ticket": "1213738805832021", | |
| "example_pr": null | |
| }, | |
| { | |
| "id": "phantom_element_aria_hidden_web", | |
| "description": "Add aria-hidden=true to empty placeholder DOM elements (span, div) that reserve layout space (e.g. CSS grid slots) but create blank focusable objects for screen readers.", | |
| "wcag_rules": [ | |
| "2.4.3" | |
| ], | |
| "platforms": [ | |
| "web", | |
| "desktop" | |
| ], | |
| "verification": "Enable NVDA + Chrome, tab through the area, confirm no blank/empty object receives focus. Verify layout is preserved (grid slot still reserved).", | |
| "example_ticket": "1213738805832005", | |
| "example_pr": null | |
| }, | |
| { | |
| "id": "stepper_disabled_steps_web", | |
| "description": "Add aria-disabled=true to unavailable/future wizard step buttons that are visually dimmed but lack programmatic disabled state for screen readers.", | |
| "wcag_rules": [ | |
| "1.3.1" | |
| ], | |
| "platforms": [ | |
| "web", | |
| "desktop" | |
| ], | |
| "verification": "Enable NVDA on Windows + Chrome, navigate to wizard stepper, confirm future steps announce as dimmed/unavailable. Complete current step validation, confirm next step becomes available.", | |
| "example_ticket": "1213738805831955", | |
| "example_pr": null | |
| }, | |
| { | |
| "id": "remove_unconditional_focus_steal_web", | |
| "description": "Remove unconditional programmatic .focus() calls that steal focus from interactive elements (checkboxes, buttons) that remain in the DOM after user action. Focus should only be moved when the triggering element is removed from DOM.", | |
| "wcag_rules": [ | |
| "2.4.3" | |
| ], | |
| "platforms": [ | |
| "web", | |
| "desktop" | |
| ], | |
| "verification": "Enable NVDA + Chrome, activate the interactive element, confirm focus stays on it. Verify focus still moves correctly when the element is removed (e.g. tag removal).", | |
| "example_ticket": "1213738805820882", | |
| "example_pr": null | |
| }, | |
| { | |
| "id": "aria_hidden_measurement_element_web", | |
| "description": "Add aria-hidden=true to measurement/reference elements that use visibility:hidden CSS for sizing calculations but are still exposed to the accessibility tree, causing screen readers to read duplicate or context-less content.", | |
| "wcag_rules": [ | |
| "1.3.1" | |
| ], | |
| "platforms": [ | |
| "web", | |
| "desktop" | |
| ], | |
| "verification": "Enable NVDA on Windows + Chrome, navigate through the area with screen reader, confirm the hidden measurement element is no longer read. Confirm the visible element still announces correctly.", | |
| "example_ticket": "1213719270559380", | |
| "example_pr": null | |
| }, | |
| { | |
| "id": "checkbox_role_web_listbox_to_group", | |
| "description": "Replace listbox/option ARIA pattern with group/checkbox when the visual presentation uses checkboxes instead of list items. Change role=option to role=checkbox, aria-selected to aria-checked, and parent innerRole=listbox to role=group.", | |
| "wcag_rules": [ | |
| "4.1.2" | |
| ], | |
| "platforms": [ | |
| "web", | |
| "desktop" | |
| ], | |
| "verification": "Enable NVDA + Chrome, navigate to the checkbox items, confirm screen reader announces checkbox role with checked/unchecked state instead of option/selected.", | |
| "example_ticket": "1213738805820874", | |
| "example_pr": null | |
| }, | |
| { | |
| "id": "focus_return_modal_returnref_web", | |
| "description": "Thread returnRef from openModalLazy render callback through modal component to Mana Modal so focus returns to triggering element on close.", | |
| "wcag_rules": [ | |
| "2.4.3" | |
| ], | |
| "platforms": [ | |
| "web", | |
| "desktop" | |
| ], | |
| "verification": "Open modal from trigger button, close modal, confirm focus returns to trigger button instead of jumping to beginning of parent modal.", | |
| "example_ticket": "1213719270559372", | |
| "example_pr": null | |
| }, | |
| { | |
| "id": "inert_selective_preview_web", | |
| "description": "Replace blanket inert attribute with selective inerting so informational content (username, status) remains in the a11y tree while interactive elements stay inert", | |
| "wcag_rules": [ | |
| "1.3.1" | |
| ], | |
| "platforms": [ | |
| "web", | |
| "desktop" | |
| ], | |
| "verification": "Enable screen reader (NVDA/VoiceOver). Navigate to preview section. Confirm informational text is announced. Confirm interactive elements remain non-interactive.", | |
| "example_ticket": "1213719270559348", | |
| "example_pr": null | |
| }, | |
| { | |
| "id": "aria_table_roles_web", | |
| "description": "Add ARIA table roles (role=table, role=row, role=columnheader, role=cell) to div-based visual tables so screen readers can use table navigation commands.", | |
| "wcag_rules": [ | |
| "1.3.1" | |
| ], | |
| "platforms": [ | |
| "web", | |
| "desktop" | |
| ], | |
| "verification": "Enable NVDA on Windows with Chrome, navigate to the table, use Ctrl+Alt+Arrow keys to navigate between cells. Verify column headers are announced.", | |
| "example_ticket": "1213719270559322", | |
| "example_pr": null | |
| }, | |
| { | |
| "id": "web_focusblock_preview_aria_hidden", | |
| "description": "Add aria-hidden=true to FocusBlock wrapper div or add aria-labelledby on section elements inside FocusBlock so screen readers either skip decorative preview content or announce it with a meaningful label.", | |
| "wcag_rules": [ | |
| "1.1.1" | |
| ], | |
| "platforms": [ | |
| "web", | |
| "desktop" | |
| ], | |
| "verification": "Enable NVDA + Chrome on Windows, navigate through settings pages with virtual cursor, confirm preview areas are either skipped (aria-hidden) or announced with a meaningful label.", | |
| "example_ticket": "1213719270559288", | |
| "example_pr": null | |
| }, | |
| { | |
| "id": "focus_management_after_scroll", | |
| "description": "Add programmatic focus management after scroll-to-target navigation so screen readers follow the visual scroll, plus add tabindex=-1 to scroll anchor elements and aria-expanded to expandable sidebar items.", | |
| "wcag_rules": [ | |
| "2.4.3" | |
| ], | |
| "platforms": [ | |
| "web", | |
| "desktop" | |
| ], | |
| "verification": "Enable NVDA + Chrome on Windows, activate a subsection in settings sidebar, confirm focus moves to the target content area and expandable items announce expanded/collapsed state.", | |
| "example_ticket": "1213719258728704", | |
| "example_pr": null | |
| }, | |
| { | |
| "id": "voice_user_mute_status_in_aria_label", | |
| "description": "Include mute/deaf status in the aria-label of voice user elements using existing localized i18n keys (VOICE_PANEL_USER_A11Y_MUTED_LABEL, VOICE_PANEL_USER_A11Y_DEAFENED_LABEL).", | |
| "wcag_rules": [ | |
| "1.3.1" | |
| ], | |
| "platforms": [ | |
| "web", | |
| "desktop" | |
| ], | |
| "verification": "Enable VoiceOver on macOS, join a voice call, mute a user, focus the user element, and confirm mute/deaf status is announced.", | |
| "example_ticket": "1213689999853800", | |
| "example_pr": null | |
| }, | |
| { | |
| "id": "field_control_labelid_fallback_web", | |
| "description": "Add ?? control.labelId fallback to aria-labelledby in Field-wrapped components where the prop only passes through the explicit ariaLabelledBy prop without falling back to the Field context label ID.", | |
| "wcag_rules": [ | |
| "1.3.1" | |
| ], | |
| "platforms": [ | |
| "web", | |
| "desktop" | |
| ], | |
| "verification": "Enable screen reader, focus the component, confirm it announces the associated label text. Check that explicitly-provided ariaLabelledBy still takes precedence.", | |
| "example_ticket": "1213689999853804", | |
| "example_pr": null | |
| }, | |
| { | |
| "id": "svg_foreignobject_alt_empty", | |
| "description": "Change img alt from a space character to empty string inside SVG foreignObject to prevent VoiceOver from exposing the img as 'unlabeled' despite aria-hidden on parent SVG.", | |
| "wcag_rules": [ | |
| "1.1.1" | |
| ], | |
| "platforms": [ | |
| "web", | |
| "desktop" | |
| ], | |
| "verification": "Enable VoiceOver on macOS, navigate to the element, confirm the wrapper div aria-label is announced instead of 'unlabeled'. Verify Firefox pseudo-element fallback still works on image load failure.", | |
| "example_ticket": "1213689999853798", | |
| "example_pr": null | |
| }, | |
| { | |
| "id": "focus_trap_dynamic_content_aria_live", | |
| "description": "Add role=status and aria-live=polite to containers whose children are dynamically swapped (e.g. string to fragment with focusable elements), preventing VoiceOver focus traps on DOM replacement.", | |
| "wcag_rules": [ | |
| "2.1.2" | |
| ], | |
| "platforms": [ | |
| "web", | |
| "desktop" | |
| ], | |
| "verification": "Enable VoiceOver, trigger the dynamic content change, confirm focus is not trapped and new content is announced.", | |
| "example_ticket": "1213689999853806", | |
| "example_pr": null | |
| }, | |
| { | |
| "id": "autofocus_removal_focus_management", | |
| "description": "Remove or conditionally apply autoFocus on input elements that steal focus from heading/descriptive content when a panel or tab is activated, violating predictable focus behavior.", | |
| "wcag_rules": [ | |
| "3.2.2" | |
| ], | |
| "platforms": [ | |
| "web", | |
| "desktop" | |
| ], | |
| "verification": "Enable VoiceOver on macOS, activate the tab/panel, confirm focus lands at the top of the content area (heading) rather than jumping to the input field.", | |
| "example_ticket": "1213689999853816", | |
| "example_pr": null | |
| }, | |
| { | |
| "id": "focus_order_dom_reorder_css_visual", | |
| "description": "Reorder DOM elements so screen reader focus follows logical reading order (heading before content), then use CSS flex-direction: column-reverse or order property to preserve the original visual layout.", | |
| "wcag_rules": [ | |
| "2.4.3" | |
| ], | |
| "platforms": [ | |
| "web", | |
| "desktop" | |
| ], | |
| "verification": "Enable VoiceOver on macOS, navigate through the reordered section, confirm heading is announced before content. Visually confirm layout unchanged.", | |
| "example_ticket": "1213687488427172", | |
| "example_pr": null | |
| }, | |
| { | |
| "id": "add_aria_pressed_toggle_button", | |
| "description": "Add aria-pressed attribute to toggle buttons that use CSS classes for visual active state but lack programmatic state for screen readers.", | |
| "wcag_rules": [ | |
| "1.3.1" | |
| ], | |
| "platforms": [ | |
| "web", | |
| "desktop" | |
| ], | |
| "verification": "Enable VoiceOver on macOS, focus the toggle button, confirm pressed/active state is announced. Toggle off and confirm state change is announced.", | |
| "example_ticket": "1213687509382413", | |
| "example_pr": null | |
| }, | |
| { | |
| "id": "aria_live_error_announcement", | |
| "description": "Add role=alert to dynamically rendered error message containers so screen readers announce errors when they appear, not only when the field is focused", | |
| "wcag_rules": [ | |
| "3.3.1" | |
| ], | |
| "platforms": [ | |
| "web", | |
| "desktop" | |
| ], | |
| "verification": "Enable VoiceOver, trigger a form validation error, confirm the error is announced immediately without needing to focus the field", | |
| "example_ticket": "1213637683912273", | |
| "example_pr": null | |
| }, | |
| { | |
| "id": "keyboard_trap_escape_handler_popout", | |
| "description": "Add onKeyDown Escape handler to focus-locked popout/listbox containers so keyboard and screen reader users can dismiss without making a selection. The Escape handler should call the close/dismiss callback and optionally return focus to the trigger button.", | |
| "wcag_rules": [ | |
| "2.1.1" | |
| ], | |
| "platforms": [ | |
| "web", | |
| "desktop" | |
| ], | |
| "verification": "Enable VoiceOver/NVDA, open the dropdown, press Escape while focus is inside the listbox, confirm dropdown closes and focus returns to the trigger button.", | |
| "example_ticket": "1213637683912271", | |
| "example_pr": null | |
| }, | |
| { | |
| "id": "missing_aria_activedescendant_listbox", | |
| "description": "Add aria-activedescendant to listbox containers and standard HTML id attributes to option elements so screen readers announce the focused/selected item. Reference the searchable variant of the same component family for the correct pattern.", | |
| "wcag_rules": [ | |
| "1.3.1" | |
| ], | |
| "platforms": [ | |
| "web", | |
| "desktop" | |
| ], | |
| "verification": "Enable VoiceOver/NVDA, open the dropdown, arrow through options, confirm screen reader announces each focused option name and selected state.", | |
| "example_ticket": "1213637683912287", | |
| "example_pr": null | |
| }, | |
| { | |
| "id": "descriptive_tooltip_i18n_string", | |
| "description": "Replace terse keyboard shortcut tooltip text with descriptive i18n string that explains the action, target, and interaction method for screen readers.", | |
| "wcag_rules": [ | |
| "3.3.2" | |
| ], | |
| "platforms": [ | |
| "web", | |
| "desktop" | |
| ], | |
| "verification": "Enable VoiceOver on macOS, hover/focus element with tooltip, confirm screen reader announces descriptive instruction instead of ambiguous shortcut text.", | |
| "example_ticket": "1213637683912289", | |
| "example_pr": null | |
| }, | |
| { | |
| "id": "character_limit_live_announcement", | |
| "description": "Add AccessibilityAnnouncer.announce() call when user reaches maxLength character limit in a text input, since native HTML maxLength silently blocks input without screen reader feedback.", | |
| "wcag_rules": [ | |
| "1.3.1" | |
| ], | |
| "platforms": [ | |
| "web", | |
| "desktop" | |
| ], | |
| "verification": "Enable VoiceOver/NVDA, type into the field until reaching the character limit, confirm screen reader announces the limit has been reached. Verify announcement fires once, not on every keystroke at max.", | |
| "example_ticket": "1213637683912291", | |
| "example_pr": null | |
| }, | |
| { | |
| "id": "focus_return_popout_returnref", | |
| "description": "Pass buttonRef as returnRef to useFocusLock in SelectPopout so focus returns to the dropdown trigger when the popout closes, instead of being released to an unknown location.", | |
| "wcag_rules": [ | |
| "2.4.3" | |
| ], | |
| "platforms": [ | |
| "web", | |
| "desktop" | |
| ], | |
| "verification": "Enable VoiceOver/NVDA, open dropdown, select an option or press Escape, confirm focus returns to the dropdown trigger button.", | |
| "example_ticket": "1213637683912293", | |
| "example_pr": null | |
| }, | |
| { | |
| "id": "missing_label_accessible_time_format", | |
| "description": "Add accessibilityLabel with human-readable time format (e.g. 2 minutes 12 seconds) when visual display uses compact MM:SS format that screen readers read as raw numbers", | |
| "wcag_rules": [ | |
| "1.3.1" | |
| ], | |
| "platforms": [ | |
| "android", | |
| "ios" | |
| ], | |
| "verification": "Enable TalkBack/VoiceOver, focus the element displaying time, confirm screen reader announces minutes and seconds in words instead of raw numbers.", | |
| "example_ticket": "1213637800619838", | |
| "example_pr": null | |
| }, | |
| { | |
| "id": "progress_indicator_hidden_by_parent", | |
| "description": "Move progress indicator outside accessibilityElementsHidden parent wrapper and add accessibilityRole, accessibilityLabel, and accessibilityValue with min/max/now/text to expose progress to screen readers.", | |
| "wcag_rules": [ | |
| "1.3.1" | |
| ], | |
| "platforms": [ | |
| "android", | |
| "ios" | |
| ], | |
| "verification": "Enable TalkBack/VoiceOver, navigate to progress indicator, confirm screen reader announces progress percentage.", | |
| "example_ticket": "1213637800619840", | |
| "example_pr": null | |
| }, | |
| { | |
| "id": "hide_decorative_animation_native", | |
| "description": "Add accessible={false} and importantForAccessibility=no-hide-descendants to View wrappers around purely decorative animations to hide them from screen readers entirely.", | |
| "wcag_rules": [ | |
| "1.1.1" | |
| ], | |
| "platforms": [ | |
| "android", | |
| "ios" | |
| ], | |
| "verification": "Enable TalkBack/VoiceOver, navigate to the screen, confirm decorative animation is not focused or announced by the screen reader.", | |
| "example_ticket": "1213637800619846", | |
| "example_pr": null | |
| }, | |
| { | |
| "id": "focus_set_on_screen_mount", | |
| "description": "Add setAccessibilityFocus with a ref to the header element on screen mount when screen reader is enabled, using useIsScreenReaderEnabled hook and useEffect.", | |
| "wcag_rules": [ | |
| "2.4.3" | |
| ], | |
| "platforms": [ | |
| "android", | |
| "ios" | |
| ], | |
| "verification": "Enable TalkBack/VoiceOver, navigate to the screen, confirm focus lands on the header element at the top of the page.", | |
| "example_ticket": "1213637683912071", | |
| "example_pr": null | |
| }, | |
| { | |
| "id": "focus_initial_mount_header", | |
| "description": "Use setAccessibilityFocus with a ref and delay to move screen reader focus to the header/title element when a modal, bottom sheet, or drawer mounts.", | |
| "wcag_rules": [ | |
| "2.4.3" | |
| ], | |
| "platforms": [ | |
| "android", | |
| "ios" | |
| ], | |
| "verification": "Enable TalkBack/VoiceOver, open the modal/sheet, confirm focus lands on the header text at the top rather than the first interactive element.", | |
| "example_ticket": "1213637683912075", | |
| "example_pr": null | |
| }, | |
| { | |
| "id": "missing_progressbar_role_value", | |
| "description": "Add accessibilityRole=progressbar and accessibilityValue with min/max/now to progress indicator components that only render visual progress without screen reader semantics.", | |
| "wcag_rules": [ | |
| "1.3.1" | |
| ], | |
| "platforms": [ | |
| "android", | |
| "ios" | |
| ], | |
| "verification": "Enable TalkBack/VoiceOver, navigate to the progress indicator, confirm it announces as progressbar with current percentage.", | |
| "example_ticket": "1213637683912077", | |
| "example_pr": null | |
| }, | |
| { | |
| "id": "contrast_fix_raw_color_to_semantic_token", | |
| "description": "Replace hardcoded unsafe_rawColors or rgba values with theme-aware semantic color tokens (e.g. STATUS_POSITIVE) that provide darker variants in light mode for WCAG contrast compliance.", | |
| "wcag_rules": [ | |
| "1.4.11" | |
| ], | |
| "platforms": [ | |
| "android", | |
| "ios", | |
| "web" | |
| ], | |
| "verification": "Open affected screen in light mode, verify graphical element has sufficient contrast. Confirm no visual regression in dark/midnight/darker themes.", | |
| "example_ticket": "1213637683912089", | |
| "example_pr": null | |
| }, | |
| { | |
| "id": "custom_actions_hint_announcement", | |
| "description": "Add accessibilityHint informing screen reader users that custom accessibility actions are available via swipe gesture, when accessibilityActions prop is non-empty.", | |
| "wcag_rules": [ | |
| "3.3.2" | |
| ], | |
| "platforms": [ | |
| "android", | |
| "ios" | |
| ], | |
| "verification": "Enable TalkBack/VoiceOver, focus element with custom actions, verify hint announces available actions. Verify hint absent when no custom actions exist.", | |
| "example_ticket": "1213637683912147", | |
| "example_pr": null | |
| }, | |
| { | |
| "id": "checkbox_state_checked_not_selected", | |
| "description": "Replace accessibilityState={{selected}} with accessibilityState={{checked: selected}} on checkbox elements. The selected state is for list items/tabs; checked is the correct property for checkbox accessibility.", | |
| "wcag_rules": [ | |
| "1.3.1" | |
| ], | |
| "platforms": [ | |
| "android", | |
| "ios" | |
| ], | |
| "verification": "Enable TalkBack/VoiceOver, navigate to checkbox, confirm screen reader announces 'checked' or 'not checked' state.", | |
| "example_ticket": "1213604075240613", | |
| "example_pr": null | |
| }, | |
| { | |
| "id": "missing_label_form_input_native", | |
| "description": "Add accessibilityLabel to native FormInput components that rely on a visual label from parent FormSection but lack programmatic association. Reuse the same i18n key used for the FormSection title.", | |
| "wcag_rules": [ | |
| "3.3.2" | |
| ], | |
| "platforms": [ | |
| "android", | |
| "ios" | |
| ], | |
| "verification": "Enable TalkBack/VoiceOver, clear the input placeholder text, confirm screen reader still announces the field purpose.", | |
| "example_ticket": "1213604075240637", | |
| "example_pr": null | |
| }, | |
| { | |
| "id": "section_list_accessibility_label", | |
| "description": "Add accessibilityLabel to SectionList section wrapper Views so TalkBack reads only the section title instead of concatenating all descendant text as the region label.", | |
| "wcag_rules": [ | |
| "2.4.6" | |
| ], | |
| "platforms": [ | |
| "android" | |
| ], | |
| "verification": "Enable TalkBack, navigate to the SectionList region, confirm section title is announced instead of all child text.", | |
| "example_ticket": "1213607454838080", | |
| "example_pr": null | |
| }, | |
| { | |
| "id": "native_form_field_labelledby_association", | |
| "description": "Generate a labelId in TextInput wrapper, pass to Input for nativeID on the label, and pass accessibilityLabelledBy={[labelId]} to TextField to programmatically associate the visible label with the native input.", | |
| "wcag_rules": [ | |
| "3.3.2", | |
| "4.1.2" | |
| ], | |
| "platforms": [ | |
| "android", | |
| "ios" | |
| ], | |
| "verification": "Enable TalkBack/VoiceOver, clear a TextInput field, confirm screen reader still announces the field label.", | |
| "example_ticket": "1213607454838094", | |
| "example_pr": null | |
| }, | |
| { | |
| "id": "character_count_accessible_label_native", | |
| "description": "Add accessibilityLabel with CHARACTER_COUNT_A11Y_LABEL i18n string to native character count Text elements so screen readers announce remaining characters with context instead of just the number.", | |
| "wcag_rules": [ | |
| "1.3.1" | |
| ], | |
| "platforms": [ | |
| "android", | |
| "ios" | |
| ], | |
| "verification": "Enable TalkBack/VoiceOver, focus the character count indicator, confirm it announces 'Character count, N characters remaining' instead of just the number.", | |
| "example_ticket": "1213607454838096", | |
| "example_pr": null | |
| }, | |
| { | |
| "id": "slider_missing_accessibility_value", | |
| "description": "Add accessibilityLabel and accessibilityValue with text to Slider components that default to announcing percentage values instead of human-readable labels.", | |
| "wcag_rules": [ | |
| "1.3.1" | |
| ], | |
| "platforms": [ | |
| "android", | |
| "ios" | |
| ], | |
| "verification": "Enable TalkBack/VoiceOver, focus the slider, adjust it, confirm screen reader announces the human-readable value (e.g. 10 seconds) instead of percentage.", | |
| "example_ticket": "1213607454838102", | |
| "example_pr": null | |
| }, | |
| { | |
| "id": "context_menu_role_override", | |
| "description": "Add optional accessibilityRole prop to ContextMenuItemOptions so consumers can override the default button role for items that navigate externally (link) or have other semantics.", | |
| "wcag_rules": [ | |
| "4.1.2" | |
| ], | |
| "platforms": [ | |
| "ios", | |
| "android" | |
| ], | |
| "verification": "Enable VoiceOver/TalkBack, open context menu, focus external link item, confirm it announces link role instead of button.", | |
| "example_ticket": "1213535536926792", | |
| "example_pr": null | |
| }, | |
| { | |
| "id": "ios_checkbox_role_switch_workaround", | |
| "description": "Replace accessibilityRole='checkbox' with Platform.OS === 'ios' ? 'switch' : 'checkbox' because iOS VoiceOver does not announce the checkbox role properly.", | |
| "wcag_rules": [ | |
| "4.1.2" | |
| ], | |
| "platforms": [ | |
| "ios" | |
| ], | |
| "verification": "Enable VoiceOver on iOS, navigate to the checkbox element, confirm VoiceOver announces the control type (switch) and checked/unchecked state.", | |
| "example_ticket": "1213531317935995", | |
| "example_pr": null | |
| }, | |
| { | |
| "id": "contrast_fix_icon_element_color_prop", | |
| "description": "Pass explicit foreground color prop to icon React elements in IconButton, since BaseIconButton only applies variant color styles to ImageSourcePropType icons, not React element icons.", | |
| "wcag_rules": [ | |
| "1.4.11" | |
| ], | |
| "platforms": [ | |
| "android", | |
| "ios" | |
| ], | |
| "verification": "Open affected screen in light mode, verify icon color matches the button variant foreground (e.g. white on destructive red). Confirm no regression in dark/ash/onyx themes.", | |
| "example_ticket": "1213531338611848", | |
| "example_pr": null | |
| }, | |
| { | |
| "id": "contrast_fix_gradient_position_mismatch", | |
| "description": "Fix contrast by accounting for actual element position within a gradient, not the gradient midpoint. When a UI element sits at the top/bottom of a gradient, derive its foreground color from the gradient color at that position, or add a semi-transparent backdrop to guarantee contrast.", | |
| "wcag_rules": [ | |
| "1.4.11" | |
| ], | |
| "platforms": [ | |
| "ios", | |
| "android" | |
| ], | |
| "verification": "Open affected screen with multiple gradient configurations (dark gradients, light gradients). Verify the element has sufficient contrast (3:1 for non-text) at its actual position. Confirm no visual regression on other elements sharing the same color logic.", | |
| "example_ticket": "1213381324953226", | |
| "example_pr": null | |
| }, | |
| { | |
| "id": "role_color_accessibility_store_check", | |
| "description": "Check AccessibilityStore.roleStyle before applying role.colorString to text. When roleStyle is 'dot', show a RoleDot instead. When roleStyle is 'username', apply color to text. Otherwise use default text color.", | |
| "wcag_rules": [ | |
| "1.4.3" | |
| ], | |
| "platforms": [ | |
| "ios", | |
| "android" | |
| ], | |
| "verification": "Open affected screen in light mode with each roleStyle setting (default, username, dot). Verify role text uses appropriate styling per setting. Confirm no regression in dark/ash/onyx themes.", | |
| "example_ticket": "1213427855148549", | |
| "example_pr": null | |
| }, | |
| { | |
| "id": "menu_button_descriptive_label_hint", | |
| "description": "Replace generic accessibilityLabel (e.g. 'More') on menu-trigger IconButtons with a descriptive label following the *_ACTIONS_MENU_LABEL i18n convention, and add accessibilityHint indicating the button opens a menu.", | |
| "wcag_rules": [ | |
| "4.1.2" | |
| ], | |
| "platforms": [ | |
| "ios", | |
| "android" | |
| ], | |
| "verification": "Enable VoiceOver/TalkBack, navigate to the menu button, verify announcement includes descriptive label and hint about opening a menu.", | |
| "example_ticket": "1213559780817354", | |
| "example_pr": null | |
| }, | |
| { | |
| "id": "screen_reader_timer_guard", | |
| "description": "Guard auto-advance timers with useIsScreenReaderEnabled() to disable or extend timeouts when a screen reader is active, preventing WCAG 2.2.1 timing violations.", | |
| "wcag_rules": [ | |
| "2.2.1" | |
| ], | |
| "platforms": [ | |
| "ios", | |
| "android" | |
| ], | |
| "verification": "Enable VoiceOver/TalkBack, trigger the timed transition, verify it does not auto-advance. Disable screen reader and verify timer works as before.", | |
| "example_ticket": "1213345883088809", | |
| "example_pr": null | |
| }, | |
| { | |
| "id": "fix_checkbox_checked_state_native", | |
| "description": "Change accessibilityState={{selected}} to accessibilityState={{checked: selected}} on elements with accessibilityRole='checkbox'. The selected state is for tab-like controls; checked is for toggle controls like checkboxes.", | |
| "wcag_rules": [ | |
| "4.1.2" | |
| ], | |
| "platforms": [ | |
| "ios", | |
| "android" | |
| ], | |
| "verification": "Enable VoiceOver/TalkBack, navigate to the checkbox element, confirm screen reader announces checked/unchecked state when toggling.", | |
| "example_ticket": "1213345883088801", | |
| "example_pr": null | |
| }, | |
| { | |
| "id": "missing_label_emoji_context", | |
| "description": "Add explicit accessibilityLabel to containers whose auto-generated label includes raw emoji names without 'emoji' context, so screen readers announce e.g. 'eyes emoji' instead of just 'eyes'", | |
| "wcag_rules": [ | |
| "1.3.1" | |
| ], | |
| "platforms": [ | |
| "ios", | |
| "android" | |
| ], | |
| "verification": "Enable VoiceOver/TalkBack, navigate to the element containing an emoji. Confirm screen reader announces the emoji name followed by 'emoji' (e.g. 'eyes emoji, Take a look around').", | |
| "example_ticket": "1213345805403271", | |
| "example_pr": null | |
| }, | |
| { | |
| "id": "missing_label_icon_context_prefix", | |
| "description": "Add semantic context from a visual icon (e.g. location pin) into the accessibilityLabel so screen readers convey the same relationship the icon shows visually.", | |
| "wcag_rules": [ | |
| "1.3.1" | |
| ], | |
| "platforms": [ | |
| "ios", | |
| "android" | |
| ], | |
| "verification": "Enable VoiceOver/TalkBack, navigate to the element with the icon. Confirm screen reader announces the context prefix (e.g. Event Location) before the content text.", | |
| "example_ticket": "1213318074731521", | |
| "example_pr": null | |
| }, | |
| { | |
| "id": "missing_label_voice_state_inclusion", | |
| "description": "Add voice state (muted, deafened, streaming, video) to accessibilityLabel of user rows in voice channel UI, building a composite label from username plus active state i18n strings.", | |
| "wcag_rules": [ | |
| "4.1.2" | |
| ], | |
| "platforms": [ | |
| "ios", | |
| "android" | |
| ], | |
| "verification": "Enable VoiceOver/TalkBack, navigate to a muted/deafened user in the voice channel member list, confirm screen reader announces the voice state alongside the username.", | |
| "example_ticket": "1213320492159816", | |
| "example_pr": null | |
| }, | |
| { | |
| "id": "missing_a11y_label_mention_count", | |
| "description": "Add mentionCount variant to channel a11y labels that only have unread/no-unread variants, following the existing mentionCount > 0 check pattern used by GUILD_ANNOUNCEMENT channels in getChannelA11yLabel.tsx", | |
| "wcag_rules": [ | |
| "4.1.2" | |
| ], | |
| "platforms": [ | |
| "ios", | |
| "android" | |
| ], | |
| "verification": "Enable VoiceOver/TalkBack, navigate to a DM channel with unread messages, confirm the screen reader announces the number of unread messages.", | |
| "example_ticket": "1213318061933753", | |
| "example_pr": null | |
| }, | |
| { | |
| "id": "contextual_dismiss_button_label", | |
| "description": "Replace generic DISMISS intl key with a contextual label that describes what is being dismissed (e.g. voice channel preview drawer), so screen readers announce the full context.", | |
| "wcag_rules": [ | |
| "4.1.2" | |
| ], | |
| "platforms": [ | |
| "ios", | |
| "android" | |
| ], | |
| "verification": "Enable VoiceOver/TalkBack, navigate to the dismiss button, confirm it announces the contextual label instead of just Dismiss.", | |
| "example_ticket": "1213320477358686", | |
| "example_pr": null | |
| }, | |
| { | |
| "id": "hidden_element_conditional_aria_hidden", | |
| "description": "Conditionally pass aria-hidden={true} to interactive elements (drag handles, toggles) that should not receive screen reader focus in certain states (e.g., pre-join voice panel where the button action has no effect).", | |
| "wcag_rules": [ | |
| "2.4.3" | |
| ], | |
| "platforms": [ | |
| "ios", | |
| "android" | |
| ], | |
| "verification": "Enable VoiceOver/TalkBack, navigate to the screen in the state where the element should be hidden, confirm it does not receive focus. Switch to the active state and confirm the element IS focusable.", | |
| "example_ticket": "1213318061933745", | |
| "example_pr": null | |
| }, | |
| { | |
| "id": "accessible_true_on_labeled_view", | |
| "description": "Add accessible={true} to View components that have accessibilityLabel but are not focusable by VoiceOver because they lack the accessible prop. Common when labels were added for TalkBack but iOS was not tested.", | |
| "wcag_rules": [ | |
| "2.4.3" | |
| ], | |
| "platforms": [ | |
| "ios" | |
| ], | |
| "verification": "Enable VoiceOver on iOS, swipe to the element, confirm it receives focus and announces its accessibilityLabel.", | |
| "example_ticket": "1213214888908904", | |
| "example_pr": null | |
| }, | |
| { | |
| "id": "missing_label_tag_semantic_context", | |
| "description": "Add accessible={true} and accessibilityLabel that includes 'tag' context to pill-shaped tag components, so screen readers convey the semantic meaning beyond just the text content.", | |
| "wcag_rules": [ | |
| "1.3.1" | |
| ], | |
| "platforms": [ | |
| "android", | |
| "ios" | |
| ], | |
| "verification": "Enable VoiceOver/TalkBack, navigate to tags, verify each announces as 'tag, {tagName}' instead of just the text.", | |
| "example_ticket": "1213254672704652", | |
| "example_pr": null | |
| }, | |
| { | |
| "id": "announce_search_results_count", | |
| "description": "Add AccessibilityAnnouncer.announce() calls in useEffect hooks to announce search result counts when results change, and announce empty state on mount. Debounce to avoid excessive announcements during rapid typing.", | |
| "wcag_rules": [ | |
| "3.3.2" | |
| ], | |
| "platforms": [ | |
| "android", | |
| "ios" | |
| ], | |
| "verification": "Enable VoiceOver/TalkBack, type in search bar, confirm result count is announced as results filter. Clear search to trigger empty state and confirm announcement.", | |
| "example_ticket": "1213249365503491", | |
| "example_pr": null | |
| }, | |
| { | |
| "id": "missing_label_clear_button_context", | |
| "description": "Thread a clearButtonAccessibilityLabel prop through ClearableProps so contextual clear buttons (search, filter) can use descriptive i18n strings instead of the generic CLEAR label.", | |
| "wcag_rules": [ | |
| "4.1.2" | |
| ], | |
| "platforms": [ | |
| "android", | |
| "ios" | |
| ], | |
| "verification": "Enable VoiceOver/TalkBack, navigate to clear button in search field, confirm it announces 'Clear search, Button' instead of 'Clear, Button'. Verify non-search clear buttons still announce 'Clear'.", | |
| "example_ticket": "1213249365503473", | |
| "example_pr": null | |
| }, | |
| { | |
| "id": "navigator_focus_tracking", | |
| "description": "Add useAccessibilityNativeStackFocusTracking() hook to stack navigators missing focus restoration, and pass its {beforeRemove, transitionStart} listeners to Stack.Navigator screenListeners prop.", | |
| "wcag_rules": [ | |
| "2.4.3" | |
| ], | |
| "platforms": [ | |
| "ios", | |
| "android" | |
| ], | |
| "verification": "Enable VoiceOver/TalkBack, navigate forward to a new screen in the stack, confirm focus moves to top. Navigate back, confirm focus returns to previously focused element.", | |
| "example_ticket": "1213249079695812", | |
| "example_pr": null | |
| }, | |
| { | |
| "id": "focus_order_accessible_prop_parity", | |
| "description": "Add accessible={!disableAccessibility} to sibling Views that lack the prop when other siblings already have it, ensuring VoiceOver treats all cells at the same level for consistent left-to-right focus order.", | |
| "wcag_rules": [ | |
| "2.4.3" | |
| ], | |
| "platforms": [ | |
| "ios" | |
| ], | |
| "verification": "Enable VoiceOver on iOS, swipe through sibling elements in a row, confirm focus follows visual left-to-right order.", | |
| "example_ticket": "1213248245737816", | |
| "example_pr": null | |
| }, | |
| { | |
| "id": "tree_multiselectable_false_web", | |
| "description": "Add aria-multiselectable={false} to tree container elements so screen readers properly announce aria-selected state on tree items.", | |
| "wcag_rules": [ | |
| "4.1.2" | |
| ], | |
| "platforms": [ | |
| "web", | |
| "desktop" | |
| ], | |
| "verification": "Enable NVDA on Windows with Chrome, navigate to the tree, confirm selected state is announced on the active treeitem.", | |
| "example_ticket": "1213719270559396", | |
| "example_pr": null | |
| }, | |
| { | |
| "id": "intl_message_to_aria_label_web", | |
| "description": "Convert ReactIntlMessage tooltip/label props to plain strings for ARIA attributes using intl.formatToPlainString(), fixing typeof === string checks that silently fail after intl migration.", | |
| "wcag_rules": [ | |
| "4.1.2" | |
| ], | |
| "platforms": [ | |
| "web", | |
| "desktop" | |
| ], | |
| "verification": "Enable NVDA on Windows with Chrome, navigate to the affected elements, confirm names are announced by screen reader.", | |
| "example_ticket": "1213719270559412", | |
| "example_pr": null | |
| }, | |
| { | |
| "id": "heading_level_hierarchy_web", | |
| "description": "Add HeadingLevel wrappers from the design system to establish proper H1 > H2 > H3 heading hierarchy on web pages where all headings default to H2 due to missing context.", | |
| "wcag_rules": [ | |
| "1.3.1" | |
| ], | |
| "platforms": [ | |
| "web", | |
| "desktop" | |
| ], | |
| "verification": "Open page in Chrome, inspect heading elements to confirm correct h1/h2/h3 tags. Enable NVDA, navigate by headings (H key) to verify hierarchy is announced.", | |
| "example_ticket": "1213719270559428", | |
| "example_pr": null | |
| }, | |
| { | |
| "id": "conditional_interactive_wrapper_web", | |
| "description": "Replace unconditional Clickable wrapper with conditional rendering: use Clickable when the onClick handler would perform an action, plain div/span when it would be a no-op. Removes false button role and tabIndex from non-interactive elements.", | |
| "wcag_rules": [ | |
| "4.1.2" | |
| ], | |
| "platforms": [ | |
| "web", | |
| "desktop" | |
| ], | |
| "verification": "Enable NVDA/screen reader, tab to the element. When non-interactive, it should not be announced as a button. When interactive, it should still be announced as a button and activate on Enter/Space.", | |
| "example_ticket": "1213719270559476", | |
| "example_pr": null | |
| }, | |
| { | |
| "id": "focus_order_display_none_to_visually_hidden", | |
| "description": "Replace display: none on hover-reveal interactive elements with an accessible hiding method (visibility: hidden, clip-path) so keyboard users can tab to them when parent receives focus-within.", | |
| "wcag_rules": [ | |
| "2.4.3" | |
| ], | |
| "platforms": [ | |
| "web", | |
| "desktop" | |
| ], | |
| "verification": "Enable NVDA on Windows + Chrome, Tab through the area, confirm previously hidden buttons receive focus. Verify hover-reveal visual behavior unchanged for sighted users.", | |
| "example_ticket": "1213719270559484", | |
| "example_pr": null | |
| }, | |
| { | |
| "id": "unique_caret_aria_label_web", | |
| "description": "Add a caretAriaLabel prop to shared button components so each parent passes a unique aria-label for its dropdown caret, instead of all sharing a generic More Options label.", | |
| "wcag_rules": [ | |
| "2.4.6" | |
| ], | |
| "platforms": [ | |
| "web", | |
| "desktop" | |
| ], | |
| "verification": "Enable NVDA on Windows + Chrome, join voice channel call, Tab through call controls, confirm each dropdown caret announces a unique label (e.g. Microphone Options, Camera Options) instead of generic More Options.", | |
| "example_ticket": "1213719270559492", | |
| "example_pr": null | |
| }, | |
| { | |
| "id": "missing_announcer_creation_event", | |
| "description": "Add AccessibilityAnnouncer.announce() call after async creation actions (thread, forum post) so screen readers announce the result", | |
| "wcag_rules": [ | |
| "4.1.3" | |
| ], | |
| "platforms": [ | |
| "web", | |
| "android", | |
| "ios" | |
| ], | |
| "verification": "Enable screen reader, create a thread or forum post, confirm 'Thread created' or 'Post created' is announced", | |
| "example_ticket": null, | |
| "example_pr": "https://github.com/discord/discord/pull/272773" | |
| }, | |
| { | |
| "id": "keyboard_navigation_enter_key_toggle", | |
| "description": "Replace hidden checkbox+label pattern with Clickable component that supports both Enter and Space key activation for toggle controls", | |
| "wcag_rules": [ | |
| "2.1.1" | |
| ], | |
| "platforms": [ | |
| "web" | |
| ], | |
| "verification": "Focus the toggle with keyboard, press Enter key, confirm it toggles (previously only Space worked)", | |
| "example_ticket": null, | |
| "example_pr": "https://github.com/discord/discord/pull/271691" | |
| }, | |
| { | |
| "id": "keyboard_navigation_nvda_dnd_application_role", | |
| "description": "Set role='application' on drag-and-drop container during keyboard DnD mode so NVDA passes arrow keys through instead of intercepting them for browse mode", | |
| "wcag_rules": [ | |
| "2.1.1" | |
| ], | |
| "platforms": [ | |
| "web" | |
| ], | |
| "verification": "Enable NVDA, start keyboard drag on channel list, confirm arrow keys move the dragged item instead of being consumed by NVDA browse mode", | |
| "example_ticket": null, | |
| "example_pr": "https://github.com/discord/discord/pull/270863" | |
| }, | |
| { | |
| "id": "missing_role_button_to_link_correction", | |
| "description": "Change accessibilityRole from 'button' to 'link' when the action navigates to an external URL, matching the semantic purpose", | |
| "wcag_rules": [ | |
| "4.1.2" | |
| ], | |
| "platforms": [ | |
| "android", | |
| "ios" | |
| ], | |
| "verification": "Enable screen reader, focus the element, confirm it announces as 'link' instead of 'button'", | |
| "example_ticket": null, | |
| "example_pr": "https://github.com/discord/discord/pull/270392" | |
| }, | |
| { | |
| "id": "error_announcement_toast_to_inline", | |
| "description": "Migrate error feedback from Toast (not announced by screen readers) to inline error field on the form so screen readers can discover and announce the error", | |
| "wcag_rules": [ | |
| "3.3.1" | |
| ], | |
| "platforms": [ | |
| "android", | |
| "ios" | |
| ], | |
| "verification": "Enable screen reader, trigger a validation error, confirm the error message is announced instead of appearing as an invisible toast", | |
| "example_ticket": null, | |
| "example_pr": "https://github.com/discord/discord/pull/268828" | |
| }, | |
| { | |
| "id": "missing_role_link_nested_text", | |
| "description": "Add accessible={true} and accessibilityRole='link' to nested <Text onPress> elements so screen readers can independently focus and activate them as links", | |
| "wcag_rules": [ | |
| "4.1.2" | |
| ], | |
| "platforms": [ | |
| "android", | |
| "ios" | |
| ], | |
| "verification": "Enable TalkBack/VoiceOver, swipe to the link text, confirm it is focusable and activatable independently as a link", | |
| "example_ticket": null, | |
| "example_pr": "https://github.com/discord/discord/pull/268067" | |
| }, | |
| { | |
| "id": "missing_role_link_intl_format_migration", | |
| "description": "Replace inline <Text onPress> hook-based links in intl.format() with intl markdown link syntax so the text renders as a proper accessible link element", | |
| "wcag_rules": [ | |
| "4.1.2" | |
| ], | |
| "platforms": [ | |
| "android", | |
| "ios" | |
| ], | |
| "verification": "Enable screen reader, navigate to the 'Learn more' text, confirm it is announced as a link and can be activated", | |
| "example_ticket": null, | |
| "example_pr": "https://github.com/discord/discord/pull/268814" | |
| }, | |
| { | |
| "id": "spoiler_reveal_all_custom_action_android", | |
| "description": "Add Android accessibility custom action to reveal all spoilers at once on double tap, instead of exposing each spoiler individually", | |
| "wcag_rules": [ | |
| "1.3.1", | |
| "4.1.2" | |
| ], | |
| "platforms": [ | |
| "android" | |
| ], | |
| "verification": "Enable TalkBack, focus a message with multiple spoilers, double tap, confirm all spoilers are revealed at once", | |
| "example_ticket": null, | |
| "example_pr": "https://github.com/discord/discord/pull/268094" | |
| }, | |
| { | |
| "id": "spoiler_reveal_all_voiceover_ios", | |
| "description": "Override accessibilityActivate on iOS message cell to reveal all spoilers on VoiceOver double tap, and fix triple tap gesture recognizer priority for long press menu", | |
| "wcag_rules": [ | |
| "1.3.1", | |
| "4.1.2" | |
| ], | |
| "platforms": [ | |
| "ios" | |
| ], | |
| "verification": "Enable VoiceOver, focus a message with spoilers, double tap to reveal all spoilers, triple tap to confirm long press menu opens", | |
| "example_ticket": null, | |
| "example_pr": "https://github.com/discord/discord/pull/268027" | |
| }, | |
| { | |
| "id": "missing_role_region_on_scroll_container", | |
| "description": "Add role='region' with aria-label and aria-controls to interactive horizontal scroll containers so screen readers can identify and navigate them", | |
| "wcag_rules": [ | |
| "1.3.1", | |
| "4.1.2" | |
| ], | |
| "platforms": [ | |
| "web" | |
| ], | |
| "verification": "Screen reader announces the scroll container as a labeled region; scroll buttons reference the controlled container via aria-controls", | |
| "example_ticket": null, | |
| "example_pr": "https://github.com/discord/discord/pull/266755" | |
| }, | |
| { | |
| "id": "missing_label_redundant_cleanup", | |
| "description": "Remove redundant or overly-specific accessibility labels that duplicate visible text, and sync label strings between mobile and desktop platforms", | |
| "wcag_rules": [ | |
| "2.5.3", | |
| "4.1.2" | |
| ], | |
| "platforms": [ | |
| "ios", | |
| "android", | |
| "web" | |
| ], | |
| "verification": "Screen reader announces the visible text as the label without redundant prefixes; labels match across platforms", | |
| "example_ticket": null, | |
| "example_pr": "https://github.com/discord/discord/pull/266071" | |
| }, | |
| { | |
| "id": "missing_role_header_on_logo_image", | |
| "description": "Add accessibilityRole='header' and accessibilityLabel to logo images that serve as section headings, and mark decorative images as inaccessible", | |
| "wcag_rules": [ | |
| "1.3.1", | |
| "1.1.1" | |
| ], | |
| "platforms": [ | |
| "android", | |
| "ios" | |
| ], | |
| "verification": "TalkBack/VoiceOver announces the logo image as a heading with the premium type name; decorative images are skipped", | |
| "example_ticket": null, | |
| "example_pr": "https://github.com/discord/discord/pull/265895" | |
| }, | |
| { | |
| "id": "slider_external_value_sync", | |
| "description": "Add useExternalValue hook to slider settings so the slider stays in sync when the value changes externally via keybinds or store updates", | |
| "wcag_rules": [ | |
| "2.1.1", | |
| "4.1.2" | |
| ], | |
| "platforms": [ | |
| "web" | |
| ], | |
| "verification": "Pressing keybind (e.g. Cmd+/- for zoom) updates the slider thumb position in real-time", | |
| "example_ticket": null, | |
| "example_pr": "https://github.com/discord/discord/pull/264505" | |
| }, | |
| { | |
| "id": "missing_label_label_hint_value_separation", | |
| "description": "Restructure accessibilityLabel/accessibilityHint/accessibilityValue so the label contains the CTA, the hint contains contextual instructions, and the value contains dynamic content", | |
| "wcag_rules": [ | |
| "4.1.2", | |
| "1.3.1" | |
| ], | |
| "platforms": [ | |
| "ios", | |
| "android" | |
| ], | |
| "verification": "VoiceOver announces CTA label first, then dynamic value, then hint as separate speech segments", | |
| "example_ticket": null, | |
| "example_pr": "https://github.com/discord/discord/pull/264075" | |
| }, | |
| { | |
| "id": "preview_hiding_descendants_propagation", | |
| "description": "Use importantForAccessibility='no-hide-descendants' and accessibilityElementsHidden together to fully hide a subtree from both TalkBack and VoiceOver when the element is redundant", | |
| "wcag_rules": [ | |
| "4.1.2" | |
| ], | |
| "platforms": [ | |
| "ios", | |
| "android" | |
| ], | |
| "verification": "Neither VoiceOver nor TalkBack can focus any element within the hidden subtree", | |
| "example_ticket": null, | |
| "example_pr": "https://github.com/discord/discord/pull/264072" | |
| }, | |
| { | |
| "id": "missing_label_close_dismiss_button", | |
| "description": "Add accessibilityRole='button' and accessibilityLabel to icon-only close/dismiss buttons that lack any accessible name", | |
| "wcag_rules": [ | |
| "4.1.2", | |
| "1.1.1" | |
| ], | |
| "platforms": [ | |
| "ios", | |
| "android" | |
| ], | |
| "verification": "Screen reader announces 'Close, button' when focusing the dismiss icon instead of silence", | |
| "example_ticket": null, | |
| "example_pr": "https://github.com/discord/discord/pull/263382" | |
| }, | |
| { | |
| "id": "focus_management_focus_block_dynamic_children", | |
| "description": "Enhance FocusBlock to use MutationObserver for dynamically-added children so elements mounted after initial render are also blocked from focus", | |
| "wcag_rules": [ | |
| "2.4.3" | |
| ], | |
| "platforms": [ | |
| "web" | |
| ], | |
| "verification": "Tab key does not land on any element inside the focus-blocked region, even elements that mount asynchronously", | |
| "example_ticket": null, | |
| "example_pr": "https://github.com/discord/discord/pull/266215" | |
| }, | |
| { | |
| "id": "missing_role_nested_buttons_flatten", | |
| "description": "Remove nested interactive elements (button inside button) by making outer Pressable non-accessible and letting screen readers discover inner semantic elements individually", | |
| "wcag_rules": [ | |
| "4.1.2" | |
| ], | |
| "platforms": [ | |
| "android", | |
| "ios" | |
| ], | |
| "verification": "Enable screen reader, verify each inner element is announced separately with correct role", | |
| "example_ticket": null, | |
| "example_pr": "https://github.com/discord/discord/pull/262897" | |
| }, | |
| { | |
| "id": "focus_management_header_priority_android", | |
| "description": "Add importantForAccessibility='yes' to header containers so Android TalkBack focuses header elements before main content", | |
| "wcag_rules": [ | |
| "1.3.2", | |
| "2.4.3" | |
| ], | |
| "platforms": [ | |
| "android" | |
| ], | |
| "verification": "Enable TalkBack, open screen, verify first swipe focuses back/close button in header", | |
| "example_ticket": null, | |
| "example_pr": "https://github.com/discord/discord/pull/262634" | |
| }, | |
| { | |
| "id": "missing_role_double_focus_inner_image", | |
| "description": "Add accessible={false} and importantForAccessibility='no' to decorative inner views/images inside buttons to prevent double focus", | |
| "wcag_rules": [ | |
| "4.1.2" | |
| ], | |
| "platforms": [ | |
| "android", | |
| "ios" | |
| ], | |
| "verification": "Enable screen reader, navigate to the button, verify it receives focus only once with correct label", | |
| "example_ticket": null, | |
| "example_pr": "https://github.com/discord/discord/pull/262355" | |
| }, | |
| { | |
| "id": "missing_role_button_on_pressable", | |
| "description": "Add accessibilityRole='button' to Pressable components that are interactive but missing the button role announcement", | |
| "wcag_rules": [ | |
| "4.1.2" | |
| ], | |
| "platforms": [ | |
| "android", | |
| "ios" | |
| ], | |
| "verification": "Enable screen reader, focus the element, verify it announces 'button' role", | |
| "example_ticket": null, | |
| "example_pr": "https://github.com/discord/discord/pull/261671" | |
| }, | |
| { | |
| "id": "focus_management_floating_header_ios", | |
| "description": "Replace floating navigation header with an inline close button rendered in the screen content so it appears first in the iOS VoiceOver focus order", | |
| "wcag_rules": [ | |
| "2.4.3" | |
| ], | |
| "platforms": [ | |
| "ios" | |
| ], | |
| "verification": "Enable VoiceOver, open the screen, verify first swipe focuses the close button", | |
| "example_ticket": null, | |
| "example_pr": "https://github.com/discord/discord/pull/261565" | |
| }, | |
| { | |
| "id": "focus_management_voice_panel_trap", | |
| "description": "Wrap overlay views in AccessibilityView with accessibilityViewIsModal and onAccessibilityEscape to trap screen reader focus in the correct panel", | |
| "wcag_rules": [ | |
| "2.4.3", | |
| "2.1.2" | |
| ], | |
| "platforms": [ | |
| "ios" | |
| ], | |
| "verification": "Enable VoiceOver, open the overlay panel, verify focus stays within the panel and escape gesture closes it", | |
| "example_ticket": null, | |
| "example_pr": "https://github.com/discord/discord/pull/261245" | |
| }, | |
| { | |
| "id": "state_announcement_toggle_stable_label", | |
| "description": "Use a stable accessibilityLabel with accessibilityState.selected for toggle buttons instead of swapping between 'Add/Remove' labels", | |
| "wcag_rules": [ | |
| "4.1.2" | |
| ], | |
| "platforms": [ | |
| "android", | |
| "ios" | |
| ], | |
| "verification": "Enable screen reader, focus the toggle button, verify it announces a stable name plus selected/not-selected state", | |
| "example_ticket": null, | |
| "example_pr": "https://github.com/discord/discord/pull/260825" | |
| }, | |
| { | |
| "id": "missing_role_duplicate_role_conflict", | |
| "description": "Replace accessibilityRole='imagebutton' with accessibilityRole='button' to avoid screen readers announcing both roles simultaneously", | |
| "wcag_rules": [ | |
| "4.1.2" | |
| ], | |
| "platforms": [ | |
| "android", | |
| "ios" | |
| ], | |
| "verification": "Enable screen reader, focus the element, verify it announces only 'button' instead of both 'image' and 'button'", | |
| "example_ticket": null, | |
| "example_pr": "https://github.com/discord/discord/pull/260510" | |
| }, | |
| { | |
| "id": "missing_label_icon_semantic_meaning", | |
| "description": "Add accessibilityLabel to decorative status icons (checkmark/X) that convey meaning and group them with their text using a single accessible container", | |
| "wcag_rules": [ | |
| "1.1.1", | |
| "1.3.1" | |
| ], | |
| "platforms": [ | |
| "android", | |
| "ios" | |
| ], | |
| "verification": "Enable screen reader, focus the scope item, verify it announces the semantic meaning along with the description", | |
| "example_ticket": null, | |
| "example_pr": "https://github.com/discord/discord/pull/260291" | |
| }, | |
| { | |
| "id": "missing_label_activity_expand_button", | |
| "description": "Provide context-aware accessibilityLabel for buttons that act differently depending on content type (e.g., 'Expand Activity' vs 'Focus this person')", | |
| "wcag_rules": [ | |
| "2.4.4" | |
| ], | |
| "platforms": [ | |
| "android", | |
| "ios" | |
| ], | |
| "verification": "Enable screen reader, focus the button on different content types, verify it announces the correct contextual label", | |
| "example_ticket": null, | |
| "example_pr": "https://github.com/discord/discord/pull/260288" | |
| }, | |
| { | |
| "id": "preview_hiding_spoiler_screen_reader", | |
| "description": "Override screen reader text for hidden spoilers so VoiceOver announces 'hidden spoiler, double tap to reveal' instead of reading the hidden content", | |
| "wcag_rules": [ | |
| "1.3.1" | |
| ], | |
| "platforms": [ | |
| "ios" | |
| ], | |
| "verification": "Enable VoiceOver, navigate to a hidden spoiler, verify it says 'hidden spoiler' with reveal hint", | |
| "example_ticket": null, | |
| "example_pr": "https://github.com/discord/discord/pull/260266" | |
| }, | |
| { | |
| "id": "missing_role_link_semantic_role", | |
| "description": "Replace Button component with PressableHighlight using accessibilityRole='link' for elements that navigate to external URLs", | |
| "wcag_rules": [ | |
| "4.1.2", | |
| "2.4.4" | |
| ], | |
| "platforms": [ | |
| "android", | |
| "ios" | |
| ], | |
| "verification": "Enable screen reader, focus the link element, verify it announces as 'link' with descriptive label", | |
| "example_ticket": null, | |
| "example_pr": "https://github.com/discord/discord/pull/259268" | |
| }, | |
| { | |
| "id": "focus_management_bottom_sheet_modal_trap", | |
| "description": "Wrap bottom sheet content in AccessibilityView with dynamic accessibilityViewIsModal tied to sheet expansion state to prevent TalkBack from focusing behind it", | |
| "wcag_rules": [ | |
| "2.4.3" | |
| ], | |
| "platforms": [ | |
| "android" | |
| ], | |
| "verification": "Enable TalkBack, expand bottom sheet, swipe past list bounds, verify focus stays within the sheet", | |
| "example_ticket": null, | |
| "example_pr": "https://github.com/discord/discord/pull/259236" | |
| }, | |
| { | |
| "id": "announcer_action_confirmation", | |
| "description": "Use AccessibilityAnnouncer.announce() after destructive or state-changing async actions to provide screen reader confirmation", | |
| "wcag_rules": [ | |
| "4.1.3" | |
| ], | |
| "platforms": [ | |
| "android", | |
| "ios", | |
| "web" | |
| ], | |
| "verification": "Enable screen reader, perform the action, verify an announcement confirms completion", | |
| "example_ticket": null, | |
| "example_pr": "https://github.com/discord/discord/pull/257165" | |
| }, | |
| { | |
| "id": "missing_label_bulleted_list_readable", | |
| "description": "Flatten nested View+Text structures for bulleted list items into a single Text element with accessibilityLabel so screen readers read each item as a coherent unit", | |
| "wcag_rules": [ | |
| "1.3.1" | |
| ], | |
| "platforms": [ | |
| "android", | |
| "ios" | |
| ], | |
| "verification": "Enable screen reader, navigate through the list items, verify each bullet point is read as a single coherent item", | |
| "example_ticket": null, | |
| "example_pr": "https://github.com/discord/discord/pull/257364" | |
| }, | |
| { | |
| "id": "tooltip_redundant_announcement_hidden", | |
| "description": "Hide tooltip text from screen readers using ariaHidden when it duplicates the button's aria-label, preventing double announcement", | |
| "wcag_rules": [ | |
| "4.1.2" | |
| ], | |
| "platforms": [ | |
| "web" | |
| ], | |
| "verification": "Enable screen reader, focus the button, verify label is announced once rather than twice", | |
| "example_ticket": null, | |
| "example_pr": "https://github.com/discord/discord/pull/260609" | |
| }, | |
| { | |
| "id": "custom_action_nested_interactive_workaround", | |
| "description": "When a nested interactive element cannot be separated, hide it from screen readers and expose the action via accessibilityActions on the parent instead", | |
| "wcag_rules": [ | |
| "4.1.2", | |
| "1.3.1" | |
| ], | |
| "platforms": [ | |
| "android", | |
| "ios" | |
| ], | |
| "verification": "Enable screen reader, focus the card, use custom actions gesture to find the nested action", | |
| "example_ticket": null, | |
| "example_pr": "https://github.com/discord/discord/pull/259933" | |
| }, | |
| { | |
| "id": "focus_management_quest_dock_backdrop_dismiss", | |
| "description": "Calculate accessible dismiss target height for expanded overlay backdrops so screen readers can dismiss the overlay", | |
| "wcag_rules": [ | |
| "2.4.3" | |
| ], | |
| "platforms": [ | |
| "android", | |
| "ios" | |
| ], | |
| "verification": "Enable screen reader, expand the dock, verify the backdrop dismiss area is properly sized and accessible", | |
| "example_ticket": null, | |
| "example_pr": "https://github.com/discord/discord/pull/256152" | |
| }, | |
| { | |
| "id": "remove_incorrect_role_trait", | |
| "description": "Remove inherited accessibility role/trait that doesn't match the element's actual purpose (e.g., image trait on a button-only element)", | |
| "wcag_rules": [ | |
| "4.1.2" | |
| ], | |
| "platforms": [ | |
| "ios" | |
| ], | |
| "verification": "VoiceOver should announce only the correct role without additional incorrect roles", | |
| "example_ticket": null, | |
| "example_pr": "https://github.com/discord/discord/pull/254687" | |
| }, | |
| { | |
| "id": "ios_link_workaround_voiceover", | |
| "description": "Replace Text with TextWithIOSLinkWorkaround to make inline links individually selectable by VoiceOver", | |
| "wcag_rules": [ | |
| "2.1.1", | |
| "4.1.2" | |
| ], | |
| "platforms": [ | |
| "ios" | |
| ], | |
| "verification": "VoiceOver can individually focus and activate each inline link", | |
| "example_ticket": null, | |
| "example_pr": "https://github.com/discord/discord/pull/252961" | |
| }, | |
| { | |
| "id": "header_transparent_unfocusable_workaround", | |
| "description": "Work around react-navigation bug where headerTransparent makes header elements unfocusable by adding headerMode: 'float'", | |
| "wcag_rules": [ | |
| "2.1.1" | |
| ], | |
| "platforms": [ | |
| "android", | |
| "ios" | |
| ], | |
| "verification": "Screen reader can focus and activate header buttons in modals with transparent headers", | |
| "example_ticket": null, | |
| "example_pr": "https://github.com/discord/discord/pull/250285" | |
| }, | |
| { | |
| "id": "tooltip_keyboard_focus_trap_delay", | |
| "description": "Add a delay before auto-focusing tooltip content on keyboard focus to prevent focus traps when tabbing through badge lists", | |
| "wcag_rules": [ | |
| "2.1.1", | |
| "2.1.2" | |
| ], | |
| "platforms": [ | |
| "web" | |
| ], | |
| "verification": "User can tab through badge list without getting trapped in tooltips", | |
| "example_ticket": null, | |
| "example_pr": "https://github.com/discord/discord/pull/250204" | |
| }, | |
| { | |
| "id": "replace_custom_actions_with_escape_handler", | |
| "description": "Replace accessibilityActions with onAccessibilityEscape to support back-navigation scrub gesture without leaking 'Back' as a custom action on every child", | |
| "wcag_rules": [ | |
| "2.1.1", | |
| "4.1.2" | |
| ], | |
| "platforms": [ | |
| "ios" | |
| ], | |
| "verification": "VoiceOver Rotor no longer shows leaked 'Actions' on text input; two-finger scrub still navigates back", | |
| "example_ticket": null, | |
| "example_pr": "https://github.com/discord/discord/pull/245686" | |
| }, | |
| { | |
| "id": "custom_actions_null_guild_guard", | |
| "description": "Fix early return in custom action creation that skips DM channels by removing the guildId null guard", | |
| "wcag_rules": [ | |
| "4.1.2" | |
| ], | |
| "platforms": [ | |
| "ios", | |
| "android" | |
| ], | |
| "verification": "VoiceOver/TalkBack reads custom actions on message rows in DMs, not just guild channels", | |
| "example_ticket": null, | |
| "example_pr": "https://github.com/discord/discord/pull/245678" | |
| }, | |
| { | |
| "id": "keyboard_only_drag_handle", | |
| "description": "Add a separate keyboard-only drag handle (visible only on :focus-visible) with aria-label for keyboard drag-and-drop", | |
| "wcag_rules": [ | |
| "2.1.1", | |
| "4.1.2" | |
| ], | |
| "platforms": [ | |
| "web" | |
| ], | |
| "verification": "Tab to item shows visible drag handle with focus ring; mouse users see no change", | |
| "example_ticket": null, | |
| "example_pr": "https://github.com/discord/discord/pull/245477" | |
| }, | |
| { | |
| "id": "carousel_hide_inactive_slides", | |
| "description": "Hide non-active carousel slides from screen readers using accessibilityElementsHidden and importantForAccessibility, add selected state to navigation buttons", | |
| "wcag_rules": [ | |
| "1.3.1", | |
| "4.1.2" | |
| ], | |
| "platforms": [ | |
| "ios", | |
| "android" | |
| ], | |
| "verification": "Screen reader only reads the active carousel slide; navigation buttons announce selected state", | |
| "example_ticket": null, | |
| "example_pr": "https://github.com/discord/discord/pull/245589" | |
| }, | |
| { | |
| "id": "abbreviated_timestamp_a11y_label", | |
| "description": "Provide a separate non-abbreviated accessibilityLabel for timestamps so screen readers say '4 months ago' instead of literally reading '4mo'", | |
| "wcag_rules": [ | |
| "1.3.1" | |
| ], | |
| "platforms": [ | |
| "android", | |
| "ios" | |
| ], | |
| "verification": "TalkBack/VoiceOver reads full relative time instead of abbreviated form", | |
| "example_ticket": null, | |
| "example_pr": "https://github.com/discord/discord/pull/243685" | |
| }, | |
| { | |
| "id": "hidden_heading_in_tabpanel", | |
| "description": "Add a visually hidden heading inside each tab panel using HeadingLevel so screen reader heading navigation can discover tab content sections", | |
| "wcag_rules": [ | |
| "1.3.1", | |
| "2.4.6" | |
| ], | |
| "platforms": [ | |
| "web" | |
| ], | |
| "verification": "Screen reader heading navigation (H key) lists tab panel names in the heading hierarchy", | |
| "example_ticket": null, | |
| "example_pr": "https://github.com/discord/discord/pull/242953" | |
| }, | |
| { | |
| "id": "hover_to_hover_or_focus", | |
| "description": "Replace useHover with useHoverOrFocus to ensure hover-triggered UI also activates on keyboard focus for non-mouse users", | |
| "wcag_rules": [ | |
| "2.1.1" | |
| ], | |
| "platforms": [ | |
| "web" | |
| ], | |
| "verification": "Keyboard focus on cards/items triggers the same visual feedback as mouse hover", | |
| "example_ticket": null, | |
| "example_pr": "https://github.com/discord/discord/pull/242404" | |
| }, | |
| { | |
| "id": "duplicate_readout_image_alt_removal", | |
| "description": "Remove redundant alt text from decorative images inside labeled containers to prevent screen readers from reading the same content twice", | |
| "wcag_rules": [ | |
| "1.1.1", | |
| "4.1.2" | |
| ], | |
| "platforms": [ | |
| "web" | |
| ], | |
| "verification": "Screen reader reads the label once from the container, not duplicated from both image alt and container label", | |
| "example_ticket": null, | |
| "example_pr": "https://github.com/discord/discord/pull/240014" | |
| }, | |
| { | |
| "id": "nested_text_a11y_breakage", | |
| "description": "Fix screen reader issues caused by nested Text components in React Native by flattening the text hierarchy and adding explicit accessibilityLabel", | |
| "wcag_rules": [ | |
| "4.1.2" | |
| ], | |
| "platforms": [ | |
| "ios", | |
| "android" | |
| ], | |
| "verification": "Screen reader reads the button label correctly without garbled output from nested Text nodes", | |
| "example_ticket": null, | |
| "example_pr": "https://github.com/discord/discord/pull/244688" | |
| }, | |
| { | |
| "id": "announcer_item_removal", | |
| "description": "Announce when a user removes an item from an interactive list using AccessibilityAnnouncer since the underlying component doesn't announce automatically", | |
| "wcag_rules": [ | |
| "4.1.3" | |
| ], | |
| "platforms": [ | |
| "android", | |
| "ios" | |
| ], | |
| "verification": "TalkBack/VoiceOver announces '{item} removed' when double-tapping to remove a tag", | |
| "example_ticket": null, | |
| "example_pr": "https://github.com/discord/discord/pull/243656" | |
| }, | |
| { | |
| "id": "dm_channel_status_in_label", | |
| "description": "Append user online status and contextual hints (muted, etc.) to channel aria-label so screen readers convey the full state of DM list items", | |
| "wcag_rules": [ | |
| "1.3.1", | |
| "4.1.2" | |
| ], | |
| "platforms": [ | |
| "web" | |
| ], | |
| "verification": "Screen reader reads DM channel as 'Username, Online, Muted' instead of just 'Username'", | |
| "example_ticket": null, | |
| "example_pr": "https://github.com/discord/discord/pull/249047" | |
| }, | |
| { | |
| "id": "reaction_user_grouping_and_selection", | |
| "description": "Add aria-label to reactor rows, aria-selected to active emoji tab, and labels to remove-reaction buttons so the reaction user list is navigable", | |
| "wcag_rules": [ | |
| "1.3.1", | |
| "4.1.2" | |
| ], | |
| "platforms": [ | |
| "web" | |
| ], | |
| "verification": "Screen reader announces reactor username, selected emoji tab, and 'remove reaction' button label", | |
| "example_ticket": null, | |
| "example_pr": "https://github.com/discord/discord/pull/249556" | |
| }, | |
| { | |
| "id": "tooltip_hoverable_persist", | |
| "description": "Keep tooltip open while mouse hovers over the tooltip itself by adding onMouseEnter/onMouseLeave handlers to the tooltip container", | |
| "wcag_rules": [ | |
| "1.4.13" | |
| ], | |
| "platforms": [ | |
| "web" | |
| ], | |
| "verification": "Hover trigger to show tooltip, then move mouse onto tooltip content; tooltip remains visible and interactive", | |
| "example_ticket": null, | |
| "example_pr": "https://github.com/discord/discord/pull/236723" | |
| }, | |
| { | |
| "id": "view_to_pressable_expandable", | |
| "description": "Convert non-interactive View to PressableOpacity with accessibilityRole='button' and accessibilityState={expanded} for expandable list items", | |
| "wcag_rules": [ | |
| "4.1.2", | |
| "2.1.1" | |
| ], | |
| "platforms": [ | |
| "android", | |
| "ios" | |
| ], | |
| "verification": "Enable screen reader; expandable item announces as button with expanded/collapsed state", | |
| "example_ticket": null, | |
| "example_pr": "https://github.com/discord/discord/pull/234817" | |
| }, | |
| { | |
| "id": "radio_group_selection_grid", | |
| "description": "Replace clickable grid of visual options with proper radio group pattern using useRadioGroup/useRadioItem hooks with aria-describedby and labelledBy", | |
| "wcag_rules": [ | |
| "1.3.1", | |
| "4.1.2" | |
| ], | |
| "platforms": [ | |
| "web" | |
| ], | |
| "verification": "Navigate grid with keyboard; items announce as radio buttons within a group with selected state", | |
| "example_ticket": null, | |
| "example_pr": "https://github.com/discord/discord/pull/233955" | |
| }, | |
| { | |
| "id": "keyboard_symbol_a11y_label", | |
| "description": "Add aria-label to keyboard shortcut symbols (modifier key Unicode glyphs) with platform-aware spoken names", | |
| "wcag_rules": [ | |
| "1.1.1", | |
| "4.1.2" | |
| ], | |
| "platforms": [ | |
| "web" | |
| ], | |
| "verification": "Focus keyboard shortcut display with screen reader; symbols announced by name (e.g. 'Command' not the Unicode symbol)", | |
| "example_ticket": null, | |
| "example_pr": "https://github.com/discord/discord/pull/232430" | |
| }, | |
| { | |
| "id": "inert_text_in_list_item", | |
| "description": "Add inert attribute to text content inside interactive list items to prevent screen readers from individually focusing decorative text", | |
| "wcag_rules": [ | |
| "2.4.3", | |
| "1.3.1" | |
| ], | |
| "platforms": [ | |
| "web" | |
| ], | |
| "verification": "Navigate list with screen reader; individual text spans within items are not focusable, only the parent interactive element", | |
| "example_ticket": null, | |
| "example_pr": "https://github.com/discord/discord/pull/230596" | |
| }, | |
| { | |
| "id": "dialog_role_popout", | |
| "description": "Wrap popout content in a Dialog component (role=dialog) instead of a bare Clickable, providing proper focus trapping and return-focus", | |
| "wcag_rules": [ | |
| "2.4.3", | |
| "1.3.1" | |
| ], | |
| "platforms": [ | |
| "web" | |
| ], | |
| "verification": "Open popout with keyboard; focus trapped inside, Escape closes and returns focus to trigger", | |
| "example_ticket": null, | |
| "example_pr": "https://github.com/discord/discord/pull/231082" | |
| }, | |
| { | |
| "id": "forced_focus_ring_non_keyboard", | |
| "description": "Add CSS :focus (not just :focus-visible) outline for programmatically focused buttons to ensure focus ring is visible even without prior keyboard navigation", | |
| "wcag_rules": [ | |
| "2.4.7" | |
| ], | |
| "platforms": [ | |
| "web" | |
| ], | |
| "verification": "Click button that receives programmatic focus; focus ring is visible", | |
| "example_ticket": null, | |
| "example_pr": "https://github.com/discord/discord/pull/231181" | |
| }, | |
| { | |
| "id": "spoiler_container_a11y_elements", | |
| "description": "Override accessibilityElements on iOS to only expose the spoiler overlay when content is hidden, preventing VoiceOver from reading spoilered content behind the overlay", | |
| "wcag_rules": [ | |
| "1.3.2", | |
| "4.1.2" | |
| ], | |
| "platforms": [ | |
| "ios" | |
| ], | |
| "verification": "With VoiceOver, navigate to a spoilered container; only 'spoiler' overlay is announced, not the hidden content", | |
| "example_ticket": null, | |
| "example_pr": "https://github.com/discord/discord/pull/218548" | |
| }, | |
| { | |
| "id": "announce_state_change_on_leave", | |
| "description": "Announce to screen reader when a participant leaves a voice call by diffing the previous and current participant lists", | |
| "wcag_rules": [ | |
| "4.1.3" | |
| ], | |
| "platforms": [ | |
| "android", | |
| "ios" | |
| ], | |
| "verification": "In a call with screen reader, when someone leaves the call an announcement is spoken", | |
| "example_ticket": null, | |
| "example_pr": "https://github.com/discord/discord/pull/213707" | |
| }, | |
| { | |
| "id": "nested_interactive_extraction", | |
| "description": "Extract nested interactive elements (like hidden file inputs inside buttons) into a dedicated combined component to avoid nested interactive element violations", | |
| "wcag_rules": [ | |
| "4.1.1", | |
| "2.1.1" | |
| ], | |
| "platforms": [ | |
| "web" | |
| ], | |
| "verification": "Inspect button markup; no nested interactive elements, file upload works via single button activation", | |
| "example_ticket": null, | |
| "example_pr": "https://github.com/discord/discord/pull/205671" | |
| }, | |
| { | |
| "id": "error_text_announcer", | |
| "description": "Create a reusable ErrorText component that automatically announces error messages to screen readers via AccessibilityAnnouncer.announce() when validation errors appear", | |
| "wcag_rules": [ | |
| "4.1.3", | |
| "3.3.1" | |
| ], | |
| "platforms": [ | |
| "android", | |
| "ios" | |
| ], | |
| "verification": "Trigger a form validation error with screen reader active; error message automatically announced", | |
| "example_ticket": null, | |
| "example_pr": "https://github.com/discord/discord/pull/202692" | |
| }, | |
| { | |
| "id": "facepile_avatar_hide_descendants", | |
| "description": "Add importantForAccessibility='no-hide-descendants' and accessibilityElementsHidden to composite avatar/facepile components so individual faces are not separately announced", | |
| "wcag_rules": [ | |
| "1.1.1" | |
| ], | |
| "platforms": [ | |
| "android", | |
| "ios" | |
| ], | |
| "verification": "Navigate to group DM with facepile avatar; screen reader announces the group name, not individual images", | |
| "example_ticket": null, | |
| "example_pr": "https://github.com/discord/discord/pull/203489" | |
| }, | |
| { | |
| "id": "font_scaling_layout_fix", | |
| "description": "Remove hardcoded pixel heights that break with font scaling, use flex layout with padding instead of absolute positioning so elements grow with dynamic type", | |
| "wcag_rules": [ | |
| "1.4.4" | |
| ], | |
| "platforms": [ | |
| "android", | |
| "ios" | |
| ], | |
| "verification": "Enable largest dynamic type; elements expand to fit text without clipping or overflow", | |
| "example_ticket": null, | |
| "example_pr": "https://github.com/discord/discord/pull/191580" | |
| }, | |
| { | |
| "id": "focus_after_list_deletion", | |
| "description": "After deleting an item from a list, move focus to the next item or a fallback container element, preventing focus loss to document body", | |
| "wcag_rules": [ | |
| "2.4.3" | |
| ], | |
| "platforms": [ | |
| "web" | |
| ], | |
| "verification": "Delete an item with keyboard; focus moves to the adjacent item or container", | |
| "example_ticket": null, | |
| "example_pr": "https://github.com/discord/discord/pull/207756" | |
| }, | |
| { | |
| "id": "set_a11y_focus_after_action", | |
| "description": "Use setAccessibilityFocus to keep screen reader focus on a button after pressing it, preventing iOS from moving focus to a distant element", | |
| "wcag_rules": [ | |
| "2.4.3" | |
| ], | |
| "platforms": [ | |
| "ios" | |
| ], | |
| "verification": "Tap button with VoiceOver; focus remains on the button, not jumping to header", | |
| "example_ticket": null, | |
| "example_pr": "https://github.com/discord/discord/pull/203333" | |
| }, | |
| { | |
| "id": "aria_hidden_inactive_ui", | |
| "description": "Add aria-hidden and tabIndex=-1 to animated/inactive UI elements so they are neither focusable nor announced when not applicable", | |
| "wcag_rules": [ | |
| "2.4.3", | |
| "4.1.2" | |
| ], | |
| "platforms": [ | |
| "web" | |
| ], | |
| "verification": "Tab through page when feature is inactive; hidden controls are skipped entirely", | |
| "example_ticket": null, | |
| "example_pr": "https://github.com/discord/discord/pull/205223" | |
| }, | |
| { | |
| "id": "keyboard_aware_scroll_offset", | |
| "description": "Replace manual KeyboardStore-based bottom padding with useSafeAreaInsetsKeyboardAware hook to automatically adjust scroll view margins when keyboard opens", | |
| "wcag_rules": [ | |
| "1.4.4" | |
| ], | |
| "platforms": [ | |
| "android", | |
| "ios" | |
| ], | |
| "verification": "Open keyboard on edit screen; all content remains scrollable and submit button is not covered", | |
| "example_ticket": null, | |
| "example_pr": "https://github.com/discord/discord/pull/211136" | |
| }, | |
| { | |
| "id": "announce_pending_unsaved_changes", | |
| "description": "Use AccessibilityAnnouncer to announce unsaved changes warning when user attempts to close a modal with pending edits", | |
| "wcag_rules": [ | |
| "4.1.3" | |
| ], | |
| "platforms": [ | |
| "web", | |
| "android", | |
| "ios" | |
| ], | |
| "verification": "Make changes, try to close without saving; screen reader announces the unsaved changes warning", | |
| "example_ticket": null, | |
| "example_pr": "https://github.com/discord/discord/pull/238526" | |
| }, | |
| { | |
| "id": "checkbox_to_table_checkbox_row", | |
| "description": "Replace custom FormRow+Checkbox combinations with semantic TableCheckboxRow component that has built-in accessibility role and checked state", | |
| "wcag_rules": [ | |
| "4.1.2", | |
| "1.3.1" | |
| ], | |
| "platforms": [ | |
| "android", | |
| "ios" | |
| ], | |
| "verification": "Navigate checkboxes with screen reader; each option announces its label and checked state correctly", | |
| "example_ticket": null, | |
| "example_pr": "https://github.com/discord/discord/pull/231945" | |
| }, | |
| { | |
| "id": "color_picker_color_name_label", | |
| "description": "Map hex color values to human-readable color names for accessibility labels on color picker controls", | |
| "wcag_rules": [ | |
| "1.1.1", | |
| "4.1.2" | |
| ], | |
| "platforms": [ | |
| "android", | |
| "ios" | |
| ], | |
| "verification": "Navigate color picker with screen reader; colors announced by name (e.g. 'Red') not hex code", | |
| "example_ticket": null, | |
| "example_pr": "https://github.com/discord/discord/pull/219444" | |
| }, | |
| { | |
| "id": "first_focusable_element_dynamic", | |
| "description": "Dynamically determine which title bar element should receive focus-jump section props based on which elements are actually rendered, using a priority enum", | |
| "wcag_rules": [ | |
| "2.4.3" | |
| ], | |
| "platforms": [ | |
| "web" | |
| ], | |
| "verification": "Use keyboard shortcut to jump to title bar; focus lands on the first visible button regardless of which features are enabled", | |
| "example_ticket": null, | |
| "example_pr": "https://github.com/discord/discord/pull/231051" | |
| }, | |
| { | |
| "id": "a11y_group_info_cards", | |
| "description": "Wrap informational cards (like numbered steps) in a single accessible group with a combined label joining the number and description", | |
| "wcag_rules": [ | |
| "1.3.1" | |
| ], | |
| "platforms": [ | |
| "android", | |
| "ios" | |
| ], | |
| "verification": "Navigate to info cards with screen reader; each card announced as a single element with step number and description together", | |
| "example_ticket": null, | |
| "example_pr": "https://github.com/discord/discord/pull/233402" | |
| } | |
| ], | |
| "blockers": [ | |
| { | |
| "id": "bottomsheet_focus_order", | |
| "signal": "BottomSheet, focus order, visual reading order", | |
| "reason": "Focus order issues in React Native BottomSheet are a component-level problem. The BottomSheet component needs architectural changes to support proper focus ordering. Not fixable at the feature layer.", | |
| "upstream_issue": "https://canary.discord.com/channels/281683040739262465/1483624792589602816" | |
| }, | |
| { | |
| "id": "quest_video_captions_content_dependency", | |
| "signal": "captions, transcripts, ad ops, quest video content", | |
| "reason": "Quest video captions/transcripts are supported in code but most quest videos do not have caption assets set. Fix requires ad ops to upload caption files, not a code change.", | |
| "upstream_issue": null | |
| }, | |
| { | |
| "id": "quest_video_audio_descriptions_feature_gap", | |
| "signal": "audio descriptions, VIDEO_PLAYER_AUDIO_DESCRIPTION, react-native-video selectedAudioTrack", | |
| "reason": "Audio descriptions for quest videos were never implemented. Requires new QuestAssetType, API/content pipeline updates, video player alternate audio track support, and UI controls. Feature gap, not a regression.", | |
| "upstream_issue": null | |
| }, | |
| { | |
| "id": "marketing_web_external_platform", | |
| "signal": "GDC, Webflow, marketing web, prod-wf1.discord.com", | |
| "reason": "Marketing/GDC web pages are built on Webflow (external platform), not in the discord/discord repo. Cannot be automated through discord/discord PRs.", | |
| "upstream_issue": null | |
| }, | |
| { | |
| "id": "translation_pipeline_latency", | |
| "signal": "blocked by translations, follow-up PR for hints, copy is translated", | |
| "reason": "Accessibility hint text requires translation before shipping. PRs are split into immediate label fixes and follow-up translation-dependent changes, causing partial fixes.", | |
| "upstream_issue": null | |
| }, | |
| { | |
| "id": "poll_heading_native_code", | |
| "signal": "ViewCompat.setAccessibilityHeading in Kotlin, accessibilityTraits in Swift", | |
| "reason": "Poll heading fix required native Android (Kotlin) and iOS (Swift) code changes. Automation limited to JS/TS layer cannot fix native platform code.", | |
| "upstream_issue": null | |
| }, | |
| { | |
| "id": "legacy_text_migration", | |
| "signal": "LegacyText replaced with Text component in IconLabelBlock", | |
| "reason": "Some heading fixes require migrating from LegacyText to the design system Text component. Broader migration concern.", | |
| "upstream_issue": null | |
| }, | |
| { | |
| "id": "native_i18n_key_sync", | |
| "signal": "nativeModuleI18nKeys.json key mismatch with en-US.messages.js", | |
| "reason": "Native iOS/Android i18n keys maintained separately. Mismatch silently returns empty strings. Automation must validate key sync.", | |
| "upstream_issue": null | |
| }, | |
| { | |
| "id": "kotlin_native_content_description", | |
| "signal": "contentDescription in Kotlin views (MessageViewReplyPreview)", | |
| "reason": "Some a11y labels must be set in platform-native Kotlin code, outside JS/RN layer.", | |
| "upstream_issue": null | |
| }, | |
| { | |
| "id": "ios_swift_native_paragraph_style", | |
| "signal": "NSMutableParagraphStyle.maximumLineHeight in Swift", | |
| "reason": "Text resize fixes in native iOS views require Swift UIKit code. Cannot be automated through RN JS layer.", | |
| "upstream_issue": null | |
| }, | |
| { | |
| "id": "voice_channel_accessible_grouping", | |
| "signal": "ChannelItem wrapping voice users as single accessible entity", | |
| "reason": "Fixing focus order for voice users required restructuring component tree. Structural refactor, not simple prop addition.", | |
| "upstream_issue": null | |
| }, | |
| { | |
| "id": "store_backed_default_values", | |
| "signal": "StatusSetting.useSetting() returns empty for UNKNOWN status", | |
| "reason": "Some label fixes require changing data source, not just adding accessibilityLabel. Automation cannot determine correct data source.", | |
| "upstream_issue": null | |
| }, | |
| { | |
| "id": "android_kotlin_native_views", | |
| "signal": "Kotlin files in discord_android_rn/android/features/chat", | |
| "reason": "Several a11y fixes require modifying native Android Kotlin view code outside React Native JS layer.", | |
| "upstream_issue": null | |
| }, | |
| { | |
| "id": "i18n_native_module_key_registration", | |
| "signal": "nativeModuleI18nKeys.json, I18nMessage.kt, I18nMessage.swift changes", | |
| "reason": "New accessibility labels on native platforms require registering i18n keys in three places. Multi-file multi-language coordination.", | |
| "upstream_issue": null | |
| }, | |
| { | |
| "id": "android_accessibility_action_replacement", | |
| "signal": "ViewCompat.replaceAccessibilityAction pattern in Kotlin", | |
| "reason": "Grouping buttons with parent containers on Android requires custom accessibility delegates. Non-trivial native pattern.", | |
| "upstream_issue": null | |
| }, | |
| { | |
| "id": "aria_hidden_triple_platform_workaround", | |
| "signal": "accessible={false} + importantForAccessibility='no-hide-descendants' + accessibilityElementsHidden", | |
| "reason": "Hiding elements from screen readers requires three separate props for Android, iOS, and web.", | |
| "upstream_issue": null | |
| }, | |
| { | |
| "id": "design_system_heading_component", | |
| "signal": "Heading component from @app/design/native", | |
| "reason": "Screens using LegacyText or plain Text need migration to Heading component. Availability and API must be verified per site.", | |
| "upstream_issue": null | |
| }, | |
| { | |
| "id": "screen_reader_conditional_rendering", | |
| "signal": "useIsScreenReaderEnabled() + conditional rendering", | |
| "reason": "Some focus order fixes require detecting screen reader state and conditionally rendering different component trees.", | |
| "upstream_issue": null | |
| }, | |
| { | |
| "id": "native_ios_audio_focus", | |
| "signal": "Swift UIAccessibility.post, accessibilityActivate override, AudioPlayerDataManager", | |
| "reason": "Focus management in native iOS audio player requires Swift-level UIKit accessibility API changes.", | |
| "upstream_issue": null | |
| }, | |
| { | |
| "id": "absolute_positioned_headers", | |
| "signal": "absolutely positioned header, headerTransparent: true", | |
| "reason": "Absolute-positioned overlapping headers break focus order. Requires migration away from bespoke transparent header pattern.", | |
| "upstream_issue": null | |
| }, | |
| { | |
| "id": "shop_purchase_focus_bottomsheet", | |
| "signal": "BottomSheet deeper issue, not inherently tied to implementation", | |
| "reason": "Focus order bug rooted in BottomSheet core component. Team expects 'won't fix' or wait for redesign away from action sheet.", | |
| "upstream_issue": "https://canary.discord.com/channels/281683040739262465/1483624792589602816" | |
| }, | |
| { | |
| "id": "hcaptcha_puzzle_keyboard_inaccessible", | |
| "signal": "hCaptcha, puzzle verification, drag-and-drop, @hcaptcha/react-hcaptcha, captcha iframe", | |
| "reason": "hCaptcha's drag-and-drop puzzle challenge renders inside a third-party iframe. Discord's Captcha.tsx is a thin wrapper with no control over the puzzle UI's keyboard behavior. Fix requires hCaptcha vendor cooperation (enabling accessibility mode via dashboard/API) or switching challenge type.", | |
| "upstream_issue": null | |
| }, | |
| { | |
| "id": "screen_reader_keyboard_capture_intercept", | |
| "signal": "VoiceOver intercepts keyboard, IOHIDManager, KeyRecorder, keybind recording, push to talk keybind, screen reader active", | |
| "reason": "Screen readers (VoiceOver, NVDA) intercept keyboard events at the OS level before they reach Electron's native input capture (IOHIDManager on macOS). KeyRecorder cannot capture keystrokes when a screen reader is active. Fix requires building an alternative keybind input UI (dropdown picker or text-based), which is feature-level work requiring design decisions and native code changes.", | |
| "upstream_issue": null | |
| }, | |
| { | |
| "id": "focus_lock_traps_third_party_iframe", | |
| "signal": "focus-layers, useFocusLock, hCaptcha iframe, third-party iframe, captcha focus, FocusLock trapping", | |
| "reason": "Discord's useFocusLock (wrapping focus-layers library) traps keyboard focus inside the modal container. Third-party iframes (e.g. hCaptcha challenge) appended to document.body are outside the lock scope and unreachable. Fix requires design system changes to FocusLock/Dialog components, cross-team coordination with Mana team.", | |
| "upstream_issue": null | |
| }, | |
| { | |
| "id": "view_native_component_accessibility_actions", | |
| "signal": "NativeView, ViewNativeComponent, accessibilityActions not surfaced to TalkBack", | |
| "reason": "Components using NativeView (ViewNativeComponent) instead of standard React Native View may not properly bridge accessibilityActions to Android AccessibilityNodeInfo. Actions are set in JS but TalkBack reports action not supported. Soft blocker: check if switching to View resolves it before classifying as blocked.", | |
| "upstream_issue": null | |
| }, | |
| { | |
| "id": "ucrop_third_party_slider_inaccessible", | |
| "signal": "uCrop, HorizontalProgressWheelView, react-native-image-crop-picker, image cropper slider, zoom rotation wheel", | |
| "reason": "uCrop library's HorizontalProgressWheelView (zoom/rotation wheel controls) does not implement AccessibilityNodeProvider. Discord's fork of react-native-image-crop-picker only exposes button label config, not slider accessibility. Fix requires patching native Java/Kotlin uCrop code or building alternative accessible input.", | |
| "upstream_issue": "https://github.com/discord/discord/pull/269014" | |
| }, | |
| { | |
| "id": "forked_native_module_android_ios_parity", | |
| "signal": "react-native-image-crop-picker, forked native module, Android Java parity gap, cropperClampButtonAccessibilityLabel missing on Android", | |
| "reason": "Discord's fork of react-native-image-crop-picker has iOS/Android parity gaps in accessibility label support. Labels passed from RN layer are only implemented on one platform. Fix requires modifying Java/ObjC in the external forked repo, not discord/discord JS/TS.", | |
| "upstream_issue": "https://github.com/discord/react-native-image-crop-picker" | |
| }, | |
| { | |
| "id": "ios_tocropviewcontroller_crop_box_inaccessible", | |
| "signal": "TOCropViewController, crop box, VoiceOver crop gesture, image crop picker crop area, pan pinch crop", | |
| "reason": "TOCropViewController (used by react-native-image-crop-picker on iOS) renders the crop box as a gesture-only surface (pan/pinch). The crop box is not exposed as an accessible element with adjustable actions. VoiceOver users can reach Cancel/Apply buttons but cannot manipulate the crop area. Fix requires native ObjC/Swift changes in the forked library or building an alternative accessible crop UI.", | |
| "upstream_issue": "https://github.com/discord/discord/pull/269014" | |
| }, | |
| { | |
| "id": "dragging_movements_feature_gap", | |
| "signal": "drag and drop, rearrange, reorder, dragging movement, WCAG 2.5.7, no alternative to drag", | |
| "reason": "WCAG 2.5.7 requires non-drag alternatives for any drag-based interaction. Implementing menu-based alternatives (Move Up/Down, Add to Folder) is new feature work requiring product/UX decisions, not a prop fix. Affects guilds bar server reordering, folder management, and potentially other drag-based UIs.", | |
| "upstream_issue": null | |
| }, | |
| { | |
| "id": "ios_objc_native_accessibility_label", | |
| "signal": "DCDAvatarView, setWithAcronymAndColors, accessibilityLabel in Objective-C, native iOS avatar", | |
| "reason": "Native iOS Objective-C views (e.g. DCDAvatarView.m) set visible text but not accessibilityLabel. Fix requires modifying .m/.swift files outside JS/RN automation scope.", | |
| "upstream_issue": null | |
| }, | |
| { | |
| "id": "ios_swift_native_focus_management", | |
| "signal": "UIAccessibility.post, screenChanged, scrollToBottom focus, ChatViewController.swift, VoiceOver initial focus placement", | |
| "reason": "VoiceOver focus placement on initial screen/channel load requires native Swift UIKit code changes (UIAccessibility.post(notification: .screenChanged, argument:) or scrollTo focus parameter). JS/RN layer can request scroll targets but cannot control native VoiceOver focus posting.", | |
| "upstream_issue": null | |
| } | |
| ], | |
| "wcag_rules": { | |
| "1.4.4": { | |
| "name": "Resize text", | |
| "ticket_count": 25, | |
| "fix_patterns": [ | |
| "text_resize_max_font_multiplier", | |
| "text_resize_truncation", | |
| "text_resize_layout_overflow_clipping", | |
| "text_resize_wrap", | |
| "text_resize_remove_font_cap", | |
| "font_scaling_layout_fix", | |
| "keyboard_aware_scroll_offset" | |
| ], | |
| "property_test_exists": false | |
| }, | |
| "4.1.2": { | |
| "name": "Name, Role, Value", | |
| "ticket_count": 75, | |
| "fix_patterns": [ | |
| "missing_label_accessibility_value_split", | |
| "missing_state_aria_current_selected", | |
| "missing_label_icon_button_role", | |
| "missing_aria_label_web", | |
| "add_selected_state_to_radio", | |
| "fix_disabled_state_and_locked_hint", | |
| "add_content_description_native_android", | |
| "missing_label_native_button", | |
| "state_announcement_checkbox_onboarding", | |
| "activity_status_hint", | |
| "aria_disabled_state", | |
| "stepper_aria_current_step_web", | |
| "missing_aria_labelledby_field_context", | |
| "forward_aria_popup_attrs_through_wrapper", | |
| "missing_accessibility_announcer_on_copy", | |
| "missing_aria_expanded_collapsible_web", | |
| "dynamic_aria_label_state_web", | |
| "add_expanded_state_native", | |
| "missing_label_form_field_web", | |
| "missing_accessibilitylabel_design_system_textinput", | |
| "aria_required_form_control", | |
| "nested_button_role_presentation", | |
| "missing_tab_role_web", | |
| "aria_hidden_decorative_text_web", | |
| "aria_hidden_decorative_icon_text", | |
| "select_aria_label_includes_value_web", | |
| "anchor_role_link_override", | |
| "add_aria_pressed_toggle_web", | |
| "checkbox_role_web_listbox_to_group", | |
| "native_form_field_labelledby_association", | |
| "context_menu_role_override", | |
| "ios_checkbox_role_switch_workaround", | |
| "menu_button_descriptive_label_hint", | |
| "fix_checkbox_checked_state_native", | |
| "missing_label_voice_state_inclusion", | |
| "missing_a11y_label_mention_count", | |
| "contextual_dismiss_button_label", | |
| "missing_label_clear_button_context", | |
| "tree_multiselectable_false_web", | |
| "intl_message_to_aria_label_web", | |
| "conditional_interactive_wrapper_web", | |
| "missing_role_button_to_link_correction", | |
| "missing_role_link_nested_text", | |
| "missing_role_link_intl_format_migration", | |
| "spoiler_reveal_all_custom_action_android", | |
| "spoiler_reveal_all_voiceover_ios", | |
| "missing_role_region_on_scroll_container", | |
| "missing_label_redundant_cleanup", | |
| "slider_external_value_sync", | |
| "missing_label_label_hint_value_separation", | |
| "preview_hiding_descendants_propagation", | |
| "missing_label_close_dismiss_button", | |
| "missing_role_nested_buttons_flatten", | |
| "missing_role_double_focus_inner_image", | |
| "missing_role_button_on_pressable", | |
| "state_announcement_toggle_stable_label", | |
| "missing_role_duplicate_role_conflict", | |
| "missing_role_link_semantic_role", | |
| "tooltip_redundant_announcement_hidden", | |
| "custom_action_nested_interactive_workaround", | |
| "remove_incorrect_role_trait", | |
| "ios_link_workaround_voiceover", | |
| "replace_custom_actions_with_escape_handler", | |
| "custom_actions_null_guild_guard", | |
| "keyboard_only_drag_handle", | |
| "carousel_hide_inactive_slides", | |
| "duplicate_readout_image_alt_removal", | |
| "nested_text_a11y_breakage", | |
| "dm_channel_status_in_label", | |
| "reaction_user_grouping_and_selection", | |
| "view_to_pressable_expandable", | |
| "radio_group_selection_grid", | |
| "keyboard_symbol_a11y_label", | |
| "spoiler_container_a11y_elements", | |
| "aria_hidden_inactive_ui", | |
| "checkbox_to_table_checkbox_row", | |
| "color_picker_color_name_label" | |
| ], | |
| "property_test_exists": false | |
| }, | |
| "1.3.1": { | |
| "name": "Info and relationships", | |
| "ticket_count": 74, | |
| "fix_patterns": [ | |
| "missing_label_category_list_grouping", | |
| "missing_role_heading_markup", | |
| "missing_aria_label_web", | |
| "heading_role_rn_prop_threading", | |
| "heading_role_legacy_text_migration", | |
| "heading_role_native_platform_specific", | |
| "unique_repeated_button_labels", | |
| "fix_missing_status_in_label", | |
| "grouping_nested_button_android", | |
| "heading_role_legacy_text_to_heading", | |
| "heading_role_add_accessibility_role", | |
| "grouping_guild_invite_button_android", | |
| "heading_role_text_to_heading_component", | |
| "heading_role_member_verification_alert", | |
| "heading_markup_web_settings_useTitle", | |
| "screen_reader_individual_items", | |
| "contextual_button_labels", | |
| "tab_position_announcement", | |
| "contextual_caret_aria_label_web", | |
| "stepper_aria_current_step_web", | |
| "missing_aria_required_form_components", | |
| "aria_labelledby_poll_accessories", | |
| "search_results_live_region_web", | |
| "divider_role_separator_in_listbox", | |
| "accessible_container_grouping", | |
| "aria_required_form_control", | |
| "missing_tab_role_web", | |
| "add_duration_to_voice_channel_label", | |
| "step_indicator_tablist_role_web", | |
| "character_count_accessible_association", | |
| "aria_describedby_context_association_web", | |
| "missing_aria_label_voice_message_web", | |
| "stepper_disabled_steps_web", | |
| "aria_hidden_measurement_element_web", | |
| "inert_selective_preview_web", | |
| "aria_table_roles_web", | |
| "voice_user_mute_status_in_aria_label", | |
| "field_control_labelid_fallback_web", | |
| "add_aria_pressed_toggle_button", | |
| "missing_aria_activedescendant_listbox", | |
| "character_limit_live_announcement", | |
| "missing_label_accessible_time_format", | |
| "progress_indicator_hidden_by_parent", | |
| "missing_progressbar_role_value", | |
| "checkbox_state_checked_not_selected", | |
| "character_count_accessible_label_native", | |
| "slider_missing_accessibility_value", | |
| "missing_label_emoji_context", | |
| "missing_label_icon_context_prefix", | |
| "missing_label_tag_semantic_context", | |
| "heading_level_hierarchy_web", | |
| "spoiler_reveal_all_custom_action_android", | |
| "spoiler_reveal_all_voiceover_ios", | |
| "missing_role_region_on_scroll_container", | |
| "missing_role_header_on_logo_image", | |
| "missing_label_label_hint_value_separation", | |
| "missing_label_icon_semantic_meaning", | |
| "preview_hiding_spoiler_screen_reader", | |
| "missing_label_bulleted_list_readable", | |
| "custom_action_nested_interactive_workaround", | |
| "carousel_hide_inactive_slides", | |
| "abbreviated_timestamp_a11y_label", | |
| "hidden_heading_in_tabpanel", | |
| "dm_channel_status_in_label", | |
| "reaction_user_grouping_and_selection", | |
| "radio_group_selection_grid", | |
| "inert_text_in_list_item", | |
| "dialog_role_popout", | |
| "checkbox_to_table_checkbox_row", | |
| "a11y_group_info_cards" | |
| ], | |
| "property_test_exists": false | |
| }, | |
| "1.1.1": { | |
| "name": "Non-text content", | |
| "ticket_count": 12, | |
| "fix_patterns": [ | |
| "missing_label_preview_decorative_content", | |
| "missing_aria_label_web", | |
| "locked_channel_label", | |
| "state_announcement_badge", | |
| "add_label_to_collectible_item", | |
| "group_icon_and_label_for_focus", | |
| "focus_order_segmented_control_preview", | |
| "descriptive_label_animation", | |
| "activity_status_hint", | |
| "preview_alt_text_and_tree_hiding", | |
| "edit_collectible_preview_label", | |
| "add_progressbar_role_web", | |
| "aria_hidden_decorative_svg_web", | |
| "web_focusblock_preview_aria_hidden", | |
| "svg_foreignobject_alt_empty", | |
| "hide_decorative_animation_native", | |
| "missing_role_header_on_logo_image", | |
| "missing_label_close_dismiss_button", | |
| "missing_label_icon_semantic_meaning", | |
| "duplicate_readout_image_alt_removal", | |
| "keyboard_symbol_a11y_label", | |
| "facepile_avatar_hide_descendants", | |
| "color_picker_color_name_label" | |
| ], | |
| "property_test_exists": false | |
| }, | |
| "4.1.3": { | |
| "name": "Status Messages", | |
| "ticket_count": 10, | |
| "fix_patterns": [ | |
| "aria_live_persistent_container", | |
| "missing_announcer_action_success", | |
| "missing_announcer_creation_event", | |
| "announcer_action_confirmation", | |
| "announcer_item_removal", | |
| "announce_state_change_on_leave", | |
| "error_text_announcer", | |
| "announce_pending_unsaved_changes" | |
| ], | |
| "property_test_exists": false | |
| }, | |
| "2.4.3": { | |
| "name": "Focus Order", | |
| "ticket_count": 7, | |
| "fix_patterns": [ | |
| "missing_label_icon_button_role", | |
| "missing_label_preview_decorative_content", | |
| "expose_voice_user_focus_and_status", | |
| "group_icon_and_label_for_focus", | |
| "focus_order_segmented_control_preview", | |
| "focus_restore_after_picker", | |
| "focus_order_absolute_header", | |
| "preview_alt_text_and_tree_hiding", | |
| "focus_reset_audio_playback", | |
| "screen_reader_individual_items", | |
| "focus_order_remove_autofocus_dialog", | |
| "aria_activedescendant_deferred_initial", | |
| "tablist_focus_order_roving_tabindex", | |
| "focus_return_modal_returnref", | |
| "aria_hidden_prop_threading_web", | |
| "missing_aria_expanded_collapsible_web", | |
| "unique_repeated_button_labels_web", | |
| "list_navigator_focus_integration", | |
| "focus_order_img_tabindex_web", | |
| "positive_tabindex_removal_web", | |
| "aria_hidden_decorative_svg_web", | |
| "platform_specific_a11y_hiding", | |
| "focus_order_flex_row_margin_auto", | |
| "skip_programmatic_focus_when_screen_reader", | |
| "voiceover_reading_order_height_equalization", | |
| "focus_order_defer_center_calculation_web", | |
| "focus_management_slide_ready_web", | |
| "focus_order_modal_stacking_web", | |
| "phantom_element_aria_hidden_web", | |
| "remove_unconditional_focus_steal_web", | |
| "focus_return_modal_returnref_web", | |
| "focus_management_after_scroll", | |
| "focus_order_dom_reorder_css_visual", | |
| "focus_return_popout_returnref", | |
| "focus_set_on_screen_mount", | |
| "focus_initial_mount_header", | |
| "hidden_element_conditional_aria_hidden", | |
| "accessible_true_on_labeled_view", | |
| "navigator_focus_tracking", | |
| "focus_order_accessible_prop_parity", | |
| "focus_order_display_none_to_visually_hidden", | |
| "focus_management_focus_block_dynamic_children", | |
| "focus_management_header_priority_android", | |
| "focus_management_floating_header_ios", | |
| "focus_management_voice_panel_trap", | |
| "focus_management_bottom_sheet_modal_trap", | |
| "focus_management_quest_dock_backdrop_dismiss", | |
| "inert_text_in_list_item", | |
| "dialog_role_popout", | |
| "focus_after_list_deletion", | |
| "set_a11y_focus_after_action", | |
| "aria_hidden_inactive_ui", | |
| "first_focusable_element_dynamic" | |
| ], | |
| "property_test_exists": false | |
| }, | |
| "2.5.3": { | |
| "name": "Label in Name", | |
| "ticket_count": 3, | |
| "fix_patterns": [ | |
| "tooltip_emoji_accessible_name", | |
| "aria_label_include_visible_text", | |
| "missing_label_redundant_cleanup" | |
| ], | |
| "property_test_exists": false | |
| }, | |
| "2.4.7": { | |
| "name": "Focus Visible", | |
| "ticket_count": 2, | |
| "fix_patterns": [ | |
| "focus_visibility_css", | |
| "listbox_option_focus_tracking", | |
| "forced_focus_ring_non_keyboard" | |
| ], | |
| "property_test_exists": false | |
| }, | |
| "2.1.1": { | |
| "name": "Keyboard", | |
| "ticket_count": 13, | |
| "fix_patterns": [ | |
| "missing_label_icon_button_role", | |
| "add_a11y_custom_action_for_long_press", | |
| "state_announcement_checkbox_onboarding", | |
| "redundant_focusable_intl_anchor", | |
| "slider_keyboard_all_arrows", | |
| "aria_hidden_decorative_animation_web", | |
| "keyboard_trap_escape_handler_popout", | |
| "keyboard_navigation_enter_key_toggle", | |
| "keyboard_navigation_nvda_dnd_application_role", | |
| "slider_external_value_sync", | |
| "ios_link_workaround_voiceover", | |
| "header_transparent_unfocusable_workaround", | |
| "tooltip_keyboard_focus_trap_delay", | |
| "replace_custom_actions_with_escape_handler", | |
| "keyboard_only_drag_handle", | |
| "hover_to_hover_or_focus", | |
| "view_to_pressable_expandable", | |
| "nested_interactive_extraction" | |
| ], | |
| "property_test_exists": false | |
| }, | |
| "1.4.10": { | |
| "name": "Reflow", | |
| "ticket_count": 1, | |
| "fix_patterns": [ | |
| "remove_max_line_height_for_text_resize", | |
| "disable_font_scaling_in_fixed_container", | |
| "css_reflow_grid_responsive" | |
| ], | |
| "property_test_exists": false | |
| }, | |
| "1.4.11": { | |
| "name": "Non-text contrast", | |
| "ticket_count": 8, | |
| "fix_patterns": [ | |
| "contrast_fix_opacity_removal", | |
| "contrast_fix_background_token_swap", | |
| "contrast_fix_icon_token_migration", | |
| "contrast_fix_raw_color_to_semantic_token", | |
| "contrast_fix_icon_element_color_prop", | |
| "contrast_fix_gradient_position_mismatch" | |
| ], | |
| "property_test_exists": false | |
| }, | |
| "3.2.2": { | |
| "name": "On Input", | |
| "ticket_count": 8, | |
| "fix_patterns": [ | |
| "combobox_aria_autocomplete_web", | |
| "search_results_live_region_web", | |
| "autofocus_removal_focus_management" | |
| ], | |
| "property_test_exists": false | |
| }, | |
| "3.3.2": { | |
| "name": "Labels or Instructions", | |
| "ticket_count": 7, | |
| "fix_patterns": [ | |
| "missing_aria_required_form_components", | |
| "descriptive_tooltip_i18n_string", | |
| "custom_actions_hint_announcement", | |
| "missing_label_form_input_native", | |
| "native_form_field_labelledby_association", | |
| "announce_search_results_count" | |
| ], | |
| "property_test_exists": false | |
| }, | |
| "2.4.6": { | |
| "name": "Headings and Labels", | |
| "ticket_count": 24, | |
| "fix_patterns": [ | |
| "contextual_clear_button_label", | |
| "contextual_remove_button_label", | |
| "add_accessibility_label_to_media", | |
| "fix_i18n_key_mismatch_native", | |
| "expose_voice_user_focus_and_status", | |
| "fix_disabled_state_and_locked_hint", | |
| "add_label_to_guild_icon", | |
| "descriptive_label_voice_channel_members", | |
| "descriptive_label_online_status", | |
| "descriptive_label_channel_activities", | |
| "contextual_button_labels", | |
| "contextual_aria_label_web_buttons", | |
| "select_aria_label_include_value", | |
| "tab_role_replace_heading_web", | |
| "nested_button_role_presentation", | |
| "heading_level_force_h1_web", | |
| "heading_level_hierarchy_web", | |
| "hide_native_file_input_from_sr", | |
| "descriptive_alt_text_web_img_role", | |
| "section_list_accessibility_label", | |
| "unique_caret_aria_label_web", | |
| "hidden_heading_in_tabpanel" | |
| ], | |
| "property_test_exists": false | |
| }, | |
| "1.4.3": { | |
| "name": "Contrast (minimum)", | |
| "ticket_count": 10, | |
| "fix_patterns": [ | |
| "contrast_fix_text_token_category_mismatch", | |
| "contrast_fix_opacity_removal", | |
| "contrast_fix_token_swap_brand_text", | |
| "role_color_accessibility_store_check" | |
| ], | |
| "property_test_exists": false | |
| }, | |
| "2.1.2": { | |
| "name": "No keyboard trap", | |
| "ticket_count": 1, | |
| "fix_patterns": [ | |
| "focus_trap_dynamic_content_aria_live", | |
| "focus_management_voice_panel_trap", | |
| "tooltip_keyboard_focus_trap_delay" | |
| ], | |
| "property_test_exists": false | |
| }, | |
| "3.3.1": { | |
| "name": "Error Identification", | |
| "ticket_count": 1, | |
| "fix_patterns": [ | |
| "aria_live_error_announcement", | |
| "error_announcement_toast_to_inline", | |
| "error_text_announcer" | |
| ], | |
| "property_test_exists": false | |
| }, | |
| "2.5.1": { | |
| "name": "Pointer Gestures", | |
| "ticket_count": 1, | |
| "fix_patterns": [], | |
| "property_test_exists": false | |
| }, | |
| "2.2.2": { | |
| "name": "Pause, Stop, Hide", | |
| "ticket_count": 1, | |
| "fix_patterns": [], | |
| "property_test_exists": false | |
| }, | |
| "2.5.7": { | |
| "name": "Dragging Movements", | |
| "ticket_count": 1, | |
| "fix_patterns": [], | |
| "property_test_exists": false | |
| }, | |
| "1.3.4": { | |
| "name": "Orientation", | |
| "ticket_count": 1, | |
| "fix_patterns": [], | |
| "property_test_exists": false | |
| }, | |
| "2.2.1": { | |
| "name": "Timing Adjustable", | |
| "ticket_count": 1, | |
| "fix_patterns": [ | |
| "screen_reader_timer_guard" | |
| ], | |
| "property_test_exists": false | |
| }, | |
| "1.3.2": { | |
| "name": "Meaningful sequence", | |
| "ticket_count": 1, | |
| "fix_patterns": [ | |
| "focus_order_absolute_header", | |
| "voiceover_reading_order_height_equalization", | |
| "focus_management_header_priority_android", | |
| "spoiler_container_a11y_elements" | |
| ], | |
| "property_test_exists": false | |
| } | |
| } | |
| } |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| [ | |
| { | |
| "gid": "1213458418331822", | |
| "title": "[A11y] GDC - Community Article: Truncated logo content at 200% zoom", | |
| "status": "done", | |
| "classification": "blocked", | |
| "has_cap_comment": true, | |
| "fix_status": null, | |
| "failure_type": null, | |
| "pr_url": null, | |
| "branch": null, | |
| "pattern": null, | |
| "learning": null | |
| }, | |
| { | |
| "gid": "1213687482319433", | |
| "title": "[A11y] Voice and Video Calling: Input volume visualizer not announced with a name", | |
| "status": "done", | |
| "classification": "automatable", | |
| "has_cap_comment": true, | |
| "fix_status": "pending", | |
| "failure_type": null, | |
| "pr_url": null, | |
| "branch": null, | |
| "pattern": null, | |
| "learning": null, | |
| "platform": "web" | |
| }, | |
| { | |
| "gid": "1213687482319441", | |
| "title": "[A11y] Voice and Video Calling: More options buttons not grouped by association", | |
| "status": "done", | |
| "classification": "automatable", | |
| "has_cap_comment": true, | |
| "fix_status": "pending", | |
| "failure_type": null, | |
| "pr_url": null, | |
| "branch": null, | |
| "pattern": null, | |
| "learning": null, | |
| "platform": "web" | |
| }, | |
| { | |
| "gid": "1213687482319445", | |
| "title": "[A11y] Voice and Video Calling: Input volume visualizer displays are not announced by screen reader", | |
| "status": "done", | |
| "classification": "automatable", | |
| "has_cap_comment": true, | |
| "fix_status": "pending", | |
| "failure_type": null, | |
| "pr_url": null, | |
| "branch": null, | |
| "pattern": null, | |
| "learning": null | |
| }, | |
| { | |
| "gid": "1213687482319449", | |
| "title": "[A11y] Voice and Video Calling: User typing in chat not announced", | |
| "status": "done", | |
| "classification": "automatable", | |
| "has_cap_comment": true, | |
| "fix_status": "pending", | |
| "failure_type": null, | |
| "pr_url": null, | |
| "branch": null, | |
| "pattern": null, | |
| "learning": null | |
| }, | |
| { | |
| "gid": "1213688763200081", | |
| "title": "[A11y] Voice and Video Calling: Focus does not begin at top of 'Hey there TAB friend' dialog", | |
| "status": "done", | |
| "classification": "automatable", | |
| "has_cap_comment": true, | |
| "fix_status": "done", | |
| "failure_type": null, | |
| "pr_url": "https://github.com/discord/discord/pull/272962", | |
| "branch": "a11y/fix-1213688763200081", | |
| "pattern": "focus_order_remove_autofocus_dialog", | |
| "learning": "Modal gated behind isNewUser() + 5-Tab counter + seen flag + hasAnyModalOpen(). Must bypass isNewUser, set counter to 1, reset seen flag, dismiss dev warning, then Tab.", | |
| "platform": "web" | |
| }, | |
| { | |
| "gid": "1213688763200089", | |
| "title": "[A11y] Presence: My Account - Actions button not grouped with user name", | |
| "status": "done", | |
| "classification": "automatable", | |
| "has_cap_comment": true, | |
| "fix_status": "pending", | |
| "failure_type": null, | |
| "pr_url": null, | |
| "branch": null, | |
| "pattern": null, | |
| "learning": null | |
| }, | |
| { | |
| "gid": "1213688763200093", | |
| "title": "[A11y] Presence: My Account - Banner color options not announced with alternative text", | |
| "status": "done", | |
| "classification": "automatable", | |
| "has_cap_comment": true, | |
| "fix_status": "pending", | |
| "failure_type": null, | |
| "pr_url": null, | |
| "branch": null, | |
| "pattern": null, | |
| "learning": null | |
| }, | |
| { | |
| "gid": "1213688763200097", | |
| "title": "[A11y] Presence: My Account - Set your status current emoji not announced", | |
| "status": "done", | |
| "classification": "automatable", | |
| "has_cap_comment": true, | |
| "fix_status": "pending", | |
| "failure_type": null, | |
| "pr_url": null, | |
| "branch": null, | |
| "pattern": null, | |
| "learning": null | |
| }, | |
| { | |
| "gid": "1213688763200101", | |
| "title": "Duplicate of [A11y] Presence: My Account - Set your status current emoji not announced", | |
| "status": "done", | |
| "classification": "manual", | |
| "has_cap_comment": true, | |
| "fix_status": null, | |
| "failure_type": null, | |
| "pr_url": null, | |
| "branch": null, | |
| "pattern": null, | |
| "learning": null | |
| }, | |
| { | |
| "gid": "1213688763200111", | |
| "title": "[A11y] Voice and Video Calling: Focus does not begin at top of 'Voice & Video' overlay", | |
| "status": "done", | |
| "classification": "manual", | |
| "has_cap_comment": true, | |
| "fix_status": null, | |
| "failure_type": null, | |
| "pr_url": null, | |
| "branch": null, | |
| "pattern": null, | |
| "learning": null | |
| }, | |
| { | |
| "gid": "1213688763200115", | |
| "title": "[A11y] Voice and Video Calling: Channel expansion and creation not included in focus order when inactive", | |
| "status": "done", | |
| "classification": "manual", | |
| "has_cap_comment": true, | |
| "fix_status": null, | |
| "failure_type": null, | |
| "pr_url": null, | |
| "branch": null, | |
| "pattern": null, | |
| "learning": null | |
| }, | |
| { | |
| "gid": "1213688763200119", | |
| "title": "[A11y] Voice and Video Calling: Mic Test updates are not announced by screen reader", | |
| "status": "done", | |
| "classification": "automatable", | |
| "has_cap_comment": true, | |
| "fix_status": "pending", | |
| "failure_type": null, | |
| "pr_url": null, | |
| "branch": null, | |
| "pattern": null, | |
| "learning": null | |
| }, | |
| { | |
| "gid": "1213688763200123", | |
| "title": "[A11y] Presence: My Account - Focus does not begin at the top of Set your status Emoji picker ", | |
| "status": "done", | |
| "classification": "automatable", | |
| "has_cap_comment": true, | |
| "fix_status": "pending", | |
| "failure_type": null, | |
| "pr_url": null, | |
| "branch": null, | |
| "pattern": null, | |
| "learning": null, | |
| "platform": "web" | |
| }, | |
| { | |
| "gid": "1213688763200085", | |
| "title": "[A11y] Presence: My Account profile image and avatar animation are not announced", | |
| "status": "done", | |
| "classification": "automatable", | |
| "has_cap_comment": true, | |
| "fix_status": "pending", | |
| "failure_type": null, | |
| "pr_url": null, | |
| "branch": null, | |
| "pattern": null, | |
| "learning": null | |
| }, | |
| { | |
| "gid": "1213688763200105", | |
| "title": "[A11y] Presence: Status emojis announced as 'unlabeled' ", | |
| "status": "done", | |
| "classification": "automatable", | |
| "has_cap_comment": true, | |
| "fix_status": "pending", | |
| "failure_type": null, | |
| "pr_url": null, | |
| "branch": null, | |
| "pattern": null, | |
| "learning": null | |
| }, | |
| { | |
| "gid": "1213719437486601", | |
| "title": "[A11y] Create account - DOB picker lacks visible focus", | |
| "status": "done", | |
| "classification": "automatable", | |
| "has_cap_comment": true, | |
| "fix_status": "pending", | |
| "failure_type": null, | |
| "pr_url": null, | |
| "branch": null, | |
| "pattern": null, | |
| "learning": null | |
| }, | |
| { | |
| "gid": "1213719433710592", | |
| "title": "[A11y] Create account - Puzzle verification cannot be solved with keyboard controls", | |
| "status": "done", | |
| "classification": "blocked", | |
| "has_cap_comment": true, | |
| "fix_status": null, | |
| "failure_type": null, | |
| "pr_url": null, | |
| "branch": null, | |
| "pattern": null, | |
| "learning": null | |
| }, | |
| { | |
| "gid": "1213719433710596", | |
| "title": "[A11y] Account Settings- Nitro buttons in user page receive focus twice", | |
| "status": "done", | |
| "classification": "automatable", | |
| "has_cap_comment": true, | |
| "fix_status": "pending", | |
| "failure_type": null, | |
| "pr_url": null, | |
| "branch": null, | |
| "pattern": null, | |
| "learning": null | |
| }, | |
| { | |
| "gid": "1213719433710600", | |
| "title": "[A11y] Discover: Discover requires Horizontal scrolling at 200% zoom", | |
| "status": "done", | |
| "classification": "automatable", | |
| "has_cap_comment": true, | |
| "fix_status": "pending", | |
| "failure_type": null, | |
| "pr_url": null, | |
| "branch": null, | |
| "pattern": null, | |
| "learning": null | |
| }, | |
| { | |
| "gid": "1213719433710604", | |
| "title": "[A11y] Making and Managing Friends: Buttons on other users profile are truncated at 200%", | |
| "status": "done", | |
| "classification": "manual", | |
| "has_cap_comment": true, | |
| "fix_status": null, | |
| "failure_type": null, | |
| "pr_url": null, | |
| "branch": null, | |
| "pattern": null, | |
| "learning": null | |
| }, | |
| { | |
| "gid": "1213719433710608", | |
| "title": "[A11y] Making and Managing Friends: Close buttons overlap on other users profile at 200%", | |
| "status": "done", | |
| "classification": "manual", | |
| "has_cap_comment": true, | |
| "fix_status": null, | |
| "failure_type": null, | |
| "pr_url": null, | |
| "branch": null, | |
| "pattern": null, | |
| "learning": null | |
| }, | |
| { | |
| "gid": "1213738534601644", | |
| "title": "[A11y][Windows] Authoring and Interacting with Content: Controls on audio messages do not meet non-text contrast of 3:1", | |
| "status": "done", | |
| "classification": "manual", | |
| "has_cap_comment": true, | |
| "fix_status": null, | |
| "failure_type": null, | |
| "pr_url": null, | |
| "branch": null, | |
| "pattern": null, | |
| "learning": null | |
| }, | |
| { | |
| "gid": "1213738534601652", | |
| "title": "[A11y][Windows] Authoring and Interacting with Content: Media in full screen has truncated close button at 200% zoom", | |
| "status": "done", | |
| "classification": "manual", | |
| "has_cap_comment": true, | |
| "fix_status": null, | |
| "failure_type": null, | |
| "pr_url": null, | |
| "branch": null, | |
| "pattern": null, | |
| "learning": null | |
| }, | |
| { | |
| "gid": "1213738534601656", | |
| "title": "[A11y] [Windows] Authoring and Interacting with Content: Chat search bar content and clear button truncated at 200% zoom", | |
| "status": "done", | |
| "classification": "manual", | |
| "has_cap_comment": true, | |
| "fix_status": null, | |
| "failure_type": null, | |
| "pr_url": null, | |
| "branch": null, | |
| "pattern": null, | |
| "learning": null | |
| }, | |
| { | |
| "gid": "1213719384773539", | |
| "title": "[Windows] Add Friend: Added new tab to content is not announced", | |
| "status": "done", | |
| "classification": "automatable", | |
| "has_cap_comment": true, | |
| "fix_status": "pending", | |
| "failure_type": null, | |
| "pr_url": null, | |
| "branch": null, | |
| "pattern": null, | |
| "learning": null | |
| }, | |
| { | |
| "gid": "1213719384773553", | |
| "title": "[Windows] Add Friend: Tabs are skipped with focus mode", | |
| "status": "done", | |
| "classification": "automatable", | |
| "has_cap_comment": true, | |
| "fix_status": "pending", | |
| "failure_type": null, | |
| "pr_url": null, | |
| "branch": null, | |
| "pattern": null, | |
| "learning": null | |
| }, | |
| { | |
| "gid": "1213719416539025", | |
| "title": "[Windows] Add Friend: Closing dialog modal resets focus to top of content", | |
| "status": "done", | |
| "classification": "automatable", | |
| "has_cap_comment": true, | |
| "fix_status": "pending", | |
| "failure_type": null, | |
| "pr_url": null, | |
| "branch": null, | |
| "pattern": null, | |
| "learning": null | |
| }, | |
| { | |
| "gid": "1213719416539029", | |
| "title": "[Windows] Create Event - Timeline steps have a button role and are not selectable and current step is not announced", | |
| "status": "done", | |
| "classification": "automatable", | |
| "has_cap_comment": true, | |
| "fix_status": "pending", | |
| "failure_type": null, | |
| "pr_url": null, | |
| "branch": null, | |
| "pattern": null, | |
| "learning": null, | |
| "platform": "web" | |
| }, | |
| { | |
| "gid": "1213719416539033", | |
| "title": "[Windows] Create Event - Radio buttons do not have an accessible label announced", | |
| "status": "done", | |
| "classification": "automatable", | |
| "has_cap_comment": true, | |
| "fix_status": "pending", | |
| "failure_type": null, | |
| "pr_url": null, | |
| "branch": null, | |
| "pattern": null, | |
| "learning": null | |
| }, | |
| { | |
| "gid": "1213719416539037", | |
| "title": "[Windows] Create Event - Radio buttons do not receive focus with NVDA focus mode or keyboard only", | |
| "status": "done", | |
| "classification": "manual", | |
| "has_cap_comment": true, | |
| "fix_status": null, | |
| "failure_type": null, | |
| "pr_url": null, | |
| "branch": null, | |
| "pattern": null, | |
| "learning": null | |
| }, | |
| { | |
| "gid": "1213719416539043", | |
| "title": "[Windows] Create Event - Start and End date buttons do not have accessible label announced", | |
| "status": "done", | |
| "classification": "automatable", | |
| "has_cap_comment": true, | |
| "fix_status": "pending", | |
| "failure_type": null, | |
| "pr_url": null, | |
| "branch": null, | |
| "pattern": null, | |
| "learning": null | |
| }, | |
| { | |
| "gid": "1213719416539047", | |
| "title": "[Windows] Create Event - Hidden button receives focus with screen reader", | |
| "status": "done", | |
| "classification": "automatable", | |
| "has_cap_comment": true, | |
| "fix_status": "pending", | |
| "failure_type": null, | |
| "pr_url": null, | |
| "branch": null, | |
| "pattern": null, | |
| "learning": null | |
| }, | |
| { | |
| "gid": "1213719416539051", | |
| "title": "[Windows] Many Locations: Create Event - Required input is not announced as required with screen reader", | |
| "status": "done", | |
| "classification": "automatable", | |
| "has_cap_comment": true, | |
| "fix_status": "pending", | |
| "failure_type": null, | |
| "pr_url": null, | |
| "branch": null, | |
| "pattern": null, | |
| "learning": null | |
| }, | |
| { | |
| "gid": "1213719416539057", | |
| "title": "[Windows] Create Event - Event frequency button does not have a state, correct role or current menu item announced", | |
| "status": "done", | |
| "classification": "automatable", | |
| "has_cap_comment": true, | |
| "fix_status": "pending", | |
| "failure_type": null, | |
| "pr_url": null, | |
| "branch": null, | |
| "pattern": null, | |
| "learning": null | |
| }, | |
| { | |
| "gid": "1213719416539099", | |
| "title": "[Windows] Message Content - Duration button does not have a state, correct role or current menu item announced", | |
| "status": "done", | |
| "classification": "automatable", | |
| "has_cap_comment": true, | |
| "fix_status": "pending", | |
| "failure_type": null, | |
| "pr_url": null, | |
| "branch": null, | |
| "pattern": null, | |
| "learning": null | |
| }, | |
| { | |
| "gid": "1213719416539103", | |
| "title": "[Windows] Message Content - Poll message does not have description ", | |
| "status": "done", | |
| "classification": "automatable", | |
| "has_cap_comment": true, | |
| "fix_status": "pending", | |
| "failure_type": null, | |
| "pr_url": null, | |
| "branch": null, | |
| "pattern": null, | |
| "learning": null | |
| }, | |
| { | |
| "gid": "1213719416539107", | |
| "title": "[Windows] Message Content - Number announced does not have association as character count", | |
| "status": "done", | |
| "classification": "automatable", | |
| "has_cap_comment": true, | |
| "fix_status": "pending", | |
| "failure_type": null, | |
| "pr_url": null, | |
| "branch": null, | |
| "pattern": null, | |
| "learning": null, | |
| "platform": "web" | |
| }, | |
| { | |
| "gid": "1213719416539061", | |
| "title": "[Windows] Create Event - Selected and current date in calendar modal are not announced", | |
| "status": "done", | |
| "classification": "manual", | |
| "has_cap_comment": true, | |
| "fix_status": null, | |
| "failure_type": null, | |
| "pr_url": null, | |
| "branch": null, | |
| "pattern": null, | |
| "learning": null | |
| }, | |
| { | |
| "gid": "1213719416539111", | |
| "title": "[Windows] Create Event - Buttons for created events do not have descriptive accessible name label announced", | |
| "status": "done", | |
| "classification": "automatable", | |
| "has_cap_comment": true, | |
| "fix_status": "pending", | |
| "failure_type": null, | |
| "pr_url": null, | |
| "branch": null, | |
| "pattern": null, | |
| "learning": null | |
| }, | |
| { | |
| "gid": "1213719416539065", | |
| "title": "[Windows] Many Locations: Create Event - Copied status message is not announced", | |
| "status": "done", | |
| "classification": "automatable", | |
| "has_cap_comment": true, | |
| "fix_status": "pending", | |
| "failure_type": null, | |
| "pr_url": null, | |
| "branch": null, | |
| "pattern": null, | |
| "learning": null | |
| }, | |
| { | |
| "gid": "1213719416539071", | |
| "title": "[Windows] Many Locations: Create Event - Image do not receive focus with descriptive text alternative", | |
| "status": "done", | |
| "classification": "automatable", | |
| "has_cap_comment": true, | |
| "fix_status": "pending", | |
| "failure_type": null, | |
| "pr_url": null, | |
| "branch": null, | |
| "pattern": null, | |
| "learning": null | |
| }, | |
| { | |
| "gid": "1213719384773559", | |
| "title": "[Windows] Many Locations: Add Friend - Buttons do not have unique and descriptive accessible label", | |
| "status": "done", | |
| "classification": "automatable", | |
| "has_cap_comment": true, | |
| "fix_status": "pending", | |
| "failure_type": null, | |
| "pr_url": null, | |
| "branch": null, | |
| "pattern": null, | |
| "learning": null | |
| }, | |
| { | |
| "gid": "1213719416538983", | |
| "title": "[Windows] Add Friend - Content is skipped in Pending tab content", | |
| "status": "done", | |
| "classification": "manual", | |
| "has_cap_comment": true, | |
| "fix_status": null, | |
| "failure_type": null, | |
| "pr_url": null, | |
| "branch": null, | |
| "pattern": null, | |
| "learning": null | |
| }, | |
| { | |
| "gid": "1213719416538987", | |
| "title": "[Windows] Events - Events button does not receive focus", | |
| "status": "done", | |
| "classification": "manual", | |
| "has_cap_comment": true, | |
| "fix_status": null, | |
| "failure_type": null, | |
| "pr_url": null, | |
| "branch": null, | |
| "pattern": null, | |
| "learning": null | |
| }, | |
| { | |
| "gid": "1213719416538991", | |
| "title": "[Windows] Add Friend - Confirmation status message for request sent is not announced when displayed", | |
| "status": "done", | |
| "classification": "automatable", | |
| "has_cap_comment": true, | |
| "fix_status": "pending", | |
| "failure_type": null, | |
| "pr_url": null, | |
| "branch": null, | |
| "pattern": null, | |
| "learning": null | |
| }, | |
| { | |
| "gid": "1213719416538995", | |
| "title": "[Windows] Add Friend - User account button does not have descriptive accessible label or role announced", | |
| "status": "done", | |
| "classification": "automatable", | |
| "has_cap_comment": true, | |
| "fix_status": "pending", | |
| "failure_type": null, | |
| "pr_url": null, | |
| "branch": null, | |
| "pattern": null, | |
| "learning": null | |
| }, | |
| { | |
| "gid": "1213719416538999", | |
| "title": "[Windows] Add Friend - Auto complete search results are not announced ", | |
| "status": "done", | |
| "classification": "automatable", | |
| "has_cap_comment": true, | |
| "fix_status": "pending", | |
| "failure_type": null, | |
| "pr_url": null, | |
| "branch": null, | |
| "pattern": null, | |
| "learning": null | |
| }, | |
| { | |
| "gid": "1213719416539007", | |
| "title": "[Windows] Create Group - Auto complete search results are not announced ", | |
| "status": "done", | |
| "classification": "automatable", | |
| "has_cap_comment": true, | |
| "fix_status": "pending", | |
| "failure_type": null, | |
| "pr_url": null, | |
| "branch": null, | |
| "pattern": null, | |
| "learning": null | |
| }, | |
| { | |
| "gid": "1213719416539003", | |
| "title": "[Windows] Create Group - Buttons do not have a state announced", | |
| "status": "done", | |
| "classification": "automatable", | |
| "has_cap_comment": true, | |
| "fix_status": "pending", | |
| "failure_type": null, | |
| "pr_url": null, | |
| "branch": null, | |
| "pattern": null, | |
| "learning": null | |
| }, | |
| { | |
| "gid": "1213719416539011", | |
| "title": "[Windows] Create Group - Expanded content does not receive focus", | |
| "status": "done", | |
| "classification": "automatable", | |
| "has_cap_comment": true, | |
| "fix_status": "pending", | |
| "failure_type": null, | |
| "pr_url": null, | |
| "branch": null, | |
| "pattern": null, | |
| "learning": null | |
| }, | |
| { | |
| "gid": "1213719416539017", | |
| "title": "[Windows] Create Group - Buttons do not have unique and descriptive accessible label", | |
| "status": "done", | |
| "classification": "automatable", | |
| "has_cap_comment": true, | |
| "fix_status": "pending", | |
| "failure_type": null, | |
| "pr_url": null, | |
| "branch": null, | |
| "pattern": null, | |
| "learning": null | |
| }, | |
| { | |
| "gid": "1213719416539021", | |
| "title": "[Windows] Create Group - New Message dialog modal is not announced", | |
| "status": "done", | |
| "classification": "manual", | |
| "has_cap_comment": true, | |
| "fix_status": null, | |
| "failure_type": null, | |
| "pr_url": null, | |
| "branch": null, | |
| "pattern": null, | |
| "learning": null | |
| }, | |
| { | |
| "gid": "1213719416539077", | |
| "title": "[Windows] Message Content: Sent and received messages are not announced when added", | |
| "status": "done", | |
| "classification": "manual", | |
| "has_cap_comment": true, | |
| "fix_status": null, | |
| "failure_type": null, | |
| "pr_url": null, | |
| "branch": null, | |
| "pattern": null, | |
| "learning": null | |
| }, | |
| { | |
| "gid": "1213719416539095", | |
| "title": "[Windows] Message Content: Name of audio file is announced as download button", | |
| "status": "done", | |
| "classification": "automatable", | |
| "has_cap_comment": true, | |
| "fix_status": "pending", | |
| "failure_type": null, | |
| "pr_url": null, | |
| "branch": null, | |
| "pattern": null, | |
| "learning": null | |
| }, | |
| { | |
| "gid": "1213719416539115", | |
| "title": "[Windows] Message Content: Control volume button does not have a descriptive accessible label announced", | |
| "status": "done", | |
| "classification": "automatable", | |
| "has_cap_comment": true, | |
| "fix_status": "pending", | |
| "failure_type": null, | |
| "pr_url": null, | |
| "branch": null, | |
| "pattern": null, | |
| "learning": null | |
| }, | |
| { | |
| "gid": "1213719416539081", | |
| "title": "[Windows] Message Content: Number of mention list items announced does not match visual items", | |
| "status": "done", | |
| "classification": "automatable", | |
| "has_cap_comment": true, | |
| "fix_status": "pending", | |
| "failure_type": null, | |
| "pr_url": null, | |
| "branch": null, | |
| "pattern": null, | |
| "learning": null | |
| }, | |
| { | |
| "gid": "1213719416539085", | |
| "title": "[Windows] Message Content: New separator in messages is not announced with label", | |
| "status": "done", | |
| "classification": "automatable", | |
| "has_cap_comment": true, | |
| "fix_status": "pending", | |
| "failure_type": null, | |
| "pr_url": null, | |
| "branch": null, | |
| "pattern": null, | |
| "learning": null | |
| }, | |
| { | |
| "gid": "1213719416539089", | |
| "title": "[Windows] Message Content: Message date separator is not announced ", | |
| "status": "done", | |
| "classification": "automatable", | |
| "has_cap_comment": true, | |
| "fix_status": "pending", | |
| "failure_type": null, | |
| "pr_url": null, | |
| "branch": null, | |
| "pattern": null, | |
| "learning": null, | |
| "platform": "web" | |
| }, | |
| { | |
| "gid": "1213664353495808", | |
| "title": "[A11y] Group chat: Invite user checkboxes don't receive keyboard only focus", | |
| "status": "done", | |
| "classification": "manual", | |
| "has_cap_comment": true, | |
| "fix_status": null, | |
| "failure_type": null, | |
| "pr_url": null, | |
| "branch": null, | |
| "pattern": null, | |
| "learning": null | |
| }, | |
| { | |
| "gid": "1213664353495800", | |
| "title": "[A11y] Group chat: Number of people in a group chat is not included in label ", | |
| "status": "done", | |
| "classification": "automatable", | |
| "has_cap_comment": true, | |
| "fix_status": "pending", | |
| "failure_type": null, | |
| "pr_url": null, | |
| "branch": null, | |
| "pattern": null, | |
| "learning": null | |
| }, | |
| { | |
| "gid": "1213664353495792", | |
| "title": "[A11y] Voice Channel: Focus lands at the end of the confirmation modal ", | |
| "status": "done", | |
| "classification": "automatable", | |
| "has_cap_comment": true, | |
| "fix_status": "pending", | |
| "failure_type": null, | |
| "pr_url": null, | |
| "branch": null, | |
| "pattern": null, | |
| "learning": null | |
| }, | |
| { | |
| "gid": "1213664353495784", | |
| "title": "[A11y] Voice Channel: Activity name is not included in the label", | |
| "status": "done", | |
| "classification": "automatable", | |
| "has_cap_comment": true, | |
| "fix_status": "pending", | |
| "failure_type": null, | |
| "pr_url": null, | |
| "branch": null, | |
| "pattern": null, | |
| "learning": null | |
| }, | |
| { | |
| "gid": "1213664353495768", | |
| "title": "[A11y] Voice Channel: Discord Sound button lacks a name", | |
| "status": "done", | |
| "classification": "automatable", | |
| "has_cap_comment": true, | |
| "fix_status": "done", | |
| "failure_type": null, | |
| "pr_url": "https://github.com/discord/discord/pull/272961", | |
| "branch": "a11y/fix-1213664353495768", | |
| "pattern": "missing_aria_label_web", | |
| "learning": "rspack HMR updates a11y tree within 3s. browser_snapshot reflects ARIA changes after HMR. No reload needed.", | |
| "platform": "web" | |
| }, | |
| { | |
| "gid": "1213664353495760", | |
| "title": "[A11y] Voice Channel: Member Status button lacks a descritive name", | |
| "status": "done", | |
| "classification": "automatable", | |
| "has_cap_comment": true, | |
| "fix_status": "pending", | |
| "failure_type": null, | |
| "pr_url": null, | |
| "branch": null, | |
| "pattern": null, | |
| "learning": null | |
| }, | |
| { | |
| "gid": "1213647751360310", | |
| "title": "[A11y] Identity: Gifts purchased - Gift button lacks a state", | |
| "status": "done", | |
| "classification": "automatable", | |
| "has_cap_comment": true, | |
| "fix_status": "pending", | |
| "failure_type": null, | |
| "pr_url": null, | |
| "branch": null, | |
| "pattern": null, | |
| "learning": null | |
| }, | |
| { | |
| "gid": "1213647751360314", | |
| "title": "[A11y] Identity: Gifts purchased - Link information and share button not grouped by association", | |
| "status": "done", | |
| "classification": "automatable", | |
| "has_cap_comment": true, | |
| "fix_status": "pending", | |
| "failure_type": null, | |
| "pr_url": null, | |
| "branch": null, | |
| "pattern": null, | |
| "learning": null | |
| }, | |
| { | |
| "gid": "1213647751360294", | |
| "title": "[A11y] Shop: Purchase drawer content truncated at 200%", | |
| "status": "done", | |
| "classification": "automatable", | |
| "has_cap_comment": true, | |
| "fix_status": "pending", | |
| "failure_type": null, | |
| "pr_url": null, | |
| "branch": null, | |
| "pattern": null, | |
| "learning": null | |
| }, | |
| { | |
| "gid": "1213664353495752", | |
| "title": "[A11y] Settings: My Account - Authenticator text field lacks descriptive name", | |
| "status": "done", | |
| "classification": "automatable", | |
| "has_cap_comment": true, | |
| "fix_status": "pending", | |
| "failure_type": null, | |
| "pr_url": null, | |
| "branch": null, | |
| "pattern": null, | |
| "learning": null | |
| }, | |
| { | |
| "gid": "1213664353495744", | |
| "title": "[A11y] Settings: My Account - Authenticator modal QR code is skipped", | |
| "status": "done", | |
| "classification": "automatable", | |
| "has_cap_comment": true, | |
| "fix_status": "pending", | |
| "failure_type": null, | |
| "pr_url": null, | |
| "branch": null, | |
| "pattern": null, | |
| "learning": null | |
| }, | |
| { | |
| "gid": "1213664353495736", | |
| "title": "[A11y] Account: Volume menu - Focus doesn't land at the beginning ", | |
| "status": "done", | |
| "classification": "manual", | |
| "has_cap_comment": true, | |
| "fix_status": null, | |
| "failure_type": null, | |
| "pr_url": null, | |
| "branch": null, | |
| "pattern": null, | |
| "learning": null | |
| }, | |
| { | |
| "gid": "1213664353495728", | |
| "title": "[A11y] Register: Selecting a year resets focus ", | |
| "status": "done", | |
| "classification": "automatable", | |
| "has_cap_comment": true, | |
| "fix_status": "pending", | |
| "failure_type": null, | |
| "pr_url": null, | |
| "branch": null, | |
| "pattern": null, | |
| "learning": null | |
| }, | |
| { | |
| "gid": "1213664353495720", | |
| "title": "[A11y] Register: Date of Birth lack required state", | |
| "status": "done", | |
| "classification": "automatable", | |
| "has_cap_comment": true, | |
| "fix_status": "pending", | |
| "failure_type": null, | |
| "pr_url": null, | |
| "branch": null, | |
| "pattern": null, | |
| "learning": null | |
| }, | |
| { | |
| "gid": "1213664353495712", | |
| "title": "[A11y] Login: QR code is skipped ", | |
| "status": "done", | |
| "classification": "automatable", | |
| "has_cap_comment": true, | |
| "fix_status": "pending", | |
| "failure_type": null, | |
| "pr_url": null, | |
| "branch": null, | |
| "pattern": null, | |
| "learning": null | |
| }, | |
| { | |
| "gid": "1213664353495702", | |
| "title": "[A11y] Settings: Accessibility - Example image is skipped in focus order", | |
| "status": "done", | |
| "classification": "automatable", | |
| "has_cap_comment": true, | |
| "fix_status": "pending", | |
| "failure_type": null, | |
| "pr_url": null, | |
| "branch": null, | |
| "pattern": null, | |
| "learning": null | |
| }, | |
| { | |
| "gid": "1213664353495694", | |
| "title": "[A11y] Settings: Language - Expanded dropdown doesn't receive focus", | |
| "status": "done", | |
| "classification": "manual", | |
| "has_cap_comment": true, | |
| "fix_status": null, | |
| "failure_type": null, | |
| "pr_url": null, | |
| "branch": null, | |
| "pattern": null, | |
| "learning": null | |
| }, | |
| { | |
| "gid": "1213664353495682", | |
| "title": "[A11y] Settings: Multiple locations - Heading elements are missing heading tag", | |
| "status": "done", | |
| "classification": "automatable", | |
| "has_cap_comment": true, | |
| "fix_status": "pending", | |
| "failure_type": null, | |
| "pr_url": null, | |
| "branch": null, | |
| "pattern": null, | |
| "learning": null | |
| }, | |
| { | |
| "gid": "1213664353495674", | |
| "title": "[A11y] Settings: Language - Radio buttons receive focus twice", | |
| "status": "done", | |
| "classification": "automatable", | |
| "has_cap_comment": true, | |
| "fix_status": "pending", | |
| "failure_type": null, | |
| "pr_url": null, | |
| "branch": null, | |
| "pattern": null, | |
| "learning": null | |
| }, | |
| { | |
| "gid": "1213664353495666", | |
| "title": "[A11y] Settings: Appearance - Theme buttons are not identified as dimmed", | |
| "status": "done", | |
| "classification": "automatable", | |
| "has_cap_comment": true, | |
| "fix_status": "pending", | |
| "failure_type": null, | |
| "pr_url": null, | |
| "branch": null, | |
| "pattern": null, | |
| "learning": null | |
| }, | |
| { | |
| "gid": "1213645822428393", | |
| "title": "[A11y] Settings: Notifications - Selected dropdown item is not included in element label", | |
| "status": "done", | |
| "classification": "automatable", | |
| "has_cap_comment": true, | |
| "fix_status": "pending", | |
| "failure_type": null, | |
| "pr_url": null, | |
| "branch": null, | |
| "pattern": null, | |
| "learning": null | |
| }, | |
| { | |
| "gid": "1213645822428385", | |
| "title": "[A11y] Settings: Appearance - Previewing a theme closes settings modal", | |
| "status": "done", | |
| "classification": "manual", | |
| "has_cap_comment": true, | |
| "fix_status": null, | |
| "failure_type": null, | |
| "pr_url": null, | |
| "branch": null, | |
| "pattern": null, | |
| "learning": null | |
| }, | |
| { | |
| "gid": "1213645822428377", | |
| "title": "[A11y] Settings: Multiple locations - Screen reader users cannot operate slider elements", | |
| "status": "done", | |
| "classification": "automatable", | |
| "has_cap_comment": true, | |
| "fix_status": "pending", | |
| "failure_type": null, | |
| "pr_url": null, | |
| "branch": null, | |
| "pattern": null, | |
| "learning": null | |
| }, | |
| { | |
| "gid": "1213645822428369", | |
| "title": "[A11y] Settings tabs lack a selected state", | |
| "status": "done", | |
| "classification": "automatable", | |
| "has_cap_comment": true, | |
| "fix_status": "pending", | |
| "failure_type": null, | |
| "pr_url": null, | |
| "branch": null, | |
| "pattern": null, | |
| "learning": null | |
| }, | |
| { | |
| "gid": "1213600918158051", | |
| "title": "[A11Y] Report User: Get Help Now section headers do not have heading roles", | |
| "status": "done", | |
| "classification": "automatable", | |
| "has_cap_comment": true, | |
| "fix_status": "pending", | |
| "failure_type": null, | |
| "pr_url": null, | |
| "branch": null, | |
| "pattern": null, | |
| "learning": null | |
| }, | |
| { | |
| "gid": "1213600918158053", | |
| "title": "[A11Y] Report User: Report flow next button does not have sufficient color contrast", | |
| "status": "done", | |
| "classification": "manual", | |
| "has_cap_comment": true, | |
| "fix_status": null, | |
| "failure_type": null, | |
| "pr_url": null, | |
| "branch": null, | |
| "pattern": null, | |
| "learning": null | |
| }, | |
| { | |
| "gid": "1213600918158057", | |
| "title": "[A11Y] Create Server: Create server name is truncated at 200% text size", | |
| "status": "done", | |
| "classification": "automatable", | |
| "has_cap_comment": true, | |
| "fix_status": "pending", | |
| "failure_type": null, | |
| "pr_url": null, | |
| "branch": null, | |
| "pattern": null, | |
| "learning": null | |
| }, | |
| { | |
| "gid": "1213600918158059", | |
| "title": "[A11Y] Channel Settings: Channel slowmode setting content is truncated at 200% text size", | |
| "status": "done", | |
| "classification": "automatable", | |
| "has_cap_comment": true, | |
| "fix_status": "pending", | |
| "failure_type": null, | |
| "pr_url": null, | |
| "branch": null, | |
| "pattern": null, | |
| "learning": null | |
| }, | |
| { | |
| "gid": "1213600918158061", | |
| "title": "[A11Y] Create Role: Role permissions tab text overlaps elements at 200% size", | |
| "status": "done", | |
| "classification": "automatable", | |
| "has_cap_comment": true, | |
| "fix_status": "pending", | |
| "failure_type": null, | |
| "pr_url": null, | |
| "branch": null, | |
| "pattern": null, | |
| "learning": null | |
| }, | |
| { | |
| "gid": "1213600918158063", | |
| "title": "[A11Y] Server Image: Server image rotate and scale button text has very low contrast in light mode", | |
| "status": "done", | |
| "classification": "automatable", | |
| "has_cap_comment": true, | |
| "fix_status": "pending", | |
| "failure_type": null, | |
| "pr_url": null, | |
| "branch": null, | |
| "pattern": null, | |
| "learning": null | |
| }, | |
| { | |
| "gid": "1213600918158065", | |
| "title": "[A11Y] Create Role: Step headers are truncated at 200% text size", | |
| "status": "done", | |
| "classification": "manual", | |
| "has_cap_comment": true, | |
| "fix_status": null, | |
| "failure_type": null, | |
| "pr_url": null, | |
| "branch": null, | |
| "pattern": null, | |
| "learning": null | |
| }, | |
| { | |
| "gid": "1213600918158067", | |
| "title": "[A11Y] Create Role: Role name field is obscured at 200% text size while editing", | |
| "status": "done", | |
| "classification": "manual", | |
| "has_cap_comment": true, | |
| "fix_status": null, | |
| "failure_type": null, | |
| "pr_url": null, | |
| "branch": null, | |
| "pattern": null, | |
| "learning": null | |
| }, | |
| { | |
| "gid": "1213600918158055", | |
| "title": "[A11Y] Report User: Ignore and Block modal link is mildly truncated at 200% text size", | |
| "status": "done", | |
| "classification": "automatable", | |
| "has_cap_comment": true, | |
| "fix_status": "pending", | |
| "failure_type": null, | |
| "pr_url": null, | |
| "branch": null, | |
| "pattern": null, | |
| "learning": null | |
| }, | |
| { | |
| "gid": "1213600918158069", | |
| "title": "[A11Y] Create Role: Role permission setup cards are truncated at 200% text size", | |
| "status": "done", | |
| "classification": "automatable", | |
| "has_cap_comment": true, | |
| "fix_status": "pending", | |
| "failure_type": null, | |
| "pr_url": null, | |
| "branch": null, | |
| "pattern": null, | |
| "learning": null | |
| }, | |
| { | |
| "gid": "1213600918158071", | |
| "title": "[A11Y] Roles: Delete role body text does not resize at 200% text size", | |
| "status": "done", | |
| "classification": "automatable", | |
| "has_cap_comment": true, | |
| "fix_status": "pending", | |
| "failure_type": null, | |
| "pr_url": null, | |
| "branch": null, | |
| "pattern": null, | |
| "learning": null | |
| }, | |
| { | |
| "gid": "1213600918158073", | |
| "title": "[A11Y] Create Server: Create server copy invite icon is mildly truncated at 200% text size", | |
| "status": "done", | |
| "classification": "automatable", | |
| "has_cap_comment": true, | |
| "fix_status": "pending", | |
| "failure_type": null, | |
| "pr_url": null, | |
| "branch": null, | |
| "pattern": null, | |
| "learning": null | |
| }, | |
| { | |
| "gid": "1213606624089116", | |
| "title": "[iOS] Server: Event create button is truncated when text is resized", | |
| "status": "done", | |
| "classification": "automatable", | |
| "has_cap_comment": true, | |
| "fix_status": "pending", | |
| "failure_type": null, | |
| "pr_url": null, | |
| "branch": null, | |
| "pattern": null, | |
| "learning": null | |
| }, | |
| { | |
| "gid": "1213606624089053", | |
| "title": "[iOS] Architecture Build: Profile - Orbs balance heading receives focus out of order", | |
| "status": "done", | |
| "classification": "automatable", | |
| "has_cap_comment": true, | |
| "fix_status": "pending", | |
| "failure_type": null, | |
| "pr_url": null, | |
| "branch": null, | |
| "pattern": null, | |
| "learning": null | |
| }, | |
| { | |
| "gid": "1213606624089045", | |
| "title": "[iOS] Architecture Build: User State radio buttons lack programmatic roles", | |
| "status": "done", | |
| "classification": "manual", | |
| "has_cap_comment": true, | |
| "fix_status": null, | |
| "failure_type": null, | |
| "pr_url": null, | |
| "branch": null, | |
| "pattern": null, | |
| "learning": null | |
| }, | |
| { | |
| "gid": "1213607573712890", | |
| "title": "[iOS] Architecture Build: Profile image is skipped", | |
| "status": "done", | |
| "classification": "automatable", | |
| "has_cap_comment": true, | |
| "fix_status": "pending", | |
| "failure_type": null, | |
| "pr_url": null, | |
| "branch": null, | |
| "pattern": null, | |
| "learning": null, | |
| "platform": "ios" | |
| }, | |
| { | |
| "gid": "1213607573712882", | |
| "title": "[iOS] Architecture Build: Add Friends - Focus doesn't land at the beginning", | |
| "status": "done", | |
| "classification": "automatable", | |
| "has_cap_comment": true, | |
| "fix_status": "pending", | |
| "failure_type": null, | |
| "pr_url": null, | |
| "branch": null, | |
| "pattern": null, | |
| "learning": null, | |
| "platform": "ios" | |
| }, | |
| { | |
| "gid": "1213607573712874", | |
| "title": "[iOS] Architecture Build: DMs - Heading is missing heading tag", | |
| "status": "done", | |
| "classification": "automatable", | |
| "has_cap_comment": true, | |
| "fix_status": "done", | |
| "failure_type": null, | |
| "pr_url": "https://github.com/discord/discord/pull/272960", | |
| "branch": "a11y/fix-1213607573712874", | |
| "pattern": "missing_role_heading_markup", | |
| "learning": "Heading from @app/design/native is drop-in replacement for Text. Multiple empty state files may need the same swap. Fast refresh works immediately.", | |
| "platform": "ios" | |
| }, | |
| { | |
| "gid": "1213442441798033", | |
| "title": "[A11y] User profile - Orbs card heading announced last on iOS", | |
| "status": "done", | |
| "classification": "automatable", | |
| "has_cap_comment": true, | |
| "fix_status": "pending", | |
| "failure_type": null, | |
| "pr_url": null, | |
| "branch": null, | |
| "pattern": null, | |
| "learning": null | |
| }, | |
| { | |
| "gid": "1213738805820890", | |
| "title": "[A11y] Create Event - User is not informed of the current step state", | |
| "status": "done", | |
| "classification": "automatable", | |
| "has_cap_comment": true, | |
| "fix_status": "pending", | |
| "failure_type": null, | |
| "pr_url": null, | |
| "branch": null, | |
| "pattern": null, | |
| "learning": null | |
| }, | |
| { | |
| "gid": "1213799926539562", | |
| "title": "[A11y][Windows] Shop: Tabs have h1 tags", | |
| "status": "done", | |
| "classification": "automatable", | |
| "has_cap_comment": true, | |
| "fix_status": "pending", | |
| "failure_type": null, | |
| "pr_url": null, | |
| "branch": null, | |
| "pattern": null, | |
| "learning": null | |
| }, | |
| { | |
| "gid": "1213799926539566", | |
| "title": "[A11y][Windows] Shop: Carousel repeats \"Clickable\" several times", | |
| "status": "done", | |
| "classification": "manual", | |
| "has_cap_comment": true, | |
| "fix_status": null, | |
| "failure_type": null, | |
| "pr_url": null, | |
| "branch": null, | |
| "pattern": null, | |
| "learning": null | |
| }, | |
| { | |
| "gid": "1213799926539570", | |
| "title": "[A11y][Windows] Shop: Focus starts on third item in carousel", | |
| "status": "done", | |
| "classification": "automatable", | |
| "has_cap_comment": true, | |
| "fix_status": "pending", | |
| "failure_type": null, | |
| "pr_url": null, | |
| "branch": null, | |
| "pattern": null, | |
| "learning": null | |
| }, | |
| { | |
| "gid": "1213799926539572", | |
| "title": "[A11y][Windows] Shop: Take me there button says button twice", | |
| "status": "done", | |
| "classification": "automatable", | |
| "has_cap_comment": true, | |
| "fix_status": "pending", | |
| "failure_type": null, | |
| "pr_url": null, | |
| "branch": null, | |
| "pattern": null, | |
| "learning": null | |
| }, | |
| { | |
| "gid": "1213799926539576", | |
| "title": "[A11y][Windows] Nitro: No h1 on page ", | |
| "status": "done", | |
| "classification": "automatable", | |
| "has_cap_comment": true, | |
| "fix_status": "pending", | |
| "failure_type": null, | |
| "pr_url": null, | |
| "branch": null, | |
| "pattern": null, | |
| "learning": null | |
| }, | |
| { | |
| "gid": "1213799926539580", | |
| "title": "[A11y][Windows] Nitro: Tabs are not communicated as tabs", | |
| "status": "done", | |
| "classification": "automatable", | |
| "has_cap_comment": true, | |
| "fix_status": "pending", | |
| "failure_type": null, | |
| "pr_url": null, | |
| "branch": null, | |
| "pattern": null, | |
| "learning": null | |
| }, | |
| { | |
| "gid": "1213799926539584", | |
| "title": "[A11y][Windows] Nitro: Graphic receives focus and is read out as \"grouping unavailable\"", | |
| "status": "done", | |
| "classification": "automatable", | |
| "has_cap_comment": true, | |
| "fix_status": "pending", | |
| "failure_type": null, | |
| "pr_url": null, | |
| "branch": null, | |
| "pattern": null, | |
| "learning": null | |
| }, | |
| { | |
| "gid": "1213799926554540", | |
| "title": "[A11y][Windows] Nitro: Two h1s on page", | |
| "status": "done", | |
| "classification": "automatable", | |
| "has_cap_comment": true, | |
| "fix_status": "pending", | |
| "failure_type": null, | |
| "pr_url": null, | |
| "branch": null, | |
| "pattern": null, | |
| "learning": null | |
| }, | |
| { | |
| "gid": "1213799926554544", | |
| "title": "[A11y][Windows] Nitro: Add a new payment method - Card button says unknown", | |
| "status": "done", | |
| "classification": "automatable", | |
| "has_cap_comment": true, | |
| "fix_status": "pending", | |
| "failure_type": null, | |
| "pr_url": null, | |
| "branch": null, | |
| "pattern": null, | |
| "learning": null | |
| }, | |
| { | |
| "gid": "1213799926554548", | |
| "title": "[A11y][Windows] Nitro: Add a new payment method - Paypal, Venmo, and Cash app repeat names twice", | |
| "status": "done", | |
| "classification": "automatable", | |
| "has_cap_comment": true, | |
| "fix_status": "pending", | |
| "failure_type": null, | |
| "pr_url": null, | |
| "branch": null, | |
| "pattern": null, | |
| "learning": null | |
| }, | |
| { | |
| "gid": "1213799926554552", | |
| "title": "[A11y][Windows] Nitro: Add a new payment method - Card number field says \"blank\" when filled", | |
| "status": "done", | |
| "classification": "manual", | |
| "has_cap_comment": true, | |
| "fix_status": null, | |
| "failure_type": null, | |
| "pr_url": null, | |
| "branch": null, | |
| "pattern": null, | |
| "learning": null | |
| }, | |
| { | |
| "gid": "1213799926554556", | |
| "title": "[A11y][Windows] Nitro: Add a new payment method - Fields' error messages are not reported to screen reader user", | |
| "status": "done", | |
| "classification": "automatable", | |
| "has_cap_comment": true, | |
| "fix_status": "pending", | |
| "failure_type": null, | |
| "pr_url": null, | |
| "branch": null, | |
| "pattern": null, | |
| "learning": null | |
| }, | |
| { | |
| "gid": "1213799926554560", | |
| "title": "[A11y][Windows] Wayfinding: Call duration is not communicated to screen reader user", | |
| "status": "done", | |
| "classification": "automatable", | |
| "has_cap_comment": true, | |
| "fix_status": "pending", | |
| "failure_type": null, | |
| "pr_url": null, | |
| "branch": null, | |
| "pattern": null, | |
| "learning": null | |
| }, | |
| { | |
| "gid": "1213799926554564", | |
| "title": "[A11y][Windows] Wayfinding: Event dialog progress bar is incorrectly communicated as buttons", | |
| "status": "done", | |
| "classification": "automatable", | |
| "has_cap_comment": true, | |
| "fix_status": "pending", | |
| "failure_type": null, | |
| "pr_url": null, | |
| "branch": null, | |
| "pattern": null, | |
| "learning": null | |
| }, | |
| { | |
| "gid": "1213799926554568", | |
| "title": "[A11y][Windows] Wayfinding: Start date and end date field labels are missing", | |
| "status": "done", | |
| "classification": "automatable", | |
| "has_cap_comment": true, | |
| "fix_status": "pending", | |
| "failure_type": null, | |
| "pr_url": null, | |
| "branch": null, | |
| "pattern": null, | |
| "learning": null | |
| }, | |
| { | |
| "gid": "1213799926554572", | |
| "title": "[A11y][Windows] Wayfinding: Current selection in Event frequency drop down is missing from read out", | |
| "status": "done", | |
| "classification": "automatable", | |
| "has_cap_comment": true, | |
| "fix_status": "pending", | |
| "failure_type": null, | |
| "pr_url": null, | |
| "branch": null, | |
| "pattern": null, | |
| "learning": null | |
| }, | |
| { | |
| "gid": "1213799926554576", | |
| "title": "[A11y][Windows] Wayfinding: When moving onto Review stage in Event modal, focus does not find first element in content", | |
| "status": "done", | |
| "classification": "automatable", | |
| "has_cap_comment": true, | |
| "fix_status": "pending", | |
| "failure_type": null, | |
| "pr_url": null, | |
| "branch": null, | |
| "pattern": null, | |
| "learning": null | |
| }, | |
| { | |
| "gid": "1213738805832125", | |
| "title": "[A11y] DM - Poll character counter is not contextualized", | |
| "status": "done", | |
| "classification": "automatable", | |
| "has_cap_comment": true, | |
| "fix_status": "pending", | |
| "failure_type": null, | |
| "pr_url": null, | |
| "branch": null, | |
| "pattern": null, | |
| "learning": null | |
| }, | |
| { | |
| "gid": "1213738805832117", | |
| "title": "[A11y] DM - User not informed of poll character limit when reached", | |
| "status": "done", | |
| "classification": "automatable", | |
| "has_cap_comment": true, | |
| "fix_status": "pending", | |
| "failure_type": null, | |
| "pr_url": null, | |
| "branch": null, | |
| "pattern": null, | |
| "learning": null | |
| }, | |
| { | |
| "gid": "1213738805832109", | |
| "title": "[A11y] DM - User focus starts at the end of the poll modal", | |
| "status": "done", | |
| "classification": "automatable", | |
| "has_cap_comment": true, | |
| "fix_status": "pending", | |
| "failure_type": null, | |
| "pr_url": null, | |
| "branch": null, | |
| "pattern": null, | |
| "learning": null | |
| }, | |
| { | |
| "gid": "1213738805832101", | |
| "title": "[A11y] DM - Links are called buttons", | |
| "status": "done", | |
| "classification": "automatable", | |
| "has_cap_comment": true, | |
| "fix_status": "pending", | |
| "failure_type": null, | |
| "pr_url": null, | |
| "branch": null, | |
| "pattern": null, | |
| "learning": null | |
| }, | |
| { | |
| "gid": "1213738805832093", | |
| "title": "[A11y] DM - Remove reply button lacks a name", | |
| "status": "done", | |
| "classification": "automatable", | |
| "has_cap_comment": true, | |
| "fix_status": "pending", | |
| "failure_type": null, | |
| "pr_url": null, | |
| "branch": null, | |
| "pattern": null, | |
| "learning": null | |
| }, | |
| { | |
| "gid": "1213738805832085", | |
| "title": "[A11y] DM - User is not informed they are replying to a message in the text field", | |
| "status": "done", | |
| "classification": "automatable", | |
| "has_cap_comment": true, | |
| "fix_status": "pending", | |
| "failure_type": null, | |
| "pr_url": null, | |
| "branch": null, | |
| "pattern": null, | |
| "learning": null | |
| }, | |
| { | |
| "gid": "1213738805832077", | |
| "title": "[A11y] DM - Tag lists have incorrect count", | |
| "status": "done", | |
| "classification": "automatable", | |
| "has_cap_comment": true, | |
| "fix_status": "pending", | |
| "failure_type": null, | |
| "pr_url": null, | |
| "branch": null, | |
| "pattern": null, | |
| "learning": null | |
| }, | |
| { | |
| "gid": "1213738805832069", | |
| "title": "[A11y] DM - Audio message is not described as such", | |
| "status": "done", | |
| "classification": "automatable", | |
| "has_cap_comment": true, | |
| "fix_status": "pending", | |
| "failure_type": null, | |
| "pr_url": null, | |
| "branch": null, | |
| "pattern": null, | |
| "learning": null | |
| }, | |
| { | |
| "gid": "1213738805832061", | |
| "title": "[A11y] DM - User is not informed of keystrokes or informed when the message is sent", | |
| "status": "done", | |
| "classification": "manual", | |
| "has_cap_comment": true, | |
| "fix_status": null, | |
| "failure_type": null, | |
| "pr_url": null, | |
| "branch": null, | |
| "pattern": null, | |
| "learning": null | |
| }, | |
| { | |
| "gid": "1213738805832053", | |
| "title": "[A11y] Event - No toggle state for Interested button", | |
| "status": "done", | |
| "classification": "automatable", | |
| "has_cap_comment": true, | |
| "fix_status": "pending", | |
| "failure_type": null, | |
| "pr_url": null, | |
| "branch": null, | |
| "pattern": null, | |
| "learning": null | |
| }, | |
| { | |
| "gid": "1213738805832045", | |
| "title": "[A11y] Create Event: Review - Numerical value receives focus without context until the next focus stop", | |
| "status": "done", | |
| "classification": "automatable", | |
| "has_cap_comment": true, | |
| "fix_status": "pending", | |
| "failure_type": null, | |
| "pr_url": null, | |
| "branch": null, | |
| "pattern": null, | |
| "learning": null | |
| }, | |
| { | |
| "gid": "1213738805832037", | |
| "title": "[A11y] Create Event: Review - User focus remains in the footer after the step loads", | |
| "status": "done", | |
| "classification": "automatable", | |
| "has_cap_comment": true, | |
| "fix_status": "pending", | |
| "failure_type": null, | |
| "pr_url": null, | |
| "branch": null, | |
| "pattern": null, | |
| "learning": null | |
| }, | |
| { | |
| "gid": "1213738805832029", | |
| "title": "[A11y] Create Event: Event Info - Added image is not described accurately", | |
| "status": "done", | |
| "classification": "automatable", | |
| "has_cap_comment": true, | |
| "fix_status": "pending", | |
| "failure_type": null, | |
| "pr_url": null, | |
| "branch": null, | |
| "pattern": null, | |
| "learning": null | |
| }, | |
| { | |
| "gid": "1213738805832021", | |
| "title": "[A11y] Create Event: Event Info - After adding or changing an image the user focus moves to background main page", | |
| "status": "done", | |
| "classification": "automatable", | |
| "has_cap_comment": true, | |
| "fix_status": "pending", | |
| "failure_type": null, | |
| "pr_url": null, | |
| "branch": null, | |
| "pattern": null, | |
| "learning": null | |
| }, | |
| { | |
| "gid": "1213738805832013", | |
| "title": "[A11y] Create Event: Event Info - Required form controls are not described as such", | |
| "status": "done", | |
| "classification": "automatable", | |
| "has_cap_comment": true, | |
| "fix_status": "pending", | |
| "failure_type": null, | |
| "pr_url": null, | |
| "branch": null, | |
| "pattern": null, | |
| "learning": null | |
| }, | |
| { | |
| "gid": "1213738805832005", | |
| "title": "[A11y] Create Event: Location - Blank object receives focus after the final combobox", | |
| "status": "done", | |
| "classification": "automatable", | |
| "has_cap_comment": true, | |
| "fix_status": "pending", | |
| "failure_type": null, | |
| "pr_url": null, | |
| "branch": null, | |
| "pattern": null, | |
| "learning": null | |
| }, | |
| { | |
| "gid": "1213738805831963", | |
| "title": "[A11y] Create Event: Location - Required form controls are not described as such", | |
| "status": "done", | |
| "classification": "automatable", | |
| "has_cap_comment": true, | |
| "fix_status": "pending", | |
| "failure_type": null, | |
| "pr_url": null, | |
| "branch": null, | |
| "pattern": null, | |
| "learning": null | |
| }, | |
| { | |
| "gid": "1213738805831955", | |
| "title": "[A11y] Create Event - Unavailable future step buttons lack unavailable state", | |
| "status": "done", | |
| "classification": "automatable", | |
| "has_cap_comment": true, | |
| "fix_status": "pending", | |
| "failure_type": null, | |
| "pr_url": null, | |
| "branch": null, | |
| "pattern": null, | |
| "learning": null | |
| }, | |
| { | |
| "gid": "1213738805820882", | |
| "title": "[A11y] DM: Add Friend - Toggling a checkbox sends user focus to search field", | |
| "status": "done", | |
| "classification": "automatable", | |
| "has_cap_comment": true, | |
| "fix_status": "pending", | |
| "failure_type": null, | |
| "pr_url": null, | |
| "branch": null, | |
| "pattern": null, | |
| "learning": null | |
| }, | |
| { | |
| "gid": "1213738805820874", | |
| "title": "[A11y] DM: Add Friend - Checkboxes lack a semantic role", | |
| "status": "done", | |
| "classification": "automatable", | |
| "has_cap_comment": true, | |
| "fix_status": "pending", | |
| "failure_type": null, | |
| "pr_url": null, | |
| "branch": null, | |
| "pattern": null, | |
| "learning": null | |
| }, | |
| { | |
| "gid": "1213738805820864", | |
| "title": "[A11y] DM: Add Friend - The search box does not expose the autocomplete function in the label", | |
| "status": "done", | |
| "classification": "automatable", | |
| "has_cap_comment": true, | |
| "fix_status": "pending", | |
| "failure_type": null, | |
| "pr_url": null, | |
| "branch": null, | |
| "pattern": null, | |
| "learning": null | |
| }, | |
| { | |
| "gid": "1213719270559380", | |
| "title": "[A11y] Profiles - Status text lacks context of being a status", | |
| "status": "done", | |
| "classification": "automatable", | |
| "has_cap_comment": true, | |
| "fix_status": "pending", | |
| "failure_type": null, | |
| "pr_url": null, | |
| "branch": null, | |
| "pattern": null, | |
| "learning": null | |
| }, | |
| { | |
| "gid": "1213719270559372", | |
| "title": "[A11y] Profiles - Closing Set your status modal sends user focus to beginning of settings modal", | |
| "status": "done", | |
| "classification": "automatable", | |
| "has_cap_comment": true, | |
| "fix_status": "pending", | |
| "failure_type": null, | |
| "pr_url": null, | |
| "branch": null, | |
| "pattern": null, | |
| "learning": null | |
| }, | |
| { | |
| "gid": "1213719270559364", | |
| "title": "[A11y] Profiles: Set your status - Clear menu button lacks a static name attribute", | |
| "status": "done", | |
| "classification": "automatable", | |
| "has_cap_comment": true, | |
| "fix_status": "pending", | |
| "failure_type": null, | |
| "pr_url": null, | |
| "branch": null, | |
| "pattern": null, | |
| "learning": null | |
| }, | |
| { | |
| "gid": "1213719270559356", | |
| "title": "[A11y] Profiles - Display name field lacks a name attribute", | |
| "status": "done", | |
| "classification": "automatable", | |
| "has_cap_comment": true, | |
| "fix_status": "pending", | |
| "failure_type": null, | |
| "pr_url": null, | |
| "branch": null, | |
| "pattern": null, | |
| "learning": null | |
| }, | |
| { | |
| "gid": "1213719270559348", | |
| "title": "[A11y] Profiles - User name in preview section does not receive focus", | |
| "status": "done", | |
| "classification": "automatable", | |
| "has_cap_comment": true, | |
| "fix_status": "pending", | |
| "failure_type": null, | |
| "pr_url": null, | |
| "branch": null, | |
| "pattern": null, | |
| "learning": null | |
| }, | |
| { | |
| "gid": "1213719270559338", | |
| "title": "[A11y] Server Notifications - Many remove buttons present without specificity", | |
| "status": "done", | |
| "classification": "automatable", | |
| "has_cap_comment": true, | |
| "fix_status": "pending", | |
| "failure_type": null, | |
| "pr_url": null, | |
| "branch": null, | |
| "pattern": null, | |
| "learning": null | |
| }, | |
| { | |
| "gid": "1213719270559330", | |
| "title": "[A11y] Server Notifications - Override checkboxes lack names", | |
| "status": "done", | |
| "classification": "automatable", | |
| "has_cap_comment": true, | |
| "fix_status": "pending", | |
| "failure_type": null, | |
| "pr_url": null, | |
| "branch": null, | |
| "pattern": null, | |
| "learning": null | |
| }, | |
| { | |
| "gid": "1213719270559322", | |
| "title": "[A11y] Server Notifications - Override table lacks table formatting", | |
| "status": "done", | |
| "classification": "automatable", | |
| "has_cap_comment": true, | |
| "fix_status": "pending", | |
| "failure_type": null, | |
| "pr_url": null, | |
| "branch": null, | |
| "pattern": null, | |
| "learning": null | |
| }, | |
| { | |
| "gid": "1213719270559314", | |
| "title": "[A11y] Server Notifications - Dropdown open button has ambiguous name", | |
| "status": "done", | |
| "classification": "automatable", | |
| "has_cap_comment": true, | |
| "fix_status": "pending", | |
| "failure_type": null, | |
| "pr_url": null, | |
| "branch": null, | |
| "pattern": null, | |
| "learning": null | |
| }, | |
| { | |
| "gid": "1213719270559306", | |
| "title": "[A11y] Settings: Notifications - Dropdown menus lack the shown value in the accessible label", | |
| "status": "done", | |
| "classification": "automatable", | |
| "has_cap_comment": true, | |
| "fix_status": "pending", | |
| "failure_type": null, | |
| "pr_url": null, | |
| "branch": null, | |
| "pattern": null, | |
| "learning": null | |
| }, | |
| { | |
| "gid": "1213719270559298", | |
| "title": "[A11y] Settings: Appearance - Nitro button lacks a name", | |
| "status": "done", | |
| "classification": "automatable", | |
| "has_cap_comment": true, | |
| "fix_status": "pending", | |
| "failure_type": null, | |
| "pr_url": null, | |
| "branch": null, | |
| "pattern": null, | |
| "learning": null | |
| }, | |
| { | |
| "gid": "1213719270559288", | |
| "title": "[A11y] Settings: Many Locations - Hero image lacks a role and alt text", | |
| "status": "done", | |
| "classification": "automatable", | |
| "has_cap_comment": true, | |
| "fix_status": "pending", | |
| "failure_type": null, | |
| "pr_url": null, | |
| "branch": null, | |
| "pattern": null, | |
| "learning": null | |
| }, | |
| { | |
| "gid": "1213719270559280", | |
| "title": "[A11y] Settings: My Account - Security Key modal\u2019s field lacks a name attribute", | |
| "status": "done", | |
| "classification": "automatable", | |
| "has_cap_comment": true, | |
| "fix_status": "pending", | |
| "failure_type": null, | |
| "pr_url": null, | |
| "branch": null, | |
| "pattern": null, | |
| "learning": null | |
| }, | |
| { | |
| "gid": "1213719270559266", | |
| "title": "[A11y] Settings: Many Locations - Subsections do not have headings", | |
| "status": "done", | |
| "classification": "manual", | |
| "has_cap_comment": true, | |
| "fix_status": null, | |
| "failure_type": null, | |
| "pr_url": null, | |
| "branch": null, | |
| "pattern": null, | |
| "learning": null | |
| }, | |
| { | |
| "gid": "1213719258728704", | |
| "title": "[A11y] Settings - Selecting subsection does not move focus to it", | |
| "status": "done", | |
| "classification": "automatable", | |
| "has_cap_comment": true, | |
| "fix_status": "pending", | |
| "failure_type": null, | |
| "pr_url": null, | |
| "branch": null, | |
| "pattern": null, | |
| "learning": null | |
| }, | |
| { | |
| "gid": "1213719258728696", | |
| "title": "[A11y] Settings - No expanded state for expanded navigation options", | |
| "status": "done", | |
| "classification": "automatable", | |
| "has_cap_comment": true, | |
| "fix_status": "pending", | |
| "failure_type": null, | |
| "pr_url": null, | |
| "branch": null, | |
| "pattern": null, | |
| "learning": null | |
| }, | |
| { | |
| "gid": "1213719258728688", | |
| "title": "[A11y] Settings - Navigation options lack role and selected state", | |
| "status": "done", | |
| "classification": "automatable", | |
| "has_cap_comment": true, | |
| "fix_status": "pending", | |
| "failure_type": null, | |
| "pr_url": null, | |
| "branch": null, | |
| "pattern": null, | |
| "learning": null | |
| }, | |
| { | |
| "gid": "1213689999853798", | |
| "title": "[A11y] Voice Call: User profile images do not have accurate alt text in the voice call", | |
| "status": "done", | |
| "classification": "automatable", | |
| "has_cap_comment": true, | |
| "fix_status": "pending", | |
| "failure_type": null, | |
| "pr_url": null, | |
| "branch": null, | |
| "pattern": null, | |
| "learning": null | |
| }, | |
| { | |
| "gid": "1213689999853800", | |
| "title": "[A11y] Voice Call: Mute status of a user is not conveyed to the screen reader", | |
| "status": "done", | |
| "classification": "automatable", | |
| "has_cap_comment": true, | |
| "fix_status": "pending", | |
| "failure_type": null, | |
| "pr_url": null, | |
| "branch": null, | |
| "pattern": null, | |
| "learning": null | |
| }, | |
| { | |
| "gid": "1213689999853802", | |
| "title": "[A11y] Voice Settings: Voice settings heading hierarchy is not accurate", | |
| "status": "done", | |
| "classification": "automatable", | |
| "has_cap_comment": true, | |
| "fix_status": "pending", | |
| "failure_type": null, | |
| "pr_url": null, | |
| "branch": null, | |
| "pattern": null, | |
| "learning": null | |
| }, | |
| { | |
| "gid": "1213689999853804", | |
| "title": "[A11y] Voice Settings: Voice settings sliders lack association with their setting", | |
| "status": "done", | |
| "classification": "automatable", | |
| "has_cap_comment": true, | |
| "fix_status": "pending", | |
| "failure_type": null, | |
| "pr_url": null, | |
| "branch": null, | |
| "pattern": null, | |
| "learning": null | |
| }, | |
| { | |
| "gid": "1213689999853806", | |
| "title": "[A11y] Voice Settings: Screen reader becomes trapped when the voice testing module text changes", | |
| "status": "done", | |
| "classification": "automatable", | |
| "has_cap_comment": true, | |
| "fix_status": "pending", | |
| "failure_type": null, | |
| "pr_url": null, | |
| "branch": null, | |
| "pattern": null, | |
| "learning": null | |
| }, | |
| { | |
| "gid": "1213689999853808", | |
| "title": "[A11y] Voice Settings: Enabling or disabling push to talk option resets focus to the beginning of content", | |
| "status": "done", | |
| "classification": "manual", | |
| "has_cap_comment": true, | |
| "fix_status": null, | |
| "failure_type": null, | |
| "pr_url": null, | |
| "branch": null, | |
| "pattern": null, | |
| "learning": null | |
| }, | |
| { | |
| "gid": "1213689999853810", | |
| "title": "[A11y] Voice Settings: Screen reader user cannot set a key bind for push to talk", | |
| "status": "done", | |
| "classification": "manual", | |
| "has_cap_comment": true, | |
| "fix_status": null, | |
| "failure_type": null, | |
| "pr_url": null, | |
| "branch": null, | |
| "pattern": null, | |
| "learning": null | |
| }, | |
| { | |
| "gid": "1213689999853812", | |
| "title": "[A11y] Voice Settings: Video background tiles have the name labels for each element are focused separately", | |
| "status": "done", | |
| "classification": "automatable", | |
| "has_cap_comment": true, | |
| "fix_status": "pending", | |
| "failure_type": null, | |
| "pr_url": null, | |
| "branch": null, | |
| "pattern": null, | |
| "learning": null | |
| }, | |
| { | |
| "gid": "1213689999853814", | |
| "title": "[A11Y] Group message: Number of friend search results for creating a new group message are not announced by the screen reader", | |
| "status": "done", | |
| "classification": "automatable", | |
| "has_cap_comment": true, | |
| "fix_status": "pending", | |
| "failure_type": null, | |
| "pr_url": null, | |
| "branch": null, | |
| "pattern": null, | |
| "learning": null | |
| }, | |
| { | |
| "gid": "1213689999853816", | |
| "title": "[A11Y] Add Friend: Screen reader focus unexpectedly shifts after activating the Add friend tab", | |
| "status": "done", | |
| "classification": "automatable", | |
| "has_cap_comment": true, | |
| "fix_status": "pending", | |
| "failure_type": null, | |
| "pr_url": null, | |
| "branch": null, | |
| "pattern": null, | |
| "learning": null | |
| }, | |
| { | |
| "gid": "1213689999853818", | |
| "title": "[A11Y] Group message: Screen reader cannot add a friend to a group message", | |
| "status": "done", | |
| "classification": "automatable", | |
| "has_cap_comment": true, | |
| "fix_status": "pending", | |
| "failure_type": null, | |
| "pr_url": null, | |
| "branch": null, | |
| "pattern": null, | |
| "learning": null | |
| }, | |
| { | |
| "gid": "1213689999853820", | |
| "title": "[A11Y] Add Friend: Friend request sent success message is not communicated to the screen reader", | |
| "status": "done", | |
| "classification": "automatable", | |
| "has_cap_comment": true, | |
| "fix_status": "pending", | |
| "failure_type": null, | |
| "pr_url": null, | |
| "branch": null, | |
| "pattern": null, | |
| "learning": null | |
| }, | |
| { | |
| "gid": "1213689999853822", | |
| "title": "[A11Y] Events: Visual event creation step indications are not communicated to the screen reader", | |
| "status": "done", | |
| "classification": "automatable", | |
| "has_cap_comment": true, | |
| "fix_status": "pending", | |
| "failure_type": null, | |
| "pr_url": null, | |
| "branch": null, | |
| "pattern": null, | |
| "learning": null | |
| }, | |
| { | |
| "gid": "1213687488427166", | |
| "title": "[A11Y] Events: Event creation steps are read with a button role but are not interactive for the screen reader", | |
| "status": "done", | |
| "classification": "automatable", | |
| "has_cap_comment": true, | |
| "fix_status": "pending", | |
| "failure_type": null, | |
| "pr_url": null, | |
| "branch": null, | |
| "pattern": null, | |
| "learning": null | |
| }, | |
| { | |
| "gid": "1213687488427168", | |
| "title": "[A11Y] Events: Event creation radio button icon image elements are focused without alt text", | |
| "status": "done", | |
| "classification": "automatable", | |
| "has_cap_comment": true, | |
| "fix_status": "pending", | |
| "failure_type": null, | |
| "pr_url": null, | |
| "branch": null, | |
| "pattern": null, | |
| "learning": null | |
| }, | |
| { | |
| "gid": "1213687488427170", | |
| "title": "[A11Y] Events: Event creation back button is focused last in focus order", | |
| "status": "done", | |
| "classification": "automatable", | |
| "has_cap_comment": true, | |
| "fix_status": "pending", | |
| "failure_type": null, | |
| "pr_url": null, | |
| "branch": null, | |
| "pattern": null, | |
| "learning": null | |
| }, | |
| { | |
| "gid": "1213687488427172", | |
| "title": "[A11Y] Events: Event creation preview screen has content above the main heading", | |
| "status": "done", | |
| "classification": "automatable", | |
| "has_cap_comment": true, | |
| "fix_status": "pending", | |
| "failure_type": null, | |
| "pr_url": null, | |
| "branch": null, | |
| "pattern": null, | |
| "learning": null | |
| }, | |
| { | |
| "gid": "1213687488427174", | |
| "title": "[A11Y] Events: Event link copy action confirmation message is not communicated to the screen reader", | |
| "status": "done", | |
| "classification": "automatable", | |
| "has_cap_comment": true, | |
| "fix_status": "pending", | |
| "failure_type": null, | |
| "pr_url": null, | |
| "branch": null, | |
| "pattern": null, | |
| "learning": null | |
| }, | |
| { | |
| "gid": "1213687488427176", | |
| "title": "[A11Y] Events: Icon information such as location is not included in the readout for an event", | |
| "status": "done", | |
| "classification": "automatable", | |
| "has_cap_comment": true, | |
| "fix_status": "pending", | |
| "failure_type": null, | |
| "pr_url": null, | |
| "branch": null, | |
| "pattern": null, | |
| "learning": null | |
| }, | |
| { | |
| "gid": "1213687488427178", | |
| "title": "[A11Y] Voice Call: Screen sharing tabs do not have a tab role", | |
| "status": "done", | |
| "classification": "automatable", | |
| "has_cap_comment": true, | |
| "fix_status": "pending", | |
| "failure_type": null, | |
| "pr_url": null, | |
| "branch": null, | |
| "pattern": null, | |
| "learning": null | |
| }, | |
| { | |
| "gid": "1213687488427180", | |
| "title": "[A11Y] Voice Call: Selected state of the screen share tabs is not communicated to the screen reader", | |
| "status": "done", | |
| "classification": "automatable", | |
| "has_cap_comment": true, | |
| "fix_status": "pending", | |
| "failure_type": null, | |
| "pr_url": null, | |
| "branch": null, | |
| "pattern": null, | |
| "learning": null | |
| }, | |
| { | |
| "gid": "1213687509382413", | |
| "title": "[A11Y] Voice Call: Selected state of the screen share icon in the voice call is not communicated to the screen reader", | |
| "status": "done", | |
| "classification": "automatable", | |
| "has_cap_comment": true, | |
| "fix_status": "pending", | |
| "failure_type": null, | |
| "pr_url": null, | |
| "branch": null, | |
| "pattern": null, | |
| "learning": null | |
| }, | |
| { | |
| "gid": "1213637683912267", | |
| "title": "[A11Y] Sign up / Log in: QR code element doesn't have accurate alt text", | |
| "status": "done", | |
| "classification": "automatable", | |
| "has_cap_comment": true, | |
| "fix_status": "pending", | |
| "failure_type": null, | |
| "pr_url": null, | |
| "branch": null, | |
| "pattern": null, | |
| "learning": null | |
| }, | |
| { | |
| "gid": "1213637683912269", | |
| "title": "[A11Y] Sign up / Log in: Selected state of birthdate dropdown elements is not communicated", | |
| "status": "done", | |
| "classification": "manual", | |
| "has_cap_comment": true, | |
| "fix_status": null, | |
| "failure_type": null, | |
| "pr_url": null, | |
| "branch": null, | |
| "pattern": null, | |
| "learning": null | |
| }, | |
| { | |
| "gid": "1213637683912271", | |
| "title": "[A11Y] Sign up / Log in: Screen reader users cannot exit out of the birthdate dropdown menus without making a selection", | |
| "status": "done", | |
| "classification": "automatable", | |
| "has_cap_comment": true, | |
| "fix_status": "pending", | |
| "failure_type": null, | |
| "pr_url": null, | |
| "branch": null, | |
| "pattern": null, | |
| "learning": null | |
| }, | |
| { | |
| "gid": "1213637683912273", | |
| "title": "[A11Y] Sign up / Log in: Errors are not announced by the screen reader on the signup page", | |
| "status": "done", | |
| "classification": "automatable", | |
| "has_cap_comment": true, | |
| "fix_status": "pending", | |
| "failure_type": null, | |
| "pr_url": null, | |
| "branch": null, | |
| "pattern": null, | |
| "learning": null | |
| }, | |
| { | |
| "gid": "1213637683912275", | |
| "title": "[A11Y] Sign up / Log in: Current birthdate field values are not communicated", | |
| "status": "done", | |
| "classification": "automatable", | |
| "has_cap_comment": true, | |
| "fix_status": "pending", | |
| "failure_type": null, | |
| "pr_url": null, | |
| "branch": null, | |
| "pattern": null, | |
| "learning": null | |
| }, | |
| { | |
| "gid": "1213637683912279", | |
| "title": "[A11Y] Sign up / Log in: Captcha window does not receive screen reader focus", | |
| "status": "done", | |
| "classification": "manual", | |
| "has_cap_comment": true, | |
| "fix_status": null, | |
| "failure_type": null, | |
| "pr_url": null, | |
| "branch": null, | |
| "pattern": null, | |
| "learning": null | |
| }, | |
| { | |
| "gid": "1213637683912281", | |
| "title": "[A11Y] Sign up / Log in: After logging in, focus does not begin at the top of app content", | |
| "status": "done", | |
| "classification": "manual", | |
| "has_cap_comment": true, | |
| "fix_status": null, | |
| "failure_type": null, | |
| "pr_url": null, | |
| "branch": null, | |
| "pattern": null, | |
| "learning": null | |
| }, | |
| { | |
| "gid": "1213637683912283", | |
| "title": "[A11Y] Presence: Focus does not start at the top of the status modal", | |
| "status": "done", | |
| "classification": "automatable", | |
| "has_cap_comment": true, | |
| "fix_status": "pending", | |
| "failure_type": null, | |
| "pr_url": null, | |
| "branch": null, | |
| "pattern": null, | |
| "learning": null | |
| }, | |
| { | |
| "gid": "1213637683912285", | |
| "title": "[A11Y] Presence: Alt text of the example image can be more descriptive", | |
| "status": "done", | |
| "classification": "automatable", | |
| "has_cap_comment": true, | |
| "fix_status": "pending", | |
| "failure_type": null, | |
| "pr_url": null, | |
| "branch": null, | |
| "pattern": null, | |
| "learning": null | |
| }, | |
| { | |
| "gid": "1213637683912287", | |
| "title": "[A11Y] Presence: Selected state of the clear time option is not communicated", | |
| "status": "done", | |
| "classification": "automatable", | |
| "has_cap_comment": true, | |
| "fix_status": "pending", | |
| "failure_type": null, | |
| "pr_url": null, | |
| "branch": null, | |
| "pattern": null, | |
| "learning": null | |
| }, | |
| { | |
| "gid": "1213637683912289", | |
| "title": "[A11Y] Presence: Emoji selection dialog has an unclear instruction in regards to favoriting emoji", | |
| "status": "done", | |
| "classification": "automatable", | |
| "has_cap_comment": true, | |
| "fix_status": "pending", | |
| "failure_type": null, | |
| "pr_url": null, | |
| "branch": null, | |
| "pattern": null, | |
| "learning": null | |
| }, | |
| { | |
| "gid": "1213637683912291", | |
| "title": "[A11Y] Presence: User is not informed of reaching the status character limit", | |
| "status": "done", | |
| "classification": "automatable", | |
| "has_cap_comment": true, | |
| "fix_status": "pending", | |
| "failure_type": null, | |
| "pr_url": null, | |
| "branch": null, | |
| "pattern": null, | |
| "learning": null | |
| }, | |
| { | |
| "gid": "1213637683912293", | |
| "title": "[A11Y] Presence: Selecting or closing the clear time dropdown resets the focus to the top of app content", | |
| "status": "done", | |
| "classification": "automatable", | |
| "has_cap_comment": true, | |
| "fix_status": "pending", | |
| "failure_type": null, | |
| "pr_url": null, | |
| "branch": null, | |
| "pattern": null, | |
| "learning": null | |
| }, | |
| { | |
| "gid": "1213637683912295", | |
| "title": "[A11Y] Wayfinding: Distinction between icons on the activity authorization modal is not communicated", | |
| "status": "done", | |
| "classification": "automatable", | |
| "has_cap_comment": true, | |
| "fix_status": "pending", | |
| "failure_type": null, | |
| "pr_url": null, | |
| "branch": null, | |
| "pattern": null, | |
| "learning": null | |
| }, | |
| { | |
| "gid": "1213637800619824", | |
| "title": "[A11Y] Quests: Quest card elements are not grouped or associated", | |
| "status": "done", | |
| "classification": "automatable", | |
| "has_cap_comment": true, | |
| "fix_status": "pending", | |
| "failure_type": null, | |
| "pr_url": null, | |
| "branch": null, | |
| "pattern": null, | |
| "learning": null | |
| }, | |
| { | |
| "gid": "1213637800619826", | |
| "title": "[A11Y] Quests: Quest filters drawer title lacks a heading role", | |
| "status": "done", | |
| "classification": "manual", | |
| "has_cap_comment": true, | |
| "fix_status": null, | |
| "failure_type": null, | |
| "pr_url": null, | |
| "branch": null, | |
| "pattern": null, | |
| "learning": null | |
| }, | |
| { | |
| "gid": "1213637800619828", | |
| "title": "[A11Y] Quests: No status message confirmation for the reset filters action", | |
| "status": "done", | |
| "classification": "automatable", | |
| "has_cap_comment": true, | |
| "fix_status": "pending", | |
| "failure_type": null, | |
| "pr_url": null, | |
| "branch": null, | |
| "pattern": null, | |
| "learning": null | |
| }, | |
| { | |
| "gid": "1213637800619832", | |
| "title": "[A11Y] Quests: Embedded quest lacks a button role", | |
| "status": "done", | |
| "classification": "blocked", | |
| "has_cap_comment": true, | |
| "fix_status": null, | |
| "failure_type": null, | |
| "pr_url": null, | |
| "branch": null, | |
| "pattern": null, | |
| "learning": null | |
| }, | |
| { | |
| "gid": "1213637800619834", | |
| "title": "[A11Y] Quests: Embedded quest text is not read by a screen reader", | |
| "status": "done", | |
| "classification": "blocked", | |
| "has_cap_comment": true, | |
| "fix_status": null, | |
| "failure_type": null, | |
| "pr_url": null, | |
| "branch": null, | |
| "pattern": null, | |
| "learning": null | |
| }, | |
| { | |
| "gid": "1213637800619836", | |
| "title": "[A11Y] Quests: Closing quest information modals resets focus to the top of the page", | |
| "status": "done", | |
| "classification": "automatable", | |
| "has_cap_comment": true, | |
| "fix_status": "pending", | |
| "failure_type": null, | |
| "pr_url": null, | |
| "branch": null, | |
| "pattern": null, | |
| "learning": null | |
| }, | |
| { | |
| "gid": "1213637800619838", | |
| "title": "[A11Y] Quests: Time of video reward is not contextualized", | |
| "status": "done", | |
| "classification": "automatable", | |
| "has_cap_comment": true, | |
| "fix_status": "pending", | |
| "failure_type": null, | |
| "pr_url": null, | |
| "branch": null, | |
| "pattern": null, | |
| "learning": null | |
| }, | |
| { | |
| "gid": "1213637800619840", | |
| "title": "[A11Y] Quests: Progress indication on the quest list page is not read", | |
| "status": "done", | |
| "classification": "automatable", | |
| "has_cap_comment": true, | |
| "fix_status": "pending", | |
| "failure_type": null, | |
| "pr_url": null, | |
| "branch": null, | |
| "pattern": null, | |
| "learning": null | |
| }, | |
| { | |
| "gid": "1213637800619842", | |
| "title": "[A11Y] Quests: Multiple buttons with the same label on the quest page", | |
| "status": "done", | |
| "classification": "automatable", | |
| "has_cap_comment": true, | |
| "fix_status": "pending", | |
| "failure_type": null, | |
| "pr_url": null, | |
| "branch": null, | |
| "pattern": null, | |
| "learning": null | |
| }, | |
| { | |
| "gid": "1213637800619844", | |
| "title": "[A11Y] Quests: Promoter information title lacks a heading role", | |
| "status": "done", | |
| "classification": "automatable", | |
| "has_cap_comment": true, | |
| "fix_status": "pending", | |
| "failure_type": null, | |
| "pr_url": null, | |
| "branch": null, | |
| "pattern": null, | |
| "learning": null | |
| }, | |
| { | |
| "gid": "1213637800619846", | |
| "title": "[A11Y] Quests: Unlabeled image is focused on the reward page", | |
| "status": "done", | |
| "classification": "automatable", | |
| "has_cap_comment": true, | |
| "fix_status": "pending", | |
| "failure_type": null, | |
| "pr_url": null, | |
| "branch": null, | |
| "pattern": null, | |
| "learning": null | |
| }, | |
| { | |
| "gid": "1213637800619848", | |
| "title": "[A11Y] Quests: Reward page header lacks a heading role", | |
| "status": "done", | |
| "classification": "automatable", | |
| "has_cap_comment": true, | |
| "fix_status": "pending", | |
| "failure_type": null, | |
| "pr_url": null, | |
| "branch": null, | |
| "pattern": null, | |
| "learning": null | |
| }, | |
| { | |
| "gid": "1213637800619850", | |
| "title": "[A11Y] Quests: Current time remaining text on the quest detail page is not contextualized", | |
| "status": "done", | |
| "classification": "automatable", | |
| "has_cap_comment": true, | |
| "fix_status": "pending", | |
| "failure_type": null, | |
| "pr_url": null, | |
| "branch": null, | |
| "pattern": null, | |
| "learning": null | |
| }, | |
| { | |
| "gid": "1213637683912071", | |
| "title": "[A11Y] Quests: Focus does not begin at the top of the shop page after following the reward entry point", | |
| "status": "done", | |
| "classification": "automatable", | |
| "has_cap_comment": true, | |
| "fix_status": "pending", | |
| "failure_type": null, | |
| "pr_url": null, | |
| "branch": null, | |
| "pattern": null, | |
| "learning": null | |
| }, | |
| { | |
| "gid": "1213637683912073", | |
| "title": "[A11Y] Quests: Relevant quest image is not focused by the screen reader", | |
| "status": "done", | |
| "classification": "automatable", | |
| "has_cap_comment": true, | |
| "fix_status": "pending", | |
| "failure_type": null, | |
| "pr_url": null, | |
| "branch": null, | |
| "pattern": null, | |
| "learning": null | |
| }, | |
| { | |
| "gid": "1213637683912075", | |
| "title": "[A11Y] Quests: Focus does not begin at the top of the console connection drawer", | |
| "status": "done", | |
| "classification": "automatable", | |
| "has_cap_comment": true, | |
| "fix_status": "pending", | |
| "failure_type": null, | |
| "pr_url": null, | |
| "branch": null, | |
| "pattern": null, | |
| "learning": null | |
| }, | |
| { | |
| "gid": "1213637683912077", | |
| "title": "[A11Y] Quests: Quest progress on the quest page is not read", | |
| "status": "done", | |
| "classification": "automatable", | |
| "has_cap_comment": true, | |
| "fix_status": "pending", | |
| "failure_type": null, | |
| "pr_url": null, | |
| "branch": null, | |
| "pattern": null, | |
| "learning": null | |
| }, | |
| { | |
| "gid": "1213637683912079", | |
| "title": "[A11Y] Quests: Video pause button does not have an accurate label", | |
| "status": "done", | |
| "classification": "automatable", | |
| "has_cap_comment": true, | |
| "fix_status": "pending", | |
| "failure_type": null, | |
| "pr_url": null, | |
| "branch": null, | |
| "pattern": null, | |
| "learning": null | |
| }, | |
| { | |
| "gid": "1213637683912081", | |
| "title": "[A11Y] Quests: Quest text overlaps the tag at 200% text size", | |
| "status": "done", | |
| "classification": "manual", | |
| "has_cap_comment": true, | |
| "fix_status": null, | |
| "failure_type": null, | |
| "pr_url": null, | |
| "branch": null, | |
| "pattern": null, | |
| "learning": null | |
| }, | |
| { | |
| "gid": "1213637683912083", | |
| "title": "[A11Y] Quests: Close button on the quest video page is truncated at 200% text size", | |
| "status": "done", | |
| "classification": "automatable", | |
| "has_cap_comment": true, | |
| "fix_status": "pending", | |
| "failure_type": null, | |
| "pr_url": null, | |
| "branch": null, | |
| "pattern": null, | |
| "learning": null | |
| }, | |
| { | |
| "gid": "1213637683912085", | |
| "title": "[A11Y] Quests: Quest reward redemption text is overlapped and truncated at 200% text size", | |
| "status": "done", | |
| "classification": "automatable", | |
| "has_cap_comment": true, | |
| "fix_status": "pending", | |
| "failure_type": null, | |
| "pr_url": null, | |
| "branch": null, | |
| "pattern": null, | |
| "learning": null | |
| }, | |
| { | |
| "gid": "1213637683912087", | |
| "title": "[A11Y] Quests: Quest banner image is cropped at 200% text size", | |
| "status": "done", | |
| "classification": "manual", | |
| "has_cap_comment": true, | |
| "fix_status": null, | |
| "failure_type": null, | |
| "pr_url": null, | |
| "branch": null, | |
| "pattern": null, | |
| "learning": null | |
| }, | |
| { | |
| "gid": "1213637683912089", | |
| "title": "[A11Y] Quests: Green progress indicator does not have sufficient color contrast against the background in light mode", | |
| "status": "done", | |
| "classification": "automatable", | |
| "has_cap_comment": true, | |
| "fix_status": "pending", | |
| "failure_type": null, | |
| "pr_url": null, | |
| "branch": null, | |
| "pattern": null, | |
| "learning": null | |
| }, | |
| { | |
| "gid": "1213637683912091", | |
| "title": "[A11Y] Quests: Time remaining text can not have sufficient contrast against the video background color", | |
| "status": "done", | |
| "classification": "manual", | |
| "has_cap_comment": true, | |
| "fix_status": null, | |
| "failure_type": null, | |
| "pr_url": null, | |
| "branch": null, | |
| "pattern": null, | |
| "learning": null | |
| }, | |
| { | |
| "gid": "1213637683912093", | |
| "title": "[A11Y] Sidebar: Screen reader user cannot create a folder with another method apart from dragging", | |
| "status": "done", | |
| "classification": "manual", | |
| "has_cap_comment": true, | |
| "fix_status": null, | |
| "failure_type": null, | |
| "pr_url": null, | |
| "branch": null, | |
| "pattern": null, | |
| "learning": null | |
| }, | |
| { | |
| "gid": "1213637683912095", | |
| "title": "[A11Y] Sidebar: Screen reader user cannot open the server folder settings", | |
| "status": "done", | |
| "classification": "manual", | |
| "has_cap_comment": true, | |
| "fix_status": null, | |
| "failure_type": null, | |
| "pr_url": null, | |
| "branch": null, | |
| "pattern": null, | |
| "learning": null | |
| }, | |
| { | |
| "gid": "1213637683912145", | |
| "title": "[A11Y] Sidebar: Screen reader user cannot activate additional options on the sidebar element", | |
| "status": "done", | |
| "classification": "manual", | |
| "has_cap_comment": true, | |
| "fix_status": null, | |
| "failure_type": null, | |
| "pr_url": null, | |
| "branch": null, | |
| "pattern": null, | |
| "learning": null | |
| }, | |
| { | |
| "gid": "1213637683912147", | |
| "title": "[A11Y] Sidebar: Additional actions instructions are not announced to the screen reader", | |
| "status": "done", | |
| "classification": "automatable", | |
| "has_cap_comment": true, | |
| "fix_status": "pending", | |
| "failure_type": null, | |
| "pr_url": null, | |
| "branch": null, | |
| "pattern": null, | |
| "learning": null | |
| }, | |
| { | |
| "gid": "1213637683912149", | |
| "title": "[A11Y] Sidebar - Folder Settings: User cannot select custom color for a folder", | |
| "status": "done", | |
| "classification": "automatable", | |
| "has_cap_comment": true, | |
| "fix_status": "pending", | |
| "failure_type": null, | |
| "pr_url": null, | |
| "branch": null, | |
| "pattern": null, | |
| "learning": null | |
| }, | |
| { | |
| "gid": "1213604075240611", | |
| "title": "[A11Y] Report User: Learn more section header does not have a heading role", | |
| "status": "done", | |
| "classification": "automatable", | |
| "has_cap_comment": true, | |
| "fix_status": "pending", | |
| "failure_type": null, | |
| "pr_url": null, | |
| "branch": null, | |
| "pattern": null, | |
| "learning": null | |
| }, | |
| { | |
| "gid": "1213604075240613", | |
| "title": "[A11Y] Report User: Unselected state of the checkbox is not read by the screen reader", | |
| "status": "done", | |
| "classification": "automatable", | |
| "has_cap_comment": true, | |
| "fix_status": "pending", | |
| "failure_type": null, | |
| "pr_url": null, | |
| "branch": null, | |
| "pattern": null, | |
| "learning": null | |
| }, | |
| { | |
| "gid": "1213604075240621", | |
| "title": "[A11Y] Report User: Reporting experience modal header does not have a heading role", | |
| "status": "done", | |
| "classification": "manual", | |
| "has_cap_comment": true, | |
| "fix_status": null, | |
| "failure_type": null, | |
| "pr_url": null, | |
| "branch": null, | |
| "pattern": null, | |
| "learning": null | |
| }, | |
| { | |
| "gid": "1213604075240623", | |
| "title": "[A11Y] Create Server: Server image section header lacks a heading role", | |
| "status": "done", | |
| "classification": "manual", | |
| "has_cap_comment": true, | |
| "fix_status": null, | |
| "failure_type": null, | |
| "pr_url": null, | |
| "branch": null, | |
| "pattern": null, | |
| "learning": null | |
| }, | |
| { | |
| "gid": "1213604075240625", | |
| "title": "[A11Y] Server Image: Edit image save button does not have a descriptive label", | |
| "status": "done", | |
| "classification": "manual", | |
| "has_cap_comment": true, | |
| "fix_status": null, | |
| "failure_type": null, | |
| "pr_url": null, | |
| "branch": null, | |
| "pattern": null, | |
| "learning": null | |
| }, | |
| { | |
| "gid": "1213604075240627", | |
| "title": "[A11Y] Server Image: Image editing buttons are unlabeled when not selected", | |
| "status": "done", | |
| "classification": "manual", | |
| "has_cap_comment": true, | |
| "fix_status": null, | |
| "failure_type": null, | |
| "pr_url": null, | |
| "branch": null, | |
| "pattern": null, | |
| "learning": null | |
| }, | |
| { | |
| "gid": "1213604075240629", | |
| "title": "[A11Y] Server Image: Image rotate and close buttons are unlabeled", | |
| "status": "done", | |
| "classification": "blocked", | |
| "has_cap_comment": true, | |
| "fix_status": null, | |
| "failure_type": null, | |
| "pr_url": null, | |
| "branch": null, | |
| "pattern": null, | |
| "learning": null | |
| }, | |
| { | |
| "gid": "1213604075240631", | |
| "title": "[A11Y] Server Image: A screen reader user cannot finely adjust the zoom level or rotation of the image", | |
| "status": "done", | |
| "classification": "blocked", | |
| "has_cap_comment": true, | |
| "fix_status": null, | |
| "failure_type": null, | |
| "pr_url": null, | |
| "branch": null, | |
| "pattern": null, | |
| "learning": null | |
| }, | |
| { | |
| "gid": "1213604075240633", | |
| "title": "[A11Y] Create Server: Organize members page header lacks a heading role", | |
| "status": "done", | |
| "classification": "automatable", | |
| "has_cap_comment": true, | |
| "fix_status": "pending", | |
| "failure_type": null, | |
| "pr_url": null, | |
| "branch": null, | |
| "pattern": null, | |
| "learning": null | |
| }, | |
| { | |
| "gid": "1213604075240635", | |
| "title": "[A11Y] Create Server: Add some people page lacks a heading role", | |
| "status": "done", | |
| "classification": "manual", | |
| "has_cap_comment": true, | |
| "fix_status": null, | |
| "failure_type": null, | |
| "pr_url": null, | |
| "branch": null, | |
| "pattern": null, | |
| "learning": null | |
| }, | |
| { | |
| "gid": "1213604075240637", | |
| "title": "[A11Y] Create Server: Role name text field does not have a persistent name label", | |
| "status": "done", | |
| "classification": "automatable", | |
| "has_cap_comment": true, | |
| "fix_status": "pending", | |
| "failure_type": null, | |
| "pr_url": null, | |
| "branch": null, | |
| "pattern": null, | |
| "learning": null | |
| }, | |
| { | |
| "gid": "1213607454838076", | |
| "title": "[A11Y] Settings - Roles: Create role main header lacks a heading role", | |
| "status": "done", | |
| "classification": "automatable", | |
| "has_cap_comment": true, | |
| "fix_status": "pending", | |
| "failure_type": null, | |
| "pr_url": null, | |
| "branch": null, | |
| "pattern": null, | |
| "learning": null | |
| }, | |
| { | |
| "gid": "1213607454838078", | |
| "title": "[A11Y] Settings - Roles: Screen reader cannot select the custom color button for a role", | |
| "status": "done", | |
| "classification": "automatable", | |
| "has_cap_comment": true, | |
| "fix_status": "pending", | |
| "failure_type": null, | |
| "pr_url": null, | |
| "branch": null, | |
| "pattern": null, | |
| "learning": null | |
| }, | |
| { | |
| "gid": "1213607454838080", | |
| "title": "[A11Y] Settings - Roles: General role permissions region reads every word in the area for the label", | |
| "status": "done", | |
| "classification": "automatable", | |
| "has_cap_comment": true, | |
| "fix_status": "pending", | |
| "failure_type": null, | |
| "pr_url": null, | |
| "branch": null, | |
| "pattern": null, | |
| "learning": null | |
| }, | |
| { | |
| "gid": "1213607454838082", | |
| "title": "[A11Y] Settings - Roles: Role permissions warning is not conveyed to the screen reader", | |
| "status": "done", | |
| "classification": "manual", | |
| "has_cap_comment": true, | |
| "fix_status": null, | |
| "failure_type": null, | |
| "pr_url": null, | |
| "branch": null, | |
| "pattern": null, | |
| "learning": null | |
| }, | |
| { | |
| "gid": "1213607454838084", | |
| "title": "[A11Y] Settings - Roles: Role requirement modal header lacks a heading role", | |
| "status": "done", | |
| "classification": "manual", | |
| "has_cap_comment": true, | |
| "fix_status": null, | |
| "failure_type": null, | |
| "pr_url": null, | |
| "branch": null, | |
| "pattern": null, | |
| "learning": null | |
| }, | |
| { | |
| "gid": "1213607454838086", | |
| "title": "[A11Y] Settings - Roles: Server role reorder button lacks a button role", | |
| "status": "done", | |
| "classification": "automatable", | |
| "has_cap_comment": true, | |
| "fix_status": "pending", | |
| "failure_type": null, | |
| "pr_url": null, | |
| "branch": null, | |
| "pattern": null, | |
| "learning": null | |
| }, | |
| { | |
| "gid": "1213607454838092", | |
| "title": "[A11Y] Server Invites: Focus unexpectedly resets when quickly navigating the invite link options", | |
| "status": "done", | |
| "classification": "manual", | |
| "has_cap_comment": true, | |
| "fix_status": null, | |
| "failure_type": null, | |
| "pr_url": null, | |
| "branch": null, | |
| "pattern": null, | |
| "learning": null | |
| }, | |
| { | |
| "gid": "1213607454838094", | |
| "title": "[A11Y] Channels: Channel name text field does not have a persistent name label", | |
| "status": "done", | |
| "classification": "automatable", | |
| "has_cap_comment": true, | |
| "fix_status": "pending", | |
| "failure_type": null, | |
| "pr_url": null, | |
| "branch": null, | |
| "pattern": null, | |
| "learning": null | |
| }, | |
| { | |
| "gid": "1213607454838096", | |
| "title": "[A11Y] Channels: Channel topic character count is not contextualized in the label", | |
| "status": "done", | |
| "classification": "automatable", | |
| "has_cap_comment": true, | |
| "fix_status": "pending", | |
| "failure_type": null, | |
| "pr_url": null, | |
| "branch": null, | |
| "pattern": null, | |
| "learning": null | |
| }, | |
| { | |
| "gid": "1213607454838100", | |
| "title": "[A11Y] Channels: Channel invite card information is not grouped or associated", | |
| "status": "done", | |
| "classification": "automatable", | |
| "has_cap_comment": true, | |
| "fix_status": "pending", | |
| "failure_type": null, | |
| "pr_url": null, | |
| "branch": null, | |
| "pattern": null, | |
| "learning": null | |
| }, | |
| { | |
| "gid": "1213607454838102", | |
| "title": "[A11Y] Channels: Channel slow-mode cooldown slider stops do not match the visual seconds in the notch labels", | |
| "status": "done", | |
| "classification": "automatable", | |
| "has_cap_comment": true, | |
| "fix_status": "pending", | |
| "failure_type": null, | |
| "pr_url": null, | |
| "branch": null, | |
| "pattern": null, | |
| "learning": null | |
| }, | |
| { | |
| "gid": "1213607454838104", | |
| "title": "[A11Y] Create Server: Server name text field clear text button lacks a descriptive name", | |
| "status": "done", | |
| "classification": "automatable", | |
| "has_cap_comment": true, | |
| "fix_status": "pending", | |
| "failure_type": null, | |
| "pr_url": null, | |
| "branch": null, | |
| "pattern": null, | |
| "learning": null | |
| }, | |
| { | |
| "gid": "1213607454838106", | |
| "title": "[A11Y] Community: Enable community page header lacks a heading role", | |
| "status": "done", | |
| "classification": "automatable", | |
| "has_cap_comment": true, | |
| "fix_status": "pending", | |
| "failure_type": null, | |
| "pr_url": null, | |
| "branch": null, | |
| "pattern": null, | |
| "learning": null | |
| }, | |
| { | |
| "gid": "1213607454838108", | |
| "title": "[A11Y] Community: Page headers on the Enable community setup flow lack heading roles", | |
| "status": "done", | |
| "classification": "automatable", | |
| "has_cap_comment": true, | |
| "fix_status": "pending", | |
| "failure_type": null, | |
| "pr_url": null, | |
| "branch": null, | |
| "pattern": null, | |
| "learning": null | |
| }, | |
| { | |
| "gid": "1213607454838110", | |
| "title": "[A11Y] Community: Focus does not start at the top of pages in the Enable community setup flow", | |
| "status": "done", | |
| "classification": "automatable", | |
| "has_cap_comment": true, | |
| "fix_status": "pending", | |
| "failure_type": null, | |
| "pr_url": null, | |
| "branch": null, | |
| "pattern": null, | |
| "learning": null | |
| }, | |
| { | |
| "gid": "1213559780817344", | |
| "title": "[iOS] Safety - Focus does not begin at top of Report User Profile screens", | |
| "status": "done", | |
| "classification": "automatable", | |
| "has_cap_comment": true, | |
| "fix_status": "in_progress", | |
| "failure_type": null, | |
| "pr_url": null, | |
| "branch": "a11y/fix-1213559780817344", | |
| "pattern": "focus_set_on_screen_mount", | |
| "learning": "Report flow requires a friend in DMs. NodeView is reused for all report screens, so one fix covers the entire flow. HeaderView needed headerRef prop to forward ref to header Text.", | |
| "platform": "ios" | |
| }, | |
| { | |
| "gid": "1213535536926786", | |
| "title": "[iOS] Quests - Heading text on Claim Reward screen is not announced as a heading", | |
| "status": "done", | |
| "classification": "automatable", | |
| "has_cap_comment": true, | |
| "fix_status": "done", | |
| "failure_type": null, | |
| "pr_url": "https://github.com/discord/discord/pull/272965", | |
| "branch": "a11y/fix-1213535536926786", | |
| "pattern": "missing_role_heading_markup", | |
| "learning": "Quests video modal requires watching the full video to reach Claim Reward screen. Fast refresh works despite react-native-reanimated import. Heading from @app/design/native is drop-in Text replacement.", | |
| "platform": "ios" | |
| }, | |
| { | |
| "gid": "1213531338611820", | |
| "title": "[iOS] Quests - Not able to pause, stop or hide moving content", | |
| "status": "done", | |
| "classification": "manual", | |
| "has_cap_comment": true, | |
| "fix_status": null, | |
| "failure_type": null, | |
| "pr_url": null, | |
| "branch": null, | |
| "pattern": null, | |
| "learning": null | |
| }, | |
| { | |
| "gid": "1213535536926792", | |
| "title": "[iOS] Quests - External link has a button role announced", | |
| "status": "done", | |
| "classification": "automatable", | |
| "has_cap_comment": true, | |
| "fix_status": "pending", | |
| "failure_type": null, | |
| "pr_url": null, | |
| "branch": null, | |
| "pattern": null, | |
| "learning": null, | |
| "platform": "ios" | |
| }, | |
| { | |
| "gid": "1213531317935995", | |
| "title": "[iOS] Server Moderation - Add members checkbox does not have a checkbox role announced", | |
| "status": "done", | |
| "classification": "automatable", | |
| "has_cap_comment": true, | |
| "fix_status": "done", | |
| "failure_type": null, | |
| "pr_url": "https://github.com/discord/discord/pull/272996", | |
| "branch": "a11y/fix-1213531317935995", | |
| "pattern": "ios_checkbox_role_switch_workaround", | |
| "learning": "New pattern: iOS VoiceOver doesn't announce accessibilityRole=checkbox. Design system uses Platform.OS === ios ? switch : checkbox. Navigation to Add Members: Server options > Settings > Roles > Create Role > skip permissions > step 3.", | |
| "platform": "ios" | |
| }, | |
| { | |
| "gid": "1213531317936003", | |
| "title": "[iOS] Server Moderation - Button to reorder roles does not have an accessible name label announced", | |
| "status": "done", | |
| "classification": "automatable", | |
| "has_cap_comment": true, | |
| "fix_status": "pending", | |
| "failure_type": null, | |
| "pr_url": null, | |
| "branch": null, | |
| "pattern": null, | |
| "learning": null | |
| }, | |
| { | |
| "gid": "1213531338611848", | |
| "title": "[iOS] Server Moderation - Button icon graphic does not meet minimum non-text contrast of 3:1", | |
| "status": "done", | |
| "classification": "automatable", | |
| "has_cap_comment": true, | |
| "fix_status": "pending", | |
| "failure_type": null, | |
| "pr_url": null, | |
| "branch": null, | |
| "pattern": null, | |
| "learning": null | |
| }, | |
| { | |
| "gid": "1213531317936007", | |
| "title": "[iOS] Server Moderation - Content on reorder roles screen does not receive focus in a logical order", | |
| "status": "done", | |
| "classification": "manual", | |
| "has_cap_comment": true, | |
| "fix_status": null, | |
| "failure_type": null, | |
| "pr_url": null, | |
| "branch": null, | |
| "pattern": null, | |
| "learning": null | |
| }, | |
| { | |
| "gid": "1213531317936011", | |
| "title": "[iOS] Server Moderation - Delete role button should have a unique and descriptive accessible label", | |
| "status": "done", | |
| "classification": "automatable", | |
| "has_cap_comment": true, | |
| "fix_status": "pending", | |
| "failure_type": null, | |
| "pr_url": null, | |
| "branch": null, | |
| "pattern": null, | |
| "learning": null | |
| }, | |
| { | |
| "gid": "1213531317936025", | |
| "title": "[iOS] Server Moderation - Screen reader is not able to crop image for upload", | |
| "status": "done", | |
| "classification": "blocked", | |
| "has_cap_comment": true, | |
| "fix_status": null, | |
| "failure_type": null, | |
| "pr_url": null, | |
| "branch": null, | |
| "pattern": null, | |
| "learning": null | |
| }, | |
| { | |
| "gid": "1213531338611852", | |
| "title": "[iOS] Server Moderation - Alternative to dragging movement to rearrange servers and create server folder is not provided", | |
| "status": "done", | |
| "classification": "manual", | |
| "has_cap_comment": true, | |
| "fix_status": null, | |
| "failure_type": null, | |
| "pr_url": null, | |
| "branch": null, | |
| "pattern": null, | |
| "learning": null | |
| }, | |
| { | |
| "gid": "1213531338611808", | |
| "title": "[iOS] Server Moderation: Many Locations - Focus does not begin at the top of new screen content", | |
| "status": "done", | |
| "classification": "automatable", | |
| "has_cap_comment": true, | |
| "fix_status": "pending", | |
| "failure_type": null, | |
| "pr_url": null, | |
| "branch": null, | |
| "pattern": null, | |
| "learning": null, | |
| "platform": "ios" | |
| }, | |
| { | |
| "gid": "1213559780817354", | |
| "title": "[iOS] Quests - Button does not have a descriptive label or correct role announced", | |
| "status": "done", | |
| "classification": "automatable", | |
| "has_cap_comment": true, | |
| "fix_status": "pending", | |
| "failure_type": null, | |
| "pr_url": null, | |
| "branch": null, | |
| "pattern": null, | |
| "learning": null | |
| }, | |
| { | |
| "gid": "1213432318402925", | |
| "title": "[A11y] DSC: Wayfinding - Channel event drawer has truncated content with larger text", | |
| "status": "done", | |
| "classification": "manual", | |
| "has_cap_comment": true, | |
| "fix_status": null, | |
| "failure_type": null, | |
| "pr_url": null, | |
| "branch": null, | |
| "pattern": null, | |
| "learning": null | |
| }, | |
| { | |
| "gid": "1213427855148549", | |
| "title": "[A11y] DSC: Light Mode - Channel role color doesn't meet the minimum required contrast for text", | |
| "status": "done", | |
| "classification": "automatable", | |
| "has_cap_comment": true, | |
| "fix_status": "pending", | |
| "failure_type": null, | |
| "pr_url": null, | |
| "branch": null, | |
| "pattern": null, | |
| "learning": null | |
| }, | |
| { | |
| "gid": "1213366283581854", | |
| "title": "[A11y] DSC: Light Mode - Get Nitro button in purchased state has low contrast", | |
| "status": "done", | |
| "classification": "automatable", | |
| "has_cap_comment": true, | |
| "fix_status": "pending", | |
| "failure_type": null, | |
| "pr_url": null, | |
| "branch": null, | |
| "pattern": null, | |
| "learning": null | |
| }, | |
| { | |
| "gid": "1213427855148539", | |
| "title": "[A11y] DSC: Light Mode - Nameplate preview text has low contrast", | |
| "status": "done", | |
| "classification": "manual", | |
| "has_cap_comment": true, | |
| "fix_status": null, | |
| "failure_type": null, | |
| "pr_url": null, | |
| "branch": null, | |
| "pattern": null, | |
| "learning": null | |
| }, | |
| { | |
| "gid": "1213321603596281", | |
| "title": "[A11y] DSC: Shop: Pages are not available in landscape", | |
| "status": "done", | |
| "classification": "manual", | |
| "has_cap_comment": true, | |
| "fix_status": null, | |
| "failure_type": null, | |
| "pr_url": null, | |
| "branch": null, | |
| "pattern": null, | |
| "learning": null | |
| }, | |
| { | |
| "gid": "1213321603596286", | |
| "title": "[A11y] DSC: Shop: Credit value text has low contrast (light/midnight)", | |
| "status": "done", | |
| "classification": "manual", | |
| "has_cap_comment": true, | |
| "fix_status": null, | |
| "failure_type": null, | |
| "pr_url": null, | |
| "branch": null, | |
| "pattern": null, | |
| "learning": null | |
| }, | |
| { | |
| "gid": "1213321613488315", | |
| "title": "[A11y] DSC: Search: Subtext has low contrast (light)", | |
| "status": "done", | |
| "classification": "automatable", | |
| "has_cap_comment": true, | |
| "fix_status": "pending", | |
| "failure_type": null, | |
| "pr_url": null, | |
| "branch": null, | |
| "pattern": null, | |
| "learning": null | |
| }, | |
| { | |
| "gid": "1213321803828118", | |
| "title": "[A11y] DSC: Event: Create text has low contrast (light)", | |
| "status": "done", | |
| "classification": "automatable", | |
| "has_cap_comment": true, | |
| "fix_status": "pending", | |
| "failure_type": null, | |
| "pr_url": null, | |
| "branch": null, | |
| "pattern": null, | |
| "learning": null | |
| }, | |
| { | |
| "gid": "1213321613488309", | |
| "title": "[A11y] DSC: Server with active voice channel: Speaker icon image has low contrast (light)", | |
| "status": "done", | |
| "classification": "automatable", | |
| "has_cap_comment": true, | |
| "fix_status": "pending", | |
| "failure_type": null, | |
| "pr_url": null, | |
| "branch": null, | |
| "pattern": null, | |
| "learning": null | |
| }, | |
| { | |
| "gid": "1213321613488303", | |
| "title": "[A11y] DSC: Server Members: Chevron button has low contrast (light)", | |
| "status": "done", | |
| "classification": "manual", | |
| "has_cap_comment": true, | |
| "fix_status": null, | |
| "failure_type": null, | |
| "pr_url": null, | |
| "branch": null, | |
| "pattern": null, | |
| "learning": null | |
| }, | |
| { | |
| "gid": "1213321603596304", | |
| "title": "[A11y] DSC: Server Members: Username and text has low contrast (light/dark)", | |
| "status": "done", | |
| "classification": "automatable", | |
| "has_cap_comment": true, | |
| "fix_status": "pending", | |
| "failure_type": null, | |
| "pr_url": null, | |
| "branch": null, | |
| "pattern": null, | |
| "learning": null | |
| }, | |
| { | |
| "gid": "1213321603596294", | |
| "title": "[A11y] DSC: Edit Profile: Decoration option icons have low contrast (light)", | |
| "status": "done", | |
| "classification": "automatable", | |
| "has_cap_comment": true, | |
| "fix_status": "pending", | |
| "failure_type": null, | |
| "pr_url": null, | |
| "branch": null, | |
| "pattern": null, | |
| "learning": null | |
| }, | |
| { | |
| "gid": "1213349185333740", | |
| "title": "[A11y] DSC: Sign Up: Tab text is slightly truncated after resizing text ", | |
| "status": "done", | |
| "classification": "automatable", | |
| "has_cap_comment": true, | |
| "fix_status": "pending", | |
| "failure_type": null, | |
| "pr_url": null, | |
| "branch": null, | |
| "pattern": null, | |
| "learning": null | |
| }, | |
| { | |
| "gid": "1213349185333746", | |
| "title": "[A11y] DSC: Profile: Nitro text is slightly truncated after resizing text ", | |
| "status": "done", | |
| "classification": "manual", | |
| "has_cap_comment": true, | |
| "fix_status": null, | |
| "failure_type": null, | |
| "pr_url": null, | |
| "branch": null, | |
| "pattern": null, | |
| "learning": null | |
| }, | |
| { | |
| "gid": "1213349185333752", | |
| "title": "[A11y] DSC: Search: Search field placeholder text is slightly truncated after resizing text ", | |
| "status": "done", | |
| "classification": "automatable", | |
| "has_cap_comment": true, | |
| "fix_status": "pending", | |
| "failure_type": null, | |
| "pr_url": null, | |
| "branch": null, | |
| "pattern": null, | |
| "learning": null | |
| }, | |
| { | |
| "gid": "1213381324953238", | |
| "title": "[A11y] DSC: Profile - Profile effect animation is not announced by the screen reader", | |
| "status": "done", | |
| "classification": "manual", | |
| "has_cap_comment": true, | |
| "fix_status": null, | |
| "failure_type": null, | |
| "pr_url": null, | |
| "branch": null, | |
| "pattern": null, | |
| "learning": null | |
| }, | |
| { | |
| "gid": "1213440326845224", | |
| "title": "[A11y] DSC: Shop - Find Your Style shop button is truncated with larger text", | |
| "status": "done", | |
| "classification": "automatable", | |
| "has_cap_comment": true, | |
| "fix_status": "pending", | |
| "failure_type": null, | |
| "pr_url": null, | |
| "branch": null, | |
| "pattern": null, | |
| "learning": null | |
| }, | |
| { | |
| "gid": "1213432296400635", | |
| "title": "[A11y] DSC: Midnight mode - Profile biography field's character counter has low contrast", | |
| "status": "done", | |
| "classification": "manual", | |
| "has_cap_comment": true, | |
| "fix_status": null, | |
| "failure_type": null, | |
| "pr_url": null, | |
| "branch": null, | |
| "pattern": null, | |
| "learning": null | |
| }, | |
| { | |
| "gid": "1213381324953226", | |
| "title": "[A11y] DSC: Shop - Bundle purchase confirmation close button has low contrast with the background", | |
| "status": "done", | |
| "classification": "automatable", | |
| "has_cap_comment": true, | |
| "fix_status": "pending", | |
| "failure_type": null, | |
| "pr_url": null, | |
| "branch": null, | |
| "pattern": null, | |
| "learning": null | |
| }, | |
| { | |
| "gid": "1213380527266184", | |
| "title": "[A11y] DSC: Shop - Bundle purchase confirmation heading text lacks the heading role", | |
| "status": "done", | |
| "classification": "automatable", | |
| "has_cap_comment": true, | |
| "fix_status": "pending", | |
| "failure_type": null, | |
| "pr_url": null, | |
| "branch": null, | |
| "pattern": null, | |
| "learning": null, | |
| "platform": "mobile" | |
| }, | |
| { | |
| "gid": "1213381324953216", | |
| "title": "[A11y] DSC: Shop - Subscribe Now link is missing the button role", | |
| "status": "done", | |
| "classification": "manual", | |
| "has_cap_comment": true, | |
| "fix_status": null, | |
| "failure_type": null, | |
| "pr_url": null, | |
| "branch": null, | |
| "pattern": null, | |
| "learning": null | |
| }, | |
| { | |
| "gid": "1213371797217567", | |
| "title": "[A11y] DSC: Nitro - Plan drawer banner doesn't receive focus", | |
| "status": "done", | |
| "classification": "automatable", | |
| "has_cap_comment": true, | |
| "fix_status": "pending", | |
| "failure_type": null, | |
| "pr_url": null, | |
| "branch": null, | |
| "pattern": null, | |
| "learning": null | |
| }, | |
| { | |
| "gid": "1213380527266164", | |
| "title": "[A11y] DSC: Shop - Only the currently entered user's name into the Sent To field is read", | |
| "status": "done", | |
| "classification": "automatable", | |
| "has_cap_comment": true, | |
| "fix_status": "pending", | |
| "failure_type": null, | |
| "pr_url": null, | |
| "branch": null, | |
| "pattern": null, | |
| "learning": null | |
| }, | |
| { | |
| "gid": "1213371797217559", | |
| "title": "[A11y] DSC: Shop - Nameplate preview receives focus as just the user's name", | |
| "status": "done", | |
| "classification": "automatable", | |
| "has_cap_comment": true, | |
| "fix_status": "pending", | |
| "failure_type": null, | |
| "pr_url": null, | |
| "branch": null, | |
| "pattern": null, | |
| "learning": null | |
| }, | |
| { | |
| "gid": "1213380527266156", | |
| "title": "[A11y] DSC: Wayfinding - 'People in common' toast message is not announced to the screen reader", | |
| "status": "done", | |
| "classification": "automatable", | |
| "has_cap_comment": true, | |
| "fix_status": "pending", | |
| "failure_type": null, | |
| "pr_url": null, | |
| "branch": null, | |
| "pattern": null, | |
| "learning": null | |
| }, | |
| { | |
| "gid": "1213345883088809", | |
| "title": "[A11y] DSC: Wayfinding - Server onboarding transition slide automatically continues without user input", | |
| "status": "done", | |
| "classification": "automatable", | |
| "has_cap_comment": true, | |
| "fix_status": "pending", | |
| "failure_type": null, | |
| "pr_url": null, | |
| "branch": null, | |
| "pattern": null, | |
| "learning": null | |
| }, | |
| { | |
| "gid": "1213345805403287", | |
| "title": "[A11y] DSC: Wayfinding - Focus is not moved to the top of the order when navigating between server onboarding questions", | |
| "status": "done", | |
| "classification": "automatable", | |
| "has_cap_comment": true, | |
| "fix_status": "pending", | |
| "failure_type": null, | |
| "pr_url": null, | |
| "branch": null, | |
| "pattern": null, | |
| "learning": null | |
| }, | |
| { | |
| "gid": "1213345883088801", | |
| "title": "[A11y] DSC: Wayfinding - Selected status is missing from server onboarding answer buttons", | |
| "status": "done", | |
| "classification": "automatable", | |
| "has_cap_comment": true, | |
| "fix_status": "pending", | |
| "failure_type": null, | |
| "pr_url": null, | |
| "branch": null, | |
| "pattern": null, | |
| "learning": null, | |
| "platform": "mobile" | |
| }, | |
| { | |
| "gid": "1213345883088793", | |
| "title": "[A11y] DSC: Wayfinding - Button role is missing for server onboarding answers", | |
| "status": "done", | |
| "classification": "manual", | |
| "has_cap_comment": true, | |
| "fix_status": null, | |
| "failure_type": null, | |
| "pr_url": null, | |
| "branch": null, | |
| "pattern": null, | |
| "learning": null | |
| }, | |
| { | |
| "gid": "1213345805403271", | |
| "title": "[A11y] DSC: Wayfinding - Server onboarding answer has context missing that part of the label refers to an emoji", | |
| "status": "done", | |
| "classification": "automatable", | |
| "has_cap_comment": true, | |
| "fix_status": "pending", | |
| "failure_type": null, | |
| "pr_url": null, | |
| "branch": null, | |
| "pattern": null, | |
| "learning": null | |
| }, | |
| { | |
| "gid": "1213345883088785", | |
| "title": "[A11y] DSC: Wayfinding - Server onboarding modal heading text lacks the heading role", | |
| "status": "done", | |
| "classification": "automatable", | |
| "has_cap_comment": true, | |
| "fix_status": "pending", | |
| "failure_type": null, | |
| "pr_url": null, | |
| "branch": null, | |
| "pattern": null, | |
| "learning": null, | |
| "platform": "mobile" | |
| }, | |
| { | |
| "gid": "1213345805403263", | |
| "title": "[A11y] DSC: Wayfinding - server icon is read as initials, rather than as an icon", | |
| "status": "done", | |
| "classification": "blocked", | |
| "has_cap_comment": true, | |
| "fix_status": null, | |
| "failure_type": null, | |
| "pr_url": null, | |
| "branch": null, | |
| "pattern": null, | |
| "learning": null | |
| }, | |
| { | |
| "gid": "1213318074731521", | |
| "title": "[A11y] DSC: Wayfinding - Context for location icon not included in label for an event link", | |
| "status": "done", | |
| "classification": "automatable", | |
| "has_cap_comment": true, | |
| "fix_status": "pending", | |
| "failure_type": null, | |
| "pr_url": null, | |
| "branch": null, | |
| "pattern": null, | |
| "learning": null | |
| }, | |
| { | |
| "gid": "1213320492159832", | |
| "title": "[A11y] DSC: Wayfinding - Radio buttons lack a role", | |
| "status": "done", | |
| "classification": "manual", | |
| "has_cap_comment": true, | |
| "fix_status": null, | |
| "failure_type": null, | |
| "pr_url": null, | |
| "branch": null, | |
| "pattern": null, | |
| "learning": null | |
| }, | |
| { | |
| "gid": "1213318061933761", | |
| "title": "[A11y] DSC: Wayfinding - Create new event button lacks a descriptive name", | |
| "status": "done", | |
| "classification": "automatable", | |
| "has_cap_comment": true, | |
| "fix_status": "done", | |
| "failure_type": null, | |
| "pr_url": "https://github.com/discord/discord/pull/272966", | |
| "branch": "a11y/fix-1213318061933761", | |
| "pattern": "missing_label_icon_button_role", | |
| "learning": "Code refactored since Cap analysis: Button replaced with ActionSheetHeaderPressableText. Component already accepts accessibilityLabel prop. SCHEDULE_EVENT i18n key ('Create Event') matches web.", | |
| "platform": "mobile" | |
| }, | |
| { | |
| "gid": "1213320492159824", | |
| "title": "[A11y] DSC: Dismiss new events modal button lacks a descriptive name", | |
| "status": "done", | |
| "classification": "automatable", | |
| "has_cap_comment": true, | |
| "fix_status": "pending", | |
| "failure_type": null, | |
| "pr_url": null, | |
| "branch": null, | |
| "pattern": null, | |
| "learning": null | |
| }, | |
| { | |
| "gid": "1213318061933753", | |
| "title": "[A11y] DSC: Wayfinding - Number of unread messages is not communicated to the screen reader", | |
| "status": "done", | |
| "classification": "automatable", | |
| "has_cap_comment": true, | |
| "fix_status": "pending", | |
| "failure_type": null, | |
| "pr_url": null, | |
| "branch": null, | |
| "pattern": null, | |
| "learning": null | |
| }, | |
| { | |
| "gid": "1213320492159816", | |
| "title": "[A11y] DSC: Wayfinding - Muted status is not included in screen reader label", | |
| "status": "done", | |
| "classification": "automatable", | |
| "has_cap_comment": true, | |
| "fix_status": "pending", | |
| "failure_type": null, | |
| "pr_url": null, | |
| "branch": null, | |
| "pattern": null, | |
| "learning": null | |
| }, | |
| { | |
| "gid": "1213320477358686", | |
| "title": "[A11y] DSC: Wayfinding - Dismiss button for join voice drawer button lacks a descriptive name", | |
| "status": "done", | |
| "classification": "automatable", | |
| "has_cap_comment": true, | |
| "fix_status": "pending", | |
| "failure_type": null, | |
| "pr_url": null, | |
| "branch": null, | |
| "pattern": null, | |
| "learning": null | |
| }, | |
| { | |
| "gid": "1213318061933745", | |
| "title": "[A11y] DSC: Wayfinding - Join voice drawer has a hidden element with button role", | |
| "status": "done", | |
| "classification": "automatable", | |
| "has_cap_comment": true, | |
| "fix_status": "pending", | |
| "failure_type": null, | |
| "pr_url": null, | |
| "branch": null, | |
| "pattern": null, | |
| "learning": null | |
| }, | |
| { | |
| "gid": "1213254672704652", | |
| "title": "[A11y] DSC: Content - Context that listed attributes are tags is not included in label", | |
| "status": "done", | |
| "classification": "automatable", | |
| "has_cap_comment": true, | |
| "fix_status": "pending", | |
| "failure_type": null, | |
| "pr_url": null, | |
| "branch": null, | |
| "pattern": null, | |
| "learning": null | |
| }, | |
| { | |
| "gid": "1213214888908904", | |
| "title": "[A11y] DSC: Content - App hero area animation is skipped in focus order", | |
| "status": "done", | |
| "classification": "automatable", | |
| "has_cap_comment": true, | |
| "fix_status": "pending", | |
| "failure_type": null, | |
| "pr_url": null, | |
| "branch": null, | |
| "pattern": null, | |
| "learning": null | |
| }, | |
| { | |
| "gid": "1213249365503499", | |
| "title": "[A11y] DSC: Content - Button role missing from app description", | |
| "status": "done", | |
| "classification": "automatable", | |
| "has_cap_comment": true, | |
| "fix_status": "pending", | |
| "failure_type": null, | |
| "pr_url": null, | |
| "branch": null, | |
| "pattern": null, | |
| "learning": null | |
| }, | |
| { | |
| "gid": "1213251693801653", | |
| "title": "[A11y] DSC: Content - App detail and command headings lack the heading role", | |
| "status": "done", | |
| "classification": "automatable", | |
| "has_cap_comment": true, | |
| "fix_status": "pending", | |
| "failure_type": null, | |
| "pr_url": null, | |
| "branch": null, | |
| "pattern": null, | |
| "learning": null | |
| }, | |
| { | |
| "gid": "1213249365503491", | |
| "title": "[A11y] DCC: Content - Search Results automatically added are not announced", | |
| "status": "done", | |
| "classification": "automatable", | |
| "has_cap_comment": true, | |
| "fix_status": "pending", | |
| "failure_type": null, | |
| "pr_url": null, | |
| "branch": null, | |
| "pattern": null, | |
| "learning": null | |
| }, | |
| { | |
| "gid": "1213251693801645", | |
| "title": "[A11y] DSC: Content - View More buttons lack a unique name", | |
| "status": "done", | |
| "classification": "automatable", | |
| "has_cap_comment": true, | |
| "fix_status": "pending", | |
| "failure_type": null, | |
| "pr_url": null, | |
| "branch": null, | |
| "pattern": null, | |
| "learning": null | |
| }, | |
| { | |
| "gid": "1213249365503481", | |
| "title": "[A11y] DSC: Content - Headings lack heading role in app menu", | |
| "status": "done", | |
| "classification": "automatable", | |
| "has_cap_comment": true, | |
| "fix_status": "done", | |
| "failure_type": null, | |
| "pr_url": "https://github.com/discord/discord/pull/272989", | |
| "branch": "a11y/fix-1213249365503481", | |
| "pattern": "missing_role_heading_markup", | |
| "learning": "App Launcher has 4 code locations but 7+ visible section headers (dynamic rendering). Heading is drop-in for Text. Fast refresh triggered libdiscore DevLogListener crash (known JSI use-after-free), required full rebuild.", | |
| "platform": "ios" | |
| }, | |
| { | |
| "gid": "1213251548055331", | |
| "title": "[A11y] DSC: Wayfinding - Recent apps lack the button role", | |
| "status": "done", | |
| "classification": "automatable", | |
| "has_cap_comment": true, | |
| "fix_status": "pending", | |
| "failure_type": null, | |
| "pr_url": null, | |
| "branch": null, | |
| "pattern": null, | |
| "learning": null | |
| }, | |
| { | |
| "gid": "1213249365503473", | |
| "title": "[A11y] DSC: Wayfinding - Clear search button lacks a descriptive name. Currently just reads \"Clear, Button\"", | |
| "status": "done", | |
| "classification": "automatable", | |
| "has_cap_comment": true, | |
| "fix_status": "done", | |
| "failure_type": null, | |
| "pr_url": "https://github.com/discord/discord/pull/272987", | |
| "branch": "a11y/fix-1213249365503473", | |
| "pattern": "missing_label_icon_button_role", | |
| "learning": "Steps to Reproduce says channel settings but means server settings. Guild search uses different component than SearchField. clearButtonAccessibilityLabel threads through ClearableProps automatically." | |
| }, | |
| { | |
| "gid": "1213249355092632", | |
| "title": "[A11y] DSC: Wayfinding - Context missing from label for voice channel join button", | |
| "status": "done", | |
| "classification": "automatable", | |
| "has_cap_comment": true, | |
| "fix_status": "pending", | |
| "failure_type": null, | |
| "pr_url": null, | |
| "branch": null, | |
| "pattern": null, | |
| "learning": null | |
| }, | |
| { | |
| "gid": "1213249079695820", | |
| "title": "[A11y] DSC: Wayfinding - Nickname field label lacks a descriptive name", | |
| "status": "done", | |
| "classification": "automatable", | |
| "has_cap_comment": true, | |
| "fix_status": "pending", | |
| "failure_type": null, | |
| "pr_url": null, | |
| "branch": null, | |
| "pattern": null, | |
| "learning": null | |
| }, | |
| { | |
| "gid": "1213249079695812", | |
| "title": "[A11y] DSC: Wayfinding - Focus doesn't start at the top of the focus order when opening the Edit member page", | |
| "status": "done", | |
| "classification": "automatable", | |
| "has_cap_comment": true, | |
| "fix_status": "pending", | |
| "failure_type": null, | |
| "pr_url": null, | |
| "branch": null, | |
| "pattern": null, | |
| "learning": null | |
| }, | |
| { | |
| "gid": "1213198632660233", | |
| "title": "[A11y] DSC: Wayfinding - The context of a member's tags is not included in the screen reader label for each member", | |
| "status": "done", | |
| "classification": "automatable", | |
| "has_cap_comment": true, | |
| "fix_status": "pending", | |
| "failure_type": null, | |
| "pr_url": null, | |
| "branch": null, | |
| "pattern": null, | |
| "learning": null | |
| }, | |
| { | |
| "gid": "1213248964045181", | |
| "title": "[A11y] DSC: Wayfinding - Members: The navigation bar focus order is not in the logical visible order", | |
| "status": "done", | |
| "classification": "manual", | |
| "has_cap_comment": true, | |
| "fix_status": null, | |
| "failure_type": null, | |
| "pr_url": null, | |
| "branch": null, | |
| "pattern": null, | |
| "learning": null | |
| }, | |
| { | |
| "gid": "1213248245737816", | |
| "title": "[A11y] DSC: Nitro - Row label receives focus after the row content", | |
| "status": "done", | |
| "classification": "automatable", | |
| "has_cap_comment": true, | |
| "fix_status": "pending", | |
| "failure_type": null, | |
| "pr_url": null, | |
| "branch": null, | |
| "pattern": null, | |
| "learning": null | |
| }, | |
| { | |
| "gid": "1213223410901878", | |
| "title": "[A11y] DSC: Edit Profile - Change profile banner color picker text field is announced without an accessible name label", | |
| "status": "done", | |
| "classification": "automatable", | |
| "has_cap_comment": true, | |
| "fix_status": "pending", | |
| "failure_type": null, | |
| "pr_url": null, | |
| "branch": null, | |
| "pattern": null, | |
| "learning": null | |
| }, | |
| { | |
| "gid": "1213223410901826", | |
| "title": "[A11y] DSC: Shop - Footer image is not included in focus order with accessible alternative text", | |
| "status": "done", | |
| "classification": "automatable", | |
| "has_cap_comment": true, | |
| "fix_status": "pending", | |
| "failure_type": null, | |
| "pr_url": null, | |
| "branch": null, | |
| "pattern": null, | |
| "learning": null | |
| }, | |
| { | |
| "gid": "1213223410901830", | |
| "title": "[A11y] DSC: Shop - Purchase preview profile effects has some text in focus order", | |
| "status": "done", | |
| "classification": "automatable", | |
| "has_cap_comment": true, | |
| "fix_status": "pending", | |
| "failure_type": null, | |
| "pr_url": null, | |
| "branch": null, | |
| "pattern": null, | |
| "learning": null | |
| }, | |
| { | |
| "gid": "1213211848869163", | |
| "title": "[A11y] DSC: Wayfinding - Search results automatically added are not announced", | |
| "status": "done", | |
| "classification": "automatable", | |
| "has_cap_comment": true, | |
| "fix_status": "pending", | |
| "failure_type": null, | |
| "pr_url": null, | |
| "branch": null, | |
| "pattern": null, | |
| "learning": null | |
| }, | |
| { | |
| "gid": "1213251693801665", | |
| "title": "[A11y] DSC: Content - Game detail tag label lacks context that it is a player count indicator", | |
| "status": "done", | |
| "classification": "automatable", | |
| "has_cap_comment": true, | |
| "fix_status": "pending", | |
| "failure_type": null, | |
| "pr_url": null, | |
| "branch": null, | |
| "pattern": null, | |
| "learning": null | |
| }, | |
| { | |
| "gid": "1213342939418656", | |
| "title": "[A11y] Custom status bubble is truncated with larger text", | |
| "status": "done", | |
| "classification": "automatable", | |
| "has_cap_comment": true, | |
| "fix_status": "pending", | |
| "failure_type": null, | |
| "pr_url": null, | |
| "branch": null, | |
| "pattern": null, | |
| "learning": null | |
| }, | |
| { | |
| "gid": "1213338149401673", | |
| "title": "[A11y] Orbs balance in You tab is truncated with larger text", | |
| "status": "done", | |
| "classification": "automatable", | |
| "has_cap_comment": true, | |
| "fix_status": "pending", | |
| "failure_type": null, | |
| "pr_url": null, | |
| "branch": null, | |
| "pattern": null, | |
| "learning": null | |
| }, | |
| { | |
| "gid": "1213338149401709", | |
| "title": "[A11y] Back button on top of Watch together drawer is truncated with larger text", | |
| "status": "done", | |
| "classification": "manual", | |
| "has_cap_comment": true, | |
| "fix_status": null, | |
| "failure_type": null, | |
| "pr_url": null, | |
| "branch": null, | |
| "pattern": null, | |
| "learning": null | |
| }, | |
| { | |
| "gid": "1212990924563581", | |
| "title": "[A11y] DSC: Shared spaces - Focus lands in the middle of the page", | |
| "status": "done", | |
| "classification": "blocked", | |
| "has_cap_comment": true, | |
| "fix_status": null, | |
| "failure_type": null, | |
| "pr_url": null, | |
| "branch": null, | |
| "pattern": null, | |
| "learning": null | |
| }, | |
| { | |
| "gid": "1213719270559388", | |
| "title": "[A11y] Wayfinding - Servers with activities do not expose the activity type to match the image", | |
| "status": "done", | |
| "classification": "automatable", | |
| "has_cap_comment": true, | |
| "fix_status": "pending", | |
| "failure_type": null, | |
| "pr_url": null, | |
| "branch": null, | |
| "pattern": null, | |
| "learning": null | |
| }, | |
| { | |
| "gid": "1213719270559396", | |
| "title": "[A11y] Wayfinding - Current treeitem lacks a selected state", | |
| "status": "done", | |
| "classification": "automatable", | |
| "has_cap_comment": true, | |
| "fix_status": "pending", | |
| "failure_type": null, | |
| "pr_url": null, | |
| "branch": null, | |
| "pattern": null, | |
| "learning": null | |
| }, | |
| { | |
| "gid": "1213719270559404", | |
| "title": "[A11y] Wayfinding - Channels with activities do not expose the activity", | |
| "status": "done", | |
| "classification": "automatable", | |
| "has_cap_comment": true, | |
| "fix_status": "pending", | |
| "failure_type": null, | |
| "pr_url": null, | |
| "branch": null, | |
| "pattern": null, | |
| "learning": null | |
| }, | |
| { | |
| "gid": "1213719270559412", | |
| "title": "[A11y] Wayfinding - New server, Discover, and Download treeitems lack names", | |
| "status": "done", | |
| "classification": "automatable", | |
| "has_cap_comment": true, | |
| "fix_status": "pending", | |
| "failure_type": null, | |
| "pr_url": null, | |
| "branch": null, | |
| "pattern": null, | |
| "learning": null | |
| }, | |
| { | |
| "gid": "1213719270559420", | |
| "title": "[A11y] Discover - Navigation buttons do not have a state", | |
| "status": "done", | |
| "classification": "automatable", | |
| "has_cap_comment": true, | |
| "fix_status": "pending", | |
| "failure_type": null, | |
| "pr_url": null, | |
| "branch": null, | |
| "pattern": null, | |
| "learning": null | |
| }, | |
| { | |
| "gid": "1213719270559428", | |
| "title": "[A11y] Discover - Main page headings are all level 2", | |
| "status": "done", | |
| "classification": "automatable", | |
| "has_cap_comment": true, | |
| "fix_status": "pending", | |
| "failure_type": null, | |
| "pr_url": null, | |
| "branch": null, | |
| "pattern": null, | |
| "learning": null | |
| }, | |
| { | |
| "gid": "1213719270559436", | |
| "title": "[A11y] Discover: Servers - Expanded info panel verified button lacks a name", | |
| "status": "done", | |
| "classification": "automatable", | |
| "has_cap_comment": true, | |
| "fix_status": "pending", | |
| "failure_type": null, | |
| "pr_url": null, | |
| "branch": null, | |
| "pattern": null, | |
| "learning": null | |
| }, | |
| { | |
| "gid": "1213719270559444", | |
| "title": "[A11y] All calls - Expanded state of more option submenus lack expanded state after refocusing them", | |
| "status": "done", | |
| "classification": "manual", | |
| "has_cap_comment": true, | |
| "fix_status": null, | |
| "failure_type": null, | |
| "pr_url": null, | |
| "branch": null, | |
| "pattern": null, | |
| "learning": null | |
| }, | |
| { | |
| "gid": "1213719270559452", | |
| "title": "[A11y] All calls - Soundboard button lacks a name", | |
| "status": "done", | |
| "classification": "automatable", | |
| "has_cap_comment": true, | |
| "fix_status": "pending", | |
| "failure_type": null, | |
| "pr_url": null, | |
| "branch": null, | |
| "pattern": null, | |
| "learning": null | |
| }, | |
| { | |
| "gid": "1213719270559460", | |
| "title": "[A11y] All calls - Tiles receive focus before all other call content", | |
| "status": "done", | |
| "classification": "automatable", | |
| "has_cap_comment": true, | |
| "fix_status": "pending", | |
| "failure_type": null, | |
| "pr_url": null, | |
| "branch": null, | |
| "pattern": null, | |
| "learning": null | |
| }, | |
| { | |
| "gid": "1213719270559468", | |
| "title": "[A11y] Screen share in a DM - More option buttons for mic and video lack sufficient labeling", | |
| "status": "done", | |
| "classification": "automatable", | |
| "has_cap_comment": true, | |
| "fix_status": "pending", | |
| "failure_type": null, | |
| "pr_url": null, | |
| "branch": null, | |
| "pattern": null, | |
| "learning": null | |
| }, | |
| { | |
| "gid": "1213719270559476", | |
| "title": "[A11y] Screen Share - Stream quality is called a button but has no action", | |
| "status": "done", | |
| "classification": "automatable", | |
| "has_cap_comment": true, | |
| "fix_status": "pending", | |
| "failure_type": null, | |
| "pr_url": null, | |
| "branch": null, | |
| "pattern": null, | |
| "learning": null | |
| }, | |
| { | |
| "gid": "1213719270559484", | |
| "title": "[A11y] Channel call - Channel buttons do not receive focus", | |
| "status": "done", | |
| "classification": "automatable", | |
| "has_cap_comment": true, | |
| "fix_status": "pending", | |
| "failure_type": null, | |
| "pr_url": null, | |
| "branch": null, | |
| "pattern": null, | |
| "learning": null | |
| }, | |
| { | |
| "gid": "1213719270559492", | |
| "title": "[A11y] Channel Call - Many more option buttons are present without specificity", | |
| "status": "done", | |
| "classification": "automatable", | |
| "has_cap_comment": true, | |
| "fix_status": "pending", | |
| "failure_type": null, | |
| "pr_url": null, | |
| "branch": null, | |
| "pattern": null, | |
| "learning": null | |
| }, | |
| { | |
| "gid": "1213366283228726", | |
| "title": "[A11y] Tab position not announced by screen reader (Tabs component)", | |
| "status": "done", | |
| "classification": "automatable", | |
| "has_cap_comment": false, | |
| "fix_status": "merged", | |
| "failure_type": null, | |
| "pr_url": "https://github.com/discord/discord/pull/271082", | |
| "branch": "umut/a11y-tab-position", | |
| "pattern": null, | |
| "learning": null | |
| }, | |
| { | |
| "gid": "1213315847360285", | |
| "title": "[A11y] Tab position not announced by screen reader (Edit Profile tabs)", | |
| "status": "done", | |
| "classification": "automatable", | |
| "has_cap_comment": false, | |
| "fix_status": "merged", | |
| "failure_type": null, | |
| "pr_url": "https://github.com/discord/discord/pull/271082", | |
| "branch": "umut/a11y-tab-position", | |
| "pattern": null, | |
| "learning": null | |
| }, | |
| { | |
| "gid": "1213315847360288", | |
| "title": "[A11y] Tab position not announced by screen reader (SegmentedControl)", | |
| "status": "done", | |
| "classification": "automatable", | |
| "has_cap_comment": false, | |
| "fix_status": "merged", | |
| "failure_type": null, | |
| "pr_url": "https://github.com/discord/discord/pull/271082", | |
| "branch": "umut/a11y-tab-position", | |
| "pattern": null, | |
| "learning": null | |
| }, | |
| { | |
| "gid": "1213485391151941", | |
| "title": "[A11y] Insufficient contrast: channel icons in notification overrides (opacity 0.6)", | |
| "status": "done", | |
| "classification": "automatable", | |
| "has_cap_comment": false, | |
| "fix_status": "merged", | |
| "failure_type": null, | |
| "pr_url": "https://github.com/discord/discord/pull/271160", | |
| "branch": "umut/a11y-opacity-contrast", | |
| "pattern": null, | |
| "learning": null | |
| }, | |
| { | |
| "gid": "1213502972724148", | |
| "title": "[A11y] Insufficient contrast: home page timestamps and channel subtitles (opacity 0.8)", | |
| "status": "done", | |
| "classification": "automatable", | |
| "has_cap_comment": false, | |
| "fix_status": "merged", | |
| "failure_type": null, | |
| "pr_url": "https://github.com/discord/discord/pull/271160", | |
| "branch": "umut/a11y-opacity-contrast", | |
| "pattern": null, | |
| "learning": null | |
| }, | |
| { | |
| "gid": "1213502972724145", | |
| "title": "[A11y] Insufficient contrast: inactive tab bar icons (opacity 0.5)", | |
| "status": "done", | |
| "classification": "automatable", | |
| "has_cap_comment": false, | |
| "fix_status": "merged", | |
| "failure_type": null, | |
| "pr_url": "https://github.com/discord/discord/pull/271160", | |
| "branch": "umut/a11y-opacity-contrast", | |
| "pattern": null, | |
| "learning": null | |
| }, | |
| { | |
| "gid": "1213485391151936", | |
| "title": "[A11y] Insufficient contrast: guild voice activity badge in light mode (WCAG 1.4.11)", | |
| "status": "done", | |
| "classification": "automatable", | |
| "has_cap_comment": false, | |
| "fix_status": "merged", | |
| "failure_type": null, | |
| "pr_url": "https://github.com/discord/discord/pull/271201", | |
| "branch": "umut/a11y-voice-badge-contrast", | |
| "pattern": null, | |
| "learning": null | |
| }, | |
| { | |
| "gid": "1213195179780112", | |
| "title": "[A11y] Insufficient contrast: text-brand color in light mode (WCAG 1.4.3)", | |
| "status": "done", | |
| "classification": "automatable", | |
| "has_cap_comment": false, | |
| "fix_status": "merged", | |
| "failure_type": null, | |
| "pr_url": "https://github.com/discord/discord/pull/271196", | |
| "branch": "umut/a11y-text-brand-contrast", | |
| "pattern": null, | |
| "learning": null | |
| } | |
| ] |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment