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="AppFilterActiveBackgroundBrush" Color="#173765"/>
<SolidColorBrush x:Key="AppFilterActiveBorderBrush" Color="#3C86F7"/> <SolidColorBrush x:Key="AppFilterActiveBorderBrush" Color="#3C86F7"/>
<SolidColorBrush x:Key="AppFilterActiveForegroundBrush" Color="#FFFFFF"/> <SolidColorBrush x:Key="AppFilterActiveForegroundBrush" Color="#FFFFFF"/>
<!-- Status --> <!-- Status: Nutzer-Feedback (August 2026) — Warnung (Amber) und Gefahr (Korallrot) waren
<SolidColorBrush x:Key="AppStatusOkBrush" Color="#73C45A"/> auf dem Bildschirm kaum auseinanderzuhalten. Per scripts/validate_palette.js der
<SolidColorBrush x:Key="AppStatusInfoBrush" Color="#4C8DFF"/> dataviz-Skill gegen AppTrackBackgroundBrush/AppCardBackgroundBrush geprüft (adjacent
<SolidColorBrush x:Key="AppStatusWarningBrush" Color="#F59E0B"/> pairs, wie sie im gestapelten Balken tatsächlich aneinanderstoßen): die alte Kombi
<SolidColorBrush x:Key="AppStatusDangerBrush" Color="#FF5A67"/> 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>
<ResourceDictionary x:Key="Light"> <ResourceDictionary x:Key="Light">
@@ -52,11 +63,11 @@
<SolidColorBrush x:Key="AppFilterActiveBackgroundBrush" Color="#D7E6FC"/> <SolidColorBrush x:Key="AppFilterActiveBackgroundBrush" Color="#D7E6FC"/>
<SolidColorBrush x:Key="AppFilterActiveBorderBrush" Color="#2C6FD8"/> <SolidColorBrush x:Key="AppFilterActiveBorderBrush" Color="#2C6FD8"/>
<SolidColorBrush x:Key="AppFilterActiveForegroundBrush" Color="#10243F"/> <SolidColorBrush x:Key="AppFilterActiveForegroundBrush" Color="#10243F"/>
<!-- Status --> <!-- Status: siehe Dark-Kommentar oben — dieselbe Validierung, helle Stufen. -->
<SolidColorBrush x:Key="AppStatusOkBrush" Color="#2E7D32"/> <SolidColorBrush x:Key="AppStatusOkBrush" Color="#008300"/>
<SolidColorBrush x:Key="AppStatusInfoBrush" Color="#1B5FC7"/> <SolidColorBrush x:Key="AppStatusInfoBrush" Color="#2A78D6"/>
<SolidColorBrush x:Key="AppStatusWarningBrush" Color="#A45B00"/> <SolidColorBrush x:Key="AppStatusWarningBrush" Color="#EDA100"/>
<SolidColorBrush x:Key="AppStatusDangerBrush" Color="#C0272D"/> <SolidColorBrush x:Key="AppStatusDangerBrush" Color="#D03B3B"/>
</ResourceDictionary> </ResourceDictionary>
</ResourceDictionary.ThemeDictionaries> </ResourceDictionary.ThemeDictionaries>
@@ -236,7 +236,13 @@
Prozentzahlen erschlossen. Jedes Segment multipliziert per MultiBinding Prozentzahlen erschlossen. Jedes Segment multipliziert per MultiBinding
die gerenderte Breite der Track-Leiste (x:Name="DayOverviewTrack") mit die gerenderte Breite der Track-Leiste (x:Name="DayOverviewTrack") mit
seinem Anteil 0…1 (FractionWidthConverter) — bleibt dadurch korrekt, egal 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}"> <Grid Height="10" ToolTip.Tip="{Binding DayOverviewTooltip}">
<Border x:Name="DayOverviewTrack" Background="{DynamicResource AppTrackBackgroundBrush}" <Border x:Name="DayOverviewTrack" Background="{DynamicResource AppTrackBackgroundBrush}"
CornerRadius="5"/> CornerRadius="5"/>
@@ -250,14 +256,6 @@
</MultiBinding> </MultiBinding>
</Border.Width> </Border.Width>
</Border> </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 Classes="statusFill info">
<Border.Width> <Border.Width>
<MultiBinding Converter="{x:Static conv:FractionWidthConverter.Instance}"> <MultiBinding Converter="{x:Static conv:FractionWidthConverter.Instance}">
@@ -266,6 +264,14 @@
</MultiBinding> </MultiBinding>
</Border.Width> </Border.Width>
</Border> </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 Classes="statusFill danger">
<Border.Width> <Border.Width>
<MultiBinding Converter="{x:Static conv:FractionWidthConverter.Instance}"> <MultiBinding Converter="{x:Static conv:FractionWidthConverter.Instance}">
@@ -279,8 +285,8 @@
</Grid> </Grid>
<StackPanel Spacing="5"> <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"/><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 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 Orientation="Horizontal" Spacing="6"><Border Width="7" Height="7" CornerRadius="4" Classes="statusFill danger"/><TextBlock Text="{Binding UnexcusedAbsenceSummaryLabel}" FontSize="12"/></StackPanel>
</StackPanel> </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 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 lässt. `StatusText` selbst bleibt unverändert (bestehende Tests/Bindings), das Symbol ist eine
zusätzliche, separat getestete Property. zusätzliche, separat getestete Property.
- [x] **"Klassenlehrer"-Feature — Warnung/Gefahr farblich kaum unterscheidbar (August 2026,
### 4.4 Wochen-/Tagesansicht 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 ### 4.4 Wochen-/Tagesansicht
- [x] **4.4.1** Kalenderansicht über alle Gruppen: Woche und Tag — siehe Nachtrag zu 4.3 - [x] **4.4.1** Kalenderansicht über alle Gruppen: Woche und Tag — siehe Nachtrag zu 4.3