Code/Fading.cs
using Sandbox;
using System;

namespace FadingScreens
{
	public static class Fading
	{
		static GameObject fader;

		static bool IsFaderPresent()
		{
			if ( fader == null || fader.Scene == null )
			{
				return false;
			}

			return true;
		}

		public static void FadeInFrom( float duration, Color color )
		{
			Fade( duration, color, Color.Transparent, () =>
			{

			} );
		}

		public static void FadeOutWith( float duration, Color color )
		{
			Fade( duration, Color.Transparent, color, () =>
			{

			} );
		}

		public static void FadeInFrom( float duration, Color color, Action onFadingComplete )
		{
			Fade( duration, color, Color.Transparent, onFadingComplete );
		}

		public static void FadeOutWith(float duration, Color color, Action onFadingComplete )
		{
			Fade(duration, Color.Transparent, color, onFadingComplete);
		}

		public static void Fade(float duration, Color colorFrom, Color colorTo, Action onFadingComplete)
		{
			if ( !IsFaderPresent() )
			{
				fader = new();
				fader.Components.Create<ScreenPanel>();
			}
			var oldFader = fader.Components.Get<FadingPanel>();
			if ( oldFader != null )
			{
				oldFader.Destroy();
			}
			fader.Components.Create<FadingPanel>().Fade(duration, colorFrom, colorTo, onFadingComplete );
		}
	}
}