Pruefdurchgang ueber alle 26 Bildschirme - fuenf Fehler behoben, HIG nachgezogen

Gemessen statt geschaut: eine Pruefroutine lief auf jedem Bildschirm und
pruefte Ueberlauf, Tippziele, abgeschnittenen Text, Bilder ohne Quelle und
WCAG-Kontrast fuer jeden Textknoten. Dazu die Live-App mit echten Daten, die
Musterseite fuer Leerzustaende und das Panel zum Abgleich.

1. Deutsche Datumsangaben wurden falsch gelesen. new Date("01.03.2025")
   liest amerikanisch: Tage bis 12 wurden still vertauscht, ab Tag 13 fiel
   der Wert ganz weg. Die Erstzulassung stand auf zwei Bildschirmen
   unterschiedlich da. alsZeitpunkt() erkennt jetzt ISO, TT.MM.JJJJ und
   MM/JJJJ, weist unmoegliche Daten ab und fuehrt die Genauigkeit mit -
   aus "08/2026" wird "August 2026", kein erfundener Erster.

2. Die Hauptuntersuchung war in beiden Oberflaechen unerreichbar. Das Panel
   leitete sie aus der Erstzulassung ab, aber nur bei MM/JJJJ, und benutzte
   den eingetragenen Wert gar nicht. Jetzt beide: eingetragene Faelligkeit
   vor Servicebuch vor Erstzulassung + 24 Monate.

3. Die Tankstellenmarke stand zweimal da, wenn der Name kein Komma hat
   ("Shell München Ost"). ohneMarkeVorn() nimmt sie vorn ab.

4. Bilder wurden geholt, obwohl beide wussten, dass es sie nicht gibt -
   fuenf 404 fuer dieselbe Datei in einem Ladevorgang. Jetzt gar keine
   Adresse bei Stand 0; nachgemessen 4 Anfragen, alle 200.

5. Ein Bildelement ohne Quelle zeigte das kaputte Bildsymbol, und onerror
   greift dort nicht: ohne src gibt es keinen Ladeversuch.

Dazu: leere Klammern beim Steuersatz, leere graue Kachel bei leerer
Leistungsgruppe, Umbruch auf dem Einrichtungsbildschirm, drei
Leerdarstellungen in einer Kachel, fehlende Grundschrift.

Apple HIG: Kontrast war an einer Stelle 3,18 statt 4,5, weisse Schrift auf
der Loeschflaeche 3,41/3,55. Rot als Schrift und Rot als Flaeche sind jetzt
getrennte Token (--bad / --bad-flaeche), beide Apples systemRed fuer
erhoehten Kontrast. Tippziele: unsichtbares 44x44-Overlay, wo die sichtbare
Groesse Teil des Bildes ist, echte Mindesthoehe, wo das Element Flaeche ist -
Formulare werden dadurch sichtbar hoeher.

Neu auf Wunsch: Wischen in der Bildergalerie (beide Richtungen) und die
HIG-konforme Loeschgeste - ein voller Wisch loescht ohne zweiten Tipp, ab
55 % der Zeilenbreite, mit wachsender roter Flaeche und erhaltener
Rueckfrage. Dabei fiel auf, dass der Zugwert aus dem React-Zustand gelesen
wurde und ein schneller Wisch dadurch verlorenging; er liegt jetzt in einer
Referenz.

Paritaet: alle 26 Routen und Titel decken sich, Fahrzeugstatus zeilengleich,
zwei ungeplante Abweichungen (Datumsformatierung, Herkunft der
Hauptuntersuchung) geschlossen.

