mcpField
B
bevy-a11y

bevy-a11y

github.com/chrisgliddonDesign & UI2659 installsUpdated 9w ago
Repository

About bevy-a11y

A game accessibility skill for Bevy developers, covering input, UI, audio, cameras, and testing. It draws on game accessibility guidance, WCAG, and platform requirements, with disabled-player testing and evidence tracking.

Key features

  1. 01Remappable input and multi-device support
  2. 02Non-pointer UI navigation and semantics
  3. 03Captions, audio description, and visual cues
  4. 04Controls for motion, flashes, and camera effects
  5. 05Scripts for input, contrast, and caption audits
  6. 06Disabled-player testing and remediation records

Use cases

  1. 01Review game mechanics for accessibility during design
  2. 02Plan focus and screen-reader support for custom Bevy UI
  3. 03Check input maps, contrast, and captions before release
  4. 04Prepare test findings and remediation evidence for platform review

Install

Copy the command and run it in a terminal.

$npx skills add https://github.com/chrisgliddon/bevy-skills --skill bevy-a11y

After installing, type/bevy-a11yin Claude Code to confirm it loaded.

Bundled files

References and scripts installed along with SKILL.md.

references/
captions-audio-communication.md
input-and-adaptive-controllers.md
requirements.md
screen-readers-and-navigation.md
testing-and-evidence.md
tooling.md
visual-cognitive-motion.md
scripts/
audit_input_map.py
check_contrast.py
validate_captions.py
tests/
test_scripts.py
tests/fixtures/
contrast.json
en-US.vtt
fr-FR.vtt
input-map.json

Details

From the project README

Bevy 0.19 — game accessibility

Accessibility is a cross-cutting product requirement. Start during input, UI, audio, camera, narrative, multiplayer, and save-system design; retrofitting only labels and captions will not solve inaccessible game mechanics.

Standard of work

Use all four layers:

  1. Xbox Accessibility Guidelines as the public game-specific engineering baseline.
  2. WCAG 2.2 criteria, aiming at AAA where they transfer meaningfully to game UI/content.
  3. Platform-holder requirements and certification guidance for every shipping target.
  4. Usability testing with disabled players using their own assistive technology.

WCAG AAA is not a universal native-game certification, and automated checks do not establish conformance. Record scope, exceptions, devices, test builds, findings, and remediation evidence. See requirements.

Ship these foundations first

  • Every gameplay and UI action is device-neutral, remappable, conflict-checked, persistable, and available through menus without a pointer.
  • Input supports hotplug, simultaneous devices, multiple controllers per player, unknown controls, adjustable deadzones/sensitivity, and digital analog alternatives.
  • Holds, repeated presses, chords, rapid timing, and precision input have toggle, timing, or assist alternatives.
  • UI has deterministic focus order, visible focus, semantic roles/names/states, scalable text/layout, adequate contrast, and no information conveyed only by colour.
  • Dialogue and meaningful audio have synchronized closed captions; meaningful visual events have narration/audio-description or equivalent cues.
  • Camera shake, motion blur, flashes, auto-motion, and other vestibular/photosensitive effects have safe defaults or independent controls.
  • Accessibility settings are available before first gameplay and remain usable after rebinding, language changes, disconnects, and save migration.

Bevy UI semantics and focus

DefaultPlugins includes InputFocusPlugin. Add navigation plugins explicitly and put the accessible name on the same entity as the interactive control:

use bevy::{
    input_focus::{
        directional_navigation::DirectionalNavigationPlugin,
        tab_navigation::TabNavigationPlugin,
    },
    prelude::*,
    ui::auto_directional_navigation::AutoDirectionalNavigation,
};

fn main() {
    App::new()
        .add_plugins((
            DefaultPlugins,
            TabNavigationPlugin,
            DirectionalNavigationPlugin,
        ))
        .add_systems(Startup, setup)
        .run();
}

fn setup(mut commands: Commands) {
    commands.spawn(Camera2d);
    commands.spawn((
        Button,
        AccessibleLabel::new("Start game"),
        AutoDirectionalNavigation::default(),
        children![Text::new("Start game")],
    ));
}

Focus, hover, pointer capture, and screen-reader focus are related but not identical. Test keyboard, D-pad/stick, switch-style scanning, touch, pointer, and a real screen reader. Use AccessKit nodes for custom widgets and expose changing value/state—not only a static label. See screen readers and navigation.

Adaptive and accessibility controllers

Adaptive controllers normally arrive through standard gamepad/HID mappings. Do not gate features on a brand, vendor ID, or a particular device name. Treat every Gamepad entity as capabilities and bindings:

use bevy::prelude::*;

fn read_gamepads(gamepads: Query<(Entity, &Gamepad)>) {
    for (entity, gamepad) in &gamepads {
        let move_axis = gamepad.left_stick();
        let activate = gamepad.just_pressed(GamepadButton::South);
        let extra = gamepad.just_pressed(GamepadButton::Other(0));
        let _sample = (entity, move_axis, activate, extra);
    }
}

With default-features = false, native discovery requires Bevy's bevy_gilrs feature, not only gamepad. leafwing-input-manager 0.21 is a compatible optional action layer, but it does not create accessible settings, UI, persistence, or mechanic alternatives for you. See input and adaptive controllers.

Requirements by access need

AreaNon-negotiable implementation
Blind/low visionsemantic UI, full non-pointer navigation, narration/audio description, text scale, strong focus/contrast, non-colour cues
Deaf/hard of hearingclosed captions with speaker and meaningful sound cues, visual/haptic equivalents, independent mix controls
Motorfull remapping, simultaneous devices, no mandatory holds/mashing/chords, timing/aim/movement assists, pauseability where possible
Cognitive/learningconsistent navigation, plain language, objective history, tutorials, adjustable pacing/difficulty, low-distraction modes
Speech/communicationno voice-only requirement, accessible text chat, speech-to-text/text-to-speech where communication is core
Photosensitive/vestibularflash safety, reduced motion, shake/FOV/blur controls, no essential parallax/auto-motion

Read visual, cognitive, and motion and captions, audio, and communication.

Implementation gates

  • Run scripts/audit_input_map.py on the action manifest before input freezes.
  • Run scripts/check_contrast.py on every theme/state pair; sample image/video backgrounds separately.
  • Run scripts/validate_captions.py on source and localized VTT/SRT files.
  • Execute the manual matrix in testing and evidence.
  • Do not advertise accessibility feature tags until the shipping build and supported input/platform combinations have been verified.

Script formats and CI examples are in tooling.

See also

  • bevy-input-actions — logical actions, remapping, device hot-plug, Steam Deck, and adaptive-controller integration.
  • bevy-audio — captions/cue boundary, category mixes, spatial limitations, and browser audio startup.
  • bevy-ui — layout, text, interaction, and focus APIs.
  • bevy-cargo-features — controller and UI backends.
  • bevy-fluent — localized text and captions.
  • bevy-cameras — shake, FOV, and viewport controls.
  • bevy-physics — accessible character movement, aim, and timing mechanics built over physics.
  • bevy-testing — deterministic checks and capture evidence.
  • bevy-core-concepts — schedule architecture.

Comments

Markdown supported