@scriptonita/chess-football-ui 0.1.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/lib/utils.ts","../src/components/game/game-piece.tsx","../src/components/game/football.tsx","../src/components/game/game-board.tsx","../src/components/ui/avatar.tsx","../src/i18n/index.tsx","../src/components/action-points.tsx","../src/components/game/scoreboard.tsx","../src/components/game/mini-scoreboard.tsx","../src/components/ui/button.tsx","../src/components/ui/confirm-dialog.tsx","../src/components/game/game-controls.tsx","../src/components/game/selected-piece-detail.tsx","../src/components/game/move-history.tsx","../src/components/game/static-game-board.tsx"],"names":["jsxs","jsx","useState","AnimatePresence","motion","PIECE_ICON","ChessKing","ChessQueen","ChessRook","ChessBishop","ChessKnight","ShieldQuestion","useRef","useEffect","squareName","COLS","ROWS","useMemo"],"mappings":"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","file":"index.js","sourcesContent":["import { clsx, type ClassValue } from 'clsx'\nimport { twMerge } from 'tailwind-merge'\n\nexport function cn(...inputs: ClassValue[]) {\n return twMerge(clsx(inputs))\n}\n","import { Piece } from '@scriptonita/chess-football-engine'\nimport { cn } from '../../lib/utils'\nimport {\n ChessKing,\n ChessQueen,\n ChessRook,\n ChessBishop,\n ChessKnight,\n ShieldQuestion,\n type LucideIcon,\n} from 'lucide-react'\n\ninterface GamePieceProps {\n piece: Piece\n isSelected: boolean\n hasBall: boolean\n onClick: (e: React.MouseEvent) => void\n}\n\nconst PIECE_ICON: Record<Piece['type'], LucideIcon> = {\n king: ChessKing,\n queen: ChessQueen,\n rook: ChessRook,\n bishop: ChessBishop,\n knight: ChessKnight,\n}\n\nconst PieceIcon = ({ type }: { type: Piece['type'] }) => {\n const Icon = PIECE_ICON[type] ?? ShieldQuestion\n // Size scales with the board container width (cqw); clamp keeps the glyph\n // readable on small screens and avoids overflow on very large ones.\n const style: React.CSSProperties = {\n width: 'clamp(16px, 7.4cqw, 44px)',\n height: 'clamp(16px, 7.4cqw, 44px)',\n filter: 'drop-shadow(0 1px 1px rgba(0,0,0,0.35))',\n }\n return <Icon style={style} strokeWidth={1.75} aria-hidden=\"true\" />\n}\n\n// 3D piece styling: radial gradient for top-left light source + layered\n// box-shadows (inner highlight, inner bottom shade, outer drop shadows) to\n// suggest a chip floating slightly above the board.\nconst WHITE_PIECE_STYLE: React.CSSProperties = {\n background: 'radial-gradient(circle at 30% 25%, #ffffff 0%, #f4f4f5 55%, #d4d4d8 100%)',\n boxShadow: [\n 'inset 0 1.5px 1px rgba(255,255,255,0.95)',\n 'inset 0 -2px 3px rgba(0,0,0,0.18)',\n '0 4px 6px rgba(0,0,0,0.45)',\n '0 1px 2px rgba(0,0,0,0.35)',\n ].join(', '),\n border: '1px solid rgba(0,0,0,0.18)',\n color: '#09090b',\n}\n\nconst BLACK_PIECE_STYLE: React.CSSProperties = {\n background: 'radial-gradient(circle at 30% 25%, #52525b 0%, #1c1c1f 55%, #050507 100%)',\n boxShadow: [\n 'inset 0 1.5px 1px rgba(255,255,255,0.22)',\n 'inset 0 -2px 3px rgba(0,0,0,0.6)',\n '0 4px 6px rgba(0,0,0,0.55)',\n '0 1px 2px rgba(0,0,0,0.4)',\n ].join(', '),\n border: '1px solid rgba(0,0,0,0.55)',\n color: '#fafafa',\n}\n\nconst MOVED_STYLE: React.CSSProperties = {\n filter: 'saturate(0.15) brightness(0.75)',\n}\n\nexport default function GamePiece({ piece, isSelected, hasBall, onClick }: GamePieceProps) {\n const baseStyle = piece.side === 'white' ? WHITE_PIECE_STYLE : BLACK_PIECE_STYLE\n const style: React.CSSProperties = piece.hasMovedThisTurn\n ? { ...baseStyle, ...MOVED_STYLE }\n : baseStyle\n\n return (\n <div\n onClick={onClick}\n style={style}\n className={cn(\n \"relative w-[88%] h-[88%] flex items-center justify-center rounded-full cursor-pointer z-10 transition-transform\",\n isSelected && \"ring-4 ring-primary scale-110 z-30\",\n piece.hasMovedThisTurn && \"opacity-70\"\n )}\n >\n <PieceIcon type={piece.type} />\n\n {hasBall && (\n <div className=\"absolute inset-0 rounded-full ring-2 ring-orange-400 pointer-events-none\" />\n )}\n\n {isSelected && (\n <div className=\"absolute inset-0 rounded-full animate-pulse ring-2 ring-yellow-400 ring-offset-2 ring-offset-transparent\" />\n )}\n </div>\n )\n}\n","import { useId } from 'react'\nimport { cn } from '../../lib/utils'\n\ninterface FootballProps {\n className?: string\n}\n\nexport const Football = ({ className }: FootballProps) => {\n const bodyId = useId()\n const hiId = `${bodyId}-h`\n\n return (\n <svg\n viewBox=\"0 0 100 100\"\n className={cn('w-full h-full drop-shadow-md', className)}\n xmlns=\"http://www.w3.org/2000/svg\"\n aria-hidden=\"true\"\n >\n <defs>\n <radialGradient id={bodyId} cx=\"36%\" cy=\"32%\" r=\"68%\">\n <stop offset=\"0%\" stopColor=\"#f0f9ff\" />\n <stop offset=\"55%\" stopColor=\"#bae6fd\" />\n <stop offset=\"100%\" stopColor=\"#38bdf8\" />\n </radialGradient>\n <radialGradient id={hiId} cx=\"32%\" cy=\"28%\" r=\"22%\">\n <stop offset=\"0%\" stopColor=\"#ffffff\" stopOpacity=\"0.85\" />\n <stop offset=\"100%\" stopColor=\"#ffffff\" stopOpacity=\"0\" />\n </radialGradient>\n </defs>\n\n <circle cx=\"50\" cy=\"50\" r=\"47\" fill={`url(#${bodyId})`} stroke=\"#18181b\" strokeWidth=\"1.5\" />\n\n <g stroke=\"#18181b\" strokeWidth=\"1.4\" strokeLinecap=\"round\" fill=\"none\">\n <line x1=\"50\" y1=\"41\" x2=\"50\" y2=\"30\" />\n <line x1=\"41.44\" y1=\"47.22\" x2=\"30.97\" y2=\"43.82\" />\n <line x1=\"44.71\" y1=\"57.28\" x2=\"38.24\" y2=\"66.18\" />\n <line x1=\"55.29\" y1=\"57.28\" x2=\"61.76\" y2=\"66.18\" />\n <line x1=\"58.56\" y1=\"47.22\" x2=\"69.03\" y2=\"43.82\" />\n\n <line x1=\"50\" y1=\"15.5\" x2=\"50\" y2=\"4.5\" />\n <line x1=\"17.18\" y1=\"39.34\" x2=\"6.71\" y2=\"35.94\" />\n <line x1=\"29.72\" y1=\"77.91\" x2=\"23.25\" y2=\"86.81\" />\n <line x1=\"70.28\" y1=\"77.91\" x2=\"76.75\" y2=\"86.81\" />\n <line x1=\"82.82\" y1=\"39.34\" x2=\"93.29\" y2=\"35.94\" />\n </g>\n\n <g fill=\"#18181b\" stroke=\"#18181b\" strokeWidth=\"0.6\" strokeLinejoin=\"round\">\n <polygon points=\"50,41 41.44,47.22 44.71,57.28 55.29,57.28 58.56,47.22\" />\n <polygon points=\"50,30 57.61,24.47 54.70,15.53 45.30,15.53 42.39,24.47\" />\n <polygon points=\"30.97,43.82 28.06,34.88 18.66,34.88 15.75,43.82 23.36,49.35\" />\n <polygon points=\"38.24,66.18 29.84,66.18 25.93,75.12 33.54,80.65 41.15,75.12\" />\n <polygon points=\"61.76,66.18 58.85,75.12 66.46,80.65 74.07,75.12 71.16,66.18\" />\n <polygon points=\"69.03,43.82 76.64,49.35 84.25,43.82 81.34,34.88 71.94,34.88\" />\n </g>\n\n <circle cx=\"50\" cy=\"50\" r=\"47\" fill={`url(#${hiId})`} pointerEvents=\"none\" />\n </svg>\n )\n}\n","import { useGameStore } from '../../store/use-game-store'\nimport { getValidMoves, getValidPasses } from '@scriptonita/chess-football-engine'\nimport { cn } from '../../lib/utils'\nimport { motion, AnimatePresence } from 'framer-motion'\nimport GamePiece from './game-piece'\nimport { useEffect, useMemo, useRef, useState } from 'react'\nimport { Side, Position } from '@scriptonita/chess-football-engine'\nimport { Football } from './football'\nimport { FILE_LABELS, RANK_LABELS } from '@scriptonita/chess-football-engine'\n\ninterface GameBoardProps {\n userSide: Side | null\n /** When true, render A-I / 1-12 coordinate guides around the board (tablet+ only). */\n showCoordinates?: boolean\n /** When true, the board is keyboard-operable (arrows move a cursor, Enter acts). */\n keyboardNav?: boolean\n}\n\n// Board dimensions\nconst COLS = 9\nconst ROWS = 12\n\nconst clamp = (v: number, lo: number, hi: number) => Math.max(lo, Math.min(hi, v))\n\nexport default function GameBoard({ userSide, showCoordinates = false, keyboardNav = false }: GameBoardProps) {\n const {\n boardState,\n selectedPieceId,\n setSelectedPieceId,\n interactionMode,\n setInteractionMode,\n movePiece,\n passBall\n } = useGameStore()\n\n // Keyboard cursor (only used when keyboardNav). Null until the board is focused.\n const [cursor, setCursor] = useState<Position | null>(null)\n\n const prevBallRef = useRef(boardState?.ball)\n const prevBall = prevBallRef.current\n useEffect(() => {\n prevBallRef.current = boardState?.ball\n })\n\n // Hooks must run unconditionally and in a stable order, so these memos are\n // computed (null-safe) BEFORE any early return. They recompute the selected\n // piece internally to avoid a hook running after a conditional return.\n const validMoves = useMemo(() => {\n if (!boardState) return []\n const sp = boardState.pieces.find(p => p.id === selectedPieceId)\n if (sp && interactionMode === 'move' && !sp.hasMovedThisTurn) {\n return getValidMoves(sp, boardState)\n }\n return []\n }, [boardState, selectedPieceId, interactionMode])\n\n const validPasses = useMemo(() => {\n if (!boardState) return []\n const sp = boardState.pieces.find(p => p.id === selectedPieceId)\n if (sp && interactionMode === 'pass') {\n return getValidPasses(sp, boardState)\n }\n return []\n }, [boardState, selectedPieceId, interactionMode])\n\n if (!boardState) return null\n\n // Detect ball pickup-during-move so we can synchronize the ball pulse with the\n // carrier piece. Both the carrier and the ball use the same linear tween below.\n const lastMove = boardState.lastMove\n const ball = boardState.ball\n const ballMoved =\n !!prevBall &&\n (prevBall.pos.x !== ball.pos.x || prevBall.pos.y !== ball.pos.y)\n const isPickupOnMove =\n !!prevBall &&\n !prevBall.holderId &&\n !!ball.holderId &&\n lastMove?.type === 'move' &&\n lastMove?.playerId === ball.holderId &&\n ballMoved\n\n const PICKUP_DURATION = 0.5\n const pickupCarrierId = isPickupOnMove ? ball.holderId : null\n let pickupProportion = 0.5\n if (isPickupOnMove && prevBall && lastMove?.from) {\n const totalSteps = Math.max(\n Math.abs(lastMove.to.x - lastMove.from.x),\n Math.abs(lastMove.to.y - lastMove.from.y),\n )\n const stepsToBall = Math.max(\n Math.abs(prevBall.pos.x - lastMove.from.x),\n Math.abs(prevBall.pos.y - lastMove.from.y),\n )\n pickupProportion = totalSteps > 0\n ? Math.min(0.85, Math.max(0.15, stepsToBall / totalSteps))\n : 0.5\n }\n\n const handleSquareClick = (x: number, y: number) => {\n if (interactionMode === 'move' && selectedPieceId) {\n if (validMoves.some(m => m.x === x && m.y === y)) {\n movePiece(selectedPieceId, { x, y })\n }\n } else if (interactionMode === 'pass' && selectedPieceId) {\n if (validPasses.some(p => p.x === x && p.y === y)) {\n passBall({ x, y })\n }\n }\n }\n\n const handlePieceClick = (pieceId: string, x: number, y: number, e: React.MouseEvent) => {\n e.stopPropagation()\n const pieceAt = boardState.pieces.find(p => p.id === pieceId)\n if (!pieceAt) return\n\n const isValidDest = validMoves.some(m => m.x === x && m.y === y) ||\n validPasses.some(p => p.x === x && p.y === y)\n\n // Rule: If it's a valid destination (Pass or Tackle), perform the action first\n if (isValidDest) {\n handleSquareClick(x, y)\n }\n // Otherwise, allow selection of your own pieces on your turn\n else if (boardState.turn === pieceAt.side && userSide === pieceAt.side) {\n if (selectedPieceId === pieceAt.id) {\n // Toggle mode if piece has ball\n if (boardState.ball.holderId === pieceAt.id) {\n setInteractionMode(interactionMode === 'move' ? 'pass' : 'move')\n }\n } else {\n // New selection: default to move\n setSelectedPieceId(pieceAt.id)\n setInteractionMode('move')\n }\n }\n }\n\n // ── Keyboard navigation (opt-in) ──────────────────────────────────────────\n // A focused board is operated with arrows (move cursor), Enter/Space (act on the\n // cursor square, mirroring a click), M/P (toggle move/pass) and Escape (deselect).\n const defaultCursor = (): Position => {\n const sel = boardState.pieces.find(p => p.id === selectedPieceId)\n return sel ? { ...sel.pos } : { ...boardState.ball.pos }\n }\n\n const activate = (x: number, y: number) => {\n const pieceAt = boardState.pieces.find(p => p.pos.x === x && p.pos.y === y)\n if (pieceAt) {\n handlePieceClick(pieceAt.id, x, y, { stopPropagation() {} } as React.MouseEvent)\n } else {\n handleSquareClick(x, y)\n }\n }\n\n const handleKeyDown = (e: React.KeyboardEvent) => {\n if (!keyboardNav) return\n const step = (dx: number, dy: number) => {\n e.preventDefault()\n setCursor(c => {\n const base = c ?? defaultCursor()\n return { x: clamp(base.x + dx, 0, COLS - 1), y: clamp(base.y + dy, 0, ROWS - 1) }\n })\n }\n switch (e.key) {\n case 'ArrowUp': step(0, 1); break // visually up = higher rank (y grows toward the top)\n case 'ArrowDown': step(0, -1); break\n case 'ArrowLeft': step(-1, 0); break\n case 'ArrowRight': step(1, 0); break\n case 'Enter':\n case ' ': {\n e.preventDefault()\n const c = cursor ?? defaultCursor()\n setCursor(c)\n activate(c.x, c.y)\n break\n }\n case 'm': case 'M': setInteractionMode('move'); break\n case 'p': case 'P': setInteractionMode('pass'); break\n case 'Escape': setSelectedPieceId(null); setInteractionMode(null); break\n }\n }\n\n // Render only the squares (no pieces inside them)\n const renderSquares = () => {\n const squares = []\n for (let y = ROWS - 1; y >= 0; y--) { // Render from top to bottom\n for (let x = 0; x < COLS; x++) {\n // Interior of both 5×2 penalty areas is painted in a distinct green\n const isGoalArea =\n (x >= 2 && x <= 6) && ((y >= 0 && y <= 1) || (y >= 10 && y <= 11))\n const isEven = (x + y) % 2 === 0\n const isValidDest = validMoves.some(m => m.x === x && m.y === y) ||\n validPasses.some(p => p.x === x && p.y === y)\n const pieceAt = boardState.pieces.find(p => p.pos.x === x && p.pos.y === y)\n const isCursor = keyboardNav && cursor?.x === x && cursor?.y === y\n\n squares.push(\n <div\n key={`${x}-${y}`}\n onClick={() => handleSquareClick(x, y)}\n className={cn(\n \"relative aspect-square w-full flex items-center justify-center cursor-pointer\",\n isEven ? \"bg-[#2d5a27]\" : \"bg-[#356a2d]\",\n isGoalArea && \"bg-[#1a3a18] ring-1 ring-inset ring-emerald-500/30\",\n isValidDest && (interactionMode === 'move'\n ? \"ring-2 ring-inset ring-yellow-400/50 bg-yellow-400/10\"\n : \"ring-2 ring-inset ring-sky-400/50 bg-sky-400/10\")\n )}\n >\n {/* Valid move indicator (only when no piece) */}\n {isValidDest && !pieceAt && (\n <div className={cn(\n \"w-3 h-3 rounded-full\",\n interactionMode === 'move' ? \"bg-yellow-400/40\" : \"bg-sky-400/40\"\n )} />\n )}\n {/* Keyboard cursor */}\n {isCursor && (\n <div className=\"absolute inset-0 ring-2 ring-inset ring-white pointer-events-none z-20\" aria-hidden=\"true\" />\n )}\n </div>\n )\n }\n }\n return squares\n }\n\n const board = (\n <div\n className={cn(\n \"w-full max-w-[500px] mx-auto overflow-hidden rounded-xl shadow-2xl border-4 border-[#1a3317] bg-[#1a3317]\",\n keyboardNav && \"focus:outline-none focus-visible:ring-2 focus-visible:ring-accent-green focus-visible:ring-offset-2 focus-visible:ring-offset-bg-primary\",\n )}\n {...(keyboardNav\n ? {\n tabIndex: 0,\n role: 'application',\n 'aria-label': 'Game board — arrow keys to move the cursor, Enter to act',\n onKeyDown: handleKeyDown,\n onFocus: () => setCursor(c => c ?? defaultCursor()),\n }\n : {})}\n >\n <div className=\"relative\" style={{ containerType: 'inline-size' }}>\n {/* Grid of squares */}\n <div className=\"grid grid-cols-9 gap-[1px]\">\n {renderSquares()}\n </div>\n\n {/* Football field lines overlay */}\n <svg\n viewBox=\"0 0 9 12\"\n preserveAspectRatio=\"none\"\n className=\"absolute inset-0 w-full h-full pointer-events-none\"\n aria-hidden=\"true\"\n >\n {/* Penalty areas (5×2) — these are the king's zones */}\n <rect x=\"2\" y=\"0\" width=\"5\" height=\"2\" fill=\"none\" stroke=\"white\" strokeOpacity=\"0.3\" strokeWidth=\"0.05\" />\n <rect x=\"2\" y=\"10\" width=\"5\" height=\"2\" fill=\"none\" stroke=\"white\" strokeOpacity=\"0.3\" strokeWidth=\"0.05\" />\n {/* Center line */}\n <line x1=\"0\" y1=\"6\" x2=\"9\" y2=\"6\" stroke=\"white\" strokeOpacity=\"0.35\" strokeWidth=\"0.05\" />\n {/* Center circle */}\n <circle cx=\"4.5\" cy=\"6\" r=\"1.5\" fill=\"none\" stroke=\"white\" strokeOpacity=\"0.3\" strokeWidth=\"0.05\" />\n {/* Center spot */}\n <circle cx=\"4.5\" cy=\"6\" r=\"0.12\" fill=\"white\" fillOpacity=\"0.5\" />\n {/* Penalty spots */}\n <circle cx=\"4.5\" cy=\"1.5\" r=\"0.1\" fill=\"white\" fillOpacity=\"0.5\" />\n <circle cx=\"4.5\" cy=\"10.5\" r=\"0.1\" fill=\"white\" fillOpacity=\"0.5\" />\n {/* Penalty arcs (D) */}\n <path d=\"M 3.086,2 A 1.5,1.5 0 0 0 5.914,2\" fill=\"none\" stroke=\"white\" strokeOpacity=\"0.3\" strokeWidth=\"0.05\" />\n <path d=\"M 3.086,10 A 1.5,1.5 0 0 1 5.914,10\" fill=\"none\" stroke=\"white\" strokeOpacity=\"0.3\" strokeWidth=\"0.05\" />\n </svg>\n\n {/* Pieces layer - rendered separately with absolute positioning */}\n <div className=\"absolute inset-0 pointer-events-none\">\n <AnimatePresence mode=\"sync\">\n {boardState.pieces.map(piece => {\n const isPickupCarrier = pickupCarrierId === piece.id\n const pieceTransition = isPickupCarrier\n ? { duration: PICKUP_DURATION, ease: 'linear' as const }\n : {\n type: 'spring' as const,\n stiffness: 200,\n damping: 25,\n mass: 1,\n }\n return (\n <motion.div\n key={piece.id}\n layout\n initial={false}\n animate={{\n left: `${(piece.pos.x / COLS) * 100}%`,\n top: `${((ROWS - 1 - piece.pos.y) / ROWS) * 100}%`,\n }}\n transition={pieceTransition}\n style={{\n position: 'absolute',\n width: `${100 / COLS}%`,\n height: `${100 / ROWS}%`,\n }}\n className=\"flex items-center justify-center pointer-events-auto\"\n >\n <GamePiece\n piece={piece}\n isSelected={selectedPieceId === piece.id}\n hasBall={boardState.ball.holderId === piece.id}\n onClick={(e: React.MouseEvent) => handlePieceClick(piece.id, piece.pos.x, piece.pos.y, e)}\n />\n </motion.div>\n )\n })}\n </AnimatePresence>\n\n {/* Ball - orchestrated to wait for the carrying piece on pickup-during-move */}\n {(() => {\n const targetX = (ball.pos.x / COLS) * 100\n const targetY = ((ROWS - 1 - ball.pos.y) / ROWS) * 100\n\n let animate: any\n let transition: any\n\n if (isPickupOnMove && prevBall) {\n const prevX = (prevBall.pos.x / COLS) * 100\n const prevY = ((ROWS - 1 - prevBall.pos.y) / ROWS) * 100\n const pulseStart = Math.max(0.05, pickupProportion - 0.06)\n\n animate = {\n left: [`${prevX}%`, `${prevX}%`, `${prevX}%`, `${targetX}%`],\n top: [`${prevY}%`, `${prevY}%`, `${prevY}%`, `${targetY}%`],\n scale: [1, 1, 1.35, 1],\n }\n transition = {\n duration: PICKUP_DURATION,\n times: [0, pulseStart, pickupProportion, 1],\n ease: 'linear',\n }\n } else {\n animate = {\n left: `${targetX}%`,\n top: `${targetY}%`,\n scale: 1,\n }\n transition = {\n type: 'spring',\n stiffness: 300,\n damping: 30,\n mass: 0.5,\n }\n }\n\n return (\n <motion.div\n key=\"ball\"\n initial={false}\n animate={animate}\n transition={transition}\n style={{\n position: 'absolute',\n width: `${100 / COLS}%`,\n height: `${100 / ROWS}%`,\n zIndex: 50,\n }}\n className=\"flex items-center justify-center pointer-events-none\"\n >\n <div className=\"w-[60%] h-[60%]\">\n <Football />\n </div>\n </motion.div>\n )\n })()}\n </div>\n </div>\n </div>\n )\n\n if (!showCoordinates) return board\n\n // Tablet+ : wrap the board with a coordinate guide (files on top/bottom, ranks on sides).\n // Files render in display order (A → I, left → right). Ranks display from top (12) to bottom (1)\n // because the board itself renders y = ROWS-1 → 0 from top to bottom.\n const ranksTopToBottom = [...RANK_LABELS].reverse()\n return (\n <div className=\"w-full max-w-[540px] mx-auto\" aria-hidden=\"false\">\n <div\n className=\"grid gap-1 select-none\"\n style={{\n gridTemplateColumns: '20px 1fr 20px',\n gridTemplateRows: '14px 1fr 14px',\n }}\n >\n <span aria-hidden=\"true\" />\n <FileRow files={FILE_LABELS} />\n <span aria-hidden=\"true\" />\n\n <RankColumn ranks={ranksTopToBottom} />\n <div>{board}</div>\n <RankColumn ranks={ranksTopToBottom} />\n\n <span aria-hidden=\"true\" />\n <FileRow files={FILE_LABELS} />\n <span aria-hidden=\"true\" />\n </div>\n </div>\n )\n}\n\nfunction FileRow({ files }: { files: readonly string[] }) {\n return (\n <div className=\"grid grid-cols-9 gap-[1px] px-[2px]\">\n {files.map(f => (\n <span\n key={f}\n aria-hidden=\"true\"\n className=\"flex items-center justify-center font-mono text-[9px] text-fg-muted/80 uppercase tracking-[0.5px]\"\n >\n {f}\n </span>\n ))}\n </div>\n )\n}\n\nfunction RankColumn({ ranks }: { ranks: readonly number[] }) {\n return (\n <div className=\"grid grid-rows-12 gap-[1px] py-[2px]\">\n {ranks.map(r => (\n <span\n key={r}\n aria-hidden=\"true\"\n className=\"flex items-center justify-center font-mono text-[9px] text-fg-muted/80 tabular-nums\"\n >\n {r}\n </span>\n ))}\n </div>\n )\n}\n","import type { ReactNode } from 'react'\nimport { cn } from '../../lib/utils'\n\ninterface AvatarProps { className?: string; children: ReactNode }\ninterface AvatarImageProps { src?: string; alt?: string; className?: string }\ninterface AvatarFallbackProps { className?: string; children: ReactNode }\n\nexport function Avatar({ className, children }: AvatarProps) {\n return <div className={cn('relative w-9 h-9 rounded-full overflow-hidden shrink-0', className)}>{children}</div>\n}\n\nexport function AvatarImage({ src, alt, className }: AvatarImageProps) {\n if (!src) return null\n return <img src={src} alt={alt ?? ''} className={cn('w-full h-full object-cover', className)} />\n}\n\nexport function AvatarFallback({ className, children }: AvatarFallbackProps) {\n return (\n <div className={cn('absolute inset-0 flex items-center justify-center text-xs font-semibold', className)}>\n {children}\n </div>\n )\n}\n","import { createContext, useContext, type ReactNode } from 'react'\n\n/**\n * A translator scoped to the `game` namespace: `t('turn')`, `t('whiteToMove')`, …\n * Each host app supplies one bound to its own i18n library:\n * - Next.js (next-intl): const t = useTranslations('game')\n * - Vite (react-i18next): (key) => t(`game.${key}`)\n */\nexport type GameTranslator = (key: string, values?: Record<string, unknown>) => string\n\nconst fallback: GameTranslator = (key) => key\n\nconst GameI18nContext = createContext<GameTranslator>(fallback)\n\nexport function GameI18nProvider({ t, children }: { t: GameTranslator; children: ReactNode }) {\n return <GameI18nContext.Provider value={t}>{children}</GameI18nContext.Provider>\n}\n\n/** Returns the `game`-scoped translator provided by the host app (identity fallback). */\nexport function useGameT(): GameTranslator {\n return useContext(GameI18nContext)\n}\n","import { Zap, Crown } from 'lucide-react'\nimport { cn } from '../lib/utils'\nimport { useGameT } from '../i18n'\n\ninterface ActionPointsProps {\n total: number\n remaining: number\n size?: number\n className?: string\n kingMustRelease?: boolean\n}\n\nexport function ActionPoints({ total, remaining, size = 20, className, kingMustRelease }: ActionPointsProps) {\n const t = useGameT()\n return (\n <div className={cn('flex items-center gap-1.5', className)} aria-label={t('actionPointsAriaLabel', { remaining, total })}>\n {Array.from({ length: total }).map((_, i) => {\n const isActive = i < remaining\n const showCrown = kingMustRelease && i === total - 1\n\n if (showCrown) {\n return (\n <Crown\n key={i}\n size={size}\n strokeWidth={2}\n className=\"text-yellow-400 fill-yellow-400 transition-colors duration-150\"\n aria-hidden=\"true\"\n />\n )\n }\n return (\n <Zap\n key={i}\n size={size}\n strokeWidth={2}\n className={cn(\n 'transition-colors duration-150',\n isActive ? 'text-accent-green fill-accent-green' : 'text-fg-muted fill-none',\n )}\n aria-hidden=\"true\"\n />\n )\n })}\n </div>\n )\n}\n","import { useGameStore } from '../../store/use-game-store'\nimport { cn } from '../../lib/utils'\nimport { Avatar, AvatarFallback, AvatarImage } from '../ui/avatar'\nimport { ActionPoints } from '../action-points'\nimport { useGameT } from '../../i18n'\n\ninterface ScoreboardProps {\n creatorUsername: string\n opponentUsername: string\n creatorAvatarUrl?: string\n opponentAvatarUrl?: string\n userSide?: 'white' | 'black' | null\n}\n\nfunction initials(name: string) {\n return (name?.split(' ').map(w => w[0]).join('').toUpperCase() || '?').slice(0, 2)\n}\n\nexport default function Scoreboard({\n creatorUsername,\n opponentUsername,\n creatorAvatarUrl,\n opponentAvatarUrl,\n userSide,\n}: ScoreboardProps) {\n const t = useGameT()\n const { boardState } = useGameStore()\n if (!boardState?.score) return null\n\n const { score, turn, actionPoints, kingMustRelease } = boardState\n\n // El creador siempre juega con blancas\n const myScore = userSide === 'white' ? score.white : score.black\n const rivalScore = userSide === 'white' ? score.black : score.white\n const myName = userSide === 'white' ? creatorUsername : opponentUsername\n const rivalName = userSide === 'white' ? opponentUsername : creatorUsername\n const myAvatar = userSide === 'white' ? creatorAvatarUrl : opponentAvatarUrl\n const rivalAvatar= userSide === 'white' ? opponentAvatarUrl : creatorAvatarUrl\n const myTeam = userSide === 'white' ? t('teamWhite') : t('teamBlack')\n const rivalTeam = userSide === 'white' ? t('teamBlack') : t('teamWhite')\n const isMyTurn = turn === userSide\n const myKingMustRelease = isMyTurn && kingMustRelease === turn\n const rivalKingMustRelease = !isMyTurn && kingMustRelease === turn\n\n return (\n <div className=\"w-full bg-bg-secondary flex items-center justify-between px-5 py-2.5\">\n {/* Jugador local */}\n <PlayerInfo\n name={myName}\n team={myTeam}\n avatarUrl={myAvatar}\n isActive={isMyTurn}\n actionPoints={isMyTurn ? actionPoints : 0}\n kingMustRelease={myKingMustRelease}\n align=\"left\"\n />\n\n {/* Marcador central */}\n <div className=\"flex items-center gap-3\">\n <span className=\"font-anton text-[32px] leading-none text-fg-primary tabular-nums\">\n {myScore}\n </span>\n <span className=\"font-anton text-2xl text-fg-muted\">—</span>\n <span className=\"font-anton text-[32px] leading-none text-fg-primary tabular-nums\">\n {rivalScore}\n </span>\n </div>\n\n {/* Rival */}\n <PlayerInfo\n name={rivalName}\n team={rivalTeam}\n avatarUrl={rivalAvatar}\n isActive={!isMyTurn}\n actionPoints={!isMyTurn ? actionPoints : 0}\n kingMustRelease={rivalKingMustRelease}\n align=\"right\"\n />\n </div>\n )\n}\n\ninterface PlayerInfoProps {\n name: string\n team: string\n avatarUrl?: string\n isActive: boolean\n actionPoints: number\n kingMustRelease: boolean\n align: 'left' | 'right'\n}\n\nfunction PlayerInfo({ name, team, avatarUrl, isActive, actionPoints, kingMustRelease, align }: PlayerInfoProps) {\n return (\n <div className={cn('flex items-center gap-2.5', align === 'right' && 'flex-row-reverse')}>\n <Avatar className={cn(\n 'w-9 h-9 border-2 transition-colors duration-300',\n isActive ? 'border-accent-green' : 'border-border-subtle'\n )}>\n <AvatarImage src={avatarUrl} alt={name} className=\"object-cover\" />\n <AvatarFallback className=\"bg-bg-surface-elevated text-fg-secondary text-xs font-semibold\">\n {initials(name)}\n </AvatarFallback>\n </Avatar>\n\n <div className={cn('flex flex-col gap-1', align === 'right' && 'items-end')}>\n <span className={cn(\n 'font-inter text-[13px] font-semibold leading-none transition-colors duration-300',\n isActive ? 'text-fg-primary' : 'text-fg-muted'\n )}>\n {name}\n </span>\n <div className={cn('flex items-center gap-1', align === 'right' && 'flex-row-reverse')}>\n <span className=\"font-mono text-[10px] text-fg-muted uppercase\">{team}</span>\n {isActive && (\n <span className=\"w-1.5 h-1.5 rounded-full bg-accent-green animate-pulse\" aria-hidden=\"true\" />\n )}\n </div>\n <ActionPoints\n total={5}\n remaining={actionPoints}\n size={12}\n kingMustRelease={kingMustRelease}\n className=\"gap-0.5\"\n />\n </div>\n </div>\n )\n}\n","import { useGameStore } from '../../store/use-game-store'\nimport { cn } from '../../lib/utils'\nimport { useGameT } from '../../i18n'\n\ninterface MiniScoreboardProps {\n creatorUsername: string\n opponentUsername: string\n userSide?: 'white' | 'black' | null\n className?: string\n}\n\n/**\n * Compact scoreboard shown above the board on tablet/desktop. Renders only the\n * grouped name + score per side — no avatars, since the side panels already show them.\n */\nexport function MiniScoreboard({\n creatorUsername,\n opponentUsername,\n userSide,\n className,\n}: MiniScoreboardProps) {\n const t = useGameT()\n const { boardState } = useGameStore()\n if (!boardState?.score) return null\n\n const { score, turn } = boardState\n\n const myScore = userSide === 'white' ? score.white : score.black\n const rivalScore = userSide === 'white' ? score.black : score.white\n const myName = userSide === 'white' ? creatorUsername : opponentUsername\n const rivalName = userSide === 'white' ? opponentUsername : creatorUsername\n const myTeam = userSide === 'white' ? t('teamWhite') : t('teamBlack')\n const rivalTeam = userSide === 'white' ? t('teamBlack') : t('teamWhite')\n const isMyTurn = turn === userSide\n\n return (\n <div\n className={cn(\n 'w-full max-w-[540px] rounded-xl bg-bg-surface border border-border-subtle',\n 'flex items-center justify-between gap-4 px-5 py-3',\n className,\n )}\n >\n <SideCell name={myName} team={myTeam} score={myScore} isActive={isMyTurn} align=\"left\" />\n\n <span className=\"font-anton text-base text-fg-muted uppercase tracking-[2px]\" aria-hidden=\"true\">\n vs\n </span>\n\n <SideCell name={rivalName} team={rivalTeam} score={rivalScore} isActive={!isMyTurn} align=\"right\" />\n </div>\n )\n}\n\ninterface SideCellProps {\n name: string\n team: string\n score: number\n isActive: boolean\n align: 'left' | 'right'\n}\n\nfunction SideCell({ name, team, score, isActive, align }: SideCellProps) {\n return (\n <div className={cn('flex flex-col min-w-0', align === 'right' ? 'items-end' : 'items-start')}>\n <span className={cn(\n 'font-mono text-[10px] uppercase tracking-[0.5px] truncate max-w-[160px]',\n isActive ? 'text-fg-secondary' : 'text-fg-muted',\n )}>\n {name} · {team}\n </span>\n <span className={cn(\n 'font-anton text-[32px] leading-none tabular-nums',\n isActive ? 'text-fg-primary' : 'text-fg-secondary',\n )}>\n {score}\n </span>\n </div>\n )\n}\n","import * as React from 'react'\nimport { cn } from '../../lib/utils'\n\ntype Variant = 'primary' | 'secondary' | 'ghost' | 'destructive'\ntype Size = 'default' | 'sm' | 'lg' | 'icon'\n\nconst VARIANT: Record<Variant, string> = {\n primary:\n 'bg-accent-green text-fg-primary font-anton tracking-widest rounded-md ' +\n 'hover:bg-accent-green-light active:bg-accent-green-dark',\n secondary:\n 'bg-bg-surface text-fg-primary font-inter font-semibold rounded-md ' +\n 'border border-border-subtle hover:bg-bg-surface-elevated active:bg-bg-secondary',\n ghost:\n 'bg-transparent text-fg-secondary font-inter font-medium rounded-md ' +\n 'hover:text-fg-primary active:text-fg-muted',\n destructive:\n 'bg-danger/10 text-danger font-inter font-semibold rounded-md ' +\n 'border border-danger hover:bg-danger/20 active:bg-danger/30',\n}\n\nconst SIZE: Record<Size, string> = {\n default: 'h-12 min-h-[44px] px-6 text-base',\n sm: 'h-9 min-h-[36px] px-4 text-sm',\n lg: 'h-13 min-h-[52px] px-8 text-lg',\n icon: 'h-11 w-11 min-h-[44px]',\n}\n\nexport interface ButtonProps extends React.ButtonHTMLAttributes<HTMLButtonElement> {\n variant?: Variant\n size?: Size\n}\n\nexport const Button = React.forwardRef<HTMLButtonElement, ButtonProps>(\n ({ className, variant = 'primary', size = 'default', ...props }, ref) => (\n <button\n ref={ref}\n className={cn(\n 'inline-flex items-center justify-center gap-2 whitespace-nowrap transition-all duration-150',\n 'focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-accent-green focus-visible:ring-offset-2 focus-visible:ring-offset-bg-primary',\n 'disabled:pointer-events-none disabled:opacity-40',\n '[&_svg]:pointer-events-none [&_svg]:shrink-0',\n VARIANT[variant],\n SIZE[size],\n className,\n )}\n {...props}\n />\n ),\n)\nButton.displayName = 'Button'\n","import { cn } from '../../lib/utils'\nimport { Button } from './button'\n\ninterface ConfirmDialogProps {\n open: boolean\n title: string\n description?: string\n confirmLabel: string\n cancelLabel: string\n onConfirm: () => void\n onCancel: () => void\n}\n\nexport function ConfirmDialog({ open, title, description, confirmLabel, cancelLabel, onConfirm, onCancel }: ConfirmDialogProps) {\n if (!open) return null\n return (\n <div\n className=\"fixed inset-0 z-50 flex items-center justify-center bg-black/60 backdrop-blur-sm\"\n role=\"dialog\"\n aria-modal=\"true\"\n >\n <div\n className={cn(\n 'bg-bg-surface border border-border-subtle rounded-xl p-6 mx-4 max-w-sm w-full',\n 'flex flex-col gap-4 shadow-2xl',\n )}\n >\n <h2 className=\"font-anton text-lg text-fg-primary uppercase tracking-wide\">{title}</h2>\n {description && <p className=\"font-inter text-sm text-fg-secondary\">{description}</p>}\n <div className=\"flex gap-2 pt-1\">\n <Button variant=\"secondary\" className=\"flex-1\" onClick={onCancel}>{cancelLabel}</Button>\n <Button variant=\"primary\" className=\"flex-1\" onClick={onConfirm}>{confirmLabel}</Button>\n </div>\n </div>\n </div>\n )\n}\n","import { useState } from 'react'\nimport { useGameStore } from '../../store/use-game-store'\nimport { Button } from '../ui/button'\nimport { ConfirmDialog } from '../ui/confirm-dialog'\nimport { Move, Flag } from 'lucide-react'\nimport { Football } from './football'\nimport { cn } from '../../lib/utils'\nimport { motion, AnimatePresence } from 'framer-motion'\nimport { useGameT } from '../../i18n'\n\ninterface GameControlsProps {\n isMyTurn: boolean\n}\n\nexport default function GameControls({ isMyTurn }: GameControlsProps) {\n const {\n boardState,\n selectedPieceId,\n interactionMode,\n setInteractionMode,\n endTurn,\n } = useGameStore()\n\n const t = useGameT()\n const [showEndTurnConfirm, setShowEndTurnConfirm] = useState(false)\n\n if (!boardState) return null\n\n const actionPoints = boardState.actionPoints\n const selectedPiece = boardState.pieces.find(p => p.id === selectedPieceId)\n const hasBall = selectedPiece && boardState.ball.holderId === selectedPiece.id\n const canPass = hasBall && actionPoints > 0\n const canMove = actionPoints > 0 && !selectedPiece?.hasMovedThisTurn\n\n return (\n <div className=\"w-full bg-bg-secondary flex flex-col gap-3 px-5 pt-3 pb-5\">\n {/* Botones de acción (visibles siempre en mi turno, deshabilitados cuando no se puede) */}\n <AnimatePresence>\n {isMyTurn && (\n <motion.div\n key=\"action-btns\"\n initial={{ opacity: 0, y: 8 }}\n animate={{ opacity: 1, y: 0 }}\n exit={{ opacity: 0, y: 8 }}\n className=\"flex gap-2\"\n >\n {/* Desplazar */}\n <button\n onClick={() => setInteractionMode('move')}\n disabled={!canMove}\n className={cn(\n 'flex-1 flex items-center justify-center gap-2 h-11 rounded-md border font-inter text-sm font-semibold',\n 'transition-colors duration-150 focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-move-highlight',\n 'disabled:opacity-40 disabled:cursor-not-allowed',\n interactionMode === 'move'\n ? 'bg-move-highlight/10 border-move-highlight text-move-highlight'\n : 'bg-bg-surface border-border-subtle text-move-highlight hover:bg-move-highlight/5',\n )}\n aria-pressed={interactionMode === 'move'}\n >\n <Move size={16} strokeWidth={2} />\n {t('move')}\n </button>\n\n {/* Pasar */}\n <button\n onClick={() => setInteractionMode('pass')}\n disabled={!canPass}\n className={cn(\n 'flex-1 flex items-center justify-center gap-2 h-11 rounded-md border font-inter text-sm font-semibold',\n 'transition-colors duration-150 focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-pass-highlight',\n 'disabled:opacity-40 disabled:cursor-not-allowed',\n interactionMode === 'pass'\n ? 'bg-pass-highlight/10 border-pass-highlight text-pass-highlight'\n : 'bg-bg-surface border-border-subtle text-pass-highlight hover:bg-pass-highlight/5',\n )}\n aria-pressed={interactionMode === 'pass'}\n >\n <span className=\"w-4 h-4 inline-flex\">\n <Football />\n </span>\n {t('pass')}\n </button>\n </motion.div>\n )}\n </AnimatePresence>\n\n {/* Finalizar turno */}\n {isMyTurn && (\n <Button\n variant=\"primary\"\n size=\"default\"\n className=\"w-full gap-2 tracking-[1.5px]\"\n onClick={() => setShowEndTurnConfirm(true)}\n >\n <Flag size={16} strokeWidth={2} />\n {t('endTurn')}\n </Button>\n )}\n\n {/* Turno del rival */}\n {!isMyTurn && (\n <div className=\"flex items-center justify-center h-11 rounded-md bg-bg-surface border border-border-subtle\">\n <span className=\"font-inter text-sm text-fg-muted\">{t('waitingRival')}</span>\n </div>\n )}\n\n <ConfirmDialog\n open={showEndTurnConfirm}\n title={t('endTurnConfirm')}\n description={t('endTurnConfirmDescription', { count: actionPoints })}\n confirmLabel={t('endTurnConfirmYes')}\n cancelLabel={t('endTurnKeepPlaying')}\n onConfirm={() => { endTurn(); setShowEndTurnConfirm(false) }}\n onCancel={() => setShowEndTurnConfirm(false)}\n />\n </div>\n )\n}\n","import {\n ChessKing,\n ChessQueen,\n ChessRook,\n ChessBishop,\n ChessKnight,\n ShieldQuestion,\n type LucideIcon,\n} from 'lucide-react'\nimport { useGameStore } from '../../store/use-game-store'\nimport { Football } from './football'\nimport { cn } from '../../lib/utils'\nimport { LONG_KEY, squareName } from '@scriptonita/chess-football-engine'\nimport type { Piece, PieceType } from '@scriptonita/chess-football-engine'\nimport { useGameT } from '../../i18n'\n\nconst PIECE_ICON: Record<PieceType, LucideIcon> = {\n king: ChessKing,\n queen: ChessQueen,\n rook: ChessRook,\n bishop: ChessBishop,\n knight: ChessKnight,\n}\n\ninterface SelectedPieceDetailProps {\n isMyTurn: boolean\n className?: string\n}\n\n/**\n * Compact card that surfaces the selected piece's identity, position and current state.\n * Renders below the board on tablet/desktop to put the empty space to use.\n */\nexport function SelectedPieceDetail({ isMyTurn, className }: SelectedPieceDetailProps) {\n const t = useGameT()\n const { boardState, selectedPieceId } = useGameStore()\n\n if (!boardState) return null\n\n const piece: Piece | undefined = boardState.pieces.find(p => p.id === selectedPieceId)\n\n if (!piece) {\n return (\n <div\n className={cn(\n 'rounded-xl bg-bg-surface/40 border border-dashed border-border-subtle',\n 'px-4 py-3 flex items-center gap-3',\n className,\n )}\n >\n <ShieldQuestion size={20} className=\"text-fg-muted shrink-0\" aria-hidden=\"true\" />\n <span className=\"font-mono text-[11px] text-fg-muted\">\n {t('selectedPiece.empty')}\n </span>\n </div>\n )\n }\n\n const Icon = PIECE_ICON[piece.type] ?? ShieldQuestion\n const longName = t(`pieces.${LONG_KEY[piece.type]}`)\n const square = squareName(piece.pos)\n const hasBall = boardState.ball.holderId === piece.id\n const movedThisTurn = piece.hasMovedThisTurn && isMyTurn\n\n return (\n <div\n className={cn(\n 'rounded-xl bg-bg-surface border border-border-subtle',\n 'px-4 py-3 flex items-center gap-4',\n className,\n )}\n role=\"status\"\n aria-live=\"polite\"\n aria-label={`${longName} ${square}`}\n >\n <div\n className={cn(\n 'w-12 h-12 shrink-0 rounded-full flex items-center justify-center',\n piece.side === 'white' ? 'bg-white text-black' : 'bg-fg-primary/90 text-bg-primary',\n )}\n >\n <Icon size={26} strokeWidth={1.75} aria-hidden=\"true\" />\n </div>\n\n <div className=\"flex flex-col min-w-0 flex-1\">\n <span className=\"font-anton text-base text-fg-primary leading-none uppercase tracking-[0.5px]\">\n {longName}\n </span>\n <span className=\"font-mono text-[11px] text-fg-muted mt-1\">\n {t('selectedPiece.atSquare', { square })}\n </span>\n </div>\n\n <div className=\"flex flex-col items-end gap-1 shrink-0\">\n {hasBall && (\n <span className=\"flex items-center gap-1.5 font-mono text-[10px] text-pass-highlight uppercase tracking-[0.5px]\">\n <span className=\"w-3 h-3 inline-flex\">\n <Football />\n </span>\n {t('selectedPiece.hasBall')}\n </span>\n )}\n {movedThisTurn && (\n <span className=\"font-mono text-[10px] text-fg-muted uppercase tracking-[0.5px]\">\n {t('selectedPiece.alreadyMoved')}\n </span>\n )}\n </div>\n </div>\n )\n}\n","import { useEffect, useRef } from 'react'\nimport { useGameStore } from '../../store/use-game-store'\nimport { cn } from '../../lib/utils'\nimport { squareName, SHORT_KEY } from '@scriptonita/chess-football-engine'\nimport type { MoveHistoryEntry } from '@scriptonita/chess-football-engine'\nimport { useGameT } from '../../i18n'\n\ninterface MoveHistoryProps {\n /** When false, renders without the inner scroll wrapper (handy in tablet panels). */\n scrollable?: boolean\n /** Cap the number of entries displayed; useful in compact tablet panels. */\n limit?: number\n className?: string\n}\n\n/**\n * Move history list — chess-style notation grouped by turn.\n * Reads `boardState.moveHistory` and auto-scrolls to the latest entry.\n */\nexport function MoveHistory({ scrollable = true, limit, className }: MoveHistoryProps) {\n const t = useGameT()\n const { boardState } = useGameStore()\n const scrollRef = useRef<HTMLOListElement>(null)\n\n const history: MoveHistoryEntry[] = boardState?.moveHistory ?? []\n const visible = limit ? history.slice(-limit) : history\n // Latest at top of the list — easier to scan in narrow panels\n const ordered = [...visible].reverse()\n\n useEffect(() => {\n if (!scrollable) return\n if (scrollRef.current) scrollRef.current.scrollTop = 0\n }, [history.length, scrollable])\n\n if (ordered.length === 0) {\n return (\n <p\n className={cn(\n 'font-mono text-[11px] text-fg-muted text-center py-3 px-3',\n 'bg-bg-surface/40 rounded-md',\n className,\n )}\n >\n {t('history.empty')}\n </p>\n )\n }\n\n return (\n <ol\n ref={scrollRef}\n aria-label={t('history.title')}\n className={cn(\n 'flex flex-col gap-1',\n scrollable && 'h-full overflow-y-auto pr-1',\n className,\n )}\n >\n {ordered.map((entry, i) => {\n const isLatest = i === 0\n const prev = ordered[i - 1]\n const showTurnDivider = !prev || prev.turnNumber !== entry.turnNumber\n return (\n <li key={`${entry.at}-${i}`} className=\"flex flex-col gap-1\">\n {showTurnDivider && (\n <div\n className=\"flex items-center gap-2 pt-1\"\n aria-hidden={prev ? 'true' : undefined}\n >\n <span className=\"font-mono text-[9px] tracking-[1px] text-fg-muted uppercase\">\n {t('history.turn', { n: entry.turnNumber })}\n </span>\n <span className=\"flex-1 h-px bg-border-subtle/60\" />\n </div>\n )}\n <HistoryRow entry={entry} isLatest={isLatest} />\n </li>\n )\n })}\n </ol>\n )\n}\n\ninterface HistoryRowProps {\n entry: MoveHistoryEntry\n isLatest: boolean\n}\n\nfunction HistoryRow({ entry, isLatest }: HistoryRowProps) {\n const t = useGameT()\n const fromSq = entry.from ? squareName(entry.from) : '—'\n const toSq = squareName(entry.to)\n const pieceShort = t(`pieces.${SHORT_KEY[entry.pieceType]}`)\n\n let label: string\n switch (entry.type) {\n case 'pass':\n label = t('history.pass', { to: toSq })\n break\n case 'tackle':\n label = t('history.tackle', { to: toSq })\n break\n case 'interception':\n label = t('history.interception', { to: toSq })\n break\n case 'goal':\n label = t('history.goal', { from: fromSq, to: toSq })\n break\n case 'offside':\n label = t('history.offside', { from: fromSq })\n break\n case 'move':\n default:\n label = t('history.move', { piece: pieceShort, from: fromSq, to: toSq })\n }\n\n const dotColor =\n entry.type === 'goal' ? 'bg-accent-green' :\n entry.type === 'pass' ? 'bg-pass-highlight' :\n entry.type === 'interception' ? 'bg-danger' :\n entry.type === 'tackle' ? 'bg-danger/80' :\n entry.type === 'offside' ? 'bg-warning' :\n 'bg-move-highlight'\n\n return (\n <div\n className={cn(\n 'flex items-center gap-2.5 min-h-[32px] px-3 py-1.5 rounded-md',\n 'font-mono text-[11px] leading-tight',\n isLatest\n ? 'bg-bg-surface-elevated text-fg-primary'\n : 'bg-bg-surface/60 text-fg-secondary',\n entry.pieceSide === 'black' && 'border-l-2 border-l-fg-primary/30',\n entry.pieceSide === 'white' && 'border-l-2 border-l-fg-primary/80',\n )}\n >\n <span\n aria-hidden=\"true\"\n className={cn('w-1.5 h-1.5 rounded-full shrink-0', dotColor)}\n />\n <span className=\"truncate flex-1\">{label}</span>\n {entry.type === 'goal' && (\n <span className=\"font-anton text-[10px] tracking-[1px] uppercase text-accent-green\">\n GOL\n </span>\n )}\n </div>\n )\n}\n","import { useMemo } from 'react'\nimport { getInitialBoardState } from '../../store/use-game-store'\nimport { cn } from '../../lib/utils'\nimport { Football } from './football'\nimport GamePiece from './game-piece'\n\nconst COLS = 9\nconst ROWS = 12\n\nexport function StaticGameBoard() {\n const boardState = useMemo(() => getInitialBoardState('white'), [])\n\n const renderSquares = () => {\n const squares = []\n for (let y = ROWS - 1; y >= 0; y--) {\n for (let x = 0; x < COLS; x++) {\n const isGoalArea =\n (x >= 2 && x <= 6) && ((y >= 0 && y <= 1) || (y >= 10 && y <= 11))\n const isEven = (x + y) % 2 === 0\n squares.push(\n <div\n key={`${x}-${y}`}\n className={cn(\n \"relative aspect-square w-full\",\n isEven ? \"bg-[#2d5a27]\" : \"bg-[#356a2d]\",\n isGoalArea && \"bg-[#1a3a18] ring-1 ring-inset ring-emerald-500/30\",\n )}\n />\n )\n }\n }\n return squares\n }\n\n return (\n <div className=\"relative w-full overflow-hidden rounded-xl shadow-2xl border-4 border-[#1a3317] bg-[#1a3317]\">\n <div className=\"relative\" style={{ containerType: 'inline-size' }}>\n <div className=\"grid grid-cols-9 gap-[1px]\">\n {renderSquares()}\n </div>\n\n <svg\n viewBox=\"0 0 9 12\"\n preserveAspectRatio=\"none\"\n className=\"absolute inset-0 w-full h-full pointer-events-none\"\n aria-hidden=\"true\"\n >\n <rect x=\"2\" y=\"0\" width=\"5\" height=\"2\" fill=\"none\" stroke=\"white\" strokeOpacity=\"0.3\" strokeWidth=\"0.05\" />\n <rect x=\"2\" y=\"10\" width=\"5\" height=\"2\" fill=\"none\" stroke=\"white\" strokeOpacity=\"0.3\" strokeWidth=\"0.05\" />\n <line x1=\"0\" y1=\"6\" x2=\"9\" y2=\"6\" stroke=\"white\" strokeOpacity=\"0.35\" strokeWidth=\"0.05\" />\n <circle cx=\"4.5\" cy=\"6\" r=\"1.5\" fill=\"none\" stroke=\"white\" strokeOpacity=\"0.3\" strokeWidth=\"0.05\" />\n <circle cx=\"4.5\" cy=\"6\" r=\"0.12\" fill=\"white\" fillOpacity=\"0.5\" />\n <circle cx=\"4.5\" cy=\"1.5\" r=\"0.1\" fill=\"white\" fillOpacity=\"0.5\" />\n <circle cx=\"4.5\" cy=\"10.5\" r=\"0.1\" fill=\"white\" fillOpacity=\"0.5\" />\n <path d=\"M 3.086,2 A 1.5,1.5 0 0 0 5.914,2\" fill=\"none\" stroke=\"white\" strokeOpacity=\"0.3\" strokeWidth=\"0.05\" />\n <path d=\"M 3.086,10 A 1.5,1.5 0 0 1 5.914,10\" fill=\"none\" stroke=\"white\" strokeOpacity=\"0.3\" strokeWidth=\"0.05\" />\n </svg>\n\n <div className=\"absolute inset-0 pointer-events-none\">\n {boardState.pieces.map(piece => (\n <div\n key={piece.id}\n style={{\n position: 'absolute',\n left: `${(piece.pos.x / COLS) * 100}%`,\n top: `${((ROWS - 1 - piece.pos.y) / ROWS) * 100}%`,\n width: `${100 / COLS}%`,\n height: `${100 / ROWS}%`,\n }}\n className=\"flex items-center justify-center\"\n >\n <GamePiece\n piece={piece}\n isSelected={false}\n hasBall={boardState.ball.holderId === piece.id}\n onClick={() => { }}\n />\n </div>\n ))}\n </div>\n </div>\n\n {/* Ball rendered OUTSIDE the containerType wrapper to escape its stacking context */}\n <div\n style={{\n position: 'absolute',\n left: `${(boardState.ball.pos.x / COLS) * 100}%`,\n top: `${((ROWS - 1 - boardState.ball.pos.y) / ROWS) * 100}%`,\n width: `${100 / COLS}%`,\n height: `${100 / ROWS}%`,\n zIndex: 50,\n }}\n className=\"flex items-center justify-center pointer-events-none\"\n >\n <div className=\"w-[60%] h-[60%]\">\n <Football />\n </div>\n </div>\n </div>\n )\n}\n"]}
package/dist/store.cjs ADDED
@@ -0,0 +1,16 @@
1
+ 'use strict';
2
+
3
+ var chunkJ2TBQPPC_cjs = require('./chunk-J2TBQPPC.cjs');
4
+
5
+
6
+
7
+ Object.defineProperty(exports, "getInitialBoardState", {
8
+ enumerable: true,
9
+ get: function () { return chunkJ2TBQPPC_cjs.getInitialBoardState; }
10
+ });
11
+ Object.defineProperty(exports, "useGameStore", {
12
+ enumerable: true,
13
+ get: function () { return chunkJ2TBQPPC_cjs.useGameStore; }
14
+ });
15
+ //# sourceMappingURL=store.cjs.map
16
+ //# sourceMappingURL=store.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":[],"names":[],"mappings":"","file":"store.cjs"}
@@ -0,0 +1,22 @@
1
+ import * as zustand from 'zustand';
2
+ import { Side, BoardState, Position } from '@scriptonita/chess-football-engine';
3
+
4
+ interface GameStore {
5
+ boardState: BoardState | null;
6
+ selectedPieceId: string | null;
7
+ interactionMode: 'move' | 'pass' | null;
8
+ setBoardState: (state: BoardState) => void;
9
+ setSelectedPieceId: (id: string | null) => void;
10
+ setInteractionMode: (mode: 'move' | 'pass' | null) => void;
11
+ resetTurn: () => void;
12
+ movePiece: (pieceId: string, to: Position) => void;
13
+ passBall: (to: Position) => void;
14
+ endTurn: () => void;
15
+ }
16
+ declare const getInitialBoardState: (servingSide: Side, currentScore?: {
17
+ white: number;
18
+ black: number;
19
+ }, maxActionPoints?: number) => BoardState;
20
+ declare const useGameStore: zustand.UseBoundStore<zustand.StoreApi<GameStore>>;
21
+
22
+ export { getInitialBoardState, useGameStore };
@@ -0,0 +1,22 @@
1
+ import * as zustand from 'zustand';
2
+ import { Side, BoardState, Position } from '@scriptonita/chess-football-engine';
3
+
4
+ interface GameStore {
5
+ boardState: BoardState | null;
6
+ selectedPieceId: string | null;
7
+ interactionMode: 'move' | 'pass' | null;
8
+ setBoardState: (state: BoardState) => void;
9
+ setSelectedPieceId: (id: string | null) => void;
10
+ setInteractionMode: (mode: 'move' | 'pass' | null) => void;
11
+ resetTurn: () => void;
12
+ movePiece: (pieceId: string, to: Position) => void;
13
+ passBall: (to: Position) => void;
14
+ endTurn: () => void;
15
+ }
16
+ declare const getInitialBoardState: (servingSide: Side, currentScore?: {
17
+ white: number;
18
+ black: number;
19
+ }, maxActionPoints?: number) => BoardState;
20
+ declare const useGameStore: zustand.UseBoundStore<zustand.StoreApi<GameStore>>;
21
+
22
+ export { getInitialBoardState, useGameStore };
package/dist/store.js ADDED
@@ -0,0 +1,3 @@
1
+ export { getInitialBoardState, useGameStore } from './chunk-YLNDQ4HG.js';
2
+ //# sourceMappingURL=store.js.map
3
+ //# sourceMappingURL=store.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":[],"names":[],"mappings":"","file":"store.js"}
package/package.json ADDED
@@ -0,0 +1,59 @@
1
+ {
2
+ "name": "@scriptonita/chess-football-ui",
3
+ "version": "0.1.1",
4
+ "description": "Shared, framework-agnostic React UI for Chess.Football: board, pieces, scoreboard, controls and the game store. Consumed by the Next.js app and the CrazyGames Vite SPA.",
5
+ "type": "module",
6
+ "license": "MIT",
7
+ "repository": {
8
+ "type": "git",
9
+ "url": "git+https://github.com/Scriptonita/chess-football-ui.git"
10
+ },
11
+ "publishConfig": {
12
+ "access": "public"
13
+ },
14
+ "sideEffects": false,
15
+ "files": [
16
+ "dist"
17
+ ],
18
+ "main": "./dist/index.cjs",
19
+ "module": "./dist/index.js",
20
+ "types": "./dist/index.d.ts",
21
+ "exports": {
22
+ ".": {
23
+ "types": "./dist/index.d.ts",
24
+ "import": "./dist/index.js",
25
+ "require": "./dist/index.cjs"
26
+ },
27
+ "./store": {
28
+ "types": "./dist/store.d.ts",
29
+ "import": "./dist/store.js",
30
+ "require": "./dist/store.cjs"
31
+ }
32
+ },
33
+ "scripts": {
34
+ "build": "tsup",
35
+ "dev": "tsup --watch",
36
+ "typecheck": "tsc --noEmit",
37
+ "prepublishOnly": "npm run build"
38
+ },
39
+ "dependencies": {
40
+ "@scriptonita/chess-football-engine": "^0.3.0",
41
+ "clsx": "^2.1.1",
42
+ "tailwind-merge": "^3.3.0",
43
+ "zustand": "^5.0.9"
44
+ },
45
+ "peerDependencies": {
46
+ "framer-motion": ">=12",
47
+ "lucide-react": ">=1",
48
+ "react": ">=19",
49
+ "react-dom": ">=19"
50
+ },
51
+ "devDependencies": {
52
+ "@types/react": "^19.0.0",
53
+ "@types/react-dom": "^19.0.0",
54
+ "framer-motion": "^12.23.26",
55
+ "lucide-react": "^1.17.0",
56
+ "tsup": "^8.5.0",
57
+ "typescript": "^5.7.0"
58
+ }
59
+ }