style(ui): Material Design icons for shared controls and modals

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
This commit is contained in:
mika kuns
2026-10-01 16:50:06 +02:00
co-authored by Claude Sonnet 5.5
parent aef41f0594
commit 476a94960e
7 changed files with 48 additions and 25 deletions
@@ -106,12 +106,16 @@
<!-- Toolbar: change nav · file switcher · readout --> <!-- Toolbar: change nav · file switcher · readout -->
<Grid Grid.Row="2" ColumnDefinitions="Auto,Auto,Auto,*,Auto,Auto" Margin="0,0,0,8" <Grid Grid.Row="2" ColumnDefinitions="Auto,Auto,Auto,*,Auto,Auto" Margin="0,0,0,8"
IsVisible="{Binding HasCurrent}"> IsVisible="{Binding HasCurrent}">
<Button Grid.Column="0" Classes="btn" Content="↑" Margin="0,0,4,0" Padding="10,4" <Button Grid.Column="0" Classes="btn" Margin="0,0,4,0" Padding="10,4"
ToolTip.Tip="{loc:Tr conflictResolver.prevConflict}" ToolTip.Tip="{loc:Tr conflictResolver.prevConflict}"
Command="{Binding PreviousCommand}"/> Command="{Binding PreviousCommand}">
<Button Grid.Column="1" Classes="btn" Content="↓" Margin="0,0,12,0" Padding="10,4" <PathIcon Width="14" Height="14" Data="{Binding Source='mdi:ChevronUp', Converter={StaticResource IconKey}}"/>
</Button>
<Button Grid.Column="1" Classes="btn" Margin="0,0,12,0" Padding="10,4"
ToolTip.Tip="{loc:Tr conflictResolver.nextConflict}" ToolTip.Tip="{loc:Tr conflictResolver.nextConflict}"
Command="{Binding NextCommand}"/> Command="{Binding NextCommand}">
<PathIcon Width="14" Height="14" Data="{Binding Source='mdi:ChevronDown', Converter={StaticResource IconKey}}"/>
</Button>
<ComboBox Grid.Column="2" MinWidth="240" MaxWidth="520" <ComboBox Grid.Column="2" MinWidth="240" MaxWidth="520"
ItemsSource="{Binding Files}" ItemsSource="{Binding Files}"
SelectedItem="{Binding ActiveFile, Mode=TwoWay}"> SelectedItem="{Binding ActiveFile, Mode=TwoWay}">
@@ -13,8 +13,10 @@
<Grid ColumnDefinitions="Auto,Auto,*,Auto" ColumnSpacing="6"> <Grid ColumnDefinitions="Auto,Auto,*,Auto" ColumnSpacing="6">
<TextBlock Grid.Column="0" Classes="field-label" Text="{loc:Tr settings.agentEditor.model}" VerticalAlignment="Center"/> <TextBlock Grid.Column="0" Classes="field-label" Text="{loc:Tr settings.agentEditor.model}" VerticalAlignment="Center"/>
<ctl:InheritedBadge Grid.Column="1" BadgeText="{Binding ModelBadge}"/> <ctl:InheritedBadge Grid.Column="1" BadgeText="{Binding ModelBadge}"/>
<Button Grid.Column="3" Classes="icon-btn" Content="↺" ToolTip.Tip="{loc:Tr settings.inherit.resetToInherited}" <Button Grid.Column="3" Classes="icon-btn" ToolTip.Tip="{loc:Tr settings.inherit.resetToInherited}"
Command="{Binding ResetModelCommand}"/> Command="{Binding ResetModelCommand}">
<PathIcon Width="14" Height="14" Data="{Binding Source='mdi:Restore', Converter={StaticResource IconKey}}"/>
</Button>
</Grid> </Grid>
<ComboBox ItemsSource="{Binding ModelOptions}" <ComboBox ItemsSource="{Binding ModelOptions}"
SelectedItem="{Binding Model, Mode=TwoWay}" SelectedItem="{Binding Model, Mode=TwoWay}"
@@ -27,8 +29,10 @@
<Grid ColumnDefinitions="Auto,Auto,*,Auto" ColumnSpacing="6"> <Grid ColumnDefinitions="Auto,Auto,*,Auto" ColumnSpacing="6">
<TextBlock Grid.Column="0" Classes="field-label" Text="{loc:Tr settings.agentEditor.maxTurns}" VerticalAlignment="Center"/> <TextBlock Grid.Column="0" Classes="field-label" Text="{loc:Tr settings.agentEditor.maxTurns}" VerticalAlignment="Center"/>
<ctl:InheritedBadge Grid.Column="1" BadgeText="{Binding TurnsBadge}"/> <ctl:InheritedBadge Grid.Column="1" BadgeText="{Binding TurnsBadge}"/>
<Button Grid.Column="3" Classes="icon-btn" Content="↺" ToolTip.Tip="{loc:Tr settings.inherit.resetToInherited}" <Button Grid.Column="3" Classes="icon-btn" ToolTip.Tip="{loc:Tr settings.inherit.resetToInherited}"
Command="{Binding ResetTurnsCommand}"/> Command="{Binding ResetTurnsCommand}">
<PathIcon Width="14" Height="14" Data="{Binding Source='mdi:Restore', Converter={StaticResource IconKey}}"/>
</Button>
</Grid> </Grid>
<NumericUpDown Value="{Binding MaxTurns, Mode=TwoWay}" <NumericUpDown Value="{Binding MaxTurns, Mode=TwoWay}"
PlaceholderText="{Binding TurnsInheritedHint}" PlaceholderText="{Binding TurnsInheritedHint}"
@@ -44,8 +48,10 @@
<Grid ColumnDefinitions="Auto,Auto,*,Auto" ColumnSpacing="6"> <Grid ColumnDefinitions="Auto,Auto,*,Auto" ColumnSpacing="6">
<TextBlock Grid.Column="0" Classes="field-label" Text="{loc:Tr settings.agentEditor.permissionMode}" VerticalAlignment="Center"/> <TextBlock Grid.Column="0" Classes="field-label" Text="{loc:Tr settings.agentEditor.permissionMode}" VerticalAlignment="Center"/>
<ctl:InheritedBadge Grid.Column="1" BadgeText="{Binding PermissionBadge}"/> <ctl:InheritedBadge Grid.Column="1" BadgeText="{Binding PermissionBadge}"/>
<Button Grid.Column="3" Classes="icon-btn" Content="↺" ToolTip.Tip="{loc:Tr settings.inherit.resetToInherited}" <Button Grid.Column="3" Classes="icon-btn" ToolTip.Tip="{loc:Tr settings.inherit.resetToInherited}"
Command="{Binding ResetPermissionModeCommand}"/> Command="{Binding ResetPermissionModeCommand}">
<PathIcon Width="14" Height="14" Data="{Binding Source='mdi:Restore', Converter={StaticResource IconKey}}"/>
</Button>
</Grid> </Grid>
<ComboBox ItemsSource="{Binding PermissionModeOptions}" <ComboBox ItemsSource="{Binding PermissionModeOptions}"
SelectedItem="{Binding PermissionMode, Mode=TwoWay}" SelectedItem="{Binding PermissionMode, Mode=TwoWay}"
@@ -71,8 +77,10 @@
<Grid ColumnDefinitions="Auto,Auto,*,Auto" ColumnSpacing="6"> <Grid ColumnDefinitions="Auto,Auto,*,Auto" ColumnSpacing="6">
<TextBlock Grid.Column="0" Classes="field-label" Text="{loc:Tr settings.agentEditor.agentFile}" VerticalAlignment="Center"/> <TextBlock Grid.Column="0" Classes="field-label" Text="{loc:Tr settings.agentEditor.agentFile}" VerticalAlignment="Center"/>
<ctl:InheritedBadge Grid.Column="1" BadgeText="{Binding AgentBadge}"/> <ctl:InheritedBadge Grid.Column="1" BadgeText="{Binding AgentBadge}"/>
<Button Grid.Column="3" Classes="icon-btn" Content="↺" ToolTip.Tip="{loc:Tr settings.inherit.resetToInherited}" <Button Grid.Column="3" Classes="icon-btn" ToolTip.Tip="{loc:Tr settings.inherit.resetToInherited}"
Command="{Binding ResetAgentCommand}"/> Command="{Binding ResetAgentCommand}">
<PathIcon Width="14" Height="14" Data="{Binding Source='mdi:Restore', Converter={StaticResource IconKey}}"/>
</Button>
</Grid> </Grid>
<Grid ColumnDefinitions="*,Auto"> <Grid ColumnDefinitions="*,Auto">
<ComboBox Grid.Column="0" <ComboBox Grid.Column="0"
@@ -1,4 +1,5 @@
using System; using System;
using System.Globalization;
using System.Text.RegularExpressions; using System.Text.RegularExpressions;
using Avalonia; using Avalonia;
using Avalonia.Controls; using Avalonia.Controls;
@@ -8,6 +9,7 @@ using Avalonia.Layout;
using Avalonia.Markup.Xaml; using Avalonia.Markup.Xaml;
using Avalonia.Media; using Avalonia.Media;
using Avalonia.Threading; using Avalonia.Threading;
using ClaudeDo.Ui.Converters;
using ClaudeDo.Ui.Localization; using ClaudeDo.Ui.Localization;
namespace ClaudeDo.Ui.Views.Controls; namespace ClaudeDo.Ui.Views.Controls;
@@ -243,12 +245,13 @@ public partial class MarkdownView : UserControl
return grid; return grid;
} }
private static Geometry? MdiGeometry(string kind) =>
(Geometry?)IconKeyConverter.Instance.Convert("mdi:" + kind, typeof(Geometry), null, CultureInfo.InvariantCulture);
private Button CopyButton(string command) private Button CopyButton(string command)
{ {
var copyIcon = new PathIcon { Width = 11, Height = 11 }; var copyIcon = new PathIcon { Width = 11, Height = 11, Data = MdiGeometry("ContentCopy") };
copyIcon.Bind(PathIcon.DataProperty, this.GetResourceObservable("Icon.Copy")); var checkIcon = new PathIcon { Width = 11, Height = 11, Data = MdiGeometry("Check") };
var checkIcon = new PathIcon { Width = 11, Height = 11 };
checkIcon.Bind(PathIcon.DataProperty, this.GetResourceObservable("Icon.Check"));
var button = new Button var button = new Button
{ {
@@ -98,7 +98,7 @@
<PathIcon Grid.Column="0" Width="14" Height="14" <PathIcon Grid.Column="0" Width="14" Height="14"
Margin="0,0,8,0" Margin="0,0,8,0"
Foreground="{DynamicResource TextDimBrush}" Foreground="{DynamicResource TextDimBrush}"
Data="M19,4H18V2H16V4H8V2H6V4H5A2,2 0 0,0 3,6V20A2,2 0 0,0 5,22H19A2,2 0 0,0 21,20V6A2,2 0 0,0 19,4M19,20H5V10H19V20M19,8H5V6H19V8Z"/> Data="{Binding Source='mdi:CalendarBlankOutline', Converter={StaticResource IconKey}}"/>
<TextBlock Grid.Column="1" <TextBlock Grid.Column="1"
Text="{Binding #Root.DisplayText}" Text="{Binding #Root.DisplayText}"
Foreground="{Binding #Root.DisplayForeground}" Foreground="{Binding #Root.DisplayForeground}"
@@ -107,7 +107,7 @@
<PathIcon Grid.Column="2" Width="10" Height="10" <PathIcon Grid.Column="2" Width="10" Height="10"
Margin="8,0,0,0" Margin="8,0,0,0"
Foreground="{DynamicResource TextMuteBrush}" Foreground="{DynamicResource TextMuteBrush}"
Data="M7,10L12,15L17,10H7Z"/> Data="{Binding Source='mdi:MenuDown', Converter={StaticResource IconKey}}"/>
</Grid> </Grid>
</ToggleButton> </ToggleButton>
@@ -133,11 +133,15 @@
</StackPanel> </StackPanel>
<Grid ColumnDefinitions="Auto,*,Auto" Margin="0,2,0,0"> <Grid ColumnDefinitions="Auto,*,Auto" Margin="0,2,0,0">
<Button Grid.Column="0" Click="OnPrevMonthClick" Classes="nav" Content="◀"/> <Button Grid.Column="0" Click="OnPrevMonthClick" Classes="nav">
<PathIcon Width="14" Height="14" Data="{Binding Source='mdi:ChevronLeft', Converter={StaticResource IconKey}}"/>
</Button>
<TextBlock Grid.Column="1" x:Name="MonthHeader" Classes="title" <TextBlock Grid.Column="1" x:Name="MonthHeader" Classes="title"
HorizontalAlignment="Center" HorizontalAlignment="Center"
VerticalAlignment="Center"/> VerticalAlignment="Center"/>
<Button Grid.Column="2" Click="OnNextMonthClick" Classes="nav" Content="▶"/> <Button Grid.Column="2" Click="OnNextMonthClick" Classes="nav">
<PathIcon Width="14" Height="14" Data="{Binding Source='mdi:ChevronRight', Converter={StaticResource IconKey}}"/>
</Button>
</Grid> </Grid>
<UniformGrid Columns="7" x:Name="WeekdayHeaders"/> <UniformGrid Columns="7" x:Name="WeekdayHeaders"/>
@@ -45,7 +45,7 @@
<ToggleButton Classes="icon-btn" IsChecked="{Binding WrapLines}" <ToggleButton Classes="icon-btn" IsChecked="{Binding WrapLines}"
VerticalAlignment="Center" VerticalAlignment="Center"
ToolTip.Tip="{loc:Tr modals.diff.wrapLines}"> ToolTip.Tip="{loc:Tr modals.diff.wrapLines}">
<PathIcon Data="{StaticResource Icon.Wrap}" Width="14" Height="14"/> <PathIcon Data="{Binding Source='mdi:Wrap', Converter={StaticResource IconKey}}" Width="14" Height="14"/>
</ToggleButton> </ToggleButton>
<ctl:OperationIndicator Status="{Binding ParseOp}"/> <ctl:OperationIndicator Status="{Binding ParseOp}"/>
</StackPanel> </StackPanel>
@@ -349,10 +349,12 @@
<TextBlock Classes="meta" Grid.Column="3" Text="{Binding LastRunLabel}" VerticalAlignment="Center" <TextBlock Classes="meta" Grid.Column="3" Text="{Binding LastRunLabel}" VerticalAlignment="Center"
TextTrimming="CharacterEllipsis" TextTrimming="CharacterEllipsis"
ToolTip.Tip="{Binding LastRunLabel}"/> ToolTip.Tip="{Binding LastRunLabel}"/>
<Button Classes="icon-btn" Grid.Column="4" Content="✕" <Button Classes="icon-btn" Grid.Column="4"
ToolTip.Tip="{loc:Tr settings.prime.removeScheduleTip}" ToolTip.Tip="{loc:Tr settings.prime.removeScheduleTip}"
Command="{Binding $parent[ItemsControl].((vm:SettingsModalViewModel)DataContext).Prime.RemoveScheduleCommand}" Command="{Binding $parent[ItemsControl].((vm:SettingsModalViewModel)DataContext).Prime.RemoveScheduleCommand}"
CommandParameter="{Binding}"/> CommandParameter="{Binding}">
<PathIcon Width="12" Height="12" Data="{Binding Source='mdi:Close', Converter={StaticResource IconKey}}"/>
</Button>
</Grid> </Grid>
<TextBlock Classes="field-label" Text="{loc:Tr settings.prime.actionLabel}"/> <TextBlock Classes="field-label" Text="{loc:Tr settings.prime.actionLabel}"/>
<StackPanel Orientation="Horizontal" Spacing="16"> <StackPanel Orientation="Horizontal" Spacing="16">
@@ -25,10 +25,12 @@
<StackPanel Orientation="Horizontal" Spacing="6"> <StackPanel Orientation="Horizontal" Spacing="6">
<Ellipse Classes="spinner" Width="12" Height="12" VerticalAlignment="Center" <Ellipse Classes="spinner" Width="12" Height="12" VerticalAlignment="Center"
IsVisible="{Binding IsRefreshing}"/> IsVisible="{Binding IsRefreshing}"/>
<Button Classes="icon-btn" Content="⟳" FontSize="{DynamicResource FontSizeBody}" <Button Classes="icon-btn"
Command="{Binding RefreshCommand}" Command="{Binding RefreshCommand}"
IsEnabled="{Binding !IsRefreshing}" IsEnabled="{Binding !IsRefreshing}"
ToolTip.Tip="{loc:Tr modals.usageMonitor.refreshHint}"/> ToolTip.Tip="{loc:Tr modals.usageMonitor.refreshHint}">
<PathIcon Width="14" Height="14" Data="{Binding Source='mdi:Refresh', Converter={StaticResource IconKey}}"/>
</Button>
</StackPanel> </StackPanel>
</ctl:ModalShell.HeaderActions> </ctl:ModalShell.HeaderActions>
<DockPanel> <DockPanel>