Skip to content

Commit ccce409

Browse files
hindermathCopilot
andcommitted
docs: Lastenheft 06 A11Y-Framework-Fundament erstellt
Neue Datei Lastenheft_06_A11Y_Framework.md (bilingual DE/EN): - Timing-Empfehlung: nach Welle 4, vor Welle 5 (begründet) - R-A11Y-TV-01: IAccessibleWidget-Interface (opt-in) - R-A11Y-TV-02: Fokus-Wechsel als Text-Event - R-A11Y-TV-03: Shortcut-Registrierungs-API - R-A11Y-TV-04: Playwright+axe-Tests in CI integrieren - R-A11Y-TV-05: FakeDriver-Keyboard-Navigations-Tests - R-A11Y-TV-06: High-Contrast-ColorScheme - Playwright-Grenzen bei TUI-Testing klar dokumentiert - Pflichtenheft-Einträge PF-A11Y-01..06 als Vorlage enthalten Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
1 parent 89bafa5 commit ccce409

1 file changed

Lines changed: 277 additions & 0 deletions

File tree

Lastenheft_06_A11Y_Framework.md

Lines changed: 277 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,277 @@
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

Comments
 (0)