diff --git a/demo/Ursa.Demo/Pages/TagInputDemo.axaml b/demo/Ursa.Demo/Pages/TagInputDemo.axaml
new file mode 100644
index 0000000..4cc5c4a
--- /dev/null
+++ b/demo/Ursa.Demo/Pages/TagInputDemo.axaml
@@ -0,0 +1,12 @@
+
+
+
diff --git a/demo/Ursa.Demo/Pages/TagInputDemo.axaml.cs b/demo/Ursa.Demo/Pages/TagInputDemo.axaml.cs
new file mode 100644
index 0000000..f19dc0a
--- /dev/null
+++ b/demo/Ursa.Demo/Pages/TagInputDemo.axaml.cs
@@ -0,0 +1,13 @@
+using Avalonia;
+using Avalonia.Controls;
+using Avalonia.Markup.Xaml;
+
+namespace Ursa.Demo.Pages;
+
+public partial class TagInputDemo : UserControl
+{
+ public TagInputDemo()
+ {
+ InitializeComponent();
+ }
+}
\ No newline at end of file
diff --git a/demo/Ursa.Demo/Views/MainWindow.axaml b/demo/Ursa.Demo/Views/MainWindow.axaml
index d6da845..1b6c162 100644
--- a/demo/Ursa.Demo/Views/MainWindow.axaml
+++ b/demo/Ursa.Demo/Views/MainWindow.axaml
@@ -47,6 +47,9 @@
+
+
+
diff --git a/src/Ursa.Themes.Semi/Controls/TagInput.axaml b/src/Ursa.Themes.Semi/Controls/TagInput.axaml
new file mode 100644
index 0000000..9539c85
--- /dev/null
+++ b/src/Ursa.Themes.Semi/Controls/TagInput.axaml
@@ -0,0 +1,87 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/Ursa.Themes.Semi/Controls/_index.axaml b/src/Ursa.Themes.Semi/Controls/_index.axaml
index 7c621a3..bbf2752 100644
--- a/src/Ursa.Themes.Semi/Controls/_index.axaml
+++ b/src/Ursa.Themes.Semi/Controls/_index.axaml
@@ -9,6 +9,7 @@
+
diff --git a/src/Ursa/AssemblyInfo.cs b/src/Ursa/AssemblyInfo.cs
index 0b0375e..af243bf 100644
--- a/src/Ursa/AssemblyInfo.cs
+++ b/src/Ursa/AssemblyInfo.cs
@@ -1,5 +1,5 @@
using Avalonia.Metadata;
+[assembly:XmlnsPrefix("https://irihi.tech/ursa", "u")]
[assembly:XmlnsDefinition("https://irihi.tech/ursa", "Ursa")]
[assembly:XmlnsDefinition("https://irihi.tech/ursa", "Ursa.Controls")]
-[assembly:XmlnsPrefix("https://irihi.tech/ursa", "u")]
\ No newline at end of file
diff --git a/src/Ursa/Controls/TagInput/TagInput.cs b/src/Ursa/Controls/TagInput/TagInput.cs
new file mode 100644
index 0000000..21bde20
--- /dev/null
+++ b/src/Ursa/Controls/TagInput/TagInput.cs
@@ -0,0 +1,76 @@
+using System.Collections;
+using Avalonia;
+using Avalonia.Collections;
+using Avalonia.Controls;
+using Avalonia.Controls.Primitives;
+using Avalonia.Controls.Templates;
+using Avalonia.Layout;
+using Avalonia.Styling;
+
+namespace Ursa.Controls;
+
+public class TagInput: TemplatedControl
+{
+ public static readonly StyledProperty> TagsProperty = AvaloniaProperty.Register>(
+ nameof(Tags));
+
+ private TextBox _textBox;
+
+ public IList Tags
+ {
+ get => GetValue(TagsProperty);
+ set => SetValue(TagsProperty, value);
+ }
+
+ public static readonly StyledProperty ItemsProperty = AvaloniaProperty.Register(
+ nameof(Items));
+
+ public IList Items
+ {
+ get => GetValue(ItemsProperty);
+ set => SetValue(ItemsProperty, value);
+ }
+
+ public TagInput()
+ {
+ _textBox = new TextBox();
+ }
+
+ public static readonly StyledProperty InputThemeProperty = AvaloniaProperty.Register(
+ nameof(InputTheme));
+
+ public ControlTheme InputTheme
+ {
+ get => GetValue(InputThemeProperty);
+ set => SetValue(InputThemeProperty, value);
+ }
+
+ public static readonly StyledProperty ItemTemplateProperty = AvaloniaProperty.Register(
+ nameof(ItemTemplate));
+
+ public IDataTemplate? ItemTemplate
+ {
+ get => GetValue(ItemTemplateProperty);
+ set => SetValue(ItemTemplateProperty, value);
+ }
+
+ protected override void OnApplyTemplate(TemplateAppliedEventArgs e)
+ {
+ base.OnApplyTemplate(e);
+ Items = new AvaloniaList