@page "/cards" @using System.Text.Json @using Web.Models @inject HttpClient Http Card Gallery @if (selectedCard != null) {
@selectedCard.Name

@selectedCard.Name

@selectedCard.Category @if (selectedCard.Cost.HasValue) { Cost: @selectedCard.Cost } @if (selectedCard.Attack.HasValue) { ATK: @selectedCard.Attack } @if (selectedCard.Health.HasValue) { HP: @selectedCard.Health } @if (selectedCard.Speed != null) { @selectedCard.Speed }
@if (selectedCard.Faction != null) {

Faction: @selectedCard.Faction

} @if (selectedCard.Description != null) {

Description: @selectedCard.Description

} @if (selectedCard.Set != null) {

Set: @selectedCard.Set

} @if (selectedCard.Archetypes is { Count: > 0 }) {

Archetypes: @string.Join(", ", selectedCard.Archetypes)

} @if (selectedCard.ImmortalizeWhen != null) {

Immortalize When: @selectedCard.ImmortalizeWhen

} @if (selectedCard.HasImmortalize) {

Immortalizes To: @string.Join(", ", selectedCard.ImmortalizeTo!)

} @if (selectedCard.ImmortalizeFrom != null) {

Immortalizes From: @selectedCard.ImmortalizeFrom

}
} @code { private List allCards = []; private IEnumerable filteredCards => ApplyFilters(); private string search = ""; private string categoryFilter = ""; private string factionFilter = ""; private string costFilter = ""; private CardData? selectedCard; private List factions = []; protected override async Task OnInitializedAsync() { try { var catalog = await Http.GetFromJsonAsync("sample-data/cards.json"); if (catalog?.Cards != null) { allCards = catalog.Cards; factions = allCards .Select(c => c.Faction) .Where(f => f != null) .Distinct() .OrderBy(f => f) .ToList()!; } } catch (Exception ex) { Console.Error.WriteLine($"Failed to load cards: {ex.Message}"); } } private IEnumerable ApplyFilters() { var q = search?.Trim().ToLowerInvariant() ?? ""; return allCards.Where(c => (q.Length == 0 || c.Name.ToLowerInvariant().Contains(q) || (c.Description?.ToLowerInvariant().Contains(q) ?? false)) && (categoryFilter == "" || c.Category == categoryFilter) && (factionFilter == "" || c.Faction == factionFilter) && (costFilter == "" || c.Cost?.ToString() == costFilter) ); } private void SelectCard(CardData card) => selectedCard = card; private void CloseDetail() => selectedCard = null; private void ClearFilters() { search = ""; categoryFilter = ""; factionFilter = ""; costFilter = ""; } }