Arbeitsstand gesichert: Deploymentcenter-Integration (D-0 bis D-5) und Einfenster-Shell

Sicherungscommit vor dem Aufraeumen des Repos, damit nachvollziehbar bleibt,
welcher Stand vor der Bereinigung galt. Build gruen, 476 Tests gruen.

Zwei Straenge, die sich ueber .csproj, Program.cs und appsettings.json
ueberschneiden und darum gemeinsam abgelegt werden:

Deploymentcenter-Integration (P3c, Plan D-0 bis D-5 code-seitig fertig):
- Deploymentcenter.Client 2.5.0 als lokales Paket, Source-Mapping erweitert
- DeploymentcenterOptions, DeploymentcenterErrorReporter, LicenseGate/LicenseCli
- WatchdogHeartbeatService auf die Deploymentcenter-API umgestellt
  (version, os, checks, metrics, status stopped)
- Security: MasterKeyResolver, SecretRedactor, FilePermissions
- Directory.Build.props mit zentraler Version 0.1.0 (Packager-Versionsdisziplin)
- deploy/: Packager-Vorlage und systemd-Unit; echte Zugangsdaten bleiben
  ueber .gitignore aussen vor
- setup.json fuer die Erstinstallation
- UMSETZUNGSPLAN-Deploymentcenter-Integration.md; ANALYSE-Linux-Portierung.md
  verweist auf den neuen Plan

