import Link from 'next/link'; /** * DashboardFeaturedCollection โ€” the 4x2 card-thumbnail grid panel * from the operator's redesign-v2 mockup. Mounted on /dashboard * below the stat-card row. * * Per umbrella convoy ยง 7.5, the data source is the user's most- * recent 8 owned cards (fetched from /api/user-cards by the parent * page, passed in here as `cards`). When the user has <8 cards, the * empty slots render a clear "Add cards" CTA placeholder. No * hardcoded demo cards. * * Props: * cards: array of user_cards JOIN cards rows (or empty array) * โ€” each row has at minimum { card_id, name, image_url, * set_name, rarity }. * loading: boolean โ€” shows shimmer placeholders when true. * * Implementation notes: * - The mockup's "All Sets" filter dropdown and grid/list toggle * are intentionally NOT wired here; they're sketches in the * mockup and a downstream convoy will own them. Rendering them * as decoration with TODO comments would be misleading; they're * simply omitted until functional. * - Each card uses the .card-grid-outer-glow class from sub-convoy * #6 (PR #106) for the warm outer glow treatment. */ export default function DashboardFeaturedCollection({ cards = [], loading = false }) { const slots = Array.from({ length: 8 }, (_, idx) => cards[idx] || null); return (

Featured Collection

View All
{slots.map((card, idx) => { if (loading) { return (
); }