+ {/* ── header + search row ──────────────────────────────────── */}
+
+
+ Repositories{" "}
+
+ [{repos.length}]
+
+
+
+ {/* language dropdown */}
+
+
+ {/* custom chevron */}
+
+
+
+ {/* search input */}
+
+
+ setSearch(e.target.value)}
+ className="w-full bg-github-canvas border border-github-border rounded-none pl-10 pr-4 py-2.5 text-sm text-white font-mono placeholder:text-github-muted/60 transition-all duration-200 hover:border-[var(--color-aossie-green)] focus:outline-none focus:border-[var(--color-aossie-green)] focus:shadow-[0_0_8px_rgba(140,198,63,0.25)]"
+ />
+ {search && (
+
+ )}
+
+
+
+
+ {/* ── category filter bar ──────────────────────────────────── */}
+
+
+ Filter:
+
+ {CATEGORY_OPTIONS.map((option) => {
+ const isActive = categoryFilter === option.value;
+ const count = option.value
+ ? repos.filter((repo) => {
+ const text = [
+ repo.name || "",
+ repo.description || "",
+ ...(repo.topics || []),
+ ]
+ .join(" ")
+ .toLowerCase();
+ return CATEGORY_KEYWORDS[option.value]?.some((kw) =>
+ text.includes(kw),
+ );
+ }).length
+ : repos.length;
+
+ return (
+
+ );
+ })}
+
+
+
+
+
+
+
+ | Repository |
+ toggleSort("stargazers_count")}
+ >
+
+ |
+ toggleSort("forks_count")}
+ >
+
+ |
+ toggleSort("open_issues_count")}
+ >
+
+ |
+ Language |
+ toggleSort("updated_at")}
+ >
+
+ |
+
+
+
+ {paginatedRepos.map((repo) => (
+ setSelectedRepo(repo)}
+ >
+ |
+
+ {repo.name}
+
+ {repo.description && (
+
+ {repo.description}
+
+ )}
+ |
+
+
+ {" "}
+ {repo.stargazers_count}
+
+ |
+
+
+ {" "}
+ {repo.forks_count}
+
+ |
+
+
+ {" "}
+ {repo.open_issues_count}
+
+ |
+
+ {repo.language ? (
+
+ {repo.language}
+
+ ) : (
+ -
+ )}
+ |
+
+ {new Date(repo.updated_at).toLocaleDateString()}
+ |
+
+ ))}
+ {paginatedRepos.length === 0 && (
+
+ |
+ No repositories found.
+ |
+
+ )}
+
+
+
+
+ {/* Pagination Controls */}
+ {totalPages > 1 && (
+
+
+ SHOWING{" "}
+
+ {(currentPage - 1) * ITEMS_PER_PAGE + 1}
+ {" "}
+ TO{" "}
+
+ {Math.min(
+ currentPage * ITEMS_PER_PAGE,
+ filteredAndSortedRepos.length,
+ )}
+ {" "}
+ OF{" "}
+
+ {filteredAndSortedRepos.length}
+
+
+
+
+
+
+
+ )}
+
+
+
setSelectedRepo(null)}
+ />
+
+ );
+}
diff --git a/src/components/dashboard/StatCard.tsx b/src/components/dashboard/StatCard.tsx
new file mode 100644
index 0000000..689f4ae
--- /dev/null
+++ b/src/components/dashboard/StatCard.tsx
@@ -0,0 +1,32 @@
+import type { LucideIcon } from 'lucide-react';
+import { cn } from '../../lib/utils';
+import { motion } from 'framer-motion';
+
+interface StatCardProps {
+ title: string;
+ value: string | number;
+ icon: LucideIcon;
+ colorClass?: string;
+ delay?: number;
+}
+
+export function StatCard({ title, value, icon: Icon, colorClass = "text-github-text", delay = 0 }: StatCardProps) {
+ return (
+