diff --git a/demo/Ursa.Demo/Models/MenuKeys.cs b/demo/Ursa.Demo/Models/MenuKeys.cs
index 5a76eb9..1d8954e 100644
--- a/demo/Ursa.Demo/Models/MenuKeys.cs
+++ b/demo/Ursa.Demo/Models/MenuKeys.cs
@@ -6,6 +6,7 @@ public static class MenuKeys
public const string MenuKeyBanner = "Banner";
public const string MenuKeyButtonGroup = "ButtonGroup";
public const string MenuKeyDivider = "Divider";
+ public const string MenuKeyDualBadge = "DualBadge";
public const string MenuKeyIpBox = "IPv4Box";
public const string MenuKeyLoading = "Loading";
public const string MenuKeyNavigation = "Navigation";
diff --git a/demo/Ursa.Demo/Pages/DualBadgeDemo.axaml b/demo/Ursa.Demo/Pages/DualBadgeDemo.axaml
new file mode 100644
index 0000000..e1d85ef
--- /dev/null
+++ b/demo/Ursa.Demo/Pages/DualBadgeDemo.axaml
@@ -0,0 +1,210 @@
+
+
+
+ M12 23C18.0751 23 23 18.0751 23 12C23 5.92487 18.0751 1 12 1C5.92487 1 1 5.92487 1 12C1 18.0751 5.92487 23 12 23ZM14 7C14 8.10457 13.1046 9 12 9C10.8954 9 10 8.10457 10 7C10 5.89543 10.8954 5 12 5C13.1046 5 14 5.89543 14 7ZM9 10.75C9 10.3358 9.33579 10 9.75 10H12.5C13.0523 10 13.5 10.4477 13.5 11V16.5H14.25C14.6642 16.5 15 16.8358 15 17.25C15 17.6642 14.6642 18 14.25 18H9.75C9.33579 18 9 17.6642 9 17.25C9 16.8358 9.33579 16.5 9.75 16.5H10.5V11.5H9.75C9.33579 11.5 9 11.1642 9 10.75Z
+
+
+
+
+
+
+
+
+
+
+
+ 2.4k
+
+
+
+
+
+ 2.4k
+
+
+ 2.4k
+
+
+
+
+
+ 2.4k
+
+
+
+
+
+
+ 2.4k
+
+
+
+
+
+ 2.4k
+
+
+ 2.4k
+
+
+
+
+
+ 2.4k
+
+
+
+
+
+
+ 2.4k
+
+
+
+
+
+ 2.4k
+
+
+ 2.4k
+
+
+
+
+
+ 2.4k
+
+
+
+
+
+
+ 2.4K
+
+
+
+
+
+ 2.4K
+
+
+ 2.4K
+
+
+
+
+
+ 2.4K
+
+
+
+
+ Red
+ Pink
+ Purple
+ Violet
+ Indigo
+ Blue
+ LightBlue
+ Cyan
+ Teal
+ Green
+ LightGreen
+ Lime
+ Yellow
+ Amber
+ Orange
+ Grey
+
+
+ Red
+ Pink
+ Purple
+ Violet
+ Indigo
+ Blue
+ LightBlue
+ Cyan
+ Teal
+ Green
+ LightGreen
+ Lime
+ Yellow
+ Amber
+ Orange
+ Grey
+
+
+ Red
+ Pink
+ Purple
+ Violet
+ Indigo
+ Blue
+ LightBlue
+ Cyan
+ Teal
+ Green
+ LightGreen
+ Lime
+ Yellow
+ Amber
+ Orange
+ Grey
+
+
+ Red
+ Pink
+ Purple
+ Violet
+ Indigo
+ Blue
+ LightBlue
+ Cyan
+ Teal
+ Green
+ LightGreen
+ Lime
+ Yellow
+ Amber
+ Orange
+ Grey
+
+
+
+
\ No newline at end of file
diff --git a/demo/Ursa.Demo/Pages/DualBadgeDemo.axaml.cs b/demo/Ursa.Demo/Pages/DualBadgeDemo.axaml.cs
new file mode 100644
index 0000000..6db9c2f
--- /dev/null
+++ b/demo/Ursa.Demo/Pages/DualBadgeDemo.axaml.cs
@@ -0,0 +1,11 @@
+using Avalonia.Controls;
+
+namespace Ursa.Demo.Pages;
+
+public partial class DualBadgeDemo : UserControl
+{
+ public DualBadgeDemo()
+ {
+ InitializeComponent();
+ }
+}
\ No newline at end of file
diff --git a/demo/Ursa.Demo/ViewModels/DualBadgeDemoViewModel.cs b/demo/Ursa.Demo/ViewModels/DualBadgeDemoViewModel.cs
new file mode 100644
index 0000000..bc992fc
--- /dev/null
+++ b/demo/Ursa.Demo/ViewModels/DualBadgeDemoViewModel.cs
@@ -0,0 +1,5 @@
+namespace Ursa.Demo.ViewModels;
+
+public class DualBadgeDemoViewModel : ViewModelBase
+{
+}
\ No newline at end of file
diff --git a/demo/Ursa.Demo/ViewModels/MainViewViewModel.cs b/demo/Ursa.Demo/ViewModels/MainViewViewModel.cs
index 6641f1f..54109ae 100644
--- a/demo/Ursa.Demo/ViewModels/MainViewViewModel.cs
+++ b/demo/Ursa.Demo/ViewModels/MainViewViewModel.cs
@@ -28,6 +28,7 @@ public class MainViewViewModel : ViewModelBase
MenuKeys.MenuKeyBanner => new BannerDemoViewModel(),
MenuKeys.MenuKeyButtonGroup => new ButtonGroupDemoViewModel(),
MenuKeys.MenuKeyDivider => new DividerDemoViewModel(),
+ MenuKeys.MenuKeyDualBadge => new DualBadgeDemoViewModel(),
MenuKeys.MenuKeyIpBox => new IPv4BoxDemoViewModel(),
MenuKeys.MenuKeyLoading => new LoadingDemoViewModel(),
MenuKeys.MenuKeyNavigation => new NavigationMenuDemoViewModel(),
diff --git a/demo/Ursa.Demo/ViewModels/MenuViewModel.cs b/demo/Ursa.Demo/ViewModels/MenuViewModel.cs
index 9351ad9..011375b 100644
--- a/demo/Ursa.Demo/ViewModels/MenuViewModel.cs
+++ b/demo/Ursa.Demo/ViewModels/MenuViewModel.cs
@@ -15,6 +15,7 @@ public class MenuViewModel: ViewModelBase
new() { MenuHeader = "Banner", Key = MenuKeys.MenuKeyBanner },
new() { MenuHeader = "ButtonGroup", Key = MenuKeys.MenuKeyButtonGroup },
new() { MenuHeader = "Divider", Key = MenuKeys.MenuKeyDivider },
+ new() { MenuHeader = "DualBadge", Key = MenuKeys.MenuKeyDualBadge },
new() { MenuHeader = "IPv4Box", Key = MenuKeys.MenuKeyIpBox },
new() { MenuHeader = "Loading", Key = MenuKeys.MenuKeyLoading },
new() { MenuHeader = "Navigation", Key = MenuKeys.MenuKeyNavigation },
diff --git a/src/Ursa.Themes.Semi/Controls/DualBadge.axaml b/src/Ursa.Themes.Semi/Controls/DualBadge.axaml
new file mode 100644
index 0000000..9a9e949
--- /dev/null
+++ b/src/Ursa.Themes.Semi/Controls/DualBadge.axaml
@@ -0,0 +1,177 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/src/Ursa.Themes.Semi/Controls/_index.axaml b/src/Ursa.Themes.Semi/Controls/_index.axaml
index bbf2752..dee9b3c 100644
--- a/src/Ursa.Themes.Semi/Controls/_index.axaml
+++ b/src/Ursa.Themes.Semi/Controls/_index.axaml
@@ -5,6 +5,7 @@
+
diff --git a/src/Ursa.Themes.Semi/Themes/Dark/DualBadge.axaml b/src/Ursa.Themes.Semi/Themes/Dark/DualBadge.axaml
new file mode 100644
index 0000000..851dc91
--- /dev/null
+++ b/src/Ursa.Themes.Semi/Themes/Dark/DualBadge.axaml
@@ -0,0 +1,145 @@
+
+ White
+ White
+ White
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/src/Ursa.Themes.Semi/Themes/Dark/_index.axaml b/src/Ursa.Themes.Semi/Themes/Dark/_index.axaml
index c9f2bea..aa85239 100644
--- a/src/Ursa.Themes.Semi/Themes/Dark/_index.axaml
+++ b/src/Ursa.Themes.Semi/Themes/Dark/_index.axaml
@@ -5,6 +5,7 @@
+
diff --git a/src/Ursa.Themes.Semi/Themes/Light/DualBadge.axaml b/src/Ursa.Themes.Semi/Themes/Light/DualBadge.axaml
new file mode 100644
index 0000000..851dc91
--- /dev/null
+++ b/src/Ursa.Themes.Semi/Themes/Light/DualBadge.axaml
@@ -0,0 +1,145 @@
+
+ White
+ White
+ White
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/src/Ursa.Themes.Semi/Themes/Light/_index.axaml b/src/Ursa.Themes.Semi/Themes/Light/_index.axaml
index c9f2bea..aa85239 100644
--- a/src/Ursa.Themes.Semi/Themes/Light/_index.axaml
+++ b/src/Ursa.Themes.Semi/Themes/Light/_index.axaml
@@ -5,6 +5,7 @@
+
diff --git a/src/Ursa.Themes.Semi/Themes/Shared/DualBadge.axaml b/src/Ursa.Themes.Semi/Themes/Shared/DualBadge.axaml
new file mode 100644
index 0000000..7a55daa
--- /dev/null
+++ b/src/Ursa.Themes.Semi/Themes/Shared/DualBadge.axaml
@@ -0,0 +1,19 @@
+
+ 4
+ 12
+ 1
+ 4 2
+ Left
+ Center
+ False
+ False
+ 14
+ 14
+
+ 0
+ 4 0
+
+ 0
+ 12 6
+
+
\ No newline at end of file
diff --git a/src/Ursa.Themes.Semi/Themes/Shared/_index.axaml b/src/Ursa.Themes.Semi/Themes/Shared/_index.axaml
index 777a0a4..7bf0b4d 100644
--- a/src/Ursa.Themes.Semi/Themes/Shared/_index.axaml
+++ b/src/Ursa.Themes.Semi/Themes/Shared/_index.axaml
@@ -5,6 +5,7 @@
+
diff --git a/src/Ursa.Themes.Semi/Ursa.Themes.Semi.csproj b/src/Ursa.Themes.Semi/Ursa.Themes.Semi.csproj
index 5bb0d73..88fc18f 100644
--- a/src/Ursa.Themes.Semi/Ursa.Themes.Semi.csproj
+++ b/src/Ursa.Themes.Semi/Ursa.Themes.Semi.csproj
@@ -1,6 +1,6 @@
-
+
netstandard2.0
@@ -13,11 +13,11 @@
-
+
-
+
diff --git a/src/Ursa/Controls/DualBadge.cs b/src/Ursa/Controls/DualBadge.cs
new file mode 100644
index 0000000..7ffd789
--- /dev/null
+++ b/src/Ursa/Controls/DualBadge.cs
@@ -0,0 +1,96 @@
+using Avalonia;
+using Avalonia.Controls;
+using Avalonia.Controls.Metadata;
+using Avalonia.Controls.Presenters;
+using Avalonia.Controls.Primitives;
+using Avalonia.Controls.Templates;
+using Avalonia.Media;
+
+namespace Ursa.Controls;
+
+[PseudoClasses(PC_IconEmpty, PC_HeaderEmpty, PC_ContentEmpty)]
+[TemplatePart(PART_Icon, typeof(ContentPresenter))]
+public class DualBadge : HeaderedContentControl
+{
+ public const string PC_IconEmpty = ":icon-empty";
+ public const string PC_HeaderEmpty = ":header-empty";
+ public const string PC_ContentEmpty = ":content-empty";
+ public const string PART_HeaderPresenter = "PART_HeaderPresenter";
+ public const string PART_ContentPresenter = "PART_ContentPresenter";
+ public const string PART_Icon = "PART_Icon";
+
+ public static readonly StyledProperty