import React, { useState, useMemo } from ‘react’; import { Trophy, Calendar, Swords, Info, User, ChevronRight } from ‘lucide-react’; const App = () => { // 選手データ const players = [“三笠 貴大”, “児玉 勇也”, “丸山 大輝”, “樋口 幹太”, “大城 正也”]; // 初期対戦カード(確定スケジュール) const initialMatches = [ { id: 1, date: “2026/05/17”, event: “GRACHAN 82”, p1: “三笠 貴大”, p2: “児玉 勇也”, location: “大田区”, winner: null, method: null }, { id: 2, date: “2026/05/17”, event: “GRACHAN 82”, p1: “丸山 大輝”, p2: “大城 正也”, location: “大田区”, winner: null, method: null }, { id: 3, date: “2026/08/26”, event: “HELIOS 3”, p1: “三笠 貴大”, p2: “丸山 大輝”, location: “後楽園”, winner: null, method: null }, { id: 4, date: “2026/09/13”, event: “GRACHAN 84”, p1: “大城 正也”, p2: “樋口 幹太”, location: “福岡”, winner: null, method: null }, { id: 5, date: “2026/12/06”, event: “GRACHAN 86”, p1: “三笠 貴大”, p2: “樋口 幹太”, location: “大田区”, winner: null, method: null }, { id: 6, date: “2026/12/06”, event: “GRACHAN 86”, p1: “児玉 勇也”, p2: “丸山 大輝”, location: “大田区”, winner: null, method: null }, { id: 7, date: “2027/03/XX”, event: “GRACHAN 87”, p1: “三笠 貴大”, p2: “大城 正也”, location: “東京近郊”, winner: null, method: null }, { id: 8, date: “2027/03/XX”, event: “GRACHAN 87”, p1: “児玉 勇也”, p2: “樋口 幹太”, location: “東京近郊”, winner: null, method: null }, { id: 9, date: “2027/05/XX”, event: “最終戦”, p1: “児玉 勇也”, p2: “大城 正也”, location: “東京”, winner: null, method: null }, { id: 10, date: “2027/05/XX”, event: “最終戦”, p1: “丸山 大輝”, p2: “樋口 幹太”, location: “東京”, winner: null, method: null }, ]; const [matches, setMatches] = useState(initialMatches); // 勝ち点ルール const pointRules = { “1R_KO”: { label: “1R 一本/KO”, pts: 6 }, “2R_KO”: { label: “2R 一本/KO”, pts: 5 }, “3R_KO”: { label: “3R 一本/KO”, pts: 4 }, “DECISION”: { label: “判定/不戦勝”, pts: 3 }, “LOSS”: { label: “負け”, pts: 0 } }; // 結果入力ハンドラ const handleUpdateMatch = (matchId, winnerName, methodKey) => { setMatches(prev => prev.map(m => m.id === matchId ? { …m, winner: winnerName, method: methodKey } : m )); }; // 順位計算ロジック const standings = useMemo(() => { const stats = players.reduce((acc, name) => { acc[name] = { name, played: 0, win: 0, loss: 0, pts: 0 }; return acc; }, {}); matches.forEach(m => { if (m.winner) { const loser = m.winner === m.p1 ? m.p2 : m.p1; // 勝者の統計 stats[m.winner].played += 1; stats[m.winner].win += 1; stats[m.winner].pts += pointRules[m.method].pts; // 敗者の統計 stats[loser].played += 1; stats[loser].loss += 1; } }); return Object.values(stats).sort((a, b) => b.pts – a.pts || b.win – a.win); }, [matches]); return (
{/* Header */}

GRACHAN リーグ戦 2026-2027

5選手総当たり・全10試合管理システム

Total Matches 10
Completed {matches.filter(m => m.winner).length}
{/* Main Column: Match List */}

対戦スケジュール & 結果入力

{matches.map((m) => (
{m.date} – {m.event} ({m.location}) Match #{m.id}
{/* Matchup */}
選手A
{m.p1}
VS
選手B
{m.p2}
{/* Result Input */}
))}
{/* Side Column: Standings & Rules */}
{/* Standings Table */}

現在の順位表

{standings.map((s, idx) => ( ))}
順位 選手名 試合 勝ち点
{idx === 0 ? 🥇 : idx + 1} {s.name} {s.played} {s.pts} pts
{/* Point Rules Card */}
Translate(翻訳)>>