Problem
The completion toast paints three literal greens on a themed fill, so on every light preset the success glyph is close to invisible.
MainWindow.xaml, the ToastOverlay block: the container is Background="{DynamicResource Surface2}" — it follows the theme — while the check glyph is Foreground="#22C55E", the badge behind it Background="#2022C55E" and the border BorderBrush="#4022C55E". The literal is the dark-mode green, used unconditionally.
Measured against each light preset's real Surface2 from ThemeService:
| Light preset |
Surface2 |
Toast glyph #22C55E |
Themed light Success #166534 |
| clean-indigo |
#F1F5F9 |
2.08:1 |
6.51:1 |
| sky-breeze |
#E0F2FE |
1.99:1 |
6.21:1 |
| mint-fresh |
#BBF7D0 |
1.88:1 |
5.88:1 |
| warm-sand |
#FDE68A |
1.83:1 |
5.73:1 |
For reference the same green measures 7.66:1 on midnight-indigo's #151A23, which is why it reads correctly in dark mode and was never noticed. WCAG asks 4.5:1 for text and 3:1 for a meaningful graphic; the toast clears neither on any light preset.
The theme system already solved this. ThemeService seeds Success per mode — #22C55E dark, #166534 light — and the source comment beside it names this exact failure: "mode-aware Success brush — one crisp card beside two washed-out ones." The toast simply does not use it.
Expected behavior
The toast uses the themed status brushes (Success / SuccessBgSubtle / SuccessBorder), which already carry per-mode values, so the glyph is legible on all twelve presets.
The guard is one word too narrow
ArchitectureTests.NoThemedFill_CarriesAHardcodedWhiteForeground pins exactly this shape — a hardcoded foreground literal over a DynamicResource fill — and its own remarks describe a hardcoded white measuring 2.15:1 on warm-ember. It watches white only, so a hardcoded green over Surface2 is the same defect in a colour the guard does not look for.
Widen that guard rather than adding a second one: any hardcoded foreground literal over a themed fill, contrast-checked against every preset's value for that fill. It should red on the toast today.
Evidence
SysManager/SysManager/MainWindow.xaml — the ToastOverlay block
SysManager/SysManager/Services/ThemeService.cs — per-mode Success / SuccessText / SuccessBgSubtle / SuccessBorder, and the light preset palettes the table above uses
SysManager/SysManager.Tests/ArchitectureTests.cs — NoThemedFill_CarriesAHardcodedWhiteForeground
Ratios computed with the WCAG 2.x relative-luminance formula against the preset values as they stand in source.
Affected area
Every tab — the toast is in the shell
Problem
The completion toast paints three literal greens on a themed fill, so on every light preset the success glyph is close to invisible.
MainWindow.xaml, theToastOverlayblock: the container isBackground="{DynamicResource Surface2}"— it follows the theme — while the check glyph isForeground="#22C55E", the badge behind itBackground="#2022C55E"and the borderBorderBrush="#4022C55E". The literal is the dark-mode green, used unconditionally.Measured against each light preset's real
Surface2fromThemeService:#22C55ESuccess#166534#F1F5F9#E0F2FE#BBF7D0#FDE68AFor reference the same green measures 7.66:1 on midnight-indigo's
#151A23, which is why it reads correctly in dark mode and was never noticed. WCAG asks 4.5:1 for text and 3:1 for a meaningful graphic; the toast clears neither on any light preset.The theme system already solved this.
ThemeServiceseedsSuccessper mode —#22C55Edark,#166534light — and the source comment beside it names this exact failure: "mode-aware Success brush — one crisp card beside two washed-out ones." The toast simply does not use it.Expected behavior
The toast uses the themed status brushes (
Success/SuccessBgSubtle/SuccessBorder), which already carry per-mode values, so the glyph is legible on all twelve presets.The guard is one word too narrow
ArchitectureTests.NoThemedFill_CarriesAHardcodedWhiteForegroundpins exactly this shape — a hardcoded foreground literal over aDynamicResourcefill — and its own remarks describe a hardcoded white measuring 2.15:1 on warm-ember. It watches white only, so a hardcoded green overSurface2is the same defect in a colour the guard does not look for.Widen that guard rather than adding a second one: any hardcoded foreground literal over a themed fill, contrast-checked against every preset's value for that fill. It should red on the toast today.
Evidence
SysManager/SysManager/MainWindow.xaml— theToastOverlayblockSysManager/SysManager/Services/ThemeService.cs— per-modeSuccess/SuccessText/SuccessBgSubtle/SuccessBorder, and the light preset palettes the table above usesSysManager/SysManager.Tests/ArchitectureTests.cs—NoThemedFill_CarriesAHardcodedWhiteForegroundRatios computed with the WCAG 2.x relative-luminance formula against the preset values as they stand in source.
Affected area
Every tab — the toast is in the shell