UI-Entwurf umgesetzt, Rocket.Chat-Tool, Deploymentcenter 2.4

Sicherungspunkt vor dem Aufraeumen. Buendelt die Arbeit, die seit dem
Abschluss der Avalonia-Portierung im Arbeitsverzeichnis lag.

Oberflaeche
- Entwurf aus Mockup/ umgesetzt: Theme.axaml (Farben je Thema, Barlow als
  mitgelieferte Schrift), Icons.axaml (Symbolgeometrien), Shell.axaml
  (eigene ControlThemes statt Fluent umzufaerben).
- Neue Steuerelemente StrokeIcon und BlueprintFrame, Seiten fuer
  Token-Verbrauch und Agenten-Chats, Werkzeug-Einstellungen als Seite
  statt eigenem Fenster, Texteditor-Fenster.
- ThemeManager mit hellem und dunklem Thema; die beiden Pinsel-Konverter
  entfallen, weil ein fester Farbwert den Themenwechsel nicht ueberlebt.

Rocket.Chat
- Neues Tool-Projekt (Client, Konfiguration, Workspace-Dateien) nach der
  Bauform des Telegram-Tools: rocketchat_poll als Tool-Job, geweckt wird
  nur, wenn wirklich etwas anliegt.
- send_file ist freigabepflichtig, send_message bewusst nicht: Der Raum
  ist Arbeitsraum, der Schutz sitzt an der Raum-Allowlist.
- Konzept-Doc um die Messung gegen die echte Instanz 8.7 ergaenzt; drei
  Annahmen waren falsch und sind korrigiert.

Deploymentcenter
- DC6 (Update anwenden) und DC7 (Erstinstallation ueber setup.json)
  erledigt, DC3 fuer win-x64/dev; deploy/publish.py als Release-Strecke.
- AppHost.DisposeAsync gegen doppeltes Herunterfahren gesperrt - sonst
  ueberschreibt eine zweite Abmeldung den Wartungszustand am Watchdog.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This commit is contained in:
Richard
2026-08-23 12:16:05 +02:00
co-authored by Claude Opus 5
parent b5bf97ae74
commit 33d95a6c3f
88 changed files with 11665 additions and 1029 deletions
@@ -0,0 +1,51 @@
<ResourceDictionary xmlns="https://github.com/avaloniaui"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml">
<!--
Die Symbole des Entwurfs, 1:1 aus dem Mockup übernommen (Lucide-Umrisse, viewBox
0 0 24 24, Strichstärke 1.5). Gezeichnet werden sie von Controls/StrokeIcon.cs, das
denselben Koordinatenraum voraussetzt — wer hier ein Symbol ergänzt, muss es also
ebenfalls auf 24×24 bringen.
Kreise stehen als zwei Halbbögen da (a-Befehle): StreamGeometry kennt keine
<Ellipse>, und ein Rechteck mit vollem Radius wäre nicht dasselbe.
-->
<!-- ─── Marke ─── -->
<StreamGeometry x:Key="IconLogo">M12 9c-1.5-2.5-4-3-5.5-1.5S5 11 7 12c-1 1-1.5 2-1.5 3.5S7 18 8.5 17c1-1 1.5-2 1.5-3 M12 9c1.5-2.5 4-3 5.5-1.5S19 11 17 12c1 1 1.5 2 1.5 3.5S15 18 13.5 17c-1-1-1.5-2-1.5-3 M12 9v3</StreamGeometry>
<!-- ─── Navigation ─── -->
<StreamGeometry x:Key="IconChat">M21 11.5a8.38 8.38 0 0 1-.9 3.8 8.5 8.5 0 0 1-7.6 4.7 8.38 8.38 0 0 1-3.8-.9L3 21l1.9-5.7a8.38 8.38 0 0 1-.9-3.8 8.5 8.5 0 0 1 4.7-7.6 8.38 8.38 0 0 1 3.8-.9h.5a8.48 8.48 0 0 1 8 8v.5z</StreamGeometry>
<StreamGeometry x:Key="IconAgents">M17 21v-2a4 4 0 0 0-4-4H5a4 4 0 0 0-4 4v2 M13 7a4 4 0 1 1-8 0 4 4 0 0 1 8 0 M23 21v-2a4 4 0 0 0-3-3.87 M16 3.13a4 4 0 0 1 0 7.75</StreamGeometry>
<StreamGeometry x:Key="IconTasks">M3 17l2 2 4-4 M3 7l2 2 4-4 M13 6h8 M13 12h8 M13 18h8</StreamGeometry>
<StreamGeometry x:Key="IconChart">M3 3v18h18 M7 15v4 M11 11v8 M15 7v12 M19 12v7</StreamGeometry>
<StreamGeometry x:Key="IconAgentChats">M8 12h.01 M12 12h.01 M16 12h.01 M21 12c0 4.4-4 8-9 8-1.3 0-2.6-.2-3.7-.7L3 20l1-4.2C3.4 14.6 3 13.3 3 12c0-4.4 4-8 9-8s9 3.6 9 8Z</StreamGeometry>
<StreamGeometry x:Key="IconBackup">M3 4h18a1 1 0 0 1 1 1v3a1 1 0 0 1-1 1H3a1 1 0 0 1-1-1V5a1 1 0 0 1 1-1z M4 9v9a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2V9 M10 13h4</StreamGeometry>
<StreamGeometry x:Key="IconLogs">M14 2H6a2 2 0 0 0-2 2v16a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2V8z M14 2v6h6 M9 13h6 M9 17h6</StreamGeometry>
<StreamGeometry x:Key="IconSettings">M15 12a3 3 0 1 1-6 0 3 3 0 0 1 6 0 M19.4 15a1.65 1.65 0 0 0 .33 1.82l.06.06a2 2 0 1 1-2.83 2.83l-.06-.06a1.65 1.65 0 0 0-1.82-.33 1.65 1.65 0 0 0-1 1.51V21a2 2 0 0 1-4 0v-.09A1.65 1.65 0 0 0 9 19.4a1.65 1.65 0 0 0-1.82.33l-.06.06a2 2 0 1 1-2.83-2.83l.06-.06A1.65 1.65 0 0 0 4.6 15a1.65 1.65 0 0 0-1.51-1H3a2 2 0 0 1 0-4h.09A1.65 1.65 0 0 0 4.6 9c.13-.32.19-.66.18-1a1.65 1.65 0 0 0-.33-1.82l-.06-.06a2 2 0 1 1 2.83-2.83l.06.06c.51.5 1.24.66 1.82.33H9c.32-.13.66-.19 1-.18A1.65 1.65 0 0 0 11.51 3H12a2 2 0 0 1 4 0v.09c0 .34.06.68.18 1a1.65 1.65 0 0 0 1.82.33l.06-.06a2 2 0 1 1 2.83 2.83l-.06.06c-.51.5-.67 1.24-.33 1.82V9c.13.32.19.66.18 1H21a2 2 0 0 1 0 4h-.09a1.65 1.65 0 0 0-1.51 1z</StreamGeometry>
<StreamGeometry x:Key="IconInfo">M22 12a10 10 0 1 1-20 0 10 10 0 0 1 20 0 M12 16v-4 M12 8h.01</StreamGeometry>
<!-- ─── Kopfzeile ─── -->
<StreamGeometry x:Key="IconSun">M16 12a4 4 0 1 1-8 0 4 4 0 0 1 8 0 M12 2v2 M12 20v2 M4.9 4.9l1.4 1.4 M17.7 17.7l1.4 1.4 M2 12h2 M20 12h2 M4.9 19.1l1.4-1.4 M17.7 6.3l1.4-1.4</StreamGeometry>
<StreamGeometry x:Key="IconMoon">M21 12.8A9 9 0 1 1 11.2 3a7 7 0 0 0 9.8 9.8z</StreamGeometry>
<StreamGeometry x:Key="IconChevronLeft">M15 18l-6-6 6-6</StreamGeometry>
<StreamGeometry x:Key="IconChevronRight">M9 18l6-6-6-6</StreamGeometry>
<StreamGeometry x:Key="IconChevronDown">M6 9l6 6 6-6</StreamGeometry>
<!-- ─── Meldungen ─── -->
<StreamGeometry x:Key="IconAlert">M12 9v4 M12 17h.01 M10.3 3.9 1.8 18a2 2 0 0 0 1.7 3h17a2 2 0 0 0 1.7-3L13.7 3.9a2 2 0 0 0-3.4 0Z</StreamGeometry>
<StreamGeometry x:Key="IconClose">M18 6L6 18 M6 6l12 12</StreamGeometry>
<!-- ─── Werkzeugleisten ─── -->
<StreamGeometry x:Key="IconPlus">M12 5v14 M5 12h14</StreamGeometry>
<StreamGeometry x:Key="IconMinus">M5 12h14</StreamGeometry>
<StreamGeometry x:Key="IconPlay">M8 5v14l11-7z</StreamGeometry>
<StreamGeometry x:Key="IconStop">M6 6h12v12H6z</StreamGeometry>
<StreamGeometry x:Key="IconPencil">M12 20h9 M16.5 3.5a2.1 2.1 0 0 1 3 3L7 19l-4 1 1-4Z</StreamGeometry>
<StreamGeometry x:Key="IconTrash">M3 6h18 M8 6V4a2 2 0 0 1 2-2h4a2 2 0 0 1 2 2v2 M19 6l-1 14a2 2 0 0 1-2 2H8a2 2 0 0 1-2-2L5 6</StreamGeometry>
<StreamGeometry x:Key="IconFolder">M22 19a2 2 0 0 1-2 2H4a2 2 0 0 1-2-2V5a2 2 0 0 1 2-2h5l2 3h9a2 2 0 0 1 2 2Z</StreamGeometry>
<StreamGeometry x:Key="IconRefresh">M23 4v6h-6 M1 20v-6h6 M3.51 9a9 9 0 0 1 14.85-3.36L23 10 M20.49 15a9 9 0 0 1-14.85 3.36L1 14</StreamGeometry>
<StreamGeometry x:Key="IconPower">M18.36 6.64a9 9 0 1 1-12.73 0 M12 2v10</StreamGeometry>
<StreamGeometry x:Key="IconSave">M19 21H5a2 2 0 0 1-2-2V5a2 2 0 0 1 2-2h11l5 5v11a2 2 0 0 1-2 2z M17 21v-8H7v8 M7 3v5h8</StreamGeometry>
</ResourceDictionary>
+840 -22
View File
@@ -1,44 +1,862 @@
<Styles xmlns="https://github.com/avaloniaui"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml">
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:ctrl="using:ClawdDotNet.Desktop.Controls">
<!--
Gemeinsame Anmutung der Oberflaeche.
Die gemeinsame Anmutung — Umsetzung des Entwurfs aus Mockup/.
Bewusst wenige, benannte Regeln statt Formatierung an jedem Steuerelement: Die
WinForms-Fassung hatte Groessen, Abstaende und Schriften ueber 130 Stellen in den
Designer-Dateien verteilt: Jede Aenderung war eine Suche.
Warum eigene ControlTheme statt Fluent umzufärben: Avalonia 12 hat die Ressourcen des
Fluent-Themas umgebaut. Die aus 11er-Anleitungen bekannten Schlüssel (ButtonBackground,
TextControlBackground, ControlCornerRadius …) existieren nicht mehr; ein Setter darauf
ist wirkungslos und fällt nicht auf, weil er weder Build noch Test bricht. Für die
prägenden Steuerelemente steht die Vorlage deshalb hier vollständig. Fluent bleibt
darunter als Grundlage für alles Übrige (Bildlaufleisten, Menüs, Popup-Rahmen).
Regel wie gehabt: keine festen Farbwerte. Alles über DynamicResource aus Theme.axaml,
sonst überlebt es den Wechsel zwischen hell und dunkel nicht.
-->
<Style Selector="TextBlock.heading">
<Setter Property="FontSize" Value="16" />
<Styles.Resources>
<ResourceDictionary>
<ResourceDictionary.MergedDictionaries>
<ResourceInclude Source="avares://ClawdDotNet/Styles/Theme.axaml" />
<ResourceInclude Source="avares://ClawdDotNet/Styles/Icons.axaml" />
</ResourceDictionary.MergedDictionaries>
<!-- ════════════════════════════ Schaltflächen ════════════════════════════
Grundform ist die sekundäre Schaltfläche des Entwurfs: durchsichtig, eine
Haarlinie Rahmen, eckig. Die Spielarten kommen als Klasse dazu:
.primary / .accent gefüllt in Akzentfarbe
.toolbar kleiner, Fließtextschrift — für Werkzeugleisten
.ghost ohne Rahmen, Akzentfarbe
.flat ohne Rahmen, Textfarbe (Schließen, Einklappen)
.icon quadratisch, ohne Innenabstand
.accent bleibt neben .primary bestehen: Die noch nicht überarbeiteten Dialoge
verwenden diesen Namen. -->
<ControlTheme x:Key="{x:Type Button}" TargetType="Button">
<Setter Property="Background" Value="Transparent" />
<Setter Property="BorderBrush" Value="{DynamicResource DividerBrush}" />
<Setter Property="BorderThickness" Value="1" />
<Setter Property="CornerRadius" Value="0" />
<Setter Property="Foreground" Value="{DynamicResource TextBrush}" />
<Setter Property="FontFamily" Value="{DynamicResource HeadingFont}" />
<Setter Property="FontWeight" Value="SemiBold" />
<Setter Property="FontSize" Value="14" />
<Setter Property="Padding" Value="12,7" />
<Setter Property="HorizontalContentAlignment" Value="Center" />
<Setter Property="VerticalContentAlignment" Value="Center" />
<Setter Property="Cursor" Value="Hand" />
<Setter Property="Template">
<ControlTemplate>
<ContentPresenter Name="PART_ContentPresenter"
Background="{TemplateBinding Background}"
BorderBrush="{TemplateBinding BorderBrush}"
BorderThickness="{TemplateBinding BorderThickness}"
CornerRadius="{TemplateBinding CornerRadius}"
Padding="{TemplateBinding Padding}"
Content="{TemplateBinding Content}"
ContentTemplate="{TemplateBinding ContentTemplate}"
HorizontalContentAlignment="{TemplateBinding HorizontalContentAlignment}"
VerticalContentAlignment="{TemplateBinding VerticalContentAlignment}"
RecognizesAccessKey="True" />
</ControlTemplate>
</Setter>
<Style Selector="^:pointerover /template/ ContentPresenter#PART_ContentPresenter">
<Setter Property="Background" Value="{DynamicResource HoverBrush}" />
</Style>
<Style Selector="^:pressed /template/ ContentPresenter#PART_ContentPresenter">
<Setter Property="Background" Value="{DynamicResource PressedBrush}" />
</Style>
<Style Selector="^:disabled">
<Setter Property="Opacity" Value="0.45" />
<Setter Property="Cursor" Value="Arrow" />
</Style>
<Style Selector="^.primary, ^.accent">
<Setter Property="Background" Value="{DynamicResource AccentBrush}" />
<Setter Property="BorderBrush" Value="{DynamicResource AccentBrush}" />
<Setter Property="Foreground" Value="{DynamicResource BgBrush}" />
</Style>
<Style Selector="^.primary:pointerover /template/ ContentPresenter#PART_ContentPresenter,
^.accent:pointerover /template/ ContentPresenter#PART_ContentPresenter">
<Setter Property="Background" Value="{DynamicResource Accent600Brush}" />
</Style>
<Style Selector="^.primary:pressed /template/ ContentPresenter#PART_ContentPresenter,
^.accent:pressed /template/ ContentPresenter#PART_ContentPresenter">
<Setter Property="Background" Value="{DynamicResource Accent700Brush}" />
</Style>
<Style Selector="^.toolbar">
<Setter Property="FontFamily" Value="{DynamicResource BodyFont}" />
<Setter Property="FontWeight" Value="Normal" />
<Setter Property="FontSize" Value="12.5" />
<Setter Property="Padding" Value="10,6" />
</Style>
<Style Selector="^.ghost">
<Setter Property="BorderBrush" Value="Transparent" />
<Setter Property="Foreground" Value="{DynamicResource AccentBrush}" />
<Setter Property="Padding" Value="6,4" />
</Style>
<Style Selector="^.flat">
<Setter Property="BorderBrush" Value="Transparent" />
<Setter Property="FontFamily" Value="{DynamicResource BodyFont}" />
<Setter Property="FontWeight" Value="Normal" />
<Setter Property="Padding" Value="6,4" />
</Style>
<Style Selector="^.icon">
<Setter Property="Width" Value="32" />
<Setter Property="Height" Value="32" />
<Setter Property="Padding" Value="0" />
</Style>
</ControlTheme>
<!-- Umschalt-Schaltfläche: dieselbe Form, plus ausgewählter Zustand.
Trägt im Entwurf die Segmentleiste über den Aufgaben-Listen. -->
<ControlTheme x:Key="{x:Type ToggleButton}" TargetType="ToggleButton">
<Setter Property="Background" Value="Transparent" />
<Setter Property="BorderBrush" Value="{DynamicResource DividerBrush}" />
<Setter Property="BorderThickness" Value="1" />
<Setter Property="CornerRadius" Value="0" />
<Setter Property="Foreground" Value="{DynamicResource TextBrush}" />
<Setter Property="FontFamily" Value="{DynamicResource BodyFont}" />
<Setter Property="FontSize" Value="13" />
<Setter Property="Padding" Value="14,7" />
<Setter Property="HorizontalContentAlignment" Value="Center" />
<Setter Property="VerticalContentAlignment" Value="Center" />
<Setter Property="Cursor" Value="Hand" />
<Setter Property="Template">
<ControlTemplate>
<ContentPresenter Name="PART_ContentPresenter"
Background="{TemplateBinding Background}"
BorderBrush="{TemplateBinding BorderBrush}"
BorderThickness="{TemplateBinding BorderThickness}"
CornerRadius="{TemplateBinding CornerRadius}"
Padding="{TemplateBinding Padding}"
Content="{TemplateBinding Content}"
ContentTemplate="{TemplateBinding ContentTemplate}"
HorizontalContentAlignment="{TemplateBinding HorizontalContentAlignment}"
VerticalContentAlignment="{TemplateBinding VerticalContentAlignment}" />
</ControlTemplate>
</Setter>
<Style Selector="^:pointerover /template/ ContentPresenter#PART_ContentPresenter">
<Setter Property="Background" Value="{DynamicResource HoverBrush}" />
</Style>
<Style Selector="^:checked">
<Setter Property="Foreground" Value="{DynamicResource BgBrush}" />
</Style>
<Style Selector="^:checked /template/ ContentPresenter#PART_ContentPresenter">
<Setter Property="Background" Value="{DynamicResource AccentBrush}" />
</Style>
<Style Selector="^:disabled">
<Setter Property="Opacity" Value="0.45" />
</Style>
</ControlTheme>
<!-- ════════════════════════════ Eingabefelder ════════════════════════════ -->
<ControlTheme x:Key="{x:Type TextBox}" TargetType="TextBox">
<Setter Property="Background" Value="{DynamicResource SurfaceBrush}" />
<Setter Property="BorderBrush" Value="{DynamicResource DividerBrush}" />
<Setter Property="BorderThickness" Value="1" />
<Setter Property="CornerRadius" Value="0" />
<Setter Property="Foreground" Value="{DynamicResource TextBrush}" />
<Setter Property="CaretBrush" Value="{DynamicResource AccentBrush}" />
<Setter Property="SelectionBrush" Value="{DynamicResource AccentSoftBrush}" />
<Setter Property="SelectionForegroundBrush" Value="{DynamicResource TextBrush}" />
<Setter Property="FontFamily" Value="{DynamicResource BodyFont}" />
<Setter Property="FontSize" Value="14" />
<Setter Property="MinHeight" Value="32" />
<Setter Property="Padding" Value="9,5" />
<Setter Property="VerticalContentAlignment" Value="Center" />
<Setter Property="Template">
<ControlTemplate>
<Panel>
<Border Name="PART_BorderElement"
Background="{TemplateBinding Background}"
BorderBrush="{TemplateBinding BorderBrush}"
BorderThickness="{TemplateBinding BorderThickness}"
CornerRadius="{TemplateBinding CornerRadius}"
MinHeight="{TemplateBinding MinHeight}" />
<DockPanel Margin="{TemplateBinding Padding}">
<ContentPresenter Content="{TemplateBinding InnerLeftContent}" DockPanel.Dock="Left" />
<ContentPresenter Content="{TemplateBinding InnerRightContent}" DockPanel.Dock="Right" />
<ScrollViewer Name="PART_ScrollViewer"
HorizontalScrollBarVisibility="{TemplateBinding (ScrollViewer.HorizontalScrollBarVisibility)}"
VerticalScrollBarVisibility="{TemplateBinding (ScrollViewer.VerticalScrollBarVisibility)}">
<Panel>
<!-- Der Platzhalter verschwindet, sobald etwas im Feld steht. Über
IsVisible statt Opacity, damit er keine Maus-Ereignisse abfängt. -->
<TextBlock Name="PART_Watermark"
Text="{TemplateBinding PlaceholderText}"
Foreground="{DynamicResource TextGhostBrush}"
TextAlignment="{TemplateBinding TextAlignment}"
TextWrapping="{TemplateBinding TextWrapping}"
IsVisible="{TemplateBinding Text, Converter={x:Static StringConverters.IsNullOrEmpty}}"
HorizontalAlignment="{TemplateBinding HorizontalContentAlignment}"
VerticalAlignment="{TemplateBinding VerticalContentAlignment}" />
<TextPresenter Name="PART_TextPresenter"
Text="{TemplateBinding Text, Mode=TwoWay}"
CaretIndex="{TemplateBinding CaretIndex}"
SelectionStart="{TemplateBinding SelectionStart}"
SelectionEnd="{TemplateBinding SelectionEnd}"
TextAlignment="{TemplateBinding TextAlignment}"
TextWrapping="{TemplateBinding TextWrapping}"
PasswordChar="{TemplateBinding PasswordChar}"
RevealPassword="{TemplateBinding RevealPassword}"
SelectionBrush="{TemplateBinding SelectionBrush}"
SelectionForegroundBrush="{TemplateBinding SelectionForegroundBrush}"
CaretBrush="{TemplateBinding CaretBrush}"
HorizontalAlignment="{TemplateBinding HorizontalContentAlignment}"
VerticalAlignment="{TemplateBinding VerticalContentAlignment}" />
</Panel>
</ScrollViewer>
</DockPanel>
</Panel>
</ControlTemplate>
</Setter>
<Style Selector="^:pointerover /template/ Border#PART_BorderElement">
<Setter Property="BorderBrush" Value="{DynamicResource TextGhostBrush}" />
</Style>
<Style Selector="^:focus /template/ Border#PART_BorderElement">
<Setter Property="BorderBrush" Value="{DynamicResource AccentBrush}" />
</Style>
<Style Selector="^:disabled">
<Setter Property="Opacity" Value="0.5" />
</Style>
<!-- Mehrzeilig: Text oben beginnen lassen, nicht mittig. -->
<Style Selector="^[AcceptsReturn=True]">
<Setter Property="VerticalContentAlignment" Value="Top" />
</Style>
</ControlTheme>
<!-- ════════════════════════════ Auswahlfeld ════════════════════════════ -->
<ControlTheme x:Key="{x:Type ComboBox}" TargetType="ComboBox">
<Setter Property="Background" Value="{DynamicResource SurfaceBrush}" />
<Setter Property="BorderBrush" Value="{DynamicResource DividerBrush}" />
<Setter Property="BorderThickness" Value="1" />
<Setter Property="CornerRadius" Value="0" />
<Setter Property="Foreground" Value="{DynamicResource TextBrush}" />
<Setter Property="FontFamily" Value="{DynamicResource BodyFont}" />
<Setter Property="FontSize" Value="14" />
<Setter Property="MinHeight" Value="32" />
<Setter Property="Padding" Value="9,5" />
<Setter Property="HorizontalContentAlignment" Value="Left" />
<Setter Property="VerticalContentAlignment" Value="Center" />
<Setter Property="Cursor" Value="Hand" />
<Setter Property="PlaceholderForeground" Value="{DynamicResource TextGhostBrush}" />
<Setter Property="Template">
<ControlTemplate>
<Grid ColumnDefinitions="*,Auto">
<Border Name="Background" Grid.ColumnSpan="2"
Background="{TemplateBinding Background}"
BorderBrush="{TemplateBinding BorderBrush}"
BorderThickness="{TemplateBinding BorderThickness}"
CornerRadius="{TemplateBinding CornerRadius}"
MinHeight="{TemplateBinding MinHeight}" />
<TextBlock Name="PlaceholderTextBlock" Grid.Column="0"
Text="{TemplateBinding PlaceholderText}"
Foreground="{TemplateBinding PlaceholderForeground}"
Margin="{TemplateBinding Padding}"
VerticalAlignment="Center"
IsVisible="{TemplateBinding SelectionBoxItem, Converter={x:Static ObjectConverters.IsNull}}" />
<ContentControl Name="ContentPresenter" Grid.Column="0"
Content="{TemplateBinding SelectionBoxItem}"
ContentTemplate="{TemplateBinding ItemTemplate}"
Margin="{TemplateBinding Padding}"
HorizontalAlignment="{TemplateBinding HorizontalContentAlignment}"
VerticalAlignment="Center" />
<ctrl:StrokeIcon Grid.Column="1" Data="{StaticResource IconChevronDown}"
Width="12" Height="12" Margin="0,0,9,0"
VerticalAlignment="Center" IsHitTestVisible="False" />
<Popup Name="PART_Popup"
IsOpen="{TemplateBinding IsDropDownOpen, Mode=TwoWay}"
MinWidth="{Binding Bounds.Width, RelativeSource={RelativeSource TemplatedParent}}"
PlacementTarget="Background"
IsLightDismissEnabled="True">
<Border Background="{DynamicResource SurfaceBrush}"
BorderBrush="{DynamicResource DividerBrush}"
BorderThickness="1" CornerRadius="0" Padding="0,2">
<ScrollViewer VerticalScrollBarVisibility="Auto" MaxHeight="320">
<ItemsPresenter Name="PART_ItemsPresenter"
ItemsPanel="{TemplateBinding ItemsPanel}" />
</ScrollViewer>
</Border>
</Popup>
</Grid>
</ControlTemplate>
</Setter>
<Style Selector="^:pointerover /template/ Border#Background">
<Setter Property="BorderBrush" Value="{DynamicResource TextGhostBrush}" />
</Style>
<Style Selector="^:focus /template/ Border#Background">
<Setter Property="BorderBrush" Value="{DynamicResource AccentBrush}" />
</Style>
<Style Selector="^:disabled">
<Setter Property="Opacity" Value="0.5" />
</Style>
</ControlTheme>
<ControlTheme x:Key="{x:Type ComboBoxItem}" TargetType="ComboBoxItem">
<Setter Property="Background" Value="Transparent" />
<Setter Property="Foreground" Value="{DynamicResource TextBrush}" />
<Setter Property="Padding" Value="10,6" />
<Setter Property="HorizontalContentAlignment" Value="Left" />
<Setter Property="Cursor" Value="Hand" />
<Setter Property="Template">
<ControlTemplate>
<ContentPresenter Name="PART_ContentPresenter"
Background="{TemplateBinding Background}"
Padding="{TemplateBinding Padding}"
Content="{TemplateBinding Content}"
ContentTemplate="{TemplateBinding ContentTemplate}"
HorizontalContentAlignment="{TemplateBinding HorizontalContentAlignment}"
VerticalContentAlignment="{TemplateBinding VerticalContentAlignment}" />
</ControlTemplate>
</Setter>
<Style Selector="^:pointerover /template/ ContentPresenter#PART_ContentPresenter">
<Setter Property="Background" Value="{DynamicResource HoverBrush}" />
</Style>
<Style Selector="^:selected /template/ ContentPresenter#PART_ContentPresenter">
<Setter Property="Background" Value="{DynamicResource AccentSelectedBrush}" />
</Style>
</ControlTheme>
<!-- ════════════════════ Kontrollkästchen & Auswahlknopf ════════════════════
Beide teilen sich die Form aus dem Entwurf: 16 px Marke, 1.5 px Rand, im
gewählten Zustand mit Akzent gefüllt. Unterschied ist allein die Rundung —
eckig für Mehrfach-, rund für Einfachauswahl. -->
<ControlTheme x:Key="{x:Type CheckBox}" TargetType="CheckBox">
<Setter Property="Foreground" Value="{DynamicResource TextBrush}" />
<Setter Property="FontFamily" Value="{DynamicResource BodyFont}" />
<Setter Property="FontSize" Value="14" />
<Setter Property="Cursor" Value="Hand" />
<Setter Property="VerticalContentAlignment" Value="Center" />
<Setter Property="Template">
<ControlTemplate>
<StackPanel Orientation="Horizontal" Spacing="8" Background="Transparent">
<Border Name="Mark" Width="16" Height="16" CornerRadius="3"
BorderBrush="{DynamicResource DividerBrush}" BorderThickness="1.5"
Background="Transparent" VerticalAlignment="Center">
<ctrl:StrokeIcon Name="Glyph" Width="12" Height="12" StrokeThickness="3"
Foreground="{DynamicResource BgBrush}"
Data="M4 12l5 5L20 6" IsVisible="False" />
</Border>
<ContentPresenter Name="PART_ContentPresenter"
Content="{TemplateBinding Content}"
ContentTemplate="{TemplateBinding ContentTemplate}"
VerticalAlignment="Center" />
</StackPanel>
</ControlTemplate>
</Setter>
<Style Selector="^:pointerover /template/ Border#Mark">
<Setter Property="BorderBrush" Value="{DynamicResource AccentBrush}" />
</Style>
<Style Selector="^:checked /template/ Border#Mark">
<Setter Property="Background" Value="{DynamicResource AccentBrush}" />
<Setter Property="BorderBrush" Value="{DynamicResource AccentBrush}" />
</Style>
<Style Selector="^:checked /template/ ctrl|StrokeIcon#Glyph">
<Setter Property="IsVisible" Value="True" />
</Style>
<Style Selector="^:indeterminate /template/ Border#Mark">
<Setter Property="Background" Value="{DynamicResource AccentSoftBrush}" />
<Setter Property="BorderBrush" Value="{DynamicResource AccentBrush}" />
</Style>
<Style Selector="^:disabled">
<Setter Property="Opacity" Value="0.5" />
</Style>
</ControlTheme>
<ControlTheme x:Key="{x:Type RadioButton}" TargetType="RadioButton">
<Setter Property="Foreground" Value="{DynamicResource TextBrush}" />
<Setter Property="FontFamily" Value="{DynamicResource BodyFont}" />
<Setter Property="FontSize" Value="14" />
<Setter Property="Cursor" Value="Hand" />
<Setter Property="VerticalContentAlignment" Value="Center" />
<Setter Property="Template">
<ControlTemplate>
<StackPanel Orientation="Horizontal" Spacing="8" Background="Transparent">
<Border Name="Mark" Width="16" Height="16" CornerRadius="8"
BorderBrush="{DynamicResource DividerBrush}" BorderThickness="1.5"
Background="Transparent" VerticalAlignment="Center">
<!-- Der innere Punkt entsteht wie im Entwurf durch einen Ring in
Hintergrundfarbe, nicht durch eine zweite Ellipse. -->
<Border Name="Dot" CornerRadius="8" Margin="3"
Background="{DynamicResource BgBrush}" IsVisible="False" />
</Border>
<ContentPresenter Name="PART_ContentPresenter"
Content="{TemplateBinding Content}"
ContentTemplate="{TemplateBinding ContentTemplate}"
VerticalAlignment="Center" />
</StackPanel>
</ControlTemplate>
</Setter>
<Style Selector="^:pointerover /template/ Border#Mark">
<Setter Property="BorderBrush" Value="{DynamicResource AccentBrush}" />
</Style>
<Style Selector="^:checked /template/ Border#Mark">
<Setter Property="Background" Value="{DynamicResource AccentBrush}" />
<Setter Property="BorderBrush" Value="{DynamicResource AccentBrush}" />
</Style>
<Style Selector="^:checked /template/ Border#Dot">
<Setter Property="IsVisible" Value="True" />
</Style>
<Style Selector="^:disabled">
<Setter Property="Opacity" Value="0.5" />
</Style>
</ControlTheme>
<!-- ════════════════════════════ Listen ════════════════════════════ -->
<ControlTheme x:Key="{x:Type ListBox}" TargetType="ListBox">
<Setter Property="Background" Value="Transparent" />
<Setter Property="BorderThickness" Value="0" />
<Setter Property="Padding" Value="0" />
<Setter Property="Foreground" Value="{DynamicResource TextBrush}" />
<Setter Property="Template">
<ControlTemplate>
<Border Background="{TemplateBinding Background}"
BorderBrush="{TemplateBinding BorderBrush}"
BorderThickness="{TemplateBinding BorderThickness}">
<ScrollViewer HorizontalScrollBarVisibility="{TemplateBinding (ScrollViewer.HorizontalScrollBarVisibility)}"
VerticalScrollBarVisibility="{TemplateBinding (ScrollViewer.VerticalScrollBarVisibility)}">
<ItemsPresenter Name="PART_ItemsPresenter"
ItemsPanel="{TemplateBinding ItemsPanel}"
Margin="{TemplateBinding Padding}" />
</ScrollViewer>
</Border>
</ControlTemplate>
</Setter>
</ControlTheme>
<ControlTheme x:Key="{x:Type ListBoxItem}" TargetType="ListBoxItem">
<Setter Property="Background" Value="Transparent" />
<Setter Property="Foreground" Value="{DynamicResource TextBrush}" />
<Setter Property="Padding" Value="7" />
<Setter Property="HorizontalContentAlignment" Value="Stretch" />
<Setter Property="VerticalContentAlignment" Value="Center" />
<Setter Property="Cursor" Value="Hand" />
<Setter Property="Template">
<ControlTemplate>
<ContentPresenter Name="PART_ContentPresenter"
Background="{TemplateBinding Background}"
Padding="{TemplateBinding Padding}"
Content="{TemplateBinding Content}"
ContentTemplate="{TemplateBinding ContentTemplate}"
HorizontalContentAlignment="{TemplateBinding HorizontalContentAlignment}"
VerticalContentAlignment="{TemplateBinding VerticalContentAlignment}" />
</ControlTemplate>
</Setter>
<Style Selector="^:pointerover /template/ ContentPresenter#PART_ContentPresenter">
<Setter Property="Background" Value="{DynamicResource RowHoverBrush}" />
</Style>
<Style Selector="^:selected /template/ ContentPresenter#PART_ContentPresenter">
<Setter Property="Background" Value="{DynamicResource AccentRowBrush}" />
</Style>
<Style Selector="^:selected:pointerover /template/ ContentPresenter#PART_ContentPresenter">
<Setter Property="Background" Value="{DynamicResource AccentSelectedBrush}" />
</Style>
</ControlTheme>
<!-- ════════════════════════════ Rahmen mit Eckmarken ════════════════════════════
Die vier Marken liegen halb außerhalb des Rahmens; sie sitzen deshalb in einem
Grid über dem Rahmen und nicht in ihm. IsHitTestVisible=False, damit sie
Klicks auf den Inhalt nicht abfangen. -->
<ControlTheme x:Key="{x:Type ctrl:BlueprintFrame}" TargetType="ctrl:BlueprintFrame">
<Setter Property="Background" Value="Transparent" />
<Setter Property="BorderBrush" Value="{DynamicResource DividerBrush}" />
<Setter Property="BorderThickness" Value="1" />
<Setter Property="Padding" Value="14" />
<Setter Property="HorizontalContentAlignment" Value="Stretch" />
<Setter Property="VerticalContentAlignment" Value="Stretch" />
<Setter Property="Template">
<ControlTemplate>
<Grid>
<Border Background="{TemplateBinding Background}"
BorderBrush="{TemplateBinding BorderBrush}"
BorderThickness="{TemplateBinding BorderThickness}"
Padding="{TemplateBinding Padding}">
<ContentPresenter Content="{TemplateBinding Content}"
ContentTemplate="{TemplateBinding ContentTemplate}"
HorizontalContentAlignment="{TemplateBinding HorizontalContentAlignment}"
VerticalContentAlignment="{TemplateBinding VerticalContentAlignment}" />
</Border>
<Panel Width="11" Height="11" Margin="-6,-6,0,0" IsHitTestVisible="False"
HorizontalAlignment="Left" VerticalAlignment="Top">
<Rectangle Width="1" Height="11" Margin="5,0,0,0" HorizontalAlignment="Left"
Fill="{DynamicResource TextFaintBrush}" />
<Rectangle Width="11" Height="1" Margin="0,5,0,0" VerticalAlignment="Top"
Fill="{DynamicResource TextFaintBrush}" />
</Panel>
<Panel Width="11" Height="11" Margin="0,-6,-6,0" IsHitTestVisible="False"
HorizontalAlignment="Right" VerticalAlignment="Top">
<Rectangle Width="1" Height="11" Margin="5,0,0,0" HorizontalAlignment="Left"
Fill="{DynamicResource TextFaintBrush}" />
<Rectangle Width="11" Height="1" Margin="0,5,0,0" VerticalAlignment="Top"
Fill="{DynamicResource TextFaintBrush}" />
</Panel>
<Panel Width="11" Height="11" Margin="-6,0,0,-6" IsHitTestVisible="False"
HorizontalAlignment="Left" VerticalAlignment="Bottom">
<Rectangle Width="1" Height="11" Margin="5,0,0,0" HorizontalAlignment="Left"
Fill="{DynamicResource TextFaintBrush}" />
<Rectangle Width="11" Height="1" Margin="0,5,0,0" VerticalAlignment="Top"
Fill="{DynamicResource TextFaintBrush}" />
</Panel>
<Panel Width="11" Height="11" Margin="0,0,-6,-6" IsHitTestVisible="False"
HorizontalAlignment="Right" VerticalAlignment="Bottom">
<Rectangle Width="1" Height="11" Margin="5,0,0,0" HorizontalAlignment="Left"
Fill="{DynamicResource TextFaintBrush}" />
<Rectangle Width="11" Height="1" Margin="0,5,0,0" VerticalAlignment="Top"
Fill="{DynamicResource TextFaintBrush}" />
</Panel>
</Grid>
</ControlTemplate>
</Setter>
</ControlTheme>
</ResourceDictionary>
</Styles.Resources>
<!-- ══════════════════════════════════════════════════════════════════════════
Grundlagen: Fenster, Schrift, Trenner
══════════════════════════════════════════════════════════════════════ -->
<Style Selector="Window">
<Setter Property="Background" Value="{DynamicResource BgBrush}" />
<Setter Property="Foreground" Value="{DynamicResource TextBrush}" />
<Setter Property="FontFamily" Value="{DynamicResource BodyFont}" />
<Setter Property="FontSize" Value="14" />
</Style>
<Style Selector="UserControl">
<Setter Property="Foreground" Value="{DynamicResource TextBrush}" />
<Setter Property="FontFamily" Value="{DynamicResource BodyFont}" />
</Style>
<!-- Überschriften laufen in Barlow Condensed, Fließtext in Barlow — das ist der
auffälligste Zug des Entwurfs und darf nirgends per Hand gesetzt werden. -->
<Style Selector="TextBlock.h1">
<Setter Property="FontFamily" Value="{DynamicResource HeadingFont}" />
<Setter Property="FontWeight" Value="SemiBold" />
<Setter Property="FontSize" Value="20" />
</Style>
<Style Selector="TextBlock.h2">
<Setter Property="FontFamily" Value="{DynamicResource HeadingFont}" />
<Setter Property="FontWeight" Value="SemiBold" />
<Setter Property="FontSize" Value="17" />
</Style>
<!-- Bestandsname aus der ersten Portierung; die noch nicht überarbeiteten Dialoge
binden darauf. -->
<Style Selector="TextBlock.heading">
<Setter Property="FontFamily" Value="{DynamicResource HeadingFont}" />
<Setter Property="FontWeight" Value="SemiBold" />
<Setter Property="FontSize" Value="17" />
<Setter Property="Margin" Value="0,0,0,8" />
</Style>
<Style Selector="TextBlock.caption">
<Setter Property="Opacity" Value="0.7" />
<Setter Property="FontSize" Value="12" />
<!-- Die kleine Versalzeile über jedem Abschnitt — im Entwurf durchgehend in
Akzentfarbe, 10 px, weit gesperrt. -->
<Style Selector="TextBlock.kicker">
<Setter Property="FontSize" Value="10" />
<Setter Property="LetterSpacing" Value="1" />
<Setter Property="Foreground" Value="{DynamicResource AccentBrush}" />
<Setter Property="Margin" Value="0,0,0,4" />
</Style>
<!-- Werkzeugleiste ueber einer Ansicht -->
<Style Selector="TextBlock.caption">
<Setter Property="FontSize" Value="12" />
<Setter Property="Foreground" Value="{DynamicResource TextFaintBrush}" />
</Style>
<Style Selector="TextBlock.muted">
<Setter Property="Foreground" Value="{DynamicResource TextSubtleBrush}" />
</Style>
<Style Selector="TextBlock.label">
<Setter Property="FontSize" Value="12" />
<Setter Property="Foreground" Value="{DynamicResource TextMutedBrush}" />
<Setter Property="Margin" Value="0,0,0,4" />
</Style>
<Style Selector="TextBlock.mono, SelectableTextBlock.mono">
<Setter Property="FontFamily" Value="{DynamicResource MonoFont}" />
<Setter Property="FontSize" Value="12.5" />
</Style>
<Style Selector="SelectableTextBlock">
<Setter Property="SelectionBrush" Value="{DynamicResource AccentSoftBrush}" />
</Style>
<!-- Log-Stufen. Über Klassen statt über einen Pinsel aus einem Konverter, damit die
Farben beim Wechsel auf Dunkel mitziehen. -->
<Style Selector="SelectableTextBlock.warn">
<Setter Property="Foreground" Value="{DynamicResource WarningBrush}" />
</Style>
<Style Selector="SelectableTextBlock.err, SelectableTextBlock.ftl">
<Setter Property="Foreground" Value="{DynamicResource DangerBrush}" />
</Style>
<!-- ══════════════════════════════════════════════════════════════════════════
Flächen
══════════════════════════════════════════════════════════════════════ -->
<!-- Karte: eckig, Haarlinie, durchsichtig — der Entwurf setzt bewusst keine
Füllfarbe, damit die Kästen als Zeichnung und nicht als Kacheln wirken. -->
<Style Selector="Border.card">
<Setter Property="BorderBrush" Value="{DynamicResource DividerBrush}" />
<Setter Property="BorderThickness" Value="1" />
<Setter Property="CornerRadius" Value="0" />
<Setter Property="Padding" Value="10" />
<Setter Property="Background" Value="Transparent" />
</Style>
<!-- Karte in Akzent hinterlegt — eigene Chat-Nachrichten. -->
<Style Selector="Border.card.accent">
<Setter Property="Background" Value="{DynamicResource AccentSoftBrush}" />
</Style>
<Style Selector="Border.surface">
<Setter Property="Background" Value="{DynamicResource SurfaceBrush}" />
</Style>
<Style Selector="Border.statusbar">
<Setter Property="BorderBrush" Value="{DynamicResource DividerBrush}" />
<Setter Property="BorderThickness" Value="0,1,0,0" />
<Setter Property="Padding" Value="24,6" />
</Style>
<Style Selector="Border.topbar">
<Setter Property="BorderBrush" Value="{DynamicResource DividerBrush}" />
<Setter Property="BorderThickness" Value="0,0,0,1" />
<Setter Property="Padding" Value="24,14" />
</Style>
<!-- Konsolenfläche der Log-Ansicht -->
<Style Selector="Border.console">
<Setter Property="Background" Value="{DynamicResource SurfaceBrush}" />
<Setter Property="BorderBrush" Value="{DynamicResource DividerBrush}" />
<Setter Property="BorderThickness" Value="1" />
<Setter Property="Padding" Value="14" />
</Style>
<!-- Senkrechter Strich zwischen Gruppen einer Werkzeugleiste -->
<Style Selector="Border.sep">
<Setter Property="Width" Value="1" />
<Setter Property="Height" Value="20" />
<Setter Property="Margin" Value="4,0" />
<Setter Property="Background" Value="{DynamicResource DividerBrush}" />
<Setter Property="VerticalAlignment" Value="Center" />
</Style>
<Style Selector="Border.hr">
<Setter Property="Height" Value="1" />
<Setter Property="Background" Value="{DynamicResource DividerBrush}" />
</Style>
<!-- ══════════════════════════════════════════════════════════════════════════
Werkzeugleisten
══════════════════════════════════════════════════════════════════════ -->
<Style Selector="StackPanel.toolbar">
<Setter Property="Orientation" Value="Horizontal" />
<Setter Property="Spacing" Value="6" />
<Setter Property="Margin" Value="8" />
<Setter Property="Margin" Value="0,0,0,10" />
</Style>
<Style Selector="Border.card">
<Setter Property="BorderBrush" Value="{DynamicResource SystemControlForegroundBaseLowBrush}" />
<Setter Property="BorderThickness" Value="1" />
<Setter Property="CornerRadius" Value="4" />
<Setter Property="Padding" Value="12" />
<Style Selector="WrapPanel.toolbar">
<Setter Property="Orientation" Value="Horizontal" />
<Setter Property="ItemSpacing" Value="6" />
<Setter Property="LineSpacing" Value="6" />
<Setter Property="Margin" Value="0,0,0,10" />
</Style>
<!-- Statusleiste am unteren Rand -->
<Style Selector="Border.statusbar">
<Setter Property="BorderBrush" Value="{DynamicResource SystemControlForegroundBaseLowBrush}" />
<Setter Property="BorderThickness" Value="0,1,0,0" />
<Setter Property="Padding" Value="8,4" />
<!-- ══════════════════════════════════════════════════════════════════════════
Tabellen
Von Hand statt DataGrid: Der Entwurf zeigt eine Kopfzeile in Versalien und
Zeilen mit Haarlinie darunter — mehr nicht, kein Sortieren, kein Spaltenziehen.
Ein umgefärbtes DataGrid wäre hier deutlich mehr Aufwand als eine ListBox, und
das Ergebnis säße am Ende doch nicht auf dem Raster des Entwurfs.
══════════════════════════════════════════════════════════════════════ -->
<!-- Kopfzelle -->
<Style Selector="TextBlock.th">
<Setter Property="FontSize" Value="11" />
<Setter Property="LetterSpacing" Value="0.9" />
<Setter Property="Foreground" Value="{DynamicResource TextSubtleBrush}" />
<Setter Property="VerticalAlignment" Value="Center" />
</Style>
<!-- Kopfzeile: trägt die Linie, die die Spaltentitel vom Inhalt trennt -->
<Style Selector="Border.thead">
<Setter Property="BorderBrush" Value="{DynamicResource DividerBrush}" />
<Setter Property="BorderThickness" Value="0,0,0,1" />
<Setter Property="Padding" Value="7" />
</Style>
<!-- Zeile: Haarlinie unten, schwächer als die der Kopfzeile -->
<Style Selector="Border.tr">
<Setter Property="BorderBrush" Value="{DynamicResource RowLineBrush}" />
<Setter Property="BorderThickness" Value="0,0,0,1" />
</Style>
<Style Selector="ListBox.table > ListBoxItem">
<Setter Property="Padding" Value="0" />
</Style>
<!-- Zelltext -->
<Style Selector="TextBlock.td">
<Setter Property="VerticalAlignment" Value="Center" />
<Setter Property="TextTrimming" Value="CharacterEllipsis" />
</Style>
<Style Selector="TextBlock.td.dim">
<Setter Property="FontSize" Value="12" />
<Setter Property="Foreground" Value="{DynamicResource TextSubtleBrush}" />
</Style>
<!-- ══════════════════════════════════════════════════════════════════════════
Etiketten (Status in Tabellen)
══════════════════════════════════════════════════════════════════════ -->
<Style Selector="Border.tag">
<Setter Property="Padding" Value="9,2" />
<Setter Property="CornerRadius" Value="0" />
<Setter Property="Background" Value="{DynamicResource Neutral100Brush}" />
<Setter Property="HorizontalAlignment" Value="Left" />
<Setter Property="VerticalAlignment" Value="Center" />
</Style>
<Style Selector="Border.tag > TextBlock">
<Setter Property="FontSize" Value="11" />
<Setter Property="Foreground" Value="{DynamicResource Neutral800Brush}" />
</Style>
<Style Selector="Border.tag.ok">
<Setter Property="Background" Value="{DynamicResource AccentSoftBrush}" />
</Style>
<Style Selector="Border.tag.ok > TextBlock">
<Setter Property="Foreground" Value="{DynamicResource Accent700Brush}" />
</Style>
<Style Selector="Border.tag.bad">
<Setter Property="Background" Value="{DynamicResource DangerSoftBrush}" />
</Style>
<Style Selector="Border.tag.bad > TextBlock">
<Setter Property="Foreground" Value="{DynamicResource DangerTextBrush}" />
</Style>
<!-- ══════════════════════════════════════════════════════════════════════════
Seitenleiste
══════════════════════════════════════════════════════════════════════ -->
<Style Selector="Border.sidebar">
<Setter Property="Background" Value="{DynamicResource SurfaceBrush}" />
<Setter Property="BorderBrush" Value="{DynamicResource DividerBrush}" />
<Setter Property="BorderThickness" Value="0,0,1,0" />
</Style>
<!-- Gruppentitel „Arbeiten“ / „Analyse“ / „System“ -->
<Style Selector="TextBlock.navgroup">
<Setter Property="FontSize" Value="10" />
<Setter Property="LetterSpacing" Value="1.2" />
<Setter Property="Foreground" Value="{DynamicResource TextGhostBrush}" />
<Setter Property="Margin" Value="8,0,8,6" />
</Style>
<!-- Navigationszeile: Grundzustand durchsichtig, gewählt mit Akzent hinterlegt.
Als Button und nicht als ListBoxItem, damit Tastaturbedienung und Tooltip im
eingeklappten Zustand ohne Zusatzarbeit funktionieren. -->
<Style Selector="Button.nav">
<Setter Property="Background" Value="Transparent" />
<Setter Property="BorderThickness" Value="0" />
<Setter Property="Foreground" Value="{DynamicResource TextBrush}" />
<Setter Property="FontFamily" Value="{DynamicResource BodyFont}" />
<Setter Property="FontSize" Value="13.5" />
<Setter Property="FontWeight" Value="Normal" />
<Setter Property="Padding" Value="10,9" />
<Setter Property="HorizontalAlignment" Value="Stretch" />
<Setter Property="HorizontalContentAlignment" Value="Left" />
</Style>
<Style Selector="Button.nav.selected">
<Setter Property="Background" Value="{DynamicResource AccentSelectedBrush}" />
<Setter Property="Foreground" Value="{DynamicResource AccentBrush}" />
<Setter Property="FontWeight" Value="SemiBold" />
</Style>
<!-- Eingeklappt: nur das Symbol, mittig -->
<Style Selector="Button.nav.collapsed">
<Setter Property="Padding" Value="9" />
<Setter Property="HorizontalContentAlignment" Value="Center" />
</Style>
<!-- Instanz-Schalter oben in der Seitenleiste — einziger Knopf mit Akzentrahmen -->
<Style Selector="Button.instance">
<Setter Property="BorderBrush" Value="{DynamicResource AccentBrush}" />
<Setter Property="Background" Value="Transparent" />
<Setter Property="Foreground" Value="{DynamicResource TextBrush}" />
<Setter Property="FontFamily" Value="{DynamicResource BodyFont}" />
<Setter Property="FontWeight" Value="Normal" />
<Setter Property="Padding" Value="10,9" />
<Setter Property="HorizontalAlignment" Value="Stretch" />
<Setter Property="HorizontalContentAlignment" Value="Left" />
</Style>
<!-- ══════════════════════════════════════════════════════════════════════════
Teiler zwischen den Bereichen der Agenten-Seite
══════════════════════════════════════════════════════════════════════ -->
<Style Selector="GridSplitter">
<Setter Property="Background" Value="Transparent" />
<Setter Property="MinWidth" Value="0" />
<Setter Property="MinHeight" Value="0" />
</Style>
<!-- Waagerechter Teiler: eine sichtbare Leiste mit Griffstrich, wie im Entwurf -->
<Style Selector="GridSplitter.horizontal">
<Setter Property="Height" Value="10" />
<Setter Property="Background" Value="{DynamicResource SurfaceBrush}" />
<Setter Property="Cursor" Value="SizeNorthSouth" />
<Setter Property="Template">
<ControlTemplate>
<Border Background="{TemplateBinding Background}"
BorderBrush="{DynamicResource DividerBrush}"
BorderThickness="0,1">
<Rectangle Width="36" Height="2" Fill="{DynamicResource DividerBrush}"
HorizontalAlignment="Center" VerticalAlignment="Center" />
</Border>
</ControlTemplate>
</Setter>
</Style>
<!-- Senkrechter Teiler: unsichtbar bis auf den Mauszeiger, wie im Entwurf -->
<Style Selector="GridSplitter.vertical">
<Setter Property="Width" Value="10" />
<Setter Property="Cursor" Value="SizeWestEast" />
</Style>
</Styles>
+157
View File
@@ -0,0 +1,157 @@
<ResourceDictionary xmlns="https://github.com/avaloniaui"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml">
<!--
Farbwerte des Entwurfs (Mockup/…/ClawdDotNet-UI-Mockup.dc.html, Konstanten LIGHT/DARK).
Warum ThemeDictionaries und nicht zwei Dateien: Avalonia tauscht den passenden Block
aus, sobald die ThemeVariant wechselt. Jede Ansicht bindet mit DynamicResource auf
einen Namen — der Umschalter in der Kopfzeile ist damit eine einzige Zuweisung und
kein Neuaufbau der Oberflaeche.
Deckkraft-Abstufungen stehen als eigene Buerste da, nicht als Opacity am
Steuerelement: Opacity blasst auch alle Kindelemente aus, eine halbdurchsichtige
Farbe nur sich selbst.
-->
<ResourceDictionary.ThemeDictionaries>
<!-- ══════════════════════════════ HELL ══════════════════════════════ -->
<ResourceDictionary x:Key="Light">
<!-- Grundflaechen -->
<SolidColorBrush x:Key="BgBrush" Color="#f2f2f3" />
<SolidColorBrush x:Key="SurfaceBrush" Color="#e9e9ea" />
<SolidColorBrush x:Key="TextBrush" Color="#1d1f20" />
<SolidColorBrush x:Key="AccentBrush" Color="#5980a6" />
<SolidColorBrush x:Key="Accent2Brush" Color="#728fab" />
<SolidColorBrush x:Key="DividerBrush" Color="#291d1f20" />
<Color x:Key="BgColor">#f2f2f3</Color>
<Color x:Key="SurfaceColor">#e9e9ea</Color>
<Color x:Key="TextColor">#1d1f20</Color>
<Color x:Key="AccentColor">#5980a6</Color>
<!-- Text in Abstufungen: 70 % / 60 % / 55 % / 50 % Deckkraft -->
<SolidColorBrush x:Key="TextMutedBrush" Color="#b31d1f20" />
<SolidColorBrush x:Key="TextSubtleBrush" Color="#991d1f20" />
<SolidColorBrush x:Key="TextFaintBrush" Color="#8c1d1f20" />
<SolidColorBrush x:Key="TextGhostBrush" Color="#801d1f20" />
<!-- Zustaende: aus der Textfarbe abgeleitet, damit sie auf jedem Grund sitzen -->
<SolidColorBrush x:Key="HoverBrush" Color="#121d1f20" />
<SolidColorBrush x:Key="PressedBrush" Color="#241d1f20" />
<SolidColorBrush x:Key="RowHoverBrush" Color="#0a1d1f20" />
<SolidColorBrush x:Key="RowLineBrush" Color="#141d1f20" />
<!-- Akzent, hinterlegt -->
<SolidColorBrush x:Key="AccentSoftBrush" Color="#265980a6" />
<SolidColorBrush x:Key="AccentSelectedBrush" Color="#295980a6" />
<SolidColorBrush x:Key="AccentRowBrush" Color="#1f5980a6" />
<!-- Neutrale Rampe -->
<SolidColorBrush x:Key="Neutral100Brush" Color="#f5f5f8" />
<SolidColorBrush x:Key="Neutral200Brush" Color="#e7e7ea" />
<SolidColorBrush x:Key="Neutral300Brush" Color="#d4d4d7" />
<SolidColorBrush x:Key="Neutral400Brush" Color="#b7b7ba" />
<SolidColorBrush x:Key="Neutral500Brush" Color="#98989b" />
<SolidColorBrush x:Key="Neutral600Brush" Color="#7a7a7d" />
<SolidColorBrush x:Key="Neutral700Brush" Color="#5d5d60" />
<SolidColorBrush x:Key="Neutral800Brush" Color="#424244" />
<SolidColorBrush x:Key="Neutral900Brush" Color="#2b2b2d" />
<!-- Akzent-Rampe -->
<SolidColorBrush x:Key="Accent100Brush" Color="#eef6ff" />
<SolidColorBrush x:Key="Accent200Brush" Color="#d6ebff" />
<SolidColorBrush x:Key="Accent300Brush" Color="#b5d9fd" />
<SolidColorBrush x:Key="Accent400Brush" Color="#94bce3" />
<SolidColorBrush x:Key="Accent500Brush" Color="#749dc4" />
<SolidColorBrush x:Key="Accent600Brush" Color="#597ea3" />
<SolidColorBrush x:Key="Accent700Brush" Color="#416180" />
<SolidColorBrush x:Key="Accent800Brush" Color="#2c455d" />
<SolidColorBrush x:Key="Accent900Brush" Color="#1d2d3d" />
<!-- Zustandsfarben: Statuspunkt, Meldungsleiste, Tabellen-Etiketten -->
<SolidColorBrush x:Key="SuccessBrush" Color="#3f8f5c" />
<SolidColorBrush x:Key="WarningBrush" Color="#b5822a" />
<SolidColorBrush x:Key="DangerBrush" Color="#c0392b" />
<SolidColorBrush x:Key="DangerSoftBrush" Color="#2eb3453b" />
<SolidColorBrush x:Key="DangerTextBrush" Color="#7a2c25" />
<SolidColorBrush x:Key="WarningSoftBrush" Color="#1ab5822a" />
<SolidColorBrush x:Key="DangerBarBrush" Color="#1ac0392b" />
</ResourceDictionary>
<!-- ══════════════════════════════ DUNKEL ══════════════════════════════ -->
<ResourceDictionary x:Key="Dark">
<SolidColorBrush x:Key="BgBrush" Color="#1a1c1e" />
<SolidColorBrush x:Key="SurfaceBrush" Color="#232527" />
<SolidColorBrush x:Key="TextBrush" Color="#eef0f1" />
<SolidColorBrush x:Key="AccentBrush" Color="#7ea3c6" />
<SolidColorBrush x:Key="Accent2Brush" Color="#8fa8c2" />
<SolidColorBrush x:Key="DividerBrush" Color="#29eef0f1" />
<Color x:Key="BgColor">#1a1c1e</Color>
<Color x:Key="SurfaceColor">#232527</Color>
<Color x:Key="TextColor">#eef0f1</Color>
<Color x:Key="AccentColor">#7ea3c6</Color>
<SolidColorBrush x:Key="TextMutedBrush" Color="#b3eef0f1" />
<SolidColorBrush x:Key="TextSubtleBrush" Color="#99eef0f1" />
<SolidColorBrush x:Key="TextFaintBrush" Color="#8ceef0f1" />
<SolidColorBrush x:Key="TextGhostBrush" Color="#80eef0f1" />
<SolidColorBrush x:Key="HoverBrush" Color="#12eef0f1" />
<SolidColorBrush x:Key="PressedBrush" Color="#24eef0f1" />
<SolidColorBrush x:Key="RowHoverBrush" Color="#0aeef0f1" />
<SolidColorBrush x:Key="RowLineBrush" Color="#14eef0f1" />
<SolidColorBrush x:Key="AccentSoftBrush" Color="#267ea3c6" />
<SolidColorBrush x:Key="AccentSelectedBrush" Color="#297ea3c6" />
<SolidColorBrush x:Key="AccentRowBrush" Color="#1f7ea3c6" />
<!-- Rampen gespiegelt: 100 ist im Dunkeln die dunkelste Stufe -->
<SolidColorBrush x:Key="Neutral100Brush" Color="#2b2b2d" />
<SolidColorBrush x:Key="Neutral200Brush" Color="#424244" />
<SolidColorBrush x:Key="Neutral300Brush" Color="#5d5d60" />
<SolidColorBrush x:Key="Neutral400Brush" Color="#7a7a7d" />
<SolidColorBrush x:Key="Neutral500Brush" Color="#98989b" />
<SolidColorBrush x:Key="Neutral600Brush" Color="#b7b7ba" />
<SolidColorBrush x:Key="Neutral700Brush" Color="#d4d4d7" />
<SolidColorBrush x:Key="Neutral800Brush" Color="#e7e7ea" />
<SolidColorBrush x:Key="Neutral900Brush" Color="#f5f5f8" />
<SolidColorBrush x:Key="Accent100Brush" Color="#1d2d3d" />
<SolidColorBrush x:Key="Accent200Brush" Color="#2c455d" />
<SolidColorBrush x:Key="Accent300Brush" Color="#416180" />
<SolidColorBrush x:Key="Accent400Brush" Color="#597ea3" />
<SolidColorBrush x:Key="Accent500Brush" Color="#749dc4" />
<SolidColorBrush x:Key="Accent600Brush" Color="#94bce3" />
<SolidColorBrush x:Key="Accent700Brush" Color="#b5d9fd" />
<SolidColorBrush x:Key="Accent800Brush" Color="#d6ebff" />
<SolidColorBrush x:Key="Accent900Brush" Color="#eef6ff" />
<SolidColorBrush x:Key="SuccessBrush" Color="#5fb37e" />
<SolidColorBrush x:Key="WarningBrush" Color="#d1a153" />
<SolidColorBrush x:Key="DangerBrush" Color="#e0685a" />
<SolidColorBrush x:Key="DangerSoftBrush" Color="#2ee0685a" />
<SolidColorBrush x:Key="DangerTextBrush" Color="#f0a79c" />
<SolidColorBrush x:Key="WarningSoftBrush" Color="#1ad1a153" />
<SolidColorBrush x:Key="DangerBarBrush" Color="#1ae0685a" />
</ResourceDictionary>
</ResourceDictionary.ThemeDictionaries>
<!-- ══════════════════ Themenunabhaengig ══════════════════ -->
<!--
Barlow Condensed ueber Barlow, beide mitgeliefert statt per Systemname referenziert:
Barlow Condensed liegt auf keinem Windows und auf keinem schlanken Linux-Abbild, und
ohne die Schrift faellt der halbe Entwurf in sich zusammen.
-->
<FontFamily x:Key="HeadingFont">avares://ClawdDotNet/Assets/Fonts#Barlow Condensed</FontFamily>
<FontFamily x:Key="BodyFont">avares://ClawdDotNet/Assets/Fonts#Barlow</FontFamily>
<FontFamily x:Key="MonoFont">Cascadia Mono,Consolas,Menlo,DejaVu Sans Mono,monospace</FontFamily>
</ResourceDictionary>