Einfenster-Shell (UI-Redesign):
- ShellWindow + ShellNavModel als Seitenleisten-Shell
- WindowMenuBar und WindowMenuModel entfallen
- Modul- und Kernfenster auf die Shell-Einbettung angepasst

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This commit is contained in:
Richard
2026-08-22 10:42:22 +02:00
co-authored by Claude Opus 5
parent ac5e16f0a6
commit dd8da3fd3f
58 changed files with 3932 additions and 650 deletions
+338 -84
View File
@@ -3,71 +3,112 @@
x:Class="PolyTrader.App.Avalonia.App">
<!--
Farbschema. RequestedThemeVariant wird NICHT hier festgelegt, sondern beim Start vom
ThemeManager aus den Server-Settings gesetzt (hell / dunkel / dem System folgen).
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">
<!-- Flächen und Rahmen -->
<SolidColorBrush x:Key="AppSurfaceBrush" Color="#FAFAFA" />
<SolidColorBrush x:Key="AppSurfaceAltBrush" Color="#F3F3F3" />
<SolidColorBrush x:Key="AppCardBrush" Color="#F5F5F5" />
<SolidColorBrush x:Key="AppBorderBrush" Color="#DDDDDD" />
<!-- 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="AppMutedTextBrush" Color="#777777" />
<SolidColorBrush x:Key="AppCaptionTextBrush" Color="#666666" />
<SolidColorBrush x:Key="AppReadOnlyTextBrush" Color="#444444" />
<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="#2E7D32" />
<SolidColorBrush x:Key="AppNegativeBrush" Color="#C62828" />
<SolidColorBrush x:Key="AppWarningBrush" Color="#996600" />
<!-- Zeilenfärbung der Trade-Listen (Pastell auf hellem Grund) -->
<SolidColorBrush x:Key="AppTradeLossBrush" Color="#F5C8C8" />
<SolidColorBrush x:Key="AppTradeSmallWinBrush" Color="#D4F0D4" />
<SolidColorBrush x:Key="AppTradeBigWinBrush" Color="#8CD68C" />
<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="#90EE90" />
<SolidColorBrush x:Key="AppToggleSellOnlyBrush" Color="#FFA500" />
<SolidColorBrush x:Key="AppToggleInactiveBrush" Color="#CD5C5C" />
<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="#4682B4" />
<SolidColorBrush x:Key="AppChatAgentBrush" Color="#2E8B57" />
<SolidColorBrush x:Key="AppChatUserBrush" Color="#5980A6" />
<SolidColorBrush x:Key="AppChatAgentBrush" Color="#4E8168" />
</ResourceDictionary>
<ResourceDictionary x:Key="Dark">
<!-- Flächen und Rahmen -->
<SolidColorBrush x:Key="AppSurfaceBrush" Color="#2B2B2B" />
<SolidColorBrush x:Key="AppSurfaceAltBrush" Color="#333333" />
<SolidColorBrush x:Key="AppCardBrush" Color="#2F2F2F" />
<SolidColorBrush x:Key="AppBorderBrush" Color="#484848" />
<!-- 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="AppMutedTextBrush" Color="#9A9A9A" />
<SolidColorBrush x:Key="AppCaptionTextBrush" Color="#AAAAAA" />
<SolidColorBrush x:Key="AppReadOnlyTextBrush" Color="#CFCFCF" />
<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="#81C784" />
<SolidColorBrush x:Key="AppNegativeBrush" Color="#EF5350" />
<SolidColorBrush x:Key="AppWarningBrush" Color="#FFB74D" />
<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="#4E2A2A" />
<SolidColorBrush x:Key="AppTradeSmallWinBrush" Color="#2C3F2C" />
<SolidColorBrush x:Key="AppTradeBigWinBrush" Color="#3D6B3D" />
<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="#3F7A3F" />
<SolidColorBrush x:Key="AppToggleSellOnlyBrush" Color="#A76B1F" />
<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="#7FB3D8" />
<SolidColorBrush x:Key="AppChatAgentBrush" Color="#68B68A" />
<SolidColorBrush x:Key="AppChatUserBrush" Color="#7EA3C6" />
<SolidColorBrush x:Key="AppChatAgentBrush" Color="#78B49A" />
</ResourceDictionary>
</ResourceDictionary.ThemeDictionaries>
@@ -77,62 +118,275 @@
<Application.Styles>
<FluentTheme />
<!-- Projektweite Grundgestaltung. Bewusst hier zentral statt je Fenster wiederholt,
damit alle Fenster gleich aussehen (wie zuvor die einheitliche Segoe-UI-Vorgabe). -->
<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="24" />
<Setter Property="FontSize" Value="12" />
<!-- ═══ 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>
<!-- 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="{DynamicResource AppCardBrush}" />
<Setter Property="BorderBrush" Value="{DynamicResource AppBorderBrush}" />
<Setter Property="BorderThickness" Value="1" />
<Setter Property="CornerRadius" Value="4" />
<Setter Property="Padding" Value="12,8" />
<Setter Property="Margin" Value="0,0,8,8" />
<Setter Property="MinWidth" Value="150" />
<!-- Ü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="Border.kpi > StackPanel > TextBlock.caption">
<Setter Property="FontSize" Value="11" />
<Setter Property="Foreground" Value="{DynamicResource AppCaptionTextBrush}" />
</Style>
<Style Selector="Border.kpi > StackPanel > TextBlock.value">
<Setter Property="FontSize" Value="18" />
<Style Selector="TextBlock.h5">
<Setter Property="FontFamily" Value="{DynamicResource AppFontHeading}" />
<Setter Property="FontSize" Value="15" />
<Setter Property="FontWeight" Value="SemiBold" />
</Style>
<!-- Werkzeugleiste oben in jedem Fenster (Ersatz für ToolStrip). -->
<Style Selector="Border.toolbar">
<Setter Property="Background" Value="{DynamicResource AppSurfaceBrush}" />
<Setter Property="BorderBrush" Value="{DynamicResource AppBorderBrush}" />
<Setter Property="BorderThickness" Value="0,0,0,1" />
<Setter Property="Padding" Value="6,4" />
</Style>
<Style Selector="Border.toolbar Button">
<Setter Property="Margin" Value="0,0,6,0" />
<Setter Property="Padding" Value="10,4" />
</Style>
<!-- Statusleiste unten (Ersatz für StatusStrip). -->
<Style Selector="Border.statusbar">
<Setter Property="Background" Value="{DynamicResource AppSurfaceBrush}" />
<Setter Property="BorderBrush" Value="{DynamicResource AppBorderBrush}" />
<Setter Property="BorderThickness" Value="0,1,0,0" />
<Setter Property="Padding" Value="8,4" />
<!-- „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>
<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. -->
<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). -->
<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>
<!-- ═══ 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. -->
<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="Foreground" Value="{DynamicResource AppMutedTextBrush}" />
</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>