diff --git a/demo/Ursa.Demo/Pages/BannerDemo.axaml b/demo/Ursa.Demo/Pages/BannerDemo.axaml
index d7a275e..c518be6 100644
--- a/demo/Ursa.Demo/Pages/BannerDemo.axaml
+++ b/demo/Ursa.Demo/Pages/BannerDemo.axaml
@@ -47,5 +47,6 @@
+
diff --git a/src/Ursa.Themes.Semi/Controls/NumPad.axaml b/src/Ursa.Themes.Semi/Controls/NumPad.axaml
new file mode 100644
index 0000000..b7a4d55
--- /dev/null
+++ b/src/Ursa.Themes.Semi/Controls/NumPad.axaml
@@ -0,0 +1,14 @@
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/Ursa.Themes.Semi/Controls/_index.axaml b/src/Ursa.Themes.Semi/Controls/_index.axaml
index ddb53fd..8db1c2b 100644
--- a/src/Ursa.Themes.Semi/Controls/_index.axaml
+++ b/src/Ursa.Themes.Semi/Controls/_index.axaml
@@ -22,6 +22,7 @@
+
diff --git a/src/Ursa/Controls/NumPad/NumPad.cs b/src/Ursa/Controls/NumPad/NumPad.cs
new file mode 100644
index 0000000..12bbcfb
--- /dev/null
+++ b/src/Ursa/Controls/NumPad/NumPad.cs
@@ -0,0 +1,78 @@
+using Avalonia;
+using Avalonia.Controls;
+using Avalonia.Controls.Metadata;
+using Avalonia.Controls.Primitives;
+using Avalonia.Input;
+using Avalonia.Interactivity;
+using Irihi.Avalonia.Shared.Helpers;
+
+namespace Ursa.Controls;
+
+[TemplatePart(NumPad.PART_Seven, typeof(Button))]
+public class NumPad: TemplatedControl
+{
+ public const string PART_Seven = "PART_Seven";
+ private Button? _sevenButton;
+ public static readonly StyledProperty TargetProperty = AvaloniaProperty.Register(
+ nameof(Target));
+
+ public InputElement? Target
+ {
+ get => GetValue(TargetProperty);
+ set => SetValue(TargetProperty, value);
+ }
+
+ public static readonly AttachedProperty AttachProperty =
+ AvaloniaProperty.RegisterAttached("Attach");
+
+ public static void SetAttach(InputElement obj, bool value) => obj.SetValue(AttachProperty, value);
+ public static bool GetAttach(InputElement obj) => obj.GetValue(AttachProperty);
+
+ static NumPad()
+ {
+ TargetProperty.Changed.AddClassHandler((n, args) => n.OnTargetChanged(args));
+ AttachProperty.Changed.AddClassHandler((input, args)=> OnAttachNumPad(input, args));
+ }
+
+ private static void OnAttachNumPad(InputElement input, AvaloniaPropertyChangedEventArgs args)
+ {
+ if (args.NewValue.Value)
+ {
+ GotFocusEvent.AddHandler(OnTargetGotFocus, input);
+ }
+ else
+ {
+ GotFocusEvent.RemoveHandler(OnTargetGotFocus, input);
+ }
+ }
+
+ private void OnTargetChanged(AvaloniaPropertyChangedEventArgs args)
+ {
+ //GotFocusEvent.RemoveHandler(OnTargetGotFocus, args.OldValue.Value);
+ //GotFocusEvent.AddHandler(OnTargetGotFocus, args.NewValue.Value);
+ }
+
+ private static void OnTargetGotFocus(object sender, GotFocusEventArgs e)
+ {
+ var numPad = new NumPad() { Target = sender as InputElement };
+ OverlayDialog.ShowCustom(numPad, new object());
+ }
+
+ protected override void OnApplyTemplate(TemplateAppliedEventArgs e)
+ {
+ base.OnApplyTemplate(e);
+ Button.ClickEvent.RemoveHandler(OnSevenButtonClick, _sevenButton);
+ _sevenButton = e.NameScope.Find