tsc sauber, 271 Tests, vite build sauber, Design-System gebaut, Panel als
Modul geparst, audi_ha_test auf 2026.9.4.23 ohne Traceback. Live nachgemessen:
Datum auf beiden Bildschirmen gleich, keine 404 mehr, Zurueck-Pfeil sichtbar
34x34 und treffbar 44x44, Galerie wischt in beide Richtungen, voller Wisch
loest die Rueckfrage aus, keine Kontrast-Unterschreitung mehr.
This commit is contained in:
2026-09-04 18:11:07 +02:00
parent ffaed3f544
commit b0ec8b4982
26 changed files with 1125 additions and 114 deletions
+203
View File
@@ -10914,3 +10914,206 @@ Parser-Suite jetzt **17 Tests** (von 11): die neue Klasse
und dass ein Aufgeben den Beleg nicht beschaedigt. Alle zwoelf Belege liefern
weiterhin `Shell`. `audi_ha_test` auf 2026.9.4.22, 0 Tracebacks, das Nachtragen
lief erwartungsgemaess **nicht** erneut.
## CP. Der grosse Pruefdurchgang - und was er gefunden hat (2026.9.4.23)
Auftrag des Eigentuemers: alle Funktionen, alle Bildschirme, optisch und
funktional, Audi CI und Apple HIG, danach die Paritaet. Danach: alles beheben.
### Wie geprueft wurde
Nicht nach Augenmass. Eine Pruefroutine (`/local/pruef.js` im Testcontainer)
lief auf **jedem der 26 Bildschirme** und mass seitlichen Ueberlauf,
Tippzielgroessen, abgeschnittenen Text, Schriftgroessen unter 11 px, Bilder
ohne Quelle und **WCAG-Kontrast fuer jeden einzelnen Textknoten**. Dazu die
Live-App mit den echten Daten (der Eigentuemer hat den Zugang selbst
eingetragen), die Musterseite fuer Leer- und Fehlerzustaende, und das Panel
zum Abgleich.
**Merkposten fuer kuenftige Pruefungen:** ohne Token zeigt die App nur den
Einrichtungsbildschirm. Statt wieder auf die Musterseite auszuweichen und die
Live-Pruefung als "nicht moeglich" zu vermerken - **danach fragen**. Der
Eigentuemer hat sie sofort gegeben.
### Befund 1: deutsche Datumsangaben wurden falsch gelesen
`new Date("01.03.2025")` liest amerikanisch, also Monat vor Tag:
| gespeichert | angezeigt |
|---|---|
| `01.03.2025` (1. Maerz) | **`03.01.2025`** |
| `12.11.2024` | **`11.12.2024`** |
| `25.03.2025` | **"-"** - der Wert verschwand |
| `08/2026` (Hauptuntersuchung) | **"-"** |
Tage bis 12 wurden **still vertauscht**, ab Tag 13 fiel der Wert ganz weg.
Sichtbar an der Erstzulassung: "Mein Audi" zeigte den Rohwert richtig,
"Identitaet und Technik" formatierte ihn und drehte ihn dabei um - **derselbe
Wert, zwei Ergebnisse auf zwei Bildschirmen**.
`alsZeitpunkt()` in `format.ts` erkennt jetzt genau die drei Formen, die in
diesem Projekt vorkommen: ISO vom Backend, `TT.MM.JJJJ` aus den
Eingabefeldern, `MM/JJJJ` fuer die Hauptuntersuchung. Alles andere bleibt
`null` - **lieber kein Datum als ein erfundenes**. Unmoegliche Daten werden
abgewiesen statt still verschoben (`new Date(2025,1,31)` waere der 3. Maerz).
**Monatsgenau ist eine eigene Genauigkeit.** `08/2026` nennt keinen Tag;
daraus "01.08.2026" zu machen waere eine Erfindung. Das Ergebnis traegt seine
Genauigkeit mit sich, und angezeigt wird "August 2026".
### Befund 2: die Hauptuntersuchung war in beiden Oberflaechen unerreichbar
`08/2026` stand im Profil, gezeigt wurde "-". In der App aus Befund 1. Im
Panel aus einem anderen Grund, der genauso stillschweigend war: es leitete die
Faelligkeit aus der **Erstzulassung** ab - aber nur, wenn die ein Schraegstrich
enthielt. Bei `01.03.2025` (eine voellig richtige Eingabe) blieb der Termin
leer, und den ausdruecklich eingetragenen Wert benutzte es gar nicht.
Beide Oberflaechen nehmen jetzt dieselbe Reihenfolge: **eingetragene
Faelligkeit vor Servicebuch vor Erstzulassung + 24 Monate**. Das Panel hat dazu
`datumAusText()` bekommen - wortgleich mit `alsZeitpunkt()` in der App.
### Befund 3: die Tankstellenmarke stand zweimal da
Mein eigener Fehler vom selben Tag (Abschnitt CN). Ein von Hand eingetragener
Name ohne Komma rutschte komplett als "Ort" durch:
"Shell München Ost" + "Musterstraße 5"
-> "Shell, Musterstr., Shell München Ost"
Die Regel uebersprang nur Teile, die **fuer sich** eine Marke sind.
`ohneMarkeVorn()` nimmt die Marke jetzt vorn ab. Steht sie NICHT am Anfang
("Autohof Shell Nord"), bleibt der Teil unangetastet - dort ist nicht sicher,
was Marke und was Ortsname ist.
### Befund 4: Bilder wurden geholt, obwohl beide wussten, dass es sie nicht gibt
Der Code sagt es selbst - "0 heisst: dieses Foto gibt es nicht" - und baute
die Adresse trotzdem. Gemessen: **fuenf Anfragen fuer `front-schraeg.webp` in
einem einzigen Ladevorgang**, dazu heckansicht, cockpit, sitze und
seitenansicht-winter, jede eine 404, bei jedem Rendern erneut.
Sichtbar war nichts (der Platzhalter griff ueber `onerror`), die Konsole aber
voll. Jetzt liefern `bildUrl()` bzw. `bildAdresse()` gar keine Adresse mehr,
wenn der Stand 0 ist. **Nach der Korrektur gemessen: 4 Anfragen, alle 200,
kein einziges `v=0`.**
### Befund 5: ein Bildelement ohne Quelle zeigt das kaputte Bildsymbol
Und der Rettungsanker greift dabei nicht: **ohne `src` findet kein Ladeversuch
statt, also feuert `onerror` nie**. Genau dann, wenn er gebraucht wuerde. Auf
der Musterseite als kaputtes Symbol samt Alternativtext "Shell" gesehen.
Neu `Markenlogo` (App) - rendert bei fehlender Adresse **nichts**. Im Panel
faellt das `src`-Attribut weg und die Box startet gleich als `bild-fehlt`; das
Bildelement bleibt trotzdem stehen, weil die Galerie es weiterschaltet.
### Kleinere Maengel, alle behoben
* `Versicherungsteuer ()` - leere Klammern ohne Steuersatz (beide).
* Eine Leistungsgruppe ohne Namen UND ohne Posten wurde zur **leeren grauen
Kachel** (beide).
* "Server-Adresse" brach am Bindestrich um - auf dem allerersten Bildschirm.
Seitlicher Rand von 32 auf 20 px.
* Drei Leerdarstellungen in EINER Kachel (Strich, "noch offen", nichts). Die
Erstzulassung wird jetzt formatiert und zeigt einen Strich, wenn nichts da
ist.
* Das Wurzelelement hatte keine Schriftfamilie - Rueckfall auf Times New
Roman. Sichtbar war heute nichts, die Flanke ist trotzdem zu.
### Apple HIG
**Kontrast**: auf 25 von 26 Bildschirmen einwandfrei. Eine Unterschreitung -
"Tankvorgang loeschen", `#FF3B30` auf `#F2F2F7` = **3,18** statt 4,5.
Dabei kam ein zweites, groesseres heraus: **weisse Schrift auf der roten
Loeschflaeche** ergibt 3,41 (Nacht) und 3,55 (Tag) - beide zu wenig.
Geloest ueber eine **Trennung der Rollen**: Rot als Schrift und Rot als Flaeche
brauchen Gegensaetzliches. Rote Schrift will Abstand zum HELLEN Grund, eine
rote Flaeche will Abstand zur WEISSEN Schrift darauf. Hell ist `--bad` jetzt
`#D70015` (4,83), und `--bad-flaeche` ist in beiden Modi `#D70015` (weiss
darauf: 5,38). Beides Apples eigenes systemRed fuer erhoehten Kontrast - die
HIG-Palette bleibt.
**Tippziele**: durchgehend unter 44x44 pt - der Zurueck-Pfeil mit 34x34, und
**ohne jede Vergroesserung**, beim meistbenutzten Element der App.
Zwei Wege, je nach Element:
* **Unsichtbares Overlay**, wo die sichtbare Groesse Teil des Bildes ist
(Zurueck-Pfeil, Symbolknoepfe, Griff des Standort-Blatts). Nachgemessen mit
`elementFromPoint`: **sichtbar 34x34, treffbar 44x44**.
* **Echte Mindesthoehe** 44 px, wo das Element ohnehin Flaeche ist
(Eingabefelder, Auswahlfelder, Pillen, Segmente).
Der zweite Weg **veraendert das Bild sichtbar**: Formulare werden hoeher. Das
ist Absicht und dem Eigentuemer so gemeldet.
### Wischen in der Bildergalerie (Wunsch des Eigentuemers)
Links/rechts wischen schaltet durch, in beide Richtungen. Zeigerereignisse
statt Beruehrungsereignisse - dieselbe Verdrahtung traegt Finger, Stift und
Maus, genau wie das Standort-Blatt es schon macht. Ueberwiegt die senkrechte
Bewegung, war es ein Scrollen. Ein Wisch schluckt den nachlaufenden Klick,
sonst schaltete die Galerie zweimal weiter.
### Loeschgeste HIG-konform (Wunsch des Eigentuemers)
Ein **voller** Wisch loescht jetzt sofort, ohne zweiten Tipp. Schwelle: 55 %
der Zeilenbreite (mindestens 120, hoechstens 220 px) - eine halbe Zeile ist
beim seitlichen Scrollen leicht versehentlich erreicht, eine klare Mehrheit
nicht. Die rote Flaeche waechst mit dem Zug und wird beim Ueberschreiten
heller: **Farbe heisst entschieden**. Die Rueckfrage bleibt - geloescht werden
Fahrten, Belege und Messwerte, die nicht wiederkommen.
**Dabei einen echten Fehler gefunden:** die Abschlussbehandlung las den
Zugwert aus dem React-Zustand, und der hinkt eine Darstellung hinterher.
Treffen die letzte Bewegung und das Loslassen in derselben Aufgabe ein - genau
das tut ein schneller Wisch -, war die Geste verloren. Nachgestellt: **ein
voller Wisch tat gar nichts.** Der Zug liegt jetzt zusaetzlich in einer
Referenz, und die entscheidet.
### Paritaet
Alle 26 Routen und Titel decken sich; der Fahrzeugstatus ist **zeilengleich**;
`live` bleibt der einzige app-eigene Bildschirm.
**Zwei ungeplante Abweichungen gefunden, beide geschlossen:** die
Datumsformatierung (App formatierte, Panel gab roh aus - deshalb war das Panel
richtig und die App falsch) und die Herkunft der Hauptuntersuchung. Beide
zeigen jetzt dasselbe.
Die Tankstellen-Funktionen weiterhin **byteweise gleich** ueber elf Faelle -
die Panel-Funktionen aus dem Buendel geschnitten und in Node gegen dieselben
Eingaben laufen lassen.
### Verifiziert
`tsc --noEmit` sauber, **271 Tests** (von 258: 9 fuer die Datumsformen, 4 fuer
die Marke am Wortanfang), `vite build` sauber, Design-System gebaut, Panel als
**Modul** geparst, `audi_ha_test` auf `2026.9.4.23`, **0 Tracebacks**.
**Live nachgemessen, nicht nur kompiliert:**
* Erstzulassung `01.03.2025` auf BEIDEN Bildschirmen, Hauptuntersuchung
`August 2026` - in App **und** Panel.
* Bildanfragen: 4, alle 200, kein `v=0`.
* Zurueck-Pfeil: sichtbar 34x34, treffbar 44x44. Eingabefelder 44 px hoch.
* Galerie: Wisch links vor, Wisch rechts zurueck, kurzer Tipp vor.
* Loeschzeile: kurzer Wisch klappt auf, voller Wisch (-260 bei 343 px Breite)
loest die Rueckfrage "Fahrt vom 10.08.2026 loeschen?" aus.
* Kontrastpruefung ueber alle Bildschirme: **keine Unterschreitung mehr**.
### Nicht geprueft - und warum
Live-Fahrt (braucht eine laufende Fahrt), QR-Scanner (Kamera in der Vorschau
gesperrt), Zwischenablage/Teilen/Kalender (nativ, brauchen das Geraet), das
echte iPhone (Notch, Dynamic Type), und Loeschvorgaenge wurden nicht
ausgeloest - das sind die Daten des Eigentuemers.
**Eine Korrektur an mir selbst:** ich hatte zwischendurch gemeldet, das
Standort-Blatt sei fehlerhaft, weil "Route" und "Teilen" hinter der Tab-Leiste
liegen. Das war falsch - die 96-px-Vorschau ist Absicht, aufgezogen sitzt das
Blatt sauber 30 px ueber der Leiste. Mein Klick-Test war der Fehler, nicht die
App: das Blatt hoert auf Zeigerereignisse, nicht auf `click`.