diff --git a/src/Avalonia.Diagnostics/Diagnostics/Controls/BrushEditor.axaml b/src/Avalonia.Diagnostics/Diagnostics/Controls/BrushEditor.axaml
new file mode 100644
index 0000000000..7162be888f
--- /dev/null
+++ b/src/Avalonia.Diagnostics/Diagnostics/Controls/BrushEditor.axaml
@@ -0,0 +1,21 @@
+
+
+
+
+
+
+
diff --git a/src/Avalonia.Diagnostics/Diagnostics/Controls/BrushEditor.axaml.cs b/src/Avalonia.Diagnostics/Diagnostics/Controls/BrushEditor.axaml.cs
new file mode 100644
index 0000000000..268e42cff3
--- /dev/null
+++ b/src/Avalonia.Diagnostics/Diagnostics/Controls/BrushEditor.axaml.cs
@@ -0,0 +1,121 @@
+using System;
+using System.Globalization;
+using Avalonia.Controls;
+using Avalonia.Controls.Metadata;
+using Avalonia.Controls.Primitives;
+using Avalonia.Input;
+using Avalonia.Interactivity;
+using Avalonia.Media;
+using Avalonia.Media.Immutable;
+
+namespace Avalonia.Diagnostics.Controls
+{
+ [TemplatePart("PART_ClearButton", typeof(Button))]
+ partial class BrushEditor : TemplatedControl
+ {
+ private readonly EventHandler clearHandler;
+ private Button? _clearButton = default;
+ private readonly ColorView _colorView = new()
+ {
+ HexInputAlphaPosition = AlphaComponentPosition.Leading, // Always match XAML
+ };
+
+ public BrushEditor()
+ {
+ FlyoutBase.SetAttachedFlyout(this, new Flyout { Content = _colorView });
+ _colorView.ColorChanged += (_, e) => Brush = new ImmutableSolidColorBrush(e.NewColor);
+ clearHandler = (s, e) => Brush = default;
+ }
+
+ protected override Type StyleKeyOverride => typeof(BrushEditor);
+
+ protected override void OnApplyTemplate(TemplateAppliedEventArgs e)
+ {
+ base.OnApplyTemplate(e);
+ if (_clearButton is not null)
+ {
+ _clearButton.Click -= clearHandler;
+ }
+ _clearButton = e.NameScope.Find