Files
codewhale/docs/ACCESSIBILITY.md
T
Hunter Bown 6dfb10f321 feat(a11y): NO_ANIMATIONS env override + accessibility docs (#450)
`fancy_animations: false` and `low_motion: true` already exist on
the settings struct, but the flag was undocumented and the only
ways to opt in were the `/settings` slash command or hand-editing
`~/.config/deepseek/settings.toml` — there was no environment-
level signal that platform a11y tooling could carry forward.

* `NO_ANIMATIONS=1` env var now forces `low_motion = true` and
  `fancy_animations = false` at startup, regardless of what's on
  disk. Recognises `1`, `true`, `yes`, `on` (case-insensitive);
  any other value is treated as unset.
* `Settings::apply_env_overrides()` is now called at the end of
  `Settings::load()`, so every consumer (App::new, /config, the
  doctor surface) sees the override applied uniformly. The
  override is a startup-time overlay — changing the env var
  mid-session has no effect.
* New `docs/ACCESSIBILITY.md` documents the existing `low_motion`,
  `fancy_animations`, `calm_mode`, `show_thinking`, and
  `show_tool_details` toggles plus the `NO_ANIMATIONS` startup
  override. Includes guidance for screen-reader users and a link
  back to this issue for follow-up motion regressions.

Tests:
  3 new tests in `settings.rs` (force-low-motion-on, override-
  user-opt-in, truthy-spelling-recognition). All three serialise
  through a static Mutex so the cargo parallel runner doesn't
  observe interleaved env mutations.
2026-05-03 05:09:17 -05:00

75 lines
3.4 KiB
Markdown

# Accessibility
DeepSeek-TUI runs in a terminal, so the platform's own accessibility
stack (screen readers, magnifiers, terminal-level themes) does most
of the work. The TUI provides a small set of toggles that reduce
visual motion and density for screen-reader and low-motion users.
## Quick reference
| Toggle | Default | Effect |
| --- | --- | --- |
| `NO_ANIMATIONS=1` env var | unset | At startup, forces `low_motion = true` and `fancy_animations = false`. Overrides whatever's saved in `settings.toml`. |
| `low_motion` setting | `false` | Suppresses spinners' motion, transcript fade-ins, footer drift, and the active-cell pulse. The frame-rate limiter also slows down idle redraws so the cursor doesn't blink as aggressively. |
| `fancy_animations` setting | `false` | Footer water-spout strip and pulsing sub-agent counter. Off by default. |
| `calm_mode` setting | `false` | Collapses tool-output details by default and trims status messages. Useful for screen readers that announce every redraw. |
| `show_thinking` setting | `true` | Set to `false` to hide model `reasoning_content` blocks entirely. |
| `show_tool_details` setting | `true` | Set to `false` to render tool calls as one-liners without expanded payloads. |
## Standard env-var surface
Set these in your shell profile so they apply to every session:
```bash
# Force low-motion + no fancy animations.
export NO_ANIMATIONS=1
# Optional: respect the wider terminal-color convention.
export NO_COLOR=1 # honored by the underlying ratatui backend
```
`NO_ANIMATIONS` accepts any of `1`, `true`, `yes`, or `on`
(case-insensitive). Any other value (including `0`, `false`, empty,
or unset) leaves your saved settings alone.
The override is applied once at startup. Changing the env var
mid-session has no effect — settings are only re-read on the next
launch.
## Configuring via `/settings`
The same toggles are reachable from the command palette:
* `/settings set low_motion on`
* `/settings set fancy_animations off`
* `/settings set calm_mode on`
Settings written this way persist to `~/.config/deepseek/settings.toml`.
The `NO_ANIMATIONS` env var still wins at startup if it's set, so
unsetting the env var is the way to honor your saved choice.
## Notes for screen-reader users
* `low_motion` slows the idle redraw loop to ~120ms per frame so
the cursor isn't constantly repositioned. Combined with
`calm_mode`, the redraw rate stays low enough that VoiceOver /
Orca announcements track linearly with model output instead of
re-reading the whole screen on each tick.
* The transcript is pure text — no images or canvas rendering — so
any terminal that integrates with the platform's accessibility
service (e.g. macOS Terminal.app, iTerm2, Ghostty, Windows
Terminal) will pass the rendered content straight through.
* If you find a UI surface that still produces motion when
`low_motion = true`, please file an issue against
[`PRIOR: Screen-reader / accessibility flag`](https://github.com/Hmbown/DeepSeek-TUI/issues/450)
with a screenshot or terminal recording.
## Related issues / history
* [#450](https://github.com/Hmbown/DeepSeek-TUI/issues/450) —
documenting the existing flag, adding the `NO_ANIMATIONS`
startup overlay, and writing this page.
* [#449](https://github.com/Hmbown/DeepSeek-TUI/issues/449) —
footer statusline now uses the active theme's contrast pair
instead of a bespoke palette.