Screen-reader accessibility: terminal output has no accessible representation (xterm.js screenReaderMode as reference)
まだ誰も着手していません。
評価
- 難易度
- 5/5
- 見積もり時間
- 1週間以上
- 初心者へのやさしさ
- 45/100
- issue の種類
- 機能追加
- 明瞭さ
- おおむね明確
- 活発さ
- 静か
- 技術スタック
- typescript
調査の方向性
まず、公開されている Terminal のオプションと型、非表示の入力、および canvas にレンダリングされる出力パスを調査します。オプトインの出力表現の参考として、xterm.js screenReaderMode と AccessibilityManager を使用します。オプションが無効な場合の動作を変更せずに、ターミナル出力をスクリーンリーダーから利用できるようになれば完了です。
索引モデルが issue の本文から書いたものです。
説明
Context
We are evaluating ghostty-web as a replacement for xterm.js in Cloud Foundry Stratos (SSH and Kubernetes terminals), attracted by the drop-in API aim and by the fact that the canvas renderer injects no <style> elements — which makes it clean under a hardened CSP (style-src-elem with a nonce) where xterm.js is not. Our evaluation notes are recorded here and here.
The API surface covered everything our component uses (Terminal, FitAddon, open, write, onKey, onResize, dispose). The one gap we found is accessibility, and it is the gap that blocks adoption for us, since screen-reader support is on our roadmap.
What exists today
Reading the shipped [email protected] dist: the hidden input element is decorated correctly — role="textbox", aria-label="Terminal input", aria-multiline — so focus and typing are visible to a screen reader.
The missing piece
Terminal output has no accessible representation. It is canvas pixels with no parallel text alternative: no aria-live region, no equivalent of xterm's screenReaderMode in the options or published types. A screen-reader user can type into the terminal and hears nothing back.
How xterm.js solves it, as a reference
xterm.js ships this behind an ITerminalOptions.screenReaderMode flag (default off, toggleable at runtime — an option-change listener instantiates or disposes the manager). When enabled, an AccessibilityManager maintains a parallel DOM structure alongside the rendered output:
- a live region with
aria-live="assertive"that announces incoming output as it prints; - navigable per-row elements so a user can move through the buffer manually;
- an overflow guard for floods ("Too much output to announce, navigate to rows manually to read").
The point that makes it relevant here: the mechanism is renderer-independent. The same machinery runs under xterm's WebGL renderer — that is VS Code's "screen reader optimized" terminal — so a canvas-rendered terminal and screen-reader access are not in tension. The announcement layer just has to exist alongside the canvas.
Since ghostty-web aims to be API-compatible with xterm.js, screenReaderMode seems like the natural shape for it here too: opt-in, no cost when disabled, and migrations with accessibility requirements can carry their existing option through unchanged.
Happy to share more detail from our evaluation if useful.
- 主要言語
- TypeScript
- スター
- 3k
- フォーク
- 183
- PR マージ指標
- 30日以内にマージされた PR はありません
環境構築
このプロジェクトには開発コンテナ、Dockerfile、コントリビューションガイドがありません。まず README を読み、一般的な手順ははじめてのコントリビューションガイドを参照してください。
はじめの一歩
- issue を最後まで読み、次にプロジェクトのコントリビューションガイドを読みます。
- 着手することを issue にコメントします — 二人が同じ作業をするのを防げます。
- リポジトリをフォークし、ブランチを切って変更します。
- issue 番号を参照したプルリクエストを送ります。
coder/ghostty-web のほかの issue
-
buffer translateToString()/getChars() return '' for empty cells, collapsing cursor-positioned textオープン
難易度 2/5 1〜3時間 初心者へのやさしさ 75/100
coder/ghostty-web#205 ·
-
難易度 2/5 1〜3時間 初心者へのやさしさ 68/100
coder/ghostty-web#204 ·
-
Alt+<printable key> sends the bare key with no ESC prefix (readline/emacs/tmux meta bindings lost)オープン
難易度 2/5 1〜3時間 初心者へのやさしさ 72/100
coder/ghostty-web#203 ·
-
難易度 2/5 1〜3時間 初心者へのやさしさ 72/100
coder/ghostty-web#199 ·
-
Public buffer getChars and translateToString truncate multi-codepoint graphemes対応中かも @schickling-assistant が 13 日前に担当しました。 オープン
難易度 3/5 1〜2日 初心者へのやさしさ 76/100
coder/ghostty-web#200 ·
coder/ghostty-web の issue をすべて見る
似ている issue
-
難易度 2/5 1〜3時間 初心者へのやさしさ 72/100
stellar/stellar-dev-skill#151 ·
メンテナーはふだん 1 日以内に返信
-
area:arcade game ready-for-agent
難易度 2/5 1〜3時間 初心者へのやさしさ 62/100
fderuiter/deruiter.dev#2281 · コメント 1 件 ·
メンテナーはふだん 1 日以内に返信
-
scope: data grid type: bug
難易度 2/5 1〜3時間 初心者へのやさしさ 78/100
メンテナーはふだん 2 日以内に返信
-
fix(frontend): correct VITE_IS_DEVELPOMENT typo in shared/app.ts and align dev environment flagsオープン
難易度 2/5 1〜3時間 初心者へのやさしさ 75/100
vicharanashala/ajrasakha#1439 ·
メンテナーはふだん 1 日以内に返信
-
Add: TV5Monde Asieオープンapproved check:passed streams:add
難易度 2/5 1〜3時間 初心者へのやさしさ 68/100
メンテナーはふだん 1 日以内に返信