diff --git a/WheelWizard/Views/App.axaml b/WheelWizard/Views/App.axaml
index 6c44826f..c8b10f02 100644
--- a/WheelWizard/Views/App.axaml
+++ b/WheelWizard/Views/App.axaml
@@ -68,5 +68,6 @@
+
\ No newline at end of file
diff --git a/WheelWizard/Views/Components/WhWzLibrary/WheelTrail.axaml b/WheelWizard/Views/Components/WhWzLibrary/WheelTrail.axaml
new file mode 100644
index 00000000..2225082a
--- /dev/null
+++ b/WheelWizard/Views/Components/WhWzLibrary/WheelTrail.axaml
@@ -0,0 +1,130 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/WheelWizard/Views/Components/WhWzLibrary/WheelTrail.axaml.cs b/WheelWizard/Views/Components/WhWzLibrary/WheelTrail.axaml.cs
new file mode 100644
index 00000000..a98b93a8
--- /dev/null
+++ b/WheelWizard/Views/Components/WhWzLibrary/WheelTrail.axaml.cs
@@ -0,0 +1,93 @@
+using Avalonia;
+using Avalonia.Controls.Primitives;
+using Avalonia.Media;
+
+namespace WheelWizard.Views.Components
+{
+ public class WheelTrail : TemplatedControl
+ {
+ public static readonly StyledProperty AngleProperty = AvaloniaProperty.Register(nameof(Angle));
+
+ public double Angle
+ {
+ get => GetValue(AngleProperty);
+ set => SetValue(AngleProperty, value);
+ }
+
+ public static readonly StyledProperty WheelRotationProperty = AvaloniaProperty.Register(
+ nameof(WheelRotation)
+ );
+
+ public double WheelRotation
+ {
+ get => GetValue(WheelRotationProperty);
+ set => SetValue(WheelRotationProperty, value);
+ }
+
+ public static readonly StyledProperty RelativeLengthProperty = AvaloniaProperty.Register(
+ nameof(RelativeLength),
+ 6.0
+ );
+ public double RelativeLength
+ {
+ get => GetValue(RelativeLengthProperty);
+ set => SetValue(RelativeLengthProperty, value);
+ }
+
+ public static readonly StyledProperty XProperty = AvaloniaProperty.Register(nameof(X));
+
+ public double X
+ {
+ get => GetValue(XProperty);
+ set => SetValue(XProperty, value);
+ }
+
+ public static readonly StyledProperty YProperty = AvaloniaProperty.Register(nameof(Y));
+
+ public double Y
+ {
+ get => GetValue(YProperty);
+ set => SetValue(YProperty, value);
+ }
+
+ public static readonly StyledProperty ExtendedHeightProperty = AvaloniaProperty.Register(
+ nameof(ExtendedHeight)
+ );
+
+ public double ExtendedHeight
+ {
+ get => GetValue(ExtendedHeightProperty);
+ set => SetValue(ExtendedHeightProperty, value);
+ }
+
+ private readonly RotateTransform _rotateTransform = new RotateTransform { CenterX = 0.5, CenterY = 0.5 };
+ private readonly TranslateTransform _translateTransform = new TranslateTransform { X = 0, Y = 0 };
+
+ public WheelTrail()
+ {
+ var group = new TransformGroup();
+ group.Children.Add(_rotateTransform);
+ group.Children.Add(_translateTransform);
+ this.RenderTransform = group;
+ }
+
+ protected override void OnPropertyChanged(AvaloniaPropertyChangedEventArgs change)
+ {
+ base.OnPropertyChanged(change);
+
+ if (change.Property == AngleProperty)
+ {
+ _rotateTransform.Angle = (double)(change.NewValue ?? 0.0);
+ }
+
+ if (change.Property == XProperty)
+ {
+ _translateTransform.X = (double)(change.NewValue ?? 0.0);
+ }
+ if (change.Property == YProperty)
+ {
+ _translateTransform.Y = (double)(change.NewValue ?? 0.0);
+ }
+ }
+ }
+}
diff --git a/WheelWizard/Views/Converters/BrushColorConverters.cs b/WheelWizard/Views/Converters/BrushColorConverters.cs
new file mode 100644
index 00000000..120ae5f8
--- /dev/null
+++ b/WheelWizard/Views/Converters/BrushColorConverters.cs
@@ -0,0 +1,28 @@
+using Avalonia.Data.Converters;
+using Avalonia.Media;
+
+namespace WheelWizard.Views.Converters;
+
+// Note that this is static, which means you dont have to add it as a converter
+public static class BrushColorConverters
+{
+ public static readonly IValueConverter TransparentColor = new FuncValueConverter