SvgGenerator.cs
using Sandbox.UI;
using Sandbox;
using System;

namespace JBG.UI;

/// <summary>
/// A generic panel that draws an SVG at runtime from a string
/// </summary>
[Library( "svg_generator" )]
public partial class SvgGenerator : Panel
{
	/// <summary>
	/// SVG File As String
	/// </summary>
	public string SvgAsString
	{
		get => _svgString;

		set
		{
			if ( _svgString == value )
				return;

			_svgString = value;
			ReloadTexture();
		}
	}
	internal string _svgString;

	public int? RenderWidth { get; set; } = null;
	public int? RenderHeight { get; set; } = null;
	public Color? RenderColor { get; set; } = null;

	Texture texture;
	int sizeHash;

	public override void FinalLayout( Vector2 offset )
	{
		base.FinalLayout( offset );
		if ( !IsVisible ) return;

		var hash = HashCode.Combine( SvgAsString, RenderWidth, RenderHeight, RenderColor, Style );
		if ( hash == sizeHash ) return;

		sizeHash = hash;
		ReloadTexture();
	}

	private async void ReloadTexture()
	{
		if ( string.IsNullOrEmpty( SvgAsString ) ) return;
		texture?.Dispose();

		texture = Texture.CreateFromSvgSource( SvgAsString, RenderWidth, RenderHeight, RenderColor );
		MarkRenderDirty();
	}

	public override void OnDraw()
	{
		if ( texture == null ) return;
		DrawBackgroundTexture( texture, Length.Cover );
	}
}