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:
@@ -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.6–10.8 (protan/deutan), jetzt 10.2–24.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>
|
||||||
|
|||||||
@@ -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,2–24,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
|
||||||
|
|||||||
Reference in New Issue
Block a user