UI/BuffIcons.cs
using System;
using System.Collections.Generic;
namespace Prototype;
public static class BuffIcons
{
    public readonly record struct Stroke(float X,float Y,float Length,float Angle);
    public static IEnumerable<Stroke> Lines(string id)
    {
        var paths = id switch {
            "power" => new[]{"18,24 42,24 56,32 42,40 18,40 18,24","6,26 13,26","2,32 13,32","6,38 13,38"},
            "haste" => new[]{"8,14 31,14 40,20 31,26 8,26","18,30 41,30 50,36 41,42 18,42","28,46 51,46 58,52 51,58 28,58"},
            "reload" => new[]{"49,20 42,12 24,12 12,24 12,42 24,52 42,52 52,42","49,8 49,22 35,22","28,23 38,23 38,42 28,42 28,23"},
            "execute" => new[]{"18,48 46,12 53,8 52,18 24,54 18,48","12,42 30,57","10,57 17,49","8,19 16,19","12,15 12,23"},
            "vitality" => new[]{"32,7 52,15 50,38 43,48 32,57 21,48 14,38 12,15 32,7","32,21 32,41","22,31 42,31"},
            "armor" => new[]{"32,7 52,15 50,38 43,48 32,57 21,48 14,38 12,15 32,7","32,17 43,22 42,35 32,46 22,35 21,22 32,17","32,17 32,46"},
            "recovery" => new[]{"7,33 18,33 24,20 33,46 40,28 45,33 57,33","9,21 17,12 31,8 46,13 54,23","54,43 45,52 31,56 17,51 9,42"},
            "lifeline" => new[]{"32,15 23,8 13,11 7,22 10,33 32,56 54,33 57,22 51,11 41,8 32,15","5,32 21,32 27,23 34,42 40,32 59,32"},
            "speed" => new[]{"9,10 28,32 9,54","31,10 50,32 31,54"},
            "dash" => new[]{"9,20 21,32 9,44","27,14 43,32 27,50","47,10 56,10 56,54 47,54"},
            "focus" => new[]{"25,14 39,14 50,25 50,39 39,50 25,50 14,39 14,25 25,14","32,23 32,41","23,32 41,32","32,3 32,8","32,56 32,61","3,32 8,32","56,32 61,32"},
            "rhythm" => new[]{"4,32 16,32 24,14 34,50 42,25 48,32 60,32","47,8 57,15 47,22"},
            "power_extra" => new[]{"15,48 45,13 55,8 52,20 22,55 15,48","10,42 29,59","9,60 17,50","8,12 20,12","14,6 14,18"},
            _ => new[]{"14,14 26,14 26,37 49,45 49,53 12,53 12,45 14,14","37,11 51,11","42,21 57,21","37,31 51,31"}
        };
        foreach(var path in paths)
        {
            var points=path.Split(' ');
            for(int i=1;i<points.Length;i++)
            {
                var a=points[i-1].Split(',');var b=points[i].Split(',');
                float x=int.Parse(a[0]),y=int.Parse(a[1]),dx=int.Parse(b[0])-x,dy=int.Parse(b[1])-y;
                yield return new Stroke(x,y,MathF.Sqrt(dx*dx+dy*dy),MathF.Atan2(dy,dx)*180f/MathF.PI);
            }
        }
    }
    public static string Style(Stroke s) => FormattableString.Invariant($"left:{s.X}px; top:{s.Y}px; width:{s.Length}px; transform:rotate({s.Angle}deg);");
}