import { useMemo } from 'react'; import { FolderGit2, GitBranch, Lock, Globe, ExternalLink, Sparkles, CircleSlash } from 'lucide-react'; import { PageHeader } from '@/components/PageHeader'; import { Card, CardHeader, Badge } from '@/components/ui/primitives'; import { KpiCard } from '@/components/ui/KpiCard'; import { cn } from '@/lib/utils'; import { repos, repoUrl, CATEGORY_LABEL, CATEGORY_ORDER, GITEA_BASE, type GiteaRepo, } from '@/data/repos'; function RepoRow({ r }: { r: GiteaRepo }) { return (
{r.name} {r.isNew && ( новый )} {r.empty && ( пусто )}
{r.note}
{r.branch} {r.private ? ( ) : ( )}
); } export function ReposModule() { const stats = useMemo(() => { const total = repos.length; const pub = repos.filter((r) => !r.private).length; const master = repos.filter((r) => r.branch === 'master').length; const empty = repos.filter((r) => r.empty).length; return { total, priv: total - pub, pub, master, empty }; }, []); const byCat = useMemo( () => CATEGORY_ORDER.map((cat) => ({ cat, items: repos.filter((r) => r.category === cat) })), [], ); return (
Открыть Gitea } />
{byCat.map(({ cat, items }) => ( {items.length}} />
{items.map((r) => ( ))}
))}

Источник истины — git1. Карта сверена вручную 2026-06-30 ({stats.total} репо, {stats.empty} пустой). Пуш — через http.extraHeader, токен в URL не сохраняется.

); }