@scriptonita/chess-football-ui 0.2.0 → 0.3.0

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.
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/lib/utils.ts","../src/components/game/game-piece.tsx","../src/components/game/football.tsx","../src/i18n/index.tsx","../src/components/game/game-board.tsx","../src/components/ui/avatar.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","../src/components/game/turn-banner.tsx","../src/components/game/event-toast.tsx","../src/components/game/mobile-history.tsx"],"names":["twMerge","clsx","ChessKing","ChessQueen","ChessRook","ChessBishop","ChessKnight","ShieldQuestion","jsxs","jsx","useId","createContext","MotionConfig","useContext","useGameStore","useState","useRef","useEffect","useMemo","getValidMoves","getValidPasses","isInEnemyArea","Move","AnimatePresence","motion","RANK_LABELS","FILE_LABELS","Crown","Zap","React","Flag","PIECE_ICON","LONG_KEY","squareName","SHORT_KEY","COLS","ROWS","getInitialBoardState","Fragment","X"],"mappings":"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","file":"index.cjs","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\n// Embossed glyph: with the light source at the top-left (same as the chip's\n// radial gradient), a raised figure catches a thin highlight on its upper edge\n// and casts a short shadow below. Tuned per side so it reads on both chips.\nconst EMBOSS_FILTER: Record<Piece['side'], string> = {\n white: 'drop-shadow(0 -0.75px 0 rgba(255,255,255,0.65)) drop-shadow(0 1.25px 1px rgba(0,0,0,0.45))',\n black: 'drop-shadow(0 -0.5px 0 rgba(255,255,255,0.3)) drop-shadow(0 1.25px 1.5px rgba(0,0,0,0.8))',\n}\n\nconst PieceIcon = ({ type, side }: { type: Piece['type']; side: Piece['side'] }) => {\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: EMBOSS_FILTER[side],\n }\n return <Icon style={style} strokeWidth={2} 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} side={piece.side} />\n\n {hasBall && (\n <div className=\"absolute inset-0 rounded-full ring-2 ring-orange-400 pointer-events-none\" />\n )}\n\n {piece.hasMovedThisTurn && (\n <span\n aria-hidden=\"true\"\n className=\"absolute top-0.5 right-0.5 w-[14px] h-[14px] rounded-full bg-fg-muted/80 flex items-center justify-center text-[9px] text-bg-primary font-bold leading-none pointer-events-none\"\n >\n ✓\n </span>\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 { createContext, useContext, type ReactNode } from 'react'\nimport { MotionConfig } from 'framer-motion'\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 (\n <GameI18nContext.Provider value={t}>\n <MotionConfig reducedMotion=\"user\">\n {children}\n </MotionConfig>\n </GameI18nContext.Provider>\n )\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 { useGameStore } from '../../store/use-game-store'\nimport { getValidMoves, getValidPasses, isInEnemyArea } 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'\nimport { Move } from 'lucide-react'\nimport { useGameT } from '../../i18n'\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 = true }: GameBoardProps) {\n const t = useGameT()\n const {\n boardState,\n selectedPieceId,\n setSelectedPieceId,\n setInteractionMode,\n movePiece,\n passBall\n } = useGameStore()\n\n const [cursor, setCursor] = useState<Position | null>(null)\n const [disambiguateAt, setDisambiguateAt] = 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 const validMoves = useMemo(() => {\n if (!boardState) return []\n const sp = boardState.pieces.find(p => p.id === selectedPieceId)\n if (sp && !sp.hasMovedThisTurn) {\n return getValidMoves(sp, boardState)\n }\n return []\n }, [boardState, selectedPieceId])\n\n const validPasses = useMemo(() => {\n if (!boardState) return []\n const sp = boardState.pieces.find(p => p.id === selectedPieceId)\n if (sp && boardState.ball.holderId === sp.id) {\n return getValidPasses(sp, boardState)\n }\n return []\n }, [boardState, selectedPieceId])\n\n if (!boardState) return null\n\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 // §8: Offside risk — ball carrier (non-king) in enemy area during user's turn\n const ballCarrier = ball.holderId\n ? boardState.pieces.find(p => p.id === ball.holderId) ?? null\n : null\n const isOffsideRisk =\n !!ballCarrier &&\n ballCarrier.type !== 'king' &&\n userSide !== null &&\n ballCarrier.side === userSide &&\n boardState.turn === userSide &&\n isInEnemyArea(ballCarrier.pos, ballCarrier.side)\n\n const handleSquareClick = (x: number, y: number) => {\n const isValidMove = validMoves.some(m => m.x === x && m.y === y)\n const isValidPass = validPasses.some(p => p.x === x && p.y === y)\n\n if (isValidMove && isValidPass) {\n setDisambiguateAt({ x, y })\n return\n }\n if (isValidMove && selectedPieceId) {\n movePiece(selectedPieceId, { x, y })\n setDisambiguateAt(null)\n } else if (isValidPass) {\n passBall({ x, y })\n setDisambiguateAt(null)\n } else {\n setDisambiguateAt(null)\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 isValidMove = validMoves.some(m => m.x === x && m.y === y)\n const isValidPass = validPasses.some(p => p.x === x && p.y === y)\n\n if (isValidMove || isValidPass) {\n handleSquareClick(x, y)\n } else if (boardState.turn === pieceAt.side && userSide === pieceAt.side) {\n if (selectedPieceId === pieceAt.id) {\n setSelectedPieceId(null)\n } else {\n setSelectedPieceId(pieceAt.id)\n }\n setDisambiguateAt(null)\n }\n }\n\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\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':\n if (disambiguateAt && selectedPieceId) {\n movePiece(selectedPieceId, disambiguateAt)\n setDisambiguateAt(null)\n }\n break\n case 'p': case 'P':\n if (disambiguateAt) {\n passBall(disambiguateAt)\n setDisambiguateAt(null)\n }\n break\n case 'Escape':\n if (disambiguateAt) {\n setDisambiguateAt(null)\n } else {\n setSelectedPieceId(null)\n setInteractionMode(null)\n }\n break\n }\n }\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\n const isValidMove = validMoves.some(m => m.x === x && m.y === y)\n const isValidPass = validPasses.some(p => p.x === x && p.y === y)\n const isAmbiguous = isValidMove && isValidPass\n\n const isLastMoveOrigin = lastMove?.from && lastMove.from.x === x && lastMove.from.y === y\n const isLastMoveDest = lastMove?.to && lastMove.to.x === x && lastMove.to.y === y\n const isLastMove = isLastMoveOrigin || isLastMoveDest\n\n // §8: enemy goal area for offside warning\n const isEnemyGoalArea = userSide !== null\n && (x >= 2 && x <= 6)\n && (userSide === 'white' ? (y >= 10 && y <= 11) : (y >= 0 && y <= 1))\n\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 const isDisambiguateTarget = disambiguateAt?.x === x && disambiguateAt?.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-field-green-1\" : \"bg-field-green-2\",\n isGoalArea && \"bg-[#1a3a18] ring-1 ring-inset ring-emerald-500/30\",\n !isValidMove && !isValidPass && isLastMove && \"bg-last-move-highlight/20\",\n // §8: pulsing warning ring on enemy goal area\n isOffsideRisk && isEnemyGoalArea && !isValidMove && !isValidPass && \"ring-2 ring-inset ring-warning/60\",\n isAmbiguous && \"ring-[3px] ring-inset ring-yellow-400/90 bg-yellow-400/20\",\n !isAmbiguous && isValidMove && \"ring-[3px] ring-inset ring-yellow-400/80 bg-yellow-400/15\",\n !isAmbiguous && isValidPass && \"ring-[3px] ring-inset ring-sky-400/80 bg-sky-400/15\",\n )}\n >\n {!isAmbiguous && isValidMove && !pieceAt && (\n <div className=\"w-3 h-3 rounded-full bg-yellow-400/65\" />\n )}\n {!isAmbiguous && isValidPass && !pieceAt && (\n <div className=\"w-3 h-3 rounded-full bg-sky-400/65\" />\n )}\n {isAmbiguous && !pieceAt && (\n <div className=\"flex gap-0.5\">\n <div className=\"w-2.5 h-2.5 rounded-full bg-yellow-400/80\" />\n <div className=\"w-2.5 h-2.5 rounded-full bg-sky-400/80\" />\n </div>\n )}\n\n {isCursor && (\n <div className=\"absolute inset-0 ring-2 ring-inset ring-white pointer-events-none z-20\" aria-hidden=\"true\" />\n )}\n\n {isDisambiguateTarget && selectedPieceId && (\n <div\n className=\"absolute z-50 bottom-full mb-1 left-1/2 -translate-x-1/2 flex gap-1 bg-bg-secondary border border-border-subtle rounded-md p-1 shadow-xl pointer-events-auto whitespace-nowrap\"\n onClick={e => e.stopPropagation()}\n >\n <button\n className=\"flex items-center gap-1 px-2 py-1 rounded text-[11px] font-semibold font-inter text-move-highlight bg-move-highlight/10 hover:bg-move-highlight/20 transition-colors\"\n onClick={() => { movePiece(selectedPieceId, { x, y }); setDisambiguateAt(null) }}\n >\n <Move size={11} strokeWidth={2} />\n {t('move')}\n </button>\n <button\n className=\"flex items-center gap-1 px-2 py-1 rounded text-[11px] font-semibold font-inter text-pass-highlight bg-pass-highlight/10 hover:bg-pass-highlight/20 transition-colors\"\n onClick={() => { passBall({ x, y }); setDisambiguateAt(null) }}\n >\n <span className=\"w-3 h-3 inline-flex\"><Football /></span>\n {t('pass')}\n </button>\n </div>\n )}\n </div>\n )\n }\n }\n return squares\n }\n\n const board = (\n <div\n className={cn(\n // §6: Mobile edge-to-edge — thin 2px margin, no border, no radius\n \"w-full mx-0.5 bg-[#1a3317] overflow-hidden\",\n // §5+§6: Desktop — centered, rounded, bordered, height-based max-width\n \"md:mx-auto md:rounded-xl md:shadow-2xl md:border-4 md:border-[#1a3317]\",\n \"md:max-w-[min(700px,calc((100dvh_-_150px)*0.75))]\",\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 <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 <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 : { type: 'spring' as const, stiffness: 200, damping: 25, mass: 1 }\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 {(() => {\n const targetX = (ball.pos.x / COLS) * 100\n const targetY = ((ROWS - 1 - ball.pos.y) / ROWS) * 100\n let animate: any\n let transition: any\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 animate = {\n left: [`${prevX}%`, `${prevX}%`, `${prevX}%`, `${targetX}%`],\n top: [`${prevY}%`, `${prevY}%`, `${prevY}%`, `${targetY}%`],\n scale: [1, 1, 1.35, 1],\n }\n transition = { duration: PICKUP_DURATION, times: [0, pulseStart, pickupProportion, 1], ease: 'linear' }\n } else {\n animate = { left: `${targetX}%`, top: `${targetY}%`, scale: 1 }\n transition = { type: 'spring', stiffness: 300, damping: 30, mass: 0.5 }\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%]\"><Football /></div>\n </motion.div>\n )\n })()}\n </div>\n\n {/* §8: Offside warning chip overlaid on board bottom */}\n {isOffsideRisk && (\n <div className=\"absolute bottom-2 left-1/2 -translate-x-1/2 z-30 flex items-center gap-1.5 px-3 py-1.5 bg-warning/20 border border-warning/50 rounded-full font-inter text-xs font-semibold text-warning pointer-events-none whitespace-nowrap backdrop-blur-sm\">\n ⚠ {t('offsideWarning')}\n </div>\n )}\n </div>\n </div>\n )\n\n if (!showCoordinates) return board\n\n const ranksTopToBottom = [...RANK_LABELS].reverse()\n return (\n <div className=\"w-full max-w-[540px] md:max-w-none 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 key={f} aria-hidden=\"true\" className=\"flex items-center justify-center font-mono text-[9px] text-fg-muted/80 uppercase tracking-[0.5px]\">\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 key={r} aria-hidden=\"true\" className=\"flex items-center justify-center font-mono text-[9px] text-fg-muted/80 tabular-nums\">\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 { 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 const maxAP = boardState.maxActionPoints ?? 5\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 maxActionPoints={maxAP}\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 maxActionPoints={maxAP}\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 maxActionPoints: number\n kingMustRelease: boolean\n align: 'left' | 'right'\n}\n\nfunction PlayerInfo({ name, team, avatarUrl, isActive, actionPoints, maxActionPoints, 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={maxActionPoints}\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 { Flag } from 'lucide-react'\nimport { cn } from '../../lib/utils'\nimport { useGameT } from '../../i18n'\n\ninterface GameControlsProps {\n isMyTurn: boolean\n}\n\nexport default function GameControls({ isMyTurn }: GameControlsProps) {\n const {\n boardState,\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\n // Only ask for confirmation when ≥2 AP remain — with 0–1 AP left it's obvious\n const handleEndTurn = () => {\n if (actionPoints >= 2) {\n setShowEndTurnConfirm(true)\n } else {\n endTurn()\n }\n }\n\n return (\n <div className=\"w-full bg-bg-secondary flex flex-col gap-3 px-5 pt-3 pb-5\">\n {/* Finalizar turno */}\n {isMyTurn && (\n <Button\n variant=\"primary\"\n size=\"default\"\n className=\"w-full gap-2 tracking-[1.5px]\"\n onClick={handleEndTurn}\n >\n <Flag size={16} strokeWidth={2} />\n {t('endTurn')}\n {actionPoints >= 2 && (\n <span className={cn('ml-1 font-inter text-xs font-normal opacity-70 tracking-normal')}>\n · {actionPoints} {t('actionPointsShort')}\n </span>\n )}\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","import { useGameStore } from '../../store/use-game-store'\nimport { cn } from '../../lib/utils'\nimport { useGameT } from '../../i18n'\nimport { Zap } from 'lucide-react'\n\ninterface TurnBannerProps {\n isMyTurn: boolean\n /** Override for the \"not my turn\" label (e.g. \"IA pensando…\" in training mode). */\n waitingLabel?: string\n className?: string\n}\n\n/**\n * Full-width banner showing whose turn it is.\n * - My turn: accent-green background + \"TU TURNO\" + AP counter\n * - Opponent: neutral background + waiting label\n *\n * Absorbs the floating \"IA pensando…\" toast in training mode when waitingLabel is set.\n */\nexport function TurnBanner({ isMyTurn, waitingLabel, className }: TurnBannerProps) {\n const t = useGameT()\n const { boardState } = useGameStore()\n if (!boardState) return null\n\n const { actionPoints, maxActionPoints } = boardState\n\n return (\n <div\n className={cn(\n 'w-full h-9 flex items-center justify-between px-4 shrink-0 transition-colors duration-300',\n isMyTurn\n ? 'bg-accent-green/15 border-b border-accent-green/30'\n : 'bg-bg-surface border-b border-border-subtle',\n className,\n )}\n aria-live=\"polite\"\n aria-atomic=\"true\"\n >\n <span\n className={cn(\n 'font-anton text-sm tracking-[1.5px] uppercase',\n isMyTurn ? 'text-accent-green' : 'text-fg-muted',\n )}\n >\n {isMyTurn ? t('yourTurn') : (waitingLabel ?? t('waitingRival'))}\n </span>\n\n {isMyTurn && (\n <div className=\"flex items-center gap-1\" aria-label={t('actionPointsAriaLabel', { remaining: actionPoints, total: maxActionPoints })}>\n <Zap size={12} className=\"text-accent-green\" aria-hidden=\"true\" />\n <span className=\"font-mono text-xs text-fg-secondary tabular-nums\">\n {actionPoints}/{maxActionPoints}\n </span>\n </div>\n )}\n </div>\n )\n}\n","import { useEffect, useState } from 'react'\nimport { useGameStore } from '../../store/use-game-store'\nimport { cn } from '../../lib/utils'\nimport { AnimatePresence, motion } from 'framer-motion'\nimport { useGameT } from '../../i18n'\n\ninterface EventToastProps {\n className?: string\n}\n\ntype ToastEvent = 'interception' | 'offside' | 'tackle'\n\nconst TOASTABLE: ReadonlySet<string> = new Set(['interception', 'offside', 'tackle'])\n\nconst TOAST_CONFIG: Record<ToastEvent, string> = {\n interception: 'bg-danger/20 border-danger/50 text-danger',\n offside: 'bg-warning/20 border-warning/50 text-warning',\n tackle: 'bg-warning/20 border-warning/50 text-warning',\n}\n\nexport function EventToast({ className }: EventToastProps) {\n const t = useGameT()\n const { boardState } = useGameStore()\n const [toast, setToast] = useState<{ type: ToastEvent; key: string } | null>(null)\n\n useEffect(() => {\n const lastMove = boardState?.lastMove\n if (!lastMove) return\n if (!TOASTABLE.has(lastMove.type)) return\n setToast({ type: lastMove.type as ToastEvent, key: String(lastMove.at) })\n }, [boardState?.lastMove?.at])\n\n useEffect(() => {\n if (!toast) return\n const timer = setTimeout(() => setToast(null), 2500)\n return () => clearTimeout(timer)\n }, [toast?.key])\n\n return (\n <div\n role=\"status\"\n aria-live=\"polite\"\n aria-atomic=\"true\"\n className={cn('pointer-events-none flex justify-center', className)}\n >\n <AnimatePresence mode=\"wait\">\n {toast && (\n <motion.div\n key={toast.key}\n initial={{ opacity: 0, y: -8 }}\n animate={{ opacity: 1, y: 0 }}\n exit={{ opacity: 0, y: -8 }}\n transition={{ duration: 0.15 }}\n className={cn(\n 'px-4 py-2 rounded-full border font-inter text-sm font-semibold shadow-lg backdrop-blur-sm text-center',\n TOAST_CONFIG[toast.type],\n )}\n >\n {t(`eventToast.${toast.type}`)}\n </motion.div>\n )}\n </AnimatePresence>\n </div>\n )\n}\n","import { useState } from 'react'\nimport { useGameStore } from '../../store/use-game-store'\nimport { cn } from '../../lib/utils'\nimport { AnimatePresence, motion } from 'framer-motion'\nimport { MoveHistory } from './move-history'\nimport { squareName, SHORT_KEY } from '@scriptonita/chess-football-engine'\nimport type { MoveHistoryEntry } from '@scriptonita/chess-football-engine'\nimport { useGameT } from '../../i18n'\nimport { X } from 'lucide-react'\n\ninterface MobileHistoryProps {\n className?: string\n}\n\nexport function MobileHistory({ className }: MobileHistoryProps) {\n const { boardState } = useGameStore()\n const [open, setOpen] = useState(false)\n\n const lastMove = boardState?.moveHistory?.at(-1)\n\n if (!lastMove) return null\n\n return (\n <>\n <HistoryChip lastMove={lastMove} onClick={() => setOpen(true)} className={className} />\n\n <AnimatePresence>\n {open && (\n <>\n <motion.div\n key=\"backdrop\"\n initial={{ opacity: 0 }}\n animate={{ opacity: 1 }}\n exit={{ opacity: 0 }}\n transition={{ duration: 0.2 }}\n className=\"fixed inset-0 z-40 bg-black/60 backdrop-blur-sm\"\n onClick={() => setOpen(false)}\n aria-hidden=\"true\"\n />\n <motion.div\n key=\"sheet\"\n initial={{ y: '100%' }}\n animate={{ y: 0 }}\n exit={{ y: '100%' }}\n transition={{ type: 'spring', stiffness: 300, damping: 32 }}\n className=\"fixed bottom-0 left-0 right-0 z-50 bg-bg-secondary rounded-t-2xl border-t border-border-subtle shadow-xl\"\n role=\"dialog\"\n aria-modal=\"true\"\n >\n <SheetHeader onClose={() => setOpen(false)} />\n <div className=\"px-4 pb-6 max-h-[50dvh] overflow-y-auto\">\n <MoveHistory scrollable={false} />\n </div>\n </motion.div>\n </>\n )}\n </AnimatePresence>\n </>\n )\n}\n\nfunction SheetHeader({ onClose }: { onClose: () => void }) {\n const t = useGameT()\n return (\n <div className=\"flex items-center justify-between px-5 pt-4 pb-3 border-b border-border-subtle\">\n <span className=\"font-mono text-[10px] tracking-[0.5px] uppercase text-fg-muted\">\n {t('history.title')}\n </span>\n <button\n onClick={onClose}\n className=\"w-8 h-8 flex items-center justify-center rounded-full bg-bg-surface hover:bg-bg-surface-elevated text-fg-muted hover:text-fg-primary transition-colors focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-accent-green\"\n aria-label=\"Close\"\n >\n <X size={14} />\n </button>\n </div>\n )\n}\n\ninterface HistoryChipProps {\n lastMove: MoveHistoryEntry\n onClick: () => void\n className?: string\n}\n\nfunction HistoryChip({ lastMove, onClick, className }: HistoryChipProps) {\n const t = useGameT()\n const toSq = squareName(lastMove.to)\n let label: string\n switch (lastMove.type) {\n case 'pass': label = `⊕ ${toSq}`; break\n case 'tackle': label = `✕ ${toSq}`; break\n case 'interception': label = `⛔ ${toSq}`; break\n case 'goal': label = `⚽ GOL`; break\n case 'offside': label = `⚠ OFS`; break\n default: {\n const pieceShort = t(`pieces.${SHORT_KEY[lastMove.pieceType]}`)\n const fromSq = lastMove.from ? squareName(lastMove.from) : ''\n label = fromSq ? `${pieceShort}${fromSq}→${toSq}` : `${pieceShort}→${toSq}`\n }\n }\n\n return (\n <button\n onClick={onClick}\n className={cn(\n 'flex items-center gap-1.5 px-3 py-1.5 rounded-full',\n 'bg-bg-surface border border-border-subtle',\n 'font-mono text-[11px] text-fg-secondary',\n 'hover:text-fg-primary hover:bg-bg-surface-elevated active:scale-95',\n 'transition-all duration-150',\n 'focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-accent-green',\n className,\n )}\n aria-label={t('history.viewAll')}\n >\n <span>{label}</span>\n <span className=\"text-fg-muted text-[10px]\" aria-hidden=\"true\">▾</span>\n </button>\n )\n}\n"]}
1
+ {"version":3,"sources":["../src/lib/utils.ts","../src/components/game/game-piece.tsx","../src/components/game/football.tsx","../src/i18n/index.tsx","../src/components/game/game-board.tsx","../src/components/ui/avatar.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","../src/components/game/turn-banner.tsx","../src/components/game/event-toast.tsx","../src/components/game/mobile-history.tsx"],"names":["twMerge","clsx","ChessKing","ChessQueen","ChessRook","ChessBishop","ChessKnight","ShieldQuestion","jsxs","jsx","useId","createContext","MotionConfig","useContext","useGameStore","useState","useRef","useEffect","useMemo","getValidMoves","getValidPasses","isInEnemyArea","Move","AnimatePresence","motion","RANK_LABELS","FILE_LABELS","Crown","Zap","React","Flag","PIECE_ICON","LONG_KEY","squareName","SHORT_KEY","COLS","ROWS","getInitialBoardState","Fragment","X"],"mappings":"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","file":"index.cjs","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\n// Embossed glyph: with the light source at the top-left (same as the chip's\n// radial gradient), a raised figure catches a thin highlight on its upper edge\n// and casts a short shadow below. Tuned per side so it reads on both chips.\nconst EMBOSS_FILTER: Record<Piece['side'], string> = {\n white: 'drop-shadow(0 -0.75px 0 rgba(255,255,255,0.65)) drop-shadow(0 1.25px 1px rgba(0,0,0,0.45))',\n black: 'drop-shadow(0 -0.5px 0 rgba(255,255,255,0.3)) drop-shadow(0 1.25px 1.5px rgba(0,0,0,0.8))',\n}\n\nconst PieceIcon = ({ type, side }: { type: Piece['type']; side: Piece['side'] }) => {\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: EMBOSS_FILTER[side],\n }\n return <Icon style={style} strokeWidth={2} 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} side={piece.side} />\n\n {hasBall && (\n <div className=\"absolute inset-0 rounded-full ring-2 ring-orange-400 pointer-events-none\" />\n )}\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 { createContext, useContext, type ReactNode } from 'react'\nimport { MotionConfig } from 'framer-motion'\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 (\n <GameI18nContext.Provider value={t}>\n <MotionConfig reducedMotion=\"user\">\n {children}\n </MotionConfig>\n </GameI18nContext.Provider>\n )\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 { useGameStore } from '../../store/use-game-store'\nimport { getValidMoves, getValidPasses, isInEnemyArea } 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'\nimport { Move } from 'lucide-react'\nimport { useGameT } from '../../i18n'\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 = true }: GameBoardProps) {\n const t = useGameT()\n const {\n boardState,\n selectedPieceId,\n setSelectedPieceId,\n setInteractionMode,\n movePiece,\n passBall\n } = useGameStore()\n\n const [cursor, setCursor] = useState<Position | null>(null)\n const [disambiguateAt, setDisambiguateAt] = 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 const validMoves = useMemo(() => {\n if (!boardState) return []\n const sp = boardState.pieces.find(p => p.id === selectedPieceId)\n if (sp && !sp.hasMovedThisTurn) {\n return getValidMoves(sp, boardState)\n }\n return []\n }, [boardState, selectedPieceId])\n\n const validPasses = useMemo(() => {\n if (!boardState) return []\n const sp = boardState.pieces.find(p => p.id === selectedPieceId)\n if (sp && boardState.ball.holderId === sp.id) {\n return getValidPasses(sp, boardState)\n }\n return []\n }, [boardState, selectedPieceId])\n\n if (!boardState) return null\n\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 // §8: Offside risk — ball carrier (non-king) in enemy area during user's turn\n const ballCarrier = ball.holderId\n ? boardState.pieces.find(p => p.id === ball.holderId) ?? null\n : null\n const isOffsideRisk =\n !!ballCarrier &&\n ballCarrier.type !== 'king' &&\n userSide !== null &&\n ballCarrier.side === userSide &&\n boardState.turn === userSide &&\n isInEnemyArea(ballCarrier.pos, ballCarrier.side)\n\n const handleSquareClick = (x: number, y: number) => {\n setCursor(null)\n const isValidMove = validMoves.some(m => m.x === x && m.y === y)\n const isValidPass = validPasses.some(p => p.x === x && p.y === y)\n\n if (isValidMove && isValidPass) {\n setDisambiguateAt({ x, y })\n return\n }\n if (isValidMove && selectedPieceId) {\n movePiece(selectedPieceId, { x, y })\n setDisambiguateAt(null)\n } else if (isValidPass) {\n passBall({ x, y })\n setDisambiguateAt(null)\n } else {\n setDisambiguateAt(null)\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 isValidMove = validMoves.some(m => m.x === x && m.y === y)\n const isValidPass = validPasses.some(p => p.x === x && p.y === y)\n\n if (isValidMove || isValidPass) {\n handleSquareClick(x, y)\n } else if (boardState.turn === pieceAt.side && userSide === pieceAt.side) {\n if (selectedPieceId === pieceAt.id) {\n setSelectedPieceId(null)\n } else {\n setSelectedPieceId(pieceAt.id)\n }\n setDisambiguateAt(null)\n }\n }\n\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\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':\n if (disambiguateAt && selectedPieceId) {\n movePiece(selectedPieceId, disambiguateAt)\n setDisambiguateAt(null)\n }\n break\n case 'p': case 'P':\n if (disambiguateAt) {\n passBall(disambiguateAt)\n setDisambiguateAt(null)\n }\n break\n case 'Escape':\n if (disambiguateAt) {\n setDisambiguateAt(null)\n } else {\n setSelectedPieceId(null)\n setInteractionMode(null)\n }\n break\n }\n }\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\n const isValidMove = validMoves.some(m => m.x === x && m.y === y)\n const isValidPass = validPasses.some(p => p.x === x && p.y === y)\n const isAmbiguous = isValidMove && isValidPass\n\n const isLastMoveOrigin = lastMove?.from && lastMove.from.x === x && lastMove.from.y === y\n const isLastMoveDest = lastMove?.to && lastMove.to.x === x && lastMove.to.y === y\n const isLastMove = isLastMoveOrigin || isLastMoveDest\n\n // §8: enemy goal area for offside warning\n const isEnemyGoalArea = userSide !== null\n && (x >= 2 && x <= 6)\n && (userSide === 'white' ? (y >= 10 && y <= 11) : (y >= 0 && y <= 1))\n\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 const isDisambiguateTarget = disambiguateAt?.x === x && disambiguateAt?.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-field-green-1\" : \"bg-field-green-2\",\n isGoalArea && \"bg-[#1a3a18] ring-1 ring-inset ring-emerald-500/30\",\n !isValidMove && !isValidPass && isLastMove && \"bg-last-move-highlight/20\",\n // §8: pulsing warning ring on enemy goal area\n isOffsideRisk && isEnemyGoalArea && !isValidMove && !isValidPass && \"ring-2 ring-inset ring-warning/60\",\n isAmbiguous && \"ring-[3px] ring-inset ring-yellow-400/90 bg-yellow-400/20\",\n !isAmbiguous && isValidMove && \"ring-[3px] ring-inset ring-yellow-400/80 bg-yellow-400/15\",\n !isAmbiguous && isValidPass && \"ring-[3px] ring-inset ring-sky-400/80 bg-sky-400/15\",\n )}\n >\n {!isAmbiguous && isValidMove && !pieceAt && (\n <div className=\"w-3 h-3 rounded-full bg-yellow-400/65\" />\n )}\n {!isAmbiguous && isValidPass && !pieceAt && (\n <div className=\"w-3 h-3 rounded-full bg-sky-400/65\" />\n )}\n {isAmbiguous && !pieceAt && (\n <div className=\"flex gap-0.5\">\n <div className=\"w-2.5 h-2.5 rounded-full bg-yellow-400/80\" />\n <div className=\"w-2.5 h-2.5 rounded-full bg-sky-400/80\" />\n </div>\n )}\n\n {isCursor && (\n <div className=\"absolute inset-0 ring-2 ring-inset ring-white pointer-events-none z-20\" aria-hidden=\"true\" />\n )}\n\n {isDisambiguateTarget && selectedPieceId && (\n <div\n className=\"absolute z-50 bottom-full mb-1 left-1/2 -translate-x-1/2 flex gap-1 bg-bg-secondary border border-border-subtle rounded-md p-1 shadow-xl pointer-events-auto whitespace-nowrap\"\n onClick={e => e.stopPropagation()}\n >\n <button\n className=\"flex items-center gap-1 px-2 py-1 rounded text-[11px] font-semibold font-inter text-move-highlight bg-move-highlight/10 hover:bg-move-highlight/20 transition-colors\"\n onClick={() => { movePiece(selectedPieceId, { x, y }); setDisambiguateAt(null) }}\n >\n <Move size={11} strokeWidth={2} />\n {t('move')}\n </button>\n <button\n className=\"flex items-center gap-1 px-2 py-1 rounded text-[11px] font-semibold font-inter text-pass-highlight bg-pass-highlight/10 hover:bg-pass-highlight/20 transition-colors\"\n onClick={() => { passBall({ x, y }); setDisambiguateAt(null) }}\n >\n <span className=\"w-3 h-3 inline-flex\"><Football /></span>\n {t('pass')}\n </button>\n </div>\n )}\n </div>\n )\n }\n }\n return squares\n }\n\n const board = (\n <div\n className={cn(\n // §6: Mobile edge-to-edge — thin 2px margin, no border, no radius\n \"w-full mx-0.5 bg-[#1a3317] overflow-hidden\",\n // §5+§6: Desktop — centered, rounded, bordered, height-based max-width\n \"md:mx-auto md:rounded-xl md:shadow-2xl md:border-4 md:border-[#1a3317]\",\n \"md:max-w-[min(700px,calc((100dvh_-_150px)*0.75))]\",\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 }\n : {})}\n >\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 <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 : { type: 'spring' as const, stiffness: 200, damping: 25, mass: 1 }\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 {(() => {\n const targetX = (ball.pos.x / COLS) * 100\n const targetY = ((ROWS - 1 - ball.pos.y) / ROWS) * 100\n let animate: any\n let transition: any\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 animate = {\n left: [`${prevX}%`, `${prevX}%`, `${prevX}%`, `${targetX}%`],\n top: [`${prevY}%`, `${prevY}%`, `${prevY}%`, `${targetY}%`],\n scale: [1, 1, 1.35, 1],\n }\n transition = { duration: PICKUP_DURATION, times: [0, pulseStart, pickupProportion, 1], ease: 'linear' }\n } else {\n animate = { left: `${targetX}%`, top: `${targetY}%`, scale: 1 }\n transition = { type: 'spring', stiffness: 300, damping: 30, mass: 0.5 }\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%]\"><Football /></div>\n </motion.div>\n )\n })()}\n </div>\n\n {/* §8: Offside warning chip overlaid on board bottom */}\n {isOffsideRisk && (\n <div className=\"absolute bottom-2 left-1/2 -translate-x-1/2 z-30 flex items-center gap-1.5 px-3 py-1.5 bg-warning/20 border border-warning/50 rounded-full font-inter text-xs font-semibold text-warning pointer-events-none whitespace-nowrap backdrop-blur-sm\">\n ⚠ {t('offsideWarning')}\n </div>\n )}\n </div>\n </div>\n )\n\n if (!showCoordinates) return board\n\n const ranksTopToBottom = [...RANK_LABELS].reverse()\n return (\n <div className=\"w-full max-w-[540px] md:max-w-none 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 key={f} aria-hidden=\"true\" className=\"flex items-center justify-center font-mono text-[9px] text-fg-muted/80 uppercase tracking-[0.5px]\">\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 key={r} aria-hidden=\"true\" className=\"flex items-center justify-center font-mono text-[9px] text-fg-muted/80 tabular-nums\">\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 { 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 const maxAP = boardState.maxActionPoints ?? 5\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 maxActionPoints={maxAP}\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 maxActionPoints={maxAP}\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 maxActionPoints: number\n kingMustRelease: boolean\n align: 'left' | 'right'\n}\n\nfunction PlayerInfo({ name, team, avatarUrl, isActive, actionPoints, maxActionPoints, 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={maxActionPoints}\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 { Flag } from 'lucide-react'\nimport { cn } from '../../lib/utils'\nimport { useGameT } from '../../i18n'\n\ninterface GameControlsProps {\n isMyTurn: boolean\n}\n\nexport default function GameControls({ isMyTurn }: GameControlsProps) {\n const {\n boardState,\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\n // Only ask for confirmation when ≥2 AP remain — with 0–1 AP left it's obvious\n const handleEndTurn = () => {\n if (actionPoints >= 2) {\n setShowEndTurnConfirm(true)\n } else {\n endTurn()\n }\n }\n\n return (\n <div className=\"w-full bg-bg-secondary flex flex-col gap-3 px-5 pt-3 pb-5\">\n {/* Finalizar turno */}\n {isMyTurn && (\n <Button\n variant=\"primary\"\n size=\"default\"\n className=\"w-full gap-2 tracking-[1.5px]\"\n onClick={handleEndTurn}\n >\n <Flag size={16} strokeWidth={2} />\n {t('endTurn')}\n {actionPoints >= 2 && (\n <span className={cn('ml-1 font-inter text-xs font-normal opacity-70 tracking-normal')}>\n · {actionPoints} {t('actionPointsShort')}\n </span>\n )}\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","import { useGameStore } from '../../store/use-game-store'\nimport { cn } from '../../lib/utils'\nimport { useGameT } from '../../i18n'\nimport { Zap } from 'lucide-react'\n\ninterface TurnBannerProps {\n isMyTurn: boolean\n /** Override for the \"not my turn\" label (e.g. \"IA pensando…\" in training mode). */\n waitingLabel?: string\n className?: string\n}\n\n/**\n * Full-width banner showing whose turn it is.\n * - My turn: accent-green background + \"TU TURNO\" + AP counter\n * - Opponent: neutral background + waiting label\n *\n * Absorbs the floating \"IA pensando…\" toast in training mode when waitingLabel is set.\n */\nexport function TurnBanner({ isMyTurn, waitingLabel, className }: TurnBannerProps) {\n const t = useGameT()\n const { boardState } = useGameStore()\n if (!boardState) return null\n\n const { actionPoints, maxActionPoints } = boardState\n\n return (\n <div\n className={cn(\n 'w-full h-9 flex items-center justify-between px-4 shrink-0 transition-colors duration-300',\n isMyTurn\n ? 'bg-accent-green/15 border-b border-accent-green/30'\n : 'bg-bg-surface border-b border-border-subtle',\n className,\n )}\n aria-live=\"polite\"\n aria-atomic=\"true\"\n >\n <span\n className={cn(\n 'font-anton text-sm tracking-[1.5px] uppercase',\n isMyTurn ? 'text-accent-green' : 'text-fg-muted',\n )}\n >\n {isMyTurn ? t('yourTurn') : (waitingLabel ?? t('waitingRival'))}\n </span>\n\n {isMyTurn && (\n <div className=\"flex items-center gap-1\" aria-label={t('actionPointsAriaLabel', { remaining: actionPoints, total: maxActionPoints })}>\n <Zap size={12} className=\"text-accent-green\" aria-hidden=\"true\" />\n <span className=\"font-mono text-xs text-fg-secondary tabular-nums\">\n {actionPoints}/{maxActionPoints}\n </span>\n </div>\n )}\n </div>\n )\n}\n","import { useEffect, useState } from 'react'\nimport { useGameStore } from '../../store/use-game-store'\nimport { cn } from '../../lib/utils'\nimport { AnimatePresence, motion } from 'framer-motion'\nimport { useGameT } from '../../i18n'\n\ninterface EventToastProps {\n className?: string\n}\n\ntype ToastEvent = 'interception' | 'offside' | 'tackle'\n\nconst TOASTABLE: ReadonlySet<string> = new Set(['interception', 'offside', 'tackle'])\n\nconst TOAST_CONFIG: Record<ToastEvent, string> = {\n interception: 'bg-danger/20 border-danger/50 text-danger',\n offside: 'bg-warning/20 border-warning/50 text-warning',\n tackle: 'bg-warning/20 border-warning/50 text-warning',\n}\n\nexport function EventToast({ className }: EventToastProps) {\n const t = useGameT()\n const { boardState } = useGameStore()\n const [toast, setToast] = useState<{ type: ToastEvent; key: string } | null>(null)\n\n useEffect(() => {\n const lastMove = boardState?.lastMove\n if (!lastMove) return\n if (!TOASTABLE.has(lastMove.type)) return\n setToast({ type: lastMove.type as ToastEvent, key: String(lastMove.at) })\n }, [boardState?.lastMove?.at])\n\n useEffect(() => {\n if (!toast) return\n const timer = setTimeout(() => setToast(null), 2500)\n return () => clearTimeout(timer)\n }, [toast?.key])\n\n return (\n <div\n role=\"status\"\n aria-live=\"polite\"\n aria-atomic=\"true\"\n className={cn('pointer-events-none flex justify-center', className)}\n >\n <AnimatePresence mode=\"wait\">\n {toast && (\n <motion.div\n key={toast.key}\n initial={{ opacity: 0, y: -8 }}\n animate={{ opacity: 1, y: 0 }}\n exit={{ opacity: 0, y: -8 }}\n transition={{ duration: 0.15 }}\n className={cn(\n 'px-4 py-2 rounded-full border font-inter text-sm font-semibold shadow-lg backdrop-blur-sm text-center',\n TOAST_CONFIG[toast.type],\n )}\n >\n {t(`eventToast.${toast.type}`)}\n </motion.div>\n )}\n </AnimatePresence>\n </div>\n )\n}\n","import { useState } from 'react'\nimport { useGameStore } from '../../store/use-game-store'\nimport { cn } from '../../lib/utils'\nimport { AnimatePresence, motion } from 'framer-motion'\nimport { MoveHistory } from './move-history'\nimport { squareName, SHORT_KEY } from '@scriptonita/chess-football-engine'\nimport type { MoveHistoryEntry } from '@scriptonita/chess-football-engine'\nimport { useGameT } from '../../i18n'\nimport { X } from 'lucide-react'\n\ninterface MobileHistoryProps {\n className?: string\n}\n\nexport function MobileHistory({ className }: MobileHistoryProps) {\n const { boardState } = useGameStore()\n const [open, setOpen] = useState(false)\n\n const lastMove = boardState?.moveHistory?.at(-1)\n\n if (!lastMove) return null\n\n return (\n <>\n <HistoryChip lastMove={lastMove} onClick={() => setOpen(true)} className={className} />\n\n <AnimatePresence>\n {open && (\n <>\n <motion.div\n key=\"backdrop\"\n initial={{ opacity: 0 }}\n animate={{ opacity: 1 }}\n exit={{ opacity: 0 }}\n transition={{ duration: 0.2 }}\n className=\"fixed inset-0 z-40 bg-black/60 backdrop-blur-sm\"\n onClick={() => setOpen(false)}\n aria-hidden=\"true\"\n />\n <motion.div\n key=\"sheet\"\n initial={{ y: '100%' }}\n animate={{ y: 0 }}\n exit={{ y: '100%' }}\n transition={{ type: 'spring', stiffness: 300, damping: 32 }}\n className=\"fixed bottom-0 left-0 right-0 z-50 bg-bg-secondary rounded-t-2xl border-t border-border-subtle shadow-xl\"\n role=\"dialog\"\n aria-modal=\"true\"\n >\n <SheetHeader onClose={() => setOpen(false)} />\n <div className=\"px-4 pb-6 max-h-[50dvh] overflow-y-auto\">\n <MoveHistory scrollable={false} />\n </div>\n </motion.div>\n </>\n )}\n </AnimatePresence>\n </>\n )\n}\n\nfunction SheetHeader({ onClose }: { onClose: () => void }) {\n const t = useGameT()\n return (\n <div className=\"flex items-center justify-between px-5 pt-4 pb-3 border-b border-border-subtle\">\n <span className=\"font-mono text-[10px] tracking-[0.5px] uppercase text-fg-muted\">\n {t('history.title')}\n </span>\n <button\n onClick={onClose}\n className=\"w-8 h-8 flex items-center justify-center rounded-full bg-bg-surface hover:bg-bg-surface-elevated text-fg-muted hover:text-fg-primary transition-colors focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-accent-green\"\n aria-label=\"Close\"\n >\n <X size={14} />\n </button>\n </div>\n )\n}\n\ninterface HistoryChipProps {\n lastMove: MoveHistoryEntry\n onClick: () => void\n className?: string\n}\n\nfunction HistoryChip({ lastMove, onClick, className }: HistoryChipProps) {\n const t = useGameT()\n const toSq = squareName(lastMove.to)\n let label: string\n switch (lastMove.type) {\n case 'pass': label = `⊕ ${toSq}`; break\n case 'tackle': label = `✕ ${toSq}`; break\n case 'interception': label = `⛔ ${toSq}`; break\n case 'goal': label = `⚽ GOL`; break\n case 'offside': label = `⚠ OFS`; break\n default: {\n const pieceShort = t(`pieces.${SHORT_KEY[lastMove.pieceType]}`)\n const fromSq = lastMove.from ? squareName(lastMove.from) : ''\n label = fromSq ? `${pieceShort}${fromSq}→${toSq}` : `${pieceShort}→${toSq}`\n }\n }\n\n return (\n <button\n onClick={onClick}\n className={cn(\n 'flex items-center gap-1.5 px-3 py-1.5 rounded-full',\n 'bg-bg-surface border border-border-subtle',\n 'font-mono text-[11px] text-fg-secondary',\n 'hover:text-fg-primary hover:bg-bg-surface-elevated active:scale-95',\n 'transition-all duration-150',\n 'focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-accent-green',\n className,\n )}\n aria-label={t('history.viewAll')}\n >\n <span>{label}</span>\n <span className=\"text-fg-muted text-[10px]\" aria-hidden=\"true\">▾</span>\n </button>\n )\n}\n"]}