v0.1 - макет интерфейса, аутентификация через логин, аккаунт админа, создание партии в 2 этапа, базовые настройки профиля и группы, переключение между группами, статистика

This commit is contained in:
2026-06-16 17:41:06 +03:00
parent 6ab74f01aa
commit 56b5d09a4d
123 changed files with 13572 additions and 21 deletions
@@ -0,0 +1,53 @@
import { ChevronRight } from "lucide-react";
import { useNavigate } from "react-router-dom";
import { formatTime } from "../domain/format";
import type { HomeInProgressMatch } from "../domain/types";
export function InProgressMatches({ items }: { items: HomeInProgressMatch[] }) {
const navigate = useNavigate();
if (items.length === 0) return null;
return (
<div className="card" style={{ borderColor: "var(--accent)" }}>
<h3 style={{ color: "var(--accent-2)" }}>Незавершённые партии</h3>
<div className="stack">
{items.map((m) => (
<button
key={m.id}
className="row-between"
onClick={() => navigate(`/match/${m.id}`)}
style={{
width: "100%",
textAlign: "left",
background: "var(--surface-2)",
border: "1px solid var(--border)",
borderRadius: "var(--radius-sm)",
padding: 12,
color: "var(--text)",
}}
>
<div style={{ minWidth: 0 }}>
<div className="row" style={{ gap: 8 }}>
<b>{m.group_name}</b>
<span className="badge" style={{ color: "var(--accent-2)" }}>идёт</span>
</div>
<div className="muted small">
{formatTime(m.started_at)} · {m.player_count} игр.
</div>
<div
className="small"
style={{ overflow: "hidden", textOverflow: "ellipsis", whiteSpace: "nowrap" }}
>
{m.participants.map((p) => p.nickname).join(", ")}
</div>
</div>
<div className="row" style={{ gap: 4, color: "var(--accent-2)", flexShrink: 0 }}>
Завершить <ChevronRight size={18} />
</div>
</button>
))}
</div>
</div>
);
}