From a309729c117457a061b9afd19a1e0538b3275a2b Mon Sep 17 00:00:00 2001
From: Zhang Dian <54255897+zdpcdt@users.noreply.github.com>
Date: Fri, 6 Feb 2026 20:24:35 +0800
Subject: [PATCH 01/45] chore: ready for 12.0.x.
---
demo/Directory.Packages.props | 6 +-
.../MainActivity.cs | 2 +-
demo/Semi.Avalonia.Demo/App.axaml | 4 +-
.../Controls/ColorDetailControl.cs | 1 +
.../Pages/DataGridDemo.axaml | 179 ---------
.../Pages/DataGridDemo.axaml.cs | 13 -
.../Pages/HighContrastDemo.axaml | 327 ----------------
.../Pages/HighContrastDemo.axaml.cs | 24 --
demo/Semi.Avalonia.Demo/Pages/Overview.axaml | 28 +-
.../Pages/PaletteDemo.axaml.cs | 1 +
.../Pages/TreeDataGridDemo.axaml | 126 ------
.../Pages/TreeDataGridDemo.axaml.cs | 22 --
.../Pages/VariablesDemo.axaml | 104 -----
.../Pages/VariablesDemo.axaml.cs | 24 --
.../Semi.Avalonia.Demo.csproj | 19 +-
.../Themes/FunctionalColorGroupControl.axaml | 152 --------
.../Themes/ShadowGroupControl.axaml | 110 ------
demo/Semi.Avalonia.Demo/Themes/_index.axaml | 2 -
.../ViewModels/DataGridDemoViewModel.cs | 154 --------
.../TreeDataGridDemo/FilesPageViewModel.cs | 363 ------------------
.../TreeDataGridDemo/SongsPageViewModel.cs | 54 ---
.../TreeDataGridDemoViewModel.cs | 9 -
.../ViewModels/VariablesDemoViewModel.cs | 151 --------
demo/Semi.Avalonia.Demo/Views/MainView.axaml | 30 +-
src/Directory.Packages.props | 3 +-
.../Semi.Avalonia.ColorPicker.csproj | 6 +-
src/Semi.Avalonia/Semi.Avalonia.csproj | 7 +-
27 files changed, 57 insertions(+), 1864 deletions(-)
delete mode 100644 demo/Semi.Avalonia.Demo/Pages/DataGridDemo.axaml
delete mode 100644 demo/Semi.Avalonia.Demo/Pages/DataGridDemo.axaml.cs
delete mode 100644 demo/Semi.Avalonia.Demo/Pages/HighContrastDemo.axaml
delete mode 100644 demo/Semi.Avalonia.Demo/Pages/HighContrastDemo.axaml.cs
delete mode 100644 demo/Semi.Avalonia.Demo/Pages/TreeDataGridDemo.axaml
delete mode 100644 demo/Semi.Avalonia.Demo/Pages/TreeDataGridDemo.axaml.cs
delete mode 100644 demo/Semi.Avalonia.Demo/Pages/VariablesDemo.axaml
delete mode 100644 demo/Semi.Avalonia.Demo/Pages/VariablesDemo.axaml.cs
delete mode 100644 demo/Semi.Avalonia.Demo/Themes/FunctionalColorGroupControl.axaml
delete mode 100644 demo/Semi.Avalonia.Demo/Themes/ShadowGroupControl.axaml
delete mode 100644 demo/Semi.Avalonia.Demo/ViewModels/DataGridDemoViewModel.cs
delete mode 100644 demo/Semi.Avalonia.Demo/ViewModels/TreeDataGridDemo/FilesPageViewModel.cs
delete mode 100644 demo/Semi.Avalonia.Demo/ViewModels/TreeDataGridDemo/SongsPageViewModel.cs
delete mode 100644 demo/Semi.Avalonia.Demo/ViewModels/TreeDataGridDemo/TreeDataGridDemoViewModel.cs
delete mode 100644 demo/Semi.Avalonia.Demo/ViewModels/VariablesDemoViewModel.cs
diff --git a/demo/Directory.Packages.props b/demo/Directory.Packages.props
index 7a071fa..ef55cbc 100644
--- a/demo/Directory.Packages.props
+++ b/demo/Directory.Packages.props
@@ -1,13 +1,13 @@
true
- 11.3.11
- 11.3.11
+ 12.0.999-cibuild0061987-alpha
+ 11.3.10
3.119.1
-
+
diff --git a/demo/Semi.Avalonia.Demo.Android/MainActivity.cs b/demo/Semi.Avalonia.Demo.Android/MainActivity.cs
index 012a48d..ce98e89 100644
--- a/demo/Semi.Avalonia.Demo.Android/MainActivity.cs
+++ b/demo/Semi.Avalonia.Demo.Android/MainActivity.cs
@@ -12,7 +12,7 @@ namespace Semi.Avalonia.Demo.Android;
MainLauncher = true,
LaunchMode = LaunchMode.SingleTop,
ConfigurationChanges = ConfigChanges.Orientation | ConfigChanges.ScreenSize | ConfigChanges.UiMode)]
-public class MainActivity : AvaloniaMainActivity
+public class MainActivity : AvaloniaMainActivity
{
protected override AppBuilder CustomizeAppBuilder(AppBuilder builder)
{
diff --git a/demo/Semi.Avalonia.Demo/App.axaml b/demo/Semi.Avalonia.Demo/App.axaml
index 99f40c7..5bb5dcb 100644
--- a/demo/Semi.Avalonia.Demo/App.axaml
+++ b/demo/Semi.Avalonia.Demo/App.axaml
@@ -10,8 +10,8 @@
-
-
+
+
diff --git a/demo/Semi.Avalonia.Demo/Controls/ColorDetailControl.cs b/demo/Semi.Avalonia.Demo/Controls/ColorDetailControl.cs
index 06a2ce8..c2ac11e 100644
--- a/demo/Semi.Avalonia.Demo/Controls/ColorDetailControl.cs
+++ b/demo/Semi.Avalonia.Demo/Controls/ColorDetailControl.cs
@@ -3,6 +3,7 @@ using System.Threading.Tasks;
using Avalonia;
using Avalonia.Controls;
using Avalonia.Controls.Primitives;
+using Avalonia.Input.Platform;
using Avalonia.Media;
using Semi.Avalonia.Demo.Converters;
diff --git a/demo/Semi.Avalonia.Demo/Pages/DataGridDemo.axaml b/demo/Semi.Avalonia.Demo/Pages/DataGridDemo.axaml
deleted file mode 100644
index 8fb13a9..0000000
--- a/demo/Semi.Avalonia.Demo/Pages/DataGridDemo.axaml
+++ /dev/null
@@ -1,179 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
\ No newline at end of file
diff --git a/demo/Semi.Avalonia.Demo/Pages/DataGridDemo.axaml.cs b/demo/Semi.Avalonia.Demo/Pages/DataGridDemo.axaml.cs
deleted file mode 100644
index 6744fb7..0000000
--- a/demo/Semi.Avalonia.Demo/Pages/DataGridDemo.axaml.cs
+++ /dev/null
@@ -1,13 +0,0 @@
-using Avalonia.Controls;
-using Semi.Avalonia.Demo.ViewModels;
-
-namespace Semi.Avalonia.Demo.Pages;
-
-public partial class DataGridDemo : UserControl
-{
- public DataGridDemo()
- {
- InitializeComponent();
- DataContext = new DataGridDemoViewModel();
- }
-}
\ No newline at end of file
diff --git a/demo/Semi.Avalonia.Demo/Pages/HighContrastDemo.axaml b/demo/Semi.Avalonia.Demo/Pages/HighContrastDemo.axaml
deleted file mode 100644
index 82f2ad8..0000000
--- a/demo/Semi.Avalonia.Demo/Pages/HighContrastDemo.axaml
+++ /dev/null
@@ -1,327 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
\ No newline at end of file
diff --git a/demo/Semi.Avalonia.Demo/Pages/HighContrastDemo.axaml.cs b/demo/Semi.Avalonia.Demo/Pages/HighContrastDemo.axaml.cs
deleted file mode 100644
index 2d42757..0000000
--- a/demo/Semi.Avalonia.Demo/Pages/HighContrastDemo.axaml.cs
+++ /dev/null
@@ -1,24 +0,0 @@
-using System.Threading.Tasks;
-using Avalonia.Controls;
-using Semi.Avalonia.Demo.ViewModels;
-
-namespace Semi.Avalonia.Demo.Pages;
-
-public partial class HighContrastDemo : UserControl
-{
- public HighContrastDemo()
- {
- InitializeComponent();
- this.DataContext = new HighContrastDemoViewModel();
- }
-
- public async Task Copy(object? o)
- {
- if (o is null) return;
- var toplevel = TopLevel.GetTopLevel(this);
- if (toplevel?.Clipboard is { } c)
- {
- await c.SetTextAsync(o.ToString());
- }
- }
-}
\ No newline at end of file
diff --git a/demo/Semi.Avalonia.Demo/Pages/Overview.axaml b/demo/Semi.Avalonia.Demo/Pages/Overview.axaml
index 5ff313c..748caf9 100644
--- a/demo/Semi.Avalonia.Demo/Pages/Overview.axaml
+++ b/demo/Semi.Avalonia.Demo/Pages/Overview.axaml
@@ -353,12 +353,12 @@
-
+
@@ -368,12 +368,12 @@
-
+
@@ -383,12 +383,12 @@
-
+
@@ -398,12 +398,12 @@
-
+
@@ -413,12 +413,12 @@
-
+
@@ -428,12 +428,12 @@
-
+
@@ -443,12 +443,12 @@
-
+
diff --git a/demo/Semi.Avalonia.Demo/Pages/PaletteDemo.axaml.cs b/demo/Semi.Avalonia.Demo/Pages/PaletteDemo.axaml.cs
index 5d6be69..33b7283 100644
--- a/demo/Semi.Avalonia.Demo/Pages/PaletteDemo.axaml.cs
+++ b/demo/Semi.Avalonia.Demo/Pages/PaletteDemo.axaml.cs
@@ -1,6 +1,7 @@
using System.Threading.Tasks;
using Avalonia.Controls;
using Avalonia.Controls.Primitives;
+using Avalonia.Input.Platform;
using Avalonia.Threading;
using Semi.Avalonia.Demo.ViewModels;
diff --git a/demo/Semi.Avalonia.Demo/Pages/TreeDataGridDemo.axaml b/demo/Semi.Avalonia.Demo/Pages/TreeDataGridDemo.axaml
deleted file mode 100644
index 7ed1930..0000000
--- a/demo/Semi.Avalonia.Demo/Pages/TreeDataGridDemo.axaml
+++ /dev/null
@@ -1,126 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
\ No newline at end of file
diff --git a/demo/Semi.Avalonia.Demo/Pages/TreeDataGridDemo.axaml.cs b/demo/Semi.Avalonia.Demo/Pages/TreeDataGridDemo.axaml.cs
deleted file mode 100644
index 5c511cb..0000000
--- a/demo/Semi.Avalonia.Demo/Pages/TreeDataGridDemo.axaml.cs
+++ /dev/null
@@ -1,22 +0,0 @@
-using Avalonia.Controls;
-using Avalonia.Input;
-using Semi.Avalonia.Demo.ViewModels;
-
-namespace Semi.Avalonia.Demo.Pages;
-
-public partial class TreeDataGridDemo : UserControl
-{
- public TreeDataGridDemo()
- {
- InitializeComponent();
- this.DataContext = new TreeDataGridDemoViewModel();
- }
-
- private void SelectedPath_KeyDown(object? sender, KeyEventArgs e)
- {
- if (e.Key == Key.Enter && DataContext is TreeDataGridDemoViewModel vm)
- {
- vm.FilesContext.SelectedPath = (sender as TextBox)?.Text;
- }
- }
-}
\ No newline at end of file
diff --git a/demo/Semi.Avalonia.Demo/Pages/VariablesDemo.axaml b/demo/Semi.Avalonia.Demo/Pages/VariablesDemo.axaml
deleted file mode 100644
index a30eac7..0000000
--- a/demo/Semi.Avalonia.Demo/Pages/VariablesDemo.axaml
+++ /dev/null
@@ -1,104 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
\ No newline at end of file
diff --git a/demo/Semi.Avalonia.Demo/Pages/VariablesDemo.axaml.cs b/demo/Semi.Avalonia.Demo/Pages/VariablesDemo.axaml.cs
deleted file mode 100644
index 29521e4..0000000
--- a/demo/Semi.Avalonia.Demo/Pages/VariablesDemo.axaml.cs
+++ /dev/null
@@ -1,24 +0,0 @@
-using System.Threading.Tasks;
-using Avalonia.Controls;
-using Semi.Avalonia.Demo.ViewModels;
-
-namespace Semi.Avalonia.Demo.Pages;
-
-public partial class VariablesDemo : UserControl
-{
- public VariablesDemo()
- {
- InitializeComponent();
- this.DataContext = new VariablesDemoViewModel();
- }
-
- public async Task Copy(object? o)
- {
- if (o is null) return;
- var toplevel = TopLevel.GetTopLevel(this);
- if (toplevel?.Clipboard is { } c)
- {
- await c.SetTextAsync(o.ToString());
- }
- }
-}
\ No newline at end of file
diff --git a/demo/Semi.Avalonia.Demo/Semi.Avalonia.Demo.csproj b/demo/Semi.Avalonia.Demo/Semi.Avalonia.Demo.csproj
index bd3d1f0..ea4d27f 100644
--- a/demo/Semi.Avalonia.Demo/Semi.Avalonia.Demo.csproj
+++ b/demo/Semi.Avalonia.Demo/Semi.Avalonia.Demo.csproj
@@ -13,20 +13,23 @@
-
+
-
- None
- All
-
+
+
+
+
-
-
-
+
+
+
+
+
+
diff --git a/demo/Semi.Avalonia.Demo/Themes/FunctionalColorGroupControl.axaml b/demo/Semi.Avalonia.Demo/Themes/FunctionalColorGroupControl.axaml
deleted file mode 100644
index 1b65098..0000000
--- a/demo/Semi.Avalonia.Demo/Themes/FunctionalColorGroupControl.axaml
+++ /dev/null
@@ -1,152 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
\ No newline at end of file
diff --git a/demo/Semi.Avalonia.Demo/Themes/ShadowGroupControl.axaml b/demo/Semi.Avalonia.Demo/Themes/ShadowGroupControl.axaml
deleted file mode 100644
index 5028edf..0000000
--- a/demo/Semi.Avalonia.Demo/Themes/ShadowGroupControl.axaml
+++ /dev/null
@@ -1,110 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
\ No newline at end of file
diff --git a/demo/Semi.Avalonia.Demo/Themes/_index.axaml b/demo/Semi.Avalonia.Demo/Themes/_index.axaml
index cfccca3..c006588 100644
--- a/demo/Semi.Avalonia.Demo/Themes/_index.axaml
+++ b/demo/Semi.Avalonia.Demo/Themes/_index.axaml
@@ -2,8 +2,6 @@
-
-
\ No newline at end of file
diff --git a/demo/Semi.Avalonia.Demo/ViewModels/DataGridDemoViewModel.cs b/demo/Semi.Avalonia.Demo/ViewModels/DataGridDemoViewModel.cs
deleted file mode 100644
index eae835b..0000000
--- a/demo/Semi.Avalonia.Demo/ViewModels/DataGridDemoViewModel.cs
+++ /dev/null
@@ -1,154 +0,0 @@
-using System;
-using System.Collections.Generic;
-using System.Collections.ObjectModel;
-using System.Linq;
-using Avalonia.Collections;
-using CommunityToolkit.Mvvm.ComponentModel;
-using CommunityToolkit.Mvvm.Input;
-
-namespace Semi.Avalonia.Demo.ViewModels;
-
-public class DataGridDemoViewModel : ObservableObject
-{
- public ObservableCollection GridData1 { get; set; }
-
- public DataGridCollectionView GridData2 { get; set; }
-
- public ObservableCollection GridData3 { get; set; }
-
- public RelayCommand AddCommand { get; set; }
-
- public DataGridDemoViewModel()
- {
- GridData1 = new ObservableCollection(Song.Songs);
- GridData2 = new DataGridCollectionView(Song.Songs);
- GridData2.GroupDescriptions.Add(new DataGridPathGroupDescription("Album"));
- GridData3 = new ObservableCollection(Song.Songs.Take(10).Select(a => new SongViewModel()
- {
- Title = a.Title,
- Artist = a.Artist,
- Album = a.Album,
- CountOfComment = a.CountOfComment,
- IsSelected = false
- }));
- AddCommand = new RelayCommand(Add);
- }
-
- private void Add()
- {
- GridData3.Add(new SongViewModel());
- }
-}
-
-public class Song
-{
- public string? Title { get; set; }
- public string? Artist { get; set; }
- public TimeSpan? Duration { get; set; }
- public string? Album { get; set; }
- public int CountOfComment { get; set; }
- public string Url { get; set; }
-
- public Song(string title, string artist, int m, int s, string album, int countOfComment, int netEaseId)
- {
- Title = title;
- Artist = artist;
- Duration = new TimeSpan(0, m, s);
- Album = album;
- CountOfComment = countOfComment;
- Url = $"https://music.163.com/song?id={netEaseId}";
- }
-
- public static List Albums =>
- [
- "A.S.I.A",
- "饕餮人间",
- "七步咙咚呛",
- "大惊小怪",
- "The ONE",
- "以梦为马 (壮志骄阳版)",
- "emo了",
- "一眼万年",
- "冲刺吧",
- "爱的赏味期限",
- "COSMIC ANTHEM / 手紙",
- "世界晚安",
- "明年也要好好长大",
- "320万年前",
- "W.O.R.L.D."
- ];
-
- public static List Songs =>
- [
- new("好肚有肚(feat.李玲玉)", "熊猫堂ProducePandas", 2, 50, "A.S.I.A", 730, 1487039339),
- new("荒诞秀", "熊猫堂ProducePandas", 3, 15, "A.S.I.A", 639, 1487037601),
- new("长大", "熊猫堂ProducePandas", 4, 6, "A.S.I.A", 1114, 1487037690),
- new("招财猫(feat.纪粹希(G-Tracy))", "熊猫堂ProducePandas", 3, 37, "A.S.I.A", 361, 1487039632),
- new("千转", "熊猫堂ProducePandas", 4, 0, "A.S.I.A", 1115, 1477312398),
- new("辣辣辣", "熊猫堂ProducePandas", 3, 24, "A.S.I.A", 1873, 1465043716),
- new("碎碎念", "熊猫堂ProducePandas", 3, 25, "A.S.I.A", 676, 1474142064),
- new("盘他", "熊猫堂ProducePandas", 2, 16, "A.S.I.A", 365, 1481652786),
- new("Na Na Na", "熊猫堂ProducePandas", 3, 26, "A.S.I.A", 312, 1469022662),
- new("Indigo", "熊猫堂ProducePandas", 3, 15, "A.S.I.A", 137, 1487039517),
- new("饕餮人间", "熊猫堂ProducePandas", 3, 20, "饕餮人间", 1295, 1499584605),
- new("七步咙咚呛", "熊猫堂ProducePandas", 3, 10, "七步咙咚呛", 175, 1809095152),
- new("大惊小怪", "熊猫堂ProducePandas", 3, 32, "大惊小怪", 10420, 1847477425),
- new("工具人", "熊猫堂ProducePandas", 2, 46, "大惊小怪", 1135, 1847476499),
- new("以梦为马", "熊猫堂ProducePandas", 4, 19, "大惊小怪", 18361, 1836034373),
- new("以梦为马(Piano Version)", "熊猫堂ProducePandas", 3, 4, "大惊小怪", 570, 1847477423),
- new("The ONE", "熊猫堂ProducePandas", 2, 58, "The ONE", 1508, 1864329424),
- new("The ONE(日文版)", "熊猫堂ProducePandas", 2, 57, "The ONE", 385, 1864329429),
- new("以梦为马 (壮志骄阳版)", "熊猫堂ProducePandas", 4, 19, "以梦为马 (壮志骄阳版)", 161, 1865138896),
- new("New Horse", "熊猫堂ProducePandas", 2, 30, "emo了", 643, 1887021307),
- new("不例外", "熊猫堂ProducePandas", 3, 31, "emo了", 1818, 1887022665),
- new("满意", "熊猫堂ProducePandas", 4, 32, "emo了", 1081, 1882433472),
- new("就算与全世界为敌也要跟你在一起", "熊猫堂ProducePandas", 3, 32, "emo了", 2119, 1881759960),
- new("The ONE", "熊猫堂ProducePandas", 2, 58, "emo了", 67, 1887022648),
- new("口香糖", "熊猫堂ProducePandas", 3, 10, "emo了", 2181, 1885502254),
- new("Suuuuuuper Mario", "熊猫堂ProducePandas", 3, 32, "emo了", 1010, 1887021318),
- new("饕餮人间", "熊猫堂ProducePandas", 3, 22, "emo了", 109, 1887021320),
- new("以梦为马 (壮志骄阳版)", "熊猫堂ProducePandas", 4, 21, "emo了", 34, 1887022666),
- new("The ONE(日文版)", "熊猫堂ProducePandas", 2, 57, "emo了", 27, 1887022646),
- new("满意(DJheap九天版)", "熊猫堂ProducePandas", 4, 31, "emo了", 31, 1901605941),
- new("一眼万年", "熊猫堂ProducePandas", 3, 54, "一眼万年", 20, 1922599361),
- new("冲刺", "熊猫堂ProducePandas", 3, 49, "冲刺吧", 1006, 1932878194),
- new("滴答滴", "熊猫堂ProducePandas", 2, 30, "爱的赏味期限", 86, 1957515790),
- new("热带季风", "熊猫堂ProducePandas", 2, 45, "爱的赏味期限", 212, 1957514964),
- new("渣", "熊猫堂ProducePandas", 3, 28, "爱的赏味期限", 22, 1957514965),
- new("独特", "熊猫堂ProducePandas", 3, 33, "爱的赏味期限", 62, 1957514966),
- new("雨后", "熊猫堂ProducePandas", 4, 15, "爱的赏味期限", 23, 1957514967),
- new("然后然后", "熊猫堂ProducePandas", 3, 50, "爱的赏味期限", 108, 1957514968),
- new("丢", "熊猫堂ProducePandas", 3, 26, "爱的赏味期限", 30, 1957515792),
- new("热带疾风(FACEVOID桃心连哥 Remix)", "熊猫堂ProducePandas", 3, 23, "爱的赏味期限", 55, 1957515793),
- new("COSMIC ANTHEM -Japanese Ver.-", "熊猫堂ProducePandas", 3, 11, "COSMIC ANTHEM / 手紙", 0, 1977171493),
- new("手紙 (「長大-You Raise Me Up-」-Japanese Ver.-)", "熊猫堂ProducePandas", 4, 11, "COSMIC ANTHEM / 手紙", 0,
- 1977171494),
- new("COSMIC ANTHEM -Chinese Ver.-", "熊猫堂ProducePandas", 3, 31, "COSMIC ANTHEM / 手紙", 0, 1977172202),
- new("世界晚安", "熊猫堂ProducePandas", 2, 59, "世界晚安", 652, 1985063377),
- new("世界晚安(泰文版)", "熊猫堂ProducePandas", 2, 59, "世界晚安", 134, 1987842504),
- new("世界晚安(钢琴版)", "熊猫堂ProducePandas", 3, 2, "世界晚安", 76, 1990475933),
- new("世界晚安(泰文钢琴版)", "熊猫堂ProducePandas", 3, 2, "世界晚安", 29, 1990475934),
- new("世界晚安(DJ沈念版)", "熊猫堂ProducePandas", 3, 9, "世界晚安", 34, 2014263184),
- new("世界晚安(钢琴配乐)", "熊猫堂ProducePandas", 2, 59, "世界晚安", 11, 2014263185),
- new("明年也要好好长大", "熊猫堂ProducePandas", 3, 12, "明年也要好好长大", 0, 2010515162),
- new("320万年前(DJ沈念版)", "熊猫堂ProducePandas", 3, 21, "320万年前", 8, 2055888636),
- new("320万年前", "熊猫堂ProducePandas", 3, 7, "W.O.R.L.D.", 329, 2049770469),
- new("隐德来希", "熊猫堂ProducePandas", 3, 3, "W.O.R.L.D.", 594, 2061317924),
- new("孔明", "熊猫堂ProducePandas", 3, 59, "W.O.R.L.D.", 91, 2063175274),
- new("锦鲤卟噜噜", "熊猫堂ProducePandas", 3, 5, "W.O.R.L.D.", 67, 2059208262),
- new("指鹿为马", "熊猫堂ProducePandas", 3, 12, "W.O.R.L.D.", 74, 2063175272),
- new("热带季风Remix", "熊猫堂ProducePandas", 3, 22, "W.O.R.L.D.", 23, 2063173319),
- new("加州梦境", "熊猫堂ProducePandas", 2, 56, "W.O.R.L.D.", 1662, 2063173324),
- new("渐近自由", "熊猫堂ProducePandas", 4, 19, "W.O.R.L.D.", 124, 2063173321),
- new("世界所有的烂漫", "熊猫堂ProducePandas", 3, 30, "W.O.R.L.D.", 335, 2053388775)
- ];
-}
-
-public partial class SongViewModel : ObservableObject
-{
- [ObservableProperty] private string? _title;
- [ObservableProperty] private string? _artist;
- [ObservableProperty] private string? _album;
- [ObservableProperty] private int _countOfComment;
- [ObservableProperty] private bool? _isSelected;
-}
\ No newline at end of file
diff --git a/demo/Semi.Avalonia.Demo/ViewModels/TreeDataGridDemo/FilesPageViewModel.cs b/demo/Semi.Avalonia.Demo/ViewModels/TreeDataGridDemo/FilesPageViewModel.cs
deleted file mode 100644
index a01d430..0000000
--- a/demo/Semi.Avalonia.Demo/ViewModels/TreeDataGridDemo/FilesPageViewModel.cs
+++ /dev/null
@@ -1,363 +0,0 @@
-using System;
-using System.Collections.Generic;
-using System.Collections.ObjectModel;
-using System.ComponentModel;
-using System.Diagnostics;
-using System.IO;
-using System.Linq;
-using System.Runtime.InteropServices;
-using Avalonia.Controls;
-using Avalonia.Controls.Models.TreeDataGrid;
-using Avalonia.Controls.Selection;
-using Avalonia.Threading;
-using CommunityToolkit.Mvvm.ComponentModel;
-
-namespace Semi.Avalonia.Demo.ViewModels;
-
-public partial class FilesPageViewModel : ObservableObject
-{
- public IList Drives { get; }
- public HierarchicalTreeDataGridSource Source { get; }
- [ObservableProperty] private string _selectedDrive;
- private string? _selectedPath;
- [ObservableProperty] private FileNodeViewModel? _root;
-
- public string? SelectedPath
- {
- get => _selectedPath;
- set => SetSelectedPath(value);
- }
-
- partial void OnSelectedDriveChanged(string value)
- {
- Root = new FileNodeViewModel(value, true, true);
- if (Source is not null)
- {
- Source.Items = [Root];
- }
- }
-
- public FilesPageViewModel()
- {
- Drives = DriveInfo.GetDrives().Select(x => x.Name).ToList();
- if (RuntimeInformation.IsOSPlatform(OSPlatform.Windows))
- {
- SelectedDrive = @"C:\";
- }
- else
- {
- SelectedDrive = Drives.FirstOrDefault() ?? "/";
- }
-
- Source = new HierarchicalTreeDataGridSource([])
- {
- Columns =
- {
- new CheckBoxColumn(
- null,
- x => x.IsChecked,
- (o, v) => o.IsChecked = v,
- options: new CheckBoxColumnOptions
- {
- CanUserResizeColumn = false,
- }),
- new HierarchicalExpanderColumn(
- new TemplateColumn(
- "Name",
- "FileNameCell",
- "FileNameEditCell",
- new GridLength(1, GridUnitType.Star),
- new TemplateColumnOptions
- {
- CompareAscending = FileNodeViewModel.SortAscending(vm => vm.Name),
- CompareDescending = FileNodeViewModel.SortDescending(vm => vm.Name),
- IsTextSearchEnabled = true,
- TextSearchValueSelector = vm => vm.Name
- }),
- vm => vm.Children,
- vm => vm.HasChildren,
- vm => vm.IsExpanded),
- new TextColumn(
- "Size",
- vm => vm.Size,
- options: new TextColumnOptions
- {
- CompareAscending = FileNodeViewModel.SortAscending(x => x.Size),
- CompareDescending = FileNodeViewModel.SortDescending(x => x.Size),
- }),
- new TextColumn(
- "Modified",
- x => x.Modified,
- options: new TextColumnOptions
- {
- CompareAscending = FileNodeViewModel.SortAscending(x => x.Modified),
- CompareDescending = FileNodeViewModel.SortDescending(x => x.Modified),
- }),
- }
- };
- Source.RowSelection!.SingleSelect = false;
- Source.RowSelection.SelectionChanged += SelectionChanged;
- }
-
- private void SelectionChanged(object? sender, TreeSelectionModelSelectionChangedEventArgs e)
- {
- var selectedPath = Source.RowSelection?.SelectedItem?.Path;
- this.SetProperty(ref _selectedPath, selectedPath, nameof(SelectedPath));
-
- foreach (var i in e.DeselectedItems)
- Trace.WriteLine($"Deselected '{i?.Path}'");
- foreach (var i in e.SelectedItems)
- Trace.WriteLine($"Selected '{i?.Path}'");
- }
- private void SetSelectedPath(string? path)
- {
- if (string.IsNullOrEmpty(path))
- {
- Source.RowSelection!.Clear();
- return;
- }
-
- var components = new Stack();
- DirectoryInfo? d = null;
-
- if (File.Exists(path))
- {
- var f = new FileInfo(path);
- components.Push(f.Name);
- d = f.Directory;
- }
- else if (Directory.Exists(path))
- {
- d = new DirectoryInfo(path);
- }
-
- while (d is not null)
- {
- components.Push(d.Name);
- d = d.Parent;
- }
-
- var index = IndexPath.Unselected;
-
- if (components.Count > 0)
- {
- var drive = components.Pop();
- var driveIndex = Drives.FindIndex(x => string.Equals(x, drive, StringComparison.OrdinalIgnoreCase));
-
- if (driveIndex >= 0)
- SelectedDrive = Drives[driveIndex];
-
- var node = Root;
- index = new IndexPath(0);
-
- while (node is not null && components.Count > 0)
- {
- node.IsExpanded = true;
-
- var component = components.Pop();
- var i = node.Children.FindIndex(x => string.Equals(x.Name, component, StringComparison.OrdinalIgnoreCase));
- node = i >= 0 ? node.Children[i] : null;
- index = i >= 0 ? index.Append(i) : default;
- }
- }
-
- Source.Items = [Root!];
- Source.RowSelection!.SelectedIndex = index;
- }
-}
-
-public partial class FileNodeViewModel : ObservableObject, IEditableObject
-{
- [ObservableProperty] private string _path;
- [ObservableProperty] private string _name;
- private string? _undoName;
- [ObservableProperty] private long? _size;
- [ObservableProperty] private DateTimeOffset? _modified;
- private FileSystemWatcher? _watcher;
- private ObservableCollection? _children;
- [ObservableProperty] private bool _hasChildren = true;
- [ObservableProperty] private bool _isExpanded;
-
- public FileNodeViewModel(string path, bool isDirectory, bool isRoot = false)
- {
- Path = path;
- Name = isRoot ? path : System.IO.Path.GetFileName(Path);
- IsExpanded = isRoot;
- IsDirectory = isDirectory;
- HasChildren = isDirectory;
-
- if (!isDirectory)
- {
- var info = new FileInfo(path);
- Size = info.Length;
- Modified = info.LastWriteTimeUtc;
- }
- }
-
- public bool IsChecked { get; set; }
- public bool IsDirectory { get; }
- public IReadOnlyList Children => _children ??= LoadChildren();
-
- private ObservableCollection LoadChildren()
- {
- if (!IsDirectory)
- {
- throw new NotSupportedException();
- }
-
- var options = new EnumerationOptions { IgnoreInaccessible = true };
- var result = new ObservableCollection();
-
- foreach (var d in Directory.EnumerateDirectories(Path, "*", options))
- {
- result.Add(new FileNodeViewModel(d, true));
- }
-
- foreach (var f in Directory.EnumerateFiles(Path, "*", options))
- {
- result.Add(new FileNodeViewModel(f, false));
- }
-
- _watcher = new FileSystemWatcher
- {
- Path = Path,
- NotifyFilter = NotifyFilters.FileName | NotifyFilters.Size | NotifyFilters.LastWrite,
- };
-
- _watcher.Changed += OnChanged;
- _watcher.Created += OnCreated;
- _watcher.Deleted += OnDeleted;
- _watcher.Renamed += OnRenamed;
- _watcher.EnableRaisingEvents = true;
-
- if (result.Count == 0)
- HasChildren = false;
-
- return result;
- }
-
- public static Comparison SortAscending(Func selector)
- {
- return (x, y) =>
- {
- if (x is null && y is null)
- return 0;
- else if (x is null)
- return -1;
- else if (y is null)
- return 1;
- if (x.IsDirectory == y.IsDirectory)
- return Comparer.Default.Compare(selector(x), selector(y));
- else if (x.IsDirectory)
- return -1;
- else
- return 1;
- };
- }
-
- public static Comparison SortDescending(Func selector)
- {
- return (x, y) =>
- {
- if (x is null && y is null)
- return 0;
- else if (x is null)
- return 1;
- else if (y is null)
- return -1;
- if (x.IsDirectory == y.IsDirectory)
- return Comparer.Default.Compare(selector(y), selector(x));
- else if (x.IsDirectory)
- return -1;
- else
- return 1;
- };
- }
-
- void IEditableObject.BeginEdit() => _undoName = Name;
- void IEditableObject.CancelEdit() => Name = _undoName ?? string.Empty;
- void IEditableObject.EndEdit() => _undoName = null;
-
- private void OnChanged(object sender, FileSystemEventArgs e)
- {
- if (e.ChangeType == WatcherChangeTypes.Changed && File.Exists(e.FullPath))
- {
- Dispatcher.UIThread.Post(() =>
- {
- foreach (var child in _children!)
- {
- if (child.Path == e.FullPath)
- {
- if (!child.IsDirectory)
- {
- var info = new FileInfo(e.FullPath);
- child.Size = info.Length;
- child.Modified = info.LastWriteTimeUtc;
- }
-
- break;
- }
- }
- });
- }
- }
-
- private void OnCreated(object sender, FileSystemEventArgs e)
- {
- Dispatcher.UIThread.Post(() =>
- {
- var node = new FileNodeViewModel(
- e.FullPath,
- File.GetAttributes(e.FullPath).HasFlag(FileAttributes.Directory));
- _children!.Add(node);
- });
- }
-
- private void OnDeleted(object sender, FileSystemEventArgs e)
- {
- Dispatcher.UIThread.Post(() =>
- {
- for (var i = 0; i < _children!.Count; ++i)
- {
- if (_children[i].Path == e.FullPath)
- {
- _children.RemoveAt(i);
- Debug.WriteLine($"Removed {e.FullPath}");
- break;
- }
- }
- });
- }
-
- private void OnRenamed(object sender, RenamedEventArgs e)
- {
- Dispatcher.UIThread.Post(() =>
- {
- foreach (var child in _children!)
- {
- if (child.Path == e.OldFullPath)
- {
- child.Path = e.FullPath;
- child.Name = e.Name ?? string.Empty;
- break;
- }
- }
- });
- }
-}
-
-internal static class ListExtensions
-{
- public static int FindIndex(this IEnumerable source, Func predicate)
- {
- int i = 0;
- foreach (var item in source)
- {
- if (predicate(item))
- return i;
- i++;
- }
-
- return -1;
- }
-}
\ No newline at end of file
diff --git a/demo/Semi.Avalonia.Demo/ViewModels/TreeDataGridDemo/SongsPageViewModel.cs b/demo/Semi.Avalonia.Demo/ViewModels/TreeDataGridDemo/SongsPageViewModel.cs
deleted file mode 100644
index 79e49c0..0000000
--- a/demo/Semi.Avalonia.Demo/ViewModels/TreeDataGridDemo/SongsPageViewModel.cs
+++ /dev/null
@@ -1,54 +0,0 @@
-using System.Collections.ObjectModel;
-using System.Linq;
-using Avalonia.Controls;
-using Avalonia.Controls.Models.TreeDataGrid;
-using CommunityToolkit.Mvvm.ComponentModel;
-
-namespace Semi.Avalonia.Demo.ViewModels;
-
-public class SongsPageViewModel : ObservableObject
-{
- public FlatTreeDataGridSource Songs { get; }
-
- public SongsPageViewModel()
- {
- var songs = new ObservableCollection(Song.Songs.Select(a => new SongViewModel()
- {
- Title = a.Title,
- Artist = a.Artist,
- Album = a.Album,
- CountOfComment = a.CountOfComment,
- IsSelected = false
- }));
-
- Songs = new FlatTreeDataGridSource(songs)
- {
- Columns =
- {
- new CheckBoxColumn(
- "IsSelected",
- a => a.IsSelected,
- (model, b) => { model.IsSelected = b; },
- new GridLength(108, GridUnitType.Pixel)),
- new TextColumn(
- "Title",
- a => a.Title,
- (o, a) => o.Title = a,
- new GridLength(6, GridUnitType.Star)),
- new TextColumn("Artist",
- a => a.Artist,
- (o, a) => o.Artist = a,
- new GridLength(6, GridUnitType.Star)),
- new TemplateColumn("Album",
- "AlbumCell",
- "AlbumEditCell",
- new GridLength(6, GridUnitType.Star)),
- new TemplateColumn(
- "Comments",
- "CommentsCell",
- "CommentsEditCell",
- new GridLength(6, GridUnitType.Star)),
- }
- };
- }
-}
\ No newline at end of file
diff --git a/demo/Semi.Avalonia.Demo/ViewModels/TreeDataGridDemo/TreeDataGridDemoViewModel.cs b/demo/Semi.Avalonia.Demo/ViewModels/TreeDataGridDemo/TreeDataGridDemoViewModel.cs
deleted file mode 100644
index 69d7379..0000000
--- a/demo/Semi.Avalonia.Demo/ViewModels/TreeDataGridDemo/TreeDataGridDemoViewModel.cs
+++ /dev/null
@@ -1,9 +0,0 @@
-using CommunityToolkit.Mvvm.ComponentModel;
-
-namespace Semi.Avalonia.Demo.ViewModels;
-
-public class TreeDataGridDemoViewModel : ObservableObject
-{
- public SongsPageViewModel SongsContext { get; } = new();
- public FilesPageViewModel FilesContext { get; } = new();
-}
\ No newline at end of file
diff --git a/demo/Semi.Avalonia.Demo/ViewModels/VariablesDemoViewModel.cs b/demo/Semi.Avalonia.Demo/ViewModels/VariablesDemoViewModel.cs
deleted file mode 100644
index 639d02c..0000000
--- a/demo/Semi.Avalonia.Demo/ViewModels/VariablesDemoViewModel.cs
+++ /dev/null
@@ -1,151 +0,0 @@
-using System;
-using System.Collections.Generic;
-using System.Globalization;
-using Avalonia;
-using Avalonia.Collections;
-using Avalonia.Controls;
-using Avalonia.Media;
-using CommunityToolkit.Mvvm.ComponentModel;
-using Semi.Avalonia.Tokens;
-
-namespace Semi.Avalonia.Demo.ViewModels;
-
-public partial class VariablesDemoViewModel : ObservableObject
-{
- public DataGridCollectionView GridData { get; set; }
- [ObservableProperty] private string _searchText = string.Empty;
-
- public VariablesDemoViewModel()
- {
- IResourceDictionary dictionary = new Variables();
- foreach (var token in Tokens)
- {
- if (token.ResourceKey is not null && dictionary.TryGetValue(token.ResourceKey, out var value))
- {
- token.Type = value?.GetType();
- token.Value = GetValueString(value);
- }
- }
-
- GridData = new DataGridCollectionView(Tokens);
- GridData.GroupDescriptions.Add(new DataGridPathGroupDescription(nameof(VariableItem.Category)));
- }
-
- private static string? GetValueString(object? value)
- {
- if (value is null) return string.Empty;
-
- return value switch
- {
- double d => d.ToString(CultureInfo.InvariantCulture),
- CornerRadius c => c.IsUniform ? $"{c.TopLeft}" : c.ToString(),
- Thickness t => t.IsUniform ? $"{t.Left}" : t.ToString(),
- FontWeight fontWeight => Convert.ToInt32(fontWeight).ToString(),
- FontFamily fontFamily => fontFamily.FamilyNames.ToString(),
- _ => value.ToString()
- };
- }
-
- partial void OnSearchTextChanged(string value)
- {
- if (string.IsNullOrWhiteSpace(value))
- {
- GridData.Filter = _ => true;
- GridData.Refresh();
- return;
- }
-
- var search = value.Trim();
- GridData.Filter = item =>
- {
- if (item is not VariableItem variableItem) return false;
- return (variableItem.Category?.Contains(search, StringComparison.InvariantCultureIgnoreCase) ?? false) ||
- (variableItem.ResourceKey?.Contains(search, StringComparison.InvariantCultureIgnoreCase) ?? false) ||
- (variableItem.Value?.Contains(search, StringComparison.InvariantCultureIgnoreCase) ?? false) ||
- (variableItem.Type?.Name.Contains(search, StringComparison.InvariantCultureIgnoreCase) ?? false) ||
- (variableItem.Description?.Contains(search, StringComparison.InvariantCultureIgnoreCase) ?? false);
- };
- GridData.Refresh();
- }
-
- private static List Tokens { get; set; } =
- [
- new("Height", "SemiHeightControlSmall"),
- new("Height", "SemiHeightControlDefault"),
- new("Height", "SemiHeightControlLarge"),
- new("Icon Size", "SemiWidthIconExtraSmall"),
- new("Icon Size", "SemiWidthIconSmall"),
- new("Icon Size", "SemiWidthIconMedium"),
- new("Icon Size", "SemiWidthIconLarge"),
- new("Icon Size", "SemiWidthIconExtraLarge"),
- new("Border CornerRadius Spacing", "SemiBorderRadiusSpacingExtraSmall"),
- new("Border CornerRadius Spacing", "SemiBorderRadiusSpacingSmall"),
- new("Border CornerRadius Spacing", "SemiBorderRadiusSpacingMedium"),
- new("Border CornerRadius Spacing", "SemiBorderRadiusSpacingLarge"),
- new("Border CornerRadius Spacing", "SemiBorderRadiusSpacingFull"),
- new("Border CornerRadius", "SemiBorderRadiusExtraSmall"),
- new("Border CornerRadius", "SemiBorderRadiusSmall"),
- new("Border CornerRadius", "SemiBorderRadiusMedium"),
- new("Border CornerRadius", "SemiBorderRadiusLarge"),
- new("Border CornerRadius", "SemiBorderRadiusFull"),
- new("Border Spacing", "SemiBorderSpacing"),
- new("Border Spacing", "SemiBorderSpacingControl"),
- new("Border Spacing", "SemiBorderSpacingControlFocus"),
- new("Border Thickness", "SemiBorderThickness"),
- new("Border Thickness", "SemiBorderThicknessControl"),
- new("Border Thickness", "SemiBorderThicknessControlFocus"),
- new("Spacing", "SemiSpacingNone"),
- new("Spacing", "SemiSpacingSuperTight"),
- new("Spacing", "SemiSpacingExtraTight"),
- new("Spacing", "SemiSpacingTight"),
- new("Spacing", "SemiSpacingBaseTight"),
- new("Spacing", "SemiSpacingBase"),
- new("Spacing", "SemiSpacingBaseLoose"),
- new("Spacing", "SemiSpacingLoose"),
- new("Spacing", "SemiSpacingExtraLoose"),
- new("Spacing", "SemiSpacingSuperLoose"),
- new("Thickness", "SemiThicknessNone"),
- new("Thickness", "SemiThicknessSuperTight"),
- new("Thickness", "SemiThicknessExtraTight"),
- new("Thickness", "SemiThicknessTight"),
- new("Thickness", "SemiThicknessBaseTight"),
- new("Thickness", "SemiThicknessBase"),
- new("Thickness", "SemiThicknessBaseLoose"),
- new("Thickness", "SemiThicknessLoose"),
- new("Thickness", "SemiThicknessExtraLoose"),
- new("Thickness", "SemiThicknessSuperLoose"),
- new("FontSize", "SemiFontSizeSmall"),
- new("FontSize", "SemiFontSizeRegular"),
- new("FontSize", "SemiFontSizeHeader6"),
- new("FontSize", "SemiFontSizeHeader5"),
- new("FontSize", "SemiFontSizeHeader4"),
- new("FontSize", "SemiFontSizeHeader3"),
- new("FontSize", "SemiFontSizeHeader2"),
- new("FontSize", "SemiFontSizeHeader1"),
- new("FontWeight", "SemiFontWeightLight"),
- new("FontWeight", "SemiFontWeightRegular"),
- new("FontWeight", "SemiFontWeightBold"),
- new("FontFamily", "SemiFontFamilyRegular"),
- ];
-}
-
-public class VariableItem()
-{
- public string? Category { get; set; }
- public string? ResourceKey { get; set; }
- public Type? Type { get; set; }
- public string? Value { get; set; }
- public string? Description { get; set; }
-
- public VariableItem(string category, string resourceKey, string description = "") : this()
- {
- Category = category;
- ResourceKey = resourceKey;
- Description = description;
- }
-
- public string CopyText =>
- $"""
-
- """;
-}
\ No newline at end of file
diff --git a/demo/Semi.Avalonia.Demo/Views/MainView.axaml b/demo/Semi.Avalonia.Demo/Views/MainView.axaml
index fa86d0c..76bc227 100644
--- a/demo/Semi.Avalonia.Demo/Views/MainView.axaml
+++ b/demo/Semi.Avalonia.Demo/Views/MainView.axaml
@@ -116,15 +116,15 @@
-
-
-
-
-
-
-
-
-
+
+
+
+
+
+
+
+
+
@@ -134,12 +134,12 @@
-
-
-
-
-
-
+
+
+
+
+
+
diff --git a/src/Directory.Packages.props b/src/Directory.Packages.props
index 50a3aee..7b61b49 100644
--- a/src/Directory.Packages.props
+++ b/src/Directory.Packages.props
@@ -1,7 +1,7 @@
true
- 11.3.7
+ 12.0.999-cibuild0061987-alpha
11.3.7
@@ -9,5 +9,6 @@
+
\ No newline at end of file
diff --git a/src/Semi.Avalonia.ColorPicker/Semi.Avalonia.ColorPicker.csproj b/src/Semi.Avalonia.ColorPicker/Semi.Avalonia.ColorPicker.csproj
index f4fd43e..291d258 100644
--- a/src/Semi.Avalonia.ColorPicker/Semi.Avalonia.ColorPicker.csproj
+++ b/src/Semi.Avalonia.ColorPicker/Semi.Avalonia.ColorPicker.csproj
@@ -1,9 +1,9 @@
- netstandard2.0;net6.0;net8.0
- 11.3.7.3
- Update to Semi.Avalonia.ColorPicker 11.3.7.3
+ net8.0
+ 11.3.7.2
+ Update to Semi.Avalonia.ColorPicker 11.3.7.2
Semi.Avalonia.ColorPicker
diff --git a/src/Semi.Avalonia/Semi.Avalonia.csproj b/src/Semi.Avalonia/Semi.Avalonia.csproj
index 0d2607e..9121840 100644
--- a/src/Semi.Avalonia/Semi.Avalonia.csproj
+++ b/src/Semi.Avalonia/Semi.Avalonia.csproj
@@ -1,14 +1,15 @@
- netstandard2.0;net6.0;net8.0
- 11.3.7.3
- Update to Semi.Avalonia 11.3.7.3
+ net8.0
+ 11.3.7.2
+ Update to Semi.Avalonia 11.3.7.2
Semi.Avalonia
+
From 8f24b2f332f1ef8283228bdce3e3ebfc7be94988 Mon Sep 17 00:00:00 2001
From: Zhang Dian <54255897+zdpcdt@users.noreply.github.com>
Date: Tue, 2 Sep 2025 16:19:00 +0800
Subject: [PATCH 02/45] feat: add GroupBox.
---
.../Pages/HeaderedContentControlDemo.axaml | 16 +++++++++++++---
src/Semi.Avalonia/Controls/GroupBox.axaml | 6 ++++++
.../Controls/HeaderedContentControl.axaml | 6 +++---
src/Semi.Avalonia/Controls/_index.axaml | 1 +
4 files changed, 23 insertions(+), 6 deletions(-)
create mode 100644 src/Semi.Avalonia/Controls/GroupBox.axaml
diff --git a/demo/Semi.Avalonia.Demo/Pages/HeaderedContentControlDemo.axaml b/demo/Semi.Avalonia.Demo/Pages/HeaderedContentControlDemo.axaml
index b778b13..59baf5e 100644
--- a/demo/Semi.Avalonia.Demo/Pages/HeaderedContentControlDemo.axaml
+++ b/demo/Semi.Avalonia.Demo/Pages/HeaderedContentControlDemo.axaml
@@ -36,10 +36,20 @@
-
-
-
+
+ Real GroupBox
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/src/Semi.Avalonia/Controls/GroupBox.axaml b/src/Semi.Avalonia/Controls/GroupBox.axaml
new file mode 100644
index 0000000..97cb4d2
--- /dev/null
+++ b/src/Semi.Avalonia/Controls/GroupBox.axaml
@@ -0,0 +1,6 @@
+
+
+
\ No newline at end of file
diff --git a/src/Semi.Avalonia/Controls/HeaderedContentControl.axaml b/src/Semi.Avalonia/Controls/HeaderedContentControl.axaml
index 66b2bfd..1a28f09 100644
--- a/src/Semi.Avalonia/Controls/HeaderedContentControl.axaml
+++ b/src/Semi.Avalonia/Controls/HeaderedContentControl.axaml
@@ -1,7 +1,8 @@
+ xmlns:iri="https://irihi.tech/shared"
+ x:CompileBindings="True">
-
@@ -97,7 +97,7 @@
Name="SeparatorBorder"
Grid.Row="1"
BorderBrush="{TemplateBinding BorderBrush}"
- BorderThickness="{TemplateBinding BorderThickness, Converter={StaticResource SeparatorBorderMultiplier}}">
+ BorderThickness="{TemplateBinding BorderThickness, Converter={iri:ThicknessMixerConverter Top}}">
diff --git a/src/Semi.Avalonia/Controls/_index.axaml b/src/Semi.Avalonia/Controls/_index.axaml
index 084607d..66ee144 100644
--- a/src/Semi.Avalonia/Controls/_index.axaml
+++ b/src/Semi.Avalonia/Controls/_index.axaml
@@ -22,6 +22,7 @@
+
From f819531465f437152f52d4aedf6f33786afb5282 Mon Sep 17 00:00:00 2001
From: Zhang Dian <54255897+zdpcdt@users.noreply.github.com>
Date: Wed, 3 Sep 2025 21:53:29 +0800
Subject: [PATCH 03/45] feat: colorpicker reference Shared package.
---
.../Controls/ColorPicker.axaml | 9 +++++----
.../Controls/ColorPreviewer.axaml | 11 +++++------
.../Semi.Avalonia.ColorPicker.csproj | 1 +
3 files changed, 11 insertions(+), 10 deletions(-)
diff --git a/src/Semi.Avalonia.ColorPicker/Controls/ColorPicker.axaml b/src/Semi.Avalonia.ColorPicker/Controls/ColorPicker.axaml
index 003654c..dae6cd0 100644
--- a/src/Semi.Avalonia.ColorPicker/Controls/ColorPicker.axaml
+++ b/src/Semi.Avalonia.ColorPicker/Controls/ColorPicker.axaml
@@ -1,8 +1,9 @@
-
+ xmlns:iri="https://irihi.tech/shared"
+ xmlns:converters="using:Avalonia.Controls.Converters"
+ x:CompileBindings="True">
@@ -16,11 +17,11 @@
+ CornerRadius="{TemplateBinding CornerRadius, Converter={iri:CornerRadiusMixerConverter Left}}" />
+ CornerRadius="{TemplateBinding CornerRadius, Converter={iri:CornerRadiusMixerConverter Left}}" />
diff --git a/src/Semi.Avalonia.ColorPicker/Controls/ColorPreviewer.axaml b/src/Semi.Avalonia.ColorPicker/Controls/ColorPreviewer.axaml
index cf2c3d8..3f49275 100644
--- a/src/Semi.Avalonia.ColorPicker/Controls/ColorPreviewer.axaml
+++ b/src/Semi.Avalonia.ColorPicker/Controls/ColorPreviewer.axaml
@@ -1,11 +1,10 @@
+ xmlns:iri="https://irihi.tech/shared"
+ xmlns:pc="using:Avalonia.Controls.Primitives.Converters"
+ x:CompileBindings="True">
-
-
@@ -34,7 +33,7 @@
Background="{TemplateBinding HsvColor,
Converter={StaticResource AccentColorConverter},
ConverterParameter='-2'}"
- CornerRadius="{TemplateBinding CornerRadius,Converter={StaticResource LeftCornerRadiusFilterConverter}}"
+ CornerRadius="{TemplateBinding CornerRadius,Converter={iri:CornerRadiusMixerConverter Left}}"
Tag="-2" />
diff --git a/src/Semi.Avalonia.ColorPicker/Semi.Avalonia.ColorPicker.csproj b/src/Semi.Avalonia.ColorPicker/Semi.Avalonia.ColorPicker.csproj
index 291d258..ae5e319 100644
--- a/src/Semi.Avalonia.ColorPicker/Semi.Avalonia.ColorPicker.csproj
+++ b/src/Semi.Avalonia.ColorPicker/Semi.Avalonia.ColorPicker.csproj
@@ -8,6 +8,7 @@
+
From 5ea42844eaa0e349ec874d1077878956bccce782 Mon Sep 17 00:00:00 2001
From: Zhang Dian <54255897+zdpcdt@users.noreply.github.com>
Date: Wed, 3 Sep 2025 21:56:24 +0800
Subject: [PATCH 04/45] misc: using AvaloniaUseCompiledBindingsByDefault.
---
src/Directory.Build.props | 3 +++
src/Semi.Avalonia.ColorPicker/Controls/ColorPicker.axaml | 3 +--
src/Semi.Avalonia.ColorPicker/Controls/ColorPreviewer.axaml | 3 +--
src/Semi.Avalonia/Controls/GroupBox.axaml | 3 +--
src/Semi.Avalonia/Controls/HeaderedContentControl.axaml | 3 +--
src/Semi.Avalonia/Controls/SplitView.axaml | 5 ++++-
6 files changed, 11 insertions(+), 9 deletions(-)
diff --git a/src/Directory.Build.props b/src/Directory.Build.props
index 2c002a3..f607e54 100644
--- a/src/Directory.Build.props
+++ b/src/Directory.Build.props
@@ -16,6 +16,9 @@
https://github.com/irihitech/Semi.Avalonia
MIT
irihi.png
+ https://github.com/irihitech/Semi.Avalonia
+ 12.0.999-cibuild0058575-alpha
+ true
README.md
diff --git a/src/Semi.Avalonia.ColorPicker/Controls/ColorPicker.axaml b/src/Semi.Avalonia.ColorPicker/Controls/ColorPicker.axaml
index dae6cd0..5e6dbdc 100644
--- a/src/Semi.Avalonia.ColorPicker/Controls/ColorPicker.axaml
+++ b/src/Semi.Avalonia.ColorPicker/Controls/ColorPicker.axaml
@@ -2,8 +2,7 @@
xmlns="https://github.com/avaloniaui"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:iri="https://irihi.tech/shared"
- xmlns:converters="using:Avalonia.Controls.Converters"
- x:CompileBindings="True">
+ xmlns:converters="using:Avalonia.Controls.Converters">
diff --git a/src/Semi.Avalonia.ColorPicker/Controls/ColorPreviewer.axaml b/src/Semi.Avalonia.ColorPicker/Controls/ColorPreviewer.axaml
index 3f49275..f554485 100644
--- a/src/Semi.Avalonia.ColorPicker/Controls/ColorPreviewer.axaml
+++ b/src/Semi.Avalonia.ColorPicker/Controls/ColorPreviewer.axaml
@@ -2,8 +2,7 @@
xmlns="https://github.com/avaloniaui"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:iri="https://irihi.tech/shared"
- xmlns:pc="using:Avalonia.Controls.Primitives.Converters"
- x:CompileBindings="True">
+ xmlns:pc="using:Avalonia.Controls.Primitives.Converters">
diff --git a/src/Semi.Avalonia/Controls/GroupBox.axaml b/src/Semi.Avalonia/Controls/GroupBox.axaml
index 97cb4d2..c6aff27 100644
--- a/src/Semi.Avalonia/Controls/GroupBox.axaml
+++ b/src/Semi.Avalonia/Controls/GroupBox.axaml
@@ -1,6 +1,5 @@
+ xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml">
\ No newline at end of file
diff --git a/src/Semi.Avalonia/Controls/HeaderedContentControl.axaml b/src/Semi.Avalonia/Controls/HeaderedContentControl.axaml
index 1a28f09..a401127 100644
--- a/src/Semi.Avalonia/Controls/HeaderedContentControl.axaml
+++ b/src/Semi.Avalonia/Controls/HeaderedContentControl.axaml
@@ -1,8 +1,7 @@
+ xmlns:iri="https://irihi.tech/shared">
+
From 2b867f9c6ff730111bb76fedc64727454d801520 Mon Sep 17 00:00:00 2001
From: Zhang Dian <54255897+zdpcdt@users.noreply.github.com>
Date: Thu, 4 Sep 2025 10:56:03 +0800
Subject: [PATCH 05/45] misc: remove useless theme.
---
src/Semi.Avalonia/Controls/ScrollViewer.axaml | 3 +--
1 file changed, 1 insertion(+), 2 deletions(-)
diff --git a/src/Semi.Avalonia/Controls/ScrollViewer.axaml b/src/Semi.Avalonia/Controls/ScrollViewer.axaml
index dce99ea..69a2217 100644
--- a/src/Semi.Avalonia/Controls/ScrollViewer.axaml
+++ b/src/Semi.Avalonia/Controls/ScrollViewer.axaml
@@ -1,7 +1,6 @@
+ xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml">
From 1d9fe693a329259828b36b556e3f34f21ed245b2 Mon Sep 17 00:00:00 2001
From: Zhang Dian <54255897+zdpcdt@users.noreply.github.com>
Date: Thu, 4 Sep 2025 21:06:44 +0800
Subject: [PATCH 06/45] misc: add SemiBorderRadiusSpacingExtraSmall for tokens.
---
src/Semi.Avalonia/Tokens/Variables.axaml | 4 ++--
1 file changed, 2 insertions(+), 2 deletions(-)
diff --git a/src/Semi.Avalonia/Tokens/Variables.axaml b/src/Semi.Avalonia/Tokens/Variables.axaml
index 8c7ff30..5b9144e 100644
--- a/src/Semi.Avalonia/Tokens/Variables.axaml
+++ b/src/Semi.Avalonia/Tokens/Variables.axaml
@@ -19,8 +19,8 @@
0
1
1
- 3
- 3
+ 3
+ 3
6
12
9999
From 5ea834d57ee0a67731f9410fe0d3b3015a50640c Mon Sep 17 00:00:00 2001
From: Zhang Dian <54255897+zdpcdt@users.noreply.github.com>
Date: Fri, 6 Feb 2026 21:50:08 +0800
Subject: [PATCH 07/45] chore: fix conflict typos.
---
src/Directory.Build.props | 2 --
src/Semi.Avalonia/Tokens/Variables.axaml | 4 ++--
2 files changed, 2 insertions(+), 4 deletions(-)
diff --git a/src/Directory.Build.props b/src/Directory.Build.props
index f607e54..2c2797f 100644
--- a/src/Directory.Build.props
+++ b/src/Directory.Build.props
@@ -17,8 +17,6 @@
MIT
irihi.png
https://github.com/irihitech/Semi.Avalonia
- 12.0.999-cibuild0058575-alpha
- true
README.md
diff --git a/src/Semi.Avalonia/Tokens/Variables.axaml b/src/Semi.Avalonia/Tokens/Variables.axaml
index 5b9144e..8c7ff30 100644
--- a/src/Semi.Avalonia/Tokens/Variables.axaml
+++ b/src/Semi.Avalonia/Tokens/Variables.axaml
@@ -19,8 +19,8 @@
0
1
1
- 3
- 3
+ 3
+ 3
6
12
9999
From 3a6452cccd08c2ec44c720de59cbebd62cf3226f Mon Sep 17 00:00:00 2001
From: Zhang Dian <54255897+zdpcdt@users.noreply.github.com>
Date: Fri, 6 Feb 2026 23:09:13 +0800
Subject: [PATCH 08/45] misc: update XML namespace references and converters in
XAML files. (#726)
---
.../Animations/SemiPopupAnimations.axaml | 4 +-
src/Semi.Avalonia/Controls/Carousel.axaml | 10 +--
.../Controls/ManagedFileChooser.axaml | 10 +--
src/Semi.Avalonia/Controls/ProgressBar.axaml | 14 ++---
src/Semi.Avalonia/Controls/TreeView.axaml | 2 +-
.../Converters/KeyToPathConverter.cs | 26 --------
...acementToRenderTransformOriginConverter.cs | 62 +++++++------------
.../Converters/PositionToAngleConverter.cs | 21 ++-----
.../Converters/TreeViewItemIndentConverter.cs | 22 -------
src/Semi.Avalonia/Properties/AssemblyInfo.cs | 5 +-
10 files changed, 48 insertions(+), 128 deletions(-)
delete mode 100644 src/Semi.Avalonia/Converters/KeyToPathConverter.cs
delete mode 100644 src/Semi.Avalonia/Converters/TreeViewItemIndentConverter.cs
diff --git a/src/Semi.Avalonia/Animations/SemiPopupAnimations.axaml b/src/Semi.Avalonia/Animations/SemiPopupAnimations.axaml
index 21c6443..d3b4034 100644
--- a/src/Semi.Avalonia/Animations/SemiPopupAnimations.axaml
+++ b/src/Semi.Avalonia/Animations/SemiPopupAnimations.axaml
@@ -2,9 +2,9 @@
x:Class="Semi.Avalonia.SemiPopupAnimations"
xmlns="https://github.com/avaloniaui"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
- xmlns:converters="clr-namespace:Semi.Avalonia.Converters">
+ xmlns:semi="https://irihi.tech/semi">
-
-
@@ -365,8 +363,7 @@
StrokeJoin="Round"
StrokeLineCap="Round"
StrokeThickness="{Binding BorderThickness.Left, RelativeSource={RelativeSource TemplatedParent}}"
- SweepAngle="{TemplateBinding Percentage,
- Converter={StaticResource AngleConverter}}" />
+ SweepAngle="{TemplateBinding Percentage,Converter={semi:PositionToAngleConverter}}" />
+ SweepAngle="{TemplateBinding Percentage,Converter={semi:PositionToAngleConverter}}" />
-
+
\ No newline at end of file
diff --git a/src/Semi.Avalonia/Controls/TreeView.axaml b/src/Semi.Avalonia/Controls/TreeView.axaml
index 11488a8..c086004 100644
--- a/src/Semi.Avalonia/Controls/TreeView.axaml
+++ b/src/Semi.Avalonia/Controls/TreeView.axaml
@@ -1,7 +1,7 @@
+ xmlns:converters="using:Avalonia.Controls.Converters">
Resources { get; } = new Dictionary();
-
- public object? Convert(object? value, Type targetType, object? parameter, CultureInfo culture)
- {
- if(value is string s && Resources.TryGetValue(s, out var v))
- return v;
- return AvaloniaProperty.UnsetValue;
- }
-
- public object? ConvertBack(object? value, Type targetType, object? parameter, CultureInfo culture)
- {
- throw new NotImplementedException();
- }
-}
\ No newline at end of file
diff --git a/src/Semi.Avalonia/Converters/PlacementToRenderTransformOriginConverter.cs b/src/Semi.Avalonia/Converters/PlacementToRenderTransformOriginConverter.cs
index a370678..d93fc7c 100644
--- a/src/Semi.Avalonia/Converters/PlacementToRenderTransformOriginConverter.cs
+++ b/src/Semi.Avalonia/Converters/PlacementToRenderTransformOriginConverter.cs
@@ -2,56 +2,36 @@ using System;
using System.Globalization;
using Avalonia;
using Avalonia.Controls;
-using Avalonia.Data.Converters;
+using Irihi.Avalonia.Shared.Converters;
namespace Semi.Avalonia.Converters;
-public class PlacementToRenderTransformOriginConverter: IValueConverter
+public class PlacementToRenderTransformOriginConverter : MarkupValueConverter
{
- public static PlacementToRenderTransformOriginConverter Instance { get; } = new PlacementToRenderTransformOriginConverter();
- public object? Convert(object? value, Type targetType, object? parameter, CultureInfo culture)
+ public override object? Convert(object? value, Type targetType, object? parameter, CultureInfo culture)
{
if (value is not PlacementMode p)
{
return new RelativePoint(0.5, 0.5, RelativeUnit.Relative);
}
- switch (p)
- {
- case PlacementMode.Bottom:
- return new RelativePoint(0.5, 0.0, RelativeUnit.Relative);
- case PlacementMode.Left:
- return new RelativePoint(1.0, 0.5, RelativeUnit.Relative);
- case PlacementMode.Right:
- return new RelativePoint(0.0, 0.5, RelativeUnit.Relative);
- case PlacementMode.Top:
- return new RelativePoint(0.5, 1.0, RelativeUnit.Relative);
- case PlacementMode.Pointer:
- return new RelativePoint(0.0, 0.0, RelativeUnit.Relative);
- case PlacementMode.Center:
- case PlacementMode.AnchorAndGravity:
- return new RelativePoint(0.5, 0.5, RelativeUnit.Relative);
- case PlacementMode.BottomEdgeAlignedLeft:
- return new RelativePoint(0.0, 0.0, RelativeUnit.Relative);
- case PlacementMode.BottomEdgeAlignedRight:
- return new RelativePoint(1.0, 0.0, RelativeUnit.Relative);
- case PlacementMode.LeftEdgeAlignedTop:
- return new RelativePoint(1.0, 1.0, RelativeUnit.Relative);
- case PlacementMode.LeftEdgeAlignedBottom:
- return new RelativePoint(1.0, 0.0, RelativeUnit.Relative);
- case PlacementMode.RightEdgeAlignedTop:
- return new RelativePoint(0.0, 1.0, RelativeUnit.Relative);
- case PlacementMode.RightEdgeAlignedBottom:
- return new RelativePoint(0.0, 0.0, RelativeUnit.Relative);
- case PlacementMode.TopEdgeAlignedLeft:
- return new RelativePoint(0.0, 1.0, RelativeUnit.Relative);
- case PlacementMode.TopEdgeAlignedRight:
- return new RelativePoint(1.0, 1.0, RelativeUnit.Relative);
- }
- return new RelativePoint(0.5, 0.5, RelativeUnit.Relative);
- }
- public object? ConvertBack(object? value, Type targetType, object? parameter, CultureInfo culture)
- {
- throw new NotImplementedException();
+ return p switch
+ {
+ PlacementMode.Bottom => new RelativePoint(0.5, 0.0, RelativeUnit.Relative),
+ PlacementMode.Left => new RelativePoint(1.0, 0.5, RelativeUnit.Relative),
+ PlacementMode.Right => new RelativePoint(0.0, 0.5, RelativeUnit.Relative),
+ PlacementMode.Top => new RelativePoint(0.5, 1.0, RelativeUnit.Relative),
+ PlacementMode.Pointer => new RelativePoint(0.0, 0.0, RelativeUnit.Relative),
+ PlacementMode.Center or PlacementMode.AnchorAndGravity => new RelativePoint(0.5, 0.5, RelativeUnit.Relative),
+ PlacementMode.BottomEdgeAlignedLeft => new RelativePoint(0.0, 0.0, RelativeUnit.Relative),
+ PlacementMode.BottomEdgeAlignedRight => new RelativePoint(1.0, 0.0, RelativeUnit.Relative),
+ PlacementMode.LeftEdgeAlignedTop => new RelativePoint(1.0, 1.0, RelativeUnit.Relative),
+ PlacementMode.LeftEdgeAlignedBottom => new RelativePoint(1.0, 0.0, RelativeUnit.Relative),
+ PlacementMode.RightEdgeAlignedTop => new RelativePoint(0.0, 1.0, RelativeUnit.Relative),
+ PlacementMode.RightEdgeAlignedBottom => new RelativePoint(0.0, 0.0, RelativeUnit.Relative),
+ PlacementMode.TopEdgeAlignedLeft => new RelativePoint(0.0, 1.0, RelativeUnit.Relative),
+ PlacementMode.TopEdgeAlignedRight => new RelativePoint(1.0, 1.0, RelativeUnit.Relative),
+ _ => new RelativePoint(0.5, 0.5, RelativeUnit.Relative)
+ };
}
}
\ No newline at end of file
diff --git a/src/Semi.Avalonia/Converters/PositionToAngleConverter.cs b/src/Semi.Avalonia/Converters/PositionToAngleConverter.cs
index 1fd9f7a..a769907 100644
--- a/src/Semi.Avalonia/Converters/PositionToAngleConverter.cs
+++ b/src/Semi.Avalonia/Converters/PositionToAngleConverter.cs
@@ -1,27 +1,18 @@
using System;
using System.Globalization;
-using Avalonia.Data.Converters;
+using Irihi.Avalonia.Shared.Converters;
namespace Semi.Avalonia.Converters;
-public class PositionToAngleConverter: IValueConverter
+public class PositionToAngleConverter : MarkupValueConverter
{
- public object? Convert(object? value, Type targetType, object? parameter, CultureInfo culture)
+ public override object? Convert(object? value, Type targetType, object? parameter, CultureInfo culture)
{
- if (value is double d)
- {
- return d * 3.6;
- }
-
- return 0;
+ return value is double d ? d * 3.6 : 0;
}
- public object? ConvertBack(object? value, Type targetType, object? parameter, CultureInfo culture)
+ public override object? ConvertBack(object? value, Type targetType, object? parameter, CultureInfo culture)
{
- if (value is double d)
- {
- return d / 3.6;
- }
- return 0;
+ return value is double d ? d / 3.6 : 0;
}
}
\ No newline at end of file
diff --git a/src/Semi.Avalonia/Converters/TreeViewItemIndentConverter.cs b/src/Semi.Avalonia/Converters/TreeViewItemIndentConverter.cs
deleted file mode 100644
index e448131..0000000
--- a/src/Semi.Avalonia/Converters/TreeViewItemIndentConverter.cs
+++ /dev/null
@@ -1,22 +0,0 @@
-using System;
-using System.Collections.Generic;
-using System.Globalization;
-using Avalonia;
-using Avalonia.Data.Converters;
-
-namespace Semi.Avalonia.Converters;
-
-public class TreeViewItemIndentConverter : IMultiValueConverter
-{
- public static readonly TreeViewItemIndentConverter Instance = new();
-
- public object? Convert(IList
diff --git a/demo/Semi.Avalonia.Demo/Pages/TextBoxDemo.axaml b/demo/Semi.Avalonia.Demo/Pages/TextBoxDemo.axaml
index 2ba6d0b..5fc0ae7 100644
--- a/demo/Semi.Avalonia.Demo/Pages/TextBoxDemo.axaml
+++ b/demo/Semi.Avalonia.Demo/Pages/TextBoxDemo.axaml
@@ -23,36 +23,36 @@
+ PlaceholderText="Large" />
+ PlaceholderText="Default" />
+ PlaceholderText="Small" />
+ PlaceholderText="Disabled" />
+ PlaceholderText="Bordered" />
-
+
diff --git a/src/Semi.Avalonia/Controls/AutoCompleteBox.axaml b/src/Semi.Avalonia/Controls/AutoCompleteBox.axaml
index d77f4e3..6a419b9 100644
--- a/src/Semi.Avalonia/Controls/AutoCompleteBox.axaml
+++ b/src/Semi.Avalonia/Controls/AutoCompleteBox.axaml
@@ -4,11 +4,12 @@
-
+
+
@@ -24,7 +25,8 @@
Theme="{DynamicResource NonErrorTextBox}"
InnerLeftContent="{TemplateBinding InnerLeftContent}"
InnerRightContent="{TemplateBinding InnerRightContent}"
- Watermark="{TemplateBinding Watermark}" />
+ PlaceholderForeground="{TemplateBinding PlaceholderForeground}"
+ PlaceholderText="{TemplateBinding PlaceholderText}" />
+ PlaceholderForeground="{TemplateBinding PlaceholderForeground}"
+ PlaceholderText="{TemplateBinding PlaceholderText}" />
+
@@ -52,8 +53,9 @@
CornerRadius="{TemplateBinding CornerRadius}"
Foreground="{TemplateBinding Foreground}"
Theme="{DynamicResource NonErrorTextBox}"
- UseFloatingWatermark="{TemplateBinding UseFloatingWatermark}"
- Watermark="{TemplateBinding Watermark}">
+ UseFloatingPlaceholder="{TemplateBinding UseFloatingPlaceholder}"
+ PlaceholderForeground="{TemplateBinding PlaceholderForeground}"
+ PlaceholderText="{TemplateBinding PlaceholderText}">
+
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
\ No newline at end of file
diff --git a/src/Semi.Avalonia/Controls/TitleBar.axaml b/src/Semi.Avalonia/Controls/TitleBar.axaml
deleted file mode 100644
index 2755724..0000000
--- a/src/Semi.Avalonia/Controls/TitleBar.axaml
+++ /dev/null
@@ -1,53 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
\ No newline at end of file
diff --git a/src/Semi.Avalonia/Controls/Window.axaml b/src/Semi.Avalonia/Controls/Window.axaml
index fb44bb7..ef9edb1 100644
--- a/src/Semi.Avalonia/Controls/Window.axaml
+++ b/src/Semi.Avalonia/Controls/Window.axaml
@@ -15,9 +15,6 @@
-
-
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/src/Semi.Avalonia/Controls/_index.axaml b/src/Semi.Avalonia/Controls/_index.axaml
index 66ee144..9c632e6 100644
--- a/src/Semi.Avalonia/Controls/_index.axaml
+++ b/src/Semi.Avalonia/Controls/_index.axaml
@@ -9,7 +9,6 @@
-
@@ -51,13 +50,13 @@
-
+
\ No newline at end of file
From c144056ab08d8220365ac802635bc8bf75f8ac6a Mon Sep 17 00:00:00 2001
From: Dong Bin
Date: Sun, 8 Mar 2026 23:33:23 +0800
Subject: [PATCH 16/45] feat: add basic implementation of window decorations.
---
.../Semi.Avalonia.Demo/Views/MainWindow.axaml | 6 +-
.../Controls/WindowDrawnDecorations.axaml | 217 ++++++++++++++----
2 files changed, 182 insertions(+), 41 deletions(-)
diff --git a/demo/Semi.Avalonia.Demo/Views/MainWindow.axaml b/demo/Semi.Avalonia.Demo/Views/MainWindow.axaml
index 6df182c..87dc847 100644
--- a/demo/Semi.Avalonia.Demo/Views/MainWindow.axaml
+++ b/demo/Semi.Avalonia.Demo/Views/MainWindow.axaml
@@ -5,10 +5,12 @@
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:views="clr-namespace:Semi.Avalonia.Demo.Views"
- Title="Semi.Avalonia.Demo"
+ Title="Semi Avalonia Demo"
d:DesignHeight="450"
d:DesignWidth="800"
+ ExtendClientAreaToDecorationsHint="True"
+ ExtendClientAreaTitleBarHeightHint="40"
Icon="/Assets/irihi.ico"
mc:Ignorable="d">
-
+
\ No newline at end of file
diff --git a/src/Semi.Avalonia/Controls/WindowDrawnDecorations.axaml b/src/Semi.Avalonia/Controls/WindowDrawnDecorations.axaml
index 5caddf0..8b0ed6f 100644
--- a/src/Semi.Avalonia/Controls/WindowDrawnDecorations.axaml
+++ b/src/Semi.Avalonia/Controls/WindowDrawnDecorations.axaml
@@ -1,66 +1,205 @@
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
-
+
-
-
+
-
+
+
+
-
-
-
-
-
-
+
+
+
+
+
+
+
+
+
+
+
-
-
+
-
-
+
+
-
-
-
+
-
+
-
-
-
-
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
From 25f75d605c8988409ceff4624da02aee77f144d4 Mon Sep 17 00:00:00 2001
From: Zhang Dian <54255897+zdpcdt@users.noreply.github.com>
Date: Tue, 10 Mar 2026 16:49:03 +0800
Subject: [PATCH 17/45] =?UTF-8?q?feat:=20add=20Semi=20theme=20styling=20fo?=
=?UTF-8?q?r=20CommandBar,=20AppBarButton,=20AppBarTogg=E2=80=A6=20(#759)?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
* feat: add Semi theme styling for CommandBar, AppBarButton, AppBarToggleButton, AppBarSeparator
Co-authored-by: zdpcdt <54255897+zdpcdt@users.noreply.github.com>
* feat: add Semi theme icons for CommandBar buttons and update styles.
* feat: add dynamic label position selection to CommandBar demo.
---------
Co-authored-by: copilot-swe-agent[bot] <198982749+Copilot@users.noreply.github.com>
---
.../Pages/CommandBarDemo.axaml | 83 ++++
.../Pages/CommandBarDemo.axaml.cs | 11 +
demo/Semi.Avalonia.Demo/Views/MainView.axaml | 3 +
src/Semi.Avalonia/Controls/CommandBar.axaml | 406 ++++++++++++++++++
src/Semi.Avalonia/Controls/_index.axaml | 1 +
.../Themes/Dark/CommandBar.axaml | 22 +
src/Semi.Avalonia/Themes/Dark/_index.axaml | 1 +
.../Themes/HighContrast/CommandBar.axaml | 21 +
.../Themes/HighContrast/_index.axaml | 1 +
.../Themes/Light/CommandBar.axaml | 22 +
src/Semi.Avalonia/Themes/Light/_index.axaml | 1 +
.../Themes/Shared/CommandBar.axaml | 29 ++
src/Semi.Avalonia/Themes/Shared/_index.axaml | 1 +
13 files changed, 602 insertions(+)
create mode 100644 demo/Semi.Avalonia.Demo/Pages/CommandBarDemo.axaml
create mode 100644 demo/Semi.Avalonia.Demo/Pages/CommandBarDemo.axaml.cs
create mode 100644 src/Semi.Avalonia/Controls/CommandBar.axaml
create mode 100644 src/Semi.Avalonia/Themes/Dark/CommandBar.axaml
create mode 100644 src/Semi.Avalonia/Themes/HighContrast/CommandBar.axaml
create mode 100644 src/Semi.Avalonia/Themes/Light/CommandBar.axaml
create mode 100644 src/Semi.Avalonia/Themes/Shared/CommandBar.axaml
diff --git a/demo/Semi.Avalonia.Demo/Pages/CommandBarDemo.axaml b/demo/Semi.Avalonia.Demo/Pages/CommandBarDemo.axaml
new file mode 100644
index 0000000..d67d1b6
--- /dev/null
+++ b/demo/Semi.Avalonia.Demo/Pages/CommandBarDemo.axaml
@@ -0,0 +1,83 @@
+
+
+
+
+
+
+
+
+
+
+ Bottom
+ Collapsed
+ Right
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/demo/Semi.Avalonia.Demo/Pages/CommandBarDemo.axaml.cs b/demo/Semi.Avalonia.Demo/Pages/CommandBarDemo.axaml.cs
new file mode 100644
index 0000000..38f6b0f
--- /dev/null
+++ b/demo/Semi.Avalonia.Demo/Pages/CommandBarDemo.axaml.cs
@@ -0,0 +1,11 @@
+using Avalonia.Controls;
+
+namespace Semi.Avalonia.Demo.Pages;
+
+public partial class CommandBarDemo : UserControl
+{
+ public CommandBarDemo()
+ {
+ InitializeComponent();
+ }
+}
diff --git a/demo/Semi.Avalonia.Demo/Views/MainView.axaml b/demo/Semi.Avalonia.Demo/Views/MainView.axaml
index 76bc227..f5e24df 100644
--- a/demo/Semi.Avalonia.Demo/Views/MainView.axaml
+++ b/demo/Semi.Avalonia.Demo/Views/MainView.axaml
@@ -269,6 +269,9 @@
+
+
+
diff --git a/src/Semi.Avalonia/Controls/CommandBar.axaml b/src/Semi.Avalonia/Controls/CommandBar.axaml
new file mode 100644
index 0000000..4f15503
--- /dev/null
+++ b/src/Semi.Avalonia/Controls/CommandBar.axaml
@@ -0,0 +1,406 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/src/Semi.Avalonia/Controls/_index.axaml b/src/Semi.Avalonia/Controls/_index.axaml
index 9c632e6..bdce23c 100644
--- a/src/Semi.Avalonia/Controls/_index.axaml
+++ b/src/Semi.Avalonia/Controls/_index.axaml
@@ -12,6 +12,7 @@
+
diff --git a/src/Semi.Avalonia/Themes/Dark/CommandBar.axaml b/src/Semi.Avalonia/Themes/Dark/CommandBar.axaml
new file mode 100644
index 0000000..ed5a4d9
--- /dev/null
+++ b/src/Semi.Avalonia/Themes/Dark/CommandBar.axaml
@@ -0,0 +1,22 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/Semi.Avalonia/Themes/Dark/_index.axaml b/src/Semi.Avalonia/Themes/Dark/_index.axaml
index 3290cda..1c07720 100644
--- a/src/Semi.Avalonia/Themes/Dark/_index.axaml
+++ b/src/Semi.Avalonia/Themes/Dark/_index.axaml
@@ -11,6 +11,7 @@
+
diff --git a/src/Semi.Avalonia/Themes/HighContrast/CommandBar.axaml b/src/Semi.Avalonia/Themes/HighContrast/CommandBar.axaml
new file mode 100644
index 0000000..56696d9
--- /dev/null
+++ b/src/Semi.Avalonia/Themes/HighContrast/CommandBar.axaml
@@ -0,0 +1,21 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/Semi.Avalonia/Themes/HighContrast/_index.axaml b/src/Semi.Avalonia/Themes/HighContrast/_index.axaml
index 3290cda..1c07720 100644
--- a/src/Semi.Avalonia/Themes/HighContrast/_index.axaml
+++ b/src/Semi.Avalonia/Themes/HighContrast/_index.axaml
@@ -11,6 +11,7 @@
+
diff --git a/src/Semi.Avalonia/Themes/Light/CommandBar.axaml b/src/Semi.Avalonia/Themes/Light/CommandBar.axaml
new file mode 100644
index 0000000..ed5a4d9
--- /dev/null
+++ b/src/Semi.Avalonia/Themes/Light/CommandBar.axaml
@@ -0,0 +1,22 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/Semi.Avalonia/Themes/Light/_index.axaml b/src/Semi.Avalonia/Themes/Light/_index.axaml
index 3290cda..1c07720 100644
--- a/src/Semi.Avalonia/Themes/Light/_index.axaml
+++ b/src/Semi.Avalonia/Themes/Light/_index.axaml
@@ -11,6 +11,7 @@
+
diff --git a/src/Semi.Avalonia/Themes/Shared/CommandBar.axaml b/src/Semi.Avalonia/Themes/Shared/CommandBar.axaml
new file mode 100644
index 0000000..81f4f45
--- /dev/null
+++ b/src/Semi.Avalonia/Themes/Shared/CommandBar.axaml
@@ -0,0 +1,29 @@
+
+
+ 68
+ 40
+ 40
+ 20
+ 8 4
+
+
+ 36
+ 12 6
+
+ 1
+ 24
+ 8 4
+ 1
+ 4 4
+
+ 48
+ 4 0
+
+
+
+
+ 0 4
+ 160
+
+
+
diff --git a/src/Semi.Avalonia/Themes/Shared/_index.axaml b/src/Semi.Avalonia/Themes/Shared/_index.axaml
index 3290cda..1c07720 100644
--- a/src/Semi.Avalonia/Themes/Shared/_index.axaml
+++ b/src/Semi.Avalonia/Themes/Shared/_index.axaml
@@ -11,6 +11,7 @@
+
From 44152ef731d3e39ac11ac292e46b38f5dac548ba Mon Sep 17 00:00:00 2001
From: Copilot <198982749+Copilot@users.noreply.github.com>
Date: Tue, 10 Mar 2026 14:42:21 +0800
Subject: [PATCH 18/45] Sync 45 new icons from Semi Design commit ba384587
(#761)
* Initial plan
* Sync 45 new icons from Semi Design commit ba384587
Co-authored-by: zdpcdt <54255897+zdpcdt@users.noreply.github.com>
* fix: correct geometry paths for Semi icons.
* fix: update EyeClosedSolidStroked & IconHornStroked paths for Semi icons in StrokedIcons.axaml.
* fix: resolve copilot review.
---------
Co-authored-by: copilot-swe-agent[bot] <198982749+Copilot@users.noreply.github.com>
Co-authored-by: zdpcdt <54255897+zdpcdt@users.noreply.github.com>
(cherry picked from commit 77dffc55b16d6d28cab44f89ce8458bd5d63ffc9)
---
src/Semi.Avalonia/Icons/FillIcons.axaml | 46 +++++++-
src/Semi.Avalonia/Icons/StrokedIcons.axaml | 124 +++++++++++++++++++++
2 files changed, 166 insertions(+), 4 deletions(-)
diff --git a/src/Semi.Avalonia/Icons/FillIcons.axaml b/src/Semi.Avalonia/Icons/FillIcons.axaml
index 36dff72..95819df 100644
--- a/src/Semi.Avalonia/Icons/FillIcons.axaml
+++ b/src/Semi.Avalonia/Icons/FillIcons.axaml
@@ -113,6 +113,9 @@
M3.6 14.2 15.1.65c.3-.4.95-.15.9.35l-2 8h6a.5.5 0 0 1 .4.8L8.9 23.35c-.3.4-.95.15-.9-.35l2-8H4a.5.5 0 0 1-.4-.8Z
+
+ M19 1a2 2 0 0 1 2 2v19a1 1 0 0 1-1 1H6a3 3 0 0 1-3-3V5a4 4 0 0 1 4-4h12ZM6 19a1 1 0 0 0 0 2h13v-2H6Z
+
M4 21.59V3c0-1.1.9-2 2-2h12a2 2 0 0 1 2 2v18.59a1 1 0 0 1-1.7.7L12 16l-6.3 6.3a1 1 0 0 1-1.7-.71Z
@@ -203,6 +206,9 @@
M14.49 4.19a1.5 1.5 0 0 0-2.98-.38l-2 16a1.5 1.5 0 1 0 2.98.38l2-16ZM8.06 5.94a1.5 1.5 0 0 1 0 2.12L4.12 12l3.94 3.94a1.5 1.5 0 1 1-2.12 2.12l-5-5a1.5 1.5 0 0 1 0-2.12l5-5a1.5 1.5 0 0 1 2.12 0Zm7.88 0a1.5 1.5 0 0 1 2.12 0l5 5a1.5 1.5 0 0 1 0 2.12l-5 5a1.5 1.5 0 0 1-2.12-2.12L19.88 12l-3.94-3.94a1.5 1.5 0 0 1 0-2.12Z
+
+ M12 1a11 11 0 1 1 0 22 11 11 0 0 1 0-22Zm3.2 6.3a1 1 0 0 0-1.4 0L12 9.08l-1.8-1.8a1 1 0 1 0-1.4 1.42L10.08 10H9a1 1 0 1 0 0 2h2v1H9a1 1 0 1 0 0 2h2v1a1 1 0 0 0 2 0v-1h2a1 1 0 0 0 0-2h-2v-1h2a1 1 0 0 0 0-2h-1.09l1.3-1.3a1 1 0 0 0 0-1.4Z
+
M2 4c0-1.1.9-2 2-2h5a2 2 0 0 1 2 2v16a2 2 0 0 1-2 2H4a2 2 0 0 1-2-2V4Zm6 13.5a1.5 1.5 0 1 1-3 0 1.5 1.5 0 0 1 3 0Zm11.59-8.91L16.4 5.4a2 2 0 0 0-2.82 0L13 6v12l6.59-6.59a2 2 0 0 0 0-2.82ZM22 16a2 2 0 0 0-2-2l-8 8h8a2 2 0 0 0 2-2v-4Z
@@ -283,6 +289,9 @@
M4.38 4.4c.51-.53 1.34-.53 1.84 0l6.4 6.64c.5.53.5 1.39 0 1.92l-6.4 6.64c-.5.53-1.33.53-1.84 0a1.4 1.4 0 0 1 0-1.91L9.86 12 4.38 6.31a1.4 1.4 0 0 1 0-1.91Z
M11.38 4.4c.51-.53 1.33-.53 1.84 0l6.4 6.64c.5.53.5 1.39 0 1.92l-6.4 6.64c-.5.53-1.33.53-1.84 0a1.4 1.4 0 0 1 0-1.91L16.86 12l-5.48-5.69a1.4 1.4 0 0 1 0-1.91Z
+
+ M1 12a11 11 0 1 1 22 0 11 11 0 0 1-22 0Zm6.3-2.1a1 1 0 0 0 0 1.42l3.88 3.89a1 1 0 0 0 1.42 0l3.89-3.9a1 1 0 0 0-1.42-1.4l-3.18 3.18L8.7 9.9a1 1 0 0 0-1.42 0Z
+
M17.84 8.06A6.5 6.5 0 1 0 5.18 11 4.5 4.5 0 0 0 5.5 20H17a6 6 0 0 0 .84-11.94Zm-6.16 9.67a.5.5 0 0 0 .64 0l5.15-4.29a.25.25 0 0 0-.16-.44H14V9.5a.5.5 0 0 0-.5-.5h-3a.5.5 0 0 0-.5.5V13H6.7c-.24 0-.35.3-.17.44l5.15 4.3Z
@@ -293,6 +302,11 @@
M14.5 4.5l 5 5 2.09-2.09a2 2 0 0 0 0-2.82L19.4 2.4a2 2 0 0 0-2.82 0L14.5 4.5Z
M2.25 21.13l 1.68-5.88a1 1 0 0 1 .25-.43L13 6l5 5-8.82 8.82a1 1 0 0 1-.43.25l-5.88 1.68a.5.5 0 0 1-.62-.62Z
+
+ m16.43 4.1 3.54 3.54 1.48-1.48c.55-.55.55-1.45 0-2L19.9 2.62a1.42 1.42 0 0 0-2 0L16.43 4.1Z
+ m-8.76 11.88 1.19-4.17a.7.7 0 0 1.18-.3l6.24-6.25 3.54 3.54-6.24 6.24a.7.7 0 0 1-.3.18l-4.17 1.2a.35.35 0 0 1-.44-.44Z
+ M7.97 9.78c-.28.29-.5.63-.64 1l-.05.17-1.19 4.17A2.35 2.35 0 0 0 9 18.02l4.17-1.18c.44-.13.84-.37 1.17-.7l4.8-4.8a.5.5 0 0 1 .86.36V21a1 1 0 0 1-1 1H3a1 1 0 0 1-1-1V5a1 1 0 0 1 1-1h9.54a.5.5 0 0 1 .36.85L7.97 9.78Z
+
M12 23a11 11 0 1 1 0-22 11 11 0 0 1 0 22Zm-6.93-9a7 7 0 0 0 13.86 0H5.07ZM8 11a2 2 0 1 0 0-4 2 2 0 0 0 0 4Zm8 0a2 2 0 1 0 0-4 2 2 0 0 0 0 4Z
@@ -498,7 +512,7 @@
M12.03 19.57c-.19-.6-1.08-3.15-1.42-3.47-.32-.3-.71-.25-1.1-.2a8.7 8.7 0 0 1-.5.07c-.48.06-.9.12-1.52.17-.58.04-1.11.03-1.63-.1a52.44 52.44 0 0 0 3.26 5.12c.44.62 1.25.84 1.95.56.85-.34 1.3-1.04.96-2.15Z
- M6 23h12c1.1 0 2.14-.9 2-2-.44-3.5-2.14-5.06-3.38-6.28-.9-.87-1.62-1.58-1.62-2.72 0-1.14.72-1.85 1.62-2.72C17.86 8.06 19.56 6.5 20 3c.14-1.1-.9-2-2-2H6c-1.1 0-2.17.9-2 2 .47 2.92 2.07 4.55 3.27 5.88C8.22 9.94 9 10.81 9 12c0 1.14-.72 1.85-1.62 2.72C6.14 15.94 4.44 17.5 4 21c-.14 1.1.9 2 2 2Zm9-16c0 .82-.74 1.49-1.5 2.17A4.93 4.93 0 0 0 12 11a4.93 4.93 0 0 0-1.5-1.83C9.74 8.49 9 7.82 9 7h6ZM7 20c0-1.51 1.02-2.14 2.16-2.83 1.11-.68 2.34-1.44 2.84-3.17.5 1.73 1.73 2.49 2.84 3.17 1.14.7 2.16 1.32 2.16 2.83H7Z
+ M20 1a1 1 0 1 1 0 2h-1v5a1 1 0 0 1-.3.7L15.42 12l3.3 3.3a1 1 0 0 1 .29.7v5h1a1 1 0 1 1 0 2H4a1 1 0 1 1 0-2h1v-5a1 1 0 0 1 .3-.7L8.58 12l-3.3-3.3A1 1 0 0 1 5 8V3H4a1 1 0 0 1 0-2h16ZM9 18a1 1 0 1 0 0 2h6a1 1 0 1 0 0-2H9Zm1-12a1 1 0 0 0 0 2h4a1 1 0 1 0 0-2h-4Z
M4 4a3 3 0 0 0-3 3v11a3 3 0 0 0 3 3h16a3 3 0 0 0 3-3V7a3 3 0 0 0-3-3H4Zm5.8 8.17c-.47 1.18-1.33 1.97-2.3 1.97-.97 0-1.83-.79-2.3-1.97-.3-.12-.58-.47-.7-.94-.17-.6-.14-1.14.31-1.31C4.86 7.82 5.71 7 7.5 7s2.64.81 2.69 2.92c.45.17.48.7.32 1.31-.13.47-.41.82-.7.94Zm2.03 3.86c.42.42 0 .97-.61.97H3.78c-.6 0-1.03-.55-.61-.97.81-.84 2.45-1.41 4.33-1.41s3.52.57 4.33 1.4ZM14 10a1 1 0 0 1 1-1h5a1 1 0 1 1 0 2h-5a1 1 0 0 1-1-1Zm1 3a1 1 0 1 0 0 2h3a1 1 0 1 0 0-2h-3Z
@@ -549,6 +563,9 @@
m21.21 15.05.26.14c.51.28.68.9.38 1.39-.1.15-.23.27-.38.36l-8.92 4.92c-.34.19-.76.19-1.1 0l-8.92-4.92a.98.98 0 0 1-.38-1.39c.1-.15.23-.27.38-.36l.26-.14 8.66 4.78c.32.17.72.18 1.05.02l.05-.02 8.66-4.78Zm0-4.07.26.14c.51.29.68.91.38 1.4-.1.14-.23.27-.38.36l-8.92 4.92c-.34.18-.76.18-1.1 0l-8.92-4.92a.98.98 0 0 1-.38-1.4c.1-.14.23-.27.38-.36l.26-.14 8.66 4.78c.32.18.72.19 1.05.03l.05-.03 8.66-4.78Zm-8.66-8.84 8.92 4.92c.51.28.68.9.38 1.39-.1.15-.23.27-.38.36l-8.92 4.92c-.34.19-.76.19-1.1 0L2.53 8.81a.98.98 0 0 1-.38-1.39c.1-.15.23-.27.38-.36l8.92-4.92c.34-.19.76-.19 1.1 0Z
+
+ M12 1a11 11 0 1 1 0 22 11 11 0 0 1 0-22Zm2.1 6.3a1 1 0 0 0-1.42 0L8.8 11.17a1 1 0 0 0 0 1.42l3.9 3.89a1 1 0 0 0 1.4-1.42l-3.18-3.18L14.1 8.7a1 1 0 0 0 0-1.42Z
+
M12 6c-1.5-3.88-6.25-3.94-8.6-1.6C.87 6.94 1 10.5 3.5 14c2.02 2.83 6.33 6.31 7.9 7.54.36.28.84.28 1.2 0 1.57-1.23 5.88-4.71 7.9-7.54 2.5-3.5 2.63-7.06.1-9.6C18.25 2.06 14.5 2.12 12 6Z
@@ -616,9 +633,9 @@
M8.5 2c.83 0 1.5.67 1.5 1.5v3A3.5 3.5 0 0 1 6.5 10h-3a1.5 1.5 0 1 1 0-3h3a.5.5 0 0 0 .5-.5v-3C7 2.67 7.67 2 8.5 2ZM16 2c.83 0 1.5.67 1.5 1.5v3c0 .28.22.5.5.5h3a1.5 1.5 0 0 1 0 3h-3a3.5 3.5 0 0 1-3.5-3.5v-3c0-.83.67-1.5 1.5-1.5ZM2 15.5c0-.83.67-1.5 1.5-1.5h3a3.5 3.5 0 0 1 3.5 3.5v3a1.5 1.5 0 0 1-3 0v-3a.5.5 0 0 0-.5-.5h-3A1.5 1.5 0 0 1 2 15.5Zm12 2a3.5 3.5 0 0 1 3.5-3.5h3a1.5 1.5 0 0 1 0 3h-3a.5.5 0 0 0-.5.5v3a1.5 1.5 0 0 1-3 0v-3Z
- M7.52 7.19c.39-.39 1.02-.39 1.41 0l2.95 2.95V9.31c0-.55.45-1 1-1 .56 0 1 .45 1 1v3.24c0 .55-.44 1-1 1H9.64c-.55 0-1-.45-1-1 0-.55.45-1 1-1h.83L7.52 8.6c-.39-.39-.39-1.02 0-1.41Z
- M5.5 22H9.75c.83 0 1.5-.67 1.5-1.5S10.58 19 9.75 19H5.5c-.28 0-.5-.22-.5-.5v-3-10c0-.28.22-.5.5-.5h10 3c.28 0 .5.22.5.5V9.75c0 .83.67 1.5 1.5 1.5s1.5-.67 1.5-1.5V5.5C22 3.57 20.43 2 18.5 2h-3-10C3.57 2 2 3.57 2 5.5v10 3C2 20.43 3.57 22 5.5 22Z
- m10 0h5c.83 0 1.5-.67 1.5-1.5v-5c0-.83-.67-1.5-1.5-1.5h-5c-.83 0-1.5.67-1.5 1.5v5c0 .83.67 1.5 1.5 1.5Z
+ M15.5 22a1.5 1.5 0 0 1-1.5-1.5v-5c0-.83.67-1.5 1.5-1.5h5c.83 0 1.5.67 1.5 1.5v5c0 .83-.67 1.5-1.5 1.5h-5Z
+ M5.5 22A3.5 3.5 0 0 1 2 18.5v-13A3.5 3.5 0 0 1 5.5 2h13A3.5 3.5 0 0 1 22 5.5v4.25a1.5 1.5 0 0 1-3 0V5.5a.5.5 0 0 0-.5-.5h-13a.5.5 0 0 0-.5.5v13c0 .28.22.5.5.5h4.25a1.5 1.5 0 0 1 0 3H5.5Z
+ M7.52 7.19a1 1 0 0 0 0 1.41l2.95 2.95h-.83a1 1 0 1 0 0 2h3.24a1 1 0 0 0 1-1V9.31a1 1 0 1 0-2 0v.83L8.93 7.19a1 1 0 0 0-1.41 0Z
M2 12c0-.83.67-1.5 1.5-1.5h17a1.5 1.5 0 0 1 0 3h-17A1.5 1.5 0 0 1 2 12Z
@@ -640,6 +657,9 @@
M12 3a1 1 0 0 0-1.62-.78L4.65 7H2a1 1 0 0 0-1 1v8a1 1 0 0 0 1 1h2.65l5.73 4.78A1 1 0 0 0 12 21V3Zm2.06 4.94a1.5 1.5 0 0 1 2.12 0L18 9.76l1.82-1.82a1.5 1.5 0 1 1 2.12 2.12l-1.82 1.82 1.94 1.94a1.5 1.5 0 0 1-2.12 2.12L18 14l-1.94 1.94a1.5 1.5 0 0 1-2.12-2.12l1.94-1.94-1.82-1.82a1.5 1.5 0 0 1 0-2.12Z
+
+ M21 3a2 2 0 0 1 2 2v13a2 2 0 0 1-2 2H3a2 2 0 0 1-2-2V5c0-1.1.9-2 2-2h18Zm-5.8 4.3a1 1 0 0 0-1.4 0L12 9.08l-1.8-1.8a1 1 0 1 0-1.4 1.42L10.08 10H9a1 1 0 1 0 0 2h2v1H9a1 1 0 1 0 0 2h2v1a1 1 0 0 0 2 0v-1h2a1 1 0 0 0 0-2h-2v-1h2a1 1 0 0 0 0-2h-1.09l1.3-1.3a1 1 0 0 0 0-1.4Z
+
M3.5 3.5a1.5 1.5 0 1 0 0 3h3.63l7.57 13.24c.26.47.76.76 1.3.76h4.5a1.5 1.5 0 0 0 0-3h-3.63L9.3 4.26A1.5 1.5 0 0 0 8 3.5H3.5Zm11 0a1.5 1.5 0 0 0 0 3h6a1.5 1.5 0 0 0 0-3h-6Z
@@ -683,6 +703,9 @@
M21 2h-7.59a1 1 0 0 0-.7.3L1.4 13.58a2 2 0 0 0 0 2.82L7.6 22.6a2 2 0 0 0 2.82 0l11.3-11.3a1 1 0 0 0 .29-.7V3a1 1 0 0 0-1-1Zm-5.5 9a2.5 2.5 0 1 0 0-5 2.5 2.5 0 0 0 0 5Z
+
+ M4 1a1 1 0 0 0-1 1v5a1 1 0 0 0 .4.8L7 10.5v.6a7 7 0 1 0 10 0v-.6l3.6-2.7A1 1 0 0 0 21 7V2a1 1 0 0 0-1-1H4Zm3 15a4.99 4.99 0 0 1 8.33-3.73A4.99 4.99 0 0 1 12 21a5 5 0 0 1-5-5Zm2-6.33a6.97 6.97 0 0 1 6 0V3H9v6.67ZM15 16a3 3 0 1 1-6 0 3 3 0 0 1 6 0Z
+
M7 2a2 2 0 0 0-2 2v3a1 1 0 0 0 1 1h12a1 1 0 0 0 1-1V4a2 2 0 0 0-2-2H7Z
M2 12a3 3 0 0 1 3-3h14a3 3 0 0 1 3 3v5a2 2 0 0 1-2 2h-2v2a2 2 0 0 1-2 2H8a2 2 0 0 1-2-2v-2H4a2 2 0 0 1-2-2v-5Zm16 1a1 1 0 1 0 0-2 1 1 0 0 0 0 2ZM8 15h8v6H8v-6Z
@@ -705,6 +728,9 @@
M9.93 4.93c.25.8-.2 1.63-.99 1.88a7.02 7.02 0 0 0-4.08 3.32A5.02 5.02 0 0 1 11 15a5 5 0 0 1-10 0v-1.5a10 10 0 0 1 7.06-9.56c.8-.24 1.63.2 1.87 1Zm12 0c.25.8-.2 1.63-.99 1.88a7.02 7.02 0 0 0-4.08 3.32A5.02 5.02 0 0 1 23 15a5 5 0 0 1-10 0v-1.5a10 10 0 0 1 7.06-9.56c.8-.24 1.63.2 1.87 1Z
+
+ M21 4a2 2 0 0 1 2 2v12a2 2 0 0 1-2 2H3a2 2 0 0 1-2-2V6c0-1.1.9-2 2-2h18ZM6 8a1 1 0 0 0 0 2h1v5a1 1 0 0 0 2 0V9a1 1 0 0 0-1-1H6Zm10 0a1 1 0 1 0 0 2h1v5a1 1 0 0 0 2 0V9a1 1 0 0 0-1-1h-2Zm-3.5 5a1 1 0 1 0 0 2 1 1 0 0 0 0-2Zm0-4a1 1 0 1 0 0 2 1 1 0 0 0 0-2Z
+
M14.44 2.44a1.5 1.5 0 0 0 0 2.12L16.88 7H9.25C5.16 7 2 10.58 2 14.5S5.16 22 9.25 22h3.25a1.5 1.5 0 0 0 0-3H9.25C6.98 19 5 16.93 5 14.5S6.98 10 9.25 10h7.63l-2.44 2.44a1.5 1.5 0 0 0 2.12 2.12l5-5a1.5 1.5 0 0 0 0-2.12l-5-5a1.5 1.5 0 0 0-2.12 0Z
@@ -760,6 +786,9 @@
M8 5.07c-.8.47-1.8.46-2.6 0l-.24-.15a1.4 1.4 0 0 0-1.82.29c-.64.82-1.16 1.73-1.55 2.7a1.4 1.4 0 0 0 .66 1.71l.24.14a2.57 2.57 0 0 1 0 4.48l-.24.14a1.4 1.4 0 0 0-.66 1.72 11.1 11.1 0 0 0 1.55 2.69 1.4 1.4 0 0 0 1.82.3l.25-.15a2.57 2.57 0 0 1 3.88 2.24v.28c-.01.7.46 1.33 1.16 1.43a11 11 0 0 0 3.1 0 1.4 1.4 0 0 0 1.17-1.43v-.28a2.57 2.57 0 0 1 3.87-2.24l.25.14c.6.36 1.38.26 1.82-.29.64-.82 1.16-1.73 1.55-2.7a1.4 1.4 0 0 0-.66-1.71l-.24-.14a2.57 2.57 0 0 1 0-4.48l.24-.14a1.4 1.4 0 0 0 .66-1.72 11.08 11.08 0 0 0-1.55-2.69 1.4 1.4 0 0 0-1.82-.3l-.25.15a2.57 2.57 0 0 1-3.88-2.24v-.28c.01-.7-.46-1.33-1.16-1.43a10.99 10.99 0 0 0-3.1 0c-.7.1-1.17.72-1.17 1.43v.28C9.3 3.75 8.8 4.61 8 5.07Zm6 10.4a4 4 0 1 0-4-6.93 4 4 0 0 0 4 6.92Z
+
+ M17.5 2A3.5 3.5 0 1 1 15 7.95l-5.13 3.11a3.5 3.5 0 0 1 .03 1.78l5.22 3.1A3.49 3.49 0 0 1 21 18.5a3.5 3.5 0 1 1-6.9-.85l-5.22-3.08A3.49 3.49 0 0 1 3 12a3.5 3.5 0 0 1 5.8-2.63l5.27-3.19A3.5 3.5 0 0 1 17.5 2Z
+
m2.68 3.8 8.75-2.63a2 2 0 0 1 1.14 0l8.74 2.62c.41.13.7.5.7.93.03 2.63-.03 11.72-2.01 14.28-1.98 2.55-6.38 3.66-7.65 3.93-.23.05-.47.05-.7 0C10.4 22.65 6.12 21.55 4 19 1.87 16.44 1.92 7.32 1.98 4.7c0-.42.3-.78.7-.9ZM12 4v16s3.97-.73 5.6-2.9c1.61-2.2 1.39-11.2 1.39-11.2L12 4H12Z
@@ -835,6 +864,9 @@
M2 5a3 3 0 0 1 3-3h14a3 3 0 0 1 3 3v14a3 3 0 0 1-3 3H5a3 3 0 0 1-3-3V5Zm10 11a1 1 0 0 1 1-1h5a1 1 0 1 1 0 2h-5a1 1 0 0 1-1-1ZM7.7 6.3a1 1 0 0 0-1.4 1.4l3.36 3.37-3.44 4.3a1 1 0 0 0 1.56 1.25l4-5a1 1 0 0 0-.07-1.33l-4-4Z
+
+ M19 1a2 2 0 0 1 2 2v18a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2V3c0-1.1.9-2 2-2h14ZM7 17.5a1 1 0 1 0 0 2h10a1 1 0 1 0 0-2H7Zm0-4a1 1 0 1 0 0 2h10a1 1 0 1 0 0-2H7ZM9.25 5a.75.75 0 0 0-.67.42l-2.5 5a.75.75 0 0 0 1.34.67l.42-.84h2.82l.42.84a.75.75 0 0 0 1.34-.68l-2.5-5A.75.75 0 0 0 9.25 5Zm.66 3.75H8.6l.66-1.32.66 1.32Z
+
M3 4.5C3 3.67 3.67 3 4.5 3h15c.83 0 1.5.67 1.5 1.5v3a1.5 1.5 0 0 1-3 0V6h-4.5v13h2a1.5 1.5 0 0 1 0 3h-7a1.5 1.5 0 0 1 0-3h2V6H6v1.5a1.5 1.5 0 1 1-3 0v-3Z
@@ -847,6 +879,9 @@
M12 23a11 11 0 1 0 0-22 11 11 0 0 0 0 22Zm5.88-13.18-6.2 7.6a1.5 1.5 0 0 1-2.37 0l-3.5-4a1.5 1.5 0 1 1 2.37-1.84l2.3 2.46L15.5 8a1.5 1.5 0 1 1 2.38 1.82Z
+
+ M21 4a2 2 0 0 1 2 2v3.8a1 1 0 0 1-.71.96c-.74.22-1.1.76-1.1 1.24s.36 1.02 1.1 1.24a1 1 0 0 1 .71.96V18a2 2 0 0 1-2 2H3a2 2 0 0 1-2-2v-3.8a1 1 0 0 1 .71-.96c.74-.22 1.1-.76 1.1-1.24 0-.47-.36-1.01-1.08-1.24A1 1 0 0 1 1 9.8V6c0-1.1.9-2 2-2h18ZM8 9a1 1 0 0 0-1 1v4a1 1 0 1 0 2 0v-4a1 1 0 0 0-1-1Zm4 0a1 1 0 0 0-1 1v4a1 1 0 1 0 2 0v-4a1 1 0 0 0-1-1Zm4 0a1 1 0 0 0-1 1v4a1 1 0 1 0 2 0v-4a1 1 0 0 0-1-1Z
+
M16.07 1h-3.8V16.13A3.17 3.17 0 1 1 10.14 13v-3.9a6.98 6.98 0 1 0 5.94 6.91V8.47a9.05 9.05 0 0 0 5.3 1.7V6.37a5.3 5.3 0 0 1-5.3-5.31V1Z
@@ -914,6 +949,9 @@
M15.95 3.09s-.55-.84-1.11-.84c-.5 0-.98.04-1.84.84-1.11 1.02-1.5 2.41-1.5 4.73 0 1.53.3 3.18 1.67 3.9l.38.14c.78 1.64 2.03 2.7 3.42 2.7 1.53 0 2.9-1.3 3.64-3.24l.06-.03c.63.15 1.51.2 2.12.2.27.01.4-.31.24-.51a6.4 6.4 0 0 1-.96-1.5c-.05-.13-.11-.52-.2-1.05-.2-1.38-.57-3.72-1.37-4.93-.72-1.08-3-1.5-3.83-1.25-.61.19-.72.84-.72.84ZM2.21 4.42c.21-.47.8-.57 1.23-.29L4 4.5 4.01 3c0-.2.13-.4.32-.45a6.2 6.2 0 0 1 1.78-.23c2.95 0 4.36 1.4 4.43 5 .75.3.8 1.22.53 2.26-.21.8-.67 1.4-1.16 1.6-.78 2.03-2.2 3.38-3.8 3.38-1.6 0-3.02-1.35-3.8-3.38-.48-.2-.95-.8-1.16-1.6-.27-1.04-.22-1.97.53-2.25.03-1.21.2-2.17.53-2.91ZM8 22c.55 0 1-.45 1.03-1 .1-1.3.45-2.15 1.27-3 .5-.53.43-1.4-.26-1.61A8.47 8.47 0 0 0 7.5 16c-3.06 0-5.69 1.6-6.87 3.89C.1 20.94 2.03 22 3.22 22H8Zm13.8 0c1.18 0 2.12-1.05 1.61-2.1A7.06 7.06 0 0 0 17 16a7.06 7.06 0 0 0-6.41 3.9c-.51 1.05.43 2.1 1.61 2.1h9.6Z
+
+ M11.35 15c.54 0 1.08.04 1.6.13.23.03.4.24.4.48v5.89a.5.5 0 0 1-.5.5H2.49a.48.48 0 0 1-.46-.64A10 10 0 0 1 11.35 15Zm4.5 5c.27 0 .5.22.5.5v1a.5.5 0 0 1-.5.5h-1a.5.5 0 0 1-.5-.5v-1c0-.28.22-.5.5-.5h1Zm5.65 0c.28 0 .5.22.5.5v1a.5.5 0 0 1-.5.5h-3.65a.5.5 0 0 1-.5-.5v-1c0-.28.22-.5.5-.5h3.65Zm-5.65-3c.27 0 .5.22.5.5v1a.5.5 0 0 1-.5.5h-1a.5.5 0 0 1-.5-.5v-1c0-.28.22-.5.5-.5h1Zm5.65 0c.28 0 .5.22.5.5v1a.5.5 0 0 1-.5.5h-3.65a.5.5 0 0 1-.5-.5v-1c0-.28.22-.5.5-.5h3.65ZM12.35 2c3.3 0 6 2.7 6 6s-2.7 6-6 6-6-2.7-6-6 2.7-6 6-6Z
+
M16.86 14.85c-.36.21-.81.21-1.17 0l-.11-.07a.64.64 0 0 0-.83.13 5 5 0 0 0-.7 1.23c-.13.3.01.62.3.78l.1.06a1.17 1.17 0 0 1 0 2.04l-.1.06a.64.64 0 0 0-.3.79 5.06 5.06 0 0 0 .7 1.22c.2.25.55.3.83.13l.1-.06a1.17 1.17 0 0 1 1.77 1.01v.13c0 .32.21.6.53.65a5 5 0 0 0 1.4 0 .63.63 0 0 0 .54-.65v-.13a1.17 1.17 0 0 1 1.76-1.01l.11.06c.28.16.63.12.83-.13a5 5 0 0 0 .7-1.23.64.64 0 0 0-.3-.78l-.1-.06a1.17 1.17 0 0 1 0-2.04l.1-.06a.64.64 0 0 0 .3-.78 5.04 5.04 0 0 0-.7-1.23.63.63 0 0 0-.83-.13l-.11.07a1.17 1.17 0 0 1-1.76-1.02v-.13c0-.32-.21-.6-.53-.65a5 5 0 0 0-1.41 0 .64.64 0 0 0-.53.65v.13c0 .42-.22.81-.59 1.02Zm2.73 4.73a1.82 1.82 0 1 0-1.82-3.15 1.82 1.82 0 0 0 1.82 3.15Z
M12.35 15.98 12 16c-1.98 0-3.74-1.66-4.71-4.14-.6-.25-1.18-1-1.44-1.97-.34-1.27-.28-2.4.65-2.76C6.6 2.71 8.34 1 12 1s5.4 1.71 5.5 6.13c.92.36 1 1.49.65 2.76-.26.97-.83 1.72-1.44 1.97l-.12.3a6.01 6.01 0 0 0-4.24 3.82ZM12.08 17H12c-3.85 0-7.2 1.2-8.87 2.95-.85.9.03 2.05 1.27 2.05h9.13a5.98 5.98 0 0 1-1.45-5Z
diff --git a/src/Semi.Avalonia/Icons/StrokedIcons.axaml b/src/Semi.Avalonia/Icons/StrokedIcons.axaml
index bfd1292..e0ec60b 100644
--- a/src/Semi.Avalonia/Icons/StrokedIcons.axaml
+++ b/src/Semi.Avalonia/Icons/StrokedIcons.axaml
@@ -2,6 +2,12 @@
M13.62 5.04a1 1 0 1 0 1.42-1.42L12.7 1.3a1 1 0 0 0-1.42 0L8.96 3.62a1 1 0 0 0 1.42 1.42L11 4.4V11H4.41l.63-.62a1 1 0 1 0-1.42-1.42L1.3 11.3a1 1 0 0 0 0 1.42l2.33 2.33a1 1 0 0 0 1.42-1.42L4.4 13H11v6.59l-.62-.63a1 1 0 0 0-1.42 1.42l2.33 2.33a1 1 0 0 0 1.42 0l2.33-2.33a1 1 0 0 0-1.42-1.42l-.62.63V13h6.59l-.63.62a1 1 0 0 0 1.42 1.42l2.33-2.33a1 1 0 0 0 0-1.42l-2.33-2.33a1 1 0 1 0-1.42 1.42l.63.62H13V4.41l.62.63Z
+
+ M12 7.64c.5 0 .9.4.9.9v5.08l3.98 3.97a.9.9 0 1 1-1.29 1.29l-4.18-4.18-.03-.04a.9.9 0 0 1-.29-.66V8.55c0-.5.4-.91.91-.91Z
+ M12 4a10 10 0 1 1 0 20 10 10 0 0 1 0-20Zm0 2a8 8 0 1 0 0 16 8 8 0 0 0 0-16Z
+ M3.54 1.41a2 2 0 1 1 2.82 2.83L4.24 6.36a2 2 0 1 1-2.83-2.82L3.54 1.4Z
+ M20.46 1.41a2 2 0 1 0-2.82 2.83l2.12 2.12a2 2 0 1 0 2.83-2.82L20.46 1.4Z
+
M11 3a1 1 0 1 1 2 0v2h7a1 1 0 0 1 1 1v4a1 1 0 0 1-1 1h-7v2h4a1 1 0 0 1 1 1v4a1 1 0 0 1-1 1h-4v2a1 1 0 1 1-2 0v-2H7a1 1 0 0 1-1-1v-4a1 1 0 0 1 1-1h4v-2H4a1 1 0 0 1-1-1V6a1 1 0 0 1 1-1h7V3Zm1 14h4v-2H8v2h4Zm7-8H5V7h14v2Z
@@ -59,18 +65,39 @@
M5 1a2 2 0 0 0-2 2v18c0 1.1.9 2 2 2h14a2 2 0 0 0 2-2V8.41A2 2 0 0 0 20.41 7L15 1.59A2 2 0 0 0 13.59 1H5Zm8 2H5v18h14V9h-5a1 1 0 0 1-1-1V3Zm4.59 4L15 4.41V7h2.59Zm-6.09 5a.5.5 0 0 0-.5.5v1c0 .28.22.5.5.5h5a.5.5 0 0 0 .5-.5v-1a.5.5 0 0 0-.5-.5h-5Zm-4.5.5c0-.28.22-.5.5-.5h1c.28 0 .5.22.5.5v1a.5.5 0 0 1-.5.5h-1a.5.5 0 0 1-.5-.5v-1Zm4.5 3.5a.5.5 0 0 0-.5.5v1c0 .28.22.5.5.5h5a.5.5 0 0 0 .5-.5v-1a.5.5 0 0 0-.5-.5h-5Zm-4.5.5c0-.28.22-.5.5-.5h1c.28 0 .5.22.5.5v1a.5.5 0 0 1-.5.5h-1a.5.5 0 0 1-.5-.5v-1Z
+
+ M15 1a2 2 0 0 1 2 2v3h4a2 2 0 0 1 2 2v12a2 2 0 0 1-1.8 1.99L21 22H3l-.2-.01A2 2 0 0 1 1 20V8c0-1.1.9-2 2-2h4V3c0-1.1.9-2 2-2h6ZM3 20h18v-7h-6v2a1 1 0 0 1-1 1h-4a1 1 0 0 1-1-1v-2H3v7Zm0-9h18V8H3v3Zm6.5-8a.5.5 0 0 0-.5.5V6h6V3.5a.5.5 0 0 0-.5-.5h-5Z
+
M2 6a1 1 0 0 0-1 1v10a1 1 0 0 0 1 1h20a1 1 0 0 0 1-1V7a1 1 0 0 0-1-1H2Zm1 10V8h18v8H3Zm4-5a1 1 0 1 0 0 2h10a1 1 0 1 0 0-2H7Z
+
+ M20 2a2 2 0 0 1 2 2v8.53a6 6 0 0 0-2-1.19V8a1 1 0 0 0-1-1H5a1 1 0 0 0-1 1v11a1 1 0 0 0 1 1h7.8c.47.8 1.11 1.49 1.88 2H4a2 2 0 0 1-2-2V4c0-1.1.9-2 2-2h16ZM4.5 4a.5.5 0 0 0 0 1h15a.5.5 0 0 0 0-1h-15Z
+ M8 15a1 1 0 0 1 1 1v1a1 1 0 0 1-1 1H7a1 1 0 0 1-1-1v-1a1 1 0 0 1 1-1h1Z
+ M12.34 15a5.99 5.99 0 0 0-.25 3h-.59a1 1 0 0 1-1-1v-1a1 1 0 0 1 1-1h.84Z
+ M8 10a1 1 0 0 1 1 1v1a1 1 0 0 1-1 1H7a1 1 0 0 1-1-1v-1a1 1 0 0 1 1-1h1Z
+ M12.5 10a1 1 0 0 1 1 1v1a1 1 0 0 1-1 1h-1a1 1 0 0 1-1-1v-1a1 1 0 0 1 1-1h1Z
+ M17.5 10a1 1 0 0 1 1 1v.02a6.08 6.08 0 0 0-3 .52V11a1 1 0 0 1 1-1h1Z
+ M18 12a5 5 0 1 1 0 10 5 5 0 0 1 0-10Zm0 2a3 3 0 1 0 0 6 3 3 0 0 0 0-6Zm0 .27c.41 0 .75.34.75.75v1.25l1.3 1.3a.75.75 0 1 1-1.06 1.06l-1.5-1.5a.75.75 0 0 1-.1-.12.75.75 0 0 1-.14-.44v-1.55c0-.41.34-.75.75-.75Z
+
M9.65 2.11a1.11 1.11 0 1 0-2.22 0v.87H3.1A2.1 2.1 0 0 0 1 5.08V20.9c0 1.16.94 2.1 2.1 2.1h17.8a2.1 2.1 0 0 0 2.1-2.1V5.08a2.1 2.1 0 0 0-2.1-2.1h-4.33V2.1a1.11 1.11 0 1 0-2.22 0v.87h-4.7V2.1Zm6.92 18.67h4.2v-3.71h-4.2v3.7Zm0-5.94h4.2v-3.7h-4.2v3.7Zm-2.22-3.7v3.7h-4.7v-3.7h4.7Zm1.11-2.23h5.32v-3.7h-4.2v.86a1.11 1.11 0 1 1-2.23 0V5.2h-4.7v.87a1.11 1.11 0 0 1-2.22 0V5.2h-4.2v3.71h12.23Zm-1.11 8.16v3.7h-4.7v-3.7h4.7Zm-6.92 3.7v-3.7h-4.2v3.7h4.2Zm0-5.93v-3.7h-4.2v3.7h4.2Z
+
+ M12 7a5 5 0 1 1 0 10 5 5 0 0 1 0-10Zm0 2a3 3 0 1 0 0 6 3 3 0 0 0 0-6Z
+ M14.76 2a2 2 0 0 1 1.8 1.1L17.5 5H20a3 3 0 0 1 3 3v10a3 3 0 0 1-3 3H4a3 3 0 0 1-3-3V8a3 3 0 0 1 3-3h2.5l.95-1.9A2 2 0 0 1 9.24 2h5.52ZM8.3 5.9A2 2 0 0 1 6.5 7H4a1 1 0 0 0-1 1v10a1 1 0 0 0 1 1h16a1 1 0 0 0 1-1V8a1 1 0 0 0-1-1h-2.5a2 2 0 0 1-1.79-1.1L14.76 4H9.24l-.95 1.9Z
+
M5 2a1 1 0 0 1 1 1v6h1a1 1 0 0 1 1 1v8a1 1 0 0 1-1 1H6v2a1 1 0 1 1-2 0v-2H3a1 1 0 0 1-1-1v-8a1 1 0 0 1 1-1h1V3a1 1 0 0 1 1-1Zm0 15h1v-6H4v6h1Zm11-9a1 1 0 0 1 1-1h1V3a1 1 0 1 1 2 0v4h1a1 1 0 0 1 1 1v8a1 1 0 0 1-1 1h-1v4a1 1 0 1 1-2 0v-4h-1a1 1 0 0 1-1-1V8Zm4 7h-2V9h2v6ZM10 5a1 1 0 0 0-1 1v8a1 1 0 0 0 1 1h1v6a1 1 0 1 0 2 0v-6h1a1 1 0 0 0 1-1V6a1 1 0 0 0-1-1h-1V3a1 1 0 1 0-2 0v2h-1Zm2 8h-1V7h2v6h-1Z
M1 6h2v12H1v2h3a1 1 0 0 0 1-1V5a1 1 0 0 0-1-1H1v2Zm6-1a1 1 0 0 1 1-1h8a1 1 0 0 1 1 1v14a1 1 0 0 1-1 1H8a1 1 0 0 1-1-1V5Zm2 1v12h6V6H9Zm10-1a1 1 0 0 1 1-1h3v2h-2v12h2v2h-3a1 1 0 0 1-1-1V5Z
+
+ M9.65 18a2 2 0 1 1 0 4 2 2 0 0 1 0-4Z
+ M18.65 18a2 2 0 1 1 0 4 2 2 0 0 1 0-4Z
+ M5.5 2c.68 0 1.27.46 1.44 1.11l.03.13.14.79h14.71a1 1 0 0 1 .98 1.21l-1.56 7a1 1 0 0 1-.8.77l-.17.02H8.67L9.02 15h11.14a1 1 0 0 1 0 2H8.6a1.5 1.5 0 0 1-1.48-1.24L5.28 5.2l-.01-.07L5.07 4h-2.9a1 1 0 0 1 0-2H5.5ZM7.8 8.07l.52 2.96h11.14l1.1-5H7.46l.36 2.04Z
+
M4 3a1 1 0 1 0-2 0v18a1 1 0 1 0 2 0V3Zm7 3a1 1 0 0 0-1 1v10a1 1 0 0 0 1 1h10a1 1 0 0 0 1-1V7a1 1 0 0 0-1-1H11Zm1 10V8h8v8h-8Z
@@ -100,6 +127,9 @@
M7.9 20.17a1.25 1.25 0 0 1-.07-1.77l5.71-6.15-5.7-6.15a1.25 1.25 0 0 1 1.83-1.7l6.5 7c.44.48.44 1.22 0 1.7l-6.5 7c-.47.5-1.26.54-1.77.07Z
+
+ M12 1a11 11 0 1 1 0 22 11 11 0 0 1 0-22Zm0 2a9 9 0 1 0 0 18 9 9 0 0 0 0-18Zm0 2a1 1 0 0 1 1 1v5.59l4.36 4.36a1 1 0 0 1-1.41 1.41l-4.6-4.6-.02-.02A1 1 0 0 1 11 12V6a1 1 0 0 1 1-1Z
+
M20 11.3V11c0-3.9-3.1-7-7-7-2.8 0-5.2 1.7-6.3 4-3.2.2-5.7 2.8-5.7 6 0 3.3 2.7 6 6 6h11.5a4.48 4.48 0 0 0 1.5-8.7ZM18.5 18H7a4.01 4.01 0 0 1-.9-7.9c.3-.1.6-.1.9-.1.31 0 .56 0 .84.1.13.04.28-.04.31-.17.13-.59.39-1.1.65-1.63C9.7 6.9 11.2 6 13 6a4.95 4.95 0 0 1 4.69 6.74.2.2 0 0 0 .19.26h.62c.4 0 .8.1 1.1.3a2.48 2.48 0 0 1-1.1 4.7Z
@@ -131,12 +161,19 @@
M12 4h9a1 1 0 1 0 0-2h-9A10 10 0 0 0 2 12v9a1 1 0 1 0 2 0v-9a8 8 0 0 1 8-8Z
+
+ M20 3a3 3 0 0 1 3 3v11a3 3 0 0 1-2.85 3H3.85A3 3 0 0 1 1 17.15V6a3 3 0 0 1 3-3h16ZM3 17a1 1 0 0 0 1 1h16a1 1 0 0 0 1-1v-7H3v7ZM4 5a1 1 0 0 0-1 1v2h18V6a1 1 0 0 0-1-1H4Z
+ M5 14a1 1 0 0 1 1-1h2a1 1 0 0 1 1 1v1a1 1 0 0 1-1 1H6a1 1 0 0 1-1-1v-1Z
+
M23 12a11 11 0 1 1-22 0 11 11 0 0 1 22 0Zm-11 9a9 9 0 1 0 0-18 9 9 0 0 0 0 18ZM8.11 8.11a1 1 0 0 1 1.42 0L12 10.6l2.47-2.48a1 1 0 1 1 1.42 1.42L13.4 12l2.48 2.47a1 1 0 0 1-1.42 1.42L12 13.4 9.53 15.9a1 1 0 0 1-1.42-1.42L10.6 12 8.1 9.53a1 1 0 0 1 0-1.42Z
M3.62 19.12a1.25 1.25 0 0 0 1.76 1.76l7.12-7.11 7.12 7.11a1.25 1.25 0 0 0 1.76-1.76L14.27 12l7.11-7.12a1.25 1.25 0 0 0-1.76-1.76l-7.12 7.11-7.12-7.11a1.25 1.25 0 1 0-1.76 1.76L10.73 12l-7.11 7.12Z
+
+ M11.09 2a1 1 0 0 1 1.82 0l2.44 5.36a3 3 0 0 0 4.54 1.16l.14-.12 1.85-1.59c.61-.52 1.53.08 1.29.85L19.44 20.6a2 2 0 0 1-1.75 1.4H6.31a2 2 0 0 1-1.75-1.4L.83 7.66c-.24-.77.68-1.37 1.29-.85l1.85 1.6a3 3 0 0 0 4.6-.88l.08-.17L11.1 2Zm-.62 6.2a5 5 0 0 1-6.7 2.44L6.47 20h11.06l2.7-9.36a5 5 0 0 1-6.7-2.45L12 4.83 10.47 8.2Z
+
M7 8a5 5 0 0 1 10 0v8a5 5 0 0 1-2.17 4.12.5.5 0 0 0-.33-.12h-4a.5.5 0 0 0-.5.5v2c0 .28.22.5.5.5h4a.5.5 0 0 0 .5-.5v-.17A7 7 0 0 0 18.93 17H21a1 1 0 0 0 1-1v-6a1 1 0 0 0-1-1h-2V8A7 7 0 1 0 5 8v1H3a1 1 0 0 0-1 1v6a1 1 0 0 0 1 1h3a1 1 0 0 0 1-1V8Zm-3 7v-4h1v4H4Zm15-4v4h1v-4h-1Z
@@ -161,21 +198,42 @@
M21 2a1 1 0 0 1 1 1v6a1 1 0 1 1-2 0V5.41l-9.3 9.3a1 1 0 0 1-1.4-1.42L18.58 4H15a1 1 0 1 1 0-2h6ZM2 5a1 1 0 0 1 1-1h8a1 1 0 1 1 0 2H4v14h14v-7a1 1 0 1 1 2 0v8a1 1 0 0 1-1 1H3a1 1 0 0 1-1-1V5Z
+
+ M2.7 5.04c.54-.15 1.09.16 1.3.67.53 1.36 1.42 2.8 2.6 3.98a7.6 7.6 0 0 0 5.58 2.35 8.73 8.73 0 0 0 8.29-6.25c.17-.53.7-.87 1.23-.75.54.12.89.65.73 1.18a11.31 11.31 0 0 1-3.18 5.08l2.66 3.53a1 1 0 0 1-1.6 1.2l-2.66-3.53c-.77.46-1.6.83-2.5 1.09l1.49 4.09a1 1 0 1 1-1.88.68l-1.6-4.38a12.03 12.03 0 0 1-1.97.03l-1.58 4.35a1 1 0 1 1-1.88-.68l1.48-4.08a9.64 9.64 0 0 1-2.39-1.17l-2.71 3.6a1 1 0 0 1-1.6-1.2l2.76-3.66-.06-.06a13.75 13.75 0 0 1-3.15-4.85.94.94 0 0 1 .65-1.22Z
+
+
+ M20.1 2.3a1 1 0 0 1 1.4 1.4L3.13 22.1a1 1 0 1 1-1.41-1.42l3.36-3.37C2.52 15.51 1 13.04 1 11.6c0-2.5 4.5-8 11-8 2.03 0 3.87.54 5.44 1.35l2.65-2.65ZM12 5.58c-2.67 0-4.97 1.13-6.62 2.57a9.39 9.39 0 0 0-1.86 2.15A3.1 3.1 0 0 0 3 11.6c0 .1.08.54.52 1.27.4.67 1.03 1.44 1.86 2.16.34.3.72.59 1.13.86l2.13-2.13a4 4 0 0 1 5.53-5.53l1.77-1.78A9.64 9.64 0 0 0 12 5.59Zm0 4a2 2 0 0 0-1.88 2.68l2.56-2.57A2 2 0 0 0 12 9.6Z
+ M20.27 6.95C22 8.57 23 10.4 23 11.59c0 2.5-4.5 8-11 8-1.34 0-2.6-.24-3.74-.63l1.61-1.62c.68.16 1.39.25 2.13.25 2.67 0 4.97-1.14 6.62-2.57a9.39 9.39 0 0 0 1.86-2.16c.44-.73.52-1.17.52-1.27 0-.1-.08-.55-.52-1.28a9.2 9.2 0 0 0-1.63-1.95l1.42-1.41Z
+ m-3.98 4.23.02.36a4 4 0 0 1-4.36 3.98l4.34-4.34Z
+
+
+ M12 8a4 4 0 1 1 0 8 4 4 0 0 1 0-8Zm0 2a2 2 0 1 0 0 4 2 2 0 0 0 0-4Z
+ M12 4c6.5 0 11 5.5 11 8s-4.5 8-11 8-11-5.5-11-8 4.5-8 11-8Zm0 2C9.33 6 7.03 7.13 5.38 8.57a9.39 9.39 0 0 0-1.86 2.16A3.1 3.1 0 0 0 3 12c0 .1.08.55.52 1.27.4.68 1.03 1.44 1.86 2.16A10.14 10.14 0 0 0 12 18c2.67 0 4.97-1.13 6.62-2.57a9.39 9.39 0 0 0 1.86-2.16A3.1 3.1 0 0 0 21 12c0-.1-.08-.55-.52-1.27a9.39 9.39 0 0 0-1.86-2.16A10.14 10.14 0 0 0 12 6Z
+
M7.42 2.17a1 1 0 0 1 1.41 0l9.43 9.44a1 1 0 0 1 0 1.41l-.02.02-6.7 6.7a2.5 2.5 0 0 1-3.53 0l-5.66-5.66a2.5 2.5 0 0 1 0-3.53l6.01-6.01-.94-.95a1 1 0 0 1 0-1.42Zm2.36 3.78 6.36 6.36-2.18 2.19H5.6l-1.83-1.83a.5.5 0 0 1 0-.71l6-6.01ZM21 19c0 1.1-.67 2-1.5 2s-1.5-.9-1.5-2c0-1.08.66-2.49 1.1-3.31a.44.44 0 0 1 .8 0c.44.82 1.1 2.23 1.1 3.31Z
+
+ M12.57 12.06 19.77 4H4.25l7.25 8.06v6.39l1.07.7v-7.09Zm2 8.94-.01.13a1 1 0 0 1-1.32.81l-.12-.05-3.07-2A1 1 0 0 1 9.5 19v-6.17L1.24 3.65A1 1 0 0 1 2 2h20a1 1 0 0 1 .76 1.65l-8.2 9.18V21Z
+
M6.7 3.7a1 1 0 0 0-1.4-1.4l-3 3a1 1 0 0 0 0 1.4l3 3a1 1 0 0 0 1.4-1.4L5.42 7h3.44v5.65c-.23-.26-.54-.5-.96-.61a2.98 2.98 0 0 0-1.54-.1c-.55.15-.93.5-1.14.96-.19.4-.22.84-.2 1.19 0 .36.05.73.1 1.07.15.93.64 2.85 4 6.52a1 1 0 0 0 .73.32h11a1 1 0 0 0 1-1v-7.47c0-.96-.33-1.7-.83-2.21a2.8 2.8 0 0 0-1.49-.8l-5.67-.87V7H21a1 1 0 1 0 0-2h-7.2a2.5 2.5 0 0 0-4.9 0H5.4l1.3-1.3Zm4.14 1.8a.5.5 0 1 1 1 0v5c0 .5.37.92.86 1 4 .6 6.14.93 6.47 1 .1 0 .26.07.4.22.12.12.27.35.27.81V20H10.3c-2.9-3.23-3.13-4.72-3.2-5.16A6.17 6.17 0 0 1 7 13.9c.08 0 .19.03.34.07l.07.1c.09.15.16.33.26.6l.05.14c.12.3.29.74.58 1.1.35.43.86.74 1.54.74v-.04c.34-.06.7-.25.82-.38.05-.08.11-.22.13-.27a.96.96 0 0 0 .05-.24 1.13 1.13 0 0 0 0-.1 12.2 12.2 0 0 0 0-.6v-9.5Zm-3.51 8.45Z
M4 12a8 8 0 1 1 16 0 8 8 0 0 1-16 0Zm8-10c-2.4 0-4.6.85-6.33 2.26L4.31 2.89a1 1 0 0 0-1.42 1.42l1.37 1.36a9.96 9.96 0 0 0 0 12.66l-1.37 1.36a1 1 0 1 0 1.42 1.42l1.36-1.37a9.96 9.96 0 0 0 12.66 0l1.36 1.37a1 1 0 0 0 1.42-1.42l-1.37-1.36a9.96 9.96 0 0 0 0-12.66l1.37-1.36a1 1 0 0 0-1.42-1.42l-1.36 1.37A9.96 9.96 0 0 0 12 2Zm-2 10a2 2 0 1 1 4 0 2 2 0 0 1-4 0Zm2-4a4 4 0 1 0 0 8 4 4 0 0 0 0-8Z
+
+ M8 1c2.5 0 3.19.3 4.15.68L13 2c1.5.5 3 1 5 1 .89 0 1.78-.2 2.5-.42.7-.22 1.5.3 1.5 1.04v10.76c0 .38-.21.73-.56.87l-.3.12c-.78.28-1.96.63-3.14.63-2 0-3.5-.5-5-1-.31-.1-.58-.2-.84-.3-.98-.39-1.79-.7-4.16-.7-1.27 0-3.27.3-4 .5V21a1 1 0 0 1-.84.99h-.04a1 1 0 0 1-.24 0h-.04A1 1 0 0 1 2 21V3.58c0-.36.2-.69.51-.85C3.57 2.18 6.08 1 8 1Zm0 2c-.61 0-1.46.2-2.38.54-.6.22-1.17.47-1.62.68v8.37l.46-.13C5.36 12.21 6.54 12 8 12c1.27 0 2.2.08 3 .24.8.17 1.39.4 1.88.59l.75.27c1.5.5 2.73.9 4.37.9.68 0 1.4-.17 2-.36V4.78c-.61.13-1.3.22-2 .22-2.36 0-4.13-.6-5.63-1.1l-.95-.35c-.5-.2-.76-.3-1.17-.39a8.82 8.82 0 0 0-1.46-.15L8 3Z
+
M7.5 3a1 1 0 0 1 1-1h7a1 1 0 0 1 1 1v4.5a1 1 0 0 1-1 1H13V11h4.5a1 1 0 0 1 1 1v3.5H21a1 1 0 0 1 1 1V21a1 1 0 0 1-1 1h-7a1 1 0 0 1-1-1v-4.5a1 1 0 0 1 1-1h2.5V13h-9v2.5H10a1 1 0 0 1 1 1V21a1 1 0 0 1-1 1H3a1 1 0 0 1-1-1v-4.5a1 1 0 0 1 1-1h2.5V12a1 1 0 0 1 1-1H11V8.5H8.5a1 1 0 0 1-1-1V3Zm-1 14.5H4V20h5v-2.5H6.5Zm11 0H15V20h5v-2.5h-2.5ZM9.5 4v2.5h5V4h-5Z
M4 4a2 2 0 0 0-2 2v12c0 1.1.9 2 2 2h16a2 2 0 0 0 2-2V8a2 2 0 0 0-2-2h-8.59L10 4.59A2 2 0 0 0 8.59 4H4Zm0 2h4.59l1 1-1 1H4V6Zm0 4v8h16V8h-8.59L10 9.41a2 2 0 0 1-1.41.59H4Z
+
+ M6.9 2a3 3 0 0 1 1.66.5l2 1.33a1 1 0 0 0 .55.17h5.75a3 3 0 0 1 3 3v.83h.74a2 2 0 0 1 1.94 2.6l-3.16 9.98a2 2 0 0 1-1.91 1.4H2a1 1 0 0 1-1-1V5a3 3 0 0 1 3-3h2.9ZM13 9.92h-.82l-3.52.05-1.45.02-1.07 2.95-2.47 6.86h13.8l3.16-9.98-7.62.1ZM4 4a1 1 0 0 0-1 1v10.76l1.26-3.5 1.06-2.95A2 2 0 0 1 7.18 8l4.98-.06 5.7-.07V7a1 1 0 0 0-1-1H11.1a3 3 0 0 1-1.67-.5l-2-1.33A1 1 0 0 0 6.9 4H4Z
+
M6 8c0 3.3 2.7 6 6 6s6-2.7 6-6-2.7-6-6-6-6 2.7-6 6Zm2 0c0-2.2 1.8-4 4-4s4 1.8 4 4-1.8 4-4 4-4-1.8-4-4ZM2.12 20.56C2.35 20.05 4.65 15 12 15c0 0 1 0 1 1s-1 1-1 1c-6.2 0-8 4.2-8 4.4-.2.5-.8.7-1.3.5-.6-.2-.8-.8-.6-1.3l.02-.04ZM17 15a1 1 0 1 1 2 0v2h2a1 1 0 1 1 0 2h-2v2a1 1 0 1 1-2 0v-2h-2a1 1 0 1 1 0-2h2v-2Z
@@ -188,6 +246,12 @@
M8 3a3 3 0 0 0-2.83 4H3a1 1 0 0 0-1 1v4a1 1 0 0 0 1 1h1v8a1 1 0 0 0 1 1h14a1 1 0 0 0 1-1v-8h1a1 1 0 0 0 1-1V8a1 1 0 0 0-1-1h-2.17A3 3 0 0 0 16 3h-2c-.77 0-1.47.29-2 .76A2.99 2.99 0 0 0 10 3H8Zm5 6h7v2h-7V9Zm-2 0H4v2h7V9Zm0 4H6v7h5v-7Zm2 7h5v-7h-5v7ZM11 6v1H8a1 1 0 0 1 0-2h2a1 1 0 0 1 1 1Zm6 0a1 1 0 0 1-1 1h-3V6a1 1 0 0 1 1-1h2a1 1 0 0 1 1 1Z
+
+ M12.05 1a11.1 11.1 0 0 1 3.65.64A11 11 0 0 1 12.05 23h-.08a11.09 11.09 0 0 1-2.46-.29A11 11 0 0 1 12 1h.05Zm-.02 2A9.04 9.04 0 0 0 3 12h5.33a4.84 4.84 0 0 1 4.85 4.82v.08a.8.8 0 0 1-.8.73H9.69c-.52.07-.93.63-.93 1.68 0 .8.67 1.27 1.27 1.47.2.05.4.09.62.12l1.39.1a9 9 0 0 0 8.84-7.54c-.76.5-1.65.79-2.6.79a5.1 5.1 0 0 1-4.67-3.38H9.79c-.62 0-1.14-.5-1.03-1.11.58-3.17 2.72-4.5 5.39-4.46h.01c.17-.24.35-.47.54-.68l.2-.2c.28-.28.27-.74-.02-.95-.9-.3-1.86-.47-2.85-.47Zm-8.8 11a9 9 0 0 0 3.53 5.31c0-.8.16-1.66.64-2.37a2.86 2.86 0 0 1 2.39-1.32h1.12A2.85 2.85 0 0 0 8.33 14h-5.1Zm13.8-9.46c-.11.48-.35.93-.73 1.3a3.5 3.5 0 0 0-.47.57l-.6.92-1.1-.03c-1.01-.02-1.74.23-2.24.6a2.7 2.7 0 0 0-.77.97h3.85l.5 1.27c.53 1.34 1.66 2.11 2.8 2.11.57 0 1.11-.18 1.58-.51 0 0 .6-.39 1.05-1.07a9 9 0 0 0-3.87-6.13Z
+
+
+ M12 1a11 11 0 1 1 0 22 11 11 0 0 1 0-22ZM9.5 17c.54 2.41 1.46 4 2.5 4s1.96-1.59 2.5-4h-5Zm-4.98 0a9.03 9.03 0 0 0 3.98 3.3c-.2-.42-.37-.86-.52-1.3-.2-.61-.38-1.28-.52-2H4.52Zm12.02 0c-.14.72-.32 1.39-.52 2-.15.44-.32.88-.53 1.3a9.03 9.03 0 0 0 4-3.3h-2.95Zm.39-7a28.65 28.65 0 0 1-.09 5h3.65a8.98 8.98 0 0 0 .28-5h-3.84Zm-7.85 0a26.56 26.56 0 0 0 .1 5h5.65a25.75 25.75 0 0 0 .1-5H9.07Zm-5.85 0a9.02 9.02 0 0 0 .28 5h3.65a27.95 27.95 0 0 1-.09-5H3.23Zm12.26-6.3c.2.42.38.86.53 1.3.3.89.53 1.9.7 3h3.34a9.03 9.03 0 0 0-4.57-4.3ZM12 3c-1.18 0-2.2 2.04-2.69 5h5.38c-.5-2.96-1.51-5-2.69-5Zm-3.5.7A9.03 9.03 0 0 0 3.94 8h3.35c.16-1.1.4-2.11.7-3 .14-.44.31-.88.51-1.3Z
+
M3 2a1 1 0 0 0-1 1v7a1 1 0 0 0 1 1h7a1 1 0 0 0 1-1V3a1 1 0 0 0-1-1H3Zm1 7V4h5v5H4Zm-1 4a1 1 0 0 0-1 1v7a1 1 0 0 0 1 1h7a1 1 0 0 0 1-1v-7a1 1 0 0 0-1-1H3Zm1 7v-5h5v5H4Zm9-17a1 1 0 0 1 1-1h7a1 1 0 0 1 1 1v7a1 1 0 0 1-1 1h-7a1 1 0 0 1-1-1V3Zm2 1v5h5V4h-5Zm-1 9a1 1 0 0 0-1 1v7a1 1 0 0 0 1 1h7a1 1 0 0 0 1-1v-7a1 1 0 0 0-1-1h-7Zm1 7v-5h5v5h-5Z
@@ -202,9 +266,16 @@
M11.39 2.21a1 1 0 0 1 1.22 0l9 7A1 1 0 0 1 22 10v11a1 1 0 0 1-1 1h-6a1 1 0 0 1-1-1v-7h-4v7a1 1 0 0 1-1 1H3a1 1 0 0 1-1-1V10c0-.3.14-.6.39-.79l9-7ZM4 10.5V20h4v-7a1 1 0 0 1 1-1h6a1 1 0 0 1 1 1v7h4v-9.51l-8-6.22-8 6.22Z
+
+ M16.42 1.37c.45-.05.82.64.82.64.01.03 1 1.52 1.56 6.94.56 5.43.05 7.1.04 7.12 0 0-.2.76-.65.81l-.15.01c-.62.04-1-.17-1.6-.67l-.28-.25a8.89 8.89 0 0 0-6.84-2c-.46.03-.91.09-1.37.14l-.68.09a2.93 2.93 0 0 1-2.97-1.64l-.16.03c-1 .11-1.92-.56-2.13-1.52l-.03-.2A1.95 1.95 0 0 1 3.86 8.7c.25-1.1 1.14-2 2.3-2.22l.23-.04.68-.08.68-.09.69-.06a8.76 8.76 0 0 0 5.93-3.19l.3-.37c.64-.82 1.16-1.22 1.75-1.28Zm-.46 2.86a10.75 10.75 0 0 1-7.3 3.96h-.05l-1.3.15-.7.09c-.4.04-.8.71-.8.71s-.36.8-.3 1.33.6 1.22.6 1.22.54.57.93.52l.66-.08c.44-.06.94-.12 1.46-.16a10.95 10.95 0 0 1 7.89 2.15c.03-1 0-2.59-.24-4.96-.25-2.44-.58-4-.85-4.93Zm4.65 1.73a2.93 2.93 0 0 1 .63 5.5l-.09.04c-.46.14-.9-.24-.95-.74 0-.02-.04-1-.16-1.96-.12-.97-.29-1.92-.29-1.92.01-.02.34-1.03.86-.92Z
+ m-11.16 9.75.06.02.03.05.16.32a34.43 34.43 0 0 1 1.04 2.79c.14.42.09.66.02.8-.07.15-.23.3-.53.42l-.08.03a.9.9 0 0 1-.94-.26l-.05-.07a58.16 58.16 0 0 1-2.52-3.81l.34-.02c.64-.05 1.09-.1 1.57-.17l.44-.06h.05c.21-.04.32-.05.4-.04Z
+
M4 1a1 1 0 0 0 0 2h1v5c0 .27.1.52.3.7L8.58 12l-3.3 3.3A1 1 0 0 0 5 16v5H4a1 1 0 1 0 0 2h16a1 1 0 1 0 0-2h-1v-5a1 1 0 0 0-.3-.7L15.42 12l3.3-3.3A1 1 0 0 0 19 8V3h1a1 1 0 1 0 0-2H4Zm9.3 10.3L17 7.58V3H7v4.59l3.7 3.7a1 1 0 0 1 0 1.42L7 16.4V21h10v-4.59l-3.7-3.7a1 1 0 0 1 0-1.42ZM9 7a1 1 0 0 1 1-1h4a1 1 0 1 1 0 2h-4a1 1 0 0 1-1-1Zm0 11a1 1 0 1 0 0 2h6a1 1 0 1 0 0-2H9Z
+
+ M20 3a3 3 0 0 1 3 3v11a3 3 0 0 1-2.85 3H3.85A3 3 0 0 1 1 17.15V6a3 3 0 0 1 3-3h16ZM4 5a1 1 0 0 0-1 1v11a1 1 0 0 0 1 1h16a1 1 0 0 0 1-1V6a1 1 0 0 0-1-1H4Zm4 8.86c1.67 0 3.13.51 3.85 1.26.37.39 0 .88-.55.88H4.7c-.54 0-.92-.5-.55-.88.72-.75 2.18-1.26 3.85-1.26Zm9-.86a1 1 0 1 1 0 2h-3a1 1 0 1 1 0-2h3ZM8 7c1.6 0 2.35.73 2.39 2.63.4.15.43.64.28 1.18-.11.42-.36.74-.62.84-.42 1.07-1.19 1.78-2.05 1.78-.86 0-1.63-.71-2.05-1.78-.26-.1-.51-.42-.62-.84-.15-.54-.12-1.03.28-1.18C5.65 7.73 6.41 7 8 7Zm11 2a1 1 0 1 1 0 2h-5a1 1 0 1 1 0-2h5Z
+
M2 4c0-1.1.9-2 2-2h16a2 2 0 0 1 2 2v16a2 2 0 0 1-2 2H4a2 2 0 0 1-2-2V4Zm18 0H4v16h16V4ZM9 8a1 1 0 1 0 0 2 1 1 0 0 0 0-2ZM6 9a3 3 0 1 1 6 0 3 3 0 0 1-6 0Zm11.7 1.8a1 1 0 0 0-1.4 0l-3.87 3.86-1.8-1.44a1 1 0 0 0-1.34.07l-3.5 3.5a1 1 0 1 0 1.42 1.42l2.86-2.87 1.8 1.44a1 1 0 0 0 1.34-.07L17 12.9l.8.8a1 1 0 0 0 1.4-1.42l-1.5-1.5Z
@@ -254,6 +325,15 @@
M4 2a2 2 0 0 0-2 2v16c0 1.1.9 2 2 2h16a2 2 0 0 0 2-2V4a2 2 0 0 0-2-2H4Zm9 2h7v7h-2a1 1 0 1 0 0 2h2v7h-7v-2a1 1 0 1 0-2 0v2H4v-7h2a1 1 0 1 0 0-2H4V4h7v2a1 1 0 1 0 2 0V4ZM9 8a1 1 0 0 0-1 1v6a1 1 0 0 0 1 1h6a1 1 0 0 0 1-1V9a1 1 0 0 0-1-1H9Zm1 6v-4h4v4h-4Z
+
+ M16 21a1 1 0 1 1 0 2H8a1 1 0 1 1 0-2h8Zm3-10.5a1 1 0 0 1 1 1 8 8 1 1 1-16 0 1 1 0 1 1 2 0 6 6 0 0 0 12 0 1 1 0 0 1 1-1ZM12 1a4.5 4.5 0 0 1 4.5 4.5v6a4.5 4.5 1 1 1-9 0v-6A4.5 4.5 0 0 1 12 1Zm0 2a2.5 2.5 0 0 0-2.5 2.5v6a2.5 2.5 0 0 0 5 0v-6A2.5 2.5 0 0 0 12 3Z
+
+
+ M16 21a1 1 0 0 1 0 2H8a1 1 0 1 1 0-2h8Z
+ M12 1a4.5 4.5 0 0 1 4.5 4.3l3.6-3.6a1 1 0 0 1 1.4 1.42L3.13 21.51a1 1 0 1 1-1.41-1.42l3.85-3.85A7.96 7.96 0 0 1 4 11.5a1 1 0 1 1 2 0c0 1.22.37 2.36 1 3.3l1.08-1.09a4.47 4.47 0 0 1-.57-1.98l-.01-.23v-6A4.5 4.5 0 0 1 12 1Zm0 2a2.5 2.5 0 0 0-2.5 2.5v6c0 .24.03.48.1.7l4.9-4.9V5.5A2.5 2.5 0 0 0 12 3Z
+ M19 10.5a1 1 0 0 1 1 1 8 8 0 0 1-11.87 7L9.62 17A6 6 0 0 0 18 11.5a1 1 0 0 1 1-1Z
+ M16.5 11.5v.23a4.5 4.5 0 0 1-5.7 4.1l1.94-1.94a2.5 2.5 0 0 0 1.65-1.65l2.11-2.11v1.37Z
+
M12 23a11 11 0 1 0 0-22 11 11 0 0 0 0 22Zm9-11a9 9 0 1 1-18 0 9 9 0 0 1 18 0ZM8 11a1 1 0 1 0 0 2h8a1 1 0 1 0 0-2H8Z
@@ -269,6 +349,9 @@
M1 5c0-1.1.9-2 2-2h18a2 2 0 0 1 2 2v10a2 2 0 0 1-2 2h-8v2h3a1 1 0 1 1 0 2H8a1 1 0 1 1 0-2h3v-2H3a2 2 0 0 1-2-2V5Zm20 10H3V5h18v10Z
+
+ M8.27 8.36c0-2.04.84-3.9 2.19-5.23a9 9 0 1 0 10.4 10.41 7.36 7.36 0 0 1-12.6-5.18Zm2 0a5.36 5.36 0 0 0 9.86 2.93l.08-.11c.4-.51 1.02-.67 1.52-.6.55.08 1.27.52 1.27 1.42A11 11 0 1 1 12 1c.9 0 1.34.72 1.42 1.27.08.53-.1 1.2-.7 1.6a5.36 5.36 0 0 0-2.45 4.5Z
+
M7.5 12a2.5 2.5 0 1 1-5 0 2.5 2.5 0 0 1 5 0Z
M15 12a2.5 2.5 0 1 1-5 0 2.5 2.5 0 0 1 5 0Z
@@ -277,6 +360,9 @@
M11.3 2.29a1 1 0 0 1 .95-.26l6.42 1.5c.45.1.77.51.77.98v4.05a1 1 0 0 1-1.23.97L13 8.3v10.18A3.52 3.52 0 0 1 9.48 22H7.52A3.52 3.52 0 0 1 4 18.48v-.46a3.52 3.52 0 0 1 3.52-3.52H11V3a1 1 0 0 1 .3-.71ZM13 6.24l4.44 1.06v-2L13 4.26v1.98ZM7.52 16.5H11v1.98c0 .84-.68 1.52-1.52 1.52H7.52C6.68 20 6 19.32 6 18.48v-.46c0-.84.68-1.52 1.52-1.52Z
+
+ M10.38 2.22A1 1 0 0 1 12 3v18a1 1 0 0 1-1.63.78L4.66 17H2a1 1 0 0 1-1-1V8a1 1 0 0 1 1-1h2.65l5.72-4.78ZM5.92 8.54A2 2 0 0 1 4.65 9H3v6h1.65a2 2 0 0 1 1.28.46l4.07 3.4V5.14l-4.07 3.4Zm14.14-.83a1 1 0 0 1 1.42 1.41L19 11.6l2.48 2.47a1 1 0 1 1-1.42 1.42L17.6 13l-2.48 2.48a1 1 0 0 1-1.41-1.42l2.47-2.47-2.47-2.48a1 1 0 0 1 1.41-1.41l2.48 2.47 2.47-2.47Z
+
M5 6a1 1 0 1 1 0-2 1 1 0 0 1 0 2ZM2 5a3 3 0 1 1 6 0 3 3 0 0 1-6 0Zm3 8a1 1 0 1 1 0-2 1 1 0 0 1 0 2Zm-3-1a3 3 0 1 1 6 0 3 3 0 0 1-6 0Zm2 7a1 1 0 1 0 2 0 1 1 0 0 0-2 0Zm1-3a3 3 0 1 0 0 6 3 3 0 0 0 0-6Zm7-10a1 1 0 1 1 0-2 1 1 0 0 1 0 2ZM9 5a3 3 0 1 1 6 0 3 3 0 0 1-6 0Zm2 7a1 1 0 1 0 2 0 1 1 0 0 0-2 0Zm1-3a3 3 0 1 0 0 6 3 3 0 0 0 0-6Zm0 11a1 1 0 1 1 0-2 1 1 0 0 1 0 2Zm-3-1a3 3 0 1 1 6 0 3 3 0 0 1-6 0Zm7-14a3 3 0 1 1 6 0 3 3 0 0 1-6 0Zm2 7a1 1 0 1 0 2 0 1 1 0 0 0-2 0Zm1-3a3 3 0 1 0 0 6 3 3 0 0 0 0-6Zm0 11a1 1 0 1 1 0-2 1 1 0 0 1 0 2Zm-3-1a3 3 0 1 1 6 0 3 3 0 0 1-6 0Z
@@ -286,6 +372,12 @@
M5 4.5V9h.5c.28 0 .5.22.5.5v1a.5.5 0 0 1-.5.5h-3a.5.5 0 0 1-.5-.5v-1c0-.28.22-.5.5-.5H3V5h-.5a.5.5 0 0 1-.5-.5v-1c0-.28.22-.5.5-.5h2c.28 0 .5.22.5.5v1Zm3 0c0-.28.22-.5.5-.5h12c.28 0 .5.22.5.5v1a.5.5 0 0 1-.5.5h-12a.5.5 0 0 1-.5-.5v-1Zm0 10c0-.28.22-.5.5-.5h12c.28 0 .5.22.5.5v1a.5.5 0 0 1-.5.5h-12a.5.5 0 0 1-.5-.5v-1ZM8.5 8a.5.5 0 0 0-.5.5v1c0 .28.22.5.5.5h7a.5.5 0 0 0 .5-.5v-1a.5.5 0 0 0-.5-.5h-7ZM8 18.5c0-.28.22-.5.5-.5h7c.28 0 .5.22.5.5v1a.5.5 0 0 1-.5.5h-7a.5.5 0 0 1-.5-.5v-1Zm-6-5c0-.28.22-.5.5-.5h3c.28 0 .5.22.5.5v4a.5.5 0 0 1-.5.5H4v1h1.5c.28 0 .5.22.5.5v1a.5.5 0 0 1-.5.5h-3a.5.5 0 0 1-.5-.5v-4c0-.28.22-.5.5-.5H4v-1H2.5a.5.5 0 0 1-.5-.5v-1Z
+
+ M2.66 15.62a6.48 6.48 0 0 0 1.93 4.85 6.48 6.48 0 0 0 4.85 1.93 6.03 6.03 0 0 0 3.99-1.58l3.71-3.7c.7-.72 1.37-1.38 1.86-1.87l.58-.58.16-.15.04-.05h.01v-.01a1 1 0 1 0-1.41-1.41h-.01l-.05.05-.16.16-.58.58-1.85 1.86-3.71 3.7A4.48 4.48 0 0 1 6 19.06a4.48 4.48 0 0 1-1.35-3.37c.04-1.16.5-2.14 1-2.64l8.83-8.83a2.7 2.7 0 0 1 1.5-.6 2.9 2.9 0 0 1 2.39.95 2.9 2.9 0 0 1 .95 2.38 2.7 2.7 0 0 1-.6 1.5l-7.07 7.08c-.15.15-.52.34-1 .37-.44.03-.84-.09-1.12-.37-.28-.28-.4-.68-.37-1.13.03-.47.22-.84.37-1l2.92-2.9 1.66-1.67.53-.53.14-.14.04-.04.01-.01a1 1 0 1 0-1.41-1.42l-5.3 5.3c-.56.56-.9 1.43-.96 2.28-.06.88.18 1.9.96 2.67.78.79 1.8 1.02 2.67.96.85-.06 1.72-.4 2.28-.96l7.07-7.07a4.64 4.64 0 0 0 1.17-2.74 4.9 4.9 0 0 0-1.53-3.97 4.9 4.9 0 0 0-3.98-1.53c-1.18.1-2.2.64-2.73 1.17l-8.84 8.84a6.03 6.03 0 0 0-1.58 3.99Z
+
+
+ M5.9 1.59a2.11 2.11 0 0 1 2.89.77l2.78 4.81c.58 1.01.23 2.3-.77 2.89l-1.55.89h-.01v.01a36.9 36.9 0 0 0 3.92 3.82h.01l.01-.01 1.08-1.87a2.11 2.11 0 0 1 2.88-.77l4.81 2.78c1.01.58 1.36 1.87.77 2.88l-2.22 3.85a2.11 2.11 0 0 1-2.21 1.02h-.03l-.02-.01a23.67 23.67 0 0 1-11.26-6.3 23.68 23.68 0 0 1-5.8-9.43V6.9a4.8 4.8 0 0 1-.15-.73 2.8 2.8 0 0 1 0-.88l.01-.05A2.1 2.1 0 0 1 2.06 3.8L5.9 1.59Zm1 1.73L3.07 5.54a.11.11 0 0 0-.06.08v.1L3 5.9c.02.16.05.31.08.4a21.68 21.68 0 0 0 5.3 8.63 21.67 21.67 0 0 0 10.27 5.76c.05 0 .09-.01.11-.05l2.22-3.85a.11.11 0 0 0-.04-.15l-4.81-2.78a.11.11 0 0 0-.15.04l-1.08 1.87a2 2 0 0 1-3.03.55 38.68 38.68 0 0 1-4.14-4.03 2 2 0 0 1 .51-3.08l1.55-.89c.05-.03.07-.1.04-.15L7.06 3.36a.11.11 0 0 0-.15-.04Z
+
M11 3.05a9 9 0 1 0 6.62 15.98l-6.47-6.47a.5.5 0 0 1-.15-.35V3.05Zm2 0V11h7.95A9 9 0 0 0 13 3.05ZM14.41 13l4.62 4.62A8.96 8.96 0 0 0 20.95 13H14.4ZM1 12a11 11 0 1 1 22 0 11 11 0 0 1-22 0Z
@@ -326,9 +418,15 @@
M19 4a2 2 0 0 1 2 2v3a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2V6c0-1.1.9-2 2-2h14Zm0 5V6H5v3h14Z
M19 13a2 2 0 0 1 2 2v3a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2v-3c0-1.1.9-2 2-2h14Zm0 5v-3H5v3h14Z
+
+ M11.44 1.08c.37-.1.77-.1 1.15 0l8.7 2.64c.42.12.7.5.7.93.03 2.65-.03 11.8-2 14.36-1.97 2.57-6.36 3.68-7.63 3.95a1.6 1.6 0 0 1-.7 0c-1.24-.28-5.5-1.39-7.62-3.95C1.9 16.44 1.96 7.27 2.02 4.64c.01-.43.3-.8.7-.92l8.72-2.64ZM4.01 5.42c-.02 1.47 0 3.88.19 6.26.12 1.42.3 2.79.56 3.92.28 1.2.6 1.87.82 2.14A9.01 9.01 0 0 0 8.96 20c1.27.54 2.47.85 3.06.99.6-.14 1.83-.45 3.12-.99a8.15 8.15 0 0 0 3.26-2.2c.22-.28.52-.97.79-2.18.25-1.14.44-2.51.56-3.94.21-2.38.25-4.78.25-6.26L12 3l-8 2.42Zm11.02 2.7a1.38 1.38 0 0 1 2.05-.1c.52.53.55 1.36.06 1.92l-5.42 6.25a1 1 0 0 1-1.45.05l-3.24-3.26a1.43 1.43 0 0 1 0-2.02 1.4 1.4 0 0 1 2 0l1.99 2.02 4.01-4.86Z
+
M2 4c0-1.1.9-2 2-2h10.96a2 2 0 0 1 1.41.59l5.04 5.04a2 2 0 0 1 .59 1.4V20a2 2 0 0 1-2 2H4a2 2 0 0 1-2-2V4Zm9 0H8v3h3V4ZM6 4v4a1 1 0 0 0 1 1h5a1 1 0 0 0 1-1V4h1.96L20 9.04V20h-2v-5a1 1 0 0 0-1-1H7a1 1 0 0 0-1 1v5H4V4h2Zm10 12v4H8v-4h8Z
+
+ M20 18.5a1.5 1.5 0 1 0-2.84.67l.03.05.01.03a1.5 1.5 0 0 0 2.8-.75Zm-16 0a1.5 1.5 0 1 0 3 0 1.5 1.5 0 0 0-3 0Zm18 0a3.5 3.5 0 0 1-6.61 1.6l-1-1.79-2.36-4.08-2.41 4.18-1.04 1.75a3.5 3.5 0 1 1-.19-3.63l2.48-4.3L5.88 3.6a1 1 0 0 1 1.73-1l4.42 7.64 4.35-7.54a1 1 0 0 1 1.74 1l-4.94 8.54 2.46 4.25A3.5 3.5 0 0 1 22 18.5Z
+
M16 10a6 6 0 1 1-12 0 6 6 0 0 1 12 0Zm-1.1 6.32a8 8 0 1 1 1.41-1.41l5.4 5.38a1 1 0 0 1-1.42 1.42l-5.38-5.39Z
@@ -353,6 +451,10 @@
M14 5.5a3.5 3.5 0 1 1 1 2.45l-5.13 3.11a3.5 3.5 0 0 1 .03 1.79l5.22 3.08A3.49 3.49 0 0 1 21 18.5a3.5 3.5 0 1 1-6.9-.85l-5.22-3.08A3.49 3.49 0 0 1 3 12a3.5 3.5 0 0 1 5.8-2.63l5.27-3.19A3.51 3.51 0 0 1 14 5.5ZM17.5 4a1.5 1.5 0 1 0 0 3 1.5 1.5 0 0 0 0-3Zm-11 6.5a1.5 1.5 0 1 0 0 3 1.5 1.5 0 0 0 0-3Zm9.5 8a1.5 1.5 0 1 1 3 0 1.5 1.5 0 0 1-3 0Z
+
+ M18 5a1 1 0 0 1 1 1A7 7 0 1 1 5 6a1 1 0 0 1 2 0 5 5 0 0 0 10 0 1 1 0 0 1 1-1Z
+ M19 2a3 3 0 0 1 3 3v14a3 3 0 0 1-3 3H4.85A3 3 0 0 1 2 19V5a3 3 0 0 1 3-3h14ZM5 4a1 1 0 0 0-1 1v14a1 1 0 0 0 1 1h14a1 1 0 0 0 1-1V5a1 1 0 0 0-1-1H5Z
+
M3.7 2.3a1 1 0 0 0-1.4 1.4l5.79 5.8H4.5a1 1 0 0 0 0 2h6a1 1 0 0 0 1-1v-6a1 1 0 1 0-2 0v3.59l-5.8-5.8Zm8.88 10.82a1 1 0 0 0-.08.38v6a1 1 0 1 0 2 0v-3.59l5.8 5.8a1 1 0 0 0 1.4-1.42l-5.79-5.79h3.59a1 1 0 1 0 0-2h-6a1 1 0 0 0-.7.29l-.01.01a1 1 0 0 0-.21.32Z
@@ -381,6 +483,9 @@
M20.36 12a8.36 8.36 0 1 1-16.72 0 8.36 8.36 0 0 1 16.72 0ZM23 12a11 11 0 1 1-22 0 11 11 0 0 1 22 0Zm-5.45-2.15A1.32 1.32 0 1 0 15.7 8l-5.67 5.66-2.37-2.36a1.32 1.32 0 0 0-1.86 1.86l3.3 3.3a1.32 1.32 0 0 0 1.86 0l6.6-6.6Z
+
+ M12 20c.83 0 1.5.67 1.5 1.5v1a1.5 1.5 0 0 1-3 0v-1c0-.83.67-1.5 1.5-1.5Zm-7.78-2.34a1.5 1.5 0 1 1 2.12 2.12l-.7.7a1.5 1.5 0 0 1-2.13-2.12l.71-.7Zm13.44 0a1.5 1.5 0 0 1 2.12 0l.7.7a1.5 1.5 0 0 1-2.12 2.13l-.7-.71a1.5 1.5 0 0 1 0-2.12ZM12 5a7 7 0 1 1 0 14 7 7 0 0 1 0-14Zm0 2a5 5 0 1 0 0 10 5 5 0 0 0 0-10Zm-9.5 3.5a1.5 1.5 0 0 1 0 3h-1a1.5 1.5 0 0 1 0-3h1Zm20 0a1.5 1.5 0 0 1 0 3h-1a1.5 1.5 0 0 1 0-3h1ZM3.51 3.51a1.5 1.5 0 0 1 2.13 0l.7.71a1.5 1.5 0 1 1-2.12 2.12l-.7-.7a1.5 1.5 0 0 1 0-2.13Zm14.85 0a1.5 1.5 0 0 1 2.13 2.13l-.71.7a1.5 1.5 0 1 1-2.12-2.12l.7-.7ZM12 0c.83 0 1.5.67 1.5 1.5v1a1.5 1.5 0 0 1-3 0v-1c0-.83.67-1.5 1.5-1.5Z
+
M2 5c0-1.1.9-2 2-2h11a1 1 0 1 1 0 2H4v14h16v-8a1 1 0 1 1 2 0v8a2 2 0 0 1-2 2H4a2 2 0 0 1-2-2V5Z
M18.3 8.7a1 1 0 0 1 0-1.4L19.58 6l-1.3-1.3a1 1 0 0 1 1.42-1.4l2 2a1 1 0 0 1 0 1.4l-2 2a1 1 0 0 1-1.42 0Z
@@ -435,6 +540,11 @@
M12 3a3 3 0 0 0-3 3v2h9a2 2 0 0 1 2 2v10a2 2 0 0 1-2 2H6a2 2 0 0 1-2-2V10c0-1.1.9-2 2-2h1V6a5 5 0 0 1 10 0h-2a3 3 0 0 0-3-3ZM6 20h12V10H6v10Zm8-5a2 2 0 1 1-4 0 2 2 0 0 1 4 0Z
+
+ M8 11H5V8h3v3Z
+ M14 4a2 2 0 0 1 2 2v12a2 2 0 0 1-1.8 1.99L14 20H3l-.2-.01A2 2 0 0 1 1 18V6c0-1.1.9-2 2-2h11ZM3 18h11V6H3v12Z
+ M21.55 6.72a1 1 0 0 1 1.45.9v8.76a1 1 0 0 1-1.45.9l-4-2a1 1 0 0 1-.55-.9V9.62a1 1 0 0 1 .55-.9l4-2ZM19 10.24v3.52l2 1V9.24l-2 1Z
+
M23.03 12.03a11 11 0 1 1-22 0 11 11 0 0 1 22 0Zm-4.3 6.01A9 9 0 1 0 5.3 18a7.02 7.02 0 0 1 3.57-4.25A4.49 4.49 0 0 1 12 6a4.5 4.5 0 0 1 3.13 7.74 7.02 7.02 0 0 1 3.6 4.3Zm-1.75 1.5a5 5 0 0 0-9.96-.03 8.96 8.96 0 0 0 9.96.04ZM12 13a2.5 2.5 0 1 0 0-5 2.5 2.5 0 0 0 0 5Z
@@ -464,6 +574,17 @@
M4 2a2 2 0 0 0-2 2v16c0 1.1.9 2 2 2h4a1 1 0 1 0 0-2H4V4h16v10a1 1 0 1 0 2 0V4a2 2 0 0 0-2-2H4Zm5.5 5.13A1 1 0 0 0 8 8v8a1 1 0 0 0 1.5.87l7-4a1 1 0 0 0 0-1.74l-7-4ZM13.98 12 10 14.28V9.72L13.98 12ZM11 17h1v4h1v-4h1v4.5a.5.5 0 0 1-.5.5h-2a.5.5 0 0 1-.5-.5V17Zm9 0h-1v4.5c0 .28.22.5.5.5H22v-1h-2v-4Zm-4.5 0a.5.5 0 0 0-.5.5V22h1v-2h.17l.83 2h1l-.77-2h.27a.5.5 0 0 0 .5-.5v-2a.5.5 0 0 0-.5-.5h-2Zm1.5 1h-1v1h1v-1Z
+
+ M10.38 2.22A1 1 0 0 1 12 3v18a1 1 0 0 1-1.63.78L4.66 17H2a1 1 0 0 1-1-1V8a1 1 0 0 1 1-1h2.65l5.72-4.78ZM5.92 8.54A2 2 0 0 1 4.65 9H3v6h1.65a2 2 0 0 1 1.28.46l4.07 3.4V5.14l-4.07 3.4Z
+ M14.17 8.45a1 1 0 0 1 1.38-.28l.12.08.23.19A4.84 4.84 0 0 1 17.5 12a4.7 4.7 0 0 1-1.83 3.75l-.11.08a1 1 0 0 1-1.12-1.66l.13-.1c.1-.1.24-.23.38-.42.28-.37.55-.92.55-1.65a2.7 2.7 0 0 0-1.06-2.17 1 1 0 0 1-.27-1.38Z
+
+
+ M10.38 2.22A1 1 0 0 1 12 3v18a1 1 0 0 1-1.63.78L4.66 17H2a1 1 0 0 1-1-1V8a1 1 0 0 1 1-1h2.65l5.72-4.78ZM5.92 8.54A2 2 0 0 1 4.65 9H3v6h1.65a2 2 0 0 1 1.28.46l4.07 3.4V5.14l-4.07 3.4Z
+ M20 12c0-2.03-.86-3.56-1.76-4.6a8.55 8.55 0 0 0-1.74-1.54 1 1 0 1 1 1-1.72l.07.04a5.55 5.55 0 0 1 .67.47c.42.32.97.8 1.52 1.45A8.98 8.98 0 0 1 22 12a8.98 8.98 0 0 1-2.24 5.9 10.56 10.56 0 0 1-2.19 1.92l-.06.04a1 1 0 0 1-1.01-1.72l.12-.08.4-.29c.32-.26.77-.65 1.22-1.17A6.98 6.98 0 0 0 20 12Zm-5.56 2.17.13-.1c.1-.1.24-.23.38-.42.28-.37.55-.92.55-1.65a2.7 2.7 0 0 0-1.06-2.17 1 1 0 0 1 1.11-1.66l.12.08.23.19A4.84 4.84 0 0 1 17.5 12a4.7 4.7 0 0 1-1.83 3.75l-.11.08a1 1 0 0 1-1.12-1.66Z
+
+
+ M10.38 2.22A1 1 0 0 1 12 3v18a1 1 0 0 1-1.63.78L4.66 17H2a1 1 0 0 1-1-1V8a1 1 0 0 1 1-1h2.65l5.72-4.78ZM5.92 8.54A2 2 0 0 1 4.65 9H3v6h1.65a2 2 0 0 1 1.28.46l4.07 3.4V5.14l-4.07 3.4Z
+
M5 4.5C5 3.67 5.67 3 6.5 3h11c.83 0 1.5.67 1.5 1.5v11c0 .83-.67 1.5-1.5 1.5h-11A1.5 1.5 0 0 1 5 15.5v-11ZM7 5v10h10V5H7ZM5 19.5c0-.28.22-.5.5-.5h13c.28 0 .5.22.5.5v1a.5.5 0 0 1-.5.5h-13a.5.5 0 0 1-.5-.5v-1ZM2 14a1 1 0 0 0-1 1v5.5c0 .28.22.5.5.5h1a.5.5 0 0 0 .5-.5V16h.5a.5.5 0 0 0 .5-.5v-1a.5.5 0 0 0-.5-.5H2Zm19 2h-.5a.5.5 0 0 1-.5-.5v-1c0-.28.22-.5.5-.5H22a1 1 0 0 1 1 1v5.5a.5.5 0 0 1-.5.5h-1a.5.5 0 0 1-.5-.5V16Zm-5.3-7.3a1 1 0 0 0-1.4-1.4L11 10.58l-1.3-1.3a1 1 0 0 0-1.4 1.42l2 2a1 1 0 0 0 1.4 0l4-4Z
@@ -474,6 +595,9 @@
M14 3a1 1 0 0 1 1-1h6a1 1 0 0 1 1 1v6a1 1 0 1 1-2 0V4h-5a1 1 0 0 1-1-1Zm-4 18a1 1 0 0 1-1 1H3a1 1 0 0 1-1-1v-6a1 1 0 1 1 2 0v5h5a1 1 0 0 1 1 1ZM2 9a1 1 0 0 0 2 0V4h5a1 1 0 1 0 0-2H3a1 1 0 0 0-1 1v6Zm19 5a1 1 0 0 1 1 1v6a1 1 0 0 1-1 1h-6a1 1 0 1 1 0-2h5v-5a1 1 0 0 1 1-1ZM8.5 7.5a1 1 0 0 0-1 1v7a1 1 0 0 0 1 1h7a1 1 0 0 0 1-1v-7a1 1 0 0 0-1-1h-7Zm1 7v-5h5v5h-5Z
+
+ M13.92 8.46a5.46 5.46 0 0 0-6.61-5.34l2.13 2.13c.75.76.75 1.97 0 2.72L7.97 9.44c-.75.75-1.96.75-2.72 0L3.12 7.3a5.48 5.48 0 0 0 5.34 6.61c.7 0 1.36-.13 1.97-.37l.61-.23 7.43 7.43c.33.33.87.33 1.2 0l1.08-1.08a.85.85 0 0 0 0-1.2l-7.43-7.43.23-.6c.24-.62.37-1.28.37-1.98Zm2 0c0 .72-.1 1.4-.29 2.06l6.54 6.54a2.85 2.85 0 0 1 0 4.03l-1.09 1.08a2.85 2.85 0 0 1-4.02 0l-6.54-6.54a7.46 7.46 0 0 1-8.99-9.94l.09-.18c.48-.86 1.62-.91 2.25-.28l2.74 2.74L7.97 6.6 5.23 3.87c-.67-.67-.57-1.93.46-2.34l.33-.12a7.45 7.45 0 0 1 9.9 7.05Z
+
M16.95 4.24c0-.63.5-1.13 1.13-1.13h3.31a1.13 1.13 0 0 1 0 2.25h-3.31c-.62 0-1.13-.5-1.13-1.12Z
M13.66.9c.62 0 1.12.5 1.12 1.13v4.42a1.13 1.13 0 0 1-2.25 0V2.03c0-.63.5-1.13 1.13-1.13Z
From d865f2aeb49f4b958b54e06745ad27de414778a7 Mon Sep 17 00:00:00 2001
From: Zhang Dian <54255897+zdpcdt@users.noreply.github.com>
Date: Tue, 10 Mar 2026 19:07:27 +0800
Subject: [PATCH 19/45] chore: enable developer tools in debug mode and update
diagnostics package references.
---
demo/Directory.Packages.props | 2 +-
demo/Semi.Avalonia.Demo/App.axaml.cs | 3 +++
demo/Semi.Avalonia.Demo/Semi.Avalonia.Demo.csproj | 8 ++++----
3 files changed, 8 insertions(+), 5 deletions(-)
diff --git a/demo/Directory.Packages.props b/demo/Directory.Packages.props
index 7dd3f46..79a3188 100644
--- a/demo/Directory.Packages.props
+++ b/demo/Directory.Packages.props
@@ -7,7 +7,7 @@
-
+
diff --git a/demo/Semi.Avalonia.Demo/App.axaml.cs b/demo/Semi.Avalonia.Demo/App.axaml.cs
index 3a2b65a..b617ffe 100644
--- a/demo/Semi.Avalonia.Demo/App.axaml.cs
+++ b/demo/Semi.Avalonia.Demo/App.axaml.cs
@@ -12,6 +12,9 @@ public partial class App : Application
public override void Initialize()
{
AvaloniaXamlLoader.Load(this);
+#if DEBUG
+ this.AttachDeveloperTools();
+#endif
this.DataContext = new ApplicationViewModel();
}
diff --git a/demo/Semi.Avalonia.Demo/Semi.Avalonia.Demo.csproj b/demo/Semi.Avalonia.Demo/Semi.Avalonia.Demo.csproj
index ea4d27f..30203ee 100644
--- a/demo/Semi.Avalonia.Demo/Semi.Avalonia.Demo.csproj
+++ b/demo/Semi.Avalonia.Demo/Semi.Avalonia.Demo.csproj
@@ -15,10 +15,10 @@
-
-
-
-
+
+ None
+ All
+
From dd5f5182fa6aea12c759d20b7d693c5e7199b59d Mon Sep 17 00:00:00 2001
From: Zhang Dian <54255897+zdpcdt@users.noreply.github.com>
Date: Thu, 12 Mar 2026 15:56:39 +0800
Subject: [PATCH 20/45] fix CommandBar issues (#763)
* feat: extract shared theme from AppBarButton & AppBarToggleButton.
* feat: enhance CommandBar with dynamic overflow and adjustable width.
* fix: fix Width in IsCompact mode.
---
.../Pages/CommandBarDemo.axaml | 30 +-
src/Semi.Avalonia/Controls/CommandBar.axaml | 351 ++++++++----------
.../Themes/Shared/CommandBar.axaml | 9 +-
3 files changed, 168 insertions(+), 222 deletions(-)
diff --git a/demo/Semi.Avalonia.Demo/Pages/CommandBarDemo.axaml b/demo/Semi.Avalonia.Demo/Pages/CommandBarDemo.axaml
index d67d1b6..5ded044 100644
--- a/demo/Semi.Avalonia.Demo/Pages/CommandBarDemo.axaml
+++ b/demo/Semi.Avalonia.Demo/Pages/CommandBarDemo.axaml
@@ -12,8 +12,8 @@
-
-
+
+
+
+
-
+
@@ -59,25 +64,6 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
\ No newline at end of file
diff --git a/src/Semi.Avalonia/Controls/CommandBar.axaml b/src/Semi.Avalonia/Controls/CommandBar.axaml
index 4f15503..bb216be 100644
--- a/src/Semi.Avalonia/Controls/CommandBar.axaml
+++ b/src/Semi.Avalonia/Controls/CommandBar.axaml
@@ -1,36 +1,53 @@
+ xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
+ xmlns:collections="clr-namespace:Avalonia.Collections;assembly=Avalonia.Base">
-
-
-
+
+
+
+
+
+
+ Bottom
+ Collapsed
+ Right
+
+
+
+
+
+
+
+
+
-
+
+
+
+
+
+
+
+
-
+
-
-
-
-
-
-
-
-
-
-
-
-
-
+
-
+
+ Spacing="{DynamicResource AppBarButtonPanelSpacing}"
+ HorizontalAlignment="{TemplateBinding HorizontalContentAlignment}"
+ VerticalAlignment="{TemplateBinding VerticalContentAlignment}">
+ Foreground="{TemplateBinding Foreground}">
-
+
+
+
+
+
+
+
+
+
+
+
+
+
-
-
-
+
-
+
-
-
-
-
-
+
+
-
-
-
+
+
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
+
-
-
+
-
-
-
-
-
-
-
-
-
-
-
-
-
-
+
+
-
-
-
-
-
+
+
-
+
-
-
-
+
+
@@ -325,18 +295,12 @@
-
+ Icon="{DynamicResource CommandBarOverflowButtonGlyph}"
+ IsCompact="True"
+ IsVisible="{TemplateBinding IsOverflowButtonVisible}" />
+ CornerRadius="{DynamicResource CommandBarOverflowCornerRadius}">
+
-
+
@@ -392,15 +360,4 @@
-
-
-
-
-
-
-
-
-
-
\ No newline at end of file
diff --git a/src/Semi.Avalonia/Themes/Shared/CommandBar.axaml b/src/Semi.Avalonia/Themes/Shared/CommandBar.axaml
index 81f4f45..81ef40d 100644
--- a/src/Semi.Avalonia/Themes/Shared/CommandBar.axaml
+++ b/src/Semi.Avalonia/Themes/Shared/CommandBar.axaml
@@ -1,10 +1,10 @@
- 68
+ 64
40
40
- 20
8 4
+ 4
36
@@ -22,8 +22,11 @@
+ 16
+ 400
+ 600
0 4
- 160
+ 8
From c84c8a3c90e5571518f4186f8cd98c3897e4fc1c Mon Sep 17 00:00:00 2001
From: Zhang Dian <54255897+zdpcdt@users.noreply.github.com>
Date: Thu, 12 Mar 2026 16:34:24 +0800
Subject: [PATCH 21/45] fix: fix :checked:disabled color in AppBarToggleButton.
---
.../Pages/CommandBarDemo.axaml | 79 ++++++++++++-------
src/Semi.Avalonia/Controls/CommandBar.axaml | 16 ++--
.../Themes/Dark/CommandBar.axaml | 2 +
.../Themes/HighContrast/CommandBar.axaml | 2 +
.../Themes/Light/CommandBar.axaml | 2 +
5 files changed, 69 insertions(+), 32 deletions(-)
diff --git a/demo/Semi.Avalonia.Demo/Pages/CommandBarDemo.axaml b/demo/Semi.Avalonia.Demo/Pages/CommandBarDemo.axaml
index 5ded044..831543a 100644
--- a/demo/Semi.Avalonia.Demo/Pages/CommandBarDemo.axaml
+++ b/demo/Semi.Avalonia.Demo/Pages/CommandBarDemo.axaml
@@ -8,37 +8,62 @@
d:DesignHeight="600"
d:DesignWidth="800"
mc:Ignorable="d">
+
+
+ Bottom
+ Collapsed
+ Right
+
+
+ Auto
+ Collapsed
+ Visible
+
+
-
-
-
-
-
-
-
- Bottom
- Collapsed
- Right
-
-
-
-
-
-
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ IsOpen="{Binding #isop.IsChecked}"
+ IsSticky="{Binding #isst.IsChecked}"
+ Width="{Binding #ws.Value}">
+
@@ -46,13 +71,13 @@
-
+
-
-
+
+
-
+
@@ -62,7 +87,7 @@
-
+
diff --git a/src/Semi.Avalonia/Controls/CommandBar.axaml b/src/Semi.Avalonia/Controls/CommandBar.axaml
index bb216be..e4c6950 100644
--- a/src/Semi.Avalonia/Controls/CommandBar.axaml
+++ b/src/Semi.Avalonia/Controls/CommandBar.axaml
@@ -4,8 +4,8 @@
xmlns:collections="clr-namespace:Avalonia.Collections;assembly=Avalonia.Base">
-
-
+
+
-
+
-
+
@@ -42,7 +42,7 @@
-
+
@@ -197,6 +197,12 @@
+
+
diff --git a/src/Semi.Avalonia/Themes/Dark/CommandBar.axaml b/src/Semi.Avalonia/Themes/Dark/CommandBar.axaml
index ed5a4d9..240174c 100644
--- a/src/Semi.Avalonia/Themes/Dark/CommandBar.axaml
+++ b/src/Semi.Avalonia/Themes/Dark/CommandBar.axaml
@@ -9,6 +9,8 @@
+
+
diff --git a/src/Semi.Avalonia/Themes/HighContrast/CommandBar.axaml b/src/Semi.Avalonia/Themes/HighContrast/CommandBar.axaml
index 56696d9..5bf5d3b 100644
--- a/src/Semi.Avalonia/Themes/HighContrast/CommandBar.axaml
+++ b/src/Semi.Avalonia/Themes/HighContrast/CommandBar.axaml
@@ -9,6 +9,8 @@
+
+
diff --git a/src/Semi.Avalonia/Themes/Light/CommandBar.axaml b/src/Semi.Avalonia/Themes/Light/CommandBar.axaml
index ed5a4d9..240174c 100644
--- a/src/Semi.Avalonia/Themes/Light/CommandBar.axaml
+++ b/src/Semi.Avalonia/Themes/Light/CommandBar.axaml
@@ -9,6 +9,8 @@
+
+
From 141eeefd2e3df94adaedda5db2ea6b86006f3ada Mon Sep 17 00:00:00 2001
From: Zhang Dian <54255897+zdpcdt@users.noreply.github.com>
Date: Fri, 13 Mar 2026 16:28:44 +0800
Subject: [PATCH 22/45] Sync upstream update. (#764)
---
src/Semi.Avalonia/Controls/SplitView.axaml | 5 +-
src/Semi.Avalonia/Controls/TabControl.axaml | 80 +++++++++++++--------
2 files changed, 54 insertions(+), 31 deletions(-)
diff --git a/src/Semi.Avalonia/Controls/SplitView.axaml b/src/Semi.Avalonia/Controls/SplitView.axaml
index b244f58..0b2e56e 100644
--- a/src/Semi.Avalonia/Controls/SplitView.axaml
+++ b/src/Semi.Avalonia/Controls/SplitView.axaml
@@ -52,7 +52,7 @@
diff --git a/src/Semi.Avalonia/Controls/TabControl.axaml b/src/Semi.Avalonia/Controls/TabControl.axaml
index cbbd7e7..5094acf 100644
--- a/src/Semi.Avalonia/Controls/TabControl.axaml
+++ b/src/Semi.Avalonia/Controls/TabControl.axaml
@@ -36,13 +36,19 @@
ItemsPanel="{TemplateBinding ItemsPanel}" />
-
+
+
+
+
@@ -149,13 +155,19 @@
Name="PART_ItemsPresenter"
ItemsPanel="{TemplateBinding ItemsPanel}" />
-
+
+
+
+
@@ -200,13 +212,19 @@
-
+
+
+
+
@@ -335,13 +353,19 @@
ItemsPanel="{TemplateBinding ItemsPanel}" />
-
+
+
+
+
From 1d59cff87d82b313242511554c096d6d3fbcc2a6 Mon Sep 17 00:00:00 2001
From: Copilot <198982749+Copilot@users.noreply.github.com>
Date: Sun, 15 Mar 2026 03:37:50 +0800
Subject: [PATCH 23/45] Implement Semi Design theme for page-based navigation
controls (ContentPage / DrawerPage / NavigationPage / TabbedPage) (#766)
* Initial plan
* Implement Semi Design theme for ContentPage, DrawerPage, NavigationPage, TabbedPage
Co-authored-by: zdpcdt <54255897+zdpcdt@users.noreply.github.com>
* fix: bind ItemsSource to Pages in TabControl of TabbedPage.
* chore: split demo navigation pages.
* demo: improve NavigationPage demo pages with interactive controls
Co-authored-by: zdpcdt <54255897+zdpcdt@users.noreply.github.com>
* fix: use comma-separated Padding syntax and remove trailing newline
Co-authored-by: zdpcdt <54255897+zdpcdt@users.noreply.github.com>
* feat: implement semi design theme for navigation controls in demo pages.
* feat: enhance demo pages with foreground color for better visibility
* feat: add back button visibility control and improve navigation page layout.
* chore: remove DrawerPage unused static resources.
* feat: add HighContrast resources for ContentPage, DrawerPage, NavigationPage, TabbedPage
Co-authored-by: zdpcdt <54255897+zdpcdt@users.noreply.github.com>
* feat: implement CardTabbedPage & ButtonTabbedPage themes.
---------
Co-authored-by: copilot-swe-agent[bot] <198982749+Copilot@users.noreply.github.com>
Co-authored-by: zdpcdt <54255897+zdpcdt@users.noreply.github.com>
Co-authored-by: Dong Bin
---
.../Pages/ContentPageDemo.axaml | 54 +++++++
.../Pages/ContentPageDemo.axaml.cs | 93 ++++++++++++
.../Pages/DrawerPageDemo.axaml | 72 +++++++++
.../Pages/DrawerPageDemo.axaml.cs | 68 +++++++++
.../Pages/NavigationDemoHelper.cs | 66 ++++++++
.../Pages/NavigationPageDemo.axaml | 65 ++++++++
.../Pages/NavigationPageDemo.axaml.cs | 66 ++++++++
.../Pages/TabbedPageDemo.axaml | 80 ++++++++++
.../Pages/TabbedPageDemo.axaml.cs | 84 ++++++++++
demo/Semi.Avalonia.Demo/Views/MainView.axaml | 12 ++
src/Semi.Avalonia/Controls/ContentPage.axaml | 43 ++++++
src/Semi.Avalonia/Controls/DrawerPage.axaml | 143 ++++++++++++++++++
.../Controls/NavigationPage.axaml | 94 ++++++++++++
src/Semi.Avalonia/Controls/TabbedPage.axaml | 41 +++++
src/Semi.Avalonia/Controls/_index.axaml | 4 +
.../Themes/Dark/ContentPage.axaml | 5 +
.../Themes/Dark/DrawerPage.axaml | 13 ++
.../Themes/Dark/NavigationPage.axaml | 14 ++
.../Themes/Dark/TabbedPage.axaml | 2 +
src/Semi.Avalonia/Themes/Dark/_index.axaml | 4 +
.../Themes/HighContrast/ContentPage.axaml | 5 +
.../Themes/HighContrast/DrawerPage.axaml | 13 ++
.../Themes/HighContrast/NavigationPage.axaml | 14 ++
.../Themes/HighContrast/TabbedPage.axaml | 2 +
.../Themes/HighContrast/_index.axaml | 4 +
.../Themes/Light/ContentPage.axaml | 5 +
.../Themes/Light/DrawerPage.axaml | 13 ++
.../Themes/Light/NavigationPage.axaml | 14 ++
.../Themes/Light/TabbedPage.axaml | 2 +
src/Semi.Avalonia/Themes/Light/_index.axaml | 4 +
.../Themes/Shared/ContentPage.axaml | 4 +
.../Themes/Shared/DrawerPage.axaml | 15 ++
.../Themes/Shared/NavigationPage.axaml | 7 +
.../Themes/Shared/TabbedPage.axaml | 4 +
src/Semi.Avalonia/Themes/Shared/_index.axaml | 4 +
35 files changed, 1133 insertions(+)
create mode 100644 demo/Semi.Avalonia.Demo/Pages/ContentPageDemo.axaml
create mode 100644 demo/Semi.Avalonia.Demo/Pages/ContentPageDemo.axaml.cs
create mode 100644 demo/Semi.Avalonia.Demo/Pages/DrawerPageDemo.axaml
create mode 100644 demo/Semi.Avalonia.Demo/Pages/DrawerPageDemo.axaml.cs
create mode 100644 demo/Semi.Avalonia.Demo/Pages/NavigationDemoHelper.cs
create mode 100644 demo/Semi.Avalonia.Demo/Pages/NavigationPageDemo.axaml
create mode 100644 demo/Semi.Avalonia.Demo/Pages/NavigationPageDemo.axaml.cs
create mode 100644 demo/Semi.Avalonia.Demo/Pages/TabbedPageDemo.axaml
create mode 100644 demo/Semi.Avalonia.Demo/Pages/TabbedPageDemo.axaml.cs
create mode 100644 src/Semi.Avalonia/Controls/ContentPage.axaml
create mode 100644 src/Semi.Avalonia/Controls/DrawerPage.axaml
create mode 100644 src/Semi.Avalonia/Controls/NavigationPage.axaml
create mode 100644 src/Semi.Avalonia/Controls/TabbedPage.axaml
create mode 100644 src/Semi.Avalonia/Themes/Dark/ContentPage.axaml
create mode 100644 src/Semi.Avalonia/Themes/Dark/DrawerPage.axaml
create mode 100644 src/Semi.Avalonia/Themes/Dark/NavigationPage.axaml
create mode 100644 src/Semi.Avalonia/Themes/Dark/TabbedPage.axaml
create mode 100644 src/Semi.Avalonia/Themes/HighContrast/ContentPage.axaml
create mode 100644 src/Semi.Avalonia/Themes/HighContrast/DrawerPage.axaml
create mode 100644 src/Semi.Avalonia/Themes/HighContrast/NavigationPage.axaml
create mode 100644 src/Semi.Avalonia/Themes/HighContrast/TabbedPage.axaml
create mode 100644 src/Semi.Avalonia/Themes/Light/ContentPage.axaml
create mode 100644 src/Semi.Avalonia/Themes/Light/DrawerPage.axaml
create mode 100644 src/Semi.Avalonia/Themes/Light/NavigationPage.axaml
create mode 100644 src/Semi.Avalonia/Themes/Light/TabbedPage.axaml
create mode 100644 src/Semi.Avalonia/Themes/Shared/ContentPage.axaml
create mode 100644 src/Semi.Avalonia/Themes/Shared/DrawerPage.axaml
create mode 100644 src/Semi.Avalonia/Themes/Shared/NavigationPage.axaml
create mode 100644 src/Semi.Avalonia/Themes/Shared/TabbedPage.axaml
diff --git a/demo/Semi.Avalonia.Demo/Pages/ContentPageDemo.axaml b/demo/Semi.Avalonia.Demo/Pages/ContentPageDemo.axaml
new file mode 100644
index 0000000..983fff3
--- /dev/null
+++ b/demo/Semi.Avalonia.Demo/Pages/ContentPageDemo.axaml
@@ -0,0 +1,54 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/demo/Semi.Avalonia.Demo/Pages/ContentPageDemo.axaml.cs b/demo/Semi.Avalonia.Demo/Pages/ContentPageDemo.axaml.cs
new file mode 100644
index 0000000..c5d29e3
--- /dev/null
+++ b/demo/Semi.Avalonia.Demo/Pages/ContentPageDemo.axaml.cs
@@ -0,0 +1,93 @@
+using Avalonia.Controls;
+using Avalonia.Interactivity;
+using Avalonia.Media;
+using Avalonia.Layout;
+
+namespace Semi.Avalonia.Demo.Pages;
+
+public partial class ContentPageDemo : UserControl
+{
+ private static readonly Color[] PageColors =
+ [
+ Color.FromRgb(0xE3, 0xF2, 0xFD), // blue
+ Color.FromRgb(0xF3, 0xE5, 0xF5), // purple
+ Color.FromRgb(0xE8, 0xF5, 0xE9), // green
+ Color.FromRgb(0xFF, 0xF8, 0xE1), // amber
+ Color.FromRgb(0xFB, 0xE9, 0xE7), // deep orange
+ ];
+
+ private int _pageCount;
+
+ public ContentPageDemo()
+ {
+ InitializeComponent();
+ Loaded += OnLoaded;
+ }
+
+ private async void OnLoaded(object? sender, RoutedEventArgs e)
+ {
+ await DemoNav.PushAsync(MakePage("Root Page", "ContentPage inside a NavigationPage.\nUse the options to navigate."));
+ UpdateStatus();
+ }
+
+ private async void OnPush(object? sender, RoutedEventArgs e)
+ {
+ _pageCount++;
+ await DemoNav.PushAsync(MakePage($"Page {_pageCount}", $"ContentPage #{_pageCount}.\nNavigate back using the back button."));
+ UpdateStatus();
+ }
+
+ private async void OnPop(object? sender, RoutedEventArgs e)
+ {
+ await DemoNav.PopAsync();
+ UpdateStatus();
+ }
+
+ private async void OnPopToRoot(object? sender, RoutedEventArgs e)
+ {
+ await DemoNav.PopToRootAsync();
+ _pageCount = 0;
+ UpdateStatus();
+ }
+
+ private void UpdateStatus()
+ {
+ StatusText.Text = $"Depth: {DemoNav.StackDepth} | Current: {DemoNav.CurrentPage?.Header}";
+ }
+
+ private ContentPage MakePage(string header, string body) =>
+ new ContentPage
+ {
+ Header = header,
+ Background = new SolidColorBrush(PageColors[_pageCount % PageColors.Length]),
+ Content = new StackPanel
+ {
+ HorizontalAlignment = HorizontalAlignment.Center,
+ VerticalAlignment = VerticalAlignment.Center,
+ Spacing = 10,
+ Children =
+ {
+ new TextBlock
+ {
+ Text = header,
+ FontSize = 20,
+ FontWeight = FontWeight.SemiBold,
+ HorizontalAlignment = HorizontalAlignment.Center,
+ Foreground = Brushes.Black,
+ },
+ new TextBlock
+ {
+ Text = body,
+ FontSize = 13,
+ Opacity = 0.7,
+ TextWrapping = TextWrapping.Wrap,
+ TextAlignment = TextAlignment.Center,
+ MaxWidth = 260,
+ Foreground = Brushes.Black,
+ }
+ }
+ },
+ HorizontalContentAlignment = HorizontalAlignment.Stretch,
+ VerticalContentAlignment = VerticalAlignment.Stretch
+ };
+}
\ No newline at end of file
diff --git a/demo/Semi.Avalonia.Demo/Pages/DrawerPageDemo.axaml b/demo/Semi.Avalonia.Demo/Pages/DrawerPageDemo.axaml
new file mode 100644
index 0000000..e5affdc
--- /dev/null
+++ b/demo/Semi.Avalonia.Demo/Pages/DrawerPageDemo.axaml
@@ -0,0 +1,72 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/demo/Semi.Avalonia.Demo/Pages/DrawerPageDemo.axaml.cs b/demo/Semi.Avalonia.Demo/Pages/DrawerPageDemo.axaml.cs
new file mode 100644
index 0000000..7e0316f
--- /dev/null
+++ b/demo/Semi.Avalonia.Demo/Pages/DrawerPageDemo.axaml.cs
@@ -0,0 +1,68 @@
+using System;
+using Avalonia.Controls;
+using Avalonia.Interactivity;
+using Avalonia.Layout;
+using Avalonia.Media;
+
+namespace Semi.Avalonia.Demo.Pages;
+
+public partial class DrawerPageDemo : UserControl
+{
+ public DrawerPageDemo()
+ {
+ InitializeComponent();
+ }
+
+ protected override void OnLoaded(RoutedEventArgs e)
+ {
+ base.OnLoaded(e);
+ DemoDrawer.Opened += OnDrawerStatusChanged;
+ DemoDrawer.Closed += OnDrawerStatusChanged;
+ }
+
+ protected override void OnUnloaded(RoutedEventArgs e)
+ {
+ base.OnUnloaded(e);
+ DemoDrawer.Opened -= OnDrawerStatusChanged;
+ DemoDrawer.Closed -= OnDrawerStatusChanged;
+ }
+
+ private void OnDrawerStatusChanged(object? sender, EventArgs e) => UpdateStatus();
+
+ private void OnToggleDrawer(object? sender, RoutedEventArgs e)
+ {
+ DemoDrawer.IsOpen = !DemoDrawer.IsOpen;
+ }
+
+ private void OnGestureChanged(object? sender, RoutedEventArgs e)
+ {
+ DemoDrawer.IsGestureEnabled = GestureCheck.IsChecked == true;
+ }
+
+ private void OnMenuSelectionChanged(object? sender, SelectionChangedEventArgs e)
+ {
+ if (DrawerMenu.SelectedItem is ListBoxItem item)
+ {
+ DemoDrawer.Content = new ContentPage
+ {
+ Header = item.Content?.ToString(),
+ Content = new TextBlock
+ {
+ Text = $"{item.Content} page content",
+ FontSize = 16,
+ HorizontalAlignment = HorizontalAlignment.Center,
+ VerticalAlignment = VerticalAlignment.Center,
+ Foreground = Brushes.Black,
+ },
+ HorizontalContentAlignment = HorizontalAlignment.Stretch,
+ VerticalContentAlignment = VerticalAlignment.Stretch
+ };
+ DemoDrawer.IsOpen = false;
+ }
+ }
+
+ private void UpdateStatus()
+ {
+ StatusText.Text = $"Drawer: {(DemoDrawer.IsOpen ? "Open" : "Closed")}";
+ }
+}
\ No newline at end of file
diff --git a/demo/Semi.Avalonia.Demo/Pages/NavigationDemoHelper.cs b/demo/Semi.Avalonia.Demo/Pages/NavigationDemoHelper.cs
new file mode 100644
index 0000000..fd7ad57
--- /dev/null
+++ b/demo/Semi.Avalonia.Demo/Pages/NavigationDemoHelper.cs
@@ -0,0 +1,66 @@
+using Avalonia.Controls;
+using Avalonia.Layout;
+using Avalonia.Media;
+
+namespace Semi.Avalonia.Demo.Pages;
+
+///
+/// Shared helpers for ControlCatalog demo pages.
+///
+internal static class NavigationDemoHelper
+{
+ ///
+ /// Pastel background brushes cycled by page index.
+ ///
+ internal static readonly IBrush[] PageBrushes =
+ [
+ new SolidColorBrush(Color.Parse("#BBDEFB")),
+ new SolidColorBrush(Color.Parse("#C8E6C9")),
+ new SolidColorBrush(Color.Parse("#FFE0B2")),
+ new SolidColorBrush(Color.Parse("#E1BEE7")),
+ new SolidColorBrush(Color.Parse("#FFCDD2")),
+ new SolidColorBrush(Color.Parse("#B2EBF2"))
+ ];
+
+ internal static IBrush GetPageBrush(int index) =>
+ PageBrushes[(index % PageBrushes.Length + PageBrushes.Length) % PageBrushes.Length];
+
+ ///
+ /// Creates a simple demo ContentPage with a centered title and subtitle.
+ ///
+ internal static ContentPage MakePage(string header, string body, int colorIndex) =>
+ new()
+ {
+ Header = header,
+ Background = GetPageBrush(colorIndex),
+ Content = new StackPanel
+ {
+ HorizontalAlignment = HorizontalAlignment.Center,
+ VerticalAlignment = VerticalAlignment.Center,
+ Spacing = 8,
+ Children =
+ {
+ new TextBlock
+ {
+ Text = header,
+ FontSize = 20,
+ FontWeight = FontWeight.SemiBold,
+ HorizontalAlignment = HorizontalAlignment.Center,
+ Foreground = Brushes.Black,
+ },
+ new TextBlock
+ {
+ Text = body,
+ FontSize = 13,
+ Opacity = 0.7,
+ TextWrapping = TextWrapping.Wrap,
+ TextAlignment = TextAlignment.Center,
+ MaxWidth = 260,
+ Foreground = Brushes.Black,
+ }
+ }
+ },
+ HorizontalContentAlignment = HorizontalAlignment.Stretch,
+ VerticalContentAlignment = VerticalAlignment.Stretch
+ };
+}
\ No newline at end of file
diff --git a/demo/Semi.Avalonia.Demo/Pages/NavigationPageDemo.axaml b/demo/Semi.Avalonia.Demo/Pages/NavigationPageDemo.axaml
new file mode 100644
index 0000000..055e20a
--- /dev/null
+++ b/demo/Semi.Avalonia.Demo/Pages/NavigationPageDemo.axaml
@@ -0,0 +1,65 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/demo/Semi.Avalonia.Demo/Pages/NavigationPageDemo.axaml.cs b/demo/Semi.Avalonia.Demo/Pages/NavigationPageDemo.axaml.cs
new file mode 100644
index 0000000..88a61d3
--- /dev/null
+++ b/demo/Semi.Avalonia.Demo/Pages/NavigationPageDemo.axaml.cs
@@ -0,0 +1,66 @@
+using Avalonia.Controls;
+using Avalonia.Interactivity;
+
+namespace Semi.Avalonia.Demo.Pages;
+
+public partial class NavigationPageDemo : UserControl
+{
+ private int _pageCount;
+
+ public NavigationPageDemo()
+ {
+ InitializeComponent();
+ Loaded += OnLoaded;
+ }
+
+ private async void OnLoaded(object? sender, RoutedEventArgs e)
+ {
+ await DemoNav.PushAsync(NavigationDemoHelper.MakePage("Home", "Welcome!\nUse the buttons to push and pop pages.", 0), null);
+ UpdateStatus();
+ }
+
+ private async void OnPush(object? sender, RoutedEventArgs e)
+ {
+ _pageCount++;
+ var page = NavigationDemoHelper.MakePage($"Page {_pageCount}", $"This is page {_pageCount}.", _pageCount);
+ NavigationPage.SetHasNavigationBar(page, HasNavBarCheck.IsChecked == true);
+ NavigationPage.SetHasBackButton(page, HasBackButtonCheck.IsChecked == true);
+ await DemoNav.PushAsync(page);
+ UpdateStatus();
+ }
+
+ private async void OnPop(object? sender, RoutedEventArgs e)
+ {
+ await DemoNav.PopAsync();
+ UpdateStatus();
+ }
+
+ private async void OnPopToRoot(object? sender, RoutedEventArgs e)
+ {
+ await DemoNav.PopToRootAsync();
+ _pageCount = 0;
+ UpdateStatus();
+ }
+
+ private void OnHasNavBarChanged(object? sender, RoutedEventArgs e)
+ {
+ if (DemoNav == null)
+ return;
+ if (DemoNav.CurrentPage != null)
+ NavigationPage.SetHasNavigationBar(DemoNav.CurrentPage, HasNavBarCheck.IsChecked == true);
+ }
+
+ private void OnHasBackButonChanged(object? sender, RoutedEventArgs e)
+ {
+ if (DemoNav == null)
+ return;
+ if (DemoNav.CurrentPage != null)
+ NavigationPage.SetHasBackButton(DemoNav.CurrentPage, HasBackButtonCheck.IsChecked == true);
+ }
+
+ private void UpdateStatus()
+ {
+ StatusText.Text = $"Depth: {DemoNav.StackDepth}";
+ HeaderText.Text = $"Current: {DemoNav.CurrentPage?.Header ?? "(none)"}";
+ }
+}
\ No newline at end of file
diff --git a/demo/Semi.Avalonia.Demo/Pages/TabbedPageDemo.axaml b/demo/Semi.Avalonia.Demo/Pages/TabbedPageDemo.axaml
new file mode 100644
index 0000000..0f78430
--- /dev/null
+++ b/demo/Semi.Avalonia.Demo/Pages/TabbedPageDemo.axaml
@@ -0,0 +1,80 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/demo/Semi.Avalonia.Demo/Pages/TabbedPageDemo.axaml.cs b/demo/Semi.Avalonia.Demo/Pages/TabbedPageDemo.axaml.cs
new file mode 100644
index 0000000..9c2b097
--- /dev/null
+++ b/demo/Semi.Avalonia.Demo/Pages/TabbedPageDemo.axaml.cs
@@ -0,0 +1,84 @@
+using System.Collections;
+using Avalonia;
+using Avalonia.Controls;
+using Avalonia.Interactivity;
+using Avalonia.Media;
+
+namespace Semi.Avalonia.Demo.Pages;
+
+public partial class TabbedPageDemo : UserControl
+{
+ private int _tabCounter = 3;
+
+ public TabbedPageDemo()
+ {
+ InitializeComponent();
+ }
+
+ private void OnAddTab(object? sender, RoutedEventArgs e)
+ {
+ var idx = ++_tabCounter;
+ var page = new ContentPage
+ {
+ Header = $"Tab {idx}",
+ Content = new StackPanel
+ {
+ Margin = new Thickness(16),
+ Spacing = 8,
+ Children =
+ {
+ new TextBlock
+ {
+ Text = $"Tab {idx}",
+ FontSize = 24,
+ FontWeight = FontWeight.Bold,
+ },
+ new TextBlock
+ {
+ Text = $"This tab was added dynamically (tab #{idx}).",
+ Opacity = 0.7,
+ TextWrapping = TextWrapping.Wrap,
+ }
+ }
+ }
+ };
+
+ ((IList)DemoTabs.Pages!).Add(page);
+ UpdateStatus();
+ }
+
+ private void OnRemoveTab(object? sender, RoutedEventArgs e)
+ {
+ var pages = (IList)DemoTabs.Pages!;
+ if (pages.Count > 1)
+ {
+ pages.RemoveAt(pages.Count - 1);
+ UpdateStatus();
+ }
+ }
+
+ private void OnPlacementChanged(object? sender, SelectionChangedEventArgs e)
+ {
+ if (DemoTabs == null) return;
+ DemoTabs.TabPlacement = PlacementCombo.SelectedIndex switch
+ {
+ 1 => TabPlacement.Bottom,
+ 2 => TabPlacement.Left,
+ 3 => TabPlacement.Right,
+ _ => TabPlacement.Top
+ };
+ }
+
+ private void OnSelectionChanged(object? sender, PageSelectionChangedEventArgs e)
+ {
+ UpdateStatus();
+ }
+
+ private void UpdateStatus()
+ {
+ if (StatusText == null) return;
+ var pages = (IList)DemoTabs.Pages!;
+ var pageName = (DemoTabs.SelectedPage as ContentPage)?.Header?.ToString() ?? "—";
+ StatusText.Text = $"{pages.Count} tab{(pages.Count != 1 ? "s" : "")} | Selected: {pageName} ({DemoTabs.SelectedIndex})";
+ }
+}
\ No newline at end of file
diff --git a/demo/Semi.Avalonia.Demo/Views/MainView.axaml b/demo/Semi.Avalonia.Demo/Views/MainView.axaml
index f5e24df..f6304d0 100644
--- a/demo/Semi.Avalonia.Demo/Views/MainView.axaml
+++ b/demo/Semi.Avalonia.Demo/Views/MainView.axaml
@@ -215,6 +215,18 @@
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/Semi.Avalonia/Controls/ContentPage.axaml b/src/Semi.Avalonia/Controls/ContentPage.axaml
new file mode 100644
index 0000000..9ab5ba5
--- /dev/null
+++ b/src/Semi.Avalonia/Controls/ContentPage.axaml
@@ -0,0 +1,43 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/Semi.Avalonia/Controls/DrawerPage.axaml b/src/Semi.Avalonia/Controls/DrawerPage.axaml
new file mode 100644
index 0000000..8273f0f
--- /dev/null
+++ b/src/Semi.Avalonia/Controls/DrawerPage.axaml
@@ -0,0 +1,143 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/Semi.Avalonia/Controls/NavigationPage.axaml b/src/Semi.Avalonia/Controls/NavigationPage.axaml
new file mode 100644
index 0000000..26ef8d1
--- /dev/null
+++ b/src/Semi.Avalonia/Controls/NavigationPage.axaml
@@ -0,0 +1,94 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/src/Semi.Avalonia/Controls/TabbedPage.axaml b/src/Semi.Avalonia/Controls/TabbedPage.axaml
new file mode 100644
index 0000000..64b68b7
--- /dev/null
+++ b/src/Semi.Avalonia/Controls/TabbedPage.axaml
@@ -0,0 +1,41 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/src/Semi.Avalonia/Controls/_index.axaml b/src/Semi.Avalonia/Controls/_index.axaml
index bdce23c..7b389c8 100644
--- a/src/Semi.Avalonia/Controls/_index.axaml
+++ b/src/Semi.Avalonia/Controls/_index.axaml
@@ -6,6 +6,7 @@
+
@@ -18,6 +19,7 @@
+
@@ -33,6 +35,7 @@
+
@@ -47,6 +50,7 @@
+
diff --git a/src/Semi.Avalonia/Themes/Dark/ContentPage.axaml b/src/Semi.Avalonia/Themes/Dark/ContentPage.axaml
new file mode 100644
index 0000000..268316e
--- /dev/null
+++ b/src/Semi.Avalonia/Themes/Dark/ContentPage.axaml
@@ -0,0 +1,5 @@
+
+
+
+
+
diff --git a/src/Semi.Avalonia/Themes/Dark/DrawerPage.axaml b/src/Semi.Avalonia/Themes/Dark/DrawerPage.axaml
new file mode 100644
index 0000000..09cd1a7
--- /dev/null
+++ b/src/Semi.Avalonia/Themes/Dark/DrawerPage.axaml
@@ -0,0 +1,13 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/Semi.Avalonia/Themes/Dark/NavigationPage.axaml b/src/Semi.Avalonia/Themes/Dark/NavigationPage.axaml
new file mode 100644
index 0000000..3b68d1b
--- /dev/null
+++ b/src/Semi.Avalonia/Themes/Dark/NavigationPage.axaml
@@ -0,0 +1,14 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/Semi.Avalonia/Themes/Dark/TabbedPage.axaml b/src/Semi.Avalonia/Themes/Dark/TabbedPage.axaml
new file mode 100644
index 0000000..2f71e8f
--- /dev/null
+++ b/src/Semi.Avalonia/Themes/Dark/TabbedPage.axaml
@@ -0,0 +1,2 @@
+
+
diff --git a/src/Semi.Avalonia/Themes/Dark/_index.axaml b/src/Semi.Avalonia/Themes/Dark/_index.axaml
index 1c07720..46fdce6 100644
--- a/src/Semi.Avalonia/Themes/Dark/_index.axaml
+++ b/src/Semi.Avalonia/Themes/Dark/_index.axaml
@@ -4,6 +4,7 @@
+
@@ -16,6 +17,7 @@
+
@@ -26,6 +28,7 @@
+
@@ -36,6 +39,7 @@
+
diff --git a/src/Semi.Avalonia/Themes/HighContrast/ContentPage.axaml b/src/Semi.Avalonia/Themes/HighContrast/ContentPage.axaml
new file mode 100644
index 0000000..1d18d01
--- /dev/null
+++ b/src/Semi.Avalonia/Themes/HighContrast/ContentPage.axaml
@@ -0,0 +1,5 @@
+
+
+
+
+
diff --git a/src/Semi.Avalonia/Themes/HighContrast/DrawerPage.axaml b/src/Semi.Avalonia/Themes/HighContrast/DrawerPage.axaml
new file mode 100644
index 0000000..aa185e9
--- /dev/null
+++ b/src/Semi.Avalonia/Themes/HighContrast/DrawerPage.axaml
@@ -0,0 +1,13 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/Semi.Avalonia/Themes/HighContrast/NavigationPage.axaml b/src/Semi.Avalonia/Themes/HighContrast/NavigationPage.axaml
new file mode 100644
index 0000000..c80946b
--- /dev/null
+++ b/src/Semi.Avalonia/Themes/HighContrast/NavigationPage.axaml
@@ -0,0 +1,14 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/Semi.Avalonia/Themes/HighContrast/TabbedPage.axaml b/src/Semi.Avalonia/Themes/HighContrast/TabbedPage.axaml
new file mode 100644
index 0000000..2f71e8f
--- /dev/null
+++ b/src/Semi.Avalonia/Themes/HighContrast/TabbedPage.axaml
@@ -0,0 +1,2 @@
+
+
diff --git a/src/Semi.Avalonia/Themes/HighContrast/_index.axaml b/src/Semi.Avalonia/Themes/HighContrast/_index.axaml
index 1c07720..ea9e375 100644
--- a/src/Semi.Avalonia/Themes/HighContrast/_index.axaml
+++ b/src/Semi.Avalonia/Themes/HighContrast/_index.axaml
@@ -12,9 +12,11 @@
+
+
@@ -25,6 +27,7 @@
+
@@ -36,6 +39,7 @@
+
diff --git a/src/Semi.Avalonia/Themes/Light/ContentPage.axaml b/src/Semi.Avalonia/Themes/Light/ContentPage.axaml
new file mode 100644
index 0000000..268316e
--- /dev/null
+++ b/src/Semi.Avalonia/Themes/Light/ContentPage.axaml
@@ -0,0 +1,5 @@
+
+
+
+
+
diff --git a/src/Semi.Avalonia/Themes/Light/DrawerPage.axaml b/src/Semi.Avalonia/Themes/Light/DrawerPage.axaml
new file mode 100644
index 0000000..e2098ff
--- /dev/null
+++ b/src/Semi.Avalonia/Themes/Light/DrawerPage.axaml
@@ -0,0 +1,13 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/src/Semi.Avalonia/Themes/Light/NavigationPage.axaml b/src/Semi.Avalonia/Themes/Light/NavigationPage.axaml
new file mode 100644
index 0000000..3b68d1b
--- /dev/null
+++ b/src/Semi.Avalonia/Themes/Light/NavigationPage.axaml
@@ -0,0 +1,14 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/Semi.Avalonia/Themes/Light/TabbedPage.axaml b/src/Semi.Avalonia/Themes/Light/TabbedPage.axaml
new file mode 100644
index 0000000..2f71e8f
--- /dev/null
+++ b/src/Semi.Avalonia/Themes/Light/TabbedPage.axaml
@@ -0,0 +1,2 @@
+
+
diff --git a/src/Semi.Avalonia/Themes/Light/_index.axaml b/src/Semi.Avalonia/Themes/Light/_index.axaml
index 1c07720..46fdce6 100644
--- a/src/Semi.Avalonia/Themes/Light/_index.axaml
+++ b/src/Semi.Avalonia/Themes/Light/_index.axaml
@@ -4,6 +4,7 @@
+
@@ -16,6 +17,7 @@
+
@@ -26,6 +28,7 @@
+
@@ -36,6 +39,7 @@
+
diff --git a/src/Semi.Avalonia/Themes/Shared/ContentPage.axaml b/src/Semi.Avalonia/Themes/Shared/ContentPage.axaml
new file mode 100644
index 0000000..f30a235
--- /dev/null
+++ b/src/Semi.Avalonia/Themes/Shared/ContentPage.axaml
@@ -0,0 +1,4 @@
+
+
+ 48
+
diff --git a/src/Semi.Avalonia/Themes/Shared/DrawerPage.axaml b/src/Semi.Avalonia/Themes/Shared/DrawerPage.axaml
new file mode 100644
index 0000000..48c5d66
--- /dev/null
+++ b/src/Semi.Avalonia/Themes/Shared/DrawerPage.axaml
@@ -0,0 +1,15 @@
+
+
+ 48
+ 4 0
+ 0 0 0 1
+
+
+ 280
+ 56
+
+
+ 32
+ 8 0
+
+
diff --git a/src/Semi.Avalonia/Themes/Shared/NavigationPage.axaml b/src/Semi.Avalonia/Themes/Shared/NavigationPage.axaml
new file mode 100644
index 0000000..7275100
--- /dev/null
+++ b/src/Semi.Avalonia/Themes/Shared/NavigationPage.axaml
@@ -0,0 +1,7 @@
+
+
+ 48
+ 4 0
+ 0 0 0 1
+
+
diff --git a/src/Semi.Avalonia/Themes/Shared/TabbedPage.axaml b/src/Semi.Avalonia/Themes/Shared/TabbedPage.axaml
new file mode 100644
index 0000000..1b87603
--- /dev/null
+++ b/src/Semi.Avalonia/Themes/Shared/TabbedPage.axaml
@@ -0,0 +1,4 @@
+
+
+
+
diff --git a/src/Semi.Avalonia/Themes/Shared/_index.axaml b/src/Semi.Avalonia/Themes/Shared/_index.axaml
index 1c07720..46fdce6 100644
--- a/src/Semi.Avalonia/Themes/Shared/_index.axaml
+++ b/src/Semi.Avalonia/Themes/Shared/_index.axaml
@@ -4,6 +4,7 @@
+
@@ -16,6 +17,7 @@
+
@@ -26,6 +28,7 @@
+
@@ -36,6 +39,7 @@
+
From d6d03133b492d4f593b80cfc77d8320c2aca8296 Mon Sep 17 00:00:00 2001
From: Zhang Dian <54255897+zdpcdt@users.noreply.github.com>
Date: Sun, 15 Mar 2026 03:39:24 +0800
Subject: [PATCH 24/45] feat: refactor WindowDrawnDecorations with new styling
and structure. (#768)
---
.../Controls/WindowDrawnDecorations.axaml | 171 +++++++++---------
...ons.axaml => WindowDrawnDecorations.axaml} | 3 +
src/Semi.Avalonia/Themes/Dark/_index.axaml | 2 +-
...ons.axaml => WindowDrawnDecorations.axaml} | 2 +
.../Themes/HighContrast/_index.axaml | 2 +-
...ons.axaml => WindowDrawnDecorations.axaml} | 3 +
src/Semi.Avalonia/Themes/Light/_index.axaml | 2 +-
...ons.axaml => WindowDrawnDecorations.axaml} | 0
src/Semi.Avalonia/Themes/Shared/_index.axaml | 2 +-
9 files changed, 96 insertions(+), 91 deletions(-)
rename src/Semi.Avalonia/Themes/Dark/{CaptionButtons.axaml => WindowDrawnDecorations.axaml} (80%)
rename src/Semi.Avalonia/Themes/HighContrast/{CaptionButtons.axaml => WindowDrawnDecorations.axaml} (89%)
rename src/Semi.Avalonia/Themes/Light/{CaptionButtons.axaml => WindowDrawnDecorations.axaml} (80%)
rename src/Semi.Avalonia/Themes/Shared/{CaptionButtons.axaml => WindowDrawnDecorations.axaml} (100%)
diff --git a/src/Semi.Avalonia/Controls/WindowDrawnDecorations.axaml b/src/Semi.Avalonia/Controls/WindowDrawnDecorations.axaml
index 8b0ed6f..820fec8 100644
--- a/src/Semi.Avalonia/Controls/WindowDrawnDecorations.axaml
+++ b/src/Semi.Avalonia/Controls/WindowDrawnDecorations.axaml
@@ -8,7 +8,7 @@
-
+
+ Foreground="{TemplateBinding Foreground}">
+
+
+
+
+
+
@@ -36,7 +44,7 @@
-
+
@@ -44,16 +52,17 @@
+ BoxShadow="{DynamicResource WindowBorderShadow}" />
-
@@ -61,10 +70,10 @@
-
+
-
-
+ Content="{StaticResource WindowExpandGlyph}"
+ WindowDecorationProperties.ElementRole="FullScreenButton" />
+ Content="{StaticResource WindowMinimizeGlyph}"
+ WindowDecorationProperties.ElementRole="MinimizeButton" />
+ Content="{StaticResource WindowMaximizeGlyph}"
+ WindowDecorationProperties.ElementRole="MaximizeButton" />
+ Content="{StaticResource WindowCloseIconGlyph}"
+ WindowDecorationProperties.ElementRole="CloseButton" />
-
+
+ Content="{StaticResource WindowCollapseGlyph}"
+ WindowDecorationProperties.ElementRole="FullScreenButton" />
+
-
-
+
-
-
+
-
+
+
-
-
-
+
-
-
+
+
-
-
-
+
-
-
-
+
+
\ No newline at end of file
diff --git a/src/Semi.Avalonia/Themes/Dark/CaptionButtons.axaml b/src/Semi.Avalonia/Themes/Dark/WindowDrawnDecorations.axaml
similarity index 80%
rename from src/Semi.Avalonia/Themes/Dark/CaptionButtons.axaml
rename to src/Semi.Avalonia/Themes/Dark/WindowDrawnDecorations.axaml
index 766d849..2173028 100644
--- a/src/Semi.Avalonia/Themes/Dark/CaptionButtons.axaml
+++ b/src/Semi.Avalonia/Themes/Dark/WindowDrawnDecorations.axaml
@@ -1,4 +1,7 @@
+
+
+
diff --git a/src/Semi.Avalonia/Themes/Dark/_index.axaml b/src/Semi.Avalonia/Themes/Dark/_index.axaml
index 46fdce6..c74719b 100644
--- a/src/Semi.Avalonia/Themes/Dark/_index.axaml
+++ b/src/Semi.Avalonia/Themes/Dark/_index.axaml
@@ -8,7 +8,6 @@
-
@@ -48,5 +47,6 @@
+
\ No newline at end of file
diff --git a/src/Semi.Avalonia/Themes/HighContrast/CaptionButtons.axaml b/src/Semi.Avalonia/Themes/HighContrast/WindowDrawnDecorations.axaml
similarity index 89%
rename from src/Semi.Avalonia/Themes/HighContrast/CaptionButtons.axaml
rename to src/Semi.Avalonia/Themes/HighContrast/WindowDrawnDecorations.axaml
index f99e0df..2dcce3e 100644
--- a/src/Semi.Avalonia/Themes/HighContrast/CaptionButtons.axaml
+++ b/src/Semi.Avalonia/Themes/HighContrast/WindowDrawnDecorations.axaml
@@ -1,4 +1,6 @@
+
+
diff --git a/src/Semi.Avalonia/Themes/HighContrast/_index.axaml b/src/Semi.Avalonia/Themes/HighContrast/_index.axaml
index ea9e375..04ed1ec 100644
--- a/src/Semi.Avalonia/Themes/HighContrast/_index.axaml
+++ b/src/Semi.Avalonia/Themes/HighContrast/_index.axaml
@@ -7,7 +7,6 @@
-
@@ -48,5 +47,6 @@
+
\ No newline at end of file
diff --git a/src/Semi.Avalonia/Themes/Light/CaptionButtons.axaml b/src/Semi.Avalonia/Themes/Light/WindowDrawnDecorations.axaml
similarity index 80%
rename from src/Semi.Avalonia/Themes/Light/CaptionButtons.axaml
rename to src/Semi.Avalonia/Themes/Light/WindowDrawnDecorations.axaml
index 766d849..2173028 100644
--- a/src/Semi.Avalonia/Themes/Light/CaptionButtons.axaml
+++ b/src/Semi.Avalonia/Themes/Light/WindowDrawnDecorations.axaml
@@ -1,4 +1,7 @@
+
+
+
diff --git a/src/Semi.Avalonia/Themes/Light/_index.axaml b/src/Semi.Avalonia/Themes/Light/_index.axaml
index 46fdce6..c74719b 100644
--- a/src/Semi.Avalonia/Themes/Light/_index.axaml
+++ b/src/Semi.Avalonia/Themes/Light/_index.axaml
@@ -8,7 +8,6 @@
-
@@ -48,5 +47,6 @@
+
\ No newline at end of file
diff --git a/src/Semi.Avalonia/Themes/Shared/CaptionButtons.axaml b/src/Semi.Avalonia/Themes/Shared/WindowDrawnDecorations.axaml
similarity index 100%
rename from src/Semi.Avalonia/Themes/Shared/CaptionButtons.axaml
rename to src/Semi.Avalonia/Themes/Shared/WindowDrawnDecorations.axaml
diff --git a/src/Semi.Avalonia/Themes/Shared/_index.axaml b/src/Semi.Avalonia/Themes/Shared/_index.axaml
index 46fdce6..c74719b 100644
--- a/src/Semi.Avalonia/Themes/Shared/_index.axaml
+++ b/src/Semi.Avalonia/Themes/Shared/_index.axaml
@@ -8,7 +8,6 @@
-
@@ -48,5 +47,6 @@
+
\ No newline at end of file
From 672560643bcf33f30da97018a73ee4c8bbbae596 Mon Sep 17 00:00:00 2001
From: Zhang Dian <54255897+zdpcdt@users.noreply.github.com>
Date: Sun, 15 Mar 2026 03:40:20 +0800
Subject: [PATCH 25/45] fix: Watermark -> Placeholder. (#769)
---
demo/Semi.Avalonia.Demo/Pages/CalendarDatePickerDemo.axaml | 2 +-
demo/Semi.Avalonia.Demo/Pages/IconDemo.axaml | 2 +-
src/Semi.Avalonia/Controls/DatePicker.axaml | 2 +-
src/Semi.Avalonia/Controls/TextBox.axaml | 6 +++---
4 files changed, 6 insertions(+), 6 deletions(-)
diff --git a/demo/Semi.Avalonia.Demo/Pages/CalendarDatePickerDemo.axaml b/demo/Semi.Avalonia.Demo/Pages/CalendarDatePickerDemo.axaml
index 4730e62..83f4f0a 100644
--- a/demo/Semi.Avalonia.Demo/Pages/CalendarDatePickerDemo.axaml
+++ b/demo/Semi.Avalonia.Demo/Pages/CalendarDatePickerDemo.axaml
@@ -33,6 +33,6 @@
Margin="0,0,0,8"
CustomDateFormatString="ddd, MMM d"
SelectedDateFormat="Custom" />
-
+
\ No newline at end of file
diff --git a/demo/Semi.Avalonia.Demo/Pages/IconDemo.axaml b/demo/Semi.Avalonia.Demo/Pages/IconDemo.axaml
index 0ce6af8..ace0be4 100644
--- a/demo/Semi.Avalonia.Demo/Pages/IconDemo.axaml
+++ b/demo/Semi.Avalonia.Demo/Pages/IconDemo.axaml
@@ -16,7 +16,7 @@
Margin="8"
Classes="ClearButton"
Text="{Binding SearchText}"
- Watermark="Input Icon Name" />
+ PlaceholderText="Input Icon Name" />
-
+
diff --git a/src/Semi.Avalonia/Controls/TextBox.axaml b/src/Semi.Avalonia/Controls/TextBox.axaml
index cc8cc3d..8c12086 100644
--- a/src/Semi.Avalonia/Controls/TextBox.axaml
+++ b/src/Semi.Avalonia/Controls/TextBox.axaml
@@ -67,7 +67,7 @@
VerticalScrollBarVisibility="{TemplateBinding (ScrollViewer.VerticalScrollBarVisibility)}">
Date: Sun, 15 Mar 2026 21:49:15 +0800
Subject: [PATCH 26/45] Fix Android Demo Issues (#767)
* fix: fix android demo issues.
* feat: enable CoreCLR usage on Android.
---
.../Semi.Avalonia.Demo.Android/Application.cs | 20 +++++++++++++++++++
.../MainActivity.cs | 10 +---------
.../Semi.Avalonia.Demo.Android.csproj | 8 +++++++-
3 files changed, 28 insertions(+), 10 deletions(-)
create mode 100644 demo/Semi.Avalonia.Demo.Android/Application.cs
diff --git a/demo/Semi.Avalonia.Demo.Android/Application.cs b/demo/Semi.Avalonia.Demo.Android/Application.cs
new file mode 100644
index 0000000..611e568
--- /dev/null
+++ b/demo/Semi.Avalonia.Demo.Android/Application.cs
@@ -0,0 +1,20 @@
+using Android.App;
+using Android.Runtime;
+using Avalonia;
+using Avalonia.Android;
+
+namespace Semi.Avalonia.Demo.Android;
+
+[Application]
+public class Application : AvaloniaAndroidApplication
+{
+ protected Application(nint javaReference, JniHandleOwnership transfer) : base(javaReference, transfer)
+ {
+ }
+
+ protected override AppBuilder CustomizeAppBuilder(AppBuilder builder)
+ {
+ return base.CustomizeAppBuilder(builder)
+ .WithSourceHanSansCNFont();
+ }
+}
\ No newline at end of file
diff --git a/demo/Semi.Avalonia.Demo.Android/MainActivity.cs b/demo/Semi.Avalonia.Demo.Android/MainActivity.cs
index ce98e89..0bf0b35 100644
--- a/demo/Semi.Avalonia.Demo.Android/MainActivity.cs
+++ b/demo/Semi.Avalonia.Demo.Android/MainActivity.cs
@@ -1,6 +1,5 @@
using Android.App;
using Android.Content.PM;
-using Avalonia;
using Avalonia.Android;
namespace Semi.Avalonia.Demo.Android;
@@ -12,11 +11,4 @@ namespace Semi.Avalonia.Demo.Android;
MainLauncher = true,
LaunchMode = LaunchMode.SingleTop,
ConfigurationChanges = ConfigChanges.Orientation | ConfigChanges.ScreenSize | ConfigChanges.UiMode)]
-public class MainActivity : AvaloniaMainActivity
-{
- protected override AppBuilder CustomizeAppBuilder(AppBuilder builder)
- {
- return base.CustomizeAppBuilder(builder)
- .WithSourceHanSansCNFont();
- }
-}
\ No newline at end of file
+public class MainActivity : AvaloniaMainActivity;
\ No newline at end of file
diff --git a/demo/Semi.Avalonia.Demo.Android/Semi.Avalonia.Demo.Android.csproj b/demo/Semi.Avalonia.Demo.Android/Semi.Avalonia.Demo.Android.csproj
index ef02e0c..c65aded 100644
--- a/demo/Semi.Avalonia.Demo.Android/Semi.Avalonia.Demo.Android.csproj
+++ b/demo/Semi.Avalonia.Demo.Android/Semi.Avalonia.Demo.Android.csproj
@@ -2,7 +2,7 @@
Exe
net10.0-android
- 21
+ 23
enable
com.irihitech.Semi.Avalonia
1
@@ -13,6 +13,12 @@
Semi.Avalonia.Demo.Android
+
+
+ false
+ true
+
+
From 87fed4febde57665566946fcc61ec35834bb2120 Mon Sep 17 00:00:00 2001
From: Zhang Dian <54255897+zdpcdt@users.noreply.github.com>
Date: Sun, 15 Mar 2026 21:53:43 +0800
Subject: [PATCH 27/45] chore: bump to 12.0.0-preview2.
---
.../Semi.Avalonia.ColorPicker.csproj | 4 ++--
src/Semi.Avalonia/Semi.Avalonia.csproj | 4 ++--
2 files changed, 4 insertions(+), 4 deletions(-)
diff --git a/src/Semi.Avalonia.ColorPicker/Semi.Avalonia.ColorPicker.csproj b/src/Semi.Avalonia.ColorPicker/Semi.Avalonia.ColorPicker.csproj
index 286ce3c..a95fbeb 100644
--- a/src/Semi.Avalonia.ColorPicker/Semi.Avalonia.ColorPicker.csproj
+++ b/src/Semi.Avalonia.ColorPicker/Semi.Avalonia.ColorPicker.csproj
@@ -2,8 +2,8 @@
net8.0;net10.0
- 12.0.0-preview1
- Update to Semi.Avalonia.ColorPicker 12.0.0-preview1
+ 12.0.0-preview2
+ Update to Semi.Avalonia.ColorPicker 12.0.0-preview2
Semi.Avalonia.ColorPicker
diff --git a/src/Semi.Avalonia/Semi.Avalonia.csproj b/src/Semi.Avalonia/Semi.Avalonia.csproj
index b639048..61d6fc3 100644
--- a/src/Semi.Avalonia/Semi.Avalonia.csproj
+++ b/src/Semi.Avalonia/Semi.Avalonia.csproj
@@ -2,8 +2,8 @@
net8.0;net10.0
- 12.0.0-preview1
- Update to Semi.Avalonia 12.0.0-preview1
+ 12.0.0-preview2
+ Update to Semi.Avalonia 12.0.0-preview2
Semi.Avalonia
From 01e213d741ce2afbe8430f4b64e6634d2e3f7afa Mon Sep 17 00:00:00 2001
From: Dong Bin <14807942+rabbitism@users.noreply.github.com>
Date: Thu, 19 Mar 2026 13:28:13 +0800
Subject: [PATCH 28/45] Implement DataGrid V12 (#770)
* feat: bring datagrid demo back.
* feat: add FunctionalColorGroupControl and ShadowGroupControl with data binding
* Add 10 TFM
Co-authored-by: Zhang Dian <54255897+zdpcdt@users.noreply.github.com>
* feat: Use new property
Co-authored-by: Copilot Autofix powered by AI <175728472+Copilot@users.noreply.github.com>
* fix: fix changelog.
Co-authored-by: Copilot Autofix powered by AI <175728472+Copilot@users.noreply.github.com>
* fix: fix sort member path.
Co-authored-by: Copilot Autofix powered by AI <175728472+Copilot@users.noreply.github.com>
* chore: remove useless property.
---------
Co-authored-by: Zhang Dian <54255897+zdpcdt@users.noreply.github.com>
Co-authored-by: Copilot Autofix powered by AI <175728472+Copilot@users.noreply.github.com>
---
demo/Directory.Packages.props | 2 +-
demo/Semi.Avalonia.Demo/App.axaml | 2 +-
.../Pages/DataGridDemo.axaml | 179 ++++++++++
.../Pages/DataGridDemo.axaml.cs | 15 +
.../Pages/HighContrastDemo.axaml | 327 ++++++++++++++++++
.../Pages/HighContrastDemo.axaml.cs | 25 ++
.../Pages/VariablesDemo.axaml | 103 ++++++
.../Pages/VariablesDemo.axaml.cs | 25 ++
.../Semi.Avalonia.Demo.csproj | 8 +-
.../Themes/FunctionalColorGroupControl.axaml | 152 ++++++++
.../Themes/ShadowGroupControl.axaml | 110 ++++++
demo/Semi.Avalonia.Demo/Themes/_index.axaml | 2 +
.../ViewModels/DataGridDemoViewModel.cs | 154 +++++++++
.../ViewModels/VariablesDemoViewModel.cs | 151 ++++++++
demo/Semi.Avalonia.Demo/Views/MainView.axaml | 100 ++----
src/Directory.Packages.props | 2 +-
.../Semi.Avalonia.DataGrid.csproj | 6 +-
17 files changed, 1289 insertions(+), 74 deletions(-)
create mode 100644 demo/Semi.Avalonia.Demo/Pages/DataGridDemo.axaml
create mode 100644 demo/Semi.Avalonia.Demo/Pages/DataGridDemo.axaml.cs
create mode 100644 demo/Semi.Avalonia.Demo/Pages/HighContrastDemo.axaml
create mode 100644 demo/Semi.Avalonia.Demo/Pages/HighContrastDemo.axaml.cs
create mode 100644 demo/Semi.Avalonia.Demo/Pages/VariablesDemo.axaml
create mode 100644 demo/Semi.Avalonia.Demo/Pages/VariablesDemo.axaml.cs
create mode 100644 demo/Semi.Avalonia.Demo/Themes/FunctionalColorGroupControl.axaml
create mode 100644 demo/Semi.Avalonia.Demo/Themes/ShadowGroupControl.axaml
create mode 100644 demo/Semi.Avalonia.Demo/ViewModels/DataGridDemoViewModel.cs
create mode 100644 demo/Semi.Avalonia.Demo/ViewModels/VariablesDemoViewModel.cs
diff --git a/demo/Directory.Packages.props b/demo/Directory.Packages.props
index 79a3188..7703940 100644
--- a/demo/Directory.Packages.props
+++ b/demo/Directory.Packages.props
@@ -2,7 +2,7 @@
true
12.0.0-preview2
- 11.3.10
+ 12.0.0-preview2-2
3.119.1
diff --git a/demo/Semi.Avalonia.Demo/App.axaml b/demo/Semi.Avalonia.Demo/App.axaml
index 5bb5dcb..76a705d 100644
--- a/demo/Semi.Avalonia.Demo/App.axaml
+++ b/demo/Semi.Avalonia.Demo/App.axaml
@@ -10,7 +10,7 @@
-
+
diff --git a/demo/Semi.Avalonia.Demo/Pages/DataGridDemo.axaml b/demo/Semi.Avalonia.Demo/Pages/DataGridDemo.axaml
new file mode 100644
index 0000000..8fb13a9
--- /dev/null
+++ b/demo/Semi.Avalonia.Demo/Pages/DataGridDemo.axaml
@@ -0,0 +1,179 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/demo/Semi.Avalonia.Demo/Pages/DataGridDemo.axaml.cs b/demo/Semi.Avalonia.Demo/Pages/DataGridDemo.axaml.cs
new file mode 100644
index 0000000..1de46c8
--- /dev/null
+++ b/demo/Semi.Avalonia.Demo/Pages/DataGridDemo.axaml.cs
@@ -0,0 +1,15 @@
+using Avalonia;
+using Avalonia.Controls;
+using Avalonia.Markup.Xaml;
+using Semi.Avalonia.Demo.ViewModels;
+
+namespace Semi.Avalonia.Demo.Pages;
+
+public partial class DataGridDemo : UserControl
+{
+ public DataGridDemo()
+ {
+ InitializeComponent();
+ DataContext = new DataGridDemoViewModel();
+ }
+}
\ No newline at end of file
diff --git a/demo/Semi.Avalonia.Demo/Pages/HighContrastDemo.axaml b/demo/Semi.Avalonia.Demo/Pages/HighContrastDemo.axaml
new file mode 100644
index 0000000..fd7b76c
--- /dev/null
+++ b/demo/Semi.Avalonia.Demo/Pages/HighContrastDemo.axaml
@@ -0,0 +1,327 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/demo/Semi.Avalonia.Demo/Pages/HighContrastDemo.axaml.cs b/demo/Semi.Avalonia.Demo/Pages/HighContrastDemo.axaml.cs
new file mode 100644
index 0000000..fb3a50a
--- /dev/null
+++ b/demo/Semi.Avalonia.Demo/Pages/HighContrastDemo.axaml.cs
@@ -0,0 +1,25 @@
+using System.Threading.Tasks;
+using Avalonia.Controls;
+using Avalonia.Input.Platform;
+using Semi.Avalonia.Demo.ViewModels;
+
+namespace Semi.Avalonia.Demo.Pages;
+
+public partial class HighContrastDemo : UserControl
+{
+ public HighContrastDemo()
+ {
+ InitializeComponent();
+ this.DataContext = new HighContrastDemoViewModel();
+ }
+
+ public async Task Copy(object? o)
+ {
+ if (o is null) return;
+ var toplevel = TopLevel.GetTopLevel(this);
+ if (toplevel?.Clipboard is { } c)
+ {
+ await c.SetTextAsync(o.ToString());
+ }
+ }
+}
\ No newline at end of file
diff --git a/demo/Semi.Avalonia.Demo/Pages/VariablesDemo.axaml b/demo/Semi.Avalonia.Demo/Pages/VariablesDemo.axaml
new file mode 100644
index 0000000..fe9bdaa
--- /dev/null
+++ b/demo/Semi.Avalonia.Demo/Pages/VariablesDemo.axaml
@@ -0,0 +1,103 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/demo/Semi.Avalonia.Demo/Pages/VariablesDemo.axaml.cs b/demo/Semi.Avalonia.Demo/Pages/VariablesDemo.axaml.cs
new file mode 100644
index 0000000..78e5db4
--- /dev/null
+++ b/demo/Semi.Avalonia.Demo/Pages/VariablesDemo.axaml.cs
@@ -0,0 +1,25 @@
+using System.Threading.Tasks;
+using Avalonia.Controls;
+using Avalonia.Input.Platform;
+using Semi.Avalonia.Demo.ViewModels;
+
+namespace Semi.Avalonia.Demo.Pages;
+
+public partial class VariablesDemo : UserControl
+{
+ public VariablesDemo()
+ {
+ InitializeComponent();
+ this.DataContext = new VariablesDemoViewModel();
+ }
+
+ public async Task Copy(object? o)
+ {
+ if (o is null) return;
+ var toplevel = TopLevel.GetTopLevel(this);
+ if (toplevel?.Clipboard is { } c)
+ {
+ await c.SetTextAsync(o.ToString());
+ }
+ }
+}
\ No newline at end of file
diff --git a/demo/Semi.Avalonia.Demo/Semi.Avalonia.Demo.csproj b/demo/Semi.Avalonia.Demo/Semi.Avalonia.Demo.csproj
index 30203ee..2b85fe5 100644
--- a/demo/Semi.Avalonia.Demo/Semi.Avalonia.Demo.csproj
+++ b/demo/Semi.Avalonia.Demo/Semi.Avalonia.Demo.csproj
@@ -13,7 +13,7 @@
-
+
None
@@ -25,11 +25,7 @@
-
+
-
-
-
-
diff --git a/demo/Semi.Avalonia.Demo/Themes/FunctionalColorGroupControl.axaml b/demo/Semi.Avalonia.Demo/Themes/FunctionalColorGroupControl.axaml
new file mode 100644
index 0000000..1b65098
--- /dev/null
+++ b/demo/Semi.Avalonia.Demo/Themes/FunctionalColorGroupControl.axaml
@@ -0,0 +1,152 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/demo/Semi.Avalonia.Demo/Themes/ShadowGroupControl.axaml b/demo/Semi.Avalonia.Demo/Themes/ShadowGroupControl.axaml
new file mode 100644
index 0000000..5028edf
--- /dev/null
+++ b/demo/Semi.Avalonia.Demo/Themes/ShadowGroupControl.axaml
@@ -0,0 +1,110 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/demo/Semi.Avalonia.Demo/Themes/_index.axaml b/demo/Semi.Avalonia.Demo/Themes/_index.axaml
index c006588..cfccca3 100644
--- a/demo/Semi.Avalonia.Demo/Themes/_index.axaml
+++ b/demo/Semi.Avalonia.Demo/Themes/_index.axaml
@@ -2,6 +2,8 @@
+
+
\ No newline at end of file
diff --git a/demo/Semi.Avalonia.Demo/ViewModels/DataGridDemoViewModel.cs b/demo/Semi.Avalonia.Demo/ViewModels/DataGridDemoViewModel.cs
new file mode 100644
index 0000000..eae835b
--- /dev/null
+++ b/demo/Semi.Avalonia.Demo/ViewModels/DataGridDemoViewModel.cs
@@ -0,0 +1,154 @@
+using System;
+using System.Collections.Generic;
+using System.Collections.ObjectModel;
+using System.Linq;
+using Avalonia.Collections;
+using CommunityToolkit.Mvvm.ComponentModel;
+using CommunityToolkit.Mvvm.Input;
+
+namespace Semi.Avalonia.Demo.ViewModels;
+
+public class DataGridDemoViewModel : ObservableObject
+{
+ public ObservableCollection GridData1 { get; set; }
+
+ public DataGridCollectionView GridData2 { get; set; }
+
+ public ObservableCollection GridData3 { get; set; }
+
+ public RelayCommand AddCommand { get; set; }
+
+ public DataGridDemoViewModel()
+ {
+ GridData1 = new ObservableCollection(Song.Songs);
+ GridData2 = new DataGridCollectionView(Song.Songs);
+ GridData2.GroupDescriptions.Add(new DataGridPathGroupDescription("Album"));
+ GridData3 = new ObservableCollection(Song.Songs.Take(10).Select(a => new SongViewModel()
+ {
+ Title = a.Title,
+ Artist = a.Artist,
+ Album = a.Album,
+ CountOfComment = a.CountOfComment,
+ IsSelected = false
+ }));
+ AddCommand = new RelayCommand(Add);
+ }
+
+ private void Add()
+ {
+ GridData3.Add(new SongViewModel());
+ }
+}
+
+public class Song
+{
+ public string? Title { get; set; }
+ public string? Artist { get; set; }
+ public TimeSpan? Duration { get; set; }
+ public string? Album { get; set; }
+ public int CountOfComment { get; set; }
+ public string Url { get; set; }
+
+ public Song(string title, string artist, int m, int s, string album, int countOfComment, int netEaseId)
+ {
+ Title = title;
+ Artist = artist;
+ Duration = new TimeSpan(0, m, s);
+ Album = album;
+ CountOfComment = countOfComment;
+ Url = $"https://music.163.com/song?id={netEaseId}";
+ }
+
+ public static List Albums =>
+ [
+ "A.S.I.A",
+ "饕餮人间",
+ "七步咙咚呛",
+ "大惊小怪",
+ "The ONE",
+ "以梦为马 (壮志骄阳版)",
+ "emo了",
+ "一眼万年",
+ "冲刺吧",
+ "爱的赏味期限",
+ "COSMIC ANTHEM / 手紙",
+ "世界晚安",
+ "明年也要好好长大",
+ "320万年前",
+ "W.O.R.L.D."
+ ];
+
+ public static List Songs =>
+ [
+ new("好肚有肚(feat.李玲玉)", "熊猫堂ProducePandas", 2, 50, "A.S.I.A", 730, 1487039339),
+ new("荒诞秀", "熊猫堂ProducePandas", 3, 15, "A.S.I.A", 639, 1487037601),
+ new("长大", "熊猫堂ProducePandas", 4, 6, "A.S.I.A", 1114, 1487037690),
+ new("招财猫(feat.纪粹希(G-Tracy))", "熊猫堂ProducePandas", 3, 37, "A.S.I.A", 361, 1487039632),
+ new("千转", "熊猫堂ProducePandas", 4, 0, "A.S.I.A", 1115, 1477312398),
+ new("辣辣辣", "熊猫堂ProducePandas", 3, 24, "A.S.I.A", 1873, 1465043716),
+ new("碎碎念", "熊猫堂ProducePandas", 3, 25, "A.S.I.A", 676, 1474142064),
+ new("盘他", "熊猫堂ProducePandas", 2, 16, "A.S.I.A", 365, 1481652786),
+ new("Na Na Na", "熊猫堂ProducePandas", 3, 26, "A.S.I.A", 312, 1469022662),
+ new("Indigo", "熊猫堂ProducePandas", 3, 15, "A.S.I.A", 137, 1487039517),
+ new("饕餮人间", "熊猫堂ProducePandas", 3, 20, "饕餮人间", 1295, 1499584605),
+ new("七步咙咚呛", "熊猫堂ProducePandas", 3, 10, "七步咙咚呛", 175, 1809095152),
+ new("大惊小怪", "熊猫堂ProducePandas", 3, 32, "大惊小怪", 10420, 1847477425),
+ new("工具人", "熊猫堂ProducePandas", 2, 46, "大惊小怪", 1135, 1847476499),
+ new("以梦为马", "熊猫堂ProducePandas", 4, 19, "大惊小怪", 18361, 1836034373),
+ new("以梦为马(Piano Version)", "熊猫堂ProducePandas", 3, 4, "大惊小怪", 570, 1847477423),
+ new("The ONE", "熊猫堂ProducePandas", 2, 58, "The ONE", 1508, 1864329424),
+ new("The ONE(日文版)", "熊猫堂ProducePandas", 2, 57, "The ONE", 385, 1864329429),
+ new("以梦为马 (壮志骄阳版)", "熊猫堂ProducePandas", 4, 19, "以梦为马 (壮志骄阳版)", 161, 1865138896),
+ new("New Horse", "熊猫堂ProducePandas", 2, 30, "emo了", 643, 1887021307),
+ new("不例外", "熊猫堂ProducePandas", 3, 31, "emo了", 1818, 1887022665),
+ new("满意", "熊猫堂ProducePandas", 4, 32, "emo了", 1081, 1882433472),
+ new("就算与全世界为敌也要跟你在一起", "熊猫堂ProducePandas", 3, 32, "emo了", 2119, 1881759960),
+ new("The ONE", "熊猫堂ProducePandas", 2, 58, "emo了", 67, 1887022648),
+ new("口香糖", "熊猫堂ProducePandas", 3, 10, "emo了", 2181, 1885502254),
+ new("Suuuuuuper Mario", "熊猫堂ProducePandas", 3, 32, "emo了", 1010, 1887021318),
+ new("饕餮人间", "熊猫堂ProducePandas", 3, 22, "emo了", 109, 1887021320),
+ new("以梦为马 (壮志骄阳版)", "熊猫堂ProducePandas", 4, 21, "emo了", 34, 1887022666),
+ new("The ONE(日文版)", "熊猫堂ProducePandas", 2, 57, "emo了", 27, 1887022646),
+ new("满意(DJheap九天版)", "熊猫堂ProducePandas", 4, 31, "emo了", 31, 1901605941),
+ new("一眼万年", "熊猫堂ProducePandas", 3, 54, "一眼万年", 20, 1922599361),
+ new("冲刺", "熊猫堂ProducePandas", 3, 49, "冲刺吧", 1006, 1932878194),
+ new("滴答滴", "熊猫堂ProducePandas", 2, 30, "爱的赏味期限", 86, 1957515790),
+ new("热带季风", "熊猫堂ProducePandas", 2, 45, "爱的赏味期限", 212, 1957514964),
+ new("渣", "熊猫堂ProducePandas", 3, 28, "爱的赏味期限", 22, 1957514965),
+ new("独特", "熊猫堂ProducePandas", 3, 33, "爱的赏味期限", 62, 1957514966),
+ new("雨后", "熊猫堂ProducePandas", 4, 15, "爱的赏味期限", 23, 1957514967),
+ new("然后然后", "熊猫堂ProducePandas", 3, 50, "爱的赏味期限", 108, 1957514968),
+ new("丢", "熊猫堂ProducePandas", 3, 26, "爱的赏味期限", 30, 1957515792),
+ new("热带疾风(FACEVOID桃心连哥 Remix)", "熊猫堂ProducePandas", 3, 23, "爱的赏味期限", 55, 1957515793),
+ new("COSMIC ANTHEM -Japanese Ver.-", "熊猫堂ProducePandas", 3, 11, "COSMIC ANTHEM / 手紙", 0, 1977171493),
+ new("手紙 (「長大-You Raise Me Up-」-Japanese Ver.-)", "熊猫堂ProducePandas", 4, 11, "COSMIC ANTHEM / 手紙", 0,
+ 1977171494),
+ new("COSMIC ANTHEM -Chinese Ver.-", "熊猫堂ProducePandas", 3, 31, "COSMIC ANTHEM / 手紙", 0, 1977172202),
+ new("世界晚安", "熊猫堂ProducePandas", 2, 59, "世界晚安", 652, 1985063377),
+ new("世界晚安(泰文版)", "熊猫堂ProducePandas", 2, 59, "世界晚安", 134, 1987842504),
+ new("世界晚安(钢琴版)", "熊猫堂ProducePandas", 3, 2, "世界晚安", 76, 1990475933),
+ new("世界晚安(泰文钢琴版)", "熊猫堂ProducePandas", 3, 2, "世界晚安", 29, 1990475934),
+ new("世界晚安(DJ沈念版)", "熊猫堂ProducePandas", 3, 9, "世界晚安", 34, 2014263184),
+ new("世界晚安(钢琴配乐)", "熊猫堂ProducePandas", 2, 59, "世界晚安", 11, 2014263185),
+ new("明年也要好好长大", "熊猫堂ProducePandas", 3, 12, "明年也要好好长大", 0, 2010515162),
+ new("320万年前(DJ沈念版)", "熊猫堂ProducePandas", 3, 21, "320万年前", 8, 2055888636),
+ new("320万年前", "熊猫堂ProducePandas", 3, 7, "W.O.R.L.D.", 329, 2049770469),
+ new("隐德来希", "熊猫堂ProducePandas", 3, 3, "W.O.R.L.D.", 594, 2061317924),
+ new("孔明", "熊猫堂ProducePandas", 3, 59, "W.O.R.L.D.", 91, 2063175274),
+ new("锦鲤卟噜噜", "熊猫堂ProducePandas", 3, 5, "W.O.R.L.D.", 67, 2059208262),
+ new("指鹿为马", "熊猫堂ProducePandas", 3, 12, "W.O.R.L.D.", 74, 2063175272),
+ new("热带季风Remix", "熊猫堂ProducePandas", 3, 22, "W.O.R.L.D.", 23, 2063173319),
+ new("加州梦境", "熊猫堂ProducePandas", 2, 56, "W.O.R.L.D.", 1662, 2063173324),
+ new("渐近自由", "熊猫堂ProducePandas", 4, 19, "W.O.R.L.D.", 124, 2063173321),
+ new("世界所有的烂漫", "熊猫堂ProducePandas", 3, 30, "W.O.R.L.D.", 335, 2053388775)
+ ];
+}
+
+public partial class SongViewModel : ObservableObject
+{
+ [ObservableProperty] private string? _title;
+ [ObservableProperty] private string? _artist;
+ [ObservableProperty] private string? _album;
+ [ObservableProperty] private int _countOfComment;
+ [ObservableProperty] private bool? _isSelected;
+}
\ No newline at end of file
diff --git a/demo/Semi.Avalonia.Demo/ViewModels/VariablesDemoViewModel.cs b/demo/Semi.Avalonia.Demo/ViewModels/VariablesDemoViewModel.cs
new file mode 100644
index 0000000..cea2ab4
--- /dev/null
+++ b/demo/Semi.Avalonia.Demo/ViewModels/VariablesDemoViewModel.cs
@@ -0,0 +1,151 @@
+using System;
+using System.Collections.Generic;
+using System.Globalization;
+using Avalonia;
+using Avalonia.Collections;
+using Avalonia.Controls;
+using Avalonia.Media;
+using CommunityToolkit.Mvvm.ComponentModel;
+using Semi.Avalonia.Tokens;
+
+namespace Semi.Avalonia.Demo.ViewModels;
+
+public partial class VariablesDemoViewModel : ObservableObject
+{
+ public DataGridCollectionView GridData { get; set; }
+ [ObservableProperty] private string _searchText = string.Empty;
+
+ public VariablesDemoViewModel()
+ {
+ IResourceDictionary dictionary = new Variables();
+ foreach (var token in Tokens)
+ {
+ if (token.ResourceKey is not null && dictionary.TryGetValue(token.ResourceKey, out var value))
+ {
+ token.Type = value?.GetType();
+ token.Value = GetValueString(value);
+ }
+ }
+
+ GridData = new DataGridCollectionView(Tokens);
+ GridData.GroupDescriptions.Add(new DataGridPathGroupDescription(nameof(VariableItem.Category)));
+ }
+
+ private static string? GetValueString(object? value)
+ {
+ if (value is null) return string.Empty;
+
+ return value switch
+ {
+ double d => d.ToString(CultureInfo.InvariantCulture),
+ CornerRadius c => c.IsUniform ? $"{c.TopLeft}" : c.ToString(),
+ Thickness t => t.IsUniform ? $"{t.Left}" : t.ToString(),
+ FontWeight fontWeight => Convert.ToInt32(fontWeight).ToString(),
+ FontFamily fontFamily => fontFamily.FamilyNames.ToString(),
+ _ => value.ToString()
+ };
+ }
+
+ partial void OnSearchTextChanged(string value)
+ {
+ if (string.IsNullOrWhiteSpace(value))
+ {
+ GridData.Filter = _ => true;
+ GridData.Refresh();
+ return;
+ }
+
+ var search = value.Trim();
+ GridData.Filter = item =>
+ {
+ if (item is not VariableItem variableItem) return false;
+ return (variableItem.Category?.Contains(search, StringComparison.InvariantCultureIgnoreCase) ?? false) ||
+ (variableItem.ResourceKey?.Contains(search, StringComparison.InvariantCultureIgnoreCase) ?? false) ||
+ (variableItem.Value?.Contains(search, StringComparison.InvariantCultureIgnoreCase) ?? false) ||
+ (variableItem.Type?.Name.Contains(search, StringComparison.InvariantCultureIgnoreCase) ?? false) ||
+ (variableItem.Description?.Contains(search, StringComparison.InvariantCultureIgnoreCase) ?? false);
+ };
+ GridData.Refresh();
+ }
+
+ private static List Tokens { get; set; } =
+ [
+ new("Height", "SemiHeightControlSmall"),
+ new("Height", "SemiHeightControlDefault"),
+ new("Height", "SemiHeightControlLarge"),
+ new("Icon Size", "SemiWidthIconExtraSmall"),
+ new("Icon Size", "SemiWidthIconSmall"),
+ new("Icon Size", "SemiWidthIconMedium"),
+ new("Icon Size", "SemiWidthIconLarge"),
+ new("Icon Size", "SemiWidthIconExtraLarge"),
+ new("Border CornerRadius Spacing", "SemiBorderRadiusSpacingExtraSmall"),
+ new("Border CornerRadius Spacing", "SemiBorderRadiusSpacingSmall"),
+ new("Border CornerRadius Spacing", "SemiBorderRadiusSpacingMedium"),
+ new("Border CornerRadius Spacing", "SemiBorderRadiusSpacingLarge"),
+ new("Border CornerRadius Spacing", "SemiBorderRadiusSpacingFull"),
+ new("Border CornerRadius", "SemiBorderRadiusExtraSmall"),
+ new("Border CornerRadius", "SemiBorderRadiusSmall"),
+ new("Border CornerRadius", "SemiBorderRadiusMedium"),
+ new("Border CornerRadius", "SemiBorderRadiusLarge"),
+ new("Border CornerRadius", "SemiBorderRadiusFull"),
+ new("Border Spacing", "SemiBorderSpacing"),
+ new("Border Spacing", "SemiBorderSpacingControl"),
+ new("Border Spacing", "SemiBorderSpacingControlFocus"),
+ new("Border Thickness", "SemiBorderThickness"),
+ new("Border Thickness", "SemiBorderThicknessControl"),
+ new("Border Thickness", "SemiBorderThicknessControlFocus"),
+ new("Spacing", "SemiSpacingNone"),
+ new("Spacing", "SemiSpacingSuperTight"),
+ new("Spacing", "SemiSpacingExtraTight"),
+ new("Spacing", "SemiSpacingTight"),
+ new("Spacing", "SemiSpacingBaseTight"),
+ new("Spacing", "SemiSpacingBase"),
+ new("Spacing", "SemiSpacingBaseLoose"),
+ new("Spacing", "SemiSpacingLoose"),
+ new("Spacing", "SemiSpacingExtraLoose"),
+ new("Spacing", "SemiSpacingSuperLoose"),
+ new("Thickness", "SemiThicknessNone"),
+ new("Thickness", "SemiThicknessSuperTight"),
+ new("Thickness", "SemiThicknessExtraTight"),
+ new("Thickness", "SemiThicknessTight"),
+ new("Thickness", "SemiThicknessBaseTight"),
+ new("Thickness", "SemiThicknessBase"),
+ new("Thickness", "SemiThicknessBaseLoose"),
+ new("Thickness", "SemiThicknessLoose"),
+ new("Thickness", "SemiThicknessExtraLoose"),
+ new("Thickness", "SemiThicknessSuperLoose"),
+ new("FontSize", "SemiFontSizeSmall"),
+ new("FontSize", "SemiFontSizeRegular"),
+ new("FontSize", "SemiFontSizeHeader6"),
+ new("FontSize", "SemiFontSizeHeader5"),
+ new("FontSize", "SemiFontSizeHeader4"),
+ new("FontSize", "SemiFontSizeHeader3"),
+ new("FontSize", "SemiFontSizeHeader2"),
+ new("FontSize", "SemiFontSizeHeader1"),
+ new("FontWeight", "SemiFontWeightLight"),
+ new("FontWeight", "SemiFontWeightRegular"),
+ new("FontWeight", "SemiFontWeightBold"),
+ new("FontFamily", "SemiFontFamilyRegular"),
+ ];
+}
+
+public class VariableItem()
+{
+ public string? Category { get; set; }
+ public string? ResourceKey { get; set; }
+ public Type? Type { get; set; }
+ public string? Value { get; set; }
+ public string? Description { get; set; }
+
+ public VariableItem(string category, string resourceKey, string description = "") : this()
+ {
+ Category = category;
+ ResourceKey = resourceKey;
+ Description = description;
+ }
+
+ public string CopyText =>
+ $"""
+
+ """;
+}
\ No newline at end of file
diff --git a/demo/Semi.Avalonia.Demo/Views/MainView.axaml b/demo/Semi.Avalonia.Demo/Views/MainView.axaml
index f6304d0..0a6d806 100644
--- a/demo/Semi.Avalonia.Demo/Views/MainView.axaml
+++ b/demo/Semi.Avalonia.Demo/Views/MainView.axaml
@@ -16,9 +16,9 @@
@@ -37,48 +37,44 @@
+ Content="{StaticResource SemiIconSidebar}"
+ Theme="{DynamicResource IconBorderlessToggleSwitch}" />
-
+
-
+
+ Content="{StaticResource SemiIconGlobe}"
+ Theme="{DynamicResource IconBorderlessButton}" />
+ Content="{StaticResource SemiIconGithubLogo}"
+ Theme="{DynamicResource IconBorderlessButton}" />
+ Theme="{DynamicResource IconBorderlessToggleSwitch}" />
-
+
+
+
+
+
\ No newline at end of file
diff --git a/src/Semi.Avalonia/Controls/ButtonSpinner.axaml b/src/Semi.Avalonia/Controls/ButtonSpinner.axaml
index 3aead82..2a0178d 100644
--- a/src/Semi.Avalonia/Controls/ButtonSpinner.axaml
+++ b/src/Semi.Avalonia/Controls/ButtonSpinner.axaml
@@ -20,6 +20,7 @@
BorderBrush="{TemplateBinding BorderBrush}"
BorderThickness="{TemplateBinding BorderThickness}"
Content="{TemplateBinding Content}"
+ CornerRadius="{TemplateBinding CornerRadius}"
ContentTemplate="{TemplateBinding ContentTemplate}" />
@@ -92,7 +93,7 @@
-
@@ -100,4 +101,70 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/src/Semi.Avalonia/Controls/NumericUpDown.axaml b/src/Semi.Avalonia/Controls/NumericUpDown.axaml
index 1908601..26743bf 100644
--- a/src/Semi.Avalonia/Controls/NumericUpDown.axaml
+++ b/src/Semi.Avalonia/Controls/NumericUpDown.axaml
@@ -52,6 +52,15 @@
+
+
+
+
-
+
+
+
+
+
-
-
@@ -98,27 +127,27 @@
x:Key="LineTabItem"
BasedOn="{StaticResource BaseTabItem}"
TargetType="TabItem">
-
-
-
@@ -150,15 +179,15 @@
TargetType="TabItem">
-
-
@@ -207,16 +236,20 @@
TargetType="TabItem">
-
+
-
diff --git a/src/Semi.Avalonia/Themes/Dark/TabItem.axaml b/src/Semi.Avalonia/Themes/Dark/TabItem.axaml
index af5e3d0..509c1c8 100644
--- a/src/Semi.Avalonia/Themes/Dark/TabItem.axaml
+++ b/src/Semi.Avalonia/Themes/Dark/TabItem.axaml
@@ -19,4 +19,7 @@
+
+
+
\ No newline at end of file
diff --git a/src/Semi.Avalonia/Themes/HighContrast/TabItem.axaml b/src/Semi.Avalonia/Themes/HighContrast/TabItem.axaml
index ced4623..890426c 100644
--- a/src/Semi.Avalonia/Themes/HighContrast/TabItem.axaml
+++ b/src/Semi.Avalonia/Themes/HighContrast/TabItem.axaml
@@ -19,4 +19,7 @@
+
+
+
\ No newline at end of file
diff --git a/src/Semi.Avalonia/Themes/Light/TabItem.axaml b/src/Semi.Avalonia/Themes/Light/TabItem.axaml
index af5e3d0..509c1c8 100644
--- a/src/Semi.Avalonia/Themes/Light/TabItem.axaml
+++ b/src/Semi.Avalonia/Themes/Light/TabItem.axaml
@@ -19,4 +19,7 @@
+
+
+
\ No newline at end of file
diff --git a/src/Semi.Avalonia/Themes/Shared/TabItem.axaml b/src/Semi.Avalonia/Themes/Shared/TabItem.axaml
index 9e017ba..601039a 100644
--- a/src/Semi.Avalonia/Themes/Shared/TabItem.axaml
+++ b/src/Semi.Avalonia/Themes/Shared/TabItem.axaml
@@ -1,4 +1,5 @@
+
\ No newline at end of file
From f22709fcb13cd391906f5523386b0c1d3c5bf681 Mon Sep 17 00:00:00 2001
From: Zhang Dian <54255897+zdpcdt@users.noreply.github.com>
Date: Thu, 26 Mar 2026 14:15:47 +0800
Subject: [PATCH 41/45] Update CaptionButtonForeground resource and
WindowDrawnDecorations layout (#779)
* fix: update CaptionButtonForeground resource key and remove cursor setter.
* fix: update WindowDrawnDecorations layout.
* feat: add CaptionButtonDisabledForeground for disabled state and WindowCustomizationsPage.
---
.../Pages/WindowCustomizationsPage.axaml | 32 +++++++++++++++++++
.../Pages/WindowCustomizationsPage.axaml.cs | 12 +++++++
demo/Semi.Avalonia.Demo/Views/MainView.axaml | 3 ++
.../Controls/WindowDrawnDecorations.axaml | 19 ++++++-----
.../Themes/Dark/WindowDrawnDecorations.axaml | 3 +-
.../HighContrast/WindowDrawnDecorations.axaml | 1 +
.../Themes/Light/WindowDrawnDecorations.axaml | 3 +-
7 files changed, 61 insertions(+), 12 deletions(-)
create mode 100644 demo/Semi.Avalonia.Demo/Pages/WindowCustomizationsPage.axaml
create mode 100644 demo/Semi.Avalonia.Demo/Pages/WindowCustomizationsPage.axaml.cs
diff --git a/demo/Semi.Avalonia.Demo/Pages/WindowCustomizationsPage.axaml b/demo/Semi.Avalonia.Demo/Pages/WindowCustomizationsPage.axaml
new file mode 100644
index 0000000..8574778
--- /dev/null
+++ b/demo/Semi.Avalonia.Demo/Pages/WindowCustomizationsPage.axaml
@@ -0,0 +1,32 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/demo/Semi.Avalonia.Demo/Pages/WindowCustomizationsPage.axaml.cs b/demo/Semi.Avalonia.Demo/Pages/WindowCustomizationsPage.axaml.cs
new file mode 100644
index 0000000..27d9d98
--- /dev/null
+++ b/demo/Semi.Avalonia.Demo/Pages/WindowCustomizationsPage.axaml.cs
@@ -0,0 +1,12 @@
+using Avalonia.Controls;
+
+namespace Semi.Avalonia.Demo.Pages
+{
+ public partial class WindowCustomizationsPage : UserControl
+ {
+ public WindowCustomizationsPage()
+ {
+ InitializeComponent();
+ }
+ }
+}
diff --git a/demo/Semi.Avalonia.Demo/Views/MainView.axaml b/demo/Semi.Avalonia.Demo/Views/MainView.axaml
index d8d48d0..b33d608 100644
--- a/demo/Semi.Avalonia.Demo/Views/MainView.axaml
+++ b/demo/Semi.Avalonia.Demo/Views/MainView.axaml
@@ -278,6 +278,9 @@
+
+
+
\ No newline at end of file
diff --git a/src/Semi.Avalonia/Controls/WindowDrawnDecorations.axaml b/src/Semi.Avalonia/Controls/WindowDrawnDecorations.axaml
index fd7153c..637794f 100644
--- a/src/Semi.Avalonia/Controls/WindowDrawnDecorations.axaml
+++ b/src/Semi.Avalonia/Controls/WindowDrawnDecorations.axaml
@@ -7,7 +7,6 @@
-
@@ -39,6 +38,10 @@
+
+
@@ -50,14 +53,13 @@
-
+
+ BorderThickness="{TemplateBinding FrameThickness}"
+ IsHitTestVisible="False" />
+ Orientation="Horizontal">
diff --git a/src/Semi.Avalonia/Themes/Dark/WindowDrawnDecorations.axaml b/src/Semi.Avalonia/Themes/Dark/WindowDrawnDecorations.axaml
index 2173028..277258f 100644
--- a/src/Semi.Avalonia/Themes/Dark/WindowDrawnDecorations.axaml
+++ b/src/Semi.Avalonia/Themes/Dark/WindowDrawnDecorations.axaml
@@ -7,5 +7,6 @@
-
+
+
\ No newline at end of file
diff --git a/src/Semi.Avalonia/Themes/HighContrast/WindowDrawnDecorations.axaml b/src/Semi.Avalonia/Themes/HighContrast/WindowDrawnDecorations.axaml
index 2dcce3e..8e6efee 100644
--- a/src/Semi.Avalonia/Themes/HighContrast/WindowDrawnDecorations.axaml
+++ b/src/Semi.Avalonia/Themes/HighContrast/WindowDrawnDecorations.axaml
@@ -7,4 +7,5 @@
+
\ No newline at end of file
diff --git a/src/Semi.Avalonia/Themes/Light/WindowDrawnDecorations.axaml b/src/Semi.Avalonia/Themes/Light/WindowDrawnDecorations.axaml
index 2173028..277258f 100644
--- a/src/Semi.Avalonia/Themes/Light/WindowDrawnDecorations.axaml
+++ b/src/Semi.Avalonia/Themes/Light/WindowDrawnDecorations.axaml
@@ -7,5 +7,6 @@
-
+
+
\ No newline at end of file
From 48c3837d81a177dd5d1fb8e46768a7718266edc4 Mon Sep 17 00:00:00 2001
From: Zhang Dian <54255897+zdpcdt@users.noreply.github.com>
Date: Wed, 1 Apr 2026 09:21:45 +0800
Subject: [PATCH 42/45] chore: upgrade to Avalonia 12.0.0-rc2.
---
demo/Directory.Packages.props | 6 +++---
src/Directory.Packages.props | 4 ++--
2 files changed, 5 insertions(+), 5 deletions(-)
diff --git a/demo/Directory.Packages.props b/demo/Directory.Packages.props
index f76d114..1c30b17 100644
--- a/demo/Directory.Packages.props
+++ b/demo/Directory.Packages.props
@@ -1,9 +1,9 @@
true
- 12.0.0-rc1
- 12.0.0-rc1
- 3.119.1
+ 12.0.0-rc2
+ 12.0.0-rc2
+ 3.119.3-preview.1.1
diff --git a/src/Directory.Packages.props b/src/Directory.Packages.props
index 2ddb067..ee82690 100644
--- a/src/Directory.Packages.props
+++ b/src/Directory.Packages.props
@@ -1,8 +1,8 @@
true
- 12.0.0-rc1
- 12.0.0-rc1
+ 12.0.0-rc2
+ 12.0.0-rc2
From c128feb4ff4ea22ee0905ed50d3f78ad6532055c Mon Sep 17 00:00:00 2001
From: Zhang Dian <54255897+zdpcdt@users.noreply.github.com>
Date: Sun, 15 Mar 2026 03:35:09 +0800
Subject: [PATCH 43/45] Refactor ProgressBar styles for improved layout and
animation (#750)
* refactor: refactor ProgressBar styles for improved layout and animation.
* fix: set MinHeight for ProgressBar text part.
* chore: remove useless Progress resources.
---
src/Semi.Avalonia/Controls/ProgressBar.axaml | 393 ++++++++----------
.../Themes/Dark/ProgressBar.axaml | 1 -
.../Themes/HighContrast/ProgressBar.axaml | 1 -
.../Themes/Light/ProgressBar.axaml | 1 -
4 files changed, 183 insertions(+), 213 deletions(-)
diff --git a/src/Semi.Avalonia/Controls/ProgressBar.axaml b/src/Semi.Avalonia/Controls/ProgressBar.axaml
index 148ded0..2a42b74 100644
--- a/src/Semi.Avalonia/Controls/ProgressBar.axaml
+++ b/src/Semi.Avalonia/Controls/ProgressBar.axaml
@@ -4,87 +4,54 @@
xmlns:semi="https://irihi.tech/semi"
xmlns:converters="using:Avalonia.Controls.Converters">
-
-
-
-
-
-
-
-
-
-
-
-
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
@@ -115,7 +82,7 @@
-
+
-
+
-
+
@@ -191,149 +158,155 @@
-
-
+
+
+
+
+
+
+
+
+
+
+
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
+
-
+
-
-
-
-
-
+
diff --git a/src/Semi.Avalonia/Themes/Dark/ProgressBar.axaml b/src/Semi.Avalonia/Themes/Dark/ProgressBar.axaml
index a8885fd..7905267 100644
--- a/src/Semi.Avalonia/Themes/Dark/ProgressBar.axaml
+++ b/src/Semi.Avalonia/Themes/Dark/ProgressBar.axaml
@@ -2,7 +2,6 @@
-
diff --git a/src/Semi.Avalonia/Themes/HighContrast/ProgressBar.axaml b/src/Semi.Avalonia/Themes/HighContrast/ProgressBar.axaml
index f870f09..f4ec973 100644
--- a/src/Semi.Avalonia/Themes/HighContrast/ProgressBar.axaml
+++ b/src/Semi.Avalonia/Themes/HighContrast/ProgressBar.axaml
@@ -2,7 +2,6 @@
-
\ No newline at end of file
diff --git a/src/Semi.Avalonia/Themes/Light/ProgressBar.axaml b/src/Semi.Avalonia/Themes/Light/ProgressBar.axaml
index a8885fd..7905267 100644
--- a/src/Semi.Avalonia/Themes/Light/ProgressBar.axaml
+++ b/src/Semi.Avalonia/Themes/Light/ProgressBar.axaml
@@ -2,7 +2,6 @@
-
From c48d96e40f1b98479eb08913274a13c604a70c23 Mon Sep 17 00:00:00 2001
From: Zhang Dian <54255897+zdpcdt@users.noreply.github.com>
Date: Wed, 1 Apr 2026 23:01:45 +0800
Subject: [PATCH 44/45] Sync Avalonia 12.0.0-rc2 changes (#786)
* chore: AppBar -> CommanrBar.
* feat: Add keyboard navigation for overflow CommandBar popup.
* chore: Style -> Theme in PipsPager.
* chore: add Header/Footer templates to DrawerPage.
* feaa: hide caption buttons when the platform does not support the action.
* feat: Touch Improvements to TextBox.
* chore: remove Opacity from PART_Placeholder.
* feat: enable access key recognition for GroupBox.
* feat: limit label text to a single line in CommandBar.
---
.../Pages/CommandBarDemo.axaml | 34 ++---
src/Semi.Avalonia/Controls/CommandBar.axaml | 120 +++++++++---------
src/Semi.Avalonia/Controls/DrawerPage.axaml | 6 +-
.../Controls/HeaderedContentControl.axaml | 8 ++
.../Controls/MenuFlyoutPresenter.axaml | 13 ++
src/Semi.Avalonia/Controls/PipsPager.axaml | 8 +-
src/Semi.Avalonia/Controls/TextBox.axaml | 35 ++++-
.../Controls/WindowDrawnDecorations.axaml | 14 ++
.../Themes/Dark/CommandBar.axaml | 28 ++--
.../Themes/HighContrast/CommandBar.axaml | 28 ++--
.../Themes/Light/CommandBar.axaml | 28 ++--
.../Themes/Shared/CommandBar.axaml | 32 ++---
src/Semi.Avalonia/Themes/Shared/Flyout.axaml | 1 +
13 files changed, 213 insertions(+), 142 deletions(-)
diff --git a/demo/Semi.Avalonia.Demo/Pages/CommandBarDemo.axaml b/demo/Semi.Avalonia.Demo/Pages/CommandBarDemo.axaml
index 831543a..bf9359e 100644
--- a/demo/Semi.Avalonia.Demo/Pages/CommandBarDemo.axaml
+++ b/demo/Semi.Avalonia.Demo/Pages/CommandBarDemo.axaml
@@ -58,18 +58,18 @@
IsOpen="{Binding #isop.IsChecked}"
IsSticky="{Binding #isst.IsChecked}"
Width="{Binding #ws.Value}">
-
-
-
-
-
-
-
-
-
-
-
-
+
+
+
+
+
+
+
+
+
+
+
+
@@ -79,12 +79,12 @@
-
-
-
+
+
+
-
-
+
+
diff --git a/src/Semi.Avalonia/Controls/CommandBar.axaml b/src/Semi.Avalonia/Controls/CommandBar.axaml
index e4c6950..47649c5 100644
--- a/src/Semi.Avalonia/Controls/CommandBar.axaml
+++ b/src/Semi.Avalonia/Controls/CommandBar.axaml
@@ -28,24 +28,24 @@
DefaultLabelPosition="{Binding #lc.SelectedValue}"
IsDynamicOverflowEnabled="{Binding #idfe.IsChecked}"
Width="{Binding #ws.Value}">
-
-
-
-
-
-
-
-
-
-
-
-
+
+
+
+
+
+
+
+
+
+
+
+
-
+
-
-
+
+
-
-
-
+
+
+
-
+
-
+
+ x:Key="{x:Type CommandBarButton}"
+ BasedOn="{StaticResource CommandBarButtonBaseTheme}"
+ TargetType="CommandBarButton">
@@ -135,7 +136,7 @@
@@ -144,7 +145,7 @@
@@ -160,8 +161,8 @@
@@ -174,11 +175,11 @@
-
+
+ x:Key="{x:Type CommandBarToggleButton}"
+ BasedOn="{StaticResource CommandBarButtonBaseTheme}"
+ TargetType="CommandBarToggleButton">
@@ -215,7 +216,7 @@
@@ -224,7 +225,7 @@
@@ -240,8 +241,8 @@
@@ -254,14 +255,14 @@
-
-
-
-
-
-
+
+
+
+
+
+
-
+
-
+
-
+
@@ -299,9 +300,9 @@
MinHeight="{TemplateBinding MinHeight}"
Padding="{TemplateBinding Padding}">
-
+
-
diff --git a/src/Semi.Avalonia/Controls/DrawerPage.axaml b/src/Semi.Avalonia/Controls/DrawerPage.axaml
index 83ab402..e56179b 100644
--- a/src/Semi.Avalonia/Controls/DrawerPage.axaml
+++ b/src/Semi.Avalonia/Controls/DrawerPage.axaml
@@ -71,14 +71,16 @@
Name="PART_DrawerHeader"
DockPanel.Dock="Top"
Background="{TemplateBinding DrawerHeaderBackground}"
- Content="{TemplateBinding DrawerHeader}" />
+ Content="{TemplateBinding DrawerHeader}"
+ ContentTemplate="{TemplateBinding DrawerHeaderTemplate}" />
+ Content="{TemplateBinding DrawerFooter}"
+ ContentTemplate="{TemplateBinding DrawerFooterTemplate}" />
+
+
+
+
\ No newline at end of file
diff --git a/src/Semi.Avalonia/Controls/MenuFlyoutPresenter.axaml b/src/Semi.Avalonia/Controls/MenuFlyoutPresenter.axaml
index b5f8dfd..7dd0d42 100644
--- a/src/Semi.Avalonia/Controls/MenuFlyoutPresenter.axaml
+++ b/src/Semi.Avalonia/Controls/MenuFlyoutPresenter.axaml
@@ -54,4 +54,17 @@
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/src/Semi.Avalonia/Controls/PipsPager.axaml b/src/Semi.Avalonia/Controls/PipsPager.axaml
index 54d0d38..ab69767 100644
--- a/src/Semi.Avalonia/Controls/PipsPager.axaml
+++ b/src/Semi.Avalonia/Controls/PipsPager.axaml
@@ -54,8 +54,8 @@
-
-
+
+
@@ -89,7 +89,7 @@
diff --git a/src/Semi.Avalonia/Controls/TextBox.axaml b/src/Semi.Avalonia/Controls/TextBox.axaml
index 8c12086..8999bac 100644
--- a/src/Semi.Avalonia/Controls/TextBox.axaml
+++ b/src/Semi.Avalonia/Controls/TextBox.axaml
@@ -22,6 +22,27 @@
IsEnabled="{Binding $parent[TextBox].CanPaste}" />
+
+
+
+
+
+
@@ -133,6 +154,10 @@
+
+
+
+
diff --git a/src/Semi.Avalonia/Controls/WindowDrawnDecorations.axaml b/src/Semi.Avalonia/Controls/WindowDrawnDecorations.axaml
index 637794f..b3d090f 100644
--- a/src/Semi.Avalonia/Controls/WindowDrawnDecorations.axaml
+++ b/src/Semi.Avalonia/Controls/WindowDrawnDecorations.axaml
@@ -187,6 +187,20 @@
+
+
+
+
+
+