ui/HealthBar.razor
@using Sandbox;
@using Sandbox.UI;
@inherits Panel
@attribute [StyleSheet("HealthBar.razor.scss")]

<root>
	@{
		var manager = Manager.Instance;
		var hpPercent = Math.Clamp(manager.HP / (float)manager.MaxHP, 0f, 1f);
		var barColor = (manager.HP == 1 ? Color.Lerp(new Color(1f, 0f, 0f), new Color(1f, 1f, 0f), 0.5f + Utils.FastSin(Time.Now * 8f) * 0.5f) : new Color(1f, 0.2f, 0.2f));
		var borderColor = (manager.HP == 1 ? Color.Lerp(new Color(1f, 0f, 0f), new Color(0f, 0f, 0f), 0.5f + Utils.FastSin(Time.Now * 8f) * 0.5f) : new Color(0f, 0f, 0f));
	}

	<div class="hp_bar">
		<div class="hp_bar_delta" style="height:@(hpPercent * 100f)%;"></div>
		<div class="hp_bar_overlay" style="height:@(hpPercent * 100f)%; background-color:@( barColor.Rgba );"></div>
	</div>

	<div class="hp_bar_border" style="border: 6px solid @( borderColor.Rgba );"></div>

	<HealthBarHeart />
</root>

@code
{
	protected override int BuildHash()
	{
		var manager = Manager.Instance;

		if(manager.HP == 1)
		{
			return HashCode.Combine(
				Time.Now
			);
		}

		float hpChangedHash = Manager.Instance.TimeSinceHPChanged < 1f ? Time.Now : 0f;

		return HashCode.Combine(
			manager.HP,
			manager.MaxHP,
			hpChangedHash
		);
	}
}