Files
PolyTraderSharp/src/PolyTrader.App.Avalonia/App.axaml
T
RichardandClaude Opus 5 28b3aedec7 Vier Befunde der Sichtpruefung behoben: Farbschema, Grids, Diagramme, Kontrast
#383 Farbschema "System" kehrte sein Versprechen um. ThemeManager.IsDark verglich
ActualThemeVariant der Anwendung mit Dark; bei "System" steht dort Default, waehrend
die Fenster selbst nach hell oder dunkel aufloesen. IsDark war damit im
Auslieferungszustand immer false - Symbol, Beschriftung und Toggle() haengen alle an
diesem Wert. Gelesen wird jetzt die angeforderte Variante, bei "System" die
Betriebssystem-Einstellung. Derselbe Fehler steckte in Brush(): die Methode suchte bei
"System" in den hellen Farben, waehrend dunkel gezeichnet wurde - betroffen war genau
das, wofuer es sie gibt (Zeilenfarben, KPI-Vorzeichen). Neu ist ausserdem, dass eine
Umstellung am Betriebssystem ThemeChanged ausloest, solange "System" gilt.

#384 Sternspalten quetschten die Endspalten weg. Der Merksatz aus #56 galt bisher nur
fuer gridTraders. Angewandt auf gridOpen und gridClosed sowie auf die uebrigen Grids,
deren Spaltensumme den sichtbaren Bereich uebersteigt (gridTrades, gridJobs, gridLedger,
gridCandidates, gridPositions, gridHistory). Auto statt Stern, dazu MaxWidth 360 - anders
als "Name" in #56 traegt "Markt" ganze Fragesaetze und wuerde die Zahlenspalten sonst aus
dem Blick schieben. Grids mit weniger Spalten als Platz behalten ihre Sternspalte.

#385 Gewinntage wurden rot gezeichnet. Eine ColumnSeries hat genau ein Fill fuer alle
ihre Balken; gefaerbt wurde deshalb nach der Summe ueber alle Tage. Jetzt zwei Reihen an
denselben Positionen - Gewinne in der einen, Verluste in der anderen, Luecken als null.
"PnL je Modul" faerbt ebenfalls nach Vorzeichen: zwei Diagramme nebeneinander mit
verschiedenen Leseweisen waeren schlechter als beide ohne.

#386 Drei Kleinigkeiten. Die Equity-Achse beschriftete zehn Teilstriche mit zwei Daten -
unter drei Tagen kommt jetzt die Uhrzeit dazu, darueber gilt hoechstens ein Teilstrich je
Tag. "Deaktivierte Module" sah aus, als fehle das Bedienelement: leere Nur-Lese-Felder
zeigen jetzt "—" in einer abgesetzten Flaeche. Die Abschnittsbeschriftungen der
Seitenleiste lagen bei 3,65:1 statt der geforderten 4,5:1 (im Bild sogar 1,83:1, weil
10 px mit Sperrung ausduennen) - AppCaptionTextBrush erreicht 4,61:1 hell und 6,21:1
dunkel und bleibt deutlich leiser als die Eintraege darunter.

Build gruen, 486 Tests gruen. Die Sichtpruefung auf der Linux-VM steht noch aus; die
drei rein visuellen Punkte sind aus dem Quelltext begruendet, nicht im Bild belegt.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-09-03 10:17:49 +02:00

443 lines
27 KiB
XML
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
<Application xmlns="https://github.com/avaloniaui"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
x:Class="PolyTrader.App.Avalonia.App">
<!--
Farbschema und Designsprache. RequestedThemeVariant wird NICHT hier festgelegt, sondern beim
Start vom ThemeManager aus den Server-Settings gesetzt (hell / dunkel / dem System folgen).
Alle projekteigenen Farben stehen als Token in beiden Varianten. Im XAML werden sie über
DynamicResource gebunden – dadurch wechseln sie beim Umschalten von selbst. Nur wenige
Stellen setzen Farben im Code (Grid-Zeilen, Umschalter); die holen sie über
ThemeManager.Brush(...) und zeichnen sich bei ThemeChanged neu.
Die Werte stammen aus dem Claude-Design-Mockup „PolyTrader UI Redesign" (Design-System
„Industry"): gedämpftes Blaugrau als Akzent, papierne Grundfläche, Haarlinien statt Kästen,
eckige Ecken. Farbmischungen des Mockups (color-mix) sind hier ausgerechnet, weil XAML
keine Mischfunktion kennt.
Bewusste Abweichung: Das Mockup färbt Gewinne im Akzentblau. PolyTrader bleibt bei Grün/Rot
für Gewinn/Verlust – die Bedeutungsfarbe ist im Handelskontext eingeführt und trägt weiter
als eine reine Stilentscheidung. Die Töne sind aber an die neue Palette angeglichen
(entsättigt statt Signalfarbe).
-->
<Application.Resources>
<ResourceDictionary>
<!-- Schriften des Mockups. Avalonia probiert die Liste der Reihe nach durch: sind
Barlow / Barlow Condensed lokal installiert, werden sie genommen, sonst fällt es
auf die mitgelieferte Inter zurück. Damit läuft die App auch dort sauber, wo die
Schriften fehlen (Linux-Zielsystem, Build-Server). -->
<FontFamily x:Key="AppFontBody">Barlow, Inter, Segoe UI, sans-serif</FontFamily>
<FontFamily x:Key="AppFontHeading">Barlow Condensed, Barlow, Inter, Segoe UI, sans-serif</FontFamily>
<FontFamily x:Key="AppFontMono">Consolas, Menlo, DejaVu Sans Mono, monospace</FontFamily>
<ResourceDictionary.ThemeDictionaries>
<ResourceDictionary x:Key="Light">
<!-- Grundflächen und Rahmen -->
<SolidColorBrush x:Key="AppBgBrush" Color="#F2F2F3" />
<SolidColorBrush x:Key="AppSurfaceBrush" Color="#E9E9EA" />
<SolidColorBrush x:Key="AppSurfaceAltBrush" Color="#EDEDEE" />
<SolidColorBrush x:Key="AppCardBrush" Color="#E9E9EA" />
<SolidColorBrush x:Key="AppBorderBrush" Color="#D0D0D1" />
<SolidColorBrush x:Key="AppDividerBrush" Color="#D0D0D1" />
<!-- Texte -->
<SolidColorBrush x:Key="AppTextBrush" Color="#1D1F20" />
<SolidColorBrush x:Key="AppMutedTextBrush" Color="#76787A" />
<SolidColorBrush x:Key="AppCaptionTextBrush" Color="#66686A" />
<SolidColorBrush x:Key="AppReadOnlyTextBrush" Color="#444647" />
<!-- Akzent -->
<SolidColorBrush x:Key="AppAccentBrush" Color="#5980A6" />
<SolidColorBrush x:Key="AppAccentAltBrush" Color="#728FAB" />
<SolidColorBrush x:Key="AppAccentStrongBrush" Color="#416180" />
<!-- Akzent 16 % auf der Grundfläche: Auswahl- und Aktiv-Hinterlegung -->
<SolidColorBrush x:Key="AppAccentSoftBrush" Color="#DAE0E7" />
<!-- Bedeutungsfarben -->
<SolidColorBrush x:Key="AppPositiveBrush" Color="#2F6B46" />
<SolidColorBrush x:Key="AppNegativeBrush" Color="#8E3229" />
<SolidColorBrush x:Key="AppWarningBrush" Color="#8A6420" />
<!-- Benachrichtigungsleiste (Kante links + Symbol) -->
<SolidColorBrush x:Key="AppNotifyWarnBrush" Color="#B5822A" />
<SolidColorBrush x:Key="AppNotifyErrorBrush" Color="#C0392B" />
<!-- Zeilenfärbung der Trade-Listen (gedämpft auf hellem Grund) -->
<SolidColorBrush x:Key="AppTradeLossBrush" Color="#EFD4D0" />
<SolidColorBrush x:Key="AppTradeSmallWinBrush" Color="#D8E7DC" />
<SolidColorBrush x:Key="AppTradeBigWinBrush" Color="#A8CDB4" />
<!-- Trading-Umschalter im Launcher -->
<SolidColorBrush x:Key="AppToggleActiveBrush" Color="#A8CFAF" />
<SolidColorBrush x:Key="AppToggleSellOnlyBrush" Color="#E0B26A" />
<SolidColorBrush x:Key="AppToggleInactiveBrush" Color="#D89A92" />
<!-- Supervisor-Analyseverlauf -->
<SolidColorBrush x:Key="AppChatUserBrush" Color="#5980A6" />
<SolidColorBrush x:Key="AppChatAgentBrush" Color="#4E8168" />
</ResourceDictionary>
<ResourceDictionary x:Key="Dark">
<!-- Grundflächen und Rahmen -->
<SolidColorBrush x:Key="AppBgBrush" Color="#1A1C1E" />
<SolidColorBrush x:Key="AppSurfaceBrush" Color="#232527" />
<SolidColorBrush x:Key="AppSurfaceAltBrush" Color="#1F2123" />
<SolidColorBrush x:Key="AppCardBrush" Color="#232527" />
<SolidColorBrush x:Key="AppBorderBrush" Color="#3C3E40" />
<SolidColorBrush x:Key="AppDividerBrush" Color="#3C3E40" />
<!-- Texte: heller, aber nicht reinweiß – sonst flimmert es auf Dunkel -->
<SolidColorBrush x:Key="AppTextBrush" Color="#EEF0F1" />
<SolidColorBrush x:Key="AppMutedTextBrush" Color="#8D9092" />
<SolidColorBrush x:Key="AppCaptionTextBrush" Color="#A2A5A7" />
<SolidColorBrush x:Key="AppReadOnlyTextBrush" Color="#C9CCCE" />
<!-- Akzent: auf Dunkel aufgehellt, damit der Kontrast trägt -->
<SolidColorBrush x:Key="AppAccentBrush" Color="#7EA3C6" />
<SolidColorBrush x:Key="AppAccentAltBrush" Color="#8FA8C2" />
<SolidColorBrush x:Key="AppAccentStrongBrush" Color="#B5D9FD" />
<SolidColorBrush x:Key="AppAccentSoftBrush" Color="#2A3239" />
<!-- Bedeutungsfarben: gleiche Aussage, aufgehellt für Kontrast auf Dunkel -->
<SolidColorBrush x:Key="AppPositiveBrush" Color="#6FAE86" />
<SolidColorBrush x:Key="AppNegativeBrush" Color="#D9756A" />
<SolidColorBrush x:Key="AppWarningBrush" Color="#D3A45E" />
<SolidColorBrush x:Key="AppNotifyWarnBrush" Color="#D3A45E" />
<SolidColorBrush x:Key="AppNotifyErrorBrush" Color="#D9756A" />
<!-- Zeilenfärbung: gedämpft statt pastell – die hellen Töne würden auf Dunkel
blenden und den Text unlesbar machen. Reihenfolge der Aussage bleibt. -->
<SolidColorBrush x:Key="AppTradeLossBrush" Color="#4A2B27" />
<SolidColorBrush x:Key="AppTradeSmallWinBrush" Color="#2A3A30" />
<SolidColorBrush x:Key="AppTradeBigWinBrush" Color="#3A5C46" />
<!-- Trading-Umschalter -->
<SolidColorBrush x:Key="AppToggleActiveBrush" Color="#3F7A55" />
<SolidColorBrush x:Key="AppToggleSellOnlyBrush" Color="#9A6C25" />
<SolidColorBrush x:Key="AppToggleInactiveBrush" Color="#8E3B3B" />
<!-- Supervisor-Analyseverlauf -->
<SolidColorBrush x:Key="AppChatUserBrush" Color="#7EA3C6" />
<SolidColorBrush x:Key="AppChatAgentBrush" Color="#78B49A" />
</ResourceDictionary>
</ResourceDictionary.ThemeDictionaries>
</ResourceDictionary>
</Application.Resources>
<Application.Styles>
<FluentTheme />
<!-- PFLICHT fuer Avalonia.Controls.DataGrid: Das Steuerelement liegt in einem eigenen
Paket und bringt sein Theme NICHT ueber FluentTheme mit. Ohne diese Zeile rendert
kein einziges DataGrid - weder Zeilen noch Spaltenkoepfe, die Flaeche bleibt leer.
Es gibt dabei weder eine Fehlermeldung noch eine Bindungswarnung, und die
Konstruktionspruefung (Schalter smoke-ui) bleibt gruen, weil das Fenster aufgebaut wird.
Aufgefallen erst beim Linux-Sichttest am 26.08.2026 (Befund B-10). -->
<StyleInclude Source="avares://Avalonia.Controls.DataGrid/Themes/Fluent.xaml" />
<!-- ═══ Grundgestaltung ═══════════════════════════════════════════════════════
Projektweit zentral statt je Fenster wiederholt, damit alle Ansichten gleich
aussehen. Die Designsprache des Mockups lebt fast vollständig hier. -->
<Style Selector="Window">
<Setter Property="FontFamily" Value="{DynamicResource AppFontBody}" />
<Setter Property="FontSize" Value="13" />
<Setter Property="Background" Value="{DynamicResource AppBgBrush}" />
<Setter Property="Foreground" Value="{DynamicResource AppTextBrush}" />
</Style>
<!-- Überschriften laufen in der schmalen Schnittvariante (Barlow Condensed). -->
<Style Selector="TextBlock.h4">
<Setter Property="FontFamily" Value="{DynamicResource AppFontHeading}" />
<Setter Property="FontSize" Value="19" />
<Setter Property="FontWeight" Value="SemiBold" />
</Style>
<Style Selector="TextBlock.h5">
<Setter Property="FontFamily" Value="{DynamicResource AppFontHeading}" />
<Setter Property="FontSize" Value="15" />
<Setter Property="FontWeight" Value="SemiBold" />
</Style>
<!-- „Kicker": die kleine Versalzeile in Akzentfarbe über einer Überschrift.
Avalonia kennt kein text-transform – die Texte stehen im XAML in Versalien. -->
<Style Selector="TextBlock.kicker">
<Setter Property="FontSize" Value="10" />
<Setter Property="LetterSpacing" Value="1.2" />
<Setter Property="Foreground" Value="{DynamicResource AppAccentBrush}" />
</Style>
<!-- Gedämpfte Hinweistexte (Statuszeilen, Erklärungen unter Feldern). -->
<Style Selector="TextBlock.muted">
<Setter Property="Foreground" Value="{DynamicResource AppMutedTextBrush}" />
</Style>
<!-- Gewinn/Verlust als Klasse statt als im Code aufgelöster Pinsel. Über DynamicResource
folgt die Farbe dem Themenwechsel von selbst; ein im Code geholter Pinsel blieb dagegen
auf der Farbe stehen, die beim Erzeugen der Zeile galt (Befund B-6). -->
<Style Selector="TextBlock.positive, SelectableTextBlock.positive">
<Setter Property="Foreground" Value="{DynamicResource AppPositiveBrush}" />
</Style>
<Style Selector="TextBlock.negative, SelectableTextBlock.negative">
<Setter Property="Foreground" Value="{DynamicResource AppNegativeBrush}" />
</Style>
<Style Selector="TextBlock.mono, SelectableTextBlock.mono">
<Setter Property="FontFamily" Value="{DynamicResource AppFontMono}" />
</Style>
<!-- ═══ Steuerelemente: eckig und hairline ════════════════════════════════════
Das Mockup setzt border-radius durchgängig auf 0 und zeichnet Kästen nur mit
einer 1px-Linie. Fluent bringt gerundete, gefüllte Flächen mit – deshalb hier
flächendeckend zurückgesetzt. -->
<!-- Zum Kalenderknopf des CalendarDatePicker (Befund B-9 des Linux-Sichttests, wo statt
eines Kalendersymbols eine "26" stand): Das ist NICHT unsere Formatvorlage. Am
28.08.2026 auf der Linux-VM nachgemessen - die Zahl ist das heutige Datum (am 26.08.
eine "26", am 28.08. eine "28"), und sie bleibt unveraendert, wenn man diese
Vorlage per ":not(#PART_Button)" vom Knopf fernhaelt oder das Farbschema wechselt.
Avalonia zeichnet dort die heutige Tageszahl in ein Kalenderblatt; unter Linux fehlt
der Blatt-Glyph, uebrig bleibt ein Punkt. Rein kosmetisch, siehe Bugtracker-Item #50. -->
<Style Selector="Button">
<Setter Property="CornerRadius" Value="0" />
<Setter Property="FontFamily" Value="{DynamicResource AppFontHeading}" />
<Setter Property="FontSize" Value="13" />
<Setter Property="Padding" Value="10,5" />
<Setter Property="Background" Value="Transparent" />
<Setter Property="BorderBrush" Value="{DynamicResource AppDividerBrush}" />
<Setter Property="BorderThickness" Value="1" />
</Style>
<!-- Fluent malt Füllung und Rahmen im Vorlagenteil und überschreibt sie je Zustand.
Deshalb müssen Schwebe- und Druckzustand dort gesetzt werden, sonst blitzt beim
Überfahren wieder das Fluent-Grau durch. -->
<Style Selector="Button /template/ ContentPresenter#PART_ContentPresenter">
<Setter Property="CornerRadius" Value="0" />
</Style>
<Style Selector="Button:pointerover /template/ ContentPresenter#PART_ContentPresenter">
<Setter Property="Background" Value="{DynamicResource AppSurfaceBrush}" />
<Setter Property="BorderBrush" Value="{DynamicResource AppAccentBrush}" />
</Style>
<Style Selector="Button:pressed /template/ ContentPresenter#PART_ContentPresenter">
<Setter Property="Background" Value="{DynamicResource AppAccentSoftBrush}" />
<Setter Property="BorderBrush" Value="{DynamicResource AppAccentBrush}" />
</Style>
<!-- Hauptaktion: gefüllt im Akzent. -->
<Style Selector="Button.primary">
<Setter Property="Foreground" Value="{DynamicResource AppBgBrush}" />
</Style>
<Style Selector="Button.primary /template/ ContentPresenter#PART_ContentPresenter">
<Setter Property="Background" Value="{DynamicResource AppAccentBrush}" />
<Setter Property="BorderBrush" Value="{DynamicResource AppAccentBrush}" />
</Style>
<Style Selector="Button.primary:pointerover /template/ ContentPresenter#PART_ContentPresenter">
<Setter Property="Background" Value="{DynamicResource AppAccentStrongBrush}" />
<Setter Property="BorderBrush" Value="{DynamicResource AppAccentStrongBrush}" />
</Style>
<!-- Rahmenlose Schaltfläche (Seitenleiste, Symbolknöpfe). -->
<Style Selector="Button.ghost">
<Setter Property="BorderThickness" Value="0" />
<Setter Property="Background" Value="Transparent" />
</Style>
<Style Selector="Button.ghost:pointerover /template/ ContentPresenter#PART_ContentPresenter">
<Setter Property="Background" Value="{DynamicResource AppAccentSoftBrush}" />
<Setter Property="BorderBrush" Value="Transparent" />
</Style>
<Style Selector="TextBox, ComboBox, NumericUpDown, CalendarDatePicker, AutoCompleteBox">
<Setter Property="CornerRadius" Value="0" />
<Setter Property="FontFamily" Value="{DynamicResource AppFontBody}" />
<Setter Property="MinHeight" Value="30" />
</Style>
<Style Selector="CheckBox, RadioButton">
<Setter Property="FontFamily" Value="{DynamicResource AppFontBody}" />
</Style>
<Style Selector="TabItem">
<Setter Property="FontFamily" Value="{DynamicResource AppFontHeading}" />
<Setter Property="FontSize" Value="15" />
<Setter Property="MinHeight" Value="38" />
</Style>
<!-- ═══ Tabellen ══════════════════════════════════════════════════════════════
Kopfzeile klein, gesperrt und gedämpft; Zeilen nur durch eine Haarlinie
getrennt (keine Gitterkästen).
SPALTENBREITEN – Regel für alle Grids: feste Pixelbreiten nur, wo sie wirklich
gebraucht werden. Der Normalfall ist Width="Auto" (misst Überschrift UND Werte)
plus genau eine Width="*"-Spalte mit MinWidth für den Fließtext. Die aus WinForms
übernommenen festen Breiten waren auf die Datenwerte ausgelegt, nicht auf die
Überschriften – in der breiteren Avalonia-Standardschrift standen dann „Trades (7",
„Winrate '" und „Fee (bp" in den Köpfen, während die Werte darunter mühelos passten
(Befunde B-11 und B-13 des Linux-Sichttests). -->
<Style Selector="DataGrid">
<Setter Property="GridLinesVisibility" Value="Horizontal" />
<Setter Property="HeadersVisibility" Value="Column" />
<Setter Property="IsReadOnly" Value="True" />
<Setter Property="CanUserResizeColumns" Value="True" />
<Setter Property="CanUserSortColumns" Value="True" />
<Setter Property="RowHeight" Value="26" />
<Setter Property="FontSize" Value="12.5" />
<Setter Property="Background" Value="Transparent" />
<Setter Property="BorderThickness" Value="0" />
<Setter Property="HorizontalGridLinesBrush" Value="{DynamicResource AppDividerBrush}" />
</Style>
<Style Selector="DataGridColumnHeader">
<!-- Kein LetterSpacing: DataGridColumnHeader ist ein ContentControl und kennt die
Eigenschaft nicht (nur TextBlock hat sie). Die Sperrung der Mockup-Kopfzeile
entfällt hier deshalb bewusst. -->
<Setter Property="FontSize" Value="10.5" />
<Setter Property="FontWeight" Value="Normal" />
<Setter Property="Foreground" Value="{DynamicResource AppMutedTextBrush}" />
<Setter Property="Background" Value="Transparent" />
<Setter Property="BorderBrush" Value="{DynamicResource AppDividerBrush}" />
<Setter Property="BorderThickness" Value="0,0,0,1" />
<Setter Property="Padding" Value="7,5" />
</Style>
<!-- Jede Textzelle zeigt ihren vollen Inhalt im Tooltip. Auch mit sauberen Breiten
bleiben lange Marktfragen und Meldungen zwangsläufig abgeschnitten; so kommt man
ohne Spaltenziehen an den ganzen Text. -->
<Style Selector="DataGridCell TextBlock">
<Setter Property="ToolTip.Tip" Value="{Binding $self.Text}" />
</Style>
<!-- ═══ Bausteine ═════════════════════════════════════════════════════════════ -->
<!-- KPI-Kachel: entspricht den zweizeiligen Labels der WinForms-Oberfläche
("<Titel> \n <Wert>"), siehe docs/UI-SPEZIFIKATION-WinForms.md. -->
<Style Selector="Border.kpi">
<Setter Property="Background" Value="Transparent" />
<Setter Property="BorderBrush" Value="{DynamicResource AppDividerBrush}" />
<Setter Property="BorderThickness" Value="1" />
<Setter Property="CornerRadius" Value="0" />
<Setter Property="Padding" Value="12,10" />
<Setter Property="Margin" Value="0,0,10,10" />
<Setter Property="MinWidth" Value="160" />
</Style>
<Style Selector="Border.kpi > StackPanel > TextBlock.caption">
<Setter Property="FontSize" Value="10" />
<Setter Property="LetterSpacing" Value="1.2" />
<Setter Property="Foreground" Value="{DynamicResource AppAccentBrush}" />
</Style>
<Style Selector="Border.kpi > StackPanel > TextBlock.value">
<Setter Property="FontFamily" Value="{DynamicResource AppFontHeading}" />
<Setter Property="FontSize" Value="18" />
<Setter Property="FontWeight" Value="SemiBold" />
</Style>
<!-- Allgemeiner Rahmen-Kasten (Detailbereiche, Log-Fläche). -->
<Style Selector="Border.card">
<Setter Property="Background" Value="Transparent" />
<Setter Property="BorderBrush" Value="{DynamicResource AppDividerBrush}" />
<Setter Property="BorderThickness" Value="1" />
<Setter Property="CornerRadius" Value="0" />
<Setter Property="Padding" Value="12" />
</Style>
<!-- Statuskennzeichen in Listen und Kopfzeilen. -->
<Style Selector="Border.tag">
<Setter Property="Background" Value="{DynamicResource AppAccentSoftBrush}" />
<Setter Property="CornerRadius" Value="0" />
<Setter Property="Padding" Value="8,2" />
</Style>
<!-- Werkzeugleiste oben in jeder Ansicht (Ersatz für ToolStrip). Im neuen Design
ohne Füllfläche – nur die Schaltflächen stehen auf dem Grund. -->
<Style Selector="Border.toolbar">
<Setter Property="Background" Value="Transparent" />
<Setter Property="BorderBrush" Value="{DynamicResource AppDividerBrush}" />
<Setter Property="BorderThickness" Value="0,0,0,1" />
<Setter Property="Padding" Value="0,0,0,10" />
</Style>
<Style Selector="Border.toolbar Button">
<Setter Property="Margin" Value="0,0,6,0" />
<Setter Property="Padding" Value="10,5" />
<Setter Property="FontSize" Value="12.5" />
</Style>
<!-- Statusleiste unten (Ersatz für StatusStrip). -->
<Style Selector="Border.statusbar">
<Setter Property="Background" Value="Transparent" />
<Setter Property="BorderBrush" Value="{DynamicResource AppDividerBrush}" />
<Setter Property="BorderThickness" Value="0,1,0,0" />
<Setter Property="Padding" Value="20,5" />
</Style>
<Style Selector="Border.statusbar TextBlock">
<Setter Property="FontSize" Value="11.5" />
<Setter Property="Foreground" Value="{DynamicResource AppMutedTextBrush}" />
<Setter Property="VerticalAlignment" Value="Center" />
</Style>
<!-- Senkrechter Trenner in Werkzeugleisten. -->
<Style Selector="Border.sep">
<Setter Property="Width" Value="1" />
<Setter Property="Height" Value="18" />
<Setter Property="Margin" Value="4,0,10,0" />
<Setter Property="Background" Value="{DynamicResource AppDividerBrush}" />
</Style>
<!-- Gruppenkasten (Launcher-Widgets). Überschrift wie ein Kicker gesetzt. -->
<Style Selector="HeaderedContentControl">
<Setter Property="FontFamily" Value="{DynamicResource AppFontHeading}" />
<Setter Property="FontSize" Value="15" />
</Style>
<Style Selector="GridSplitter">
<Setter Property="Background" Value="{DynamicResource AppDividerBrush}" />
</Style>
<!-- ═══ Seitenleiste der Shell ════════════════════════════════════════════════ -->
<Style Selector="Button.nav">
<Setter Property="BorderThickness" Value="0" />
<Setter Property="Background" Value="Transparent" />
<Setter Property="HorizontalAlignment" Value="Stretch" />
<Setter Property="HorizontalContentAlignment" Value="Left" />
<Setter Property="Padding" Value="9,7" />
<Setter Property="FontFamily" Value="{DynamicResource AppFontBody}" />
<Setter Property="FontSize" Value="13" />
</Style>
<!-- Eingeklappt steht nur das Symbol da – dann mittig statt links. -->
<Style Selector="Button.nav.icononly">
<Setter Property="HorizontalContentAlignment" Value="Center" />
</Style>
<Style Selector="Button.nav.active">
<Setter Property="Foreground" Value="{DynamicResource AppAccentBrush}" />
<Setter Property="FontWeight" Value="SemiBold" />
</Style>
<Style Selector="Button.nav.active /template/ ContentPresenter#PART_ContentPresenter">
<Setter Property="Background" Value="{DynamicResource AppAccentSoftBrush}" />
<Setter Property="BorderBrush" Value="Transparent" />
</Style>
<Style Selector="Button.nav:pointerover /template/ ContentPresenter#PART_ContentPresenter">
<Setter Property="Background" Value="{DynamicResource AppAccentSoftBrush}" />
<Setter Property="BorderBrush" Value="Transparent" />
</Style>
<!-- Abschnittsüberschrift in der Seitenleiste. -->
<!--
Abschnittsbeschriftungen der Seitenleiste („UEBERSICHT", „MODULE", „SYSTEM").
Sie sollen ordnen, nicht gelesen werden – zurueckhaltend ist Absicht. Mit
AppMutedTextBrush ging das zu weit: 3,65:1 auf der Seitenleistenflaeche, und weil
10px mit Sperrung beim Zeichnen ausduennen, kamen im Bild nur 1,83:1 an (Befund #386).
WCAG verlangt 4,5:1 fuer kleinen Text. AppCaptionTextBrush liegt bei 4,61:1 (hell) und
6,21:1 (dunkel) und bleibt damit deutlich leiser als die Eintraege darunter (8,8:1);
das Medium-Gewicht haelt die gezeichneten Pixel naeher an der gesetzten Farbe.
-->
<Style Selector="TextBlock.navgroup">
<Setter Property="FontSize" Value="10" />
<Setter Property="LetterSpacing" Value="1.4" />
<Setter Property="Margin" Value="9,0,0,6" />
<Setter Property="FontWeight" Value="Medium" />
<Setter Property="Foreground" Value="{DynamicResource AppCaptionTextBrush}" />
</Style>
<!-- ═══ Benachrichtigungsleiste ═══════════════════════════════════════════════
Farbige Kante links, sonst nur eine gedämpfte Bandfläche – wie im Mockup. -->
<Style Selector="Border.notify">
<Setter Property="Background" Value="{DynamicResource AppSurfaceBrush}" />
<Setter Property="BorderBrush" Value="{DynamicResource AppNotifyWarnBrush}" />
<Setter Property="BorderThickness" Value="3,0,0,0" />
<Setter Property="Padding" Value="17,6" />
</Style>
<Style Selector="Border.notify.error">
<Setter Property="BorderBrush" Value="{DynamicResource AppNotifyErrorBrush}" />
</Style>
</Application.Styles>
</Application>