"use client"; import type { LeaderboardEntry } from "./LeaderboardOverlay"; interface Props { entries: LeaderboardEntry[]; isOpen: boolean; onClose: () => void; onProfileClick: (handle: string) => void; timeFilter?: "all" | "month" | "week" | "yesterday"; onTimeFilterChange?: (filter: "all" | "month" | "week" | "yesterday") => void; } /** * Full slide-in sidebar panel for the leaderboard. * Matches the ActivityPanel pattern (360px right sidebar on desktop, bottom drawer on mobile). */ export function LeaderboardPanel({ entries, isOpen, onClose, onProfileClick, timeFilter, onTimeFilterChange, }: Props) { return ( <> {/* Desktop sidebar */} {/* Mobile drawer */}
{/* Drag handle */}
{/* Header */}
Leaderboard {entries.length}
{/* Time filter tabs */} {onTimeFilterChange && (
{([ ["all", "All Time"], ["month", "Month"], ["week", "Week"], ["yesterday", "24h"], ] as const).map(([value, label]) => ( ))}
)} {/* Scrollable entries list */}
{entries.map((entry, i) => ( ))} {entries.length === 0 && (
No contributors yet
)}
{/* Footer with scoring explanation */}
Score = closed×3 + created×1 + comments×1
); }