SantaUI.razor
@using Sandbox;
@using System;
@using Sandbox.UI;
@inherits PanelComponent
@namespace Sandbox

<root>
    <div class="scoreboard">
        <div class="giftbox">
            <div class="gift" style="transform: rotate(@GiftAngle);"></div>
        </div>
        <div class="textbox">
            <div class="title">Score:</div>
            <div class="subtext">@Score</div>
        </div>
    </div>
    <div class="howto">
        <div class="textbox">
            <div class="title">How to play</div>
            <div class="subtext">A and D to move. SPACE to jump.</div>
        </div>
    </div>
    <div class="gameover" style="opacity: @(ChristmassyGameLogic.Instance.IsPlaying ? 0 : 1)">
        <div class="button" onclick=@(() => ChristmassyGameLogic.Instance.StartGame())>
            <div class="title">RETRY</div>
        </div>
        <div class="button" onclick=@(() => Game.Close())>
            <div class="title">QUIT</div>
        </div>
    </div>
</root>

@code
{
    private float _elapsedTime = 0f;
    public string Score => ChristmassyGameLogic.Instance.Points.ToString();
    public string GiftAngle => (MathF.Sin( _elapsedTime / 10f) * 10f - 30f ).ToString() + "deg";

    protected override void OnStart()
    {
        DeleteHowto();
    }

    protected override void OnUpdate()
    {
        _elapsedTime += Time.Delta * ChristmassyGameLogic.Instance.RotationSpeed;
        if (_elapsedTime > 2 * MathF.PI * 10f)
        {
            _elapsedTime -= 2 * MathF.PI * 10f;
        }
        base.OnUpdate();
    }

    private async void DeleteHowto()
    {
        await Task.DelaySeconds(4f);

        foreach ( var child in Panel.Children )
            if ( child.HasClass( "howto" ) && !child.HasClass( "closed" ))
                child.AddClass("closed");
    }

    /// <summary>
    /// the hash determines if the system should be rebuilt. If it changes, it will be rebuilt
    /// </summary>
    protected override int BuildHash() => System.HashCode.Combine( Time.Now );
}