import { AnimatePresence, motion } from 'motion/react'; import type { ReactNode } from 'react'; import { resolveInventoryItemUseEffect } from '../data/inventoryEffects'; import { buildInventoryItemDescription } from '../data/itemPresentation'; import type { Character, InventoryItem, WorldType } from '../types'; import { CHROME_ICONS, getInventoryItemVisualSrc, getNineSliceStyle, UI_CHROME, } from '../uiAssets'; import { PixelIcon } from './PixelIcon'; function getInventoryRarityTheme(rarity: InventoryItem['rarity']) { switch (rarity) { case 'legendary': return { frameClass: 'border-amber-400/45 bg-gradient-to-br from-amber-500/16 to-orange-500/8', titleClass: 'text-amber-300', quantityClass: 'border-amber-300/30 bg-amber-500/14 text-amber-50 shadow-[0_0_18px_rgba(251,191,36,0.16)]', auraClass: 'from-amber-500/18 via-orange-500/12 to-transparent', glowClass: 'bg-amber-300/24', }; case 'epic': return { frameClass: 'border-fuchsia-400/40 bg-gradient-to-br from-fuchsia-500/14 to-rose-500/8', titleClass: 'text-fuchsia-300', quantityClass: 'border-fuchsia-300/28 bg-fuchsia-500/12 text-fuchsia-50 shadow-[0_0_18px_rgba(232,121,249,0.14)]', auraClass: 'from-fuchsia-500/18 via-rose-500/10 to-transparent', glowClass: 'bg-fuchsia-300/22', }; case 'rare': return { frameClass: 'border-sky-400/40 bg-gradient-to-br from-sky-500/14 to-cyan-500/8', titleClass: 'text-sky-300', quantityClass: 'border-sky-300/26 bg-sky-500/12 text-sky-50 shadow-[0_0_18px_rgba(56,189,248,0.14)]', auraClass: 'from-sky-500/18 via-cyan-500/10 to-transparent', glowClass: 'bg-sky-300/20', }; case 'uncommon': return { frameClass: 'border-emerald-400/35 bg-gradient-to-br from-emerald-500/12 to-lime-500/8', titleClass: 'text-emerald-300', quantityClass: 'border-emerald-300/24 bg-emerald-500/12 text-emerald-50 shadow-[0_0_18px_rgba(74,222,128,0.12)]', auraClass: 'from-emerald-500/18 via-lime-500/10 to-transparent', glowClass: 'bg-emerald-300/18', }; default: return { frameClass: 'border-white/10 bg-white/[0.04]', titleClass: 'text-zinc-100', quantityClass: 'border-white/12 bg-white/[0.06] text-zinc-100 shadow-[0_0_18px_rgba(255,255,255,0.06)]', auraClass: 'from-white/10 via-white/4 to-transparent', glowClass: 'bg-white/10', }; } } function getInventoryItemIcon(item: InventoryItem) { return getInventoryItemVisualSrc(item); } function buildInventoryItemSummary( item: InventoryItem, useEffect: ReturnType, ) { return buildInventoryItemDescription(item, useEffect); } function buildInventorySlots(items: InventoryItem[], minimumSlotCount: number) { const slotCount = Math.ceil(Math.max(items.length, minimumSlotCount) / 4) * 4; return [ ...items, ...Array.from( { length: Math.max(0, slotCount - items.length) }, () => null, ), ]; } export function InventoryItemGrid({ items, selectedItemId = null, minimumSlotCount = 16, onSelectItem, }: { items: InventoryItem[]; selectedItemId?: string | null; minimumSlotCount?: number; onSelectItem: (item: InventoryItem) => void; }) { const inventorySlots = buildInventorySlots(items, minimumSlotCount); return (
{inventorySlots.map((item, index) => { if (!item) { return (
); } const selected = selectedItemId === item.id; const rarityTheme = getInventoryRarityTheme(item.rarity); return ( ); })}
); } type InventoryItemDetailModalProps = { item: InventoryItem | null; playerCharacter: Character; worldType: WorldType | null; ownerLabel?: string; onClose: () => void; footer?: ReactNode; }; export function InventoryItemDetailModal({ item, playerCharacter, onClose, footer, }: InventoryItemDetailModalProps) { const selectedItemUseEffect = item ? resolveInventoryItemUseEffect(item, playerCharacter) : null; const itemSummary = item ? buildInventoryItemSummary(item, selectedItemUseEffect) : ''; const rarityTheme = item ? getInventoryRarityTheme(item.rarity) : getInventoryRarityTheme('common'); return ( {item && ( event.stopPropagation()} >
{item.name}
数量 x{item.quantity}

{itemSummary}

{footer != null ? (
{footer}
) : null} )} ); }