/* eslint-disable @next/next/no-img-element -- External card image URLs; next/image migration is out of scope. */
import { ManaCost, ColorFilterSymbol } from './ManaSymbols';
import ManaSymbolSettings from './ManaSymbolSettings';
import { SearchBar } from './ui';
/* 2026-06-04 design-sweep pass: this file used broken Tailwind token
classes (bg-bg-*, text-text-*, border-border, bg-accent-ember,
focus:ring-accent-ember) throughout — none of those are defined in
tailwind.config.js, so the browser pane rendered as transparent
nothingness. Sweep replaces them with inline style={{ ... CSS
vars ... }}, the SearchBar primitive for the card search input,
and `glass-panel` + `rounded-2xl` on the outer pane to match the
Liquid Glass system. Rarity badge colours were converted from the
stale orange/yellow/gray/green Tailwind defaults to a neutral
inline pair (bg-tertiary surface + ember/text-primary fg) so they
render correctly in dark theme. */
const rarityBadgeStyle = (rarity) => {
switch (rarity) {
case 'mythic':
return {
backgroundColor: 'var(--accent-ember)',
color: '#ffffff',
};
case 'rare':
return {
backgroundColor: 'var(--accent-flame)',
color: '#ffffff',
};
case 'uncommon':
return {
backgroundColor: 'var(--bg-tertiary)',
color: 'var(--text-primary)',
};
default: // common
return {
backgroundColor: 'var(--bg-tertiary)',
color: 'var(--text-secondary)',
};
}
};
const rarityDotColor = (rarity) => {
switch (rarity) {
case 'mythic': return 'var(--accent-ember)';
case 'rare': return 'var(--accent-flame)';
case 'uncommon': return 'var(--text-secondary)';
default: return 'var(--accent-wood)';
}
};
export default function DeckBuilderCardBrowser({
selectedCard,
onSelectCard,
onClearSelectedCard,
viewMode,
onViewModeChange,
showSettings,
onToggleSettings,
onCollapseSidebar,
searchQuery,
onSearchQueryChange,
showFilters,
onToggleFilters,
filters,
onFiltersChange,
onClearFilters,
onToggleColorFilter,
searchLoading,
searchResults,
manaSymbolSettings,
onManaSymbolSettingsChange,
onAddCardToDeck,
}) {
const hasActiveFilters =
filters.colors.length > 0 || filters.cmc || filters.rarity;
return (
{!selectedCard ? (
<>
{/* Header */}
Card Browser
{/* View Mode Toggle */}
{/* Search */}
onSearchQueryChange(e.target.value)}
onClear={() => onSearchQueryChange('')}
placeholder="Search for cards…"
/>
{/* Settings Panel */}
{showSettings && (
)}
{/* Quick Filters */}
{showFilters && (
{/* Color Filters */}
{hasActiveFilters && (
)}
{['W', 'U', 'B', 'R', 'G'].map((color) => (
))}
{/* CMC and Rarity */}
)}
{/* Card List */}
{viewMode === 'list' ? (
{searchLoading ? (
) : searchResults.length === 0 ? (
🔍
{searchQuery ? 'No cards found' : 'No cards available'}
) : (
searchResults.map((card) => (
onSelectCard(card)}
>
{card.image_url && (

)}
{card.name}
{card.set_name}
{card.mana_cost && (
)}
{card.rarity && (
{card.rarity[0].toUpperCase()}
)}
))
)}
) : (
{searchLoading ? (
) : searchResults.length === 0 ? (
🔍
{searchQuery ? 'No cards found' : 'No cards available'}
) : (
{searchResults.map((card) => (
onSelectCard(card)}
>
{card.image_url ? (
{card.name}
{card.set_name}
{card.rarity && (
)}
) : (
{card.name}
{card.set_name}
)}
))}
)}
)}
>
) : (
/* Card Detail View */
<>
{selectedCard.name}
{selectedCard.image_url && (
)}
{selectedCard.name}
{selectedCard.set_name}
{selectedCard.mana_cost && (
)}
{selectedCard.card_type && (
{selectedCard.card_type}
)}
{selectedCard.oracle_text && (
{selectedCard.oracle_text}
)}
{selectedCard.rarity && (
{selectedCard.rarity}
)}
{selectedCard.cmc !== undefined && (
)}
>
)}
{/* Floating Action Button */}
{selectedCard && (
)}
);
}