diff --git a/demo/Semi.Avalonia.Demo/Pages/ButtonSpinnerDemo.axaml b/demo/Semi.Avalonia.Demo/Pages/ButtonSpinnerDemo.axaml
new file mode 100644
index 0000000..341c66c
--- /dev/null
+++ b/demo/Semi.Avalonia.Demo/Pages/ButtonSpinnerDemo.axaml
@@ -0,0 +1,33 @@
+
+
+
+
+
+
+
+
+
+
diff --git a/demo/Semi.Avalonia.Demo/Pages/ButtonSpinnerDemo.axaml.cs b/demo/Semi.Avalonia.Demo/Pages/ButtonSpinnerDemo.axaml.cs
new file mode 100644
index 0000000..a6e8f51
--- /dev/null
+++ b/demo/Semi.Avalonia.Demo/Pages/ButtonSpinnerDemo.axaml.cs
@@ -0,0 +1,50 @@
+using System;
+using Avalonia;
+using Avalonia.Controls;
+using Avalonia.Markup.Xaml;
+
+namespace Semi.Avalonia.Demo.Pages;
+
+public partial class ButtonSpinnerDemo : UserControl
+{
+ public ButtonSpinnerDemo()
+ {
+ InitializeComponent();
+ }
+
+ public void OnSpin(object sender, SpinEventArgs e)
+ {
+ var spinner = (ButtonSpinner)sender;
+
+ if (spinner.Content is TextBlock txtBox)
+ {
+ int value = Array.IndexOf(_mountains, txtBox.Text);
+ if (e.Direction == SpinDirection.Increase)
+ value++;
+ else
+ value--;
+
+ if (value < 0)
+ value = _mountains.Length - 1;
+ else if (value >= _mountains.Length)
+ value = 0;
+
+ txtBox.Text = _mountains[value];
+ }
+
+ }
+
+ private readonly string[] _mountains = new[]
+ {
+ "Everest",
+ "K2 (Mount Godwin Austen)",
+ "Kangchenjunga",
+ "Lhotse",
+ "Makalu",
+ "Cho Oyu",
+ "Dhaulagiri",
+ "Manaslu",
+ "Nanga Parbat",
+ "Annapurna"
+ };
+}
\ 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 d48b234..ab1e725 100644
--- a/demo/Semi.Avalonia.Demo/Views/MainView.axaml
+++ b/demo/Semi.Avalonia.Demo/Views/MainView.axaml
@@ -24,6 +24,9 @@
+
+
+
diff --git a/src/Semi.Avalonia/Controls/ButtonSpinner.axaml b/src/Semi.Avalonia/Controls/ButtonSpinner.axaml
new file mode 100644
index 0000000..55f4811
--- /dev/null
+++ b/src/Semi.Avalonia/Controls/ButtonSpinner.axaml
@@ -0,0 +1,5 @@
+
+
+
+
+
diff --git a/src/Semi.Avalonia/Controls/Controls.axaml b/src/Semi.Avalonia/Controls/Controls.axaml
index 925e022..51a08d1 100644
--- a/src/Semi.Avalonia/Controls/Controls.axaml
+++ b/src/Semi.Avalonia/Controls/Controls.axaml
@@ -4,6 +4,7 @@
+
diff --git a/src/Semi.Avalonia/Themes/Light/ButtonSpinner.axaml b/src/Semi.Avalonia/Themes/Light/ButtonSpinner.axaml
new file mode 100644
index 0000000..9017e8d
--- /dev/null
+++ b/src/Semi.Avalonia/Themes/Light/ButtonSpinner.axaml
@@ -0,0 +1,3 @@
+
+
+
diff --git a/src/Semi.Avalonia/Themes/Light/Light.axaml b/src/Semi.Avalonia/Themes/Light/Light.axaml
index e3becb9..eb69551 100644
--- a/src/Semi.Avalonia/Themes/Light/Light.axaml
+++ b/src/Semi.Avalonia/Themes/Light/Light.axaml
@@ -5,6 +5,7 @@
+