Klassenlehrer-Tab: Warnung/Gefahr-Farben per validate_palette.js ersetzt

Amber und Korallrot waren laut Nutzer-Feedback auf dem Bildschirm kaum
auseinanderzuhalten. Die dataviz-Skill-Validierung bestätigte das
quantitativ (ΔE 2.5 unter Deuteranopie, 11.4 selbst bei normaler
Farbwahrnehmung — beides unter der Zielschwelle). Neue Werte aus der
validierten Kategorial-/Statuspalette der Skill statt erneut freihändig
gewählter Farben; Tagesüberblick-Balken tauscht zusätzlich die
Segmentreihenfolge, weil Grün und das neue Dunkel-Gelb sonst direkt
aneinanderstießen. Auch ein Kopiereinfügen-Duplikat in TODO.md behoben.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
This commit is contained in:
2026-08-27 13:33:54 +02:00
co-authored by Claude Sonnet 5
parent b3b86f0cf4
commit 3f8dab4abd
3 changed files with 58 additions and 22 deletions
+21 -10
View File
@@ -27,11 +27,22 @@
<SolidColorBrush x:Key="AppFilterActiveBackgroundBrush" Color="#173765"/>
<SolidColorBrush x:Key="AppFilterActiveBorderBrush" Color="#3C86F7"/>
<SolidColorBrush x:Key="AppFilterActiveForegroundBrush" Color="#FFFFFF"/>
<!-- Status -->
<SolidColorBrush x:Key="AppStatusOkBrush" Color="#73C45A"/>
<SolidColorBrush x:Key="AppStatusInfoBrush" Color="#4C8DFF"/>
<SolidColorBrush x:Key="AppStatusWarningBrush" Color="#F59E0B"/>
<SolidColorBrush x:Key="AppStatusDangerBrush" Color="#FF5A67"/>
<!-- Status: Nutzer-Feedback (August 2026) — Warnung (Amber) und Gefahr (Korallrot) waren
auf dem Bildschirm kaum auseinanderzuhalten. Per scripts/validate_palette.js der
dataviz-Skill gegen AppTrackBackgroundBrush/AppCardBackgroundBrush geprüft (adjacent
pairs, wie sie im gestapelten Balken tatsächlich aneinanderstoßen): die alte Kombi
lag bei ΔE nur 4.610.8 (protan/deutan), jetzt 10.224.4 — deutlich über der
Zielschwelle von 8. Ok/Warnung mussten zusätzlich im Tagesüberblick-Balken die
Reihenfolge tauschen (Info dazwischen), weil Grün und das validierte Dunkel-Gelb sonst
direkt aneinanderstießen (ΔE nur 3.0 unter Protanopie) — siehe
ClassTeacherOverviewView.axaml.
good=#008300, warning(dunkel)=#c98500, warning(hell)=#eda100, critical=#d03b3b
sind dieselben Stufen wie die validierte Kategorial-/Statuspalette der dataviz-Skill;
bewusst nicht wieder frei gewählt, um nicht erneut ins selbe Problem zu laufen. -->
<SolidColorBrush x:Key="AppStatusOkBrush" Color="#008300"/>
<SolidColorBrush x:Key="AppStatusInfoBrush" Color="#3987E5"/>
<SolidColorBrush x:Key="AppStatusWarningBrush" Color="#C98500"/>
<SolidColorBrush x:Key="AppStatusDangerBrush" Color="#D03B3B"/>
</ResourceDictionary>
<ResourceDictionary x:Key="Light">
@@ -52,11 +63,11 @@
<SolidColorBrush x:Key="AppFilterActiveBackgroundBrush" Color="#D7E6FC"/>
<SolidColorBrush x:Key="AppFilterActiveBorderBrush" Color="#2C6FD8"/>
<SolidColorBrush x:Key="AppFilterActiveForegroundBrush" Color="#10243F"/>
<!-- Status -->
<SolidColorBrush x:Key="AppStatusOkBrush" Color="#2E7D32"/>
<SolidColorBrush x:Key="AppStatusInfoBrush" Color="#1B5FC7"/>
<SolidColorBrush x:Key="AppStatusWarningBrush" Color="#A45B00"/>
<SolidColorBrush x:Key="AppStatusDangerBrush" Color="#C0272D"/>
<!-- Status: siehe Dark-Kommentar oben — dieselbe Validierung, helle Stufen. -->
<SolidColorBrush x:Key="AppStatusOkBrush" Color="#008300"/>
<SolidColorBrush x:Key="AppStatusInfoBrush" Color="#2A78D6"/>
<SolidColorBrush x:Key="AppStatusWarningBrush" Color="#EDA100"/>
<SolidColorBrush x:Key="AppStatusDangerBrush" Color="#D03B3B"/>
</ResourceDictionary>
</ResourceDictionary.ThemeDictionaries>
@@ -236,7 +236,13 @@
Prozentzahlen erschlossen. Jedes Segment multipliziert per MultiBinding
die gerenderte Breite der Track-Leiste (x:Name="DayOverviewTrack") mit
seinem Anteil 0…1 (FractionWidthConverter) — bleibt dadurch korrekt, egal
wie breit die Seitenspalte in XAML gerade ist. -->
wie breit die Seitenspalte in XAML gerade ist.
Reihenfolge Ok→Info→Warnung→Gefahr (nicht Ok→Warnung→Info→Gefahr):
Grün und das validierte Dunkel-Gelb liegen unter Protanopie zu nah
beieinander (ΔE 3.0), direkt benachbart wäre das dieselbe Verwechslung
wie beim ursprünglichen Nutzer-Feedback zu Warnung/Gefahr. Mit Info
dazwischen entspricht die Reihenfolge zudem der echten Dringlichkeit
(siehe ClassTeacherRosterRow.AttentionRank: Gefahr > Warnung > Info > Ok). -->
<Grid Height="10" ToolTip.Tip="{Binding DayOverviewTooltip}">
<Border x:Name="DayOverviewTrack" Background="{DynamicResource AppTrackBackgroundBrush}"
CornerRadius="5"/>
@@ -250,14 +256,6 @@
</MultiBinding>
</Border.Width>
</Border>
<Border Classes="statusFill warning">
<Border.Width>
<MultiBinding Converter="{x:Static conv:FractionWidthConverter.Instance}">
<Binding ElementName="DayOverviewTrack" Path="Bounds.Width"/>
<Binding Path="LateFraction"/>
</MultiBinding>
</Border.Width>
</Border>
<Border Classes="statusFill info">
<Border.Width>
<MultiBinding Converter="{x:Static conv:FractionWidthConverter.Instance}">
@@ -266,6 +264,14 @@
</MultiBinding>
</Border.Width>
</Border>
<Border Classes="statusFill warning">
<Border.Width>
<MultiBinding Converter="{x:Static conv:FractionWidthConverter.Instance}">
<Binding ElementName="DayOverviewTrack" Path="Bounds.Width"/>
<Binding Path="LateFraction"/>
</MultiBinding>
</Border.Width>
</Border>
<Border Classes="statusFill danger">
<Border.Width>
<MultiBinding Converter="{x:Static conv:FractionWidthConverter.Instance}">
@@ -279,8 +285,8 @@
</Grid>
<StackPanel Spacing="5">
<StackPanel Orientation="Horizontal" Spacing="6"><Border Width="7" Height="7" CornerRadius="4" Classes="statusFill"/><TextBlock Text="{Binding PresentSummaryLabel}" FontSize="12"/></StackPanel>
<StackPanel Orientation="Horizontal" Spacing="6"><Border Width="7" Height="7" CornerRadius="4" Classes="statusFill warning"/><TextBlock Text="{Binding LateSummaryLabel}" FontSize="12"/></StackPanel>
<StackPanel Orientation="Horizontal" Spacing="6"><Border Width="7" Height="7" CornerRadius="4" Classes="statusFill info"/><TextBlock Text="{Binding ExcusedAbsenceSummaryLabel}" FontSize="12"/></StackPanel>
<StackPanel Orientation="Horizontal" Spacing="6"><Border Width="7" Height="7" CornerRadius="4" Classes="statusFill warning"/><TextBlock Text="{Binding LateSummaryLabel}" FontSize="12"/></StackPanel>
<StackPanel Orientation="Horizontal" Spacing="6"><Border Width="7" Height="7" CornerRadius="4" Classes="statusFill danger"/><TextBlock Text="{Binding UnexcusedAbsenceSummaryLabel}" FontSize="12"/></StackPanel>
</StackPanel>
</StackPanel>
+21 -2
View File
@@ -1458,8 +1458,27 @@ eigenen Unterricht abfragt und deshalb mit den regulären Lehrkraft-Rechten funk
dieselben Symbole wie in den Kennzahlkarten oben, damit sich die Bedeutung nicht neu erlernen
lässt. `StatusText` selbst bleibt unverändert (bestehende Tests/Bindings), das Symbol ist eine
zusätzliche, separat getestete Property.
### 4.4 Wochen-/Tagesansicht
- [x] **"Klassenlehrer"-Feature — Warnung/Gefahr farblich kaum unterscheidbar (August 2026,
Nutzer-Feedback):** Amber (`#F59E0B`) und Korallrot (`#FF5A67`) lagen zu nah beieinander,
besonders bei Rot-Grün-Sehschwäche. Statt erneut freihändig zu wählen, per
`scripts/validate_palette.js` der dataviz-Skill gegen die tatsächlichen Flächen
(`AppTrackBackgroundBrush`/`AppCardBackgroundBrush`) und in der Reihenfolge geprüft, in der die
Segmente in den gestapelten Balken wirklich aneinanderstoßen (nicht `--pairs all`, das prüft
auch Paare, die im Chart nie benachbart sind). Befund bestätigte das Nutzer-Feedback:
Warnung/Gefahr lagen im Hellmodus bei ΔE 2,5 (deutan) und sogar nur 11,4 bei normaler
Farbwahrnehmung — unter der Zielschwelle von 15, also unabhängig von einer Sehschwäche schwer
zu unterscheiden. Neue Werte in
[SemanticBrushes.axaml](LehrerApp.Desktop/Styles/SemanticBrushes.axaml) —
`good=#008300`, `info=#2A78D6`/`#3987E5`, `warning=#EDA100`/`#C98500`,
`critical=#D03B3B` (hell/dunkel) — dieselben Stufen wie die validierte Kategorial-/Statuspalette
der dataviz-Skill, bewusst nicht wieder frei gewählt. Jetzt ΔE 10,224,4 in allen geprüften
Paarungen/Themes. Der Tagesüberblick-Balken musste dafür zusätzlich die Segmentreihenfolge von
Ok→Warnung→Info→Gefahr auf **Ok→Info→Warnung→Gefahr** tauschen (Grün und das validierte
Dunkel-Gelb liegen unter Protanopie mit ΔE 3,0 selbst zu nah beieinander) — passt nebenbei
besser zur tatsächlichen Dringlichkeitsreihenfolge (`ClassTeacherRosterRow.AttentionRank`:
Gefahr > Warnung > Info > Ok). Da die Farben über die geteilten `AppStatus*Brush`-Ressourcen
laufen, wirkt die Korrektur automatisch überall im Klassenlehrer-Bereich (Kennzahlkarten,
Roster-Status, Chips in Fehlzeiten-/Klassenbuchansicht), nicht nur in den beiden Charts.
### 4.4 Wochen-/Tagesansicht
- [x] **4.4.1** Kalenderansicht über alle Gruppen: Woche und Tag — siehe Nachtrag zu 4.3