FadingPanel.cs
using Sandbox;
using System;

namespace FadingScreens
{
	public partial class FadingPanel : PanelComponent
	{
		bool IsFading;
		float Current;
		float Duration;
		Color ColorFrom = Color.Transparent;
		Color ColorTo = Color.Transparent;
		Action OnFadingDone;

		Color GetColor()
		{
			return Color.Lerp(ColorFrom, ColorTo, Current / Duration);
		}

		public void Fade( float duration, Color colorFrom, Color colorTo, Action onFadingComplete )
		{
			Duration = duration;
			ColorFrom = colorFrom;
			ColorFrom = colorFrom;
			ColorTo = colorTo;
			Current = 0;
			IsFading = true;
			OnFadingDone += onFadingComplete;
		}

		protected override void OnUpdate()
		{
			if(IsFading)
			{
				Current += Time.Delta;
				if( Current >= Duration)
				{
					Current = Duration;
					IsFading = false;
					OnFadingDone.Invoke();
				}
			}
			base.OnUpdate();
		}

		protected override int BuildHash()
		{
			return base.BuildHash() + IsFading.GetHashCode() + Current.GetHashCode();
		}
	}
}