Initial commit.

This commit is contained in:
Greyson Parrelli
2026-07-22 23:07:29 -04:00
commit 612a4e6227
38 changed files with 6106 additions and 0 deletions
+70
View File
@@ -0,0 +1,70 @@
import type { Card } from '../types'
import { artFor, SUIT_EMOJI } from '../petArt'
interface Props {
card: Card
size?: 'sm' | 'md' | 'lg'
selected?: boolean
disabled?: boolean
onClick?: () => void
// Battle decorations
bonus?: number
damage?: number
dead?: boolean
}
// CardView renders one physical card: pets get a power badge and suit stamp,
// foods a description line. Battle mode layers on buffs and damage markers.
export function CardView({
card,
size = 'md',
selected,
disabled,
onClick,
bonus = 0,
damage = 0,
dead,
}: Props) {
const power = (card.power ?? 0) + bonus
const classes = [
'card',
`card-${size}`,
card.kind === 'food' ? 'card-food' : 'card-pet',
selected ? 'is-selected' : '',
disabled ? 'is-disabled' : '',
dead ? 'is-dead' : '',
onClick && !disabled ? 'is-clickable' : '',
]
.filter(Boolean)
.join(' ')
return (
<div
className={classes}
onClick={disabled ? undefined : onClick}
role={onClick ? 'button' : undefined}
>
<div className="card-top">
<span className="card-tier">T{card.tier || ''}</span>
{card.suit && (
<span className="card-suit" title={`Suit: ${card.suit}`}>
{SUIT_EMOJI[card.suit]}
</span>
)}
</div>
<div className="card-art" aria-hidden>
{artFor(card.name)}
</div>
<div className="card-name">{card.name}</div>
{card.kind === 'pet' ? (
<div className="card-bottom">
<span className={`card-power ${bonus > 0 ? 'is-buffed' : ''}`}>{power}</span>
{damage > 0 && !dead && <span className="card-damage">{damage}</span>}
</div>
) : (
<div className="card-food-text">+1 power</div>
)}
{selected && <div className="card-check"></div>}
</div>
)
}