import { useState, useEffect } from 'react' import { useNavigate, useLocation } from 'react-router-dom' import { theme, useThemeMode, THEMES, getPlayerName, getPlayer2Name, setPlayerName, setPlayer2Name, getPlayer1Symbol, setPlayer1Symbol, getPlayer2Symbol, setPlayer2Symbol, getPlayerColor, setPlayerColor, getPlayer2Color, setPlayer2Color, getPlayerDrawTower, setPlayerDrawTower, getPlayer2DrawTower, setPlayer2DrawTower } from '../theme.ts' import SymbolPicker from '../components/SymbolPicker.tsx' import ThemeSelector from '../components/ThemeSelector.tsx' import type { GameRules } from 'shared/types.ts' import { binAssetUrl } from '../binAssets' import { PushButton, pushButtonVars } from '../components/PushButton' import { audioManager } from '../game/effects/AudioManager.ts' type LocalPlayerType = 'human' | 'bot' type BotProfile = 'normal' | 'expert' | 'ai' | 'ai+' type LegacyBotProfile = BotProfile | 'balanced' type RulesMode = 'tournament' | 'custom' const TOURNAMENT_RULES: GameRules = { swap2: true, noOverlines: true, boardSize: 15 } function normalizeBotProfile(profile?: LegacyBotProfile): BotProfile { if (profile === 'expert' || profile === 'ai' || profile === 'ai+') return profile return 'normal' } const PRESET_COLORS = [ '#58a6ff', // Bright Blue '#f0883e', // Orange/Coral '#ef4444', // Red '#10b981', // Emerald Green '#a78bfa', // Lavender Purple '#f9a8d4', // Rose Pink '#fbbf24', // Yellow Gold ] const getPresetColors = (defaultColor: string) => { const base = [...PRESET_COLORS] const normalized = defaultColor.toLowerCase() if (!base.some(c => c.toLowerCase() === normalized)) { return [defaultColor, ...base] } return base } function PlayerPiecePreview({ symbol, color, drawTower }: { symbol: string; color: string; drawTower: boolean }) { const isEmoji = symbol.length > 1 || (symbol.codePointAt(0) ?? 0) > 0xffff const textShadow = isEmoji ? '0 2px 5px rgba(0,0,0,0.75)' : '0 1px 3px rgba(0,0,0,0.45)' return (