UpgradeCapsuleView.razor

The upgrade capsule opening panel. Draws a sealed capsule with art, swaps to the reward card and grade, and has buttons to open the upgrade list or continue. Localizes labels using GamePreferences.Russian.

Rough Code
@using Sandbox
@using Sandbox.UI
@using Socer
@using System
@using System.Linq
@inherits Panel

<div class="upgrade-capsule-opening localized-text @(Ready?"ready":"charging")">
    <div class="capsule-opening-glow"></div>
    <label class="capsule-opening-title">@Name</label>
    @if(!Ready)
    {
        <img class="capsule-sealed" src="@Art" />
        <div class="capsule-opening-ring"></div>
    }
    else
    {
        <div class="capsule-result"><div class="capsule-result-frame"><ClubItemCardView Reward="@Reward" CssClass="capsule-result-card display-only" /></div><label>@Grade</label></div>
        <div class="capsule-opening-actions"><button class="capsule-to-upgrades" onclick=@(()=>OnInventory?.Invoke())>@T("К улучшениям","My upgrades")</button><button class="primary capsule-continue" onclick=@(()=>OnClose?.Invoke())>@T("Далее →","Continue →")</button></div>
    }
</div>

@code {
    [Parameter] public PackOpening Opening {get;set;}
    [Parameter] public float StartedAt {get;set;}
    [Parameter] public Action OnClose {get;set;}
    [Parameter] public Action OnInventory {get;set;}
    PackReward Reward=>Opening?.Items.FirstOrDefault();
    bool Ready=>Time.Now-StartedAt>=.85f;
    bool Gold=>Opening?.PackIndex==9;
    string Art=>Gold?"/store-packs/upgrade-gold.svg":"/store-packs/upgrade-silver.svg";
    string Name=>Gold?T("Золотая капсула","Gold capsule"):T("Серебряная капсула","Silver capsule");
    string Grade=>T(new[]{"Бронзовое улучшение","Серебряное улучшение","Золотое улучшение"}[Math.Clamp(Reward?.Training?.Grade??1,1,3)-1],Reward?.Name??"");
    static string T(string ru,string en)=>GamePreferences.Russian?ru:en;
    public UpgradeCapsuleView(){StyleSheet.Load("/UpgradeCapsuleView.razor.scss");}
    public override void Tick(){base.Tick();StateHasChanged();}
    protected override int BuildHash()=>HashCode.Combine(Opening,Ready,GamePreferences.Russian);
}