diff --git a/arbeitskacheln/20_ui_redesign.md b/arbeitskacheln/20_ui_redesign.md
index 68bad91..3f61ce1 100644
--- a/arbeitskacheln/20_ui_redesign.md
+++ b/arbeitskacheln/20_ui_redesign.md
@@ -165,7 +165,14 @@ Aktueller Stand vor Redesign: 39 Seiten-/Komponenten-Dateien, ~7.000 Zeilen, ein
- **Rechte:** keine Änderung
- **Akzeptanzkriterien:** Fortschritt live sichtbar, Abweichungen nicht zu übersehen.
- **Tests:** bestehende Kontroll-Tests bleiben grün.
-- **DoD:** offen.
+- **DoD:** umgesetzt (2026-09-06). Fortschrittsanzeige ("X von Y Positionen
+ bestätigt" + Balken) existierte bereits. Neu: `PositionCard` bekommt eine
+ farbige linke Randlinie je Zustand (grün = passt & gespeichert, gelb =
+ Abweichung/Fehlbestand, rot = Übertragungsfehler) - Abweichung war bisher nur
+ während des kurz offenen Nachfüll-Dialogs sichtbar, danach nicht mehr von
+ einer normalen Bestätigung zu unterscheiden. Nebenbei: hartkodierte Hex-
+ Fallbackfarben (`var(--color-x, #hex)`, aus der Zeit vor UI-001) durch reine
+ Token-Referenzen ersetzt.
## UI-007 — QR-Scan-Aktionsleiste
diff --git a/frontend/src/pages/KontrollPage.tsx b/frontend/src/pages/KontrollPage.tsx
index e83d5aa..eb0df09 100644
--- a/frontend/src/pages/KontrollPage.tsx
+++ b/frontend/src/pages/KontrollPage.tsx
@@ -79,12 +79,12 @@ export function KontrollPage() {
{positionen.filter((p) => p.status === "gespeichert").length} von {positionen.length} Positionen bestätigt
-
+
p.status === "gespeichert").length / positionen.length) * 100
)}%`,
diff --git a/frontend/src/pages/kontrolle/PositionCard.tsx b/frontend/src/pages/kontrolle/PositionCard.tsx
index 1f2c1f0..78a6e60 100644
--- a/frontend/src/pages/kontrolle/PositionCard.tsx
+++ b/frontend/src/pages/kontrolle/PositionCard.tsx
@@ -17,8 +17,18 @@ function ablaufFarbe(ablaufdatum: string): string | undefined {
if (!ablaufdatum) return undefined;
const tage = (new Date(ablaufdatum).getTime() - Date.now()) / (1000 * 60 * 60 * 24);
if (tage < 0) return "var(--color-danger)";
- if (tage < 30) return "var(--color-warning, #b45309)";
- return "var(--color-success, #15803d)";
+ if (tage < 30) return "var(--color-warning)";
+ return "var(--color-success)";
+}
+
+// UI-006 (Epic 20): "Fehlende oder problematische Positionen klar hervorheben" -
+// Rand-Farbe macht eine Abweichung auch nach dem Speichern noch auf einen Blick
+// sichtbar, nicht nur kurz während des Nachfüll-Dialogs.
+function rahmenFarbe(status: PositionZustand["status"], passt: boolean): string {
+ if (status === "fehler") return "var(--color-danger)";
+ if (status === "gespeichert" && !passt) return "var(--color-warning)";
+ if (status === "gespeichert" && passt) return "var(--color-success)";
+ return "transparent";
}
export function PositionCard({ zustand, onEingabeAendern, onSenden, onErneutVersuchen }: Props) {
@@ -26,7 +36,7 @@ export function PositionCard({ zustand, onEingabeAendern, onSenden, onErneutVers
const passt = zustand.eingabe === zustand.position.sollmenge_effektiv;
return (
-
+
{zustand.material?.name ?? `Material ${zustand.position.material_id}`}