|
| 1 | +# Lastenheft: Barrierefreiheits-Fundament TuiVision (A11Y Framework Layer) |
| 2 | + |
| 3 | +**Dokument-Status:** Entwurf |
| 4 | +**Erstellt:** 2026-03-31 |
| 5 | +**Betrifft:** `src/TuiVision.Core/`, `src/TuiVision.Controls/`, |
| 6 | +`src/TuiVision.Drivers.Console/`, `tests/TuiVision.Core.Tests/`, |
| 7 | +`tests/TuiVision.Controls.Tests/`, `tests/web-a11y/` |
| 8 | +**Grundlage:** `docs/tui-a11y-assessment.md` im RiderProjects-Workspace |
| 9 | + |
| 10 | +--- |
| 11 | + |
| 12 | +## ⏰ Empfohlener Durchführungszeitraum / Recommended timing |
| 13 | + |
| 14 | +**Deutsch:** |
| 15 | +Dieses Lastenheft soll **nach dem Abschluss von Welle 4** (alle 25 Original-Turbo-Vision-Beispiele |
| 16 | +portiert und per Smoke-Test abgenommen) und **vor dem Start von Welle 5** (TP7-Demos aus `TVDEMOS/`) |
| 17 | +umgesetzt werden. |
| 18 | + |
| 19 | +Begründung: Erst nach Welle 4 sind alle Framework-Primitive (TView, TEvent, TDriver, Steuerelemente, |
| 20 | +Dialoge, Editor, Terminal-Emulation) vollständig und stabil. Ein vorher eingeführtes |
| 21 | +`IAccessibleWidget`-Interface würde durch spätere Portierungsarbeiten riskieren, mehrfach |
| 22 | +gebrochen zu werden. Nach Welle 4 ist die Interface-Stabilität gesichert und die |
| 23 | +TP7-Demos aus Welle 5 können von Beginn an auf dem A11Y-Fundament aufsetzen. |
| 24 | + |
| 25 | +**Pflichtenheft-Integration:** Die Anforderungen aus diesem Lastenheft sollen nach Umsetzung |
| 26 | +als neue `PF-A11Y-*` Einträge in `Pflichtenheft.md` eingetragen werden, mit |
| 27 | +Reihenfolgehinweis: „nach Welle 4, vor Welle 5". |
| 28 | + |
| 29 | +*This requirements document should be implemented **after Wave 4 is complete** (all 25 original |
| 30 | +Turbo Vision examples ported and smoke-tested) and **before Wave 5 starts** (TP7 demos from |
| 31 | +`TVDEMOS/`). Rationale: all framework primitives are stable after Wave 4; introducing an |
| 32 | +`IAccessibleWidget` interface earlier risks repeated breakage during porting work. After Wave 4, |
| 33 | +interface stability is guaranteed and Wave 5 TP7 demos can build on the A11Y foundation from the start.* |
| 34 | + |
| 35 | +--- |
| 36 | + |
| 37 | +## 1. Ausgangslage und Problemstellung / Background and Problem Statement |
| 38 | + |
| 39 | +TuiVision portiert Turbo Vision 2.0.3 — eine Bibliothek, die 1991 für DOS entwickelt wurde, |
| 40 | +also **vor allen modernen Accessibility-Standards**. Der C#-Port erbt dieses Modell: |
| 41 | +rein visuelles Rendering über ANSI-Escape-Codes, keine Semantik-Schicht, kein |
| 42 | +Accessibility-Tree. |
| 43 | + |
| 44 | +Das Projektprinzip `Programmierung #include<everyone>` verpflichtet das Projekt, |
| 45 | +Barrierefreiheit nicht als nachträglichen Zusatz zu behandeln, sondern als |
| 46 | +bewusste Architektur-Entscheidung — auch wenn Terminal-Anwendungen keine |
| 47 | +vollständige WCAG-2.2-Konformität wie Web-Anwendungen erreichen können. |
| 48 | + |
| 49 | +TuiVision already provides the strongest A11Y practice in this workspace through |
| 50 | +its Playwright+axe testing for generated documentation HTML. This document extends |
| 51 | +that practice to the framework layer itself. |
| 52 | + |
| 53 | +*TuiVision ports Turbo Vision 2.0.3 — a library designed in 1991 for DOS, before any modern |
| 54 | +accessibility standards. The C# port inherits this model: purely visual ANSI rendering, no semantic |
| 55 | +layer, no accessibility tree. The `Programmierung #include<everyone>` principle requires treating |
| 56 | +accessibility as an architectural decision, not an afterthought.* |
| 57 | + |
| 58 | +--- |
| 59 | + |
| 60 | +## 2. Ziele / Goals |
| 61 | + |
| 62 | +- Ein Minimum-Viable-A11Y-Fundament schaffen, auf dem TP7-Demos und spätere |
| 63 | + Framework-Erweiterungen aufbauen können. |
| 64 | +- Alle Informationen, die nur visuell vermittelt werden (Farbe, Cursor-Position), |
| 65 | + zusätzlich als maschinenlesbare Text-Repräsentation verfügbar machen. |
| 66 | +- Vollständige Tastaturnavigation ohne Maus sicherstellen und testbar machen. |
| 67 | +- Die bereits vorhandenen Playwright+axe-Tests für Dokumentations-HTML in |
| 68 | + die CI/CD-Pipeline integrieren (aktuell: manuell). |
| 69 | + |
| 70 | +*Create a minimum-viable A11Y foundation that TP7 demos and future framework extensions can build |
| 71 | +on. Make all visually-only information available as machine-readable text. Ensure and test complete |
| 72 | +keyboard navigation without a mouse. Integrate the existing Playwright+axe documentation tests into CI.* |
| 73 | + |
| 74 | +--- |
| 75 | + |
| 76 | +## 3. Anforderungen / Requirements |
| 77 | + |
| 78 | +### R-A11Y-TV-01: `IAccessibleWidget`-Interface im Framework-Kern |
| 79 | + |
| 80 | +Das Framework muss ein `IAccessibleWidget`-Interface in `TuiVision.Core` einführen, |
| 81 | +das Steuerelemente mit einer maschinenlesbaren Textbeschreibung ausstatten kann. |
| 82 | +Das Interface ist bewusst minimal gehalten — es muss keine Screen-Reader-API |
| 83 | +implementieren, sondern nur die Voraussetzung schaffen. |
| 84 | + |
| 85 | +Mindest-Interface: |
| 86 | + |
| 87 | +```csharp |
| 88 | +/// <summary> |
| 89 | +/// Stellt barrierefreie Metadaten für ein TuiVision-Steuerelement bereit. |
| 90 | +/// Provides accessible metadata for a TuiVision control. |
| 91 | +/// </summary> |
| 92 | +public interface IAccessibleWidget |
| 93 | +{ |
| 94 | + /// <summary>Zugängliche Bezeichnung / Accessible label.</summary> |
| 95 | + string? AccessibleLabel { get; } |
| 96 | + |
| 97 | + /// <summary>Kurze Beschreibung der Funktion / Short description of the function.</summary> |
| 98 | + string? AccessibleDescription { get; } |
| 99 | + |
| 100 | + /// <summary>Gibt an, ob das Steuerelement den Tastaturfokus aufnehmen kann.</summary> |
| 101 | + bool CanReceiveFocus { get; } |
| 102 | +} |
| 103 | +``` |
| 104 | + |
| 105 | +Das Interface ist **opt-in**: bestehende Steuerelemente in `TuiVision.Controls` |
| 106 | +müssen es nicht sofort implementieren. Es soll jedoch als Standard-Muster |
| 107 | +in allen neu portierten Steuerelementen (Welle 5+) eingesetzt werden. |
| 108 | + |
| 109 | +*The framework must introduce an `IAccessibleWidget` interface in `TuiVision.Core` that can equip |
| 110 | +controls with a machine-readable text description. The interface is intentionally minimal — it does |
| 111 | +not need to implement a screen reader API, only establish the prerequisite. It is opt-in: existing |
| 112 | +controls are not required to implement it immediately.* |
| 113 | + |
| 114 | +### R-A11Y-TV-02: Text-Repräsentation für Fokus- und Status-Ereignisse |
| 115 | + |
| 116 | +Wenn der Fokus von einem Steuerelement zu einem anderen wechselt, muss dieser |
| 117 | +Wechsel als Text-Event propagiert werden — über eine neue oder erweiterte |
| 118 | +Methode im `TEvent`-System. Der Event muss das `AccessibleLabel` des neuen |
| 119 | +fokussierten Steuerelements (falls implementiert) enthalten. |
| 120 | + |
| 121 | +Ziel: Eine spätere Screen-Reader-Integration oder ein Status-Monitor kann |
| 122 | +diesen Event abonnieren, ohne im Framework-Kern zu ändern. |
| 123 | + |
| 124 | +*When focus moves between controls, the change must propagate as a text event through the `TEvent` |
| 125 | +system, containing the `AccessibleLabel` of the newly focused control. Goal: a future screen reader |
| 126 | +integration or status monitor can subscribe to this event without changes to the framework core.* |
| 127 | + |
| 128 | +### R-A11Y-TV-03: Shortcut-Registrierung als Framework-Vertrag |
| 129 | + |
| 130 | +Tastatur-Shortcuts, die in Anwendungen über TuiVision angeboten werden (z. B. |
| 131 | +in `TStatusLine` oder `TMenuBar`), sollen über eine strukturierte API |
| 132 | +registrierbar sein — nicht nur als sichtbarer Text in der Statuszeile. |
| 133 | + |
| 134 | +Ziel: Shortcuts sind programmatisch abfragbar, was spätere Automatisierungstests |
| 135 | +und Screen-Reader-Integrationen ermöglicht. |
| 136 | + |
| 137 | +Dieses Requirement ist ausdrücklich auf die **API-Definition** beschränkt. |
| 138 | +Die vollständige Implementierung in allen Beispielanwendungen ist Bestandteil |
| 139 | +von Welle 5 und 6. |
| 140 | + |
| 141 | +*Keyboard shortcuts offered through TuiVision controls should be registerable via a structured API — |
| 142 | +not only as visible text in the status line. Goal: shortcuts are programmatically queryable, |
| 143 | +enabling future automated tests and screen reader integrations.* |
| 144 | + |
| 145 | +### R-A11Y-TV-04: Playwright+axe-Tests für Dokumentations-HTML in CI/CD integrieren |
| 146 | + |
| 147 | +Die vorhandenen Tests in `tests/web-a11y/` (Playwright + `@axe-core/playwright`, |
| 148 | +wcag22aa-Prüfung, lynx-Validierung) sind **manuell** und nicht in `ci.yml` integriert. |
| 149 | +Diese Tests müssen in die CI/CD-Pipeline aufgenommen werden — als eigener |
| 150 | +CI-Job, der bei jedem Push auf `main` oder bei einem DocFX-Regen-PR ausgeführt wird. |
| 151 | + |
| 152 | +*The existing tests in `tests/web-a11y/` (Playwright + axe, wcag22aa, lynx validation) are manual |
| 153 | +and not integrated into CI. They must be added to the CI/CD pipeline as a dedicated job that runs |
| 154 | +on every push to main or on any DocFX regeneration PR.* |
| 155 | + |
| 156 | +### R-A11Y-TV-05: Tastaturnavigation lückenlos sicherstellen |
| 157 | + |
| 158 | +Alle Steuerelemente in `TuiVision.Controls`, die `CanFocus = true` setzen, |
| 159 | +müssen per Tab/Shift+Tab, Pfeiltasten und Enter vollständig erreichbar und |
| 160 | +aktivierbar sein. Dies ist durch Unit-Tests im `FakeDriver`-Modus zu verifizieren. |
| 161 | + |
| 162 | +*All controls in `TuiVision.Controls` with `CanFocus = true` must be fully reachable and activatable |
| 163 | +via Tab/Shift+Tab, arrow keys, and Enter. This must be verified by unit tests in FakeDriver mode.* |
| 164 | + |
| 165 | +### R-A11Y-TV-06: High-Contrast-ColorScheme als Framework-Option |
| 166 | + |
| 167 | +Das Framework muss mindestens ein High-Contrast-`ColorScheme` bereitstellen |
| 168 | +(schwarzer Hintergrund, weißer Text, gelbe oder cyan Akzente, kein Grau als |
| 169 | +einziger Unterschied). Anwendungen können dieses Scheme über eine einfache |
| 170 | +API aktivieren. |
| 171 | + |
| 172 | +*The framework must provide at least one high-contrast `ColorScheme` (black background, white text, |
| 173 | +yellow or cyan accents, no grey-only distinctions). Applications can activate this scheme via a |
| 174 | +simple API.* |
| 175 | + |
| 176 | +--- |
| 177 | + |
| 178 | +## 4. Hinweis zu Playwright und Terminal-TUI-Testing |
| 179 | + |
| 180 | +**Playwright kann Terminal-UIs nicht direkt testen.** |
| 181 | +Playwright ist für Web-Browser entwickelt und kennt keine ANSI-Escape-Sequenzen. |
| 182 | + |
| 183 | +| Testansatz | Machbarkeit für TuiVision | Anmerkung | |
| 184 | +|-----------|:-------------------------:|-----------| |
| 185 | +| Playwright + axe: Docs-HTML | ✅ bereits vorhanden | `tests/web-a11y/` | |
| 186 | +| Playwright: Terminal-UI direkt | ❌ nicht möglich | ANSI kein Browser | |
| 187 | +| xterm.js-WebFrontend + Playwright | ⚠️ möglich, sehr aufwändig | kein Scope dieses LH | |
| 188 | +| Prozess-stdin/stdout-Tests | ✅ machbar (xUnit) | für Keyboard-Navigation | |
| 189 | +| FakeDriver-Unit-Tests | ✅ bereits in TuiVision genutzt | für Steuerelement-Logik | |
| 190 | +| Manuelle Tests: VoiceOver / NVDA / Orca | ✅ empfohlen | auf echtem Terminal | |
| 191 | + |
| 192 | +**Empfehlung:** Playwright bleibt auf Dokumentations-HTML beschränkt (R-A11Y-TV-04). |
| 193 | +Für die Terminal-UI selbst sind FakeDriver-Unit-Tests (R-A11Y-TV-05) und |
| 194 | +prozessbasierte Integrationstests die richtigen Werkzeuge. |
| 195 | + |
| 196 | +*Playwright cannot test terminal UIs. It remains restricted to documentation HTML (R-A11Y-TV-04). |
| 197 | +For the terminal UI itself, FakeDriver unit tests and process-based integration tests are the |
| 198 | +appropriate tools.* |
| 199 | + |
| 200 | +--- |
| 201 | + |
| 202 | +## 5. Nicht im Scope / Out of Scope |
| 203 | + |
| 204 | +- Vollständige UI-Automation-API-Integration (AT-SPI2, NSAccessibility, UI Automation) |
| 205 | +- Screen-Reader-Sprachausgabe direkt aus der Bibliothek |
| 206 | +- Vollständige WCAG 2.2 AA-Konformität für die Terminal-UI |
| 207 | + (erreichbar nur für Web/native GUI — Terminal ist eine Einschränkung der Plattform) |
| 208 | +- Maus als primärer Eingabekanal |
| 209 | +- Änderungen am Porting-Umfang der Wellen 1–4 |
| 210 | + |
| 211 | +*Out of scope: full UI automation API integration, direct speech output, full WCAG 2.2 AA for the |
| 212 | +terminal UI itself (a platform limitation), mouse as primary input, changes to the wave 1–4 porting scope.* |
| 213 | + |
| 214 | +--- |
| 215 | + |
| 216 | +## 6. Akzeptanzkriterien / Acceptance Criteria |
| 217 | + |
| 218 | +| ID | Kriterium / Criterion | |
| 219 | +|----|-----------------------| |
| 220 | +| AK-A11Y-TV-01 | `IAccessibleWidget`-Interface in `TuiVision.Core` vorhanden; XML-Dok vollständig | |
| 221 | +| AK-A11Y-TV-02 | Fokus-Wechsel propagiert Text-Event mit `AccessibleLabel` des Ziel-Steuerelements | |
| 222 | +| AK-A11Y-TV-03 | Shortcut-API definiert und in `TStatusLine` und `TMenuBar` als Beispiel implementiert | |
| 223 | +| AK-A11Y-TV-04 | Playwright+axe-Tests in `ci.yml` integriert; CI-Job grün auf main | |
| 224 | +| AK-A11Y-TV-05 | FakeDriver-Unit-Tests für vollständige Tab-Navigation aller `CanFocus=true`-Controls | |
| 225 | +| AK-A11Y-TV-06 | High-Contrast-ColorScheme in Framework-API verfügbar; Beispiel-App nutzt es | |
| 226 | +| AK-A11Y-TV-07 | `Pflichtenheft.md` enthält `PF-A11Y-*` Einträge mit Reihenfolgehinweis „nach Welle 4" | |
| 227 | + |
| 228 | +--- |
| 229 | + |
| 230 | +## 7. Pflichtenheft-Einträge (nach Umsetzung einzutragen) |
| 231 | + |
| 232 | +Nach Abschluss der Umsetzung dieses Lastenhefte sind folgende Einträge in |
| 233 | +`Pflichtenheft.md` unter einem neuen Abschnitt `9. Barrierefreiheits-Fundament` |
| 234 | +einzutragen: |
| 235 | + |
| 236 | +``` |
| 237 | +- [ ] PF-A11Y-01: IAccessibleWidget-Interface in TuiVision.Core |
| 238 | + Reihenfolgehinweis: nach Welle 4 (alle 25 MUSS-Beispiele abgeschlossen). |
| 239 | +- [ ] PF-A11Y-02: Fokus-Wechsel als Text-Event |
| 240 | + Reihenfolgehinweis: nach PF-A11Y-01. |
| 241 | +- [ ] PF-A11Y-03: Shortcut-Registrierungs-API |
| 242 | + Reihenfolgehinweis: nach PF-A11Y-01; Welle 5 baut darauf auf. |
| 243 | +- [ ] PF-A11Y-04: Playwright+axe in CI/CD |
| 244 | + Reihenfolgehinweis: unabhängig, kann parallel zu Welle 4 umgesetzt werden. |
| 245 | +- [ ] PF-A11Y-05: FakeDriver-Keyboard-Tests |
| 246 | + Reihenfolgehinweis: ab sofort; nicht auf Welle 4 warten. |
| 247 | +- [ ] PF-A11Y-06: High-Contrast-ColorScheme |
| 248 | + Reihenfolgehinweis: nach PF-A11Y-01. |
| 249 | +``` |
| 250 | + |
| 251 | +--- |
| 252 | + |
| 253 | +## 8. Beispiel: Agentic-AI-Dialog (Platzhalter für spätere Durchführung) |
| 254 | + |
| 255 | +Dieser Abschnitt wird während der Umsetzung mit Agentic-AI plus Spec-Kit/SDD |
| 256 | +befüllt — jeder Schritt mit Commit-URL und Zeitstempel, analog zu den |
| 257 | +bestehenden TuiVision-Lastenhefte-Dialogen. |
| 258 | + |
| 259 | +--- |
| 260 | + |
| 261 | +## 9. Hinweis für Lernende / Note for learners |
| 262 | + |
| 263 | +**Deutsch:** TuiVision zeigt, wie Barrierefreiheit schrittweise in ein bestehendes |
| 264 | +Framework eingebaut werden kann. Ein Interface wie `IAccessibleWidget` ist kein |
| 265 | +vollständiger Screen-Reader — es ist ein Versprechen: „Dieses Steuerelement kann |
| 266 | +beschreiben, was es tut." Auf diesem Versprechen kann später aufgebaut werden. |
| 267 | + |
| 268 | +Die wichtigste Lektion: Barrierefreiheit wird nicht durch einen einzigen großen |
| 269 | +PR nachgerüstet. Sie entsteht durch viele kleine, konsistente Entscheidungen — |
| 270 | +und durch das richtige Timing (nach Welle 4, nicht vorher). |
| 271 | + |
| 272 | +**English:** TuiVision demonstrates how accessibility can be incrementally added to an existing |
| 273 | +framework. An interface like `IAccessibleWidget` is not a full screen reader — it is a promise: |
| 274 | +"this control can describe what it does." Later work can build on this promise. |
| 275 | + |
| 276 | +The key lesson: accessibility is not retrofitted in one large PR. It emerges from many small, |
| 277 | +consistent decisions — and from the right timing (after Wave 4, not before). |
0 commit comments