ui/richtext/RichTextPerkIcon.razor

A Razor UI panel that renders a perk icon in rich text. It parses a perk tag (optionally with :level), looks up the perk TypeDescription, displays its rarity tint and image, and updates a shared Manager with hover state.

Reflection
@namespace Sandbox
@using Sandbox;
@using Sandbox.UI;
@using System;
@inherits Panel
@implements IRichTextPanel
@attribute [RichTextPanel( @"\[perk:([\w]+(?::\d+)?)\]" )]

<root class="richtext-perk-icon">
	@if ( _perkType != null )
	{
		var attrib = _perkType.GetAttribute<PerkAttribute>();
		var rarity = attrib.Rarity;
		var curse = attrib.Curse;
		var highlightColor = PerkManager.GetCardRarityColor( rarity, curse, alpha: 0.7f );
		var rarityBgTint = PerkManager.GetCardRarityColor( rarity, curse );
		<div class="rarity" style="background-color: @highlightColor.Rgba; background-image-tint:@rarityBgTint.Rgba;">
			<div class="image" style="background-image: url( @Perk.GetImagePath( _perkType.TargetType ) )"></div>
		</div>
	}
</root>

<style>
	.richtext-perk-icon {
		position: relative;
		width: 24px;
		height: 24px;
		flex-shrink: 0;
		pointer-events: all;
		cursor: default;

		.rarity {
			position: relative;
			width: 100%;
			height: 100%;
			background-size: cover;
			background-image: url(textures/ui/gradient/gradient.png);
		}

		.image {
			position: relative;
			width: 100%;
			height: 100%;
			background-position: center;
			background-size: cover;
		}
	}
</style>

@code
{
	TypeDescription _perkType;
	int _hoverLevel = 1;
	public float? ImageSize { get; set; }

	public void ParseRichText( string text )
	{
		_hoverLevel = 1;
		var perkName = text;

		if ( !string.IsNullOrWhiteSpace( text ) )
		{
			var splitIndex = text.LastIndexOf( ':' );
			if ( splitIndex > 0 && splitIndex < text.Length - 1 )
			{
				var levelText = text[(splitIndex + 1)..];
				if ( int.TryParse( levelText, out var parsedLevel ) )
				{
					_hoverLevel = parsedLevel;
					perkName = text[..splitIndex];
				}
			}
		}

		if ( _hoverLevel <= 0 )
			_hoverLevel = 1;

		_perkType = TypeLibrary.GetType( perkName );
	}

	protected override void OnMouseOver( MousePanelEvent e )
	{
		if ( _perkType == null )
			return;

		Manager.Instance.HoveredPerkType = _perkType;
		Manager.Instance.HoveredPerkPanel = this;
		Manager.Instance.HoveredPerkLevel = _hoverLevel;
		Manager.Instance.IsHoveredPerkAChoice = false;
		Manager.Instance.IsHoveredPerkBanished = false;
		Manager.Instance.IsHoveredPerkHidden = false;
		Manager.Instance.HoveredPlayer = null;
		Manager.Instance.HoveredPlayerIcon = null;
	}

	protected override void OnMouseOut( MousePanelEvent e )
	{
		if ( Manager.Instance.HoveredPerkPanel != this ) return;
		Manager.Instance.HoveredPerkType = null;
		Manager.Instance.HoveredPerkPanel = null;
		Manager.Instance.IsHoveredPerkBanished = false;
		Manager.Instance.IsHoveredPerkHidden = false;
	}

	public override void OnDeleted()
	{
		base.OnDeleted();
		if ( Manager.Instance.HoveredPerkPanel != this ) return;
		Manager.Instance.HoveredPerkType = null;
		Manager.Instance.HoveredPerkPanel = null;
		Manager.Instance.IsHoveredPerkBanished = false;
		Manager.Instance.IsHoveredPerkHidden = false;
	}

	protected override int BuildHash()
	{
		return HashCode.Combine( _perkType, _hoverLevel );
	}
}