feat(app): visual design from prototype "RequestFlow A" - #53
Conversation
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01DJ5vaKvTYiMvdngT4d3xo1
…ages (#52) Shared header with navigation, company and role; request and field status as pills with text; primary/danger actions; tables in scroll containers. Review page parts moved to review-parts.tsx. Error messages from the login and upload forms use role=alert instead of role=status. No flow, permission or test change. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01DJ5vaKvTYiMvdngT4d3xo1
… subject column and duplicate reason (#52) Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01DJ5vaKvTYiMvdngT4d3xo1
…elog (#52) Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01DJ5vaKvTYiMvdngT4d3xo1
…er falls back to the brand on errors (#52 review) Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01DJ5vaKvTYiMvdngT4d3xo1
…s in components.css (#52 review) Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01DJ5vaKvTYiMvdngT4d3xo1
…ompany and role visible on phones, AA field borders, export retry as warning (#52 review) Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01DJ5vaKvTYiMvdngT4d3xo1
Frischer Review (unabhängiger Subagent, read-only,
|
| # | Schwere | Befund | Auflösung |
|---|---|---|---|
| 1 | should-fix | Nachweis fehlt (verify, E2E) | pnpm verify grün, beide Smokes grün, Screenshot-Tour – siehe PR-Beschreibung |
| 2 | should-fix | Firma/Rolle auf dem Handy per display:none versteckt |
bleibt sichtbar: Konto-Block bekommt unter 640 px eine eigene Zeile |
| 3 | should-fix | Fixierte Kopfzeile kann den Fokus verdecken (WCAG 2.4.11) | html { scroll-padding-top: 4.5rem } |
| 4 | should-fix | globals.css 824 Zeilen, aber „keine" angekreuzt |
geteilt: globals.css (Tokens, Basis, Kopfzeile, Flächen, Hinweise, 352 Zeilen) + components.css (Formulare, Tabellen, Status, Prüfansicht, 485 Zeilen) |
| 5 | should-fix | Layout und Seite lesen die Sitzung doppelt; DB-Ausfall bricht auch die Login-Seite | requestActor() = cache(currentActor(headers())) pro Request, genutzt von Kopfzeile und Seiten; Kopfzeile fällt bei Fehlern auf die Marke zurück (Next-Steuerfehler per unstable_rethrow weitergereicht), Fehler wird mit Code geloggt |
| 6 | nit | „Export wird wiederholt" grün wie ein Erfolg; Upload-Fehler nicht volle Breite | Warnhinweis (callout-warn, role="status" bleibt); .upload [role="alert"] ergänzt |
| 7 | nit | Eingabefeld-Rahmen 1.67:1 (< 3:1, WCAG 1.4.11) | neues Token --border-input: #8a939f (3.2:1) |
| 8 | nit | Kontrast-Kommentare ungenau | korrigiert (6.0:1, 6.8:1); „⚠" in der Duplikat-Überschrift bleibt (kein Test hängt daran) |
Danach: pnpm verify grün (Unit 154/154, Integration 114/114, depcruise, Build, Audit ohne high), beide E2E-Smokes grün, Überlauf bei 390 px auf Liste, Prüfseite und Benutzerseite jeweils 0 px.
Generated by Claude Code
…primary actions, flat cards, status tags only where attention is needed (#52) Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01DJ5vaKvTYiMvdngT4d3xo1
… borders on status tags (#52) Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01DJ5vaKvTYiMvdngT4d3xo1
….1) for the design prototype (#52) Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01DJ5vaKvTYiMvdngT4d3xo1
…lex, app header with name and role, two-column review with sticky source panel and decision (#52) Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01DJ5vaKvTYiMvdngT4d3xo1
… A (#52) Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01DJ5vaKvTYiMvdngT4d3xo1
…a-current on the selected field, password hint via aria-describedby, default selection includes positions, shared session lookup on the invite page (#52 review) Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01DJ5vaKvTYiMvdngT4d3xo1
Frischer Review nach Umsetzung des Prototyps „RequestFlow A“ (unabhängiger Subagent, read-only)Ergebnis: 0 Blocker · 3 should-fix · 5 nits. Braucht menschliche Freigabe: Der PR berührt Bestätigt:
Danach:
Generated by Claude Code |
Warum
Fixes #52 · Auftrag des Orchestrators: erst „Mach schön“, dann Umsetzung des Claude-Design-Prototyps „RequestFlow A“ (gebündelte HTML-Datei, Markup + Logik extrahiert). Basis
main.Arbeitsstand
verify+ beide E2E-Smokes grün; Screenshot-Nachweis.identity-Modul berührt), dann Review und Merge durch den Orchestrator.Was ist passiert (Klartext)
Die Oberfläche sieht jetzt aus wie der Design-Prototyp „RequestFlow A“: warme, ruhige Grautöne, ein Blau als Akzent, die Schrift IBM Plex (liegt auf unserem Server, der Browser lädt nichts von Google). Oben stehen Firma, Name und Rolle. Die Startseite zeigt, wie viele Anfragen auf Prüfung warten oder einen Fehler haben. In der Prüfansicht stehen links die erkannten Angaben, Positionen und Dokumente; rechts bleibt beim Scrollen ein Feld mit dem ausgewählten Wert, seiner Fundstelle im Dokument und den Knöpfen „Freigeben“ und „Ablehnen“ stehen. Unsichere Werte sind mit ⚠ markiert. Nach dem Hochladen führt ein Link direkt zur neuen Anfrage, Einladungslinks lassen sich kopieren. Abläufe, Berechtigungen und alle Texte, auf die sich die automatischen Tests stützen, sind unverändert; beide Browser-Tests laufen ohne Anpassung grün.
Plan-Pflicht (SYSTEM.md §4)
Impact Manifest
app(Seiten, Layout,_components,_server/runtime.ts, Stylesheets) undidentity(Actor.name, nur Anzeige).Actorbekommt das optionale Feldname(aussession.user.name, keine zusätzliche Abfrage) – nie für Autorisierung, nie geloggt. Keine Migration, keine API-Änderung.@fontsource/ibm-plex-sansund@fontsource/ibm-plex-mono5.3.0, Lizenz OFL-1.1 – der Prototyp ist auf IBM Plex gebaut; selbst gehostet (nur die lateinischen Schnitte 400/500/600/700 bzw. 400/500), daher keine Drittanfragen aus dem Browser. Bewusst nichtnext/font/google(Download beim Build über den Proxy) und kein Google-Fonts-Link (Drittanfrage).pnpm verify.requestActor()=currentActor(headers())mit Reactcachepro Request; Server Actions prüfen weiterhin selbst./loginund/signuprendern wegen der Kopfzeile im Root-Layout jetzt dynamisch (vorher statisch) – unkritisch; Rollback per Revert.Geändert
src/app/globals.css(Tokens, Basis, Kopfzeile, Flächen, Meldungen, Formulare),src/app/components.css(Status, Tabellen, Liste, Benutzer, Einladung, responsive), neusrc/app/review.css(Prüfansicht)src/app/layout.tsx(Schriften, Stylesheets),_components/{app-header,nav-link,auth-form}.tsx, neu_components/copy-button.tsx,_server/runtime.ts(requestActor)page.tsx,login,signup,invite,users,requests(+upload-form.tsx,status-pill.tsx),requests/[id](+review-parts.tsx)src/features/identity/{authorize,actor}.ts(Actor.name)package.json,pnpm-lock.yaml(@fontsource/*),CHANGELOG.mdNachweis (SYSTEM.md §11)
verify:changed: typecheck + lint grünverify: grün (lokal, Node 24, PostgreSQL 17 + SeaweedFS): lint, typecheck, Unit 154/154, Integration 114/114, depcruise ohne Verstöße (148 Module), Build,pnpm audit --audit-level high(1 moderate wie aufmain)verify:full/ E2E-Spec: beide Smokes grün und unverändert (review-smoke,line-items-smoke); KI-Dienst unberührt, Eval-Gate nicht betroffenscroll-padding-topgegen Verdecken durch die Kopfzeile, auf dem Handy springt die Auswahl zur Fundstelle; Kontrast nachgerechnet: alle Textpaare ≥ 4.73:1 (niedrigstes--mutedauf der Auswahlfarbe), Eingaberahmen 3.41:1 (dunkler als im Prototyp, WCAG 1.4.11); leere Zustände und Fehlerzustände gestaltetDoku-Entscheidung (genau eine)
[Unreleased](sichtbares Feature oder Verhalten – im selben PR, nie „später")Entferntes oder Umbenanntes:
StatusBadge/Source/Dokumentliste ausrequests/[id]/page.tsxnachreview-parts.tsxverschoben; Spalte „Hinweis“ der Anfragenliste heißt wie im Prototyp „Duplikat“Dateigrößen und neue Bausteine (SYSTEM.md §7)
Dateien über 500 Zeilen im Diff (Ausnahmen: generierter Code, Lockfiles, Fixtures, Migrationen, Schemas, Ressourcen, Doku, Konfiguration):
Über 800 Zeilen mit neuer Fachlogik oder über 1000 Zeilen (P1/P2): nicht betroffen
Neue Shared-Komponente, Utility-Datei, Adapter oder fachlicher Service:
src/app/_components/auth-form.tsx), Status-Darstellung (StatusBadge,status-labels.ts), Sitzungszugriff (currentActorin_server/runtime.ts), Zwischenablage (nichts vorhanden); gefunden:SignOutButton,requestStatusLabel,currentActor– wiederverwendet;requestActorist nur die gecachte Hülle umcurrentActor;CopyButtonneu (kleinste Client-Komponente)Subagent-Einsätze
Risiken / offene Punkte
@fontsource/*) undidentityberührt.🤖 Generated with Claude Code
https://claude.ai/code/session_01DJ5vaKvTYiMvdngT4d3xo1