54 lines
1.9 KiB
Plaintext
54 lines
1.9 KiB
Plaintext
@namespace Shared.Components
|
|
|
|
@inject Shared.Services.CardPreviewService PreviewService
|
|
|
|
<div class="deck-card-row">
|
|
@foreach (var group in Cards.GroupBy(x => x))
|
|
{
|
|
var cardName = group.Key;
|
|
var count = group.Count();
|
|
var card = LookupCard(cardName);
|
|
<button class="mini-card-btn @(count > 1 ? "is-stacked" : "")"
|
|
@onclick="() => SelectCard(card)"
|
|
@onmouseenter="@(e => PreviewService.Show(card, e.ClientX, e.ClientY))"
|
|
@onmouseleave="@(() => PreviewService.Hide())">
|
|
<div class="mini-card-stack">
|
|
@for (var i = 0; i < (count > 1 ? Math.Min(count, 3) : 1); i++)
|
|
{
|
|
<div class="mini-card" style="--stack-index: @i">
|
|
<div class="mini-card-img">
|
|
<img src="@(card?.ImagePath ?? "cards/placeholder.png")" alt="@cardName"
|
|
loading="lazy"/>
|
|
</div>
|
|
</div>
|
|
}
|
|
@if (count > 1)
|
|
{
|
|
<div class="mini-card-count">@count</div>
|
|
}
|
|
</div>
|
|
</button>
|
|
}
|
|
</div>
|
|
|
|
@code {
|
|
[Parameter] [EditorRequired] public List<string> Cards { get; set; } = [];
|
|
[Parameter] public EventCallback<CardData?> OnSelectCard { get; set; }
|
|
|
|
private async Task SelectCard(CardData? card)
|
|
{
|
|
await OnSelectCard.InvokeAsync(card);
|
|
}
|
|
|
|
private static readonly Dictionary<string, CardData> CardLookup = CardDatabase.Cards
|
|
.Where(c => !string.IsNullOrWhiteSpace(c.Name))
|
|
.GroupBy(c => c.Name, StringComparer.OrdinalIgnoreCase)
|
|
.ToDictionary(g => g.Key, g => g.First(), StringComparer.OrdinalIgnoreCase);
|
|
|
|
private CardData? LookupCard(string cardName)
|
|
{
|
|
return CardLookup.GetValueOrDefault(cardName);
|
|
}
|
|
|
|
}
|