feat(ui): rebrand to Wild Dragon + Microsoft Teams layout
Some checks failed
CI / build-and-test (push) Failing after 33s
Some checks failed
CI / build-and-test (push) Failing after 33s
Replaces the Stone theme with Wild Dragon branding (canvas #0A0A0A, accent cyan #97EDF0, secondary #9AE0FD, coral alert #FB819C — sourced from wilddragon.net) and reorganizes MainWindow into a Microsoft Teams-style three-column layout: a 72px left rail (logo + Participants/Settings nav + engine-status indicator), a center content area (header + participants card), and a right settings panel. Adds InitialsConverter so participant avatars render real initials (Brendon Power -> 'BP', '(Local)' -> 'L') instead of a generic glyph. Drops the obsolete StoneTheme.xaml; the project now ships exactly one theme dictionary. Typography: Inter (with Segoe UI Variable Display fallback) for the sans stack, JetBrains Mono (Cascadia Mono fallback) for machine names and timecodes — matching the wilddragon.net site. Verified live against the running Teams meeting: app launches, participant 'Brendon Power' displays with avatar, settings panel surfaces NDI groups + Hide-Local toggle, engine status pill shows green/live.
This commit is contained in:
parent
53c06a9af9
commit
6cac486fbe
5 changed files with 949 additions and 774 deletions
|
|
@ -4,7 +4,7 @@
|
|||
<Application.Resources>
|
||||
<ResourceDictionary>
|
||||
<ResourceDictionary.MergedDictionaries>
|
||||
<ResourceDictionary Source="/Themes/StoneTheme.xaml"/>
|
||||
<ResourceDictionary Source="/Themes/WildDragonTheme.xaml"/>
|
||||
</ResourceDictionary.MergedDictionaries>
|
||||
</ResourceDictionary>
|
||||
</Application.Resources>
|
||||
|
|
|
|||
30
src/TeamsISO.App/Converters/InitialsConverter.cs
Normal file
30
src/TeamsISO.App/Converters/InitialsConverter.cs
Normal file
|
|
@ -0,0 +1,30 @@
|
|||
using System.Globalization;
|
||||
using System.Windows.Data;
|
||||
|
||||
namespace TeamsISO.App.Converters;
|
||||
|
||||
/// <summary>
|
||||
/// Converts a display name to up to two uppercase initials for an avatar bubble.
|
||||
/// "Brendon Power" → "BP". "(Local)" → "L". Falls back to "·" for empty inputs.
|
||||
/// </summary>
|
||||
public sealed class InitialsConverter : IValueConverter
|
||||
{
|
||||
public object Convert(object? value, Type targetType, object? parameter, CultureInfo culture)
|
||||
{
|
||||
var s = value as string;
|
||||
if (string.IsNullOrWhiteSpace(s)) return "·";
|
||||
|
||||
// Strip surrounding parens / punctuation that would otherwise become
|
||||
// useless initials (e.g. "(Local)" should yield "L", not "(").
|
||||
var cleaned = new string(s.Where(c => char.IsLetterOrDigit(c) || char.IsWhiteSpace(c)).ToArray()).Trim();
|
||||
if (cleaned.Length == 0) return "·";
|
||||
|
||||
var parts = cleaned.Split(' ', StringSplitOptions.RemoveEmptyEntries | StringSplitOptions.TrimEntries);
|
||||
if (parts.Length == 0) return "·";
|
||||
if (parts.Length == 1) return char.ToUpperInvariant(parts[0][0]).ToString();
|
||||
return $"{char.ToUpperInvariant(parts[0][0])}{char.ToUpperInvariant(parts[^1][0])}";
|
||||
}
|
||||
|
||||
public object ConvertBack(object? value, Type targetType, object? parameter, CultureInfo culture)
|
||||
=> throw new NotSupportedException();
|
||||
}
|
||||
|
|
@ -4,9 +4,9 @@
|
|||
xmlns:vm="clr-namespace:TeamsISO.App.ViewModels"
|
||||
xmlns:conv="clr-namespace:TeamsISO.App.Converters"
|
||||
Title="TeamsISO"
|
||||
Height="760" Width="1180"
|
||||
MinHeight="600" MinWidth="960"
|
||||
Background="{DynamicResource Stone.Canvas}"
|
||||
Height="780" Width="1280"
|
||||
MinHeight="640" MinWidth="1080"
|
||||
Background="{DynamicResource Wd.Canvas}"
|
||||
UseLayoutRounding="True"
|
||||
TextOptions.TextFormattingMode="Ideal"
|
||||
TextOptions.TextRenderingMode="ClearType">
|
||||
|
|
@ -14,42 +14,140 @@
|
|||
<Window.Resources>
|
||||
<conv:BoolToVisibilityConverter x:Key="BoolToVis"/>
|
||||
<conv:EnumDescriptionConverter x:Key="EnumDesc"/>
|
||||
<conv:InitialsConverter x:Key="Initials"/>
|
||||
</Window.Resources>
|
||||
|
||||
<DockPanel LastChildFill="True">
|
||||
<Grid>
|
||||
<Grid.ColumnDefinitions>
|
||||
<ColumnDefinition Width="72"/> <!-- Left rail -->
|
||||
<ColumnDefinition Width="*"/> <!-- Main content -->
|
||||
<ColumnDefinition Width="380"/> <!-- Settings panel -->
|
||||
</Grid.ColumnDefinitions>
|
||||
|
||||
<!-- ════════ Alert banner (top) ════════ -->
|
||||
<!-- ════════════════════════════════════════════════════════════════
|
||||
LEFT RAIL (Teams-style nav)
|
||||
════════════════════════════════════════════════════════════════ -->
|
||||
<Border Grid.Column="0"
|
||||
Background="{DynamicResource Wd.Rail}"
|
||||
BorderBrush="{DynamicResource Wd.Border}"
|
||||
BorderThickness="0,0,1,0">
|
||||
<DockPanel LastChildFill="False">
|
||||
|
||||
<!-- Wild Dragon logo: cyan circular mark with stylized "W" inside -->
|
||||
<Border DockPanel.Dock="Top"
|
||||
Background="{DynamicResource Status.Bad.Surface}"
|
||||
BorderBrush="{DynamicResource Status.Bad}"
|
||||
Width="40" Height="40"
|
||||
Margin="0,16,0,8"
|
||||
HorizontalAlignment="Center"
|
||||
CornerRadius="10"
|
||||
Background="{DynamicResource Wd.Accent.CyanMuted}"
|
||||
BorderBrush="{DynamicResource Wd.Accent.Cyan}"
|
||||
BorderThickness="1">
|
||||
<Path Data="M 10,8 L 14,24 L 17,16 L 20,24 L 24,8"
|
||||
Stroke="{DynamicResource Wd.Accent.Cyan}"
|
||||
StrokeThickness="2"
|
||||
StrokeStartLineCap="Round"
|
||||
StrokeEndLineCap="Round"
|
||||
StrokeLineJoin="Round"
|
||||
HorizontalAlignment="Center"
|
||||
VerticalAlignment="Center"/>
|
||||
</Border>
|
||||
|
||||
<TextBlock DockPanel.Dock="Top"
|
||||
Text="WD"
|
||||
Style="{StaticResource Wd.Text.Caption}"
|
||||
Foreground="{DynamicResource Wd.Accent.Cyan}"
|
||||
HorizontalAlignment="Center"
|
||||
Margin="0,0,0,16"/>
|
||||
|
||||
<!-- Divider -->
|
||||
<Border DockPanel.Dock="Top"
|
||||
Height="1"
|
||||
Background="{DynamicResource Wd.Border}"
|
||||
Margin="14,0,14,12"/>
|
||||
|
||||
<!-- Nav: Participants (active) -->
|
||||
<Button DockPanel.Dock="Top"
|
||||
Style="{StaticResource Wd.Button.RailIcon}"
|
||||
ToolTip="Participants">
|
||||
<Grid>
|
||||
<Border Width="48" Height="48"
|
||||
CornerRadius="8"
|
||||
Background="{DynamicResource Wd.Accent.CyanMuted}"/>
|
||||
<Path Data="M 8,17 C 8,13 12,11 14,11 C 16,11 20,13 20,17 M 14,5 C 16,5 17.5,6.5 17.5,8.5 C 17.5,10.5 16,12 14,12 C 12,12 10.5,10.5 10.5,8.5 C 10.5,6.5 12,5 14,5"
|
||||
Stroke="{DynamicResource Wd.Accent.Cyan}"
|
||||
StrokeThickness="1.6"
|
||||
Fill="Transparent"
|
||||
HorizontalAlignment="Center"
|
||||
VerticalAlignment="Center"
|
||||
Width="28" Height="22"
|
||||
Stretch="Uniform"/>
|
||||
</Grid>
|
||||
</Button>
|
||||
|
||||
<!-- Nav: Settings (placeholder — opens panel on right; not toggled in this build) -->
|
||||
<Button DockPanel.Dock="Top"
|
||||
Style="{StaticResource Wd.Button.RailIcon}"
|
||||
ToolTip="Settings">
|
||||
<Path Data="M 14,4 L 14,7 M 14,21 L 14,24 M 4,14 L 7,14 M 21,14 L 24,14 M 7.5,7.5 L 9.5,9.5 M 18.5,18.5 L 20.5,20.5 M 7.5,20.5 L 9.5,18.5 M 18.5,9.5 L 20.5,7.5 M 14,11 C 15.7,11 17,12.3 17,14 C 17,15.7 15.7,17 14,17 C 12.3,17 11,15.7 11,14 C 11,12.3 12.3,11 14,11"
|
||||
Stroke="{DynamicResource Wd.Text.Secondary}"
|
||||
StrokeThickness="1.5"
|
||||
Fill="Transparent"
|
||||
Width="22" Height="22"
|
||||
Stretch="Uniform"/>
|
||||
</Button>
|
||||
|
||||
<!-- Engine status indicator at bottom -->
|
||||
<Border DockPanel.Dock="Bottom"
|
||||
Width="40" Height="40"
|
||||
Margin="0,0,0,16"
|
||||
HorizontalAlignment="Center"
|
||||
Background="{DynamicResource Wd.Status.LiveBg}"
|
||||
CornerRadius="20"
|
||||
ToolTip="{Binding StatusText}">
|
||||
<Ellipse Width="10" Height="10"
|
||||
Fill="{DynamicResource Wd.Status.Live}"
|
||||
HorizontalAlignment="Center"
|
||||
VerticalAlignment="Center"/>
|
||||
</Border>
|
||||
</DockPanel>
|
||||
</Border>
|
||||
|
||||
<!-- ════════════════════════════════════════════════════════════════
|
||||
MAIN CONTENT
|
||||
════════════════════════════════════════════════════════════════ -->
|
||||
<DockPanel Grid.Column="1" LastChildFill="True">
|
||||
|
||||
<!-- Alert banner -->
|
||||
<Border DockPanel.Dock="Top"
|
||||
Background="{DynamicResource Wd.Accent.CoralBg}"
|
||||
BorderBrush="{DynamicResource Wd.Accent.Coral}"
|
||||
BorderThickness="0,0,0,1"
|
||||
Padding="20,10"
|
||||
Padding="24,12"
|
||||
Visibility="{Binding AlertBanner.IsVisible, Converter={StaticResource BoolToVis}}">
|
||||
<DockPanel>
|
||||
<Button DockPanel.Dock="Right"
|
||||
Style="{StaticResource Button.Ghost}"
|
||||
Style="{StaticResource Wd.Button.Ghost}"
|
||||
Content="Dismiss"
|
||||
Command="{Binding AlertBanner.DismissCommand}"
|
||||
Margin="12,0,0,0"/>
|
||||
<StackPanel Orientation="Horizontal" VerticalAlignment="Center">
|
||||
<Ellipse Width="8" Height="8"
|
||||
Fill="{DynamicResource Status.Bad}"
|
||||
Fill="{DynamicResource Wd.Accent.Coral}"
|
||||
VerticalAlignment="Center"
|
||||
Margin="0,0,10,0"/>
|
||||
Margin="0,0,12,0"/>
|
||||
<TextBlock Text="{Binding AlertBanner.Message}"
|
||||
Style="{StaticResource Text.Body}"
|
||||
Style="{StaticResource Wd.Text.Body}"
|
||||
FontWeight="SemiBold"
|
||||
VerticalAlignment="Center"/>
|
||||
</StackPanel>
|
||||
</DockPanel>
|
||||
</Border>
|
||||
|
||||
<!-- ════════ Header ════════ -->
|
||||
<!-- Header strip -->
|
||||
<Border DockPanel.Dock="Top"
|
||||
Background="{DynamicResource Stone.Canvas}"
|
||||
BorderBrush="{DynamicResource Stone.Border}"
|
||||
BorderBrush="{DynamicResource Wd.Border}"
|
||||
BorderThickness="0,0,0,1"
|
||||
Padding="24,18">
|
||||
Padding="32,20">
|
||||
<Grid>
|
||||
<Grid.ColumnDefinitions>
|
||||
<ColumnDefinition Width="*"/>
|
||||
|
|
@ -58,28 +156,29 @@
|
|||
|
||||
<StackPanel Orientation="Horizontal" VerticalAlignment="Center">
|
||||
<TextBlock Text="TeamsISO"
|
||||
Style="{StaticResource Text.Display}"
|
||||
FontWeight="Bold"
|
||||
Style="{StaticResource Wd.Text.Title}"
|
||||
VerticalAlignment="Center"/>
|
||||
<TextBlock Text="Per-participant NDI ISO controller"
|
||||
Style="{StaticResource Text.Body}"
|
||||
Foreground="{DynamicResource Text.Tertiary}"
|
||||
<Border Style="{StaticResource Wd.Pill}"
|
||||
Margin="14,0,0,0"
|
||||
VerticalAlignment="Center"/>
|
||||
VerticalAlignment="Center">
|
||||
<TextBlock Text="by Wild Dragon"
|
||||
Style="{StaticResource Wd.Text.Mono}"
|
||||
FontSize="11"
|
||||
Foreground="{DynamicResource Wd.Accent.Cyan}"/>
|
||||
</Border>
|
||||
</StackPanel>
|
||||
|
||||
<!-- Engine status pill, right-aligned -->
|
||||
<Border Grid.Column="1"
|
||||
Style="{StaticResource Pill.Online}"
|
||||
Style="{StaticResource Wd.Pill}"
|
||||
Background="{DynamicResource Wd.Status.LiveBg}"
|
||||
VerticalAlignment="Center">
|
||||
<StackPanel Orientation="Horizontal">
|
||||
<Ellipse Width="7" Height="7"
|
||||
Fill="{DynamicResource Status.Good}"
|
||||
Fill="{DynamicResource Wd.Status.Live}"
|
||||
VerticalAlignment="Center"/>
|
||||
<TextBlock Text="{Binding StatusText}"
|
||||
Style="{StaticResource Text.Body}"
|
||||
Style="{StaticResource Wd.Text.Body}"
|
||||
FontSize="12"
|
||||
Foreground="{DynamicResource Text.Primary}"
|
||||
Margin="8,0,0,0"
|
||||
VerticalAlignment="Center"/>
|
||||
</StackPanel>
|
||||
|
|
@ -87,158 +186,36 @@
|
|||
</Grid>
|
||||
</Border>
|
||||
|
||||
<!-- ════════ Footer / status bar ════════ -->
|
||||
<!-- Footer -->
|
||||
<Border DockPanel.Dock="Bottom"
|
||||
Background="{DynamicResource Stone.Canvas}"
|
||||
BorderBrush="{DynamicResource Stone.Border}"
|
||||
BorderBrush="{DynamicResource Wd.Border}"
|
||||
BorderThickness="0,1,0,0"
|
||||
Padding="24,10">
|
||||
Padding="32,10">
|
||||
<Grid>
|
||||
<Grid.ColumnDefinitions>
|
||||
<ColumnDefinition Width="Auto"/>
|
||||
<ColumnDefinition Width="*"/>
|
||||
<ColumnDefinition Width="Auto"/>
|
||||
</Grid.ColumnDefinitions>
|
||||
<TextBlock Text="{Binding StatusText}"
|
||||
Style="{StaticResource Text.Mono}"
|
||||
Foreground="{DynamicResource Text.Tertiary}"
|
||||
<TextBlock Text="WOOGLIN"
|
||||
Style="{StaticResource Wd.Text.Mono}"
|
||||
Foreground="{DynamicResource Wd.Text.Tertiary}"
|
||||
VerticalAlignment="Center"/>
|
||||
<TextBlock Grid.Column="1"
|
||||
Text="Wild Dragon LLC · 1.0.0-alpha"
|
||||
Style="{StaticResource Text.Mono}"
|
||||
Foreground="{DynamicResource Text.Tertiary}"
|
||||
Text="{Binding StatusText}"
|
||||
Style="{StaticResource Wd.Text.Mono}"
|
||||
Foreground="{DynamicResource Wd.Text.Tertiary}"
|
||||
HorizontalAlignment="Center"
|
||||
VerticalAlignment="Center"/>
|
||||
<TextBlock Grid.Column="2"
|
||||
Text="wilddragon.net · 1.0.0-alpha"
|
||||
Style="{StaticResource Wd.Text.Mono}"
|
||||
Foreground="{DynamicResource Wd.Text.Tertiary}"
|
||||
VerticalAlignment="Center"/>
|
||||
</Grid>
|
||||
</Border>
|
||||
|
||||
<!-- ════════ Settings panel (right) ════════ -->
|
||||
<Border DockPanel.Dock="Right"
|
||||
Width="360"
|
||||
Background="{DynamicResource Stone.Surface}"
|
||||
BorderBrush="{DynamicResource Stone.Border}"
|
||||
BorderThickness="1,0,0,0">
|
||||
<ScrollViewer VerticalScrollBarVisibility="Auto" Padding="0">
|
||||
<StackPanel Margin="24,24,24,32">
|
||||
|
||||
<TextBlock Text="Settings"
|
||||
Style="{StaticResource Text.Heading}"
|
||||
FontSize="16"
|
||||
Margin="0,0,0,20"/>
|
||||
|
||||
<!-- · · Output Format · · -->
|
||||
<TextBlock Text="OUTPUT FORMAT" Style="{StaticResource Text.Caption}"/>
|
||||
|
||||
<TextBlock Text="Target Framerate"
|
||||
Style="{StaticResource Text.Body}"
|
||||
Foreground="{DynamicResource Text.Secondary}"
|
||||
Margin="0,8,0,4"/>
|
||||
<ComboBox ItemsSource="{Binding Settings.AvailableFramerates}"
|
||||
SelectedItem="{Binding Settings.Framerate}">
|
||||
<ComboBox.ItemTemplate>
|
||||
<DataTemplate>
|
||||
<TextBlock Text="{Binding Converter={StaticResource EnumDesc}}"/>
|
||||
</DataTemplate>
|
||||
</ComboBox.ItemTemplate>
|
||||
</ComboBox>
|
||||
|
||||
<TextBlock Text="Target Resolution"
|
||||
Style="{StaticResource Text.Body}"
|
||||
Foreground="{DynamicResource Text.Secondary}"
|
||||
Margin="0,12,0,4"/>
|
||||
<ComboBox ItemsSource="{Binding Settings.AvailableResolutions}"
|
||||
SelectedItem="{Binding Settings.Resolution}">
|
||||
<ComboBox.ItemTemplate>
|
||||
<DataTemplate>
|
||||
<TextBlock Text="{Binding Converter={StaticResource EnumDesc}}"/>
|
||||
</DataTemplate>
|
||||
</ComboBox.ItemTemplate>
|
||||
</ComboBox>
|
||||
|
||||
<TextBlock Text="Aspect Mode"
|
||||
Style="{StaticResource Text.Body}"
|
||||
Foreground="{DynamicResource Text.Secondary}"
|
||||
Margin="0,12,0,4"/>
|
||||
<ComboBox ItemsSource="{Binding Settings.AvailableAspectModes}"
|
||||
SelectedItem="{Binding Settings.Aspect}">
|
||||
<ComboBox.ItemTemplate>
|
||||
<DataTemplate>
|
||||
<TextBlock Text="{Binding Converter={StaticResource EnumDesc}}"/>
|
||||
</DataTemplate>
|
||||
</ComboBox.ItemTemplate>
|
||||
</ComboBox>
|
||||
|
||||
<TextBlock Text="Audio Mode"
|
||||
Style="{StaticResource Text.Body}"
|
||||
Foreground="{DynamicResource Text.Secondary}"
|
||||
Margin="0,12,0,4"/>
|
||||
<ComboBox ItemsSource="{Binding Settings.AvailableAudioModes}"
|
||||
SelectedItem="{Binding Settings.Audio}">
|
||||
<ComboBox.ItemTemplate>
|
||||
<DataTemplate>
|
||||
<TextBlock Text="{Binding Converter={StaticResource EnumDesc}}"/>
|
||||
</DataTemplate>
|
||||
</ComboBox.ItemTemplate>
|
||||
</ComboBox>
|
||||
|
||||
<!-- · · NDI Network · · -->
|
||||
<TextBlock Text="NDI NETWORK"
|
||||
Style="{StaticResource Text.Caption}"
|
||||
Margin="0,28,0,0"/>
|
||||
|
||||
<TextBlock Text="Discovery group"
|
||||
Style="{StaticResource Text.Body}"
|
||||
Foreground="{DynamicResource Text.Secondary}"
|
||||
Margin="0,8,0,4"/>
|
||||
<TextBox Text="{Binding Settings.DiscoveryGroups, UpdateSourceTrigger=PropertyChanged}"/>
|
||||
<TextBlock Text="Receive sources from this group. Empty = Public."
|
||||
Style="{StaticResource Text.Body}"
|
||||
FontSize="11"
|
||||
Foreground="{DynamicResource Text.Tertiary}"
|
||||
Margin="0,4,0,0"/>
|
||||
|
||||
<TextBlock Text="Output group"
|
||||
Style="{StaticResource Text.Body}"
|
||||
Foreground="{DynamicResource Text.Secondary}"
|
||||
Margin="0,12,0,4"/>
|
||||
<TextBox Text="{Binding Settings.OutputGroups, UpdateSourceTrigger=PropertyChanged}"/>
|
||||
<TextBlock Text="Broadcast TeamsISO outputs on this group. Empty = Public."
|
||||
Style="{StaticResource Text.Body}"
|
||||
FontSize="11"
|
||||
Foreground="{DynamicResource Text.Tertiary}"
|
||||
Margin="0,4,0,0"/>
|
||||
|
||||
<Border Background="{DynamicResource Stone.SurfaceElevated}"
|
||||
BorderBrush="{DynamicResource Stone.Border}"
|
||||
BorderThickness="1"
|
||||
CornerRadius="{StaticResource Radius.M}"
|
||||
Padding="12,10"
|
||||
Margin="0,12,0,0">
|
||||
<TextBlock Style="{StaticResource Text.Body}"
|
||||
FontSize="11"
|
||||
Foreground="{DynamicResource Text.Secondary}"
|
||||
TextWrapping="Wrap"
|
||||
Text="Group changes apply on next launch — running pipelines aren't restarted to avoid orphaning your live ISOs."/>
|
||||
</Border>
|
||||
|
||||
<!-- · · Display · · -->
|
||||
<TextBlock Text="DISPLAY"
|
||||
Style="{StaticResource Text.Caption}"
|
||||
Margin="0,28,0,0"/>
|
||||
|
||||
<CheckBox Content="Hide my self-preview from participants"
|
||||
IsChecked="{Binding Settings.HideLocalSelf}"
|
||||
Margin="0,8,0,0"/>
|
||||
|
||||
<Button Style="{StaticResource Button.Primary}"
|
||||
Content="Apply Changes"
|
||||
Command="{Binding Settings.ApplyCommand}"
|
||||
HorizontalAlignment="Stretch"
|
||||
Margin="0,28,0,0"
|
||||
Padding="0,10"/>
|
||||
</StackPanel>
|
||||
</ScrollViewer>
|
||||
</Border>
|
||||
|
||||
<!-- ════════ Main content: participants ════════ -->
|
||||
<!-- Body -->
|
||||
<Grid Margin="32,28,32,28">
|
||||
<Grid.RowDefinitions>
|
||||
<RowDefinition Height="Auto"/>
|
||||
|
|
@ -246,62 +223,50 @@
|
|||
<RowDefinition Height="*"/>
|
||||
</Grid.RowDefinitions>
|
||||
|
||||
<!-- Section header with count -->
|
||||
<!-- Section header -->
|
||||
<StackPanel Grid.Row="0" Orientation="Horizontal" VerticalAlignment="Center">
|
||||
<TextBlock Text="Participants"
|
||||
Style="{StaticResource Text.Heading}"
|
||||
Style="{StaticResource Wd.Text.Heading}"
|
||||
FontSize="18"/>
|
||||
<Border Background="{DynamicResource Stone.Surface}"
|
||||
BorderBrush="{DynamicResource Stone.Border}"
|
||||
BorderThickness="1"
|
||||
CornerRadius="999"
|
||||
Padding="9,2"
|
||||
<Border Style="{StaticResource Wd.Pill}"
|
||||
Margin="12,0,0,0"
|
||||
VerticalAlignment="Center">
|
||||
<TextBlock Text="{Binding Participants.Count}"
|
||||
Style="{StaticResource Text.Mono}"
|
||||
Foreground="{DynamicResource Text.Secondary}"
|
||||
Style="{StaticResource Wd.Text.Mono}"
|
||||
FontSize="11"/>
|
||||
</Border>
|
||||
</StackPanel>
|
||||
|
||||
<TextBlock Grid.Row="1"
|
||||
Text="Toggle the ISO column to spin up an isolated, normalized NDI output for any participant."
|
||||
Style="{StaticResource Text.Body}"
|
||||
Foreground="{DynamicResource Text.Tertiary}"
|
||||
Text="Toggle a participant's ISO to spin up an isolated, normalized NDI output."
|
||||
Style="{StaticResource Wd.Text.Subtle}"
|
||||
Foreground="{DynamicResource Wd.Text.Tertiary}"
|
||||
Margin="0,6,0,18"/>
|
||||
|
||||
<!-- Participants table inside a card -->
|
||||
<!-- Participants card -->
|
||||
<Border Grid.Row="2"
|
||||
Style="{StaticResource Card}"
|
||||
Style="{StaticResource Wd.Card}"
|
||||
Padding="0">
|
||||
<Grid>
|
||||
<Grid.RowDefinitions>
|
||||
<RowDefinition Height="Auto"/>
|
||||
<RowDefinition Height="*"/>
|
||||
</Grid.RowDefinitions>
|
||||
|
||||
<DataGrid Grid.Row="1"
|
||||
ItemsSource="{Binding Participants}"
|
||||
Margin="4,4,4,4">
|
||||
<DataGrid ItemsSource="{Binding Participants}"
|
||||
Margin="6,4,6,4">
|
||||
<DataGrid.Columns>
|
||||
<DataGridTemplateColumn Header="Display Name" Width="2*">
|
||||
<DataGridTemplateColumn.CellTemplate>
|
||||
<DataTemplate>
|
||||
<StackPanel Orientation="Horizontal" VerticalAlignment="Center">
|
||||
<Border Width="28" Height="28"
|
||||
CornerRadius="14"
|
||||
Background="{DynamicResource Accent.OrangeMuted}">
|
||||
<TextBlock Text="●"
|
||||
FontSize="9"
|
||||
Foreground="{DynamicResource Accent.Orange}"
|
||||
<Border Style="{StaticResource Wd.Avatar}">
|
||||
<TextBlock Text="{Binding DisplayName, Converter={StaticResource Initials}}"
|
||||
Foreground="{DynamicResource Wd.Accent.Cyan}"
|
||||
FontFamily="{StaticResource Wd.Font.Sans}"
|
||||
FontWeight="SemiBold"
|
||||
FontSize="11"
|
||||
HorizontalAlignment="Center"
|
||||
VerticalAlignment="Center"/>
|
||||
</Border>
|
||||
<TextBlock Text="{Binding DisplayName}"
|
||||
Style="{StaticResource Text.Body}"
|
||||
Style="{StaticResource Wd.Text.Body}"
|
||||
FontWeight="Medium"
|
||||
Margin="12,0,0,0"
|
||||
Margin="14,0,0,0"
|
||||
VerticalAlignment="Center"/>
|
||||
</StackPanel>
|
||||
</DataTemplate>
|
||||
|
|
@ -312,7 +277,7 @@
|
|||
<DataGridTemplateColumn.CellTemplate>
|
||||
<DataTemplate>
|
||||
<TextBlock Text="{Binding SourceMachine}"
|
||||
Style="{StaticResource Text.Mono}"
|
||||
Style="{StaticResource Wd.Text.Mono}"
|
||||
VerticalAlignment="Center"/>
|
||||
</DataTemplate>
|
||||
</DataGridTemplateColumn.CellTemplate>
|
||||
|
|
@ -322,28 +287,28 @@
|
|||
<DataGridTemplateColumn.CellTemplate>
|
||||
<DataTemplate>
|
||||
<TextBox Text="{Binding CustomName, UpdateSourceTrigger=PropertyChanged}"
|
||||
Padding="8,6"
|
||||
Padding="10,7"
|
||||
Margin="0,0,12,0"
|
||||
VerticalAlignment="Center"/>
|
||||
</DataTemplate>
|
||||
</DataGridTemplateColumn.CellTemplate>
|
||||
</DataGridTemplateColumn>
|
||||
|
||||
<DataGridTemplateColumn Header="ISO" Width="120">
|
||||
<DataGridTemplateColumn Header="ISO" Width="130">
|
||||
<DataGridTemplateColumn.CellTemplate>
|
||||
<DataTemplate>
|
||||
<Button Command="{Binding ToggleIsoCommand}"
|
||||
Margin="0,0,12,0">
|
||||
<Button.Style>
|
||||
<Style TargetType="Button" BasedOn="{StaticResource Button.IsoToggle}">
|
||||
<Style TargetType="Button" BasedOn="{StaticResource Wd.Button.IsoToggle}">
|
||||
<Setter Property="Content" Value="Enable"/>
|
||||
<Setter Property="Foreground" Value="{DynamicResource Text.Secondary}"/>
|
||||
<Setter Property="Foreground" Value="{DynamicResource Wd.Text.Secondary}"/>
|
||||
<Style.Triggers>
|
||||
<DataTrigger Binding="{Binding IsEnabled}" Value="True">
|
||||
<Setter Property="Content" Value="● Live"/>
|
||||
<Setter Property="Background" Value="#1F3A1F"/>
|
||||
<Setter Property="BorderBrush" Value="{DynamicResource Status.Good}"/>
|
||||
<Setter Property="Foreground" Value="{DynamicResource Status.Good}"/>
|
||||
<Setter Property="Content" Value="● LIVE"/>
|
||||
<Setter Property="Background" Value="{DynamicResource Wd.Accent.CyanMuted}"/>
|
||||
<Setter Property="BorderBrush" Value="{DynamicResource Wd.Accent.Cyan}"/>
|
||||
<Setter Property="Foreground" Value="{DynamicResource Wd.Accent.Cyan}"/>
|
||||
</DataTrigger>
|
||||
<DataTrigger Binding="{Binding IsProcessing}" Value="True">
|
||||
<Setter Property="Content" Value="…"/>
|
||||
|
|
@ -358,9 +323,136 @@
|
|||
</DataGridTemplateColumn>
|
||||
</DataGrid.Columns>
|
||||
</DataGrid>
|
||||
</Grid>
|
||||
</Border>
|
||||
</Grid>
|
||||
|
||||
</DockPanel>
|
||||
|
||||
<!-- ════════════════════════════════════════════════════════════════
|
||||
SETTINGS PANEL (right)
|
||||
════════════════════════════════════════════════════════════════ -->
|
||||
<Border Grid.Column="2"
|
||||
Background="{DynamicResource Wd.Surface}"
|
||||
BorderBrush="{DynamicResource Wd.Border}"
|
||||
BorderThickness="1,0,0,0">
|
||||
<ScrollViewer VerticalScrollBarVisibility="Auto">
|
||||
<StackPanel Margin="24,28,24,32">
|
||||
|
||||
<TextBlock Text="Settings"
|
||||
Style="{StaticResource Wd.Text.Heading}"
|
||||
FontSize="16"
|
||||
Margin="0,0,0,4"/>
|
||||
<TextBlock Text="Per-meeting global processing"
|
||||
Style="{StaticResource Wd.Text.Subtle}"
|
||||
Foreground="{DynamicResource Wd.Text.Tertiary}"
|
||||
Margin="0,0,0,22"/>
|
||||
|
||||
<!-- Output Format -->
|
||||
<TextBlock Text="OUTPUT FORMAT" Style="{StaticResource Wd.Text.Caption}"/>
|
||||
|
||||
<TextBlock Text="Target Framerate"
|
||||
Style="{StaticResource Wd.Text.Subtle}"
|
||||
Margin="0,10,0,4"/>
|
||||
<ComboBox ItemsSource="{Binding Settings.AvailableFramerates}"
|
||||
SelectedItem="{Binding Settings.Framerate}">
|
||||
<ComboBox.ItemTemplate>
|
||||
<DataTemplate>
|
||||
<TextBlock Text="{Binding Converter={StaticResource EnumDesc}}"/>
|
||||
</DataTemplate>
|
||||
</ComboBox.ItemTemplate>
|
||||
</ComboBox>
|
||||
|
||||
<TextBlock Text="Target Resolution"
|
||||
Style="{StaticResource Wd.Text.Subtle}"
|
||||
Margin="0,12,0,4"/>
|
||||
<ComboBox ItemsSource="{Binding Settings.AvailableResolutions}"
|
||||
SelectedItem="{Binding Settings.Resolution}">
|
||||
<ComboBox.ItemTemplate>
|
||||
<DataTemplate>
|
||||
<TextBlock Text="{Binding Converter={StaticResource EnumDesc}}"/>
|
||||
</DataTemplate>
|
||||
</ComboBox.ItemTemplate>
|
||||
</ComboBox>
|
||||
|
||||
<TextBlock Text="Aspect Mode"
|
||||
Style="{StaticResource Wd.Text.Subtle}"
|
||||
Margin="0,12,0,4"/>
|
||||
<ComboBox ItemsSource="{Binding Settings.AvailableAspectModes}"
|
||||
SelectedItem="{Binding Settings.Aspect}">
|
||||
<ComboBox.ItemTemplate>
|
||||
<DataTemplate>
|
||||
<TextBlock Text="{Binding Converter={StaticResource EnumDesc}}"/>
|
||||
</DataTemplate>
|
||||
</ComboBox.ItemTemplate>
|
||||
</ComboBox>
|
||||
|
||||
<TextBlock Text="Audio Mode"
|
||||
Style="{StaticResource Wd.Text.Subtle}"
|
||||
Margin="0,12,0,4"/>
|
||||
<ComboBox ItemsSource="{Binding Settings.AvailableAudioModes}"
|
||||
SelectedItem="{Binding Settings.Audio}">
|
||||
<ComboBox.ItemTemplate>
|
||||
<DataTemplate>
|
||||
<TextBlock Text="{Binding Converter={StaticResource EnumDesc}}"/>
|
||||
</DataTemplate>
|
||||
</ComboBox.ItemTemplate>
|
||||
</ComboBox>
|
||||
|
||||
<!-- NDI Network -->
|
||||
<TextBlock Text="NDI NETWORK"
|
||||
Style="{StaticResource Wd.Text.Caption}"
|
||||
Margin="0,28,0,0"/>
|
||||
|
||||
<TextBlock Text="Discovery group"
|
||||
Style="{StaticResource Wd.Text.Subtle}"
|
||||
Margin="0,10,0,4"/>
|
||||
<TextBox Text="{Binding Settings.DiscoveryGroups, UpdateSourceTrigger=PropertyChanged}"/>
|
||||
<TextBlock Text="Receive sources from this group. Empty = Public."
|
||||
Style="{StaticResource Wd.Text.Body}"
|
||||
FontSize="11"
|
||||
Foreground="{DynamicResource Wd.Text.Tertiary}"
|
||||
Margin="0,4,0,0"/>
|
||||
|
||||
<TextBlock Text="Output group"
|
||||
Style="{StaticResource Wd.Text.Subtle}"
|
||||
Margin="0,12,0,4"/>
|
||||
<TextBox Text="{Binding Settings.OutputGroups, UpdateSourceTrigger=PropertyChanged}"/>
|
||||
<TextBlock Text="Broadcast TeamsISO outputs on this group. Empty = Public."
|
||||
Style="{StaticResource Wd.Text.Body}"
|
||||
FontSize="11"
|
||||
Foreground="{DynamicResource Wd.Text.Tertiary}"
|
||||
Margin="0,4,0,0"/>
|
||||
|
||||
<Border Background="{DynamicResource Wd.SurfaceElevated}"
|
||||
BorderBrush="{DynamicResource Wd.Border}"
|
||||
BorderThickness="1"
|
||||
CornerRadius="{StaticResource Radius.M}"
|
||||
Padding="12,10"
|
||||
Margin="0,12,0,0">
|
||||
<TextBlock Style="{StaticResource Wd.Text.Body}"
|
||||
FontSize="11"
|
||||
Foreground="{DynamicResource Wd.Text.Secondary}"
|
||||
TextWrapping="Wrap"
|
||||
Text="Group changes apply on next launch — running pipelines aren't restarted to avoid orphaning live ISOs."/>
|
||||
</Border>
|
||||
|
||||
<!-- Display -->
|
||||
<TextBlock Text="DISPLAY"
|
||||
Style="{StaticResource Wd.Text.Caption}"
|
||||
Margin="0,28,0,0"/>
|
||||
|
||||
<CheckBox Content="Hide my self-preview from participants"
|
||||
IsChecked="{Binding Settings.HideLocalSelf}"
|
||||
Margin="0,10,0,0"/>
|
||||
|
||||
<Button Style="{StaticResource Wd.Button.Primary}"
|
||||
Content="Apply Changes"
|
||||
Command="{Binding Settings.ApplyCommand}"
|
||||
HorizontalAlignment="Stretch"
|
||||
Margin="0,28,0,0"
|
||||
Padding="0,11"/>
|
||||
</StackPanel>
|
||||
</ScrollViewer>
|
||||
</Border>
|
||||
|
||||
</Grid>
|
||||
</Window>
|
||||
|
|
|
|||
|
|
@ -1,491 +0,0 @@
|
|||
<ResourceDictionary
|
||||
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
|
||||
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
|
||||
xmlns:sys="clr-namespace:System;assembly=mscorlib">
|
||||
|
||||
<!--
|
||||
TeamsISO design tokens — adapted from the "interface-design" Stone aesthetic:
|
||||
warm neutrals, borders-only depth (no shadows), accent orange, 8px spacing grid,
|
||||
tight typography. Manrope is the reference font; we fall back to Segoe UI
|
||||
Variable Display which ships with Windows 11 and reads similarly.
|
||||
-->
|
||||
|
||||
<!-- ═════ Spacing (8px grid) ═════ -->
|
||||
<sys:Double x:Key="Spacing.XS">4</sys:Double>
|
||||
<sys:Double x:Key="Spacing.S">8</sys:Double>
|
||||
<sys:Double x:Key="Spacing.M">12</sys:Double>
|
||||
<sys:Double x:Key="Spacing.L">16</sys:Double>
|
||||
<sys:Double x:Key="Spacing.XL">24</sys:Double>
|
||||
<sys:Double x:Key="Spacing.XXL">32</sys:Double>
|
||||
|
||||
<!-- ═════ Radii ═════ -->
|
||||
<CornerRadius x:Key="Radius.S">4</CornerRadius>
|
||||
<CornerRadius x:Key="Radius.M">6</CornerRadius>
|
||||
<CornerRadius x:Key="Radius.L">8</CornerRadius>
|
||||
|
||||
<!-- ═════ Stone palette (dark theme — primary look) ═════ -->
|
||||
<SolidColorBrush x:Key="Stone.Canvas" Color="#1B1916"/>
|
||||
<SolidColorBrush x:Key="Stone.Surface" Color="#26221F"/>
|
||||
<SolidColorBrush x:Key="Stone.SurfaceElevated" Color="#2D2926"/>
|
||||
<SolidColorBrush x:Key="Stone.SurfaceHover" Color="#34302D"/>
|
||||
<SolidColorBrush x:Key="Stone.Border" Color="#3A3633"/>
|
||||
<SolidColorBrush x:Key="Stone.BorderStrong" Color="#4D4742"/>
|
||||
|
||||
<SolidColorBrush x:Key="Text.Primary" Color="#F5F3F0"/>
|
||||
<SolidColorBrush x:Key="Text.Secondary" Color="#B5AFA8"/>
|
||||
<SolidColorBrush x:Key="Text.Tertiary" Color="#857F77"/>
|
||||
<SolidColorBrush x:Key="Text.Disabled" Color="#5C5751"/>
|
||||
|
||||
<SolidColorBrush x:Key="Accent.Orange" Color="#EA580C"/>
|
||||
<SolidColorBrush x:Key="Accent.OrangeHover" Color="#F97316"/>
|
||||
<SolidColorBrush x:Key="Accent.OrangeMuted" Color="#7A2F0E"/>
|
||||
|
||||
<SolidColorBrush x:Key="Status.Good" Color="#84CC16"/>
|
||||
<SolidColorBrush x:Key="Status.Warn" Color="#F59E0B"/>
|
||||
<SolidColorBrush x:Key="Status.Bad" Color="#DC2626"/>
|
||||
<SolidColorBrush x:Key="Status.Bad.Surface" Color="#3F1414"/>
|
||||
|
||||
<!-- ═════ Typography ═════ -->
|
||||
<FontFamily x:Key="Font.Sans">Segoe UI Variable Display, Segoe UI, Manrope, sans-serif</FontFamily>
|
||||
<FontFamily x:Key="Font.Mono">Cascadia Mono, Consolas, monospace</FontFamily>
|
||||
|
||||
<!-- Display: section headers, hero stats. -->
|
||||
<Style x:Key="Text.Display" TargetType="TextBlock">
|
||||
<Setter Property="FontFamily" Value="{StaticResource Font.Sans}"/>
|
||||
<Setter Property="FontSize" Value="22"/>
|
||||
<Setter Property="FontWeight" Value="SemiBold"/>
|
||||
<Setter Property="Foreground" Value="{StaticResource Text.Primary}"/>
|
||||
<Setter Property="TextOptions.TextFormattingMode" Value="Ideal"/>
|
||||
<Setter Property="TextOptions.TextRenderingMode" Value="ClearType"/>
|
||||
</Style>
|
||||
|
||||
<Style x:Key="Text.Heading" TargetType="TextBlock">
|
||||
<Setter Property="FontFamily" Value="{StaticResource Font.Sans}"/>
|
||||
<Setter Property="FontSize" Value="14"/>
|
||||
<Setter Property="FontWeight" Value="SemiBold"/>
|
||||
<Setter Property="Foreground" Value="{StaticResource Text.Primary}"/>
|
||||
<Setter Property="TextOptions.TextFormattingMode" Value="Ideal"/>
|
||||
</Style>
|
||||
|
||||
<Style x:Key="Text.Body" TargetType="TextBlock">
|
||||
<Setter Property="FontFamily" Value="{StaticResource Font.Sans}"/>
|
||||
<Setter Property="FontSize" Value="13"/>
|
||||
<Setter Property="FontWeight" Value="Normal"/>
|
||||
<Setter Property="Foreground" Value="{StaticResource Text.Primary}"/>
|
||||
<Setter Property="TextOptions.TextFormattingMode" Value="Ideal"/>
|
||||
</Style>
|
||||
|
||||
<!-- Caption: labels above inputs, secondary metadata. -->
|
||||
<Style x:Key="Text.Caption" TargetType="TextBlock">
|
||||
<Setter Property="FontFamily" Value="{StaticResource Font.Sans}"/>
|
||||
<Setter Property="FontSize" Value="11"/>
|
||||
<Setter Property="FontWeight" Value="Medium"/>
|
||||
<Setter Property="Foreground" Value="{StaticResource Text.Secondary}"/>
|
||||
<Setter Property="TextOptions.TextFormattingMode" Value="Ideal"/>
|
||||
<Setter Property="Typography.Capitals" Value="AllSmallCaps"/>
|
||||
<Setter Property="Margin" Value="0,0,0,4"/>
|
||||
</Style>
|
||||
|
||||
<!-- Mono: machine names, hex IDs, timecodes. -->
|
||||
<Style x:Key="Text.Mono" TargetType="TextBlock">
|
||||
<Setter Property="FontFamily" Value="{StaticResource Font.Mono}"/>
|
||||
<Setter Property="FontSize" Value="12"/>
|
||||
<Setter Property="Foreground" Value="{StaticResource Text.Secondary}"/>
|
||||
</Style>
|
||||
|
||||
<!-- ═════ TextBlock default ═════ -->
|
||||
<Style TargetType="TextBlock" BasedOn="{StaticResource Text.Body}"/>
|
||||
|
||||
<!-- ═════ Button: ghost/secondary (default) ═════ -->
|
||||
<Style x:Key="Button.Ghost" TargetType="Button">
|
||||
<Setter Property="FontFamily" Value="{StaticResource Font.Sans}"/>
|
||||
<Setter Property="FontSize" Value="12"/>
|
||||
<Setter Property="FontWeight" Value="Medium"/>
|
||||
<Setter Property="Foreground" Value="{StaticResource Text.Primary}"/>
|
||||
<Setter Property="Background" Value="Transparent"/>
|
||||
<Setter Property="BorderBrush" Value="{StaticResource Stone.Border}"/>
|
||||
<Setter Property="BorderThickness" Value="1"/>
|
||||
<Setter Property="Padding" Value="12,7"/>
|
||||
<Setter Property="Cursor" Value="Hand"/>
|
||||
<Setter Property="HorizontalContentAlignment" Value="Center"/>
|
||||
<Setter Property="VerticalContentAlignment" Value="Center"/>
|
||||
<Setter Property="Template">
|
||||
<Setter.Value>
|
||||
<ControlTemplate TargetType="Button">
|
||||
<Border x:Name="Bd"
|
||||
Background="{TemplateBinding Background}"
|
||||
BorderBrush="{TemplateBinding BorderBrush}"
|
||||
BorderThickness="{TemplateBinding BorderThickness}"
|
||||
CornerRadius="{StaticResource Radius.M}"
|
||||
SnapsToDevicePixels="True">
|
||||
<ContentPresenter HorizontalAlignment="{TemplateBinding HorizontalContentAlignment}"
|
||||
VerticalAlignment="{TemplateBinding VerticalContentAlignment}"
|
||||
Margin="{TemplateBinding Padding}"/>
|
||||
</Border>
|
||||
<ControlTemplate.Triggers>
|
||||
<Trigger Property="IsMouseOver" Value="True">
|
||||
<Setter TargetName="Bd" Property="Background" Value="{StaticResource Stone.SurfaceHover}"/>
|
||||
<Setter TargetName="Bd" Property="BorderBrush" Value="{StaticResource Stone.BorderStrong}"/>
|
||||
</Trigger>
|
||||
<Trigger Property="IsPressed" Value="True">
|
||||
<Setter TargetName="Bd" Property="Background" Value="{StaticResource Stone.SurfaceElevated}"/>
|
||||
</Trigger>
|
||||
<Trigger Property="IsEnabled" Value="False">
|
||||
<Setter Property="Foreground" Value="{StaticResource Text.Disabled}"/>
|
||||
<Setter TargetName="Bd" Property="Opacity" Value="0.5"/>
|
||||
</Trigger>
|
||||
</ControlTemplate.Triggers>
|
||||
</ControlTemplate>
|
||||
</Setter.Value>
|
||||
</Setter>
|
||||
</Style>
|
||||
|
||||
<!-- ═════ Button: primary (orange accent) ═════ -->
|
||||
<Style x:Key="Button.Primary" TargetType="Button" BasedOn="{StaticResource Button.Ghost}">
|
||||
<Setter Property="Background" Value="{StaticResource Accent.Orange}"/>
|
||||
<Setter Property="BorderBrush" Value="{StaticResource Accent.Orange}"/>
|
||||
<Setter Property="Foreground" Value="#FFFFFF"/>
|
||||
<Setter Property="FontWeight" Value="SemiBold"/>
|
||||
<Style.Triggers>
|
||||
<Trigger Property="IsMouseOver" Value="True">
|
||||
<Setter Property="Background" Value="{StaticResource Accent.OrangeHover}"/>
|
||||
<Setter Property="BorderBrush" Value="{StaticResource Accent.OrangeHover}"/>
|
||||
</Trigger>
|
||||
</Style.Triggers>
|
||||
</Style>
|
||||
|
||||
<!-- ═════ Button: ISO toggle (pill-shaped, status-coded) ═════ -->
|
||||
<Style x:Key="Button.IsoToggle" TargetType="Button">
|
||||
<Setter Property="FontFamily" Value="{StaticResource Font.Sans}"/>
|
||||
<Setter Property="FontSize" Value="11"/>
|
||||
<Setter Property="FontWeight" Value="SemiBold"/>
|
||||
<Setter Property="Foreground" Value="{StaticResource Text.Primary}"/>
|
||||
<Setter Property="Background" Value="Transparent"/>
|
||||
<Setter Property="BorderBrush" Value="{StaticResource Stone.BorderStrong}"/>
|
||||
<Setter Property="BorderThickness" Value="1"/>
|
||||
<Setter Property="Padding" Value="10,5"/>
|
||||
<Setter Property="Cursor" Value="Hand"/>
|
||||
<Setter Property="HorizontalContentAlignment" Value="Center"/>
|
||||
<Setter Property="MinWidth" Value="76"/>
|
||||
<Setter Property="Template">
|
||||
<Setter.Value>
|
||||
<ControlTemplate TargetType="Button">
|
||||
<Border x:Name="Bd"
|
||||
Background="{TemplateBinding Background}"
|
||||
BorderBrush="{TemplateBinding BorderBrush}"
|
||||
BorderThickness="{TemplateBinding BorderThickness}"
|
||||
CornerRadius="999"
|
||||
SnapsToDevicePixels="True">
|
||||
<ContentPresenter HorizontalAlignment="Center"
|
||||
VerticalAlignment="Center"
|
||||
Margin="{TemplateBinding Padding}"/>
|
||||
</Border>
|
||||
<ControlTemplate.Triggers>
|
||||
<Trigger Property="IsMouseOver" Value="True">
|
||||
<Setter TargetName="Bd" Property="Background" Value="{StaticResource Stone.SurfaceHover}"/>
|
||||
</Trigger>
|
||||
</ControlTemplate.Triggers>
|
||||
</ControlTemplate>
|
||||
</Setter.Value>
|
||||
</Setter>
|
||||
</Style>
|
||||
|
||||
<!-- ═════ TextBox ═════ -->
|
||||
<Style x:Key="TextBox.Default" TargetType="TextBox">
|
||||
<Setter Property="FontFamily" Value="{StaticResource Font.Sans}"/>
|
||||
<Setter Property="FontSize" Value="13"/>
|
||||
<Setter Property="Foreground" Value="{StaticResource Text.Primary}"/>
|
||||
<Setter Property="Background" Value="{StaticResource Stone.Surface}"/>
|
||||
<Setter Property="CaretBrush" Value="{StaticResource Accent.Orange}"/>
|
||||
<Setter Property="SelectionBrush" Value="{StaticResource Accent.OrangeMuted}"/>
|
||||
<Setter Property="BorderBrush" Value="{StaticResource Stone.Border}"/>
|
||||
<Setter Property="BorderThickness" Value="1"/>
|
||||
<Setter Property="Padding" Value="10,7"/>
|
||||
<Setter Property="Template">
|
||||
<Setter.Value>
|
||||
<ControlTemplate TargetType="TextBox">
|
||||
<Border x:Name="Bd"
|
||||
Background="{TemplateBinding Background}"
|
||||
BorderBrush="{TemplateBinding BorderBrush}"
|
||||
BorderThickness="{TemplateBinding BorderThickness}"
|
||||
CornerRadius="{StaticResource Radius.M}"
|
||||
SnapsToDevicePixels="True">
|
||||
<ScrollViewer x:Name="PART_ContentHost"
|
||||
Margin="{TemplateBinding Padding}"
|
||||
VerticalAlignment="Center"
|
||||
Focusable="False"/>
|
||||
</Border>
|
||||
<ControlTemplate.Triggers>
|
||||
<Trigger Property="IsKeyboardFocused" Value="True">
|
||||
<Setter TargetName="Bd" Property="BorderBrush" Value="{StaticResource Accent.Orange}"/>
|
||||
</Trigger>
|
||||
<Trigger Property="IsMouseOver" Value="True">
|
||||
<Setter TargetName="Bd" Property="BorderBrush" Value="{StaticResource Stone.BorderStrong}"/>
|
||||
</Trigger>
|
||||
</ControlTemplate.Triggers>
|
||||
</ControlTemplate>
|
||||
</Setter.Value>
|
||||
</Setter>
|
||||
</Style>
|
||||
<Style TargetType="TextBox" BasedOn="{StaticResource TextBox.Default}"/>
|
||||
|
||||
<!-- ═════ ComboBox ═════ -->
|
||||
<Style x:Key="ComboBoxToggleStripped" TargetType="ToggleButton">
|
||||
<Setter Property="OverridesDefaultStyle" Value="True"/>
|
||||
<Setter Property="IsTabStop" Value="False"/>
|
||||
<Setter Property="Focusable" Value="False"/>
|
||||
<Setter Property="ClickMode" Value="Press"/>
|
||||
<Setter Property="Background" Value="Transparent"/>
|
||||
<Setter Property="Template">
|
||||
<Setter.Value>
|
||||
<ControlTemplate TargetType="ToggleButton">
|
||||
<Grid>
|
||||
<Path x:Name="Arrow"
|
||||
Grid.Column="1"
|
||||
HorizontalAlignment="Right"
|
||||
VerticalAlignment="Center"
|
||||
Margin="0,0,12,0"
|
||||
Data="M 0,0 L 4,4 L 8,0 Z"
|
||||
Fill="{StaticResource Text.Secondary}"/>
|
||||
</Grid>
|
||||
</ControlTemplate>
|
||||
</Setter.Value>
|
||||
</Setter>
|
||||
</Style>
|
||||
|
||||
<Style x:Key="ComboBox.Default" TargetType="ComboBox">
|
||||
<Setter Property="FontFamily" Value="{StaticResource Font.Sans}"/>
|
||||
<Setter Property="FontSize" Value="13"/>
|
||||
<Setter Property="Foreground" Value="{StaticResource Text.Primary}"/>
|
||||
<Setter Property="Background" Value="{StaticResource Stone.Surface}"/>
|
||||
<Setter Property="BorderBrush" Value="{StaticResource Stone.Border}"/>
|
||||
<Setter Property="BorderThickness" Value="1"/>
|
||||
<Setter Property="Padding" Value="10,7"/>
|
||||
<Setter Property="HorizontalContentAlignment" Value="Stretch"/>
|
||||
<Setter Property="Template">
|
||||
<Setter.Value>
|
||||
<ControlTemplate TargetType="ComboBox">
|
||||
<Grid>
|
||||
<Border x:Name="Bd"
|
||||
Background="{TemplateBinding Background}"
|
||||
BorderBrush="{TemplateBinding BorderBrush}"
|
||||
BorderThickness="{TemplateBinding BorderThickness}"
|
||||
CornerRadius="{StaticResource Radius.M}"
|
||||
SnapsToDevicePixels="True"/>
|
||||
<ToggleButton Style="{StaticResource ComboBoxToggleStripped}"
|
||||
IsChecked="{Binding IsDropDownOpen,
|
||||
RelativeSource={RelativeSource TemplatedParent}, Mode=TwoWay}"/>
|
||||
<ContentPresenter Margin="{TemplateBinding Padding}"
|
||||
IsHitTestVisible="False"
|
||||
VerticalAlignment="Center"
|
||||
Content="{TemplateBinding SelectionBoxItem}"
|
||||
ContentTemplate="{TemplateBinding SelectionBoxItemTemplate}"/>
|
||||
<Popup x:Name="PART_Popup"
|
||||
IsOpen="{TemplateBinding IsDropDownOpen}"
|
||||
Placement="Bottom"
|
||||
AllowsTransparency="True"
|
||||
Focusable="False"
|
||||
PopupAnimation="None">
|
||||
<Border Background="{StaticResource Stone.SurfaceElevated}"
|
||||
BorderBrush="{StaticResource Stone.BorderStrong}"
|
||||
BorderThickness="1"
|
||||
CornerRadius="{StaticResource Radius.M}"
|
||||
MinWidth="{TemplateBinding ActualWidth}"
|
||||
MaxHeight="280"
|
||||
Margin="0,4,0,0">
|
||||
<ScrollViewer>
|
||||
<ItemsPresenter/>
|
||||
</ScrollViewer>
|
||||
</Border>
|
||||
</Popup>
|
||||
</Grid>
|
||||
<ControlTemplate.Triggers>
|
||||
<Trigger Property="IsMouseOver" Value="True">
|
||||
<Setter TargetName="Bd" Property="BorderBrush" Value="{StaticResource Stone.BorderStrong}"/>
|
||||
</Trigger>
|
||||
<Trigger Property="IsKeyboardFocusWithin" Value="True">
|
||||
<Setter TargetName="Bd" Property="BorderBrush" Value="{StaticResource Accent.Orange}"/>
|
||||
</Trigger>
|
||||
</ControlTemplate.Triggers>
|
||||
</ControlTemplate>
|
||||
</Setter.Value>
|
||||
</Setter>
|
||||
</Style>
|
||||
<Style TargetType="ComboBox" BasedOn="{StaticResource ComboBox.Default}"/>
|
||||
|
||||
<!-- ComboBoxItem -->
|
||||
<Style TargetType="ComboBoxItem">
|
||||
<Setter Property="Foreground" Value="{StaticResource Text.Primary}"/>
|
||||
<Setter Property="Padding" Value="10,7"/>
|
||||
<Setter Property="Template">
|
||||
<Setter.Value>
|
||||
<ControlTemplate TargetType="ComboBoxItem">
|
||||
<Border x:Name="Bd"
|
||||
Background="Transparent"
|
||||
CornerRadius="{StaticResource Radius.S}"
|
||||
Margin="4,2"
|
||||
Padding="{TemplateBinding Padding}"
|
||||
SnapsToDevicePixels="True">
|
||||
<ContentPresenter/>
|
||||
</Border>
|
||||
<ControlTemplate.Triggers>
|
||||
<Trigger Property="IsMouseOver" Value="True">
|
||||
<Setter TargetName="Bd" Property="Background" Value="{StaticResource Stone.SurfaceHover}"/>
|
||||
</Trigger>
|
||||
<Trigger Property="IsHighlighted" Value="True">
|
||||
<Setter TargetName="Bd" Property="Background" Value="{StaticResource Stone.SurfaceHover}"/>
|
||||
</Trigger>
|
||||
</ControlTemplate.Triggers>
|
||||
</ControlTemplate>
|
||||
</Setter.Value>
|
||||
</Setter>
|
||||
</Style>
|
||||
|
||||
<!-- ═════ CheckBox (custom, square+orange-tick when checked) ═════ -->
|
||||
<Style TargetType="CheckBox">
|
||||
<Setter Property="FontFamily" Value="{StaticResource Font.Sans}"/>
|
||||
<Setter Property="FontSize" Value="13"/>
|
||||
<Setter Property="Foreground" Value="{StaticResource Text.Primary}"/>
|
||||
<Setter Property="Cursor" Value="Hand"/>
|
||||
<Setter Property="Padding" Value="8,0,0,0"/>
|
||||
<Setter Property="Template">
|
||||
<Setter.Value>
|
||||
<ControlTemplate TargetType="CheckBox">
|
||||
<StackPanel Orientation="Horizontal">
|
||||
<Border x:Name="Box"
|
||||
Width="16" Height="16"
|
||||
BorderBrush="{StaticResource Stone.BorderStrong}"
|
||||
BorderThickness="1"
|
||||
Background="{StaticResource Stone.Surface}"
|
||||
CornerRadius="3"
|
||||
VerticalAlignment="Center">
|
||||
<Path x:Name="Tick"
|
||||
Data="M 3,8 L 6.5,11.5 L 13,4"
|
||||
Stroke="#FFFFFF" StrokeThickness="2"
|
||||
StrokeStartLineCap="Round"
|
||||
StrokeEndLineCap="Round"
|
||||
Visibility="Collapsed"/>
|
||||
</Border>
|
||||
<ContentPresenter Margin="{TemplateBinding Padding}"
|
||||
VerticalAlignment="Center"/>
|
||||
</StackPanel>
|
||||
<ControlTemplate.Triggers>
|
||||
<Trigger Property="IsChecked" Value="True">
|
||||
<Setter TargetName="Box" Property="Background" Value="{StaticResource Accent.Orange}"/>
|
||||
<Setter TargetName="Box" Property="BorderBrush" Value="{StaticResource Accent.Orange}"/>
|
||||
<Setter TargetName="Tick" Property="Visibility" Value="Visible"/>
|
||||
</Trigger>
|
||||
<Trigger Property="IsMouseOver" Value="True">
|
||||
<Setter TargetName="Box" Property="BorderBrush" Value="{StaticResource Accent.OrangeHover}"/>
|
||||
</Trigger>
|
||||
</ControlTemplate.Triggers>
|
||||
</ControlTemplate>
|
||||
</Setter.Value>
|
||||
</Setter>
|
||||
</Style>
|
||||
|
||||
<!-- ═════ Card ═════ -->
|
||||
<Style x:Key="Card" TargetType="Border">
|
||||
<Setter Property="Background" Value="{StaticResource Stone.Surface}"/>
|
||||
<Setter Property="BorderBrush" Value="{StaticResource Stone.Border}"/>
|
||||
<Setter Property="BorderThickness" Value="1"/>
|
||||
<Setter Property="CornerRadius" Value="{StaticResource Radius.L}"/>
|
||||
<Setter Property="Padding" Value="{StaticResource Spacing.L}"/>
|
||||
<Setter Property="SnapsToDevicePixels" Value="True"/>
|
||||
</Style>
|
||||
|
||||
<!-- ═════ DataGrid (re-skinned) ═════ -->
|
||||
<Style TargetType="DataGrid">
|
||||
<Setter Property="Background" Value="Transparent"/>
|
||||
<Setter Property="Foreground" Value="{StaticResource Text.Primary}"/>
|
||||
<Setter Property="BorderThickness" Value="0"/>
|
||||
<Setter Property="GridLinesVisibility" Value="None"/>
|
||||
<Setter Property="HeadersVisibility" Value="Column"/>
|
||||
<Setter Property="RowHeight" Value="48"/>
|
||||
<Setter Property="RowBackground" Value="Transparent"/>
|
||||
<Setter Property="AlternatingRowBackground" Value="Transparent"/>
|
||||
<Setter Property="HorizontalScrollBarVisibility" Value="Auto"/>
|
||||
<Setter Property="VerticalScrollBarVisibility" Value="Auto"/>
|
||||
<Setter Property="CanUserAddRows" Value="False"/>
|
||||
<Setter Property="CanUserDeleteRows" Value="False"/>
|
||||
<Setter Property="CanUserResizeRows" Value="False"/>
|
||||
<Setter Property="SelectionMode" Value="Single"/>
|
||||
<Setter Property="SelectionUnit" Value="FullRow"/>
|
||||
<Setter Property="AutoGenerateColumns" Value="False"/>
|
||||
</Style>
|
||||
|
||||
<Style TargetType="DataGridColumnHeader">
|
||||
<Setter Property="FontFamily" Value="{StaticResource Font.Sans}"/>
|
||||
<Setter Property="FontSize" Value="10"/>
|
||||
<Setter Property="FontWeight" Value="Medium"/>
|
||||
<Setter Property="Foreground" Value="{StaticResource Text.Tertiary}"/>
|
||||
<Setter Property="Background" Value="Transparent"/>
|
||||
<Setter Property="BorderBrush" Value="{StaticResource Stone.Border}"/>
|
||||
<Setter Property="BorderThickness" Value="0,0,0,1"/>
|
||||
<Setter Property="Padding" Value="12,10"/>
|
||||
<Setter Property="HorizontalContentAlignment" Value="Left"/>
|
||||
<Setter Property="Typography.Capitals" Value="AllSmallCaps"/>
|
||||
</Style>
|
||||
|
||||
<Style TargetType="DataGridRow">
|
||||
<Setter Property="Background" Value="Transparent"/>
|
||||
<Setter Property="BorderBrush" Value="{StaticResource Stone.Border}"/>
|
||||
<Setter Property="BorderThickness" Value="0,0,0,1"/>
|
||||
<Style.Triggers>
|
||||
<Trigger Property="IsMouseOver" Value="True">
|
||||
<Setter Property="Background" Value="{StaticResource Stone.SurfaceHover}"/>
|
||||
</Trigger>
|
||||
<Trigger Property="IsSelected" Value="True">
|
||||
<Setter Property="Background" Value="{StaticResource Stone.SurfaceElevated}"/>
|
||||
</Trigger>
|
||||
</Style.Triggers>
|
||||
</Style>
|
||||
|
||||
<Style TargetType="DataGridCell">
|
||||
<Setter Property="Background" Value="Transparent"/>
|
||||
<Setter Property="BorderThickness" Value="0"/>
|
||||
<Setter Property="Padding" Value="12,0"/>
|
||||
<Setter Property="VerticalAlignment" Value="Center"/>
|
||||
<Setter Property="Foreground" Value="{StaticResource Text.Primary}"/>
|
||||
<Setter Property="FocusVisualStyle" Value="{x:Null}"/>
|
||||
<Setter Property="Template">
|
||||
<Setter.Value>
|
||||
<ControlTemplate TargetType="DataGridCell">
|
||||
<Border Background="{TemplateBinding Background}"
|
||||
Padding="{TemplateBinding Padding}">
|
||||
<ContentPresenter VerticalAlignment="Center"/>
|
||||
</Border>
|
||||
</ControlTemplate>
|
||||
</Setter.Value>
|
||||
</Setter>
|
||||
</Style>
|
||||
|
||||
<!-- ScrollBar (slim) -->
|
||||
<Style TargetType="ScrollBar">
|
||||
<Setter Property="Width" Value="8"/>
|
||||
<Setter Property="MinWidth" Value="8"/>
|
||||
<Setter Property="Background" Value="Transparent"/>
|
||||
<Style.Triggers>
|
||||
<Trigger Property="Orientation" Value="Horizontal">
|
||||
<Setter Property="Height" Value="8"/>
|
||||
<Setter Property="MinHeight" Value="8"/>
|
||||
<Setter Property="Width" Value="Auto"/>
|
||||
</Trigger>
|
||||
</Style.Triggers>
|
||||
</Style>
|
||||
|
||||
<!-- ═════ Status pill ═════ -->
|
||||
<Style x:Key="Pill.Online" TargetType="Border">
|
||||
<Setter Property="Background" Value="#1F3A1F"/>
|
||||
<Setter Property="CornerRadius" Value="999"/>
|
||||
<Setter Property="Padding" Value="10,3"/>
|
||||
<Setter Property="HorizontalAlignment" Value="Left"/>
|
||||
</Style>
|
||||
<Style x:Key="Pill.Offline" TargetType="Border">
|
||||
<Setter Property="Background" Value="{StaticResource Status.Bad.Surface}"/>
|
||||
<Setter Property="CornerRadius" Value="999"/>
|
||||
<Setter Property="Padding" Value="10,3"/>
|
||||
<Setter Property="HorizontalAlignment" Value="Left"/>
|
||||
</Style>
|
||||
|
||||
</ResourceDictionary>
|
||||
544
src/TeamsISO.App/Themes/WildDragonTheme.xaml
Normal file
544
src/TeamsISO.App/Themes/WildDragonTheme.xaml
Normal file
|
|
@ -0,0 +1,544 @@
|
|||
<ResourceDictionary
|
||||
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
|
||||
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
|
||||
xmlns:sys="clr-namespace:System;assembly=mscorlib">
|
||||
|
||||
<!--
|
||||
TeamsISO design system — Wild Dragon brand × Microsoft Teams layout.
|
||||
|
||||
Brand reference: wilddragon.net
|
||||
Primary canvas: #0a0a0a
|
||||
Accent cyan: #97EDF0
|
||||
Secondary blue: #9AE0FD
|
||||
Coral (errors): #FB819C
|
||||
Earth (warnings): #423825
|
||||
Fonts: Inter (primary), JetBrains Mono
|
||||
|
||||
Layout reference: Microsoft Teams desktop
|
||||
- Left rail (72px) for app icon + primary nav
|
||||
- Top header inside content area
|
||||
- Card-based main panel with rounded corners (8-12px)
|
||||
- Subtle elevation through tone, not heavy shadows
|
||||
- Avatar circles for participants
|
||||
|
||||
Inter is not a Windows system font; we list it first and fall back to
|
||||
Segoe UI Variable Display (Windows 11) and Segoe UI. JetBrains Mono
|
||||
falls back to Cascadia Mono.
|
||||
-->
|
||||
|
||||
<!-- ════ Spacing (8px grid) ════ -->
|
||||
<sys:Double x:Key="Space.XS">4</sys:Double>
|
||||
<sys:Double x:Key="Space.S">8</sys:Double>
|
||||
<sys:Double x:Key="Space.M">12</sys:Double>
|
||||
<sys:Double x:Key="Space.L">16</sys:Double>
|
||||
<sys:Double x:Key="Space.XL">24</sys:Double>
|
||||
<sys:Double x:Key="Space.XXL">32</sys:Double>
|
||||
|
||||
<!-- ════ Radii (Teams uses 6/8/12) ════ -->
|
||||
<CornerRadius x:Key="Radius.S">6</CornerRadius>
|
||||
<CornerRadius x:Key="Radius.M">8</CornerRadius>
|
||||
<CornerRadius x:Key="Radius.L">12</CornerRadius>
|
||||
<CornerRadius x:Key="Radius.XL">16</CornerRadius>
|
||||
|
||||
<!-- ════ Wild Dragon palette (dark) ════ -->
|
||||
<SolidColorBrush x:Key="Wd.Canvas" Color="#0A0A0A"/>
|
||||
<SolidColorBrush x:Key="Wd.Rail" Color="#080808"/>
|
||||
<SolidColorBrush x:Key="Wd.Surface" Color="#141414"/>
|
||||
<SolidColorBrush x:Key="Wd.SurfaceElevated" Color="#1C1C1C"/>
|
||||
<SolidColorBrush x:Key="Wd.SurfaceHover" Color="#242424"/>
|
||||
<SolidColorBrush x:Key="Wd.SurfaceActive" Color="#2D2D2D"/>
|
||||
<SolidColorBrush x:Key="Wd.Border" Color="#262626"/>
|
||||
<SolidColorBrush x:Key="Wd.BorderStrong" Color="#383838"/>
|
||||
|
||||
<SolidColorBrush x:Key="Wd.Text.Primary" Color="#F5F5F5"/>
|
||||
<SolidColorBrush x:Key="Wd.Text.Secondary" Color="#A3A3A3"/>
|
||||
<SolidColorBrush x:Key="Wd.Text.Tertiary" Color="#6B6B6B"/>
|
||||
<SolidColorBrush x:Key="Wd.Text.Disabled" Color="#404040"/>
|
||||
|
||||
<!-- Accents from wilddragon.net -->
|
||||
<SolidColorBrush x:Key="Wd.Accent.Cyan" Color="#97EDF0"/>
|
||||
<SolidColorBrush x:Key="Wd.Accent.CyanHover" Color="#B5F2F4"/>
|
||||
<SolidColorBrush x:Key="Wd.Accent.CyanMuted" Color="#1B3537"/>
|
||||
<SolidColorBrush x:Key="Wd.Accent.Blue" Color="#9AE0FD"/>
|
||||
<SolidColorBrush x:Key="Wd.Accent.Coral" Color="#FB819C"/>
|
||||
<SolidColorBrush x:Key="Wd.Accent.CoralBg" Color="#3A1922"/>
|
||||
|
||||
<SolidColorBrush x:Key="Wd.Status.Live" Color="#4ADE80"/>
|
||||
<SolidColorBrush x:Key="Wd.Status.LiveBg" Color="#13261A"/>
|
||||
<SolidColorBrush x:Key="Wd.Status.Warn" Color="#FBBF24"/>
|
||||
<SolidColorBrush x:Key="Wd.Status.Error" Color="#FB819C"/>
|
||||
|
||||
<!-- ════ Typography ════ -->
|
||||
<FontFamily x:Key="Wd.Font.Sans">Inter, Segoe UI Variable Display, Segoe UI, sans-serif</FontFamily>
|
||||
<FontFamily x:Key="Wd.Font.Mono">JetBrains Mono, Cascadia Mono, Consolas, monospace</FontFamily>
|
||||
|
||||
<Style x:Key="Wd.Text.Title" TargetType="TextBlock">
|
||||
<Setter Property="FontFamily" Value="{StaticResource Wd.Font.Sans}"/>
|
||||
<Setter Property="FontSize" Value="20"/>
|
||||
<Setter Property="FontWeight" Value="SemiBold"/>
|
||||
<Setter Property="Foreground" Value="{StaticResource Wd.Text.Primary}"/>
|
||||
</Style>
|
||||
|
||||
<Style x:Key="Wd.Text.Heading" TargetType="TextBlock">
|
||||
<Setter Property="FontFamily" Value="{StaticResource Wd.Font.Sans}"/>
|
||||
<Setter Property="FontSize" Value="14"/>
|
||||
<Setter Property="FontWeight" Value="SemiBold"/>
|
||||
<Setter Property="Foreground" Value="{StaticResource Wd.Text.Primary}"/>
|
||||
</Style>
|
||||
|
||||
<Style x:Key="Wd.Text.Body" TargetType="TextBlock">
|
||||
<Setter Property="FontFamily" Value="{StaticResource Wd.Font.Sans}"/>
|
||||
<Setter Property="FontSize" Value="13"/>
|
||||
<Setter Property="Foreground" Value="{StaticResource Wd.Text.Primary}"/>
|
||||
</Style>
|
||||
|
||||
<Style x:Key="Wd.Text.Subtle" TargetType="TextBlock" BasedOn="{StaticResource Wd.Text.Body}">
|
||||
<Setter Property="Foreground" Value="{StaticResource Wd.Text.Secondary}"/>
|
||||
</Style>
|
||||
|
||||
<Style x:Key="Wd.Text.Caption" TargetType="TextBlock">
|
||||
<Setter Property="FontFamily" Value="{StaticResource Wd.Font.Sans}"/>
|
||||
<Setter Property="FontSize" Value="11"/>
|
||||
<Setter Property="FontWeight" Value="Medium"/>
|
||||
<Setter Property="Foreground" Value="{StaticResource Wd.Text.Tertiary}"/>
|
||||
<Setter Property="Typography.Capitals" Value="AllSmallCaps"/>
|
||||
</Style>
|
||||
|
||||
<Style x:Key="Wd.Text.Mono" TargetType="TextBlock">
|
||||
<Setter Property="FontFamily" Value="{StaticResource Wd.Font.Mono}"/>
|
||||
<Setter Property="FontSize" Value="12"/>
|
||||
<Setter Property="Foreground" Value="{StaticResource Wd.Text.Secondary}"/>
|
||||
</Style>
|
||||
|
||||
<Style TargetType="TextBlock" BasedOn="{StaticResource Wd.Text.Body}"/>
|
||||
|
||||
<!-- ════ Buttons ════ -->
|
||||
<!-- Ghost: bordered, transparent fill -->
|
||||
<Style x:Key="Wd.Button.Ghost" TargetType="Button">
|
||||
<Setter Property="FontFamily" Value="{StaticResource Wd.Font.Sans}"/>
|
||||
<Setter Property="FontSize" Value="13"/>
|
||||
<Setter Property="FontWeight" Value="Medium"/>
|
||||
<Setter Property="Foreground" Value="{StaticResource Wd.Text.Primary}"/>
|
||||
<Setter Property="Background" Value="Transparent"/>
|
||||
<Setter Property="BorderBrush" Value="{StaticResource Wd.BorderStrong}"/>
|
||||
<Setter Property="BorderThickness" Value="1"/>
|
||||
<Setter Property="Padding" Value="14,8"/>
|
||||
<Setter Property="Cursor" Value="Hand"/>
|
||||
<Setter Property="HorizontalContentAlignment" Value="Center"/>
|
||||
<Setter Property="VerticalContentAlignment" Value="Center"/>
|
||||
<Setter Property="FocusVisualStyle" Value="{x:Null}"/>
|
||||
<Setter Property="Template">
|
||||
<Setter.Value>
|
||||
<ControlTemplate TargetType="Button">
|
||||
<Border x:Name="Bd"
|
||||
Background="{TemplateBinding Background}"
|
||||
BorderBrush="{TemplateBinding BorderBrush}"
|
||||
BorderThickness="{TemplateBinding BorderThickness}"
|
||||
CornerRadius="{StaticResource Radius.M}"
|
||||
SnapsToDevicePixels="True">
|
||||
<ContentPresenter HorizontalAlignment="{TemplateBinding HorizontalContentAlignment}"
|
||||
VerticalAlignment="{TemplateBinding VerticalContentAlignment}"
|
||||
Margin="{TemplateBinding Padding}"/>
|
||||
</Border>
|
||||
<ControlTemplate.Triggers>
|
||||
<Trigger Property="IsMouseOver" Value="True">
|
||||
<Setter TargetName="Bd" Property="Background" Value="{StaticResource Wd.SurfaceHover}"/>
|
||||
</Trigger>
|
||||
<Trigger Property="IsPressed" Value="True">
|
||||
<Setter TargetName="Bd" Property="Background" Value="{StaticResource Wd.SurfaceActive}"/>
|
||||
</Trigger>
|
||||
<Trigger Property="IsEnabled" Value="False">
|
||||
<Setter Property="Foreground" Value="{StaticResource Wd.Text.Disabled}"/>
|
||||
<Setter TargetName="Bd" Property="Opacity" Value="0.6"/>
|
||||
</Trigger>
|
||||
</ControlTemplate.Triggers>
|
||||
</ControlTemplate>
|
||||
</Setter.Value>
|
||||
</Setter>
|
||||
</Style>
|
||||
|
||||
<!-- Primary: cyan-on-black for the brand action -->
|
||||
<Style x:Key="Wd.Button.Primary" TargetType="Button" BasedOn="{StaticResource Wd.Button.Ghost}">
|
||||
<Setter Property="Background" Value="{StaticResource Wd.Accent.Cyan}"/>
|
||||
<Setter Property="BorderBrush" Value="{StaticResource Wd.Accent.Cyan}"/>
|
||||
<Setter Property="Foreground" Value="#0A0A0A"/>
|
||||
<Setter Property="FontWeight" Value="SemiBold"/>
|
||||
<Setter Property="Template">
|
||||
<Setter.Value>
|
||||
<ControlTemplate TargetType="Button">
|
||||
<Border x:Name="Bd"
|
||||
Background="{TemplateBinding Background}"
|
||||
BorderBrush="{TemplateBinding BorderBrush}"
|
||||
BorderThickness="{TemplateBinding BorderThickness}"
|
||||
CornerRadius="{StaticResource Radius.M}">
|
||||
<ContentPresenter HorizontalAlignment="Center"
|
||||
VerticalAlignment="Center"
|
||||
Margin="{TemplateBinding Padding}"/>
|
||||
</Border>
|
||||
<ControlTemplate.Triggers>
|
||||
<Trigger Property="IsMouseOver" Value="True">
|
||||
<Setter TargetName="Bd" Property="Background" Value="{StaticResource Wd.Accent.CyanHover}"/>
|
||||
<Setter TargetName="Bd" Property="BorderBrush" Value="{StaticResource Wd.Accent.CyanHover}"/>
|
||||
</Trigger>
|
||||
</ControlTemplate.Triggers>
|
||||
</ControlTemplate>
|
||||
</Setter.Value>
|
||||
</Setter>
|
||||
</Style>
|
||||
|
||||
<!-- Rail-icon button: square 48x48, used on the Teams-style left rail -->
|
||||
<Style x:Key="Wd.Button.RailIcon" TargetType="Button">
|
||||
<Setter Property="Background" Value="Transparent"/>
|
||||
<Setter Property="BorderThickness" Value="0"/>
|
||||
<Setter Property="Foreground" Value="{StaticResource Wd.Text.Secondary}"/>
|
||||
<Setter Property="Width" Value="48"/>
|
||||
<Setter Property="Height" Value="48"/>
|
||||
<Setter Property="Margin" Value="0,4"/>
|
||||
<Setter Property="Cursor" Value="Hand"/>
|
||||
<Setter Property="FocusVisualStyle" Value="{x:Null}"/>
|
||||
<Setter Property="HorizontalContentAlignment" Value="Center"/>
|
||||
<Setter Property="VerticalContentAlignment" Value="Center"/>
|
||||
<Setter Property="Template">
|
||||
<Setter.Value>
|
||||
<ControlTemplate TargetType="Button">
|
||||
<Border x:Name="Bd"
|
||||
Background="{TemplateBinding Background}"
|
||||
CornerRadius="{StaticResource Radius.M}">
|
||||
<ContentPresenter HorizontalAlignment="Center" VerticalAlignment="Center"/>
|
||||
</Border>
|
||||
<ControlTemplate.Triggers>
|
||||
<Trigger Property="IsMouseOver" Value="True">
|
||||
<Setter TargetName="Bd" Property="Background" Value="{StaticResource Wd.SurfaceHover}"/>
|
||||
<Setter Property="Foreground" Value="{StaticResource Wd.Text.Primary}"/>
|
||||
</Trigger>
|
||||
</ControlTemplate.Triggers>
|
||||
</ControlTemplate>
|
||||
</Setter.Value>
|
||||
</Setter>
|
||||
</Style>
|
||||
|
||||
<!-- ISO toggle: pill, status-coded -->
|
||||
<Style x:Key="Wd.Button.IsoToggle" TargetType="Button">
|
||||
<Setter Property="FontFamily" Value="{StaticResource Wd.Font.Sans}"/>
|
||||
<Setter Property="FontSize" Value="11"/>
|
||||
<Setter Property="FontWeight" Value="SemiBold"/>
|
||||
<Setter Property="Foreground" Value="{StaticResource Wd.Text.Primary}"/>
|
||||
<Setter Property="Background" Value="{StaticResource Wd.SurfaceHover}"/>
|
||||
<Setter Property="BorderBrush" Value="{StaticResource Wd.BorderStrong}"/>
|
||||
<Setter Property="BorderThickness" Value="1"/>
|
||||
<Setter Property="Padding" Value="14,6"/>
|
||||
<Setter Property="Cursor" Value="Hand"/>
|
||||
<Setter Property="HorizontalContentAlignment" Value="Center"/>
|
||||
<Setter Property="MinWidth" Value="84"/>
|
||||
<Setter Property="FocusVisualStyle" Value="{x:Null}"/>
|
||||
<Setter Property="Template">
|
||||
<Setter.Value>
|
||||
<ControlTemplate TargetType="Button">
|
||||
<Border x:Name="Bd"
|
||||
Background="{TemplateBinding Background}"
|
||||
BorderBrush="{TemplateBinding BorderBrush}"
|
||||
BorderThickness="{TemplateBinding BorderThickness}"
|
||||
CornerRadius="999">
|
||||
<ContentPresenter HorizontalAlignment="Center"
|
||||
VerticalAlignment="Center"
|
||||
Margin="{TemplateBinding Padding}"/>
|
||||
</Border>
|
||||
<ControlTemplate.Triggers>
|
||||
<Trigger Property="IsMouseOver" Value="True">
|
||||
<Setter TargetName="Bd" Property="Background" Value="{StaticResource Wd.SurfaceActive}"/>
|
||||
</Trigger>
|
||||
</ControlTemplate.Triggers>
|
||||
</ControlTemplate>
|
||||
</Setter.Value>
|
||||
</Setter>
|
||||
</Style>
|
||||
|
||||
<!-- ════ TextBox ════ -->
|
||||
<Style x:Key="Wd.TextBox.Default" TargetType="TextBox">
|
||||
<Setter Property="FontFamily" Value="{StaticResource Wd.Font.Sans}"/>
|
||||
<Setter Property="FontSize" Value="13"/>
|
||||
<Setter Property="Foreground" Value="{StaticResource Wd.Text.Primary}"/>
|
||||
<Setter Property="Background" Value="{StaticResource Wd.Surface}"/>
|
||||
<Setter Property="CaretBrush" Value="{StaticResource Wd.Accent.Cyan}"/>
|
||||
<Setter Property="SelectionBrush" Value="{StaticResource Wd.Accent.CyanMuted}"/>
|
||||
<Setter Property="BorderBrush" Value="{StaticResource Wd.Border}"/>
|
||||
<Setter Property="BorderThickness" Value="1"/>
|
||||
<Setter Property="Padding" Value="12,9"/>
|
||||
<Setter Property="Template">
|
||||
<Setter.Value>
|
||||
<ControlTemplate TargetType="TextBox">
|
||||
<Border x:Name="Bd"
|
||||
Background="{TemplateBinding Background}"
|
||||
BorderBrush="{TemplateBinding BorderBrush}"
|
||||
BorderThickness="{TemplateBinding BorderThickness}"
|
||||
CornerRadius="{StaticResource Radius.M}">
|
||||
<ScrollViewer x:Name="PART_ContentHost"
|
||||
Margin="{TemplateBinding Padding}"
|
||||
VerticalAlignment="Center"
|
||||
Focusable="False"/>
|
||||
</Border>
|
||||
<ControlTemplate.Triggers>
|
||||
<Trigger Property="IsKeyboardFocused" Value="True">
|
||||
<Setter TargetName="Bd" Property="BorderBrush" Value="{StaticResource Wd.Accent.Cyan}"/>
|
||||
</Trigger>
|
||||
<Trigger Property="IsMouseOver" Value="True">
|
||||
<Setter TargetName="Bd" Property="BorderBrush" Value="{StaticResource Wd.BorderStrong}"/>
|
||||
</Trigger>
|
||||
</ControlTemplate.Triggers>
|
||||
</ControlTemplate>
|
||||
</Setter.Value>
|
||||
</Setter>
|
||||
</Style>
|
||||
<Style TargetType="TextBox" BasedOn="{StaticResource Wd.TextBox.Default}"/>
|
||||
|
||||
<!-- ════ ComboBox ════ -->
|
||||
<Style x:Key="Wd.ComboToggle" TargetType="ToggleButton">
|
||||
<Setter Property="OverridesDefaultStyle" Value="True"/>
|
||||
<Setter Property="IsTabStop" Value="False"/>
|
||||
<Setter Property="Focusable" Value="False"/>
|
||||
<Setter Property="ClickMode" Value="Press"/>
|
||||
<Setter Property="Background" Value="Transparent"/>
|
||||
<Setter Property="Template">
|
||||
<Setter.Value>
|
||||
<ControlTemplate TargetType="ToggleButton">
|
||||
<Path HorizontalAlignment="Right"
|
||||
VerticalAlignment="Center"
|
||||
Margin="0,0,14,0"
|
||||
Data="M 0,0 L 4,4 L 8,0 Z"
|
||||
Fill="{StaticResource Wd.Text.Secondary}"/>
|
||||
</ControlTemplate>
|
||||
</Setter.Value>
|
||||
</Setter>
|
||||
</Style>
|
||||
|
||||
<Style TargetType="ComboBox">
|
||||
<Setter Property="FontFamily" Value="{StaticResource Wd.Font.Sans}"/>
|
||||
<Setter Property="FontSize" Value="13"/>
|
||||
<Setter Property="Foreground" Value="{StaticResource Wd.Text.Primary}"/>
|
||||
<Setter Property="Background" Value="{StaticResource Wd.Surface}"/>
|
||||
<Setter Property="BorderBrush" Value="{StaticResource Wd.Border}"/>
|
||||
<Setter Property="BorderThickness" Value="1"/>
|
||||
<Setter Property="Padding" Value="12,9"/>
|
||||
<Setter Property="Template">
|
||||
<Setter.Value>
|
||||
<ControlTemplate TargetType="ComboBox">
|
||||
<Grid>
|
||||
<Border x:Name="Bd"
|
||||
Background="{TemplateBinding Background}"
|
||||
BorderBrush="{TemplateBinding BorderBrush}"
|
||||
BorderThickness="{TemplateBinding BorderThickness}"
|
||||
CornerRadius="{StaticResource Radius.M}"/>
|
||||
<ToggleButton Style="{StaticResource Wd.ComboToggle}"
|
||||
IsChecked="{Binding IsDropDownOpen,
|
||||
RelativeSource={RelativeSource TemplatedParent}, Mode=TwoWay}"/>
|
||||
<ContentPresenter Margin="{TemplateBinding Padding}"
|
||||
IsHitTestVisible="False"
|
||||
VerticalAlignment="Center"
|
||||
Content="{TemplateBinding SelectionBoxItem}"
|
||||
ContentTemplate="{TemplateBinding SelectionBoxItemTemplate}"/>
|
||||
<Popup IsOpen="{TemplateBinding IsDropDownOpen}"
|
||||
Placement="Bottom"
|
||||
AllowsTransparency="True"
|
||||
Focusable="False"
|
||||
PopupAnimation="None">
|
||||
<Border Background="{StaticResource Wd.SurfaceElevated}"
|
||||
BorderBrush="{StaticResource Wd.BorderStrong}"
|
||||
BorderThickness="1"
|
||||
CornerRadius="{StaticResource Radius.M}"
|
||||
MinWidth="{TemplateBinding ActualWidth}"
|
||||
MaxHeight="280"
|
||||
Margin="0,4,0,0">
|
||||
<ScrollViewer><ItemsPresenter/></ScrollViewer>
|
||||
</Border>
|
||||
</Popup>
|
||||
</Grid>
|
||||
<ControlTemplate.Triggers>
|
||||
<Trigger Property="IsMouseOver" Value="True">
|
||||
<Setter TargetName="Bd" Property="BorderBrush" Value="{StaticResource Wd.BorderStrong}"/>
|
||||
</Trigger>
|
||||
<Trigger Property="IsKeyboardFocusWithin" Value="True">
|
||||
<Setter TargetName="Bd" Property="BorderBrush" Value="{StaticResource Wd.Accent.Cyan}"/>
|
||||
</Trigger>
|
||||
</ControlTemplate.Triggers>
|
||||
</ControlTemplate>
|
||||
</Setter.Value>
|
||||
</Setter>
|
||||
</Style>
|
||||
|
||||
<Style TargetType="ComboBoxItem">
|
||||
<Setter Property="Foreground" Value="{StaticResource Wd.Text.Primary}"/>
|
||||
<Setter Property="Padding" Value="12,9"/>
|
||||
<Setter Property="Template">
|
||||
<Setter.Value>
|
||||
<ControlTemplate TargetType="ComboBoxItem">
|
||||
<Border x:Name="Bd"
|
||||
Background="Transparent"
|
||||
CornerRadius="{StaticResource Radius.S}"
|
||||
Margin="4,2"
|
||||
Padding="{TemplateBinding Padding}">
|
||||
<ContentPresenter/>
|
||||
</Border>
|
||||
<ControlTemplate.Triggers>
|
||||
<Trigger Property="IsMouseOver" Value="True">
|
||||
<Setter TargetName="Bd" Property="Background" Value="{StaticResource Wd.SurfaceHover}"/>
|
||||
</Trigger>
|
||||
<Trigger Property="IsHighlighted" Value="True">
|
||||
<Setter TargetName="Bd" Property="Background" Value="{StaticResource Wd.SurfaceHover}"/>
|
||||
</Trigger>
|
||||
</ControlTemplate.Triggers>
|
||||
</ControlTemplate>
|
||||
</Setter.Value>
|
||||
</Setter>
|
||||
</Style>
|
||||
|
||||
<!-- ════ CheckBox ════ -->
|
||||
<Style TargetType="CheckBox">
|
||||
<Setter Property="FontFamily" Value="{StaticResource Wd.Font.Sans}"/>
|
||||
<Setter Property="FontSize" Value="13"/>
|
||||
<Setter Property="Foreground" Value="{StaticResource Wd.Text.Primary}"/>
|
||||
<Setter Property="Cursor" Value="Hand"/>
|
||||
<Setter Property="Padding" Value="10,0,0,0"/>
|
||||
<Setter Property="Template">
|
||||
<Setter.Value>
|
||||
<ControlTemplate TargetType="CheckBox">
|
||||
<StackPanel Orientation="Horizontal">
|
||||
<Border x:Name="Box"
|
||||
Width="18" Height="18"
|
||||
BorderBrush="{StaticResource Wd.BorderStrong}"
|
||||
BorderThickness="1"
|
||||
Background="{StaticResource Wd.Surface}"
|
||||
CornerRadius="4"
|
||||
VerticalAlignment="Center">
|
||||
<Path x:Name="Tick"
|
||||
Data="M 4,9 L 7.5,12.5 L 14,5"
|
||||
Stroke="#0A0A0A" StrokeThickness="2"
|
||||
StrokeStartLineCap="Round"
|
||||
StrokeEndLineCap="Round"
|
||||
Visibility="Collapsed"/>
|
||||
</Border>
|
||||
<ContentPresenter Margin="{TemplateBinding Padding}"
|
||||
VerticalAlignment="Center"/>
|
||||
</StackPanel>
|
||||
<ControlTemplate.Triggers>
|
||||
<Trigger Property="IsChecked" Value="True">
|
||||
<Setter TargetName="Box" Property="Background" Value="{StaticResource Wd.Accent.Cyan}"/>
|
||||
<Setter TargetName="Box" Property="BorderBrush" Value="{StaticResource Wd.Accent.Cyan}"/>
|
||||
<Setter TargetName="Tick" Property="Visibility" Value="Visible"/>
|
||||
</Trigger>
|
||||
<Trigger Property="IsMouseOver" Value="True">
|
||||
<Setter TargetName="Box" Property="BorderBrush" Value="{StaticResource Wd.Accent.Cyan}"/>
|
||||
</Trigger>
|
||||
</ControlTemplate.Triggers>
|
||||
</ControlTemplate>
|
||||
</Setter.Value>
|
||||
</Setter>
|
||||
</Style>
|
||||
|
||||
<!-- ════ Card ════ -->
|
||||
<Style x:Key="Wd.Card" TargetType="Border">
|
||||
<Setter Property="Background" Value="{StaticResource Wd.Surface}"/>
|
||||
<Setter Property="BorderBrush" Value="{StaticResource Wd.Border}"/>
|
||||
<Setter Property="BorderThickness" Value="1"/>
|
||||
<Setter Property="CornerRadius" Value="{StaticResource Radius.L}"/>
|
||||
<Setter Property="Padding" Value="16"/>
|
||||
</Style>
|
||||
|
||||
<!-- ════ DataGrid (re-skinned, Teams-style) ════ -->
|
||||
<Style TargetType="DataGrid">
|
||||
<Setter Property="Background" Value="Transparent"/>
|
||||
<Setter Property="Foreground" Value="{StaticResource Wd.Text.Primary}"/>
|
||||
<Setter Property="BorderThickness" Value="0"/>
|
||||
<Setter Property="GridLinesVisibility" Value="None"/>
|
||||
<Setter Property="HeadersVisibility" Value="Column"/>
|
||||
<Setter Property="RowHeight" Value="56"/>
|
||||
<Setter Property="RowBackground" Value="Transparent"/>
|
||||
<Setter Property="AlternatingRowBackground" Value="Transparent"/>
|
||||
<Setter Property="HorizontalScrollBarVisibility" Value="Auto"/>
|
||||
<Setter Property="VerticalScrollBarVisibility" Value="Auto"/>
|
||||
<Setter Property="CanUserAddRows" Value="False"/>
|
||||
<Setter Property="CanUserDeleteRows" Value="False"/>
|
||||
<Setter Property="CanUserResizeRows" Value="False"/>
|
||||
<Setter Property="SelectionMode" Value="Single"/>
|
||||
<Setter Property="SelectionUnit" Value="FullRow"/>
|
||||
<Setter Property="AutoGenerateColumns" Value="False"/>
|
||||
</Style>
|
||||
|
||||
<Style TargetType="DataGridColumnHeader">
|
||||
<Setter Property="FontFamily" Value="{StaticResource Wd.Font.Sans}"/>
|
||||
<Setter Property="FontSize" Value="11"/>
|
||||
<Setter Property="FontWeight" Value="Medium"/>
|
||||
<Setter Property="Foreground" Value="{StaticResource Wd.Text.Tertiary}"/>
|
||||
<Setter Property="Background" Value="Transparent"/>
|
||||
<Setter Property="BorderBrush" Value="{StaticResource Wd.Border}"/>
|
||||
<Setter Property="BorderThickness" Value="0,0,0,1"/>
|
||||
<Setter Property="Padding" Value="14,12"/>
|
||||
<Setter Property="HorizontalContentAlignment" Value="Left"/>
|
||||
<Setter Property="Typography.Capitals" Value="AllSmallCaps"/>
|
||||
</Style>
|
||||
|
||||
<Style TargetType="DataGridRow">
|
||||
<Setter Property="Background" Value="Transparent"/>
|
||||
<Setter Property="BorderBrush" Value="{StaticResource Wd.Border}"/>
|
||||
<Setter Property="BorderThickness" Value="0,0,0,1"/>
|
||||
<Style.Triggers>
|
||||
<Trigger Property="IsMouseOver" Value="True">
|
||||
<Setter Property="Background" Value="{StaticResource Wd.SurfaceHover}"/>
|
||||
</Trigger>
|
||||
<Trigger Property="IsSelected" Value="True">
|
||||
<Setter Property="Background" Value="{StaticResource Wd.SurfaceElevated}"/>
|
||||
</Trigger>
|
||||
</Style.Triggers>
|
||||
</Style>
|
||||
|
||||
<Style TargetType="DataGridCell">
|
||||
<Setter Property="Background" Value="Transparent"/>
|
||||
<Setter Property="BorderThickness" Value="0"/>
|
||||
<Setter Property="Padding" Value="14,0"/>
|
||||
<Setter Property="VerticalAlignment" Value="Center"/>
|
||||
<Setter Property="Foreground" Value="{StaticResource Wd.Text.Primary}"/>
|
||||
<Setter Property="FocusVisualStyle" Value="{x:Null}"/>
|
||||
<Setter Property="Template">
|
||||
<Setter.Value>
|
||||
<ControlTemplate TargetType="DataGridCell">
|
||||
<Border Background="{TemplateBinding Background}"
|
||||
Padding="{TemplateBinding Padding}">
|
||||
<ContentPresenter VerticalAlignment="Center"/>
|
||||
</Border>
|
||||
</ControlTemplate>
|
||||
</Setter.Value>
|
||||
</Setter>
|
||||
</Style>
|
||||
|
||||
<!-- ════ ScrollBar (slim) ════ -->
|
||||
<Style TargetType="ScrollBar">
|
||||
<Setter Property="Width" Value="10"/>
|
||||
<Setter Property="MinWidth" Value="10"/>
|
||||
<Setter Property="Background" Value="Transparent"/>
|
||||
<Style.Triggers>
|
||||
<Trigger Property="Orientation" Value="Horizontal">
|
||||
<Setter Property="Height" Value="10"/>
|
||||
<Setter Property="MinHeight" Value="10"/>
|
||||
<Setter Property="Width" Value="Auto"/>
|
||||
</Trigger>
|
||||
</Style.Triggers>
|
||||
</Style>
|
||||
|
||||
<!-- ════ Avatar (28px circle with initials) ════ -->
|
||||
<Style x:Key="Wd.Avatar" TargetType="Border">
|
||||
<Setter Property="Width" Value="32"/>
|
||||
<Setter Property="Height" Value="32"/>
|
||||
<Setter Property="CornerRadius" Value="16"/>
|
||||
<Setter Property="Background" Value="{StaticResource Wd.Accent.CyanMuted}"/>
|
||||
<Setter Property="BorderBrush" Value="{StaticResource Wd.Accent.Cyan}"/>
|
||||
<Setter Property="BorderThickness" Value="1"/>
|
||||
</Style>
|
||||
|
||||
<!-- ════ Status pill ════ -->
|
||||
<Style x:Key="Wd.Pill" TargetType="Border">
|
||||
<Setter Property="Background" Value="{StaticResource Wd.SurfaceElevated}"/>
|
||||
<Setter Property="CornerRadius" Value="999"/>
|
||||
<Setter Property="Padding" Value="10,4"/>
|
||||
<Setter Property="HorizontalAlignment" Value="Left"/>
|
||||
</Style>
|
||||
|
||||
</ResourceDictionary>
|
||||
Loading…
Reference in a new